教你用R语言分析招聘数据,求职/转行不求人~(附代码、数据集)

简介:

项目背景

在学习数据分析的路上,少不了经常逛知乎,这也是我第一篇在知乎上的文章,写这篇文章的启发来源于@BigCarrey 的一篇文章《数据分析师挣多少钱?“黑”了招聘网站告诉你!》(https://zhuanlan.zhihu.com/p/25704059),该文章给了我一些帮助,让我了解了数据分析岗位相关的信息,但同样也留给我一些疑问,该文章分析的数据分析师所需技能的结果丝毫没有R的踪影,尽管是一年前的分析,我觉得应该不可能不存在。

因此,抱着证实R语言这款工具的想法,以及希望了解当前企业对数据分析岗位的需求,开始了一次针对招聘网站的数据分析岗位招聘数据的分析与挖掘实践,避免自己所学习的方向与企业实际需求脱轨。

此实例采用R语言作为分析工具,下面展现的是我整个分析过程。

目标

了解企业当前需要什么样的数据分析人才,以及应该具备的能力和素质。

分析的结果为今后的学习和求职提供指导,也为正在学习数据分析和找工作的朋友们提供一定的参考价值。

问题的分解:

不同地区经验学历企业规模数据分析岗位的需求分布以及对应的薪资分布。

探索数据分析岗位对应的工具型技能与对应的薪资水平及非工具型能力的需求。

数据集的定义

5c467f38b9a3bfc65654be57cdcfb15454931f49

表1:数据分析岗位信息表

b87a33061d2e28c4b505d41517bcaff95a49c563

表2:数据分析岗位技能关键词表

数据获取

数据来源:拉勾网

数据范围:互联网行业、数据分析岗位

数据集:全国数据分析岗位招聘信息数据集(采集样本量:449)

工具:爬虫

时间:所有数据截止2018年3月12日

数据集下载地址:

链接:https://pan.baidu.com/s/1Bz7mA_dnvD1MGTVrZKyhPA

密码:layp

数据处理

步骤1:加载原始数据

#readxl包的read_excel函数
library(readxl)
#数据加载
CN.df <- read_excel("CN_lagou_jobdata.xlsx",1)
CN.df <- CN.df[,c("title","salary","experience","education",
"campany","scale","scale2","description","phase","city")]
#观察数据,分类变量不是因子的格式,且存在不需要的字符
str(CN.df)

步骤2:识别缺失值

#VIM包的aggr函数来识别
library(VIM)
aggr(CN.df,prop=TRUE,numbers=TRUE)
111196f63fc361a3492a4d6b7ed207b82b95d16a


图1. aggr缺失值识别图

幸运的是该数据集不存在缺失值,这是很少遇到的情况。

步骤3:数据清洗

#zoo包的index函数

library(zoo)

#定义数据清洗函数

cleaning <- function(my.data){

#删除重复值

my.data <- my.data[!duplicated(my.data[c("title","campany","description")]),]

#计算平均月薪

min_salary <- as.numeric(sub("([0-9]*).*","\\1",my.data$salary))

max_salary <- as.numeric(sub(".*-([0-9]*).*","\\1",my.data$salary))

my.data$avg_salary <- (max_salary + min_salary)/2

#清理字符串中的不需要的字符

#并将需要分析的字符变量转化为因子,并对部分因子重新编码

my.data$city <- factor(gsub("[/ ]*","",my.data$city))


my.data$experience <- gsub("经验|[/ ]*","",my.data$experience)

my.data$experience[my.data$experience %in% c("不限","应届毕业生")] <- "1年以下"

my.data$experience <- factor(my.data$experience,

levels=c("1年以下","1-3年","3-5年","5-10年","10年以上"))

#这里的学历:“大专”,“本科”,“硕士”都表明是要求该学历“及以上”

my.data$education <- gsub("学历|及以上|[/ ]*","",my.data$education)

my.data$education[my.data$education=="不限"] <- "大专"

my.data$education <- factor(my.data$education,levels=c("大专","本科","硕士"))

my.data$phase <- factor(gsub("[\n]*","",my.data$phase),levels =

c("不需要融资","未融资","天使轮","A轮",

"B轮","C轮","D轮及以上","上市公司"))

my.data$campany <- gsub("[\n| ]*","",my.data$campany)

my.data$scale <- factor(gsub(".*(少于15人|15-50人|50-150人|150-500人|500-2000人|2000人以上).*",

"\\1",paste(my.data$scale,my.data$scale2)),

levels =c("少于15人","15-50人","50-150人",

"150-500人","500-2000人","2000人以上"))

my.data$id <- index(my.data)

my.data <- droplevels(subset(my.data,select=-scale2))

return(my.data)

}

#清洗数据,得到清洗后的数据

CN.clean <- cleaning(CN.df)

str(CN.clean)

步骤4:文本挖掘

文本挖掘工具:jiebaR包

说明:在进行正式挖掘之前测试了一下jiebaR的关键词(keywords)分词器,测试的结果发现SQL,Python等词在jiebaR词典中的IDF值均为11.7392,但“R”这个字符无论如何(即使自定义了用户字典,或者在idf字典中添加R的idf值)都无法被分词器识别为关键词,猜测可能是默认R的词性标注或者算法实现方法的原因。但因为R是数据分析师的重要工具,识别不出来是不可容忍的,因此要另求出路。

测试代码如下:

> library(jiebaR)
> library(jiebaRD)
> engine <- worker(type = "keywords",topn = 20,idf = IDFPATH)
> keywords("我在用R,R,R,R语言,SQL,PYTHON,EXCEL等工具,了解MySQL会更有好处",engine)

结果如下:

# 11.7392 11.7392 11.7392 11.7392 6.87603 6.1635 6.11745 5.09665 
# "EXCEL" "MySQL" "PYTHON" "SQL" "好处" "语言" "工具" "了解"

解决办法

关键词算法的实现原理是TF-IDF算法,TF为词频,IDF为逆文档率(词的权重),因此TF-IDF=TF*IDF为衡量是否关键词的指标,若控制IDF,则TF-IDF的值与TF值成正比关系,简单来说TF值可以代替TF-IDF值。

由于此次分析的是数据分析师的工具和技能,因此只考虑SQL,PYTHON,R,SAS等常用且类似的词的分析,又因为该类词在jiebaR分词器识别出来的IDF值均是同级别的(即使可能存在有差异也在此假设其等值),因此这部分词汇的关键指标的衡量可以简化为出现的词频,即TF值,这个可以通过jiebaR的默认分词器(不是关键词分词器)来处理即可,最终解决R关键词识别的问题。

文本挖掘思路:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 工具型技能的关键词:采用默认分词器的词频TF值
d47e62d2b349aca45e42305ed6714efbe5ed61d9 非工具型能力或素质的关键词:采用关键词分词器的TF-IDF值

代码如下:

library(jiebaR)

library(jiebaRD)

library(zoo)

library(plyr)

source("myfun.R")

#提取技能型关键词

#采用默认jiebaR分词器

engine <- worker(user = "user_dict.txt")

#分词,并删除无关的词汇

word.lis <- lapply(CN.clean$description, function(x){

v <- gsub("[\u4e00-\u9fa5|0-9|\\.|\\-]","",segment(x,engine))

v <- v[v!=""]

return(v)

})

#将所有分出来的词转化为大写,消除大小写差异

segWords <- toupper(unlist(word.lis))

stopwords <- toupper(readLines("stopwords.txt"))

#过滤停词,由于文本可能会存在其他高频的词汇,把不需要的词去除,如(and,of…)

#此处确保我要得到的前20个关键技能是正确的数据分析技能

segWords<-filter_segment(segWords,stopwords)


#形成词频表(数据框格式),获取前15个技能关键词

top15.df <- top.freq(segWords,topn = 15)


#生成有id和keyword构建的数据框,id对应cleandata数据集的id(即数据字典表1和表2的关系)

id <- NULL

keyword <- NULL

for (i in index(word.lis)) {

id <- c(id,rep(i,length(word.lis[[i]])))

keyword <- c(keyword,word.lis[[i]])

}

keyword.df <- data.frame("id"=id,"keyword"=toupper(keyword))

keyword.df <- droplevels(keyword.df[keyword.df$keyword %in% top15.df$x,])

str(keyword.df)

#合并两个数据集(表之间的内连接,类似sql语句的inner jion)

merge.df <- merge(CN.clean,keyword.df,by="id")

#该数据集用于工具型技能关键词的分析str(merge.df)

#提取非技能型关键词,停词可以自行定义

keys <- worker(type = "keywords",user = "user_dict.txt",topn = 20,stop_word = "stopkw.txt")

keyword.lis <- lapply(CN.clean$description, function(x){

v <- gsub("[a-zA-Z|0-9|\\.|\\-]","",keywords(x,keys))

v <- v[v!=""]

return(v)

})

keyword.lis <- unlist(keyword.lis)

#形成非工具型技能关键词词频表

not.tool.keyword <- top.freq(keyword.lis)

str(not.tool.keyword)

到此数据处理的过程基本完成,处理后干净的数据如下:

9f8acded3380e20097e9a703314bf8e031c75741

分析的结果

数据分析代码:

具体代码可以前往该链接查看整个过程:RPubs - 分析实例:企业需要什么样的数据分析人才(http://rpubs.com/Joffy_Z/DA_analysis)

描述统计信息:

## city phase scale education experience 
## 北京 :222 不需要融资:94 15-50人 : 15 大专: 33 1年以下: 34 
## 杭州 : 48 上市公司 :88 50-150人 : 36 本科:389 1-3年 :156 
## 上海 : 48 D轮及以上 :80 150-500人 :104 硕士: 20 3-5年 :206 
## 广州 : 38 C轮 :73 500-2000人:116 5-10年 : 46 
## 深圳 : 38 B轮 :49 2000人以上 :171 
## 长沙 : 11 A轮 :42 
## (Other): 37 (Other) :16 
## avg_salary 
## Min. : 2.50 
## 1st Qu.:12.50 
## Median :17.50 
## Mean :18.22 
## 3rd Qu.:22.50 
## Max. :75.00

问题一:不同地区,数据分析岗位的需求分布以及对应的薪资分布

c0dc3889e212a1109c8a42187f16b7afb74e351a

总的来说数据分析师的平均薪资比较好,工作1年以上拿到10k月薪的机会还是比较大的,在需求量前5的城市中,北京深圳的平均薪资是最高的,广州的平均薪资最低

需求量在第二梯度的城市中,长沙成都的平均薪资较低,但武汉、厦门、郑州也有不错的薪资表现,二线城市也是一个可以考虑的选择。

需要注意的是苏州的需求量相对于其他城市是非常低的,但其平均薪酬接近深圳,是可以值得关注的城市。

问题二:不同经验,数据分析岗位的需求分布以及对应的薪资分布

b4b06e6f6e6aac112360c3c8c6c9e4be0205ad56

跟预想的差不多,薪资随工作经验的增加而有一个稳定的增长,但企业对最大的数据求集中在3-5年经验的数据分析师,这对于转型进入数据分析的人来说不是一个好的消息,转行需要更有充足的准备,且要不断寻找能够积累经验的项目来做。

问题三:不同学历,数据分析岗位的需求分布以及对应的薪资分布

9529871d9922f3b3ca40c218739a38e7b830c114

企业似乎更加注重分析师的实践经验,而不是学历的高低,但至少需要具备本科以上的学历,数据分析还是需要具备一定的理论基础,在薪资方面,相对与本科来说,硕士及以上学历在获取高薪方面并没有太大的优势,能够解决实际问题才是数据分析师拿高薪的关键,而非深奥的理论知识。大专学历的分析师还是有机会,重点在于增加自己的工作经验才是本质上与其他分析师拉开距离的关键,当然,理论知识也不能落下。

问题四:不同企业规模,数据分析岗位的需求分布以及对应的薪资分布

58c6fccecd2782301b57c20575d4de56859df442

150人规模以下的企业需求量较少,但给出的薪资较高(甚至有异常的高薪),该类企业可能处于快速融资且高速的发展阶段,需要有丰富经验的数据分析专家来建设整个数据体系。

50~150人规模的企业适合有足够经验的分析师且想要创业的人,对自己职位以及薪酬均会有明显的提升,但最大的风险就是该类企业容易失败,特别在互联网行业,因此更不建议作为转型新人的首选。

对于转型的新人,尽可能往大企业走,越大规模的企业,整个体系越成熟,因此可以在150人以上的规模从上往下选择自己合适的企业才是比较科学的方式,且需求量巨大。

问题五:数据分析岗位对应的工具型技能与对应的薪资水平

50f5c91b95b72e72be66c0613bd28136b2df21dd

SQL和Excel几乎是每个数据分析师要掌握的基础技能,大多数企业都有自己的数据库体系或者系统平台,因此企业工作人员读取和处理数据还是以数据库和Excel为主。

R,Python是两个最热门的开源数据分析工具,且当前R语言在需求仍然不低,因此核心掌握两门语言的其中一门都会让数据分析师具备有力的竞争优势。

除此之外工作经验较低的数据分析师还需要掌握一些BI可视化分析工具,工作经验较高的数据分析师需要掌握主流的关系型数据库系统和NoSQL,以及Hadoop,Hive,Spark等大数据工具,掌握Hadoop,Hive,Spark,R,Python等技能是获取高薪必备条件。

问题六:数据分析岗位对应非工具型能力的需求

声明:此处数据涉及到岗位细分和难以衡量的原因,并没有进行深入分析,词云本身不具备太高的数据分析价值,仅作为可视化关键词的分布情况的工具;阅读者需要根据自身岗位以及所处的工作定位查看关键词的情况,这里的大小表示关键词出现的频次。

775521df3df0212cc6273b8e817c5fc5a2b61ca7

通过资料的收集,了解到数据分析岗位主要有偏工程方向和偏业务方向两个类型,透过词云可以大概了解到如下信息:

d47e62d2b349aca45e42305ed6714efbe5ed61d9偏工程方向 的数据分析师对“数据挖掘”、“数据建模”、“模型分析”等能力要求较高;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 偏业务方向的数据分析师对“业务分析”、“运营分析”、“产品分析”、“用户分析”等能力要求较高;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 两个类型共同需要“逻辑思维”、“沟通”、“分析报告”、“统计分析”、“团队合作”等关键能力;

总结

地域来看,北京、深圳、上海、杭州、广州应该是数据分析师的首选城市,苏州是一个值得关注的城市,外部数据了解到苏州的GDP仅次于一线城市,此处结果平均薪资接近北京和深圳,但需求量较低,想要苏州发展的朋友可以关注其动态。

总体需求来看,企业更加需要具备多年工作经验,且动手能力强、解决实际问题的分析人才,随着工作经验的增加,其对应的薪资也有可观的增长。

大环境看,外部资料了解到,自助式分析工具的逐步完善与人工智能技术的突破,也可能使得企业现有业务人员能够上手基础的分析工作,导致企业对经验较低的分析师需求减少。

企业规模看,150人以上规模的企业更加适合新人进去锻炼,一方面企业已经完成了基本的数据体系架构,且越大的企业数据量级越大,另一方面,企业需要逐步培养强大的数据分析团队来支撑业务的增长。

分析师个人的角度,则需要更加关注自身成功项目经验的积累,这是升职加薪的必备条件,且需要思考未来自身的发展路径,提前做好准备,相对于业务方向,大数据工程师方向会有更可观的薪资。

能力的角度,数据分析师需要掌握SQL,Excel,R,Python四个必备的工具(R和Python可以选择其一为主要工具),新人可以注重BI,PPT等office工具的技能,如果是大数据挖掘,越往后则需要更加关注hadoop,Hive,Spark等工具;

数据分析师个人还需要注重逻辑思维、表达沟通、分析报告等关键能力

建议

对于想要转型的数据分析师新人,转型之前尽可能做好项目经验的积累,尽量做到跨岗不跨行,在自己熟悉的领域学习数据分析。

企业比较看重经验和动手能力,面试的时候尽可能展示你的作品或者案例,如果当前没有,则需要在日常学习,练习,积累。

可以掌握一些可视化工具和数据可视化的思维,熟练掌握报告和表达的技巧,数据分析的工具多样,方式多样,只有能够正确解读数据且让对方看懂听懂才是有价值的

不足与局限

本次分析并没有按照分析报告的方式来呈现,文章中以个人的整个分析过程来撰写,希望能够与各位朋友一起交流学习,如果你不同意我文章中的观点,欢迎指正交流。

文章中我附上了我的数据集以及分析的代码链接,有兴趣的朋友可以重复我的过程,甚至做更加深入有趣的分析,如果有新的发现和观点,希望也能让我知道,向你们学习。

数据仅采集到449份样本,数据量相对少一点,因此数据分析的结果需要大家用怀疑的心态来看待,且仅局限在互联网行业,相对于其他行业,本文章的分析结果只能作为一个参考。


原文发布时间为:2018-04-15
本文作者:Joffy Zhong
本文来自云栖社区合作伙伴“ 数据派THU”,了解相关信息可以关注“ 数据派THU”。
相关文章
|
1天前
|
机器学习/深度学习 数据挖掘 数据建模
R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据(下)
R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据
36 9
|
1天前
|
机器学习/深度学习 数据可视化
数据分享|R语言逻辑回归Logisitc逐步回归训练与验证样本估计分析心脏病数据参数可视化
数据分享|R语言逻辑回归Logisitc逐步回归训练与验证样本估计分析心脏病数据参数可视化
33 18
|
1天前
|
机器学习/深度学习 数据可视化 算法
数据分享|R语言决策树和随机森林分类电信公司用户流失churn数据和参数调优、ROC曲线可视化
数据分享|R语言决策树和随机森林分类电信公司用户流失churn数据和参数调优、ROC曲线可视化
44 10
|
1天前
|
算法 vr&ar Python
R语言隐马尔可夫模型HMM连续序列重要性重抽样CSIR估计随机波动率模型SV分析股票收益率时间序列
R语言隐马尔可夫模型HMM连续序列重要性重抽样CSIR估计随机波动率模型SV分析股票收益率时间序列
|
1天前
|
数据可视化 安全 数据挖掘
数据分享|R语言用主成分分析(PCA)PCR回归进行预测汽车购买信息可视化
数据分享|R语言用主成分分析(PCA)PCR回归进行预测汽车购买信息可视化
|
1天前
|
算法
R语言贝叶斯METROPOLIS-HASTINGS GIBBS 吉布斯采样器估计变点指数分布分析泊松过程车站等待时间
R语言贝叶斯METROPOLIS-HASTINGS GIBBS 吉布斯采样器估计变点指数分布分析泊松过程车站等待时间
12 0
|
1天前
|
vr&ar Python
R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据
R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据
|
2天前
R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据-3
R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据
14 1
R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据-3
|
2天前
|
算法
R语言Gibbs抽样的贝叶斯简单线性回归仿真分析
R语言Gibbs抽样的贝叶斯简单线性回归仿真分析
18 1
R语言Gibbs抽样的贝叶斯简单线性回归仿真分析
|
2天前
|
数据可视化
【视频】R语言生存分析原理与晚期肺癌患者分析案例|数据分享-4
【视频】R语言生存分析原理与晚期肺癌患者分析案例|数据分享
33 1

热门文章

最新文章