1. 程式人生 > >基於30多萬條招聘資訊的熱門城市、地域 、薪資、人才要求的R語言資料視覺化分析

基於30多萬條招聘資訊的熱門城市、地域 、薪資、人才要求的R語言資料視覺化分析

又是一年畢業季,什麼工作好找、工資高、哪些地域有優勢等就是很多人關注的話題了。這裡用一份2017年初,含有32萬條資料(行)、19個詳細招聘資訊(列)的資料進行招聘資訊的知識發現、挖掘。

資料部分截圖如下:
這裡寫圖片描述

需要完成的工作
1、資料預處理;
2、每個行業的招聘次數、平均工資分析;
3、學歷要求與平均工資分析;
4、不同工作經驗的招聘次數、平均工資分析;
5、不同職位的發展前景分析;
6、不同地域招聘次數、平均工資分析。

下面分別從以上這幾方面展開分析。
1、資料預處理
(1)、讀入資料並且去掉不會用到的欄位(比如公司福利、Url等)。
這裡寫圖片描述
(2)、這裡需要根據讀入的原始資料的工資範圍簡單計算平均工資,並且處理人數字段為數值型,便於後面的計算。
平均工資 = (工資最大+工資最小)/2
這裡寫圖片描述


本來想對不同行業描述做分詞處理,繼而進行詞雲分析,發現停詞後每個詞頻都很小,幾乎都為1,詞雲效果很差感覺這裡行業描述文字挖掘或許不合適,就放棄了。
這裡還是附上文字挖掘程式碼,如下:
這裡寫圖片描述

2、每個行業的招聘次數、平均工資分析
(1)、基於行業招聘次數的資料探索
這裡寫圖片描述
簡單統計不同行業的招聘次數,畫出柱狀圖如下:
這裡寫圖片描述
可以看出,計算機軟體、網際網路、IT服務行業,招聘次數總和最多。可見,在現在的網際網路大潮中,計算機、網際網路行業人才缺口仍然很大,但是到底工資水平怎麼樣呢?就需要進一步的分析了。
(2)、行業平均工資
由於行業太多,這裡取招聘次數最多的前十名進行平均工資分析。這裡匹配計算的平均工資定義如下:
行業平均工資 = SUM(每個行業招聘人數x平均工資)/總人數
這裡寫圖片描述


畫出的行業平均工資分佈柱狀圖如下:
這裡寫圖片描述
可以看出,電子技術行業平均工資最高,其次是基金與計算機硬體,可見行業人才需要與行業平均工資水平關係不大。

3、學歷要求與平均工資分析
為什麼很多人會去考研追求更高學歷呢?因為,不同學歷工資待遇是有差別的,那麼這個工資差異到底體現出什麼樣的規律呢?
(1)、不同學歷招聘頻數統計
這裡寫圖片描述
畫出的柱狀圖如下:
這裡寫圖片描述
大專學歷招聘次數最多,學歷不限與本科學歷居於第二,可見現在企業對人才的需求中大專需求最多,門檻比較低。碩士、博士招聘最少,可見高學歷人才需求比較少,當然或許是因為高學歷人才本身就少的緣故。
(2)、不同學歷平均工資分析
這裡匹配計算的平均工資定義如下:
學歷平均工資 = SUM(每個學歷招聘人數x平均工資)/總人數
這裡寫圖片描述


畫出的學歷~平均工資柱狀圖如下:
這裡寫圖片描述
其它學歷工資最高,這裡並不清楚到底是些什麼學歷。但是除了這個,博士工資毋庸置疑第一,其次是碩士學歷的平均工資,本科工資第三,一切都在情理之中。所以,對自己沒有自信拿到滿意工資的本科生,還是繼續讀研深造或許會改觀自己的現狀吧。

4、不同工作經驗的招聘次數、平均工資分析
(1)、還是不同工作經驗招聘次數的統計探索性分析
這裡寫圖片描述
畫出的柱狀圖如下:
這裡寫圖片描述
(2)、不同經驗~平均工資分析
由於招聘經驗欄位有26個取值,圖中反應的不很清楚,取六個次數較多的進行經驗~平均工資分析。這裡匹配計算的平均工資定義如下:
經驗平均工資 = SUM(不同經驗招聘人數x平均工資)/總人數
這裡寫圖片描述
畫出的經驗~平均工資柱狀圖如下:
這裡寫圖片描述
可以看出5-10年經驗平均工資最高,其次是3-5年,經驗與工資確實成正相關。其實,不管做什麼事情,都是一種經驗的積累。

