拉勾网数据分析师职位分析
项目背景:
\'positionName\':职位名称
\'salary\':工资水平
\'address\':地区
\'workYear\':工作年限
\'education\':学历要求
\'companyName\':公司名称
\'industryField\':行业领域
\'financeStage\':融资情况
\'companySize\':公司规模
明确分析目标
1 import pandas as pd
2 import numpy as np
3 import re
4 #导入数据
5 df=pd.DataFrame(pd.read_excel(r\'E:\siren\找工作互联网招聘求职网拉勾网1.xlsx\'))
1 #查看数据
2 df.head()
3 #查看数据各字段的名称
4 df.columns
5 #查看数据维度
6 df.shape
df[\'industryField\']
可以看到行业名称之间有顿号分割,有的是逗号分隔,所以先将所有的分隔符统一为逗号,然后对数据进行分列,并将分列后的数据重新拼接回原数据表中:
1 1 industry=[]
2 2 #将顿号分隔符替换为逗号
3 3 for x in df[\'industryField\']:
4 4 a=x.replace("、",",")
5 5 industry.append(a)
6 6 #将替换后的行业数据设置为DataFrame格式
7 7 industry=pd.DataFrame(industry,columns=[\'industry\'])
8 8 #对行业数据进行分列
9 9 industry_s=pd.DataFrame((x.split(\',\') for x in industry[\'industry\']),columns=[\'industry_1\',\'industry_2\'])
10 10 df=pd.merge(df,industry_s,right_index=True,left_index=True)
11 11 df[\'industry_1\']=df[\'industry_1\'].map(str.strip)
12 12
13 13 #将industry_1数据保留并赋值给industryField字段
14 14 df[\'industryField\']=df[\'industry_1\']
15 15 df=df.drop([\'industry_1\',\'industry_2\'],axis=1)
1 #去除字段中\'k\'或\'K\'字符
2 salary=[]
3 for x in df[\'salary\']:
4 k=re.sub(\'[k|K]\',\'\',x)
5 salary.append(k)
6 #将salary数据转换为DataFrame格式
7 salary=pd.DataFrame(salary,columns=[\'salary\'])
8 salary_s=pd.DataFrame((x.split(\'-\') for x in salary[\'salary\']),columns=[\'bottomSalary\',\'topSalary\'])
9 #更改字段格式
10 salary_s[\'bottomSalary\']=salary_s[\'bottomSalary\'].astype(np.int)
11 salary_s[\'topSalary\']=salary_s[\'topSalary\'].astype(np.int)
12 #计算平均值
13 avg=[]
14 for i in range(len(salary_s)):
15 avg.append((salary_s[\'bottomSalary\'][i]+salary_s[\'topSalary\'][i])/2)
16 salary_s[\'avgSalary\']=avg
17 #将salary_s表与原表进行拼接
18 df=pd.merge(df,salary_s,right_index=True,left_index=True)
由图可以看出:在16个细分领域中数据分析职位需求最高的是移动互联网行业,其次是金融和电子商务行业。需求最少的是生活服务和文化娱乐行业。下面是具体的数据处理和可视化过程。
1 #首先对industryField字段进行汇总统计
2 df[\'industryField\'].value_counts()
3
4 #可以看到行业领域共分为16个细分行业,具体分析过程
5 industry_count=df[\'industryField\'].value_counts()
6 plt.rc(\'font\', family=\'STXihei\', size=10)
7 a=np.arange(16)
8 plt.figure(figsize=(8,6))
9 plt.barh(range(16),industry_count,color=\'skyblue\')
10 plt.xlabel(\'职位数量\')
11 plt.ylabel(\'职位名称\')
12 plt.title(\'不同行业领域数据分析职位数量\')
13 plt.legend([\'职位数量\'],loc=\'upper right\')
14 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=1,axis=\'x\',alpha=0.4)
15 plt.yticks(range(16),(\'移动互联网\',\'金融\',\'电子商务\',\'数据服务\',\'企业服务\',\'O2O\',\'教育\',\'医疗健康\',\'游戏\',\'其他\',\'信息安全\',\'旅游\',\'社交网络\',\'硬件\',\'文化娱乐\',\'生活服务\'))
不同城市数据分析职位需求情况
从城市维度来看,北京数据分析职位的需求量为最多,其次其次是上海,杭州,深圳的数量不如杭州多。在TOP10城市中,对数据分析人才需求最大少的是郑州、合肥,职位数量仅仅4个。所以想要从事数据分析一职,基本上要选择留在北上广深,或者杭州,才能拥有更好的发展。下面是具体的数据处理过程。
1 city_count=df[\'city\'].value_counts()
2 plt.rc(\'font\', family=\'STXihei\', size=10)
3 a=np.arange(10)
4 plt.figure(figsize=(8,6))
5 plt.bar(range(10),city_count[:10],color=\'skyblue\')
6 plt.xlabel(\'城市\')
7 plt.ylabel(\'职位数量\')
8 plt.title(\'不同城市数据分析职位数量\')
9 plt.legend([\'职位数量\'],loc=\'upper right\')
10 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=1,axis=\'y\',alpha=0.4)
11 plt.xticks(a,(\'北京\',\'上海\',\'杭州\',\'深圳\',\'广州\',\'武汉\',\'长沙\',\'南京\',\'郑州\',\'合肥\'))
1 df[\'companySize\']=df[\'companySize\'].map(str.strip)
2 company_count=df[\'companySize\'].value_counts()
3 plt.rc(\'font\', family=\'STXihei\', size=10)
4 a=np.arange(6)
5 plt.figure(figsize=(6,4))
6 plt.barh(range(6),company_count,color=\'skyblue\')
7 plt.xlabel(\'职位数量\')
8 plt.ylabel(\'规模\')
9 plt.title(\'不同规模公司数据分析职位数量\')
10 plt.legend([\'职位数量\'],loc=\'upper right\')
11 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=1,axis=\'x\',alpha=0.4)
12 plt.yticks(a,company_count.index)
不同融资阶段数据分析职位需求分布
天使轮需求最少,上市公司和不需要融资的公司需求量最多。结合前面公司规模的分析,可以理解,天使轮人少钱也少,数据分析人才需求不大,但是上市公司规模较大,数据分析需求也就大。从A轮到D轮,数据分析需求较天使轮,数据分析需求有明显增长。
1 finance_count=df[\'financeStage\'].value_counts()
2
3 plt.rc(\'font\', family=\'STXihei\', size=10)
4 a=np.arange(8)
5 plt.figure(figsize=(6,4))
6 plt.barh(range(8),finance_count,color=\'skyblue\')
7 plt.xlabel(\'职位数量\')
8 plt.ylabel(\'融资阶段\')
9 plt.title(\'不同融资公司数据分析职位数量\')
10 plt.legend([\'职位数量\'],loc=\'upper right\')
11 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=1,axis=\'x\',alpha=0.4)
12 plt.yticks(a,finance_count.index)
从工作年限来看,大部分公司的需求都在1-3年和3-5年这两个阶段。这两个阶段的人较工作5-10年的人年轻,精力旺盛,对工资要求不是特别高,学习能力也较强。
1 df[\'workYear\']=df[\'workYear\'].map(str.strip)
2 #将经验不限、经验一年以下、经验应届毕业生合并
3 for i in range(len(df[\'workYear\'])):
4 if df[\'workYear\'][i] in [\'经验应届毕业生\',\'经验不限\']:
5 df[\'workYear\'][i]=\'经验1年以下\'
6 work_count=df[\'workYear\'].value_counts()
7
8 plt.rc(\'font\', family=\'STXihei\', size=10)
9 a=np.arange(4)
10 plt.figure(figsize=(6,4))
11 plt.barh(range(4),work_count,color=\'skyblue\')
12 plt.xlabel(\'职位数量\')
13 plt.ylabel(\'工作经验\')
14 plt.title(\'数据分析职位对工作经验的要求\')
15 plt.legend([\'职位数量\'],loc=\'upper right\')
16 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=1,axis=\'x\',alpha=0.4)
17 plt.yticks(a,work_count.index)
数据分析对学历的要求
从学历维度看,本科学历的数据分析人才需求量最高,占比85.3%,也就是说大多数数据分析职位对学历要求不是很高,仅仅3.7%的公司要求学历在硕士以上。
1 education_count=df[\'education\'].value_counts()
2
3 plt.rc(\'font\', family=\'STXihei\', size=10)
4 labels=\'本科及以上\',\'大专及以上\',\'学历不限\',\'硕士及以上\'
5 colors=[ \'lightskyblue\', \'gold\',\'yellowgreen\', \'lightcoral\']
6 explode=(0.1,0.1,0.1,0.1)
7 plt.axis(\'equal\')
8 plt.title(\'数据分析对学历的要求\')
9 plt.pie(education_count,explode=explode,labels=labels,colors=colors,autopct=\'%1.1f%%\',shadow=True,startangle=60,radius=1.2)
1 plt.rc(\'font\', family=\'STXihei\', size=10)
2 plt.figure(figsize=(8,6))
3 plt.hist(df[\'avgSalary\'],bins=30,color=\'skyblue\')
4 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=0.8,axis=\'y\',alpha=0.4)
5 plt.axis(\'tight\')
6 plt.title(\'薪酬分布\')
7 plt.xlabel(\'每月薪酬(单位:K/月)\')
8 plt.legend(loc=0)
行业对平均薪资的影响
从行业平均工资来看,社交网络、信息安全、企业服务领域工资最高,旅游、医疗健康、生活服务行业工资最低。
1 industry_avg=df.groupby(by=[\'industryField\'])[\'avgSalary\'].mean().sort_values()
2
3 plt.rc(\'font\', family=\'STXihei\', size=10)
4 a=np.arange(16)
5 plt.figure(figsize=(8,6))
6 plt.barh(range(16),industry_avg,color=\'skyblue\')
7 plt.xlabel(\'行业平均工资\')
8 plt.ylabel(\'行业\')
9 plt.title(\'不同行业领域数据分析职位平均工资\')
10 plt.legend([\'平均工资\'],loc=\'upper right\')
11 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=0.8,axis=\'x\',alpha=0.4)
12 plt.yticks(a,industry_avg.index)
在提取筛选数据时,发现因为city字段数据中有空格的存在,总是匹配不到数据,因此先对city字段进行处理,清除数据中的空格符
1 #取岗位需求前10名的城市
2 df.groupby([\'city\'])[\'avgSalary\'].count().sort_values()
3
4 #先利用语句判断出字段数据中是否有空格符的存在
5 df[\'city\'].values #发现数据中存在空格符
6 #进行处理空格符
7 df[\'city\']=df[\'city\'].map(str.strip)
8
9 #提取数据
10 city1=df.loc[df[\'city\']==\'北京\',[\'city\',\'avgSalary\']]
11 city2=df.loc[df[\'city\']==\'上海\',[\'city\',\'avgSalary\']]
12 city3=df.loc[df[\'city\']==\'成都\',[\'city\',\'avgSalary\']]
13 city4=df.loc[df[\'city\']==\'杭州\',[\'city\',\'avgSalary\']]
14 city5=df.loc[df[\'city\']==\'深圳\',[\'city\',\'avgSalary\']]
15 city6=df.loc[df[\'city\']==\'广州\',[\'city\',\'avgSalary\']]
16 city7=df.loc[df[\'city\']==\'武汉\',[\'city\',\'avgSalary\']]
17 city8=df.loc[df[\'city\']==\'长沙\',[\'city\',\'avgSalary\']]
18 city9=df.loc[df[\'city\']==\'南京\',[\'city\',\'avgSalary\']]
19 city10=df.loc[df[\'city\']==\'郑州\',[\'city\',\'avgSalary\']]
20
21 #绘图
22 plt.rc(\'font\', family=\'STXihei\', size=10)
23 plt.xlabel(\'城市\')
24 plt.ylabel(\'薪资\')
25 plt.title(\'城市与平均薪资\')
26 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=0.8,axis=\'x\',alpha=0.4)
27
28 plt.boxplot((city1[\'avgSalary\'],city2[\'avgSalary\'],city3[\'avgSalary\'],city4[\'avgSalary\'],city5[\'avgSalary\'],city6[\'avgSalary\'],city7[\'avgSalary\'],city8[\'avgSalary\'],city9[\'avgSalary\'],city10[\'avgSalary\']),labels=(\'北京\',\'上海\',\'成都\',\'杭州\',\'深圳\',\'广州\',\'武汉\',\'长沙\',\'南京\',\'郑州\'))
1 df[\'companySize\']=df[\'companySize\'].map(str.strip)
2 df.groupby([\'companySize\']).count()
3
4 size1=df.loc[df[\'companySize\']==\'少于15人\',[\'companySize\',\'avgSalary\']]
5 size2=df.loc[df[\'companySize\']==\'15-50人\',[\'companySize\',\'avgSalary\']]
6 size3=df.loc[df[\'companySize\']==\'50-150人\',[\'companySize\',\'avgSalary\']]
7 size4=df.loc[df[\'companySize\']==\'150-500人\',[\'companySize\',\'avgSalary\']]
8 size5=df.loc[df[\'companySize\']==\'500-2000人\',[\'companySize\',\'avgSalary\']]
9 size6=df.loc[df[\'companySize\']==\'2000人以上\',[\'companySize\',\'avgSalary\']]
10
11 plt.rc(\'font\', family=\'STXihei\', size=10)
12 plt.figure(figsize=(6,4))
13 plt.xlabel(\'规模\')
14 plt.ylabel(\'薪资\')
15 plt.title(\'公司规模与平均薪资\')
16 plt.boxplot((size1[\'avgSalary\'],size2[\'avgSalary\'],size3[\'avgSalary\'],size4[\'avgSalary\'],size5[\'avgSalary\'],size6[\'avgSalary\']),labels=(\'少于15人\',\'15-50人\',\'50-150人\',\'150-500人\',\'500-2000人\',\'2000人以上\'))
17 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=0.8,axis=\'y\',alpha=0.4)
1 df[\'financeStage\']=df[\'financeStage\'].map(str.strip)
2
3 finance1=df.loc[df[\'financeStage\']==\'未融资\',[\'financeStage\',\'avgSalary\']]
4 finance2=df.loc[df[\'financeStage\']==\'天使轮\',[\'financeStage\',\'avgSalary\']]
5 finance3=df.loc[df[\'financeStage\']==\'A轮\',[\'financeStage\',\'avgSalary\']]
6 finance4=df.loc[df[\'financeStage\']==\'B轮\',[\'financeStage\',\'avgSalary\']]
7 finance5=df.loc[df[\'financeStage\']==\'C轮\',[\'financeStage\',\'avgSalary\']]
8 finance6=df.loc[df[\'financeStage\']==\'D轮及以上\',[\'financeStage\',\'avgSalary\']]
9 finance7=df.loc[df[\'financeStage\']==\'不需要融资\',[\'financeStage\',\'avgSalary\']]
10 finance8=df.loc[df[\'financeStage\']==\'上市公司\',[\'financeStage\',\'avgSalary\']]
11
12 plt.rc(\'font\', family=\'STXihei\', size=12)
13 plt.figure(figsize=(8,5))
14 plt.xlabel(\'融资\')
15 plt.ylabel(\'薪资\')
16 plt.title(\'融资阶段与平均薪资\')
17 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=0.8,axis=\'y\',alpha=0.4)
18 plt.boxplot((finance1[\'avgSalary\'],finance2[\'avgSalary\'],finance3[\'avgSalary\'],finance4[\'avgSalary\'],finance5[\'avgSalary\'],finance6[\'avgSalary\'],finance7[\'avgSalary\'],finance8[\'avgSalary\']),labels=(\'未融资\',\'天使轮\',\'A轮\',\'B轮\',\'C轮\',\'D轮及以上\',\'不需要融资\',\'上市公司\'))
1 df[\'workYear\']=df[\'workYear\'].map(str.strip)
2
3 for i in range(len(df[\'workYear\'])):
4 if df[\'workYear\'][i] in [\'经验应届毕业生\',\'经验不限\']:
5 df[\'workYear\'][i]=\'经验1年以下\'
6 df[\'workYear\']=df[\'workYear\']
7 df[\'workYear\']
8
9 year1=df.loc[df[\'workYear\']==\'经验1年以下\',[\'workYear\',\'avgSalary\']]
10 year2=df.loc[df[\'workYear\']==\'经验1-3年\',[\'workYear\',\'avgSalary\']]
11 year3=df.loc[df[\'workYear\']==\'经验3-5年\',[\'workYear\',\'avgSalary\']]
12 year4=df.loc[df[\'workYear\']==\'经验5-10年\',[\'workYear\',\'avgSalary\']]
13
14 plt.rc(\'font\', family=\'STXihei\', size=10)
15 plt.figure(figsize=(4,4))
16 plt.xlabel(\'工作年限\')
17 plt.ylabel(\'薪资\')
18 plt.title(\'工作年限与平均薪资\')
19 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=0.8,axis=\'y\',alpha=0.4)
20 plt.boxplot((year1[\'avgSalary\'],year2[\'avgSalary\'],year3[\'avgSalary\'],year4[\'avgSalary\']),labels=(\'经验1年以下\',\'经验1-3年\',\'经验3-5年\',\'经验5-10年\'))
1 df[\'education\']=df[\'education\'].map(str.strip)
2
3 edu1=df.loc[df[\'education\']==\'大专及以上\',[\'education\',\'avgSalary\']]
4 edu2=df.loc[df[\'education\']==\'学历不限\',[\'education\',\'avgSalary\']]
5 edu3=df.loc[df[\'education\']==\'本科及以上\',[\'education\',\'avgSalary\']]
6 edu4=df.loc[df[\'education\']==\'硕士及以上\',[\'education\',\'avgSalary\']]
7
8 plt.rc(\'font\', family=\'STXihei\', size=10)
9 plt.figure(figsize=(6,6))
10 plt.xlabel(\'学历\')
11 plt.ylabel(\'薪资\')
12 plt.title(\'学历与平均薪资\')
13 plt.grid(color=\'#95a5a6\',linestyle=\'--\',linewidth=0.8,axis=\'y\',alpha=0.4)
14 plt.boxplot((edu1[\'avgSalary\'],edu2[\'avgSalary\'],edu3[\'avgSalary\'],edu4[\'avgSalary\']),labels=(\'大专及以上\',\'学历不限\',\'本科及以上\',\'硕士及以上\'))