2020年疫情后期数据分析招聘近况分析

近几年越来越多的公司对数据资产有了很大的重视,顺应多出了很多数据岗位,正因为此咱们小伙伴找到了数据分析工作,但是2020年的数据分析岗位是不是有些不一样了呢?

这里给大家爬取了BOSS直聘网站的4000多条数据类岗位数据(北上广杭深),对数据类岗位的薪水、需求情况等做个分析,看看后疫情时期的数据类岗位的近况如何,给找数据分析工作的小伙伴一个参考;并且大家还可以作为数据分析项目来巩固python 和分析技能,要是想获取数据可以联系我,给大家进行使用,数据内容大致如下:

下面我们对爬虫下来的数据进行处理以及可视化,本文主要使用了python处理工具

阅读路线如下:

  • 项目准备
  • 理解数据
  • 数据清洗
  • 数据分析

一:项目准备

先导入相关模块pandas, numpy第三方包,以及可视化需要的模块matplotlib.pyplotWordCloud。项目中使用的数据是放到了咱们数据库mysql中,于是需要连接mysql和读取相关的数据,需要数据来做练习的话,可以联系要数据库账号密码

#导入相关模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import re  #正则表达式
from wordcloud import WordCloud  #词云
import warnings
warnings.filterwarnings('ignore') #通过警告过滤器进行控制是否发出警告消息。
#连接mysql
import pymysql
pymysql.install_as_MySQLdb()
from sqlalchemy import create_engine
engine=create_engine('mysql://frogdata01:fro#mysql@localhost:3306/frogdata?charset=gbk')
#读取数据
df=pd.read_sql_query('select * from Boss_analyst',con=engine)

二:理解数据

拿到数据的第一步,我们需要思考,我们需要从这批数据中获得那些信息?在分析之前,我们需要了解数据集中包含了哪些字段,各个字段代表的含义是什么:

  • position-职位
  • salary_range-薪水区间
  • work_year-工作经验
  • city-城市
  • tag1-技能要求标签1
  • tag2-技能要求标签2
  • tag3-技能要求标签3
  • tag4-技能要求标签4
  • tag5-技能要求标签5
  • company_name-公司名字
  • text-公司规模
  • company_type-公司类型
  • company_welfare-公司福利

这里能够观察到每个字段的具体含义,以及一些字段的大概展示,这样有助于我们接下来对数据进行处理和分析

可以明显看到表中的position、salary_range、work_year、city、text、company_welfare字段数据都不干净,后续需要对其进行清洗

三:数据清洗

接下来我们对数据源中的一些字段进行标准化处理,这里给大家举些例子,具体大家可以观看下咱们在B站,对于本项目有个讲解视频:数据分析求职指南[基于BOSS直聘数据,进行职位可视化分析]

1.职位字段处理

我们先观察这一字段



发现存在异常数据,这里需要对不相关的职位进行去除,考虑数据类的岗位有数据运营、数据挖掘、商业分析师、算法工程师、ETL工程师等,这里就保留这几个方面的就好

df=df.loc[df.position.str.contains('数据|分析|Data|算法|Bi|ETL')]
df.shape[0]

处理完之后,我们能够看到都是数据类岗位了

2.薪资字段处理

#观察salary_range字段
df['salary_range'].unique()

对于这样的字段,我们很难进行分析,所以我们打算把这一列的数据拆解分为两列-最低薪水、最高薪水,处理如下:

def cut_word(word,types):
    
    #把数据规整为'xx-xx'格式
    position1=word.find('K')
    position2=word.find('元')
    #如果没有找到该元素,find会返回值-1
    if position1 != -1:  
        salary_range=word[:position1]
    elif position2 != -1:  
        salary_range=word[:position2]
    
    #拆分数据-最低薪水、最高薪水
    position3= salary_range.find('-')
    bottom_salary= salary_range[:position3]
    top_salary= salary_range[position3+1:]
    
    #传入types参数,接收最低薪水、最高薪水的数据
    if types == 'bottom':
        return bottom_salary
    else:
        return top_salary