5、不同職位的發展前景統計分析
這裡通過對不同職位的招聘人數的簡單統計,可以看出哪些職位型別是當前熱門職位,只是取出招聘次數最多的前10名進行統計分析。
這裡寫圖片描述
畫出的柱狀圖如下:
這裡寫圖片描述
由於這份資料對職位分的比較細,第一名是“軟體工程師”,後面好像都是與軟體有關,可見現在“軟體”行業確實需要大量人才。

6、不同地域招聘次數、平均工資分析。
良禽擇木而棲,找工作時地域選擇確實是個問題。下面對資料中總共的33個城市進行招聘次數~平均工資的統計分析。
(1)、不同地域招聘次數的統計探索分析
統一將所有地域標準化到【市級】地域單位,比如不管是北京的朝陽區還是什麼區,都統一標準化為北京這個市級單位。
這裡寫圖片描述
畫出的柱狀圖如下:
這裡寫圖片描述
作為神都的北京確實對人才需求很大,把其它城市遠遠的甩在了後面。上海、深圳、武漢、成都、杭州呈現逐漸梯度下降,對人才需求也很大。北京雖然人才需求大,但是北京的生活壓力等還是比較大的。總而言之,地域選擇還是要根據實際情況慎重考慮,不可盲目跟風,小看了社會這個大舞臺。
(2)、不同地域平均工資
通過上面的分析我們已經知道,北京的人才需求最大,那麼工資水平怎麼樣呢?當然了,如果你是大神,走到哪裡,你都是人才。哈哈!
這裡匹配計算的平均工資定義如下:
地域平均工資 = SUM(不同地域招聘人數x平均工資)/總人數
這裡寫圖片描述
畫出的地域平均工資柱狀圖如下:
這裡寫圖片描述
可以看出北京、上海、佛山地區平均工資高,上海平均工資最高,確實合乎情理。但是,發現整體平均工資水平好像差別並不大,這或許與資料抓取的城市都是發達大城市或者省會大城市有關。這樣來看,又是可以理解的了。

這裡附上原始程式碼

setwd("C:\\Users\\26015\\Desktop\\資料")

#library(rJava)
#library(Rwordseg)
library(wordcloud)
library(data.table)
library(stringr)

data_1<-fread("data_1.csv",header=T,encoding="UTF-8")
data_2<-fread("data_2.csv",header=T,encoding="UTF-8")
data_3<-fread("data_3.csv",header=T,encoding="UTF-8")
data_all<-rbind(data_1,data_2,data_3)
rm(data_1,data_2,data_3)

data_all<-data_all[,c(2,5,8,9,11,14,15,17,18,19)]


#利用stringr包下面的str_extract()函式提出最大最小工資後取平均值
fun_min<-function(x){return(str_extract(x,"[0-9]+"))}
fun_max<-function(x){str_extract(str_extract(x,"[0-9]*元"),"[0-9]+")}
a1<-as.numeric(apply(data_all[,8],1,fun_min))
a2<-as.numeric(apply(data_all[,8],1,fun_max))
data_all[,8]<-(a1+a2)/2
#人數處理
ren<-function(x){return(str_extract(x,'[0-9]+'))}
data_all[,10]<-as.numeric(apply(data_all[,10],1,ren))

#匹配相應職位型別
a1<-data_all[which(data_all[,6]=='計算機軟體'),2]
a2<-data_all[which(data_all[,6]=='網際網路/電子商務'),2]
a3<-data_all[which(data_all[,6]=='旅遊/度假'),2]

#a1<-unlist(segmentCN(as.character(a1[sample(1:nrow(a1),1000)])))
#a2<-unlist(segmentCN(as.character(a2[sample(nrow(a2),200)])))
#a3<-unlist(segmentCN(as.character(a3)))

#匯入停止詞表
#stopword<-read.table('F:\\我的資料\\資料探勘\\中文分詞詞庫整理\\哈工大停用詞表擴充套件.txt')
#去除詞語統計中的停止詞
#stopword<-unlist(stopword)
#stopword1<-unlist(stopword1)

#a1<-setdiff(a1,stopword)
#a2<-setdiff(a2,stopword)
#a3<-setdiff(a3,stopword)

#a1<-table(a1)
#a2<-table(a2)
#a3<-table(a3)

#wordcloud(names(a3),a3,random.order=F,col = rainbow(length(a3)))
hy<-table(data_all[,6])
hy<-hy[order(-hy)]
shuju<-data.frame(names(hy),as.numeric(hy))
hy_name<-names(hy)

