数据分析师岗位分析
确定目标
我们在之前的博客中已经获取了拉勾网上数据分析师的岗位信息,现在我们需要确定我们分析的目标,从而进行数据清洗。
- 各城市对数据分析岗位的需求情况
- 不同细分领域对数据分析岗的需求情况
- 数据分析岗位的薪资状况
- 工作经验与薪水的关系
- 公司都要求什么,需要掌握什么技能
- 岗位的学历要求高吗
- 不同规模的企业对工资经验的要求以及提供的薪资水平
数据清洗
读取数据
import pandas as pd
path = './lagou.csv'
df = pd.read_csv(path)
清洗数据
缩小列读取范围
columns = ["positionName", "companyShortName", "city", "companySize", "education", "financeStage",
"industryField", "salary", "workYear", "hitags", "companyLabelList", "job_detail"] ##只需要这么多列数据即可
df = df[columns].drop_duplicates() #去重
职位筛选
我们研究的仅仅是数据分析这一岗位,所以我们去除数据分析之外的以及实习的工作,因为这不是我们研究的重点,代码如下:
cond_1 = df["positionName"].str.contains("数据分析") # 职位名中含有数据分析字眼的
cond_2 = ~df["positionName"].str.contains("实习") # 剔除掉带实习字眼的
len(df[cond_1 & cond_2]["positionName"]) ###限制搜索条件
这里看到我们把关于数据分析的内容全部提取出来了。
工资清洗
我们将工资进行输出,发现全部都是区间形式,单位都是k或者K,如下图所示:
处理过程大致如下:
- 将字母全部改为小写。
- 用正则表达式提取数字。
- 将提取出来的数字转换为整形(非常重要!!!)
- 用首末端的平均值替代工资的区间。
df["salary"] = df["salary"].str.lower()\ ## 将字母全部改为小写
.str.extract(r'(\d+)[k]-(\d+)k')\ ##正则表达式提取数字
.applymap(lambda x:int(x))\ ##applymap(func)将函数func做用于DataFrame中的所有元素(elements),并将提取出来的数字转换为整形
.mean(axis=1)
得到的工资平均值如下所示:
技能要求
因为我们要统计技能的个数占职位个数的频率,所以我们这里以Python/R、SQL、Tableau、Excel为准
如果job_detail中含有上述四类,则赋值为1,不含有则为0。
代码如下所示:
df["job_detail"] = df["job_detail"].str.lower().fillna("") #将字符串小写化,并将缺失值赋值为空字符串
df["Python/R"] = df["job_detail"].map(lambda x:1 if ('python' in x) or ('r' in x) else 0)
df["SQL"] = df["job_detail"].map(lambda x:1 if ('sql' in x) or ('hive' in x) else 0)
df["Tableau"] = df["job_detail"].map(lambda x:1 if 'tableau' in x else 0)
df["Excel"] = df["job_detail"].map(lambda x:1 if 'excel' in x else 0)
结果是增加了四列,每一列的结果是频率的大小,如下所示:
行业信息统计
目标:只出现一个行业,如果有多个行业,以第二个行业为准:
def clean_industry(industry):
industry = industry.split(",")
if industry[0]=="移动互联网" and len(industry)>1: #如果有关键字,重点选取第二个关键词
return industry[1]
else:
return industry[0]
df["industryField"] = df.industryField.map(clean_industry)
数据可视化
各城市数据分析岗位需求量
fig, ax = plt.subplots(figsize=(12,8))
sns.countplot(y="city",order= df["city"].value_counts().index,data=df,color='#3c7f99')### 统计每个城市数据分析师岗位的数目
plt.box(False)
fig.text(x=0.04, y=0.90, s=' 各城市数据分析岗位的需求量 ',
fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
plt.tick_params(axis='both', which='major', labelsize=16) ##which中的both表示主刻度线
ax.xaxis.grid(which='both', linewidth=0.5, color='#3c7f99')
plt.xlabel('')
plt.ylabel('')
得到的需求量统计如下图所示:
不同领域对数据分析岗位的需求量
这里面和地域不同的是,我们取前十个领域的需求量来进行可视化呈现,代码如下所示:
industry_index = df["industryField"].value_counts()[:10].index ##统计个数,并返回表格索引
industry =df.loc[df["industryField"].isin(industry_index),"industryField"] ##根据表格索引,获取某一行和列
fig, ax = plt.subplots(figsize=(12,8))
sns.countplot(y=industry.values,order = industry_index,color='#3c7f99')
plt.box(False)
fig.text(x=0, y=0.90, s=' 细分领域数据分析岗位的需求量(取前十) ',
fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
plt.tick_params(axis='both', which='major', labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.5, color='#3c7f99')
plt.xlabel('')
plt.ylabel('')
结果如下图所示:
各城市相应岗位的薪资情况
fig,ax = plt.subplots(figsize=(12,8))
city_order = df.groupby("city")["salary"].mean()\
.sort_values()\
.index.tolist()
sns.barplot(x="city", y="salary", order=city_order, data=df, ci=95,palette="RdBu_r")
fig.text(x=0.04, y=0.90, s=' 各城市的薪资水平对比 ',
fontsize=32, weight='bold', color='white', backgroundcolor='#3c7f99')
plt.tick_params(axis="both",labelsize=16,)
ax.yaxis.grid(which='both', linewidth=0.5, color='black')
ax.set_yticklabels([" ","5k","10k","15k","20k"]) ##设定区间
plt.box(False)
plt.xlabel('')
plt.ylabel('')
一线城市薪资分布对比
fig,ax = plt.subplots(figsize=(12,8))
fig.text(x=0.04, y=0.90, s=' 一线城市的薪资分布对比 ',
fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
sns.kdeplot(df[df["city"]=='北京']["salary"],shade=True,label="北京")
sns.kdeplot(df[df["city"]=='上海']["salary"],shade=True,label="上海")
sns.kdeplot(df[df["city"]=='广州']["salary"],shade=True,label="广州")
sns.kdeplot(df[df["city"]=='深圳']["salary"],shade=True,label="深圳")
plt.tick_params(axis='both', which='major', labelsize=16)
plt.box(False)
plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])
plt.yticks([])
plt.legend(fontsize = 'xx-large',fancybox=None)
工作经验与薪水关系
corr = df.pivot_table(index="city",columns="workYear",values="salary")
corr = corr[["应届毕业生","1-3年","3-5年","5-10年"]]
corr.loc[city_order]
fig,ax = plt.subplots(figsize=(10,8))
sns.heatmap(corr.loc[df["city"].value_counts().index],cmap="RdBu_r",center=20,annot=True,annot_kws={'fontsize':14})
plt.tick_params(axis='x', which='major', labelsize=16)
plt.tick_params(axis='y', which='major', labelsize=16,labelrotation=0)
plt.xlabel(""),plt.ylabel("")