ITPub博客

首页 > 大数据 > 数据挖掘 > 【爬遍拉钩,带你看看数据分析师的真实现状】

【爬遍拉钩,带你看看数据分析师的真实现状】

原创 数据挖掘 作者:helaoshi 时间:2020-06-26 16:00:18 0 删除 编辑

导包和数据

In [656]:
import pandas as pdimport numpy as npimport seaborn as snsfrom pyecharts.charts import Piefrom pyecharts import options as optsimport matplotlib.pyplot as plt%matplotlib inlinesns.set_style('white',{'font.sans-serif':['simhei','Arial']})pd.set_option("display.max_column", None)pd.set_option("display.max_row",None)
In [222]:
path = "./data/lagou_11.csv"df = pd.read_csv(path)
In [220]:
df.columns
Out[220]:
Index(['Unnamed: 0', '_id', 'adWord', 'appShow', 'approve', 'businessZones',
       'city', 'companyFullName', 'companyId', 'companyLabelList',
       'companyLogo', 'companyShortName', 'companySize', 'createTime',
       'deliver', 'district', 'education', 'explain', 'financeStage',
       'firstType', 'formatCreateTime', 'gradeDescription', 'hitags',
       'imState', 'industryField', 'industryLables', 'isHotHire',
       'isSchoolJob', 'jobNature', 'lastLogin', 'latitude', 'linestaion',
       'longitude', 'pcShow', 'plus', 'positionAdvantage', 'positionId',
       'positionLables', 'positionName', 'promotionScoreExplain',
       'publisherId', 'resumeProcessDay', 'resumeProcessRate', 'salary',
       'score', 'secondType', 'skillLables', 'stationname', 'subwayline',
       'thirdType', 'workYear', 'job_detail'],
      dtype='object')
In [224]:
# 取出我们进行后续分析所需的字段columns = ["positionName", "companyShortName", "city", "companySize", "education", "financeStage",
           "industryField", "salary", "workYear", "hitags", "companyLabelList", "job_detail"]df = df[columns].drop_duplicates() #去重

分析目标

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

数据清洗

去掉非数据分析岗的数据

In [226]:
# 原始数据长度len(df)
Out[226]:
2939
In [227]:
# 数据分析相应的岗位数量cond_1 = df["positionName"].str.contains("数据分析")  # 职位名中含有数据分析字眼的cond_2 = ~df["positionName"].str.contains("实习")  # 剔除掉带实习字眼的len(df[cond_1 & cond_2]["positionName"])
Out[227]:
1326
In [228]:
# 筛选出我们想要的字段,并剔除positionNamedf = df[cond_1 & cond_2]df.drop(["positionName"], axis=1, inplace=True)df.reset_index(drop=True, inplace=True)

将拉勾网的薪水转化为数值

拉勾网爬取下来的薪水是一个区间,这里用薪水区间的均值作为相应职位的薪水

In [229]:
# 处理过程#1、将salary中的字符串均小写化(因为存在8k-16k和8K-16K)#2、运用正则表达式提取出薪资区间#3、将提取出来的数字转化为int型#4、取区间的平均值df["salary"] = df["salary"].str.lower()\               .str.extract(r'(\d+)[k]-(\d+)k')\               .applymap(lambda x:int(x))\               .mean(axis=1)

从job_detail中提取出技能要求

将技能分为以下几类:

  • Python/R
  • SQL
  • Tableau
  • Excel

处理方式:
如果job_detail中含有上述四类,则赋值为1,不含有则为0

In [266]:
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)
In [79]:
df.head(1)
Out[79]:
companyShortName city companySize education financeStage industryField salary workYear hitags companyLabelList job_detail Python/R SQL Tableau Excel
0 达达-京东到家 北京 2000人以上 本科 D轮及以上 消费生活 22.5 3-5年 ['免费班车', '新婚红包', '定期调薪', '电脑补贴', '生子红包', '地铁周边... ['年底双薪', '绩效奖金', '岗位晋升', '定期体检'] 1 、负责o2o电商日常运营数据的统计, 监控, 梳理指标体系;||2、基于海量用户行为数据... 1 1 0 1

处理行业信息

In [318]:
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)

数据分析

各城市对数据分析岗位的需求量

In [231]:
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)ax.xaxis.grid(which='both', linewidth=0.5, color='#3c7f99')plt.xlabel('')plt.ylabel('')
Out[231]:
Text(0, 0.5, '')

