本文数据源来自某招聘网站数据分析师相关职位信息,以练习为主,并结合自己的一些想法总结成一份数据分析报告。数据源:链接:https://pan.baidu.com/s/12ULXPMrGcfilLgWNK3j9xA
提取码:t2zy
一.报告背景
随着互联网的发展,数据分析师这一岗位逐渐流行起来。本文利用python 3.7,以jupter notebook为编辑平台,采用pandas,numpy,matplotlib包对数据分析师的薪资以及需求状况进行分析,并预测其发展前景。
二.报告目的
1.分析数据分析师在不同城市,工作年限,学历的薪资分布
2.分析数据分析师职位在不同城市,公司等方面的需求
3.分析数据分析师岗位的要求
4.分析数据分析师的发展前景
三.报告正文
分析思路:载入数据—数据清洗—数据分析—数据可视化—得出结论
1.导入数据
read_csv拥有诸多的参数,encoding是最常用的参数之一,它用来读取csv格式的编码,这里采用gbk模式。
import pandas as pd
import numpy as np
df=pd.read_csv('DataAnalyst-练习数据.csv',encoding='gbk')
df
2.数据清洗
首先通过浏览数据,了解不同字段的基本状况
df.info()
我们可以看出这里一共有6876条数据信息,其中少量字段存在为空的情况,后续将会对必要分析字段做处理。
其次进行数据处理
1)处理重复数据
len(df.positionId.unique()) #unique返回唯一值
可以看出以positionId为基础,得出一共有5031个唯一值,与之前的6876条数据相比,此时必然存在重复值,利用drop_duplicates去重
df_duplicates=df.drop_duplicates(subset='positionId',keep='first')
#subset参数选择以哪个列为去重基准。keep参数则是保留方式,first是保留第一个,last是保留最后一个
2)薪资处理
求出薪资上下限
def cut_word(word,method):
position = word.find('-')
length = len(word)
if position != -1: #处理有‘···k-···k’的薪资上下限
bottomSalary = word[:position-1]
topSalary = word[position+1:length-1]
else: #求出“...k以上”的薪资上下限
bottomSalary = word[:word.upper().find('K')] #我们用upper函数将k都转换为K
topSalary = bottomSalary
if method == 'bottom': #显示bottomSalary与topSalary字段
return bottomSalary
else:
return topSalary
df_duplicates['topSalary'] = df_duplicates.salary.apply(cut_word, method='top')
df_duplicates['bottomSalary']=df_duplicates.salary.apply(cut_word, method='bottom')
df_duplicates
求出平均薪资
df_duplicates.topSalary = df_duplicates.topSalary.astype(int) #将上下限薪资转化为数据类型
df_duplicates.bottomSalary = df_duplicates.bottomSalary.astype(int)
df_duplicates['avgSalary'] = df_duplicates.apply(lambda x:(x.bottomSalary+x.topSalary)/2,axis = 1)
#lambda为匿名函数,x为输入,后续为输出,这里也可以用(df_duplicates.bottomSalary + df_duplicates.topSalary)/2替代
3.数据分析
1)选取分析字段
df_clean = df_duplicates[['city','companyShortName','companySize','education','positionName','positionLables','workYear','avgSalary']]
2)描述统计
df_clean.city.value_counts()
df_clean.describe()
从上面的分析看来,北京的数据分析师招聘远远高于其他城市,其他城市在几十到几百的水平;
其次,数据分析师平均薪资在17k左右,中位数在15k左右,标准差为8.99k,而我们看图中最大值达到75k,初步推断薪资的巨大差异可能受学历,工作年限等限制。
数据可视化:
import matplotlib.pyplot as plt
%matplotlib inline
#%matplotlib inline是jupyter自带的方式,允许图表在cell中输出。plt.style.use('ggplot') 使用R语言中的ggplot2配色作为绘图风格
plt.style.use('ggplot')
(1)直方图
df_clean.avgSalary.hist(bins=15) #bins是为了缩小直方图宽距
可以看出数据分布呈双峰状,薪资范围集中在10k—20k
(2)箱线图
a.不同城市薪资
from matplotlib.font_manager import FontProperties
font_zh=FontProperties(fname='C:\\WINDOWS\\Fonts\\simsun.ttc')
ax=df_clean.boxplot(column='avgSalary',by='city',figsize=(9,7)) #column选择箱线图的数值,by是选择分类变量,figsize是尺寸
for label in ax.get_xticklabels(): #ax.get_xticklabels获取坐标轴刻度
label.set_fontproperties(font_zh) #利用set_fontpeoperties更改字体
图表默认使用英文,当箱线图X轴刻度需要输出中文时,就需要解决中文路径问题。除了文中的通过matplotlib字体管理器,还有用某种中文字体替换掉matplotlib的默认字体的方法,但这属于一种破坏性质的方法,同样的代码在不同的环境中使用容易出问题。
从图里可以看出,北京的薪资拔得头筹,其次是上海,杭州,深圳,这些地方的薪资中位数以及Top区域也是分布较广的。
b.不同工作年限薪资
ax=df_clean.boxplot(column='avgSalary',by='workYear',figsize=(10,5))
for label in ax.get_xticklabels():
label.set_fontproperties(font_zh)
从图里可以看出,数据分析师薪资受工作年限影响较大,刚毕业以及毕业一年以内的数据分析从业者相对其他从业者薪资的中位数以及Top区域都较小,可以看出数据分析岗位对工作经验还是很看中的。
c.不同学历薪资
ax=df_clean.boxplot(column='avgSalary',by='education',figsize=(9,7))
for label in ax.get_xticklabels():
label.set_fontproperties(font_zh)
博士薪资平均水平最高,但Top区域明显不如其他层次,另外本科毕业的数据分析师薪资水平的top区域是最高的。具体分析待后面的分析维度细分。
d.不同城市和学历薪资
#选取“上海“”和“北京”两个城市结合学历进行分析
df_sh_bj=df_clean[df_clean['city'].isin(['上海','北京'])]
ax=df_sh_bj.boxplot(column='avgSalary',by=['education','city'],figsize=(14,6))
for label in ax.get_xticklabels():
label.set_fontproperties(font_zh)
可以看出北京的数据分析岗位薪资普遍高于上海的薪资水平,北京的数据分析这一职位发展空间较大。
(3)条形图
ax=df_clean.groupby('city').mean().plot.bar()
for label in ax.get_xticklabels():
label.set_fontproperties(font_zh)
可以看出北京,上海,广州,深圳这四个地方的数据分析岗位的平均薪资位于全国前列。
3)维度细分
a.不同城市与不同学历平均薪资
df_clean.groupby(['city','education']).mean().unstack() #调用unstack方法,进行行列转置
纵向分析,博士数据只存在上海,北京,深圳,其他为空值,这是否跟招聘数量有关呢?其次,博士学历最高薪资在深圳,硕士学历最高的薪资在杭州,本科最高的薪资在北京。横向分析,北京,上海,深圳综合薪资较高。为方便分析引入下图:
(1)多重聚合条形图
ax=df_clean.groupby(['city','education']).mean().unstack().plot.bar(figsize=(14,6))
for label_x in ax.get_xticklabels():
label_x.set_fontproperties(font_zh)
ax.legend(prop=font_zh)
另一种方法是分桶:
bins=[0,3,5,10,15,20,30,100]
level=['0-3','3-5','5-10','10-15','15-20','20-30','30+']
df_clean['level']=pd.cut(df_clean['avgSalary'],bins=bins,labels=level)
df_clean[['avgSalary','level']]
(2)簇状条形图
df_level=df_clean.groupby(['city','level']).avgSalary.count().unstack()
df_level_prop=df_level.apply(lambda x:x/x.sum(),axis=1)
ax=df_level_prop.plot.bar(stacked=True,figsize=(14,6))
for label in ax.get_xticklabels():
label.set_fontproperties(font_zh)
plt.legend(bbox_to_anchor=(1, 1))
b.查看招聘人数
df_clean.groupby(['city','education']).avgSalary.count().unstack()
这里可以很好解释之前博士学历的岗位薪资异常状况,图里显示博士招聘数只有6个,很有可能博士学历的人更多从事技能要求更高,比如数据挖掘,算法类岗位,数据分析类从事者较少。另外可以看出数据分析师岗位对学历要求并不算高,最大需求量在本科。
df_clean.groupby(['city','workYear']).avgSalary.count().unstack()
可以看出对于应届生,如果没有工作经验而去从事数据分析的工作存在困难,此类岗位需求主要集中在1-3年与3-5年;其次,可以明显看出数据分析师在工作经验10年以上需求明显下降,这也就预示着如果只是从事单一工作,可能会面临危机。
df_clean.groupby(['city','companySize']).avgSalary.count().unstack()
可以看出公司规模较大的企业往往对于数据分析岗位需求更大,这对于求职者或许是一个很好的出路
c.不同公司招聘的数据分析师数量和平均工资
df_clean.groupby(['companyShortName']).avgSalary.agg(['count','mean']).sort_values(by='count',ascending=False)
#使用agg函数,同时传入count和mean方法,然后返回了不同公司的计数和平均值两个结果
从这里,我们可以分析出全国范围内不同的公司需求个数以及薪资平均值,但如果加入城市维度再细分或许会更清楚一些,这就需要自定义函数。
def topN(df,n=5):
counts=df.value_counts()
return counts.sort_values(ascending=False)[:n]
df_clean.groupby('city').companyShortName.apply(topN)
可以看出每个城市需求量前五的多为互联网和一些金融公司。
d.不同城市需求数topN职位
df_clean.groupby('city').positionName.apply(topN)
4)positionLables处理
其实到这里我们对数据分析岗位的分析已经差不多了,但还剩最后一个“职位标签”分析,最后就一并处理分析了。
word=df_clean.positionLables.str[1:-1].str.replace("'",'')
#str方法允许我们针对列中的元素,进行字符串相关的处理,这里的[1:-1]是对字符串截取,这里把[]都截取掉了
word.head() #提取前五行数据
df_word=word.dropna().str.split(',').apply(pd.value_counts)
#这里是重点,通过apply和value_counts函数统计标签数。因为各行元素已经转换成了列表,所以value_counts会逐行计算列表中的标签
df_word
df_word.unstack().dropna().reset_index().groupby('level_0').count()
#此时level_0为标签名,level_1为df_index的索引,也可以认为它对应着一个职位.最后用groupby计算出标签出现的次数
#positionLables本身有空值,所以要删除,不然容易报错。再次用str.split方法,把元素中的标签按「,」拆分成列表
四.报告总结
1.从薪资来看,北京的薪资状况遥遥领先,其次上海,深圳,广州发展良好。
2.从需求来看,北上广深以及一些新一线城市需求大,且公司规模越大,机会越大。
3.从要求来看,数据分析这一岗位相对学历,明显更加看重工作经验。
4.从发展前景来看,10年以内,数据分析岗位还是很有发展前景的,尤其随着工作经验的增长,但随着年限的加长,不寻找新的转型或许面临危机。
备注:本文思路可参考秦路的数据分析系列。本人为数据分析小白,如果文中有误,欢迎大家随时交流。