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

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

掌握jieba分词的用法

1.加载包

  1. library(devtools)
  2. library(tm)
  3. library(jiebaR)
  4. library(jiebaRD)
  5. library(tmcn)
  6. library(NLP)
    library(wordcloud2)

2.导入数据

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

3.清洗数据

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

4.移除感叹词

  1. removewords <- function(targetword,stopword){
  2. targetword = targetword[targetword%in%stopword == F]
  3. return(targetword)
  4. }
  5.  
  6. segword2 <- sapply(X=segword, FUN = removewords,stopwords)
  7. head(segword2)
  8.  
  9. segword2[[1]]
  10. length(unlist(segword))
  11. length(unlist(segword2))

5.绘制词云

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

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

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

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

数据集字段说明:

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

1.加载数据集

  1. library(readxl)
  2. library(jiebaR)
  3. library(jiebaRD)
  4. library(zoo)
  5. library(VIM)
  6. library(plyr)
  7. library(ggplot2)
  8. library(wordcloud2)

2.加载数据集

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

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

  1. # 查看是否有缺失值
  2. aggr(CN.df,prop=T,numbers=T)
  3.  
  4. # 返回分词频数表的排序
  5. top.freq <- function(x,topn=0){
  6. require(plyr)
  7. top.df <- count(x)
  8. top.df <- top.df[order(top.df$freq,decreasing = TRUE),]
  9. if(topn > 0) return(top.df[1:topn,])
  10. else return(top.df)
  11. }
  12.  
  13. # 排序
  14. reorder_size <- function(x,decreasing=T){
  15. factor(x,levels = names(sort(table(x),decreasing=decreasing)))
  16. }
  17.  
  18. # ggplot自定义主题
  19. my.ggplot.theme <- function(...,bg='white'){
  20. require('guid')
  21. theme_classic(...)+
  22. theme(rect = element_rect(fill = bg),
  23. plot.title = element_text(hjust = 0.5),
  24. text = element_text(family = 'STHeiti'),
  25. panel.background = element_rect(fill='transparent', color='#333333'),
  26. axis.line = element_line(color='#333333',size = 0.25),
  27. legend.key = element_rect(fill='transparent',colour = 'transparent'),
  28. panel.border = element_rect(fill='transparent',colour = 'transparent'),
  29. panel.grid = element_line(colour = 'grey95'),
  30. panel.grid.major = element_line(colour = 'grey92',size = 0.25),
  31. panel.grid.minor = element_line(colour = 'grey92',size = 0.1))
  32. }
  33.  
  34. # 多图展示
  35. mutiplot <- function(...,plotlist=NULL,file,cols=1,layout=NULL){
  36. library(grid)
  37. plots <- c(list(...),plotlist)
  38. numPlots <- length(plots)
  39. if(is.null(layout)){
  40. layout <- matrix(seq(1,cols*ceiling(numPlots/cols)),
  41. ncol = cols,
  42. nrow = ceiling(numPlots/cols))
  43. }
  44. if(numPlots == 1){
  45. print(plot[[1]])
  46. }
  47. else{
  48. grid.newpage()
  49. pushViewport(viewport(layout = grid.layout(nrow(layout),ncol(layout))))
  50. for(i in 1:numPlots){
  51. matchidx <- as.data.frame(which(layout==i,arr.ind = T))
  52. print(plots[[i]],vp=viewport(layout.pos.row = matchidx$row,layout.pos.col = matchidx$col))
  53. }
  54. }
  55. }

  结论:没有缺失值