names(shuju)<-c('行業','招聘次數')
write.csv(file = 'hy.csv',shuju,row.names = FALSE)
#barplot(shuju[1:10,2],legend = hy_name[1:10],col = c('red','darkorange','darkgreen','darkgray','gray34','lightblue1','lightcoral','lawngreen','tan4','tan'))
for(i in 1:length(hy))
  hy_name[i]<-paste0(as.character(i),'  ',unlist(strsplit(hy_name[i],'/'))[1])
barplot(shuju[1:10,2],ylim = c(0,25000),col = c('red','darkorange','darkgreen','darkgray','gray34','lightblue1','lightcoral','lawngreen','tan4','tan'),xlab = '行業',ylab = '招聘次數',main = '行業~招聘次數圖')
legend(list(x = 4.5,y = 24000),legend = hy_name[1:10],text.width = strwidth("2,0000000,00000000000"))
axis(1,col = 'blue',col.axis = 'red')
axis(2,col = 'blue',col.axis = 'red')
#計算行業前十名平均工資
hy_name<-names(hy)
salary<-c(1:10)
for(i in 1:10)
{
  p<-unlist(data_all[which(data_all[,6]==hy_name[i]),8])
  index1<-which(p %in% NA)
  p<-p[-index1]
  q<-unlist(data_all[which(data_all[,6]==hy_name[i]),10])[-index1]
  index2<-which(q %in% NA)
  p<-p[-index2]
  q<-q[-index2]
  salary[i]<-sum(p*q)/sum(q)
}
for(i in 1:length(hy))
  hy_name[i]<-paste0(as.character(i),' ',unlist(strsplit(hy_name[i],'/'))[1])
barplot(salary,ylim = c(0,26000),col = c('red','darkorange','darkgreen','darkgray','gray34','lightblue1','lightcoral','lawngreen','tan4','tan'),xlab = '行業',ylab = '平均工資',main = '招聘行業工資圖')
legend(list(x = 6,y = 26000),hy_name[1:10],text.width = strwidth("2,0000000,0000000000"))
axis(1,col = 'blue',col.axis = 'red')
axis(2,col = 'blue',col.axis = 'red')
#wordcloud(hy_name,hy,random.order=F,col = rainbow(length(hy_name)))
######--------------------------------------##############
#學歷要求分析
xueli<-table(data_all[,9])
barplot(xueli,xlab = '學歷',ylab = '人數',main = '學歷要求統計圖',col = c('red','darkorange','darkgreen','gray34','lightblue1','lightcoral','lawngreen','tan4','tan'))
axis(2,col = 'blue',col.axis = 'red')

#學歷數按降序排列
xueli<-xueli[order(-xueli)]

sal<-c(1:length(xueli))
for(i in 1:length(xueli))
{
  p<-unlist(data_all[which(data_all[,9]==names(xueli[i])),8])
  index1<-which(p %in% NA)
  p<-p[-index1]
  q<-unlist(data_all[which(data_all[,9]==names(xueli[i])),10])[-index1]
  index2<-which(q %in% NA)
  #index2=0時,p<-p[-index2]操作會將p、q置為空
  if(length(index2)>0)
  {
    p<-p[-index2]
    q<-q[-index2]
  }
  sal[i]<-sum(p*q)/sum(q)
}
#畫學歷~平均工資
name0<-c(1:length(sal))
for(i in 1:length(sal))
{
  name0[i]<-paste0(as.character(i),'--',names(xueli[i]))
}
barplot(sal,col = c('red','green','blue','darkorange','brown'),ylim = c(0,20000),xlab = '學歷',ylab = '平均工資',main = '學歷平均工資分佈圖')
legend(list(x = 0.5,y = 20000),legend = name0,text.width = strwidth("2,000,0000"))
axis(1,col = 'blue',col.axis = 'darkorange')
axis(2,col = 'blue',col.axis = 'darkorange')

#經驗工資分析
exper<-table(data_all[,7])
barplot(exper,xlab = '經驗',ylab = '薪資',main = '經驗~薪資探索',col = c('darkblue','darkorange','darkgreen'))
axis(2,col = 'blue',col.axis = 'darkorange')

#按招聘次數降序,取前6名,後面的太少了
exper<-exper[order(-exper)][1:6]
which(data_all[,7] %in% NA)
#發現沒有缺失

