python数据分析:采集分析岗位数据,看看薪资的高低都受什么因素影响呢

news2024/11/24 15:53:07

前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

又到了学Python时刻~

在我们学习的时候,通常会产生疑问:这个行业前景好不好呢?

今天我们就用python的数据分析这个就业方向来举例

看一下都有哪些因素影响了薪资的高低呢?

数据采集

模块使用:

requests                 第三方模块
pyecharts                可视化模块
pandas                   操作表格

开发环境:

版 本:   python3.8
编辑器:  pycharm

思路分析

代码展示

导入模块

import requests     # 第三方模块 发送请求
import re           # 内置模块
import json         # 内置模块
import csv
f = open('lagou.csv', mode='a', newline='', encoding='utf-8')
csv_writer = csv.writer(f)
csv_writer.writerow(['positionName', 'companyFullName', 'companySize', 'financeStage', 'city', 'district', 'salary', 'salaryMonth', 'workYear', 'jobNature', 'education'])

伪装 像正常的用户

( 因不可抗原因,不能出现网址,会发不出去,用图片代替了,大家照着敲一下

或者点击此处跳转跳转文末名片加入裙聊,找管理员小姐姐领取呀~ )

for page in range(1, 31):
    print(f'###正在爬取第{page}页###')

  1. 发送请求
    response = requests.get(url=url, headers=headers)
  1. 获取数据
    html_data = response.text
  1. 解析数据 提取数据
    # 结构化数据: json数据 ==> {}所包裹的数据 非常好提取
    # 非结构化数据: 网页源代码  方式方法: css/xpath/re     模块/工具: bs4/lxml/parsel/re
    # re: 搜索功能 高级用法
    # .*?: 匹配任意字符
    # <script id="__NEXT_DATA__" type="application/json">(.*?)</script>
    json_str = re.findall('<script id="__NEXT_DATA__" type="application/json">(.*?)</script>', html_data)[0]
    json_dict = json.loads(json_str)
    result = json_dict['props']['pageProps']['initData']['content']['positionResult']['result']
    # result:  15个岗位信息
    for res in result:
        positionName = res['positionName']
        companyFullName = res['companyFullName']
        companySize = res['companySize']
        financeStage = res['financeStage']
        city = res['city']
        district = res['district']
        salary = res['salary']
        salaryMonth = res['salaryMonth']
        workYear = res['workYear']
        jobNature = res['jobNature']
        education = res['education']
        print(positionName, companyFullName, companySize, financeStage, city, district, salary, salaryMonth, workYear, jobNature, education)
  1. 保存数据
        csv_writer.writerow([positionName, companyFullName, companySize, financeStage, city, district, salary, salaryMonth, workYear, jobNature, education])

PS:完整源码或数据集如有需要的小伙伴可以加下方的群去找管理员免费领取

数据分析

一、数据集

首先我们来上面采集的数据集:拉gou网的数据分析岗位数据

二、分析方向

1.数据分析岗位的薪资状况?

2.各城市对数据分析岗位的需求情况?

3.岗位的学历要求高吗?

4.公司都要求什么掌握什么技能?

三、代码展示

导包和数据

import pandas as pd
import numpy as np
import seaborn as sns
from pyecharts.charts import Pie
from pyecharts import options as opts
import matplotlib.pyplot as plt
%matplotlib inline
sns.set_style('white',{'font.sans-serif':['simhei','Arial']})
pd.set_option("display.max_column", None)
pd.set_option("display.max_row",None)

读取数据

df = pd.read_csv('lagouw.csv')
df.head()

取出我们进行后续分析所需的字段

columns = ["positionName", "companyShortName", "city", "companySize", "education", "financeStage",
           "industryField", "salary", "workYear", "hitags", "companyLabelList", "job_detail"]
df[columns].drop_duplicates() #去重

数据清洗

去掉非数据分析岗的数据

筛选出我们想要的字段,并剔除positionName

df = df[cond_1 & cond_2]
df.drop(["positionName"], axis=1, inplace=True)
df.reset_index(drop=True, inplace=True)
df.head()

将拉勾网的薪水转化为数值

拉勾网爬取下来的薪水是一个区间,这里用薪水区间的均值作为相应职位的薪水