4.数据清洗整理

  1. cleaning <- function(my.data){
  2. # 去掉重复值
  3. my.data <- my.data[!duplicated(my.data[c('title','campany','description')]),]
  4. # 计算平均月薪
  5. max_sal <- as.numeric(sub('([0-9]*).*','\\1',my.data$salary))
  6. min_sal <- as.numeric(sub('.*-([0-9]*).*','\\1',my.data$salary))
  7. my.data$avg_sal <- (max_sal+min_sal)/2
  8.  
  9. #清理不需要的字符,将需要分析的字符转换成因子
  10. my.data$city <- factor(gsub('[/]*','',my.data$city))
  11.  
  12. my.data$experience <- gsub('经验|[/ ]*','',my.data$experience)
  13. my.data$experience[my.data$experience %in% c('不限','应届毕业生')] <- '1年以下'
  14. my.data$experience<- factor(my.data$experience,
  15. levels = c('1年以下','1-3年','3-5年','5-10年','10年以上'))
  16. my.data$education <- gsub('学历|及以上|[/ ]*','',my.data$education)
  17. my.data$education[my.data$education == '不限'] <- '大专'
  18. my.data$education <- factor(my.data$education,
  19. levels = c('大专','本科','硕士'))
  20. my.data$phase <- factor(gsub('[\n]*','',my.data$phase),
  21. levels=c('不需要融资','未融资','天使轮','A轮','B轮','C轮','D轮及以上','上市公司'))
  22. my.data$campany <- gsub('[\n| ]*','',my.data$campany)
  23. my.data$scale <- factor(gsub('.*(少于15人|15-50人|50-150人|150-500人|500-2000人|2000人以上).*',
  24. '\\1',paste(my.data$scale,my.data$scale2)),
  25. levels =c("少于15人","15-50人","50-150人","150-500人","500-2000人","2000人以上"))
  26. my.data$id <- index(my.data)
  27. my.data <- droplevels(subset(my.data,select=-scale2))
  28. return(my.data)
  29. }
  30.  
  31. CN.clean <- cleaning(CN.df)
  32. str(CN.clean)

  结论:转化成结构化数据

5.开始进行分词统计

  1. # 采用默认的jieba分词器
  2. engine <- worker(user = 'E://Udacity//R//R-3.4.3//library//jiebaRD//dict//user.dict.utf8',encoding = 'UTF-8')
  3. # 去除无关的词
  4. word.lis <- lapply(CN.clean$description, function(x){
  5. v <- gsub('[\u4e00-\u9fa5|0-9|\\.|\\-]','',segment(x,engine))
  6. v <- v[v!='']
  7. return(v)
  8. })
  9. # 所有的词语转化成大写,避免出现大小写的错误
  10. segWord <- toupper(unlist(word.lis))
  11. # 加载stop词语列表
  12. stopWords <- toupper(readLines('E://Udacity//R//R-3.4.3//library//jiebaRD//dict//stop_words.utf8',encoding = 'UTF-8'))
  13.  
  14. # 过滤分词
  15. # 此处确保我要得到的前15个关键技能是正确的数据分析技能
  16. removewords <- function(targetword,stopword){
  17. targetword = targetword[targetword%in%stopword == F]
  18. return(targetword)
  19. }
  20.  
  21. segword<- sapply(X=segWord, FUN = removewords,stopWords)
  22.  
  23. word_freq <- top.freq(unlist(segword),15)
  24.  
  25. # 成有id和keyword构建的数据框
  26. id <- NULL
  27. keyword <- NULL
  28. for(i in index(word.lis)){
  29. id <- c(id,rep(i,length(word.lis[[i]])))
  30. keyword <- c(keyword,word.lis[[i]])
  31. }
  32. keyword.df <- data.frame("id"=id,"keyword"=toupper(keyword))
  33. keyword.df <- droplevels(keyword.df[keyword.df$keyword %in% word_freq$x,])
  34.  
  35. merge.df <- merge(CN.clean,keyword.df,by = 'id')
  36.  
  37. summary(merge.df)

6.生成词云的常用词

  1. #提取非技能型关键词
    keys <- worker(type = "keywords",
  2. user = "E://Udacity//R//R-3.4.3//library//jiebaRD//dict//user.dict.utf8",
  3. topn = 20,
  4. encoding = 'UTF-8',
  5. stop_word = "E://Udacity//R//R-3.4.3//library//jiebaRD//dict//stop_words.utf8")
  6. keyword.lis <- lapply(CN.clean$description, function(x){
  7. v <- gsub("[a-zA-Z|0-9|\\.|\\-]","",keywords(x,keys))
  8. v <- v[v!=""]
  9. return(v)
  10. })
  11. keyword.lis <- unlist(keyword.lis)
  12. #形成词频表
  13. not.tool.keyword <- top.freq(keyword.lis)
  14. str(not.tool.keyword)