#利用apply函数进行数据转化
df['bottom_salary']=df['salary_range'].apply(cut_word,types='bottom').astype('int')
df['top_salary']=df['salary_range'].apply(cut_word,types='top').astype('int')

现在salary_range字段数据已清洗成功,并且最后还可以计算下平均薪资,如下

#新增平均薪水列,方面后面做统计分析
df['avg_salary']=df.apply(lambda x : (x.bottom_salary+x.top_salary)/2,axis=1)

3.工作年限字段处理

work_year字段中学历数据和工作年限数据混杂在了一起,需要将其分列
学历有7种数据格式:学历不限、中专/中技、高中、大专、本科、硕士、博士
工作经验有三种数据格式:x-x年、x天/周x个月、经验不限,数据处理如下:

def cut_word1(word,types):
    #找到学历不限的学字,进行切片处理
    position1=word.find('学')
    #找到学历不限的大字,进行切片处理
    position2=word.find('大')
    position3=word.find('本')
    position4=word.find('硕')
    position5=word.find('博')
    position6=word.find('高')
    position7=word.find('中')
    
    #通过切片把数据规整为学历和工作经验两列数据
    if position1 != -1:  
        work_year=word[:position1]
        educational_background=word[position1:]
    elif position2 != -1: 
        work_year=word[:position2]
        educational_background=word[position2:]
    elif position3 != -1:
        work_year=word[:position3]
        educational_background=word[position3:]
    elif position4 != -1:
        work_year=word[:position4]
        educational_background=word[position4:]
    elif position5 != -1:
        work_year=word[:position5]
        educational_background=word[position5:]
    elif position6 != -1:
        work_year=word[:position6]
        educational_background=word[position6:]
    else:
        work_year=word[:position5-4]
        educational_background=word[position5-4:]
      
    #传入types参数,接收学历和工作年限的数据
    if types == 'education_background':
        return educational_background
    else:
        return work_year
    
#利用apply函数进行数据转化,将学历数据新添加到'education_background'列,工作经验数据新添加到'work_year'列
df['education_background']=df['work_year'].apply(cut_word1,types='education_background')
df['work_year']=df['work_year'].apply(cut_word1,types='work_year')

work_year字段已清洗完毕,转化为work_yeareducation_background两列数据,把工作年限和学历背景给做分割

后续关于city、text、company_welfare这些字段的处理,可以观看“数据分析”求职指南[基于BOSS直聘数据,进行职位可视化分析]或者找我要源代码

三:数据分析

我们可以下面的4个分析思路

  • 数据类岗位整体需求
  • 城市、学历、工作经验对薪水的影响
  • 不同岗位对应的学历要求、薪水分布情况
  • 公司一般会用什么福利待遇来吸引求职者
  • 不同岗位要求的关键技能点是什么

1.数据类岗位整体需求

#1、数据类岗位整体需求

plt.figure(figsize=(16,6))

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

#学历
plt.subplot(2,3,1)
df_full_time.education_background.value_counts().plot(kind='barh',alpha=0.7)

#工作经验
plt.subplot(2,3,2)
df_full_time.work_year.value_counts().plot(kind='barh',alpha=0.7)

#岗位分布
plt.subplot(2,3,3)
df_full_time.city.value_counts().plot(kind='pie',autopct='%.1f%%')

#公司融资情况
plt.subplot(2,3,4)
df_full_time.company_financing .value_counts().plot(kind='barh',alpha=0.7)


#公司类别
plt.subplot(2,3,5)
df_full_time.company_type.value_counts().head(6).plot(kind='barh',alpha=0.7)

#薪水
plt.subplot(2,3,6)
#对薪水划分层次,如18K属于15-10
bins=[0,3,5,10,15,20,30,105]
level=['0-3','3-5','5-10','10-15','15-20','20-30','30+']
df_full_time['avg_salary_level']=pd.cut(df_full_time.avg_salary,bins=bins,labels=level)
df_full_time.avg_salary_level.value_counts().head(6).plot(kind='pie',autopct='%.1f%%')

