51Job大数据分析师岗位项目

51job中大数据分析师岗位情况分析(在Jupyter Notebook中处理)

第一步:载入库、搭建环境,载入并观察数据

In []
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
import warnings
warnings.filterwarnings(“ignore”)#取消警告内容
plt.rcParams[‘font.sans-serif’]=[‘SimHei’] #用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus’]=False #用来正常显示负号

第二步:清洗数据

1.删除职位、薪酬NA值,并将薪酬单位规范统一为 N千/月

In []
data=pd.read_excel(“51joball.xlsx”,sheet_name=“Sheet1”,header=0)#载入数据,并观察概况
data.info()
#data.describe()
#data.head(5)

Out[]
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 9553 entries, 0 to 9552
Data columns (total 13 columns):
职位 9374 non-null object
公司 9378 non-null object
薪酬 9102 non-null object
地点 9378 non-null object
工作经验 9378 non-null object
学历 9378 non-null object
福利 7706 non-null object
职位信息 9420 non-null object
公司性质 9418 non-null object
公司规模 9238 non-null object
行业 9362 non-null object
获取网址 9553 non-null object
获取时间 9553 non-null datetime64[ns]
dtypes: datetime64ns, object(12)
memory usage: 970.3+ KB

In[]
data1=data.dropna(subset=[“职位”])#删除职位NA值
#data1.info()
data1=data1.dropna(subset=[“薪酬”])#删除薪酬NA值
data1.info()
data1[“薪酬”].head()#观察薪酬单位

Out[]
<class ‘pandas.core.frame.DataFrame’>
Int64Index: 9099 entries, 0 to 9551
Data columns (total 13 columns):
职位 9099 non-null object
公司 9099 non-null object
薪酬 9099 non-null object
地点 9099 non-null object
工作经验 9099 non-null object
学历 9099 non-null object
福利 7653 non-null object
职位信息 9099 non-null object
公司性质 9097 non-null object
公司规模 9034 non-null object
行业 9090 non-null object
获取网址 9099 non-null object
获取时间 9099 non-null datetime64[ns]
dtypes: datetime64ns, object(12)
memory usage: 995.2+ KB
0 2-3万/月
1 6-8千/月
2 1-1.5万/月
3 6-8千/月
4 0.8-1万/月
Name: 薪酬, dtype: object

对薪酬单位转化的函数

In[]
def word_cut(word,method):
pos=word.find("-")
pos1=word.find(“万/月”)
pos2=word.find(“万/年”)
pos3=word.find(“千/月”)
if pos1 !=-1:
low=float(word[:pos])*10
hig=float(word[pos+1:pos1])*10
elif pos2 !=-1:
low=float(word[:pos])*10/12
hig=float(word[pos+1:pos2])*10/12
elif pos3 !=-1:
low=float(word[:pos])
hig=float(word[pos+1:pos3])
else:
low=np.nan
hig=np.nan
if method==“low”:
return low
else:
return hig

data1[“low_salary”]=data1[“薪酬”].apply(word_cut,method=“low”)#用apply方法调用word_cut函数,新建最低薪酬
#data1[“low_salary”]
data1[“hig_salary”]=data1[“薪酬”].apply(word_cut,method=“hig”)#用apply方法调用word_cut函数,新建最高薪酬
#data1[“hig_salary”]
data1.head()
data2=data1.dropna(subset=[“low_salary”])#删除NA值
data2.info()

Out[]
<class ‘pandas.core.frame.DataFrame’>
Int64Index: 8990 entries, 0 to 9551
Data columns (total 15 columns):
职位 8990 non-null object
公司 8990 non-null object
薪酬 8990 non-null object
地点 8990 non-null object
工作经验 8990 non-null object
学历 8990 non-null object
福利 7579 non-null object
职位信息 8990 non-null object
公司性质 8988 non-null object
公司规模 8925 non-null object
行业 8981 non-null object
获取网址 8990 non-null object
获取时间 8990 non-null datetime64[ns]
low_salary 8990 non-null float64
hig_salary 8990 non-null float64
dtypes: datetime64ns, float64(2), object(12)
memory usage: 1.1+ MB

In[]
data2[“ava_salary”]=data2.apply(lambda x: (x.hig_salary+x.low_salary)/2,axis=1)#算出平均薪酬
data2[“ln_salary”]=data2.apply(lambda x:math.log(x.ava_salary),axis=1)#算出对数化后的平均薪酬
#data2.head()#观察结果

2.对工作地点进行规范

