Python分析数据分析师行情

确定目标

我们在之前的博客中已经获取了拉勾网上数据分析师的岗位信息,现在我们需要确定我们分析的目标,从而进行数据清洗。

  1. 各城市对数据分析岗位的需求情况
  2. 不同细分领域对数据分析岗的需求情况
  3. 数据分析岗位的薪资状况
  4. 工作经验与薪水的关系
  5. 公司都要求什么,需要掌握什么技能
  6. 岗位的学历要求高吗
  7. 不同规模的企业对工资经验的要求以及提供的薪资水平

数据清洗

读取数据

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,如下图所示:
在这里插入图片描述
处理过程大致如下:

  1. 将字母全部改为小写。
  2. 用正则表达式提取数字。
  3. 将提取出来的数字转换为整形(非常重要!!!)
  4. 用首末端的平均值替代工资的区间。
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("")

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值