从招聘信息的所在地来看,对数据分析师岗位需求量较大的是四个一线城市,其中北京和上海分别位列前两位。除了北上广深和杭州外,其他热门城市的需求并不大,所以,如果你想找数据分析相关的工作,最好还是去一线城市寻找相应的机会。

不同细分领域对数据分析岗的需求量

In [332]:
industry_index = df["industryField"].value_counts()[:10].indexindustry =df.loc[df["industryField"].isin(industry_index),"industryField"]
In [339]:
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('')
Out[339]:
Text(0, 0.5, '')

国内大数据行业发展得如火如荼,几乎在各行各业都能见到数据分析的身影,那哪些领域对数据分析岗位的需求较大呢?对岗位信息按照不同领域进行分类统计后发现,电商、金融和数据服务这三个领域的需求量位列前三位,电商和金融领域的需求远远超过其他领域。其他领域如消费生活、企业服务和文娱业也有不少的机会。

各城市相应岗位的薪资状况

In [233]:
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('')
Out[233]:
Text(0, 0.5, '')

不论是应届毕业生还是考虑转行的同学,在选择一个行业时,行业的钱途是一个很重要的参考因素。那么现在数据分析这个岗位的薪水是个什么水平呢?我们按不同的城市进行了统计。

图中柱状图上的黑条(暂且取这么个名字)统计学上叫做置信区间,代表着95%的职位所对应的薪水在黑条的区间范围内。我们可以发现在数据分析这个岗位上,北京、上海、杭州、深圳处于第一梯队,月均薪水都超过了20k,苏州、南京、广州以及武汉位列第二梯队,月均薪水在15k左右,其他城市则处于第三梯队。其中令我比较好奇的是广州的平均薪水,作为四大一线城市之一,虽然生活成本比其他一线城市略低,但均薪却被其他三个兄弟甩了一截。

带着好奇心,我绘制了四个一线城市的薪资分布图,看看四大一线城市数据分析岗位薪资的具体分布。

In [649]:
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)
Out[649]:
<matplotlib.legend.Legend at 0x2496aa18128>

从四大一线城市的薪资分布来看,深圳和上海的分布较为接近,广州大部分职位的薪水在10k左右,分布和其他三个城市差异较大。那会不会是因为广州的招聘信息中,工作经验要求低的岗位占比较高而拉低了整体的薪资水平呢(一般越资深的数据分析师工资会越高)?

工作经验与薪水的关系

In [234]:
corr = df.pivot_table(index="city",columns="workYear",values="salary")
In [235]:
corr = corr[["应届毕业生","1-3年","3-5年","5-10年"]]
In [236]:
corr.loc[city_order]
Out[236]:
workYear 应届毕业生 1-3年 3-5年 5-10年
city
西安 12.000000 6.250000 11.000000 NaN
天津 NaN 8.500000 9.000000 NaN
长沙 NaN 10.500000 11.000000 18.250000
成都 10.500000 9.500000 15.833333 18.333333
厦门 10.000000 11.375000 14.400000 NaN
武汉 9.000000 6.666667 17.300000 22.250000
广州 8.727273 10.915094 18.508621 24.800000
南京 12.500000 11.625000 21.000000 NaN
苏州 NaN 10.583333 20.750000 30.000000
深圳 10.333333 15.268116 23.400000 32.181818
杭州 12.500000 13.619048 20.612245 30.900000
上海 11.038462 16.268868 23.722628 30.097826
北京 10.190476 17.361111 24.008475 32.446809
In [687]:
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("")
Out[687]:
(Text(0.5, 47.75, ''), Text(65.546875, 0.5, ''))

由于工作经验小于1年和大于10年的样本太小,故没有绘入其中。

带着上面的疑惑,我绘制了热力图进行进一步的分析,图中的空白部分表示该部分是缺失值。由于北上广深杭的样本较为充足,这里主要针对这五个
城市的热力图部分进行分析。

从横向对比来看,可以明显的看出,随着资历的增加,数据分析师的薪水也会相应提高。对有3-5年经验的数据分析师,若符合企业的招聘条件,在北上广深杭基本平均而言都能拿到20k及以上的薪水。纵向对比来看,广州在各个经
验段上的薪资均不及其他三个一线城市,而且差距还不小。所以,广州给的钱确实少(但还应该结合生活成本进行综合考虑)。

技能要求

