R语言-文本挖掘

摘要:
---恢复内容开始---案例1:对主席的新年致辞进行分词,绘制出词云掌握jieba分词的用法1.加载包library(devtools)library(tm)library(jiebaR)library(jiebaRD)library(tmcn)library(NLP)library(wordcloud2)2.导入数据news˂-readLines('E:\Udacity\DataAnalysis

---恢复内容开始---

案例1:对主席的新年致辞进行分词,绘制出词云

掌握jieba分词的用法

1.加载包

library(devtools)
library(tm)
library(jiebaR)
library(jiebaRD)
library(tmcn)
library(NLP)
library(wordcloud2)

2.导入数据

news <- readLines('E:\Udacity\Data Analysis High\R\R_Study\高级课程代码\数据集\第一天\2文本挖掘\xitalk2017.txt',encoding='UTF-8')
head(news)

R语言-文本挖掘第1张

3.清洗数据

#去除新闻中的英文
gsub('[0-9,a-z,A-Z]','',news) ->news 
segword_tmp =worker()
segword = segword_tmp <=news
#加载停用词表
stopwords = readLines('E:\Udacity\Data Analysis High\R\R_Study\第一天数据\中文停用词表.txt',encoding='UTF-8')
head(stopwords,10)

4.移除感叹词

removewords <-function(targetword,stopword){
  targetword = targetword[targetword%in%stopword ==F]
  return(targetword)
}
segword2 <- sapply(X=segword, FUN =removewords,stopwords)
head(segword2)
segword2[[1]]
length(unlist(segword))
length(unlist(segword2))

R语言-文本挖掘第2张

5.绘制词云

letterCloud(word_freq, word = 'R',color = 'random-dark',backgroundColor = "snow")
wordcloud2(word_freq, size = 1,shape = 'circle')

R语言-文本挖掘第3张

案例2:通过拉勾网的数据进行分析,找出数据分析师相关的城市,薪水,工作年限等信息

数据集下载:链接:https://pan.baidu.com/s/1Bz7mA_dnvD1MGTVrZKyhPA 密码:layp

目的:掌握文本分析,数据报表结论展示

数据集字段说明:

字段        描述                        用途
id         唯一标识           与数据库表主键功能类似,用于处理表关联
title       岗位名称          作为岗位的标识,与雇主和岗位描述组合成唯一标识
company     公司名称         作为雇主的标识
salary      平均月薪(k)       用于平均月薪的分析
city        工作所在城市       用于分析地域
scale       规模            用于区别企业的指标
phase       融资/发展阶段      用于区别企业的指标
experience  职位经验要求       分析工作经验的影响
education   学历要求         分析学历的影响
description 职位描述         用于文本挖掘,做岗位需求技能分析

1.加载数据集

library(readxl)
library(jiebaR)
library(jiebaRD)
library(zoo)
library(VIM)
library(plyr)
library(ggplot2)
library(wordcloud2)

2.加载数据集

CN.df <- read_excel('E:\Udacity\Data Analysis High\R\R_Study\CN_lagou_jobdata.xlsx',1)
CN.df <- CN.df[,c('title','salary','experience','education','campany','scale','scale2','description','phase','city')]
str(CN.df)

R语言-文本挖掘第4张

3.查看是否有缺失值,以及常用函数的定义

#查看是否有缺失值
aggr(CN.df,prop=T,numbers=T)
#返回分词频数表的排序
top.freq <- function(x,topn=0){
  require(plyr)
  top.df <-count(x) 
  top.df <- top.df[order(top.df$freq,decreasing =TRUE),]
  if(topn > 0) return(top.df[1:topn,])
  else  return(top.df)
}
#排序
reorder_size <- function(x,decreasing=T){
  factor(x,levels = names(sort(table(x),decreasing=decreasing)))
}
#ggplot自定义主题
my.ggplot.theme <- function(...,bg='white'){
  require('guid')
  theme_classic(...)+
    theme(rect = element_rect(fill =bg),
          plot.title = element_text(hjust = 0.5),
          text = element_text(family = 'STHeiti'),
          panel.background = element_rect(fill='transparent', color='#333333'),
          axis.line = element_line(color='#333333',size = 0.25),
          legend.key = element_rect(fill='transparent',colour = 'transparent'),
          panel.border = element_rect(fill='transparent',colour = 'transparent'),
          panel.grid = element_line(colour = 'grey95'),
          panel.grid.major = element_line(colour = 'grey92',size = 0.25),
          panel.grid.minor = element_line(colour = 'grey92',size = 0.1))
}
#多图展示
mutiplot <- function(...,plotlist=NULL,file,cols=1,layout=NULL){
  library(grid)
  plots <-c(list(...),plotlist)
  numPlots <-length(plots)
  if(is.null(layout)){
    layout <- matrix(seq(1,cols*ceiling(numPlots/cols)),
                     ncol =cols,
                     nrow = ceiling(numPlots/cols))
  }
  if(numPlots == 1){
    print(plot[[1]])
  }
  else{
    grid.newpage()
    pushViewport(viewport(layout =grid.layout(nrow(layout),ncol(layout))))
    for(i in 1:numPlots){
      matchidx <- as.data.frame(which(layout==i,arr.ind =T))
      print(plots[[i]],vp=viewport(layout.pos.row = matchidx$row,layout.pos.col =matchidx$col))
    }
  }
}

R语言-文本挖掘第5张

结论:没有缺失值

4.数据清洗整理

cleaning <-function(my.data){
  #去掉重复值
  my.data <- my.data[!duplicated(my.data[c('title','campany','description')]),]
  #计算平均月薪
  max_sal <- as.numeric(sub('([0-9]*).*','\1',my.data$salary))
  min_sal <- as.numeric(sub('.*-([0-9]*).*','\1',my.data$salary))
  my.data$avg_sal <- (max_sal+min_sal)/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('[
]*','',my.data$phase),
                        levels=c('不需要融资','未融资','天使轮','A轮','B轮','C轮','D轮及以上','上市公司'))
  my.data$campany <- gsub('[
| ]*','',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)

R语言-文本挖掘第6张

结论:转化成结构化数据

5.开始进行分词统计

#采用默认的jieba分词器
engine <- worker(user = 'E://Udacity//R//R-3.4.3//library//jiebaRD//dict//user.dict.utf8',encoding = 'UTF-8')
#去除无关的词
word.lis <-lapply(CN.clean$description, function(x){
  v <- gsub('[u4e00-u9fa5|0-9|\.|\-]','',segment(x,engine))
  v <- v[v!='']
  return(v)
})
#所有的词语转化成大写,避免出现大小写的错误
segWord <-toupper(unlist(word.lis))
#加载stop词语列表
stopWords <- toupper(readLines('E://Udacity//R//R-3.4.3//library//jiebaRD//dict//stop_words.utf8',encoding = 'UTF-8'))
#过滤分词
#此处确保我要得到的前15个关键技能是正确的数据分析技能
removewords <-function(targetword,stopword){
  targetword = targetword[targetword%in%stopword ==F]
  return(targetword)
}
segword<- sapply(X=segWord, FUN =removewords,stopWords)
word_freq <- top.freq(unlist(segword),15)
#成有id和keyword构建的数据框
id <-NULL
keyword <-NULL
for(i inindex(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%word_freq$x,])
merge.df <- merge(CN.clean,keyword.df,by = 'id')
summary(merge.df)

R语言-文本挖掘第7张

6.生成词云的常用词

#提取非技能型关键词
keys <- worker(type = "keywords", user = "E://Udacity//R//R-3.4.3//library//jiebaRD//dict//user.dict.utf8", topn = 20, encoding = 'UTF-8', stop_word = "E://Udacity//R//R-3.4.3//library//jiebaRD//dict//stop_words.utf8") 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)

