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