In[]
data2[“地点”].head()
data2[“city”]=data2.apply(lambda x: x.地点.split("-")[0],axis=1)
data2.head()

Out[]
展示结果部分内容

3.按照职位数量将城市划分为N组

In[]
data2.city.value_counts()#观察每个城市的职位频数
Out[]
广州 1909
上海 1410
北京 1129
深圳 733
合肥 504
成都 399
杭州 376
武汉 268
南京 227
西安 144
苏州 127
长沙 113
重庆 111
佛山 104
南通 98
宁波 78
福州 78
郑州 78
昆明 75
东莞 71
天津 69
沈阳 67
济南 58
厦门 55
昆山 51
无锡 48
大连 47
珠海 35
青岛 33
南昌 32

泸州 1
泰州 1
包头 1
潮州 1
宿迁 1
盐城 1
十堰 1
扬州 1
宝鸡 1
海南省 1
三门峡 1
焦作 1
聊城 1
湖南省 1
钦州 1
九江 1
甘肃省 1
周口 1
淄博 1
保定 1
滁州 1
揭阳 1
鞍山 1
衢州 1
天门 1
池州 1
丹东 1
福建省 1
葫芦岛 1
吉林 1
Name: city, Length: 150, dtype: int64

In[]
for i in data2[“city”].index:
if data2.city[i] !="广州"and data2.city[i] !="上海"and data2.city[i] !="北京"and data2.city[i] !="深圳"and data2.city[i] !="合肥"and data2.city[i] !="成都"and data2.city[i] !="武汉"and data2.city[i] !="杭州"and data2.city[i] !=“南京”:
data2.city[i]=“其它”
else:
pass

data2.head()

Out[]

对城市名称进行规范

4.删除无关列,并重命名便于观察

In[]
data3=data2.drop([“职位”,“公司”,“薪酬”,“地点”,“获取网址”,“获取时间”,“low_salary”,“hig_salary”],axis=1)#删除无关列
#重命名
data4=data3.rename(columns={“工作经验”:“exp”,“学历”:“edu”,“福利”:“welfare”,“职位信息”:“jobinfo”,“公司性质”:“companytype”,“公司规模”:“scale”,“行业”:“industry”})
#data4.info()

5.将清洗好的数据保存到磁盘,防止意外

In[]
data4.to_excel(“51job_clean.xlsx”,index=False)

第三步:数据可视化

In[]
df_plot=data4#构建一个用于做数据可视化的
df_plot.head()

观察数据

(一)单因素分析

1.用柱状图观察各城市职位数量分布情况

In[]
data_city=df_plot.city.value_counts()
#data_city
type(data_city)
ax1=data_city.plot(“bar”,figsize=(12,6),fontsize=“14”,ylim=[0,2300],rot=0,legend=True,grid=True)
plt.title(“各城市职位数量分布情况”,color=“blue”,fontsize=24,y=1.05)
for i in range(0,len(data_city)):
ax1.text(i-0.15,data_city[i]+30,data_city[i],fontsize=12,color=“k”)

#观察发现广州、上海、北京、深圳的职位数量排名靠前
各城市职位数量分布情况

2.用条形图观察不同学历层次岗位需求数量情况

In[]
data_edu=df_plot.edu.value_counts()
ax2=data_edu.plot(“barh”,figsize=(12,6),fontsize=“14”,xlim=[0,4000],legend=True)
ax2.set_legend=([“博士”,“本科”])
plt.title(“不同学历层次岗位需求数量情况”,color=“blue”,fontsize=24,y=1.05)
for i in range(0,len(data_edu)):
ax2.text(data_edu[i]+30,i-0.15,data_edu[i],fontsize=12,color=“k”)

#观察发现本科学历的岗位需求数量最多

不同学历层次岗位需求数量情况

3.用箱图观察不同城市薪酬分布情况

In[]
#观察不同城市薪酬分布情况
#箱图的粗细表示所包含的数据量大小
ax3=df_plot.boxplot(column=“ln_salary”,by=“city”,figsize=(12,6),fontsize=14,widths=df_plot.city.value_counts()/2500)
ax3.set_title(“不同城市的薪酬分布情况”,fontsize=24,color=“blue”,y=1.1)
ax3.set_xlabel(“城市”,fontsize=14)
ax3.set_ylabel(“平均薪酬”,fontsize=14)
#观察发现上海、北京、杭州、深圳平均薪酬相对较高,合肥、成都、武汉平均薪酬相对较低,广州薪酬差异较大

不同城市的薪酬分布情况

4.用箱图观察不同学历薪酬分布情况