R语言-文本挖掘第8张

7.查看数据集

attach(CN.clean)
#观测数据清洗后的统计信息summary(CN.clean[c("city","phase","scale","education","experience","avg_sal")])

R语言-文本挖掘第9张

8.通过数据集回答问题

8.1不同地区的数据分析师岗位的薪资和需求的分布

#创建ggplot绘图对象
p.cn <- ggplot(CN.clean) +my.ggplot.theme()
city.table <-data.frame(prop.table(table(reorder_size(city,T))))
names(city.table)[1] <- 'city'
p1 <- ggplot(city.table,aes(x=city,y=Freq))+
  my.ggplot.theme()+
  geom_bar(fill='turquoise3',stat = 'identity')+
  labs(x='城市',y='不同城市需求占总量的比率')+
  scale_y_continuous(labels =scales::percent)
group_diff <- diff(range(avg_sal))/20
p2 <- p.cn+geom_histogram(aes(x=avg_sal,y=..density..),
                          binwidth = group_diff,fill='turquoise3',color='white')+
  stat_density(geom = 'line',position = 'identity',aes(x=avg_sal),color='brown1')+
  labs(x='月薪(K/月)')
mutiplot(p1,p2,cols = 1)

R语言-文本挖掘第10张

R语言-文本挖掘第11张

结论:1.北京,上海,杭州,深圳,广州”占据了近90%的需求量,是数据分析师的首选