处理过程

1、将salary中的字符串均小写化(因为存在8k-16k和8K-16K)
2、运用正则表达式提取出薪资区间
3、将提取出来的数字转化为int型
4、取区间的平均值

df["salary"] = df["salary"].str.lower()\
               .str.extract(r'(\d+)[k]-(\d+)k')\
               .applymap(lambda x:int(x))\
               .mean(axis=1)

从job_detail中提取出技能要求

将技能分为以下几类:

  • Python/R

  • SQL

  • Tableau

  • Excel

处理方式: 如果job_detail中含有上述四类,则赋值为1,不含有则为0

df["job_detail"] = df["job_detail"].str.lower().fillna("")  #将字符串小写化,并将缺失值赋值为空字符串

df["Python/R"] = df["job_detail"].map(lambda x:1 if ('python' in x) or ('r' in x) else 0)
df["SQL"] = df["job_detail"].map(lambda x:1 if ('sql' in x) or ('hive' in x)  else 0)
df["Tableau"] = df["job_detail"].map(lambda x:1 if 'tableau' in x  else 0)
df["Excel"] = df["job_detail"].map(lambda x:1 if 'excel' in x  else 0)
df.head(1)

处理行业信息

def clean_industry(industry):
    industry = industry.split(",")
    if industry[0]=="移动互联网" and len(industry)>1:
        return industry[1]
    else:
        return industry[0]

df["industryField"] = df.industryField.map(clean_industry)

数据可视化

各城市对数据分析岗位的需求量

fig, ax = plt.subplots(figsize=(12,8))
sns.countplot(y="city",order= df["city"].value_counts().index,data=df,color='#3c7f99')
plt.box(False)
fig.text(x=0.04, y=0.90, s='           各城市数据分析岗位的需求量           ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
plt.tick_params(axis='both', which='major', labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.5, color='#3c7f99')
plt.xlabel('')
plt.ylabel('')
plt.show()

不同细分领域对数据分析岗的需求量

industry_index = df["industryField"].value_counts()[:10].index
industry =df.loc[df["industryField"].isin(industry_index),"industryField"]
fig, ax = plt.subplots(figsize=(12,8))
sns.countplot(y=industry.values,order = industry_index,color='#3c7f99')
plt.box(False)
fig.text(x=0, y=0.90, s='         细分领域数据分析岗位的需求量(取前十)     ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
plt.tick_params(axis='both', which='major', labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.5, color='#3c7f99')
plt.xlabel('')
plt.ylabel('')

各城市相应岗位的薪资状况

fig,ax = plt.subplots(figsize=(12,8))
city_order = df.groupby("city")["salary"].mean()\
               .sort_values()\
               .index.tolist()
sns.barplot(x="city", y="salary", order=city_order, data=df, ci=95,palette="RdBu_r")
fig.text(x=0.04, y=0.90, s='              各城市的薪资水平对比              ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#3c7f99')
plt.tick_params(axis="both",labelsize=16,)
ax.yaxis.grid(which='both', linewidth=0.5, color='black')
ax.set_yticklabels([" ","5k","10k","15k","20k"])
plt.box(False)
plt.xlabel('')
plt.ylabel('')

fig,ax = plt.subplots(figsize=(12,8))
fig.text(x=0.04, y=0.90, s='           一线城市的薪资分布对比             ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
sns.kdeplot(df[df["city"]=='北京']["salary"],shade=True,label="北京")
sns.kdeplot(df[df["city"]=='上海']["salary"],shade=True,label="上海")
sns.kdeplot(df[df["city"]=='广州']["salary"],shade=True,label="广州")
sns.kdeplot(df[df["city"]=='深圳']["salary"],shade=True,label="深圳")
plt.tick_params(axis='both', which='major', labelsize=16)
plt.box(False)
plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])
plt.yticks([])
plt.legend(fontsize = 'xx-large',fancybox=None)
plt.show()


工作经验与薪水的关系

corr = df.pivot_table(index="city",columns="workYear",values="salary")
df.head()
corr = corr[["应届毕业生","1-3年","3-5年","5-10年"]]
corr.loc[city_order]

fig,ax = plt.subplots(figsize=(10,8))
sns.heatmap(corr.loc[df["city"].value_counts().index],cmap="RdBu_r",center=20,annot=True,annot_kws={'fontsize':14})
plt.tick_params(axis='x', which='major', labelsize=16)
plt.tick_params(axis='y', which='major', labelsize=16,labelrotation=0)
plt.xlabel(""),plt.ylabel("")

技能要求

py_rate = df["Python/R"].value_counts(normalize=True).loc[1]
sql_rate = df["SQL"].value_counts(normalize=True).loc[1]
tableau_rate = df["Tableau"].value_counts(normalize=True).loc[1]
excel_rate = df["Excel"].value_counts(normalize=True).loc[1]
print("职位技能需求:")
print("Python/R:",py_rate)
print("SQL:",sql_rate)
print("Excel:",excel_rate)
print("Tableau:",tableau_rate)

职位技能需求:

Python/R: 0.6078431372549019
SQL: 0.6070889894419306
Excel: 0.3310708898944193
Tableau: 0.09502262443438914

def get_level(x):
    if x["Python/R"] == 1:
        x["skill"] = "Python/R"
    elif x["SQL"] == 1:
        x["skill"] = "SQL"
    elif x["Excel"] == 1:
        x["skill"] = "Excel"
    else:
        x["skill"] = "其他"
    return x
df = df.apply(get_level,axis=1)
fig,ax = plt.subplots(figsize=(12,8))
fig.text(x=0.02, y=0.90, s='             不同技能的薪资水平对比            ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
sns.boxplot(y="skill",x="salary",data=df.loc[df.skill!="其他"],palette="husl",order=["Python/R","SQL","Excel"])
plt.tick_params(axis="both",labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.75)
plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])
plt.box(False)
plt.xlabel('工资', fontsize=18)
plt.ylabel('技能', fontsize=18)

