来源:R语言中文社区

作者:Joffy Zhong

本文共4500字,建议阅读8分钟。
本文针对招聘网站的数据分析岗位的数据进行分析与挖掘实战。

项目背景

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

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

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

目标

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

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

问题的分解:

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

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

数据集的定义

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

表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)

图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关键词识别的问题。

文本挖掘思路:

  • 工具型技能的关键词:采用默认分词器的词频TF值

  • 非工具型能力或素质的关键词:采用关键词分词器的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)

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

分析的结果

数据分析代码:

具体代码可以前往该链接查看整个过程: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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

  • 偏工程方向的数据分析师对“数据挖掘”、“数据建模”、“模型分析”等能力要求较高;

  • 偏业务方向的数据分析师对“业务分析”、“运营分析”、“产品分析”、“用户分析”等能力要求较高;

  • 两个类型共同需要“逻辑思维”、“沟通”、“分析报告”、“统计分析”、“团队合作”等关键能力;


总结


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

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

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

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

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

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

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

建议


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

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

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


不足与局限


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

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

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

感谢你的观看。

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

  1. R语言分析蛋白质组学数据:飞行时间质谱(MALDI-TOF)法、峰值检测、多光谱比较...

    全文链接:http://tecdat.cn/?p=30051 •研究生物体产生的全部蛋白质. • Foci:鉴定.结构测定.生物标志物.通路.表达(点击文末"阅读原文"获取完整代码 ...

  2. R语言相关关系可视化函数梳理(附代码)

    来源:R语言中文社区 作者:赵镇宁 本文约3177字,建议阅读6分钟. 本文为你介绍R语言相关关系可视化的函数进行了初步梳理,大家可根据个人需求及函数功能择优选择. 当考察多个变量间的相关关系时,通常 ...

  3. R语言分析单细胞数据Day1——下载Seurat包并进行预处理(一)

    Task.1 安装Seurat,准备处理single cell data 安装Seurat时,只能安装3.2.3以下的版本,太高就不兼容! install.packages('remotes') %安 ...

  4. R语言文本挖掘tm包详解(附代码实现)

    文本挖掘相关介绍 1什么是文本挖掘 2NLP 3 分词 4 OCR 5 常用算法 6 文本挖掘处理流程 7 相应R包简介 8 文本处理 词干化stemming snowball包 记号化Tokeniz ...

  5. R语言对基因进行GO注释(附代码)

    通常在挑选出一些基因之后,需要对这些基因进行GO注释,分析该基因的功能,现在把R分析GO的代码放在下面 所需要的文件,有一列geneid即可 rm(list=ls()) genelist <- ...

  6. r语言pls分析_零基础学习R语言分析GEO

    关于零基础用R语言分析GEO的视频已更新完,发布在B站,有兴趣的小伙伴可以移驾到B站,我的B站号:I_am_Becky 之前录制过一系列关于零代码分析GEO数据的,但是这样画出来的图太low了,所以学 ...

  7. 手把手教你使用R语言爬虫在气象网站抓取气象数据并分析绘制热力日历图(1)

    我们做临床研究常见的烦恼为没有好的数据,目前气象网站上有很多关于气象因素和空气质量数据,但是没有系统的整理和格式等问题,我们使用起来非常不方便,而且很费时间,我们可以使用R语言爬虫工具对网站上的数据进 ...

  8. 【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享

    最近我们被客户要求撰写关于主成分分析PCA的研究报告,包括一些图形和统计输出.降维技术之一是主成分分析 (PCA) 算法,该算法将可能相关变量的一组观察值转换为一组线性不相关变量.在本文中,我们将讨论 ...

  9. 如何用r语言分析数据

    如果要使用 R 语言分析数据,通常需要以下步骤: 导入数据:可以从多种格式的数据文件(如 CSV,Excel 等)中导入数据,并将其存储为 R 中的数据框(data.frame). 数据清理:检查数据 ...

最新文章

  1. t6文件服务器怎么设置,t6 修改文件服务器地址
  2. Determine destination location of apt-get install package?
  3. idea 这么还原debug_看源码,我为什么推荐IDEA ?
  4. openwrt 音频开发
  5. 没有该栏目数据 可能缓存文件(data/cache/inc_catalog_base.inc)没有更新请检查是否有写入权限...
  6. OpenGL基础56:OpenGL简单调试
  7. CC2640R2学习笔记—CCS环境最简单配置、下载运行第一个程序(OLED)
  8. apk改之理安装教程
  9. Android app语言中英文转换、多语言转换
  10. 【74HC595】STM32 74HC595驱动程序
  11. 矩阵手册(六)—— Cauchy–Schwarz 不等式及其证明
  12. 吕梁云计算机中心,吕梁云计算中心综合实力全国排第三
  13. java kdj macd_MACD、BOLL、KDJ 三大组合精准把握趋势与买卖!
  14. 查看 Docker 容器的名字空间 .
  15. web常见错误解决方法
  16. 阿里云短信认证实现过程
  17. C++17之折叠表达式
  18. PHP+Mysql—苹果购物商城管理系统网站(前端+后端、整套源码)
  19. 软件开发 接口文档
  20. TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统

热门文章

  1. (六)Redis主从自动恢复-sentinel
  2. C++ Primer 第三版 读书笔记
  3. 阿里云服务器ECS Linux系统分析nginx或apache当天访问最多的IP
  4. Touch 方法amp;属性 映射工具
  5. ASP.NET页面动态添加js脚本
  6. java swing原理浅析
  7. [转]将C#程序嵌入资源中(C# 调用嵌入资源的EXE文件方法)
  8. php之变量覆盖漏洞讲解,PHP中的变量覆盖漏洞代码深入解析
  9. go var type 互转_Go语言学习笔记(第九章) 结构体
  10. c语言实现将两个文件复制到一个文件里_Python中复制文件的9种方法