当当网 R 语言学习资料统计分析

  • 一、网络数据的抓取
  • 二、数据清洗与保存
  • (一)工作目录的修改
  • (二)导入数据并修改列名
  • 1. 交互式编辑器
  • 2. names()函数
  • 3. rename()函数
  • (三)数据的处理和数据类型的转化
  • 1. 书名的提取
  • 2. 价格中删去“¥”并转化数据类型
  • 3. 折扣和评论数转为数值型
  • 4. 出版时间的转化和判断
  • (四)缺失值的处理
  • 1. 满减和折扣
  • 2. 出版时间数据缺失
  • 3. 出版社的缺失
  • (五)结果的保存
  • 三、数据分析
  • (一)出版社数据
  • (二)日期时间的比较
  • (三)分析评论数
  • (四)基本作图与数据统计
  • (五)根据价格,标签,评论数对书籍打分
  • 四、分析总结
  • 五、完整代码


一、网络数据的抓取

数据通过数据抓取软件八爪鱼进行抓取,进入当当网页面,页面中搜索“R语言”,将目标网址导入八爪鱼软件中,经过软件内的一系列操作,爬取了 300条与“R 语言”相关的书籍数据,包括但不限于书名,作者,价格,出版社,折扣信息,评论数等数据,爬取完成后将数据保存为 csv 文件,命名为 dangdang.csv,放置在 F 盘根目录下以备调用。初始数据如下图所示dangdang.csv

R语言统计描述 r语言统计分析报告_r语言

二、数据清洗与保存

数据爬取完成后,将数据导入 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()函数查看导入数据的前面几行,可以发现数据非常混乱,变量名称也比较杂乱缺少代表性,数据的清洗整理必不可少。

R语言统计描述 r语言统计分析报告_r语言_02


首先是列名的修改,本文提供三种方法,先用 names()查看整体列名

R语言统计描述 r语言统计分析报告_缺失值_03

1. 交互式编辑器

通过 fix( )函数调用交互式的编辑器,然后单击变量名,在弹出的对话框中将其重命名,在对话框中还可以进行数据类型的简单修改。

R语言统计描述 r语言统计分析报告_数据_04

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()查看当前的列名。

R语言统计描述 r语言统计分析报告_数据类型_05


命令 search()可以查看那些包已加载并可使用。

R语言统计描述 r语言统计分析报告_数据类型_06

(三)数据的处理和数据类型的转化

1. 书名的提取

观察数据可以发现,第一列中书名非常混乱,里面包括书名,书籍简介,还有空格作为分隔符号,所以使用 strsplit()函数对数据进行处理,准确提取出书名。
首先将第一列数据赋值给 title,观察数据类型和格式,使用 strsplit()函数以空格作为分隔符,将 title 分隔成若干小片段,之后使用 for 循环语句将分割后的小片段提取出第二部分(观察数据发现第二部分为书名),代码及结果如下

title <- a[,1]
title
abc <- strsplit(title,' ')
for (i in 1:300) a[i,1] <- abc[[i]][2]

R语言统计描述 r语言统计分析报告_数据_07

2. 价格中删去“¥”并转化数据类型

起初尝试 sub, gsub 等方法,并没有好的效果,之后想到 substr()函数,直接提取从第二位开始的值,免去了字符修改的麻烦。转化之后数据变成了字符类型,用as.numeric()对数据进行强制转化。使用定价-售价计算差值为后面的数据分析做准备。

R语言统计描述 r语言统计分析报告_数据类型_08

3. 折扣和评论数转为数值型

数据中折扣的是(*.**折),带有一个括号和一个汉字,可以使用 sub()函数先后去掉“(”、“折”、“)”,再用 as.numeric()对数据进行强制转化。

R语言统计描述 r语言统计分析报告_缺失值_09


对评论数的操作也是如此,评论数后面多了“条评论”三个字符,使用 sub()函数将其替换为空值,用 as.numeric()对数据进行转化即可。

a[,8] <- as.numeric(sub('条评论','',a[,8]))

4. 出版时间的转化和判断