In[]
#观察不同学历层次的薪酬情况
ax4=df_plot.boxplot(column=“ln_salary”,by=“edu”,figsize=(12,6),fontsize=14,widths=0.5)
ax4.set_title(“不同学历层次的薪酬分布情况”,fontsize=24,color=“blue”,y=1.1)
ax4.set_xlabel(“学历”,fontsize=14)
ax4.set_ylabel(“平均薪酬”,fontsize=14)
#观察发现博士学历的平均薪酬显著高于其它学历层次,本科薪酬差异较大

不同学历层次的薪酬分布情况

5.用直方图观察硕士、本科、大专3个不同学历层次的薪酬分布情况

In[]
fig,ax5=plt.subplots(figsize=(12,8))
ax5.set_title(“硕士、本科、大专3个不同学历层次的薪酬分布情况”,fontsize=24,color=“blue”,y=1.02)
ax5.hist(x=df_plot[df_plot.edu==“硕士”].ln_salary,bins=20,facecolor=“red”,alpha=1)
ax5.hist(x=df_plot[df_plot.edu==“本科”].ln_salary,bins=20,facecolor=“green”,alpha=0.5)
ax5.hist(x=df_plot[df_plot.edu==“大专”].ln_salary,bins=20,facecolor=“blue”,alpha=0.5)
ax5.legend([“硕士”,“本科”,“大专”])
硕士、本科、大专3个不同学历层次的薪酬分布情况

(二)多因素分析

6.观察不同公司类型、不同公司规模的薪酬情况

In[]
df_plot.head()#观察数据
在这里插入图片描述
In[]
#观察不同公司类型、不同公司规模的平均薪酬情况
df_company=df_plot.groupby([“companytype”,“scale”]).mean()
df_company.head()
ax6=df_company.ava_salary.plot.barh(figsize=(28,20))
ax6.set_title(“不同公司类型、不同公司规模的平均薪酬情况”,fontsize=24,color=“blue”,y=1.02)
for i in range(0,len(df_company.ava_salary)):
ax6.text(df_company.ava_salary[i]+0.12,i-0.2,"%.2f"%df_company.ava_salary[i]+“千/月”,fontsize=12,color=“k”)#添加数据标签

#观察发现规模为1000人到5000人的事业单位平均薪酬最高

展示部分内容

7.观察不同城市、不同学历层次的薪酬情况

In[]
#观察不同城市、不同学历层次的薪酬情况
df_city_edu=df_plot.groupby([“city”,“edu”]).mean()
df_city_edu.head(10)
ax7=df_city_edu.ava_salary.plot.barh(figsize=(28,30))
ax7.set_title(“不同公司城市、不同学历层次的平均薪酬情况”,fontsize=24,color=“blue”,y=1.02)
for i in range(len(df_city_edu)):
ax7.text(df_city_edu.ava_salary[i]+0.15,i-0.18,"%.2f"%df_city_edu.ava_salary[i]+“千/月”,fontsize=12,color=“k”)#添加数据标签

#观察发现杭州博士学历的平均薪酬最高,深圳硕士的平均薪酬次之,上海博士的平均薪酬再次之

展示部分内容

(三)词云图

8.作福利待遇的词云图

In[]
df_plot.welfare.head(10)

Out[]
0 五险一金/补充医疗保险/补充公积金/弹性工作/交通补贴/餐饮补贴/年终奖金/绩效奖金/定期体…
1 做五休二/五险一金/绩效奖金/全勤奖/节日福利/专业培训/餐饮补贴/定期体检/
2 免费班车/一日三餐/员工宿舍/员工旅游/五险一金/年终奖金/绩效奖金/定期体检/专业培训/
3 五险一金/专业培训/员工旅游/出国机会/绩效奖金/年终奖金/股票期权/弹性工作/周末双休/
4 五险一金/员工旅游/年终奖金/出国机会/专业培训/
5 五险一金/补充医疗保险/补充公积金/员工旅游/出国机会/专业培训/绩效奖金/
6 NaN
7 五险一金/员工旅游/专业培训/出国机会/绩效奖金/年终奖金/弹性工作/股票期权/
8 五险一金/员工旅游/周末双休/不加班/早九晚五/带薪年假/节假日福利/专业培训/晋升空间大/…
9 NaN
Name: welfare, dtype: object

