項目背景
在學習資料分析的路上,少不了經常逛知乎,這也是我第一篇在知乎上的文章,寫這篇文章的啟發來源于@BigCarrey 的一篇文章《資料分析師掙多少錢?“黑”了招聘網站告訴你!》(https://zhuanlan.zhihu.com/p/25704059),該文章給了我一些幫助,讓我了解了資料分析崗位相關的資訊,但同樣也留給我一些疑問,該文章分析的資料分析師所需技能的結果絲毫沒有R的蹤影,盡管是一年前的分析,我覺得應該不可能不存在。
是以,抱着證明R語言這款工具的想法,以及希望了解目前企業對資料分析崗位的需求,開始了一次針對招聘網站的資料分析崗位招聘資料的分析與挖掘實踐,避免自己所學習的方向與企業實際需求脫軌。
此執行個體采用R語言作為分析工具,下面展現的是我整個分析過程。
目标
了解企業目前需要什麼樣的資料分析人才,以及應該具備的能力和素質。
分析的結果為今後的學習和求職提供指導,也為正在學習資料分析和找工作的朋友們提供一定的參考價值。
問題的分解:
不同地區、經驗、學曆、企業規模資料分析崗位的需求分布以及對應的薪資分布。
探索資料分析崗位對應的工具型技能與對應的薪資水準及非工具型能力的需求。
資料集的定義

表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份樣本,資料量相對少一點,是以資料分析的結果需要大家用懷疑的心态來看待,且僅局限在網際網路行業,相對于其他行業,本文章的分析結果隻能作為一個參考。
原文釋出時間為:2018-04-15
本文作者:Joffy Zhong
本文來自雲栖社群合作夥伴“
資料派THU”,了解相關資訊可以關注“
”。