exper_salary<-c(1:6)
for(i in 1:6)
{
  p<-unlist(data_all[which(data_all[,7]==names(exper[i])),8])
  index1<-which(p %in% NA)
  p<-p[-index1]
  q<-unlist(data_all[which(data_all[,7]==names(exper[i])),10])[-index1]
  index2<-which(q %in% NA)
  #index2=0時,p<-p[-index2]操作會將p、q置為空
  if(length(index2)>0)
  {
    p<-p[-index2]
    q<-q[-index2]
  }
  exper_salary[i]<-sum(p*q)/sum(q)
}
#畫經驗~平均工資
name0<-c(1:length(exper))
for(i in 1:length(exper))
{
  name0[i]<-paste0(as.character(i),'--',names(exper[i]))
}
barplot(exper_salary,col = c('red','green','blue','darkorange','brown','darkgreen'),ylim = c(0,16000),xlab = '經驗',ylab = '平均工資',main = '經驗~平均工資分佈圖')
legend(list(x = 0.5,y = 16000),legend = name0,text.width = strwidth("2,000,0000"))
axis(1,col = 'blue',col.axis = 'darkorange')
axis(2,col = 'blue',col.axis = 'darkorange')


#職位發展前景
zhiwei<-function(x){return(unlist(strsplit(x,'/'))[1])}
zhiwei0<-apply(data_all[,5],1,zhiwei)
#頻數統計並降序排列
zhiwei<-table(zhiwei0)
zhiwei<-zhiwei[order(-zhiwei)][1:10]

name0<-c(1:length(zhiwei))
for(i in 1:length(zhiwei))
{
  name0[i]<-paste0(as.character(i),' -- ',names(zhiwei[i]))
}
barplot(zhiwei,legend.text = names(zhiwei),ylim = c(0,80000),xlab = '職位型別',ylab = '招聘次數',main = '職位~招聘次數',col = c('red','darkorange','darkgreen','blue','gray34','lightblue1','lightblue','lawngreen','tan4','tan'))
axis(2,col = 'blue',col.axis = 'darkblue')

#地域
diyu<-function(x){return(unlist(strsplit(x,'-'))[1])}
data_all[,4]<-apply(data_all[,4],1,diyu)
diyu<-table(data_all[,4])
diyu<-diyu[order(-diyu)]
diyu_salary<-c(1:length(diyu))
#畫地域招聘次數圖

diyu0<-as.data.frame(diyu)
barplot(diyu0$Freq,legend.text = diyu0$Var1[1:16],xlab = '地域',ylab = '招聘次數',main = '地域~招聘次數',col = c('red','green','blue','orange','brown','grey','darkred','darkgreen','darkblue','darkorange','darkgrey','darkgray','gray34','lightblue1','lightcoral','lawngreen','tan4','tan'),ylim = c(0,max(diyu)+100),xlim = c(0,40))
axis(2,col = 'blue',col.axis = 'darkred')
for(i in 1:length(diyu))
{
  p<-unlist(data_all[which(data_all[,4]==names(diyu[i])),8])
  index1<-which(p %in% NA)
  p<-p[-index1]
  q<-unlist(data_all[which(data_all[,4]==names(diyu[i])),10])[-index1]
  index2<-which(q %in% NA)
  #index2=0時,p<-p[-index2]操作會將p、q置為空
  if(length(index2)>0)
  {
    p<-p[-index2]
    q<-q[-index2]
  }
  #求每個地域平均工資水平
  diyu_salary[i]<-sum(p*q)/sum(q)
}
name0<-c(1:length(diyu))
for(i in 1:length(diyu))
{
  name0[i]<-paste0(as.character(i),' -- ',names(diyu[i]))
}
#barplot(diyu_salary,legend.text = diyu0$Var1[1:10],xlab = '地域',ylab = '招聘次數',main = '地域~招聘次數',col = c('red','green','blue','orange','brown','darkred','darkgreen','darkblue','darkorange'),ylim = c(0,max(diyu_salary)+12000),xlim = c(0,40))

barplot(diyu_salary,xlab = '地域',ylab = '平均工資',main = '地域~平均工資',col = c('red','green','blue','orange','brown','darkred','darkgreen','darkblue','darkorange'),ylim = c(0,max(diyu_salary)+12000),xlim = c(0,40))
axis(1,col = 'darkorange',col.axis = 'darkblue')
axis(2,col = 'darkorange',col.axis = 'darkblue')
legend(list(x = 4,y = 20500),legend = name0[1:11],text.width = strwidth("2,000,0000"))
legend(list(x = 15,y = 20500),legend = name0[12:22],text.width = strwidth("2,000,0000"))
legend(list(x = 26,y = 20500),legend = name0[23:33],text.width = strwidth("2,000,0000"))

原始碼百度雲連結 密碼:ylmm

十年寒窗,未來?每個人都想找到心儀的工作,俗話說:只要是金子,到哪裡都會發光!在這些個炎熱、躁動的畢業季,最需要的恰恰是冷靜。