#调整子图的间距
plt.tight_layout()

图形展示结果如下:



根据图形我们能够得出如下的结论:

  • 学历要求:大专是最低要求,招高中或中专/中技的极少,最好是本科及以上
  • 工作经验需求:偏向招聘有一定经验的求职者,尤其3-5年经验的需求最旺盛。一般工作3年以上,对于整个职业的了解会比较深入,技术趋于成熟,能够帮助做一些独立的项目
  • 岗位分布情况:北上广深杭对其需求都差不多,相对来说北京机会最多,广州偏少
  • 公司融资情况:招聘数据类岗位的一般都是达到了一定规模的大型企业
  • 行业分布情况:互联网行业需求是最多的,包括电商、金融。还有一些乙方公司也有一定需求,比如数据服务类、咨询类
  • 薪资情况:受工作经验影响较大,3年工作经验薪资一般集中在20-30K,比较可观

小结:
绝大部分公司不倾向出钱出力对新人进行培养,尤其近期又遭受到疫情的冲击,会更偏爱有工作经验的求职者,能够直接上手,尤其是能帮助做一些独立项目。

但这不仅仅针对于数据类岗位,所有岗位对求职者的要求都是越来越高的。工作经验这种要求,其实对于个人而言,它可以是硬性的,也可以是软性的,它其实是一种期望值,表示公司期望求职者能够匹配相应工作经验的能力,如果你的综合能力能够超过公司预期的期望,求职是完全没问题的

所以这就更要求我们对于能力方面做更多的训练,以及如何能够向公司体现你的能力做更多的准备

2.数据类岗位整体需求

#2、城市、学历、工作经验对薪水的影响
#城市
df_full_time_groupby=df_full_time.groupby(['city','avg_salary_level']).avg_salary.count().unstack()
df_full_time_groupby_1=df_full_time_groupby.apply(lambda x : x/x.sum(),axis=1)
df_full_time_groupby_1.plot(kind='bar',stacked=True,figsize=(9,7),alpha=0.7,width=0.2)
plt.legend(bbox_to_anchor=(1,0.7))

北京愿意开出更高的价格吸引求职者,20-30K,甚至30K以上的比例都占了很大。广州高薪资的比例没那么多,尤其10K以下的工资水平对比其他城市占的比例大

#学历
df_full_time.boxplot(column='avg_salary',by='education_background',figsize=(9,7))

学历上看,呈现出学历越高,起步价越高的态势(学历不限,可能是培训机构挂出来的岗位,也可能其他情况,这个不一概而论)

#工作经验与薪水
df_full_time.boxplot(column='avg_salary',by='work_year',figsize=(9,7))
# df_full_time.groupby(['work_year','avg_salary_level']).agg({'avg_salary_level':'count'}).unstack().boxplot(figsize=(16,10))

工作经验上看,薪资的差距拉开的很大,应届生和有工作经验的薪资对比,不在一个维度上,但这恰恰说明数据类岗位是可以通过个人能力的提高来获取更大的收益的,它是可成长的。你对技术、业务越熟悉,你的机会就越多,薪资就越高。
3.不同岗位对应的学历要求、薪水分布情况

#3、不同岗位对应的学历要求、薪水分布情况

#不同岗位基本需求情况
df_full_time.position.value_counts().plot(kind='pie',autopct='%.1f%%')

数据分析类岗位占了近一半,数据挖掘类次之,数据运营类需求最少。但只是从大的范畴来区分的,实际会存在一定偏差,岗位名称叫法很多,其他类岗位中也会存在叫算法工程师,这就属于数据挖掘这块了。单看岗位名称不具体,要看具体的岗位职能描述才能准确定义这个岗位属于哪个范畴