学历要求

education = df["education"].value_counts(normalize=True)
from pyecharts.commons.utils import JsCode
def new_label_opts():
        return opts.LabelOpts(formatter=JsCode("educatio"))
pie = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(education.index, np.round(education.values,4))],
        center=["50%", "50%"],
        radius=["50%","75%"],
        label_opts=new_label_opts()
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title=""),
        legend_opts=opts.LegendOpts(
                is_show=False
            )
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%")))
pie.render_notebook()

不同规模的公司在招人要求上的差异

company_size_map = {
    "2000人以上": 6,
    "500-2000人": 5,
    "150-500人": 4,
    "50-150人": 3,
    "15-50人": 2,
    "少于15人": 1
}
workYear_map = {
    "5-10年": 5,
    "3-5年": 4,
    "1-3年": 3,
    "1年以下": 2,
    "应届毕业生": 1
}
df["companySize"] = df["companySize"].map(company_size_map)
df["workYear"] = df["workYear"].map(workYear_map)
df.head()
df = df.sort_values(by="companySize",ascending=True)
df_plot = df.loc[~df.workYear.isna()]
color_map = {
    5:"#ff0000",
    4:"#ffa500",
    3:"#c5b783",
    2:"#3c7f99",
    1:"#0000cd"
}
df_plot["color"] = df_plot.workYear.map(color_map)
df_plot.reset_index(drop=True,inplace=True)
def seed_scale_plot():
    seeds=np.arange(5)+1
    y=np.zeros(len(seeds),dtype=int)
    s=seeds*100
    colors=['#ff0000', '#ffa500', '#c5b783', '#3c7f99', '#0000cd'][::-1] 
    fig,ax=plt.subplots(figsize=(12,1))
    plt.scatter(seeds,y,s=s,c=colors,alpha=0.3)
    plt.scatter(seeds,y,c=colors)
    plt.box(False)
    plt.grid(False)
    plt.xticks(ticks=seeds,labels=list(workYear_map.keys())[::-1],fontsize=14)
    plt.yticks(np.arange(1),labels=['  经验:'],fontsize=16)
fig, ax = plt.subplots(figsize=(12, 8))
fig.text(x=0.03, y=0.92, s='            不同规模公司的用人需求差异          ', fontsize=32, 
         weight='bold', color='white', backgroundcolor='#3c7f99')
