项目背景:
'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)
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802122904596-987512075.png)
由图可以看出:在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,('北京','上海','杭州','深圳','广州','武汉','长沙','南京','郑州','合肥'))
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802123332103-1085967221.png)
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)
不同融资阶段数据分析职位需求分布
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802123451987-116226977.png)
天使轮需求最少,上市公司和不需要融资的公司需求量最多。结合前面公司规模的分析,可以理解,天使轮人少钱也少,数据分析人才需求不大,但是上市公司规模较大,数据分析需求也就大。从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)
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802123959432-1038888989.png)
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)
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802173914381-1477888787.png)
在提取筛选数据时,发现因为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=('北京','上海','成都','杭州','深圳','广州','武汉','长沙','南京','郑州'))
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802174020332-1522286897.png)
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)
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802174152785-242937672.png)
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轮及以上','不需要融资','上市公司'))
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802174255975-1054756913.png)
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年'))
![](https://images2018.cnblogs.com/blog/1425945/201808/1425945-20180802174402225-1161600141.png)
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=('大专及以上','学历不限','本科及以上','硕士及以上'))