R语言-文本挖掘
---恢复内容开始---
案例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)
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))
5.绘制词云
- letterCloud(word_freq, word = 'R',color = 'random-dark',backgroundColor = "snow")
- wordcloud2(word_freq, size = 1,shape = 'circle')
案例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)
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))
- }
- }
- }
结论:没有缺失值
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('[\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)
结论:转化成结构化数据
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 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% word_freq$x,])
- merge.df <- merge(CN.clean,keyword.df,by = 'id')
- summary(merge.df)
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)
7.查看数据集
- attach(CN.clean)
- #观测数据清洗后的统计信息
summary(CN.clean[c("city","phase","scale","education","experience","avg_sal")])
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)
结论: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) )
结论:需求量最多的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)
结论: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)
结论: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)
结论: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)
结论:综合来看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)
结论: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))
结论:收入最高的数据分析技能是HADOOP,HIVE,SPARK,R,PYTHON
8.8 绘制词云
- wordcloud2(not.tool.keyword,size = 0.9,fontFamily = '微软雅黑')
结论:1.从地域上看北京,上海,深圳,广州,杭州市数据分析师的首选城市,苏州也是一个可选城市,但是需求量较低
2.从企业方来看,企业更需要具备工作经验,解决实际问题的人才,随着工作年限的增加,对应的薪资也有可观的增长
3.从大环境看,由于很多自动化分析软件的普及,使得现有的业务人员也可以快速的转行进行数据分析,所以对新手来说并不是很友好
4.50-150人的企业比较适合新人去锻炼增加经验值,此外越大的公司对数据分析人才的需求量越大
5.从分析师的角度来说则更需要注重项目的积累和新技术的掌握,相对于业务方向,数据挖掘会有更加可观的薪资
6.数据分析师需要掌握SQL,R,PYTHON,EXCEL四种必备工具,如果想转行大数据开发,则需要掌握HADOOP,HIVE,SPARK
7.数据分析师还需要注重逻辑思维、表达沟通、分析报告、报告书写等关键能力
数据集:https://github.com/Mounment/R-Project
R语言-文本挖掘的更多相关文章
- R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言·文本挖掘︱Rwordseg/rJava ...
- R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:与前面的RsowballC分词不同的 ...
- R语言︱文本挖掘套餐包之——XML+SnowballC+tm包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言︱文本挖掘套餐包之--XML+tm+Sn ...
- R语言︱文本挖掘——jiabaR包与分词向量化的simhash算法(与word2vec简单比较)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- <数据挖掘之道>摘录话语:虽然我比 ...
- R语言文本挖掘+词云显示(jiebaR包+wordcloud2包)
利用2018年政府工作报告的例子向大家展示一下R语言如何进行文本挖掘的~用到的包有jiebaR和wordcloud2. 1.安装并加载jiebaR install.packages("jie ...
- R语言︱文本挖掘——词云wordcloud2包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者看到微信公众号探数寻理中提到郎大为Chif ...
- R语言 文本挖掘 tm包 使用
#清除内存空间 rm(list=ls()) #导入tm包 library(tm) library(SnowballC) #查看tm包的文档 #vignette("tm") ##1. ...
- R+tmcn笔记︱tmcn包的基本内容以及李舰老师R语言大会展示内容摘录
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- tmcn包目前托管在在R-forge 上开发和 ...
- R语言︱情感分析—词典型代码实践(最基础)(一)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:词典型情感分析对词典要求极高,词典中 ...
随机推荐
- 【Unity3D】Unity3D开发《我的世界》之五、创建无限地形(视频)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_05.html 一.导入Unity3D自带的第一人称角色控制器 直接导入就行,我们用 ...
- Maven就是这么简单
什么是Maven Maven是一个采用纯Java编写的开源项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,所有的项目配置信息都被定义在一 ...
- FFMPEG在windows平台编译的详细过程,包括环境安装
下面开始: 由于FFMpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译.要想使用FFMpeg ...
- 一种在BIOS中嵌入应用程序的方法及实现
本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理对别的品牌的BIOS也一样适用,仅需稍加修改.文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证. 正 ...
- JSP标签c:forEach报错(二)
1.今天,我在用c标签写一些样例,结果出现一些错误,写下作为记录 具体错误如下: 三月 31, 2014 9:46:28 下午 org.apache.catalina.core.StandardWra ...
- 【mongodb系统学习之十一】mongodb删除数据
十一.mongodb删除数据: 1).删除全部文档:remove,语法db.collectionName.remove({}):小括号里边必须要有条件,否则不成功:如果只是一个空的{},则会删除集合内 ...
- Java中的表达式运算
1.问题背景 以下代码运行的结果为: A.a的值:8 b的值:7 B.a的值:8 b的值:8 C.a的值:9 b的值:7 D.a的值 ...
- windows下键盘常用快捷键整理
以下快捷键均在win7环境下测试有效: 声明:本博文由多篇博文经实测整理而出. win键相关的快捷键多用于桌面场景,如开起资源管理器.切换任务窗口.最大化最小化窗口等等. 场景一: 1. 任何情况下想 ...
- Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8515304.html 一.AsyncTask的使用 AsyncTask是一种轻 ...
- @SuppressWarnings("unchecked")(解决标准的后台HttpServletRequest request, HttpServletResponse response)格式
在springmvc的应用中有些限制会出现必须是 public void save(HttpServletRequest request, HttpServletResponse response) ...