plt.scatter(df_plot.salary, df_plot["workYear"],  s=df_plot["workYear"]*100 ,alpha=0.35,c=df_plot["color"])
plt.scatter(df_plot.salary, df_plot["companySize"], c=df_plot["color"].values.tolist())
plt.tick_params(axis='both', which='both', length=0)
plt.tick_params(axis='both', which='major', labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.75)
plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])
plt.xlabel('工资', fontsize=18)
plt.box(False)
seed_scale_plot()

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这些js原型及原型链面试题你能做对几道

一、前言 在面试过程中&#xff0c;频频被原型相关知识问住&#xff0c;每次回答都支支吾吾。后来有家非常心仪的公司&#xff0c;在二面时&#xff0c;果不其然&#xff0c;又问原型了&#xff01; 我痛下决心用了两天时间钻研了下原型&#xff0c;弄明白后发现世界都明亮了…

Spark 在 KaiwuDB 中的应用与实践

线上沙龙-技术流第 24 期营业啦01月12日&#xff08;周四&#xff09;19:30开务数据库 - B站直播间当数据库面对大量数据复杂 OLAP 查询时&#xff0c;性能出现局限性&#xff0c;无法满足用户 AP 方面的高性能要求。为此&#xff0c;KaiwuDB 推出了此项解决方案&#xff1a;借…

【NI Multisim 14.0原理图环境设置——电路图属性设置】

目录 序言 一、电路图属性设置 &#x1f34a;1.设置对象可见性 &#x1f34a;2.设置图纸颜色 &#x1f34a;3.设置图纸尺寸 &#x1f34a;4.设置图纸方向 &#x1f34a;5.设置图纸单位 &#x1f34a;6.设置图纸网格点 &#x1f34a;7.设置图纸边框 &#x1f34a;8. 设…

ELK安装使用

太久没用了&#xff0c;熟悉一下。 JDK1.8以上环境 下载地址 elasticsearch&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch kibana: https://www.elastic.co/cn/downloads/kibana logstash &#xff1a; https://www.elastic.co/cn/downloads/logstash…

社招前端二面必会手写面试题总结

字符串查找 请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中&#xff0c;并返回第一次出现的位置&#xff08;找不到返回 -1&#xff09;。 a34;b1234567; // 返回 2 a35;b1234567; // 返回 -1 a355;b12354355; // 返回 5 isContain(a,b);function isContain(a,…

RS—|下载Landsat8/9数据并进行ENVI大气校正(FLAASH模型)

文章目录1、 数据的下载。2、 辐射定标3、大气校正1、 数据的下载。 下载网址&#xff1a;链接: GloVis (usgs.gov)。下载的数据为2022年8月1日湖南省北部的遥感影像数据。该数据为L1级产品&#xff0c;只经过了几何校正&#xff0c;没有经过辐射定标和大气校正。 图1-1.下载…

富而喜悦2023直播盛典 唐苓馨主题演说“特别的礼物”!

网讯2023年1月1日19:30&#xff0c;富而喜悦一年一渡“特别的礼物”新年主题直播盛典晚会如约而至。富而喜悦品牌创始人唐苓馨女士&#xff0c;用自己与身边人的真实故事&#xff0c;为您讲述了“遇见生活中特别的礼物”。以下是富而喜悦品牌创始人唐苓馨女士在2023富而喜悦一年…

手写RPC框架05-通过SPI机制增加框架的扩展性的设计与实现

源码地址&#xff1a;https://github.com/lhj502819/IRpc/tree/v6 系列文章&#xff1a; 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现 现有的问题 在上一章节末尾我们提到了&#xff0c;目前我们的RPC框架可扩展性…

发表计算机SCI论文需要注意什么? - 易智编译EaseEditing

一篇SCI&#xff0c;除了能让审稿人浅显易懂的了解你的表达之外&#xff0c;我们还需要在内容上做好&#xff1a; 1、SCI论文标题创新、简洁 创新是因为写科技文章的目的在于报道新的科技进展&#xff0c;缺乏创新因素就会失去发表的意义。 但运用创新要建立在已有的科研成果…

QT部件透明阴影效果与不规则窗体