2.数据分析师平均月薪为18.22k,月薪的分布主要集中在10k~25k之间,拿到10k以上薪资的机会比较大

CN.clean$type<-NA
CN.clean$type[CN.clean$city %in% top.freq(city,5)$x] <- 'top5'
CN.clean$type[is.na(CN.clean$type)] <- 'other'
CN.clean$type <- factor(CN.clean$type,levels = c('top5','other'))
p.cn+geom_boxplot(aes(x=city,y=avg_sal,fill=CN.clean$type))+
  labs(x='城市',y='月薪(K/月)',fill='需求量排名')+
  theme(axis.text.x=element_text(angle = 30,hjust = 1) )

R语言-文本挖掘第12张

结论:需求量最多的5个城市的平均薪资均处于全国较高的水平,苏州是一个特例,需求量少,薪资高

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

exp.table <-prop.table(table(experience))
exp.table <-as.data.frame(exp.table)
p3 <- ggplot(exp.table,aes(x=experience,y=Freq))+
  my.ggplot.theme()+
  geom_bar(fill='turquoise3',stat = 'identity')+
  labs(x='工作经验',y='不同工作经验需求占总量的比率')+
  scale_y_continuous(labels =scales::percent)
p4 <- p.cn + geom_boxplot(aes(x=experience,y=avg_sal),fill='turquoise3')+
  labs(x='工作经验',y='平均月薪(K/月)')
mutiplot(p3,p4,cols = 2)

R语言-文本挖掘第13张

结论:1.企业需要更有经验的分析师,主要需求集中在1-3年和3-5年经验

2.随着工作经验的增加,数据分析师的月薪有非常可观的增长

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

edu.table <-prop.table(table(education))
edu.table <-as.data.frame(edu.table)
p5 <- ggplot(edu.table,aes(x=education,y=Freq))+
  my.ggplot.theme()+
  geom_bar(fill='turquoise3',stat = 'identity')+
  labs(x='学历',y='不同学历占总量的比率')+
  scale_y_continuous(labels =scales::percent)
p6 <- p.cn + geom_boxplot(aes(x=education,y=avg_sal),fill='turquoise3')+
  labs(x='学历',y='平均月薪(K/月)')
mutiplot(p5,p6,cols = 2)

R语言-文本挖掘第14张

结论:1.超过90%的岗位需要本科及以上的学历

2.学历随着工作经验的增长不是太明显

8.4 不同企业规模,数据分析岗位的各项需求分布及薪资分布

scale.table <-data.frame(prop.table(table(scale)))
p7 <- ggplot(scale.table,aes(x=scale,y=Freq))+
  my.ggplot.theme()+
  geom_bar(fill='turquoise3',stat = 'identity')+
  labs(x='企业规模',y='不同企业规模需求占总量的比率')+
  theme(axis.text.x = element_text(angle = 30,hjust = 1))+
  scale_y_continuous(labels =scales::percent)
p8 <- p.cn + geom_boxplot(aes(x=scale,y=avg_sal),fill='turquoise3')+
  labs(x='企业规模',y='平均月薪(K/月)')+
  theme(axis.text.x = element_text(angle = 30,hjust = 1))
mutiplot(p7,p8,cols = 2)

R语言-文本挖掘第15张

结论:1.企业规模越大越需要数据分析师的岗位

2.企业的规模越大,薪水越高

8.5企业规模与工作经验要求分析

sc.exp <- data.frame(prop.table(table(scale,experience),1))
ggplot(data=sc.exp,aes(x=scale,y=Freq,fill=experience))+
  my.ggplot.theme()+
  geom_bar(stat = 'identity')+
  labs(x='企业规模',y='需求比例',fill='工作经验')+
  geom_text(aes(label=paste(round(sc.exp$Freq,3)*100,'%',sep = '')),
            colour='white',position = position_stack(.5),vjust=00)+
  scale_y_continuous(labels = scales::percent)

R语言-文本挖掘第16张

结论:综合来看50-150人的企业和2000人以上的企业对工作经验比较看重

8.6 数据分析岗位对工具型技能的需求

key.df <-data.frame(table(reorder_size(merge.df$keyword,TRUE)))
key.df$Freq <- key.df$Freq/length(CN.clean$id)
ggplot(key.df)+my.ggplot.theme() +
  geom_bar(aes(x=Var1,y=Freq),fill = "turquoise3",stat = "identity") +
  labs(x="工具型技能",y="不同技能需求占总岗位需求量的比率") +
  theme(axis.text.x = element_text(angle = 30,hjust = 1))+
  geom_text(aes(x=Var1,y=Freq,label=paste(round(key.df$Freq,3)*100,'%',sep = '')),vjust=-0.2)+
  scale_y_continuous(labels = scales::percent)