In [267]:
py_rate = df["Python/R"].value_counts(normalize=True).loc[1]sql_rate = df["SQL"].value_counts(normalize=True).loc[1]tableau_rate = df["Tableau"].value_counts(normalize=True).loc[1]excel_rate = df["Excel"].value_counts(normalize=True).loc[1]print("职位技能需求:")print("Python/R:",py_rate)print("SQL:",sql_rate)print("Excel:",excel_rate)print("Tableau:",tableau_rate)
职位技能需求:
Python/R: 0.6078431372549019
SQL: 0.6070889894419306
Excel: 0.3310708898944193
Tableau: 0.09502262443438914

玉玦图(线形).jpg

看了上面的15k和20k,甚至30k、40k,不知道你是否有心跳加速的感觉,不管有没有,咱还得回到现实,看看数据分析岗都有技能要求。如图中所示,
要求会Python/R的公司占到60.8%,和SQL的60.7%相接近。有33.1%的公司要求会Excel,要求会Tableau的公司仅占9.5%。这说明,想成为一名合格的数据分析师,Python/R以及SQL得掌握好。

那是不是技能要求越高所对应的薪水就越高呢?为了得到相应的结论,我们把技能从低到高分为Excel、SQL、Python/R,并将公司要求的技能取技能最高的那个来表示(如同时要求Python/R、SQL、Excel,则取Python/R,若要求SQL、Excel,则取SQL),绘制了箱型图。

In [309]:
def get_level(x):
    if x["Python/R"] == 1:
        x["skill"] = "Python/R"
    elif x["SQL"] == 1:
        x["skill"] = "SQL"
    elif x["Excel"] == 1:
        x["skill"] = "Excel"
    else:
        x["skill"] = "其他"
    return x
In [271]:
df = df.apply(get_level,axis=1)
In [273]:
df.head(1)
Out[273]:
companyShortName city companySize education financeStage industryField salary workYear hitags companyLabelList job_detail Python/R SQL Tableau Excel skill
0 达达-京东到家 北京 2000人以上 本科 D轮及以上 消费生活 22.5 3-5年 ['免费班车', '新婚红包', '定期调薪', '电脑补贴', '生子红包', '地铁周边... ['年底双薪', '绩效奖金', '岗位晋升', '定期体检'] 1 、负责o2o电商日常运营数据的统计, 监控, 梳理指标体系;||2、基于海量用户行为数据... 1 1 0 1 Python/R
In [653]:
fig,ax = plt.subplots(figsize=(12,8))fig.text(x=0.02, y=0.90, s='             不同技能的薪资水平对比            ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')sns.boxplot(y="skill",x="salary",data=df.loc[df.skill!="其他"],palette="husl",order=["Python/R","SQL","Excel"])plt.tick_params(axis="both",labelsize=16)ax.xaxis.grid(which='both', linewidth=0.75)plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])plt.box(False)plt.xlabel('工资', fontsize=18)plt.ylabel('技能', fontsize=18)
Out[653]:
Text(0, 0.5, '技能')

从这个对比图来看,要求会Python/R和要求会SQL所对应的薪资中位数均为20k,会Python/R并没有比会SQL在薪资上更有优势,但仅要求会Excel的岗位对应的薪资则明显低于前两者。因此,从数据的角度来看,想往数据分析方向走的话,技能方面可以先把SQL掌握了(SQL入门简单但精通并不容易的)。

学历要求

In [341]:
education = df["education"].value_counts(normalize=True)
In [376]:
from pyecharts.commons.utils import JsCodedef new_label_opts():
        return opts.LabelOpts(formatter=JsCode("学历要求"))pie = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(education.index, np.round(education.values,4))],
        center=["50%", "50%"],
        radius=["50%","75%"],
        label_opts=new_label_opts()
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title=""),
        legend_opts=opts.LegendOpts(
                is_show=False
            )
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%")))
In [377]:
pie.render_notebook()
Out[377]:

其实可以看到,数据分析这个岗位对学历的要求并不是很高,绝大部分岗位的要求都是本科即可。

不同规模的公司在招人要求上的差异

In [490]:
company_size_map = {
    "2000人以上": 6,
    "500-2000人": 5,
    "150-500人": 4,
    "50-150人": 3,
    "15-50人": 2,
    "少于15人": 1}workYear_map = {
    "10年以上": 6,
    "5-10年": 5,
    "3-5年": 4,
    "1-3年": 3,
    "1年以下": 2,
    "应届毕业生": 1,}df["company_size"] = df["companySize"].map(company_size)df["work_year"] = df["workYear"].map(workYear_map)