In[]
#welfare_cloud1=df_plot.welfare.dropna()
welfare_cloud1=df_plot.welfare.str.split("/")#以/为分隔符将福利项目分开
welfare_cloud2=welfare_cloud1.dropna().apply(pd.value_counts)#删除NaN,并统计福利项目的值
#welfare_cloud2
welfare_cloud3=welfare_cloud2.unstack()#转换为交叉表
#welfare_cloud3
#print(type(welfare_cloud3))
welfare_cloud4=welfare_cloud3.dropna().reset_index()#删除NaN,并统计用各福利项目在不同索引的是否有的值1为有,再将索引重设
#welfare_cloud4
welfare_cloud5=welfare_cloud4[“level_0”]#罗列出各项福利
#print(type(welfare_cloud5))
#welfare_cloud5
welfare_cloud5.to_csv(“wordcloud5.txt”,sep="\t",index=False)#不带index,保存为txt文件

In[]
import wordcloud
import jieba
#构建词云图
word=open(“wordcloud5.txt”,“r”,encoding=“utf-8”).read()
#word
#type(word)
weflare_words_cloud=wordcloud.WordCloud(width=1000,height=700,max_font_size=80,min_font_size=10,scale=1.5,font_path=“simhei.ttf”,collocations=False)#设置云图格式
#weflare_words_cloud.generate(word)
weflare_words_cloud.generate(" ".join(jieba.cut(word)))#两种方法都可实现
weflare_words_cloud.to_file(“weflare_words_cloud2.png”)#保存图片

In[]
%%html
<img src=".\weflare_words_cloud2.png", width=840, heigth=300>
#读取词云图福利待遇词云图

9.作行业分布词云图

In[]
df_plot.industry.head(10)#观察数据

Out[]
0 互联网/电子商务
1 酒店/旅游,互联网/电子商务
2 互联网/电子商务,计算机软件
3 金融/投资/证券
4 金融/投资/证券
5 金融/投资/证券
6 计算机软件
7 金融/投资/证券
8 金融/投资/证券,专业服务(咨询、人力资源、财会)
9 金融/投资/证券
Name: industry, dtype: object

In[]
industry_cloud1=df_plot.industry.str.split("/")#以/为分隔符将行业名称分开
#industry_cloud1
#print(type(industry_cloud1))
industry_cloud2=industry_cloud1.dropna().apply(pd.value_counts)#删除NaN,并统计行业名称的值
#industry_cloud2
#print(type(industry_cloud2))
industry_cloud3=industry_cloud2.unstack()#转换为交叉表
#industry_cloud3
#print(type(industry_cloud3))
industry_cloud4=industry_cloud3.dropna().reset_index()#删除NaN,并统计用各行业名称在不同索引的是否有的值1为有,再将索引重设
#industry_cloud4
industry_cloud5=industry_cloud4[“level_0”]
industry_cloud5
industry_cloud5.to_csv(“industry_cloud.txt”,sep="\t",index=False)#保存为txt文件

In[]
word2=open(“industry_cloud.txt”,encoding=“utf-8”).read()
#word2
#print(type(word2))
industry_words_cloud=wordcloud.WordCloud(width=1000,height=700,max_font_size=80,min_font_size=10,scale=1.5,font_path=“simhei.ttf”,collocations=False)
industry_words_cloud.generate(word2)
#industry_words_cloud.generate(" ".join(jieba.cut(word2)))#两种方法都可实现
industry_words_cloud.to_file(“industry_words_cloud.png”)#保存图片

In[]
%%html
<img src=".\industry_words_cloud.png", width=840, heigth=300>#读取图片
行业名称词云图

第四步 数据挖掘 作回归分析

In[]
import statsmodels.api as sm
from statsmodels.formula.api import ols
df_ols = pd.read_excel(‘51job_clean.xlsx’)
df_ols.head()#观察数据
在这里插入图片描述
In[]
#10.作方差分析观察工作经验的P值
print(“工作经验的P值为:%.4f” %sm.stats.anova_lm(ols(‘ln_salary ~ C(exp)’,data=df_ols).fit())._values[0][4])

Out[]
工作经验的P值为:0.0000

In[]
#构建回归方程
lm = ols(“ln_salary ~ C(companytype)+C(exp)+C(edu)+C(scale)+C(industry)”,data=df_ols).fit()
lm_summary = lm.summary()
lm_summary

展示部分内容

观察结果如下: 1.Adj.R-squraed:0.383 表示回归方程的解释准确率只有38.3%; 2.Prob(F-statistic):0.00 表示回归方程成立,具有统计学意义 3.Model:OLS 最小二乘法作多元线性回归 4.观察右侧系数表中P>|t|的值,只要有一项亚变量存在<0.05,则可以容纳于回归方程,遵循同进同出的原则

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值