当当网 R 语言学习资料统计分析
當當網(wǎng) R 語言學習資料統(tǒng)計分析
- 一、網(wǎng)絡(luò)數(shù)據(jù)的抓取
- 二、數(shù)據(jù)清洗與保存
- (一)工作目錄的修改
- (二)導入數(shù)據(jù)并修改列名
- 1. 交互式編輯器
- 2. names()函數(shù)
- 3. rename()函數(shù)
- (三)數(shù)據(jù)的處理和數(shù)據(jù)類型的轉(zhuǎn)化
- 1. 書名的提取
- 2. 價格中刪去“¥”并轉(zhuǎn)化數(shù)據(jù)類型
- 3. 折扣和評論數(shù)轉(zhuǎn)為數(shù)值型
- 4. 出版時間的轉(zhuǎn)化和判斷
- (四)缺失值的處理
- 1. 滿減和折扣
- 2. 出版時間數(shù)據(jù)缺失
- 3. 出版社的缺失
- (五)結(jié)果的保存
- 三、數(shù)據(jù)分析
- (一)出版社數(shù)據(jù)
- (二)日期時間的比較
- (三)分析評論數(shù)
- (四)基本作圖與數(shù)據(jù)統(tǒng)計
- (五)根據(jù)價格,標簽,評論數(shù)對書籍打分
- 四、分析總結(jié)
- 五、完整代碼
一、網(wǎng)絡(luò)數(shù)據(jù)的抓取
數(shù)據(jù)通過數(shù)據(jù)抓取軟件八爪魚進行抓取,進入當當網(wǎng)頁面,頁面中搜索“R語言”,將目標網(wǎng)址導入八爪魚軟件中,經(jīng)過軟件內(nèi)的一系列操作,爬取了 300條與“R 語言”相關(guān)的書籍數(shù)據(jù),包括但不限于書名,作者,價格,出版社,折扣信息,評論數(shù)等數(shù)據(jù),爬取完成后將數(shù)據(jù)保存為 csv 文件,命名為 dangdang.csv,放置在 F 盤根目錄下以備調(diào)用。初始數(shù)據(jù)如下圖所示dangdang.csv
二、數(shù)據(jù)清洗與保存
數(shù)據(jù)爬取完成后,將數(shù)據(jù)導入 R 語言環(huán)境中。
(一)工作目錄的修改
打開 RStudio,首先查看工作目錄,工作目錄是 R 語言運行結(jié)果、圖片文件、導出數(shù)據(jù)的默認路徑,所以要先對工作目錄進行修改。使用 getwd()來查看工作目錄,使用 setwd()修改工作目錄。
> #查看工作目錄 > getwd() [1] "C:/Users/sea20/Documents" > #更改工作目錄 > setwd("D:/sea20/documents") > getwd() [1] "D:/sea20/documents"修改完成后再次查看即可發(fā)現(xiàn)工作目錄修改到了"D:/sea20/documents"。
(二)導入數(shù)據(jù)并修改列名
數(shù)據(jù)可以使用 read.table()函數(shù)導入,其中第一個參數(shù)是目標文件,header=T表示導入的數(shù)據(jù)首行包含了變量名,sep 指定文件以“,”分隔,encoding 參數(shù)防止出現(xiàn)中文亂碼的問題。
a <- read.table("F:/dangdang.csv",header = T, sep = ",",encoding = "UTF-8")使用 head()函數(shù)查看導入數(shù)據(jù)的前面幾行,可以發(fā)現(xiàn)數(shù)據(jù)非常混亂,變量名稱也比較雜亂缺少代表性,數(shù)據(jù)的清洗整理必不可少。
首先是列名的修改,本文提供三種方法,先用 names()查看整體列名
1. 交互式編輯器
通過 fix( )函數(shù)調(diào)用交互式的編輯器,然后單擊變量名,在彈出的對話框中將其重命名,在對話框中還可以進行數(shù)據(jù)類型的簡單修改。
2. names()函數(shù)
names()返回列名的向量,可以通過修改向量中的值來修改列名
names(a)[1] <- "書名"3. rename()函數(shù)
rename()函數(shù)的使用要借助 reshape 包,所有首先要下載 reshape 包,install.packages(“reshape”),下載完成后通過 library(reshape)調(diào)用包,其實就是在R 語言環(huán)境中將包中包含的函數(shù)整體運行一遍,方便之后的使用。
install.packages("reshape") library(reshape) a <- rename(a, c(評論 = "評論數(shù)",作者 9 = "出版時間",作者 11 = "出版社")) names(a)列名修改完成后再使用 names()查看當前的列名。
命令 search()可以查看那些包已加載并可使用。
(三)數(shù)據(jù)的處理和數(shù)據(jù)類型的轉(zhuǎn)化
1. 書名的提取
觀察數(shù)據(jù)可以發(fā)現(xiàn),第一列中書名非常混亂,里面包括書名,書籍簡介,還有空格作為分隔符號,所以使用 strsplit()函數(shù)對數(shù)據(jù)進行處理,準確提取出書名。
首先將第一列數(shù)據(jù)賦值給 title,觀察數(shù)據(jù)類型和格式,使用 strsplit()函數(shù)以空格作為分隔符,將 title 分隔成若干小片段,之后使用 for 循環(huán)語句將分割后的小片段提取出第二部分(觀察數(shù)據(jù)發(fā)現(xiàn)第二部分為書名),代碼及結(jié)果如下
2. 價格中刪去“¥”并轉(zhuǎn)化數(shù)據(jù)類型
起初嘗試 sub, gsub 等方法,并沒有好的效果,之后想到 substr()函數(shù),直接提取從第二位開始的值,免去了字符修改的麻煩。轉(zhuǎn)化之后數(shù)據(jù)變成了字符類型,用as.numeric()對數(shù)據(jù)進行強制轉(zhuǎn)化。使用定價-售價計算差值為后面的數(shù)據(jù)分析做準備。
3. 折扣和評論數(shù)轉(zhuǎn)為數(shù)值型
數(shù)據(jù)中折扣的是(*.**折),帶有一個括號和一個漢字,可以使用 sub()函數(shù)先后去掉“(”、“折”、“)”,再用 as.numeric()對數(shù)據(jù)進行強制轉(zhuǎn)化。
對評論數(shù)的操作也是如此,評論數(shù)后面多了“條評論”三個字符,使用 sub()函數(shù)將其替換為空值,用 as.numeric()對數(shù)據(jù)進行轉(zhuǎn)化即可。
4. 出版時間的轉(zhuǎn)化和判斷
查看爬取的出版時間數(shù)據(jù),在時間前面有“/”,使用 gsub()將“/”替換為空值,刪去“/”,之后 as.Date()轉(zhuǎn)化為日期類型。使用 class()查看數(shù)據(jù)格式,在轉(zhuǎn)化完成后再用 class()觀察是否轉(zhuǎn)換成功。
在每個變量名前都鍵入一次 a$ 很麻煩。函數(shù) attach()可將數(shù)據(jù)框添加到 R 的搜索路徑中。R 在遇到一個變量名以后,將檢查搜索路徑中的數(shù)據(jù)框,以定位到這個變量。函數(shù) detach()將數(shù)據(jù)框從搜索路徑中移除。
(四)缺失值的處理
1. 滿減和折扣
滿減和折扣兩列有很多缺失值,大部分的數(shù)據(jù)缺失且這部分不太具有統(tǒng)計價值,所以將這兩列刪去。首先%in%返回邏輯型變量,使用運算符!將邏輯值反轉(zhuǎn),之后 a[ ]將剩余變量保留,即剔除滿減和折扣。
2. 出版時間數(shù)據(jù)缺失
將沒有出版時間數(shù)據(jù)的行刪去,使用 is.na()找出缺失值所在的位置,!將邏輯值反轉(zhuǎn),去除邏輯值為 FALSE 的行。
new <- a[!is.na(a$出版時間),]3. 出版社的缺失
這種缺失形式是“出版社”三個字的缺失,需要把“出版社”補充完整,方便數(shù)據(jù)的分析統(tǒng)計。觀察數(shù)據(jù)發(fā)現(xiàn),缺失的字符串中字符數(shù)量均小于 5,所以使用 nchar()函數(shù)統(tǒng)計字符數(shù)量,并和 5 作比較,以邏輯變量找出缺失變量的位置。
nchar(a[,9])<5 返回字符數(shù)小于五的邏輯變量,將之作為行標在數(shù)據(jù)框中尋找字符的位置:a[nchar(a[,9])<5,9] ,之后選擇使用 paste()函數(shù)連接字符串paste( b[nchar(b[,9])<5,9], “出版社”, sep =‘’),連接后如圖所示結(jié)果
填補完成后將數(shù)據(jù)放回數(shù)據(jù)框,將 paste()生成的值賦值給 a[nchar(a[,9])<5,9],出版社數(shù)據(jù)填補完成。
(五)結(jié)果的保存
剛開始數(shù)據(jù)是以 csv 文件格式保存的,所以在數(shù)據(jù)清洗后,也將數(shù)據(jù)保存為 .csv文件(逗號分隔符文件),命名為 new_dangdang.csv,保存在工作目錄中。數(shù)據(jù)清洗結(jié)果如下圖所示。
三、數(shù)據(jù)分析
(一)出版社數(shù)據(jù)
對出版社數(shù)據(jù)進行分析,統(tǒng)計各個出版社出現(xiàn)的頻數(shù),以詞頻統(tǒng)計,詞云圖的形式,找出出現(xiàn)頻率最高的五家出版社。
詞云圖需要下載 wordcloud2 包,照常使用 install.packages(“wordcloud2”)下載安裝包文件,library(wordcloud2)將包導入,publish <- table(b$出版社)做出出版社的統(tǒng)計表并賦值給 publish,之后就可以利用 publish 畫詞云圖,詞頻排序統(tǒng)計,柱狀圖等等。詞頻統(tǒng)計中加入 decreasing = T 表示按照降序排列。
詞頻統(tǒng)計與詞云圖相比,詞云圖剔除了復雜的文本信息,使用字號的大小來展示出現(xiàn)頻率,更加直觀同時也是結(jié)果顯示更加突出。從圖中即可看出,出現(xiàn)頻率最高的五家出版社分別是人民郵電出版社、機械工業(yè)出版社、清華大學出版社、電子工業(yè)出版社和北京大學出版社。由出版社的統(tǒng)計分析也可以更加確定人民郵電出版社的 R 語言學習參考更受消費者喜愛。
(二)日期時間的比較
在研究出版時間前要先把時間值轉(zhuǎn)化為 date 類型,將當前的日期使用函數(shù)Sys.Date()提取出來,然后將當前時間與出版時間做差就能得出出版時間的時間差,除此之外,也可以使用 difftime(now , b[,8] , units=“days”)來提取,units 參數(shù)的值可以為“auto”, “secs”, “mins”, “hours”, “days”, “weeks”,單位選擇上更靈活。用 max()函數(shù)也可以看出最早的一本書距離現(xiàn)在的時間,在函數(shù)中加入 na.rm = T可以剔除缺失值的影響。
b$出版時間 <- as.Date(b[,8]) now <-Sys.Date() 10 days <- now-b[,8] weeks <- difftime(now , b[,8] , units="weeks") max(days,na.rm = T)(三)分析評論數(shù)
使用 comment <- subset(b,評論數(shù)>0,select=c(書名,評論數(shù))) 將書名和評論數(shù)
所在的列提取出來,要求評論數(shù)大于 0,之后用 comment[order(-comment$評論
數(shù)),] 降序排列,結(jié)果如下圖所示
cat()函數(shù)和 min() ,max()函數(shù)提取評論數(shù)的最大最小值。
(四)基本作圖與數(shù)據(jù)統(tǒng)計
為了方便多次對不同數(shù)據(jù)做圖,自編函數(shù) myfunction,滿足畫圖需求,將數(shù)據(jù)和字符導入函數(shù)中,數(shù)據(jù)是畫圖的數(shù)據(jù)來源,字符使用 paste 函數(shù)與圖表名稱連接作為新的名稱,同時字符也是 Y 軸的標簽。
myfunction <- function(x,y){ plot(x,main=paste(y,"散點圖",''),xlab="book",ylab=y) boxplot(x,main=paste(y,"箱線圖",''),ylab=y) } myfunction(b$售價,"售價") myfunction(b$折扣,'折扣') myfunction(b$評論數(shù),'評論數(shù)')對數(shù)據(jù)做基本的數(shù)據(jù)統(tǒng)計,統(tǒng)計得出最大值、最小值、均值、四分位數(shù)。缺失值等數(shù)據(jù)。
(五)根據(jù)價格,標簽,評論數(shù)對書籍打分
先將這幾列數(shù)據(jù)提取出來,使用 apply 對售價和評論數(shù)進行均值為 0,標準差為 1 的標準化。對于標簽欄,先對“自營”、“包郵”進行打分,使用 cbind 連接兩個數(shù)據(jù)框并刪掉多余的列。attach,detach 上文中已有介紹。合并成一張表后將標簽值轉(zhuǎn)化為數(shù)值型,之后按照標簽 20%,售價 30%,評論 50%進行分數(shù)加總,售價前面符號是減號。得出結(jié)果后將數(shù)據(jù)連接按照降序排列,排序結(jié)果如下圖所示。
四、分析總結(jié)
通過對數(shù)據(jù)的清洗,作圖、評級等統(tǒng)計分析,得出在當前評分方式下最值得信賴的幾本圖書。可以根據(jù)此分析作為選擇基礎(chǔ),增加些其他的需求能夠得出相對較好的圖書選擇,對圖書資料的選擇購買有一定的指導作用。
五、完整代碼
install.packages("reshape") install.packages("wordcloud2") getwd() #查看工作目錄 setwd("D:/sea20/documents") #更改工作目錄 getwd() #導入數(shù)據(jù) 12 a <- read.table("F:/dangdang.csv",header = T,sep = ",",encoding = "UTF-8") head(a) names(a) #變量重命名 fix(a) names(a)[1] <- "書名" search() #顯示哪些包已加載可使用 library(reshape) a <- rename(a,c(評論 = "評論數(shù)",作者 9 = "出版時間",作者 11 = "出版社")) names(a) #書名的提取 title <- a[,1] title abc <- strsplit(title,' ') for (i in 1:300) a[i,1] <- abc[[i]][2] #去掉價格中的¥ a[,2] <- as.numeric(substr(a[,2],2,10)) a[,3] <- as.numeric(substr(a[,3],2,10)) different <- a$定價-a$售價 #去掉折扣 zhekou <- a[,4] t1 <- sub('[(]','',zhekou) t2 <- sub('[折]','',t1) t3 <- sub('[)]','',t2) t4 <- substr(t3,2,5) a[,4] <- as.numeric(t4) #評論數(shù)轉(zhuǎn)數(shù)值型 a[,8] <- as.numeric(sub('條評論','',a[,8])) #出版時間 attach(a) class(出版時間) adate <- gsub('[/]','',出版時間) a$出版時間 <- as.Date(adate) class(a[,10]) detach(a) #刪除列,滿減&折扣 b1 <- names(a) %in% c('滿減','搶購活動') a <- a[!b1] names(a) head(a) #將沒有出版時間的數(shù)的行刪去 new <- a[!is.na(a$出版時間),] is.na(a$出版時間) #出版社的填補 13 a[nchar(a[,9])<5,9] a[nchar(a[,9])<5,9] <-paste(a[nchar(a[,9])<5,9],"出版社",sep ='') write.table(a,"new_dangdang.csv",sep = ",",row.names= F) #文件存儲 b <- read.csv("D:/sea20/documents/new_dangdang.csv",header=T,sep = ",") #出版社的分析 library(wordcloud2) publish <- table(b$出版社) wordcloud2(publish,size=0.4,fontFamily = "微軟雅黑",color="random-light",shuffle = TRUE) sort(publish,decreasing = T) #日期時間的比較 b$出版時間 <- as.Date(b[,8]) now <-Sys.Date() days <- now-b[,8] weeks <- difftime(now , b[,8] , units="weeks") max(days,na.rm = T) #分析評論數(shù) comment <- subset(b,評論數(shù)>0,select=c(書名,評論數(shù))) sort(comment$評論數(shù),decreasing =T) cat("評論數(shù)的最大值是:",max(comment$評論數(shù)),'\t') cat("評論數(shù)的最小值是:",min(comment$評論數(shù)),'\t') comment[order(-comment$評論數(shù)),] #基本作圖與數(shù)據(jù)統(tǒng)計 myfunction <- function(x,y){ plot(x,main=paste(y,"散點圖",''),xlab="book",ylab=y) boxplot(x,main=paste(y,"箱線圖",''),ylab=y) } myfunction(b$售價,"售價") myfunction(b$折扣,'折扣') myfunction(b$評論數(shù),'評論數(shù)') vars <- c("售價","折扣","評論數(shù)") summary(b[vars]) #評分 attach(b) new <- subset(b,評論數(shù)>0,select=c(書名,售價,標簽,評論數(shù))) new[,c(2,4)] <- apply(new[,c(2,4)],2,scale) label <- new[,c(1,3)] for (i in 1:102) if (label[i,2]=="自營") label[i,2]<- 5 else if(label[i,2]==" 包郵") label[i,2]<- 3 else label[i,2] <-0 total <- cbind(new,label) total <- total[,-c(3,5)] detach(b) attach(total) 14 total[,4] <- scale(as.numeric(標簽)) grade <- 標簽*0.2+評論數(shù)*0.5-售價*0.3 total <- cbind(total,grade) total <- total[order(-grade),] detach(total)總結(jié)
以上是生活随笔為你收集整理的当当网 R 语言学习资料统计分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟信号,数字信号,基带信号,宽带信号,
- 下一篇: 绘制地图格网时,如何只显示度的数值