R语言-文本挖掘第17张

结论:SQL,R,Python,Excel是数据分析师的必备技能,超过78%的岗位都要求掌握SQL,SQL是数据分析师的必备技能,R语言的需求量居于第二

8.7 工具型技能与薪资的分析

merge.df$type <-NA
merge.df$type[merge.df$keyword %in% top.freq(merge.df$keyword,5)$x] <- 'top5'
merge.df$type[is.na(merge.df$type)] <- 'other'
merge.df$type <- factor(merge.df$type,levels = c('top5','other'))
ggplot(merge.df)+my.ggplot.theme()+
  geom_boxplot(aes(x=keyword,y=avg_sal,fill=merge.df$type))+
  labs(x ='工具型技能',y='平均月薪(K/月)',fill='需求量排名')+
  theme(axis.text.x = element_text(angle = 30,hjust = 1))

R语言-文本挖掘第18张

结论:收入最高的数据分析技能是HADOOP,HIVE,SPARK,R,PYTHON

8.8 绘制词云

wordcloud2(not.tool.keyword,size = 0.9,fontFamily = '微软雅黑')

R语言-文本挖掘第19张

结论:1.从地域上看北京,上海,深圳,广州,杭州市数据分析师的首选城市,苏州也是一个可选城市,但是需求量较低

2.从企业方来看,企业更需要具备工作经验,解决实际问题的人才,随着工作年限的增加,对应的薪资也有可观的增长

3.从大环境看,由于很多自动化分析软件的普及,使得现有的业务人员也可以快速的转行进行数据分析,所以对新手来说并不是很友好

4.50-150人的企业比较适合新人去锻炼增加经验值,此外越大的公司对数据分析人才的需求量越大

5.从分析师的角度来说则更需要注重项目的积累和新技术的掌握,相对于业务方向,数据挖掘会有更加可观的薪资

6.数据分析师需要掌握SQL,R,PYTHON,EXCEL四种必备工具,如果想转行大数据开发,则需要掌握HADOOP,HIVE,SPARK

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

数据集:https://github.com/Mounment/R-Project

免责声明:文章转载自《R语言-文本挖掘》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇自己画WinForm 皮肤包括默认控件1 of ORDER BY clause is not in SELECT list, references column 'xxx' which is not in SELECT list下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ES数据架构与关系数据库Mysql

ES数据架构的主要概念(与关系数据库Mysql对比)     MySQL     ElasticSearch Database Index Table Type Row Document Column Field Schema Mapping Index Everything is indexed SQL Query DSL...

用PowerDesigner15自动将数据库里的表生成ER图

Sybase的PowerDesigner可以将数据库里的表关系反应到ER中。   操作方法:   一,配置Windows ODBC(也可根据不同数据库选择相应jar的方式连接数据库)   控制面板=>管理工具=>数据源(ODBC) 点击添加=>名称选择 sql server =>数据源名称项填写一个标识符(mydb) 用户名称填写要...

在workbench中导入.sql文件!(导入数据库文件)

第一步,登陆mysql workbench 第二步,打开自己的数据 ,此处默认(root) 打开数据库后页面 : 第三步,新建一个schema ,随便给个名字,这里起名为test : 可以看到test 内的table ,views,routines,等选项都是没有任何内容的。 第四步 ,在file 下打开你需要导入的.sql 文件。...

Oracle 性能优化 — 统计数据收集

ORACLE优化器的优化方式有两大类,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO)。 A、 RBO方式:优化器在分析SQL语句时,更据数据库中表和索引等定义信息,遵循的是Oracle内部预定的一些规则。比如我们常见的:当一个wher...

疫情数据背后,聊聊数据分析平台变迁史

今年年初这场突如其来的疫情,让我们早晨醒来打开手机的第一件事情,从刷朋友圈变成了刷每日最新的疫情数据。看看国内外新增确诊人数/现存确诊人数,看看国内外疫情分布的地图。各大新闻平台也因为快速上线疫情实时动态板块,成为了大家了解疫情发展的阵地。 其实,在这背后是有着一个海量数据分析的架构平台做支撑。 对于很多企业的管理人员而言,这就是个很熟悉的T+1计算T日...

C# 异步读取数据库里面的数据与绑定UI的解决办法

异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程。例如下面代码 首先按习惯的方法,设定线程更新UI a2.CheckForIllegalCrossThreadCalls = false; //a2为窗体名称 下面的代码就是从数据库里取得数据并绑定 private void button1_Click(object...