7.查看数据集

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

8.通过数据集回答问题

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8.8 绘制词云

  1. 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语言-文本挖掘的更多相关文章

  1. R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言·文本挖掘︱Rwordseg/rJava ...

  2. R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:与前面的RsowballC分词不同的 ...

  3. R语言︱文本挖掘套餐包之——XML+SnowballC+tm包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言︱文本挖掘套餐包之--XML+tm+Sn ...

  4. R语言︱文本挖掘——jiabaR包与分词向量化的simhash算法(与word2vec简单比较)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- <数据挖掘之道>摘录话语:虽然我比 ...

  5. R语言文本挖掘+词云显示(jiebaR包+wordcloud2包)

    利用2018年政府工作报告的例子向大家展示一下R语言如何进行文本挖掘的~用到的包有jiebaR和wordcloud2. 1.安装并加载jiebaR install.packages("jie ...

  6. R语言︱文本挖掘——词云wordcloud2包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者看到微信公众号探数寻理中提到郎大为Chif ...

  7. R语言 文本挖掘 tm包 使用

    #清除内存空间 rm(list=ls()) #导入tm包 library(tm) library(SnowballC) #查看tm包的文档 #vignette("tm") ##1. ...

  8. R+tmcn笔记︱tmcn包的基本内容以及李舰老师R语言大会展示内容摘录

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- tmcn包目前托管在在R-forge 上开发和 ...

  9. R语言︱情感分析—词典型代码实践(最基础)(一)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:词典型情感分析对词典要求极高,词典中 ...

随机推荐

  1. 【Unity3D】Unity3D开发《我的世界》之五、创建无限地形(视频)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_05.html 一.导入Unity3D自带的第一人称角色控制器 直接导入就行,我们用 ...

  2. Maven就是这么简单

    什么是Maven Maven是一个采用纯Java编写的开源项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,所有的项目配置信息都被定义在一 ...

  3. FFMPEG在windows平台编译的详细过程,包括环境安装

    下面开始: 由于FFMpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译.要想使用FFMpeg ...

  4. 一种在BIOS中嵌入应用程序的方法及实现

    本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理对别的品牌的BIOS也一样适用,仅需稍加修改.文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证.  正 ...

  5. JSP标签c:forEach报错(二)

    1.今天,我在用c标签写一些样例,结果出现一些错误,写下作为记录 具体错误如下: 三月 31, 2014 9:46:28 下午 org.apache.catalina.core.StandardWra ...

  6. 【mongodb系统学习之十一】mongodb删除数据

    十一.mongodb删除数据: 1).删除全部文档:remove,语法db.collectionName.remove({}):小括号里边必须要有条件,否则不成功:如果只是一个空的{},则会删除集合内 ...

  7. Java中的表达式运算

    1.问题背景    以下代码运行的结果为:    A.a的值:8   b的值:7           B.a的值:8  b的值:8    C.a的值:9   b的值:7           D.a的值 ...

  8. windows下键盘常用快捷键整理

    以下快捷键均在win7环境下测试有效: 声明:本博文由多篇博文经实测整理而出. win键相关的快捷键多用于桌面场景,如开起资源管理器.切换任务窗口.最大化最小化窗口等等. 场景一: 1. 任何情况下想 ...

  9. Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8515304.html 一.AsyncTask的使用 AsyncTask是一种轻 ...

  10. @SuppressWarnings("unchecked")(解决标准的后台HttpServletRequest request, HttpServletResponse response)格式

    在springmvc的应用中有些限制会出现必须是 public void save(HttpServletRequest request, HttpServletResponse response) ...