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
轉載于:https://www.cnblogs.com/luhuajun/p/8654854.html
總結
- 上一篇: python基础准备
- 下一篇: Groovy 设计模式 -- 抽象工厂