In [492]:
df = df.sort_values(by="company_size",ascending=True)
In [493]:
df_plot = df.loc[~df.work_year.isna()]
In [494]:
color_map = {
    5:"#ff0000",
    4:"#ffa500",
    3:"#c5b783",
    2:"#3c7f99",
    1:"#0000cd"}df_plot.loc[:,"color"] = df_plot.work_year.map(color_map)
E:\software\Anaconda3\lib\site-packages\pandas\core\indexing.py:362: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: 
  self.obj[key] = _infer_fill_value(value)
E:\software\Anaconda3\lib\site-packages\pandas\core\indexing.py:543: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: 
  self.obj[item] = s
In [496]:
def seed_scale_plot():
    seeds=np.arange(5)+1
    y=np.zeros(len(seeds),dtype=int)
    s=seeds*100
    colors=['#ff0000', '#ffa500', '#c5b783', '#3c7f99', '#0000cd'][::-1]#     colors = sns.color_palette("husl", n_colors=6)  
    fig,ax=plt.subplots(figsize=(12,1))
    plt.scatter(seeds,y,s=s,c=colors,alpha=0.3)
    plt.scatter(seeds,y,c=colors)
    plt.box(False)
    plt.grid(False)
    plt.xticks(ticks=seeds,labels=list(workYear_map.keys())[::-1],fontsize=14)
    plt.yticks(np.arange(1),labels=['  经验:'],fontsize=16)
In [693]:
fig, ax = plt.subplots(figsize=(12, 8))fig.text(x=0.03, y=0.92, s='            不同规模公司的用人需求差异          ', fontsize=32, 
         weight='bold', color='white', backgroundcolor='#3c7f99')plt.scatter(df_plot.salary, df_plot["companySize"],  s=df_plot["work_year"]*100 ,alpha=0.35,c=df_plot["color"])plt.scatter(df_plot.salary, df_plot["companySize"], c=df_plot["color"], )plt.tick_params(axis='both', which='both', length=0)plt.tick_params(axis='both', which='major', labelsize=16)ax.xaxis.grid(which='both', linewidth=0.75)plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])plt.xlabel('工资', fontsize=18)plt.box(False)seed_scale_plot()

小公司好还是大公司好?大公司又有哪些要求?为了进一步分析,我们将公司规模、经验要求以及薪资信息绘制到散点图上,一探究竟。

对小公司(50人及以下)而言,大部分公司开出的薪资不会超过30k,规模更大的公司开的起更高的薪水,即便是对于一些工作经验不到1年的数据分析师,规模稍大的公司也能开出20k-30k的薪水,所以如果从面向工资编程的角度看,大公司具有较为明显的优势。另一方面,从图中可以看到,当薪水超过30k时,公司对数据分析师的经验要求大多都是3-5年以及5-10年,此时经验成为了较大的门槛。接下来看看大公司在技能方面的要求,这里定义2000人以上的公司为大公司。

In [657]:
df_skill = df.loc[(df["companySize"]=="2000人以上")&(df.skill!="其他")]["skill"].value_counts(normalize=True)
In [688]:
df_skill
Out[688]:
Python/R    0.760234
SQL         0.178363
Excel       0.061404
Name: skill, dtype: float64
In [679]:
fig, ax = plt.subplots(figsize=(12, 6))sns.barplot(x=df_skill.index,y=df_skill.values, color='#3c7f99')plt.box(False)fig.text(x=0.08, y=0.9, s='             大公司对技能的要求占比         ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')plt.tick_params(axis='both', which='major', labelsize=16)ax.yaxis.grid(which='both', linewidth=0.5, color='#3c7f99')

除去一些没有具体技能要求的岗位信息,对大公司(2000人以上)中有具体技能要求的职位而言,约76%的职位要求掌握Python/R,仅要求会SQL的职位占比不到20%,所以,如果想进大公司的话,还是得把Python/R学好

总结

最后,总结一下通过对拉勾网上的数据进行分析得到的一些结论:<br>
1、对数据分析师有较大需求的主要还是一线城市,且主要集中于电商、金融和数据服务领域。<br>
2、从薪水上看,北上深杭处于薪资第一梯队,广州作为一线城市在薪资上无优势。<br>
3、工作要求方面,学历上数据分析岗位对学历的要求并不高,超过八成岗位仅要求本科学历即可;技能上超过六成的公司要求会Python/R和SQL,
对大公司而言,大约76%的职位要求掌握Python/R


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69977871/viewspace-2700682/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-06-26

  • 博文量
    7
  • 访问量
    887