透明效果原始效果设置整个窗体透明&#xff0c;调用setWindowOpacity( )方法&#xff0c;传入一个0~1之间的值来表示透明度&#xff1b;1表示不透明&#xff0c;0表示完全透明setWindowOpacity(0.5);//0~1之间设置窗体透明&#xff0c;部件不透明setWindowFlags(Qt::FramelessW…

MATLAB | 赠书 | 如何从热图中提取数据

gzh上这篇文章正在抽奖赠书&#xff1a;截止日期2023年1月9日12&#xff1a;00&#xff08;周一&#xff09; MATLAB | 文末赠书 | 如何从热图中提取数据 赠送3本由北京大小出版社提供的《SPSS统计分析大全》 这期做了个可能有用的小工具&#xff0c;一般论文中热图很少给出…

十.指针进阶(对指针的深度理解)

目录 一. 字符指针 1.字符指针的定义 2.字符指针的用法 3.字符指针练习 二. 数组指针 1.指针数组的定义 2.指针数组的用法 三. 指针数组 1.数组指针的定义 2.数组名和&数组名的区别 3.数组指针的用法 4.练习 四. 数组传参和指针传参 1.一维数组传参 2.二维数…

十、MyBatisX插件

文章目录十、MyBatisX插件1 安装MyBatisX插件2 MybatisX代码速成3 在mapper接口中实现自定义功能【尚硅谷】MyBatisPlus教程-讲师&#xff1a;杨博超 失败&#xff0c;是正因你在距成功一步之遥的时候停住了脚步。 十、MyBatisX插件 MyBatis-Plus为我们提供了强大的mapper和ser…

Jdbc配置文件连接mysql8.0——通过拼接字符串进行批量增删改操作

目录 一、基类BaseDao 二、对dog表的批量增删改操作 (一)Dog类 (二)DogDao接口 (三)DogDaoImpl实现类 1.批量新增 2.批量删除 3.批量修改 (四)Test测试 1.新增 2.删除 3.修改 三、对master表进行批量增删改 (一)Master类 (二)MasterDao接口 (三)MasterDaoImpl实…

RK3588平台开发系列讲解(内核调试篇)oops分析

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、oops简介二、oops分析2.1、实验代码2.2、oops信息2.3、oops分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢当系统内核发生kernel panic的时候,系统会打印出oops信息,本篇主要介绍如何根据oops定位问…

2022/1/6总结

今天学习了KMP算法。 KMP算法 这是一个字符串查找的算法&#xff0c;我们之前学习的字符串查找都是暴力穷举&#xff0c;然而这个效率太低&#xff0c;于是有三位大佬发明了线性的KMP算法。 算法说难不难&#xff0c;说简单也不简单。 算法的核心思想是找到最长的相等的前…

Struts2框架之Action配置

Struts2框架之Action配置Action配置1、访问Action的三种方式1.1、method属性访问1.2、Action动态方法调用1.3、通配符调用2、配置默认的ActionAction配置 Action控制器在Struts2框架中至关重要&#xff0c;主要作用如下&#xff1a; 封装工作单元数据转移的场所返回结果字符串…

(黑马C++)L07 多态

一、多态的基本概念 多态是面向对象程序设计语言中除数据抽象和继承之外的第三个基本特征。 多态&#xff1a;父类的引用或者指针指向子类对象 C支持编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;运算符重载和函数重…

纷享销客CRM让科顺营销人更容易呼唤到“炮火”

希望让听得见“炮声”的人&#xff0c;更容易呼唤到“炮火”。对于在一线做营销的人而言&#xff0c;他们就是听到“炮声”的人。让一线的人员听得到“炮声”也就是销售线索、商机&#xff0c;能呼唤到“炮火”也就是呼唤到他们需要的资源。这恐怕是所有营销人都希望达到的境界…

ubuntu Ad-Hoc组网通信

目录 WIFI通信的多种组网方式 1、AP模式 2、Ad-hoc模式 ubuntu18配置ad-hoc模式 WIFI通信的多种组网方式 1、AP模式 最常用的模式&#xff0c;需要一个节点&#xff08;一般是路由器&#xff09;作为AP&#xff0c;其他节点连接到这个AP产生的wifi网络。通信拓扑是星形&a…