- 分析⽬标
各城市对数据分析岗位的需求情况
不同细分领域对数据分析岗的需求情况
数据分析岗位的薪资状况
⼯作经验与薪⽔的关系
公司都要求什么掌握什么技能
岗位的学历要求⾼吗
不同规模的企业对⼯资经验的要求以及提供的薪资⽔平 - 数据加载
import numpy as np
import pandas as pd
job = pd.read_csv('D:\WORK\STUDY\数据分析\课程资料\阶段五\Pandas数据分析库/lagou2020.csv')
job.drop_duplicates(inplace = True)
job.reset_index(inplace=True)# 重置行索引
- 数据清洗
3.1 过滤非数据分析
cond = job['positionName'].str.contains('数据分析') #
job = job[cond]
job.shape
job.reset_index(inplace=True)
3.2 薪⽔是⼀个区间,这⾥⽤薪⽔区间的均值作为相应职位的薪⽔
#1、将salary中的字符串均⼩写化(因为存在8k-16k和8K-16K)
#2、运⽤正则表达式提取出薪资区间
#3、将提取出来的数字转化为int型
#4、取区间的平均值
job["salary"] = job["salary"].str.lower()\
.str.extract(r'(\d+)[k]-(\d+)k')\
.applymap(lambda x:int(x))\
.mean(axis=1)
3.3 从job_detail中提取出技能要求
将技能分为以下⼏类 Python、 SQL、 Tableau、 Excel、 SPSS/SAS
处理⽅式: 如果job_detail中含有上述五类,则赋值为1,不含有则为0
job['Python'] = job['job_detail'].map(lambda x : 1 if 'python' in x else 0)
job['SQL'] = job['job_detail'].map(lambda x : 1 if 'sql' in x else 0)
job['Tableau'] = job['job_detail'].map(lambda x : 1 if 'tableau' in x else 0)
job['Excel'] = job['job_detail'].map(lambda x : 1 if 'excel' in x else 0)
job['SPSS/SAS'] = job['job_detail'].map(lambda x : 1 if ('spss' in x) or ('sas' in x) else 0)
3.4 处理⾏业信息
def convert(x):
field = x.split(",")
if (field[0]=="移动互联⽹") and (len(industry)>1):
return field[1]
else:
return field[0]
job["industryField"] = job.industryField.map(convert)
- 各城市对数据分析岗位的需求量
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family']='KaiTi'
plt.rcParams['font.size']=18
data = job.city.value_counts()
plt.figure(figsize=(12,9))
plt.barh(y = data.index[::-1],width=data[::-1],color='#3c7f99')
plt.box(False)
plt.grid(axis='x',color='#3c7f99')
plt.title(label=' 各城市数据分析师岗位的需求量 ',
fontsize=32,
backgroundcolor='#c5b783',
color='white',
weight='bold',
pad=30)
5. 不同领域对数据分析岗的需求量
data = job.industryField.value_counts()[:10]
plt.figure(figsize=(12,9))
plt.barh(y=data.index[::-1],width=data[::-1],color='#3c7f99')
plt.grid(linestyle = '--',color = '#3c7f99',axis='x')
plt.title(label=' 各领域数据分析师需求量 ',
fontsize=32,
color='white',
backgroundcolor='#c5b783',
pad=30)
6. 各城市薪资状况
salary = job.groupby(by='city')['salary'].mean().sort_values()
plt.figure(figsize=(12,9))
plt.bar(x = salary.index,
height = salary,
color = plt.cm.RdBu_r(np.linspace(0,1,salary.size)))
plt.title(label = ' 各城市薪资状况 ',
fontsize = 32,
color = 'white',
backgroundcolor = '#c5b783',
weight = 'bold',
pad = 30)
plt.box(False)
plt.grid(axis='y',color='k')
plt.tick_params(labelsize=18,rotation = 60)
7. ⼯作经验与薪⽔关系
# 分组聚合
years_salary = job.groupby(by=['city','workYear'])['salary']\
.mean().round(1).unstack().sort_values(by='5-10年',ascending=False)
#透视表
#years_salary = job.pivot_table(values='salary',
#index='city',columns='workYear').\
#round(1).sort_values(by='5-10年',ascending=False)
years_salary = years_salary[['应届毕业生','1-3年','3-5年','5-10年']].iloc[1:]
#复制数据,使图形丰满
nd = years_salary.values
data = np.repeat(nd,4,axis=1)
plt.figure(figsize=(12,9))
plt.imshow(data,cmap = plt.cm.RdBu_r)
plt.xticks([1.5,5.5,9.5,13.5],years_salary.columns)
plt.yticks(np.arange(12),years_salary.index)
h,w = data.shape
for x in range(w):
for y in range(h):
if (x%4 == 0) and (~np.isnan(data[y,x])):
plt.text(x+1.5,y,data[y,x],ha='center',va='center')
_= plt.title(label=' 工作经验与薪资的关系 ',fontsize = 32,pad=30)
8. 学历要求
edu = job['education'].value_counts()
plt.figure(figsize=(9,9))
_= plt.pie(edu,autopct='%0.2f%%',labels=edu.index,
wedgeprops={'width':0.5},pctdistance=0.75)
_=plt.title(label=' 学历要求 ',fontsize=32,pad=30)
9. 技能要求
cond1 = job['Python'].astype('boolean')
cond2 = job['SQL'].astype('boolean')
cond3 = job['Excel'].astype('boolean')
cond4 = job['SPSS/SAS'].astype('boolean')
d1 = job[cond1]['salary']
d2 = job[cond2]['salary']
d3 = job[cond3]['salary']
d4 = job[cond4]['salary']
plt.figure(figsize=(12,9))
_=plt.boxplot([d1,d2,d3,d4],vert=False,labels=['Python','SQL','Excel','SPSS/SAS'])
plt.grid(axis='x',color='k',alpha=0.3)
_=plt.xticks(np.arange(0,101,step=20),
[str(i) + 'K' for i in np.arange(0,101,step=20)])
10. 大公司对技能的要求
cond = job.companySize == '2000人以上'
bc = job[cond]
data = bc[['Python','SQL','Tableau','Excel','SPSS/SAS']].sum()
plt.figure(figsize=(12,9))
plt.bar(x = np.arange(5),
height=data,
tick_label = ['Python','SQL','Tableau','Excel','SPSS/SAS'],
color = ['#ff0000', '#ffa500', '#c5b783', '#3c7f99', '#0000cd'])
plt.title(label=' 大公司对技能要求 ',fontsize=32,pad=30)
plt.grid(axis='y')
11. 不同规模的公司在招人要求上的差异
workYear_map = {
"5-10年": 5,
"3-5年": 4,
"1-3年": 3,
"1年以下": 2,
"应届毕业⽣": 1}
color_map = {
5:"#ff0000",
4:"#ffa500",
3:"#c5b783",
2:"#3c7f99",
1:"#0000cd"}
cond = job.workYear.isin(workYear_map)
job2 = job[cond]
job2['workYearNum'] = job2['workYear'].map(workYear_map)
job2['companySize'] = job2['companySize'].astype('category')
from matplotlib import gridspec
plt.figure(figsize=(12,9))
#排序
list_num = ['2000人以上','500-2000人','150-500人',
'50-150人','15-50人','少于15人']
job2.companySize.cat.reorder_categories(list_num,inplace=True)
job2.sort_values(by='companySize',ascending=False,inplace=True)
gs = gridspec.GridSpec(10,1)
plt.subplot(gs[:8])
#点中点
plt.scatter(x = job2.salary,
y = job2.companySize,
c = job2.workYearNum.map(color_map),
s = job2.workYearNum*100,
alpha = 0.35)
plt.scatter(x = job2.salary,
y = job2.companySize,
c = job2.workYearNum.map(color_map))
plt.xticks(np.arange(0,161,step = 20),[str(i) + 'K' for i in np.arange(0,161,20)])
plt.grid(axis='x')
plt.box(False)
plt.title(label=' 不同规模公司招聘要求',fontsize=32,pad=30)
plt.subplot(gs[-1])
x = np.arange(1,6)[::-1]
y = np.zeros(5)
plt.scatter(x,y,c = color_map.values(),
s = x*100,alpha=0.35)
plt.scatter(x,y,c = color_map.values())
plt.yticks([0],['经验'])
plt.rcParams['font.family'] = 'KaiTi'
_=plt.xticks(x,workYear_map.keys())
plt.box(False)