#薪水分布情况
df_full_time.groupby(['avg_salary_level','position']).agg({'position':'count'}).unstack().plot(figsize=(9,7),alpha=0.7)
# plt.xticks(['0-3','3-5','5-10','10-15','15-20','20-30','30+'])
plt.legend(bbox_to_anchor=(1,0.7))
  • 数据运营类岗位的薪资对比其他岗位在3-5K的占比最高,岗位薪资集中在5-10K,呈现出薪资越高,岗位占比越小的趋势;
  • 数据挖掘类的岗位对比其他岗位在30K+的占比最高,岗位薪资集中在20-30K,呈现薪资越高,岗位占比越大的趋势(0-3K数据挖掘类占比也大,猜测是部分实习生岗位数据没清洗完,也表明数据挖掘实习生的需求相对最旺盛);
  • 数据分析类的岗位呈现出岗位需求多,薪资也可观的状况,30+薪资的岗位需求方面弱于数据挖掘类
#学历要求
df_full_time.groupby(['education_background','position']).\
agg({'position':'count'}).unstack().plot(kind='barh',figsize=(9,7),alpha=0.7)
plt.legend(bbox_to_anchor=(1,0.7))

数据挖掘类对学历要求最高,硕士相对其他岗位占比最大,大专极少。其他岗位学历要求相对宽松些,但最好还是本科学历及以上

4. 公司一般会用什么福利待遇来吸引求职者

#观察字段company_welfare
df_full_time.company_welfare.head()

可以看到这里的字段存在不规范性,所以还要做下面的两步处理
1.需要把数据两边可能存在的空格去掉
2.把关键字都提炼出来

# #用replace方法,替换掉空格
df_full_time_work=df_full_time.company_welfare.str.replace(' ','')

# company_welfare存在空缺值,删除nan值
df_full_time_work=df_full_time_work.dropna()

#利用str.split方法,按元素中的[,]拆分为列表
#apply将value_counts应用于列表中的每一个元素,统计在每一行出现的次数
df_full_time_work=df_full_time_work.str.split(',').apply(pd.value_counts)
# df_full_time_work.dropna().reset_index().groupby('level_0').count().reset_index().sort_values(by='level_1',ascending=False)
df_full_time_work=df_full_time_work.unstack().dropna().reset_index()
#分组统计
df_full_time_work=df_full_time_work.groupby('level_0').count()
df_full_time_work.level_1
#设置词云图的显示样式
wordcloud=WordCloud(
    width=900,
    height=400,
    background_color='white',
    font_path = r'/root/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/SimHei.ttf',
    max_words=100, 
    relative_scaling=0.73,
    random_state=30)

# '''设置词云样式'''
# wc = WordCloud(
#     background_color='white',# 设置背景颜色
#     mask=backgroud_Image,# 设置背景图片
#     font_path='C:\Windows\Fonts\STZHONGS.TTF',  # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
#     max_words=2000, # 设置最大现实的字数
#     stopwords=STOPWORDS,# 设置停用词
#     max_font_size=150,# 设置字体最大值
#     random_state=30# 设置有多少种随机生成状态,即有多少种配色方案
# )
fig = plt.figure(figsize=(16,5))
wordcloud.fit_words(df_full_time_work.level_1)
plt.imshow(wordcloud)
plt.axis=('off')
plt.show()

# # 显示词云图
# plt.imshow(wc)
# # 是否显示x轴、y轴下标
# plt.axis('off')
# plt.show()

由词图可看出,公司一般会用五险一金、带薪年假、节日福利、年终奖等福利吸引和激励员工

5.不同岗位要求的关键技能点是什么
对于这块,大家可以按照上面的分析思路,来自己尝试下,自己做完后可以再和视频对照下“数据分析”求职指南[基于BOSS直聘数据,进行职位可视化分析]

参考

  • 项目代码和数据加微领取
  • 项目视频观看

你可能感兴趣的:(2020年疫情后期数据分析招聘近况分析)