基于30多万条招聘信息的热门城市、地域 、薪资、人才要求的R语言数据可视化分析

版权声明:转载请注明出处! https://blog.csdn.net/ddxygq/article/details/81429141

又是一年毕业季,什么工作好找、工资高、哪些地域有优势等就是很多人关注的话题了。这里用一份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

十年寒窗,未来?每个人都想找到心仪的工作,俗话说:只要是金子,到哪里都会发光!在这些个炎热、躁动的毕业季,最需要的恰恰是冷静。

猜你喜欢

转载自blog.csdn.net/ddxygq/article/details/81429141
今日推荐