查看爬取的出版时间数据,在时间前面有“/”,使用 gsub()将“/”替换为空值,删去“/”,之后 as.Date()转化为日期类型。使用 class()查看数据格式,在转化完成后再用 class()观察是否转换成功。
在每个变量名前都键入一次 a$ 很麻烦。函数 attach()可将数据框添加到 R 的搜索路径中。R 在遇到一个变量名以后,将检查搜索路径中的数据框,以定位到这个变量。函数 detach()将数据框从搜索路径中移除。

> attach(a)
> class(出版时间)
[1] "character"
> adate <- gsub('[/]','',出版时间)
> #转为日期类型
> a$出版时间 <- as.Date(adate)
> class(a[,10])
[1] "Date"
> detach(a)

(四)缺失值的处理

1. 满减和折扣

满减和折扣两列有很多缺失值,大部分的数据缺失且这部分不太具有统计价值,所以将这两列删去。首先%in%返回逻辑型变量,使用运算符!将逻辑值反转,之后 a[ ]将剩余变量保留,即剔除满减和折扣。

R语言统计描述 r语言统计分析报告_R语言统计描述_10

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 =‘’),连接后如图所示结果

R语言统计描述 r语言统计分析报告_数据_11


填补完成后将数据放回数据框,将 paste()生成的值赋值给 a[nchar(a[,9])<5,9],出版社数据填补完成。

(五)结果的保存

刚开始数据是以 csv 文件格式保存的,所以在数据清洗后,也将数据保存为 .csv文件(逗号分隔符文件),命名为 new_dangdang.csv,保存在工作目录中。数据清洗结果如下图所示。

R语言统计描述 r语言统计分析报告_数据_12

三、数据分析

(一)出版社数据

对出版社数据进行分析,统计各个出版社出现的频数,以词频统计,词云图的形式,找出出现频率最高的五家出版社。
词云图需要下载 wordcloud2 包,照常使用 install.packages(“wordcloud2”)下载安装包文件,library(wordcloud2)将包导入,publish <- table(b$出版社)做出出版社的统计表并赋值给 publish,之后就可以利用 publish 画词云图,词频排序统计,柱状图等等。词频统计中加入 decreasing = T 表示按照降序排列。

install.packages("wordcloud2")
library(wordcloud2)
publish <- table(b$出版社)
wordcloud2(publish, size=0.4,fontFamily = "微软雅黑",color="random-light",
shuffle = TRUE)
sort(publish, decreasing = T)

R语言统计描述 r语言统计分析报告_缺失值_13

R语言统计描述 r语言统计分析报告_R语言统计描述_14


词频统计与词云图相比,词云图剔除了复杂的文本信息,使用字号的大小来展示出现频率,更加直观同时也是结果显示更加突出。从图中即可看出,出现频率最高的五家出版社分别是人民邮电出版社、机械工业出版社、清华大学出版社、电子工业出版社和北京大学出版社。由出版社的统计分析也可以更加确定人民邮电出版社的 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()函数提取评论数的最大最小值。

> cat("评论数的最大值是:",max(comment$评论数),'\t')
评论数的最大值是: 20065 
> cat("评论数的最小值是:",min(comment$评论数),'\t')
评论数的最小值是: 1

R语言统计描述 r语言统计分析报告_r语言_15

(四)基本作图与数据统计

为了方便多次对不同数据做图,自编函数 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$评论数,'评论数')

R语言统计描述 r语言统计分析报告_R语言统计描述_16

对数据做基本的数据统计,统计得出最大值、最小值、均值、四分位数。缺失值等数据。

R语言统计描述 r语言统计分析报告_r语言_17

(五)根据价格,标签,评论数对书籍打分

先将这几列数据提取出来,使用 apply 对售价和评论数进行均值为 0,标准差为 1 的标准化。对于标签栏,先对“自营”、“包邮”进行打分,使用 cbind 连接两个数据框并删掉多余的列。attach,detach 上文中已有介绍。合并成一张表后将标签值转化为数值型,之后按照标签 20%,售价 30%,评论 50%进行分数加总,售价前面符号是减号。得出结果后将数据连接按照降序排列,排序结果如下图所示。

R语言统计描述 r语言统计分析报告_r语言_18

四、分析总结

通过对数据的清洗,作图、评级等统计分析,得出在当前评分方式下最值得信赖的几本图书。可以根据此分析作为选择基础,增加些其他的需求能够得出相对较好的图书选择,对图书资料的选择购买有一定的指导作用。

五、完整代码

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)