目录

  • 1、数据爬取及预处理
    • 1.1 基本介绍
    • 1.2 R语言爬虫代码
  • 2、数据预处理
  • 3、描述统计分析
  • 4、Kmeans聚类分析

1、数据爬取及预处理

1.1 基本介绍

数据来源:当当网五星图书榜单,该网页为静态网页,易爬取且翻页机制明显,在此不展开详细分析,本次爬取的内容为童书所有分类,爬取每个图书的字段如下表所示

数据字段 含义
book_title 图书标题
book_comments 评论人数
book_recommend 推荐指数
book_price_now 现价
book_price_origin 原价
book_price_cutoff 折扣
cato 图书类型

这里主要介绍R语言爬虫rvest包,其下主要函数用法如表所示

函数名 主要作用
read_html 访问网页并解析页面数据
read_nodes 用于抽取页码节点数据,抽取的方式类似CSS选择器
html_text 用于抽取节点中的字符串
%>% 管道运算符,可将前一个函数运行结果作为参数直接传给后一个函数,免去了变量命名的麻烦

1.2 R语言爬虫代码

library(rvest)
library(stringi)#所有分类栏目对应ID
all_types = c("绘本/图画书"=70, "中国儿童文学"=26, "外国儿童文学"=27,"科普/百科"="05","动漫/卡通"=50,"幼儿/启蒙"=45,"益智游戏"=46,"婴儿读物"=44,"玩具书"=48,"少儿励志成长"=71,"少儿英语"=51,"少儿期刊"=69,"阅读工具书"=59,"进口儿童书"=57)base_url<-"http://bang.dangdang.com/books/fivestars/01.41."
right_url<-".00.00.00-all-0-0-1-"
book_data_all<-data.frame(matrix(0,0,0))crawl_book<-function(url,cato){html_text<-read_html(url,encoding='gbk')li_list<-html_text%>%html_nodes("ul.bang_list")%>%html_nodes("li")#图书名称book_title<-li_list%>%html_nodes("div.name")%>%html_nodes("a")%>%html_text("title")#评论人数book_comments<-li_list%>%html_nodes("div.star")%>%html_nodes("a")%>%html_text()%>%stri_replace_all(replacement="",regex="条评论")%>%as.numeric()#推荐指数book_recommend<-li_list%>%html_nodes("div.star")%>%html_nodes("span.tuijian")%>%html_text()%>%stri_replace_all(replacement="",regex="推荐")#五星评分次数book_score_count<-li_list%>%html_nodes("div.biaosheng")%>%html_text()%>%stri_extract(regex="(\\d+)")%>%as.numeric()#现价book_price_now<-apply(as.matrix(1:length(html_nodes(li_list,"div.price"))),1,function(x){out<-html_nodes(html_nodes(li_list,"div.price")[x],"span.price_n")%>%html_text()price<-as.numeric(stri_extract(out[1],regex="(\\d+\\.\\d+)"))return(price)})#原价book_price_origin<-apply(as.matrix(1:length(html_nodes(li_list,"div.price"))),1,function(x){out<-html_nodes(html_nodes(li_list,"div.price")[x],"span.price_r")%>%html_text()price<-as.numeric(stri_extract(out[1],regex="(\\d+\\.\\d+)"))return(price)})#折扣book_price_cutoff<-apply(as.matrix(1:length(html_nodes(li_list,"div.price"))),1,function(x){out<-html_nodes(html_nodes(li_list,"div.price")[x],"span.price_s")%>%html_text()price<-as.numeric(stri_extract(out[1],regex="(\\d+\\.\\d+)"))return(price)})#图书所属分类cato<-rep(cato,length(book_title))book_data<-data.frame(book_title,book_comments,book_recommend,book_score_count,book_price_now,book_price_origin,book_price_cutoff,cato)return(book_data)
}for(i in 1:length(all_types)){cat(names(all_types)[i],"部分开始爬取\n")for(page in 1:25){url<-paste0(base_url,all_types[i],right_url,page)go<-try({data<-crawl_book(url,names(all_types)[i])}) #异常处理if("try-error"%in%class(go)){cat(names(all_types)[i],"部分出现问题\n")break}else{book_data_all<-rbind(book_data_all,data)cat("第",page,"页爬取完成\n")Sys.sleep(1)}rm(data)  #释放内存}
}write.csv(book_data_all,"当当网TOP五星榜单数据.csv",row.names = F)

2、数据预处理

  • 将推荐指数中的百分号去除,并转为数值型字段
  • 删除缺失值
library(stringi)
data<-read.csv('当当网TOP五星榜单数据.csv')
data$book_recommend<-apply(as.matrix(data$book_recommend),1,function(x){as.numeric(stri_replace_all(x,replacement="",regex="%"))})
data<-na.omit(data)

3、描述统计分析

1、图书类型分类

library(plotly)
library(dplyr)explor_book_category<-group_by(data,cato)%>%summarise(count=n(),percent=n()/nrow(data)*100)%>%arrange(desc(count))plot_ly(data<-explor_book_category,labels=~cato,values=~count,name="图书类别构成")%>%add_pie(hole=0.5)

2、图书价格分布情况

  • 原价分布

  • 现价分布

  • 折扣分布
#自定义直方图
ExplorHistogramplot<-function(data,titleX=NULL,titleY=NULL){plot_ly(x=~data,type="histogram",marker=list(color="rgb(158,202,225)",line=list(color="rgb(8,48,107)",width=1.5)),histnorm="count",name="直方图")%>%layout(xaxis=list(title=titleX),yaxis=list(title=titleY))
}#自定义箱线图
ExplorBoxPlot<-function(data,titleX=NULL,titleY=NULL){plot_ly(x=~data,type="box",name="箱线图")%>%layout(xaxis=list(title=titleX),yaxis=list(title=titleY))
}#绘制现价组合图
p1<-ExplorHistogramplot(data=data$book_price_now,titleY="频次")
p2<-ExplorBoxPlot(data=data$book_price_now,titleY="",titleX="图书现价")
subplot(p1,p2,nrows=2,widths=1,heights=c(0.8,0.2),margin=0,shareX=T,shareY=F,titleX=T,titleY=F)#绘制原价组合图
p3<-ExplorHistogramplot(data=data$book_price_origin,titleY="频次")
p4<-ExplorBoxPlot(data=data$book_price_origin,titleY="",titleX="图书原价")
subplot(p3,p4,nrows=2,widths=1,heights=c(0.8,0.2),margin=0,shareX=T,shareY=F,titleX=T,titleY=F)#绘制折扣分布图
p5<-ExplorHistogramplot(data=data$book_price_cutoff,titleY="频次")
p6<-ExplorBoxPlot(data=data$book_price_cutoff,titleY="",titleX="图书折扣")
subplot(p5,p6,nrows=2,widths=1,heights=c(0.8,0.2),margin=0,shareX=T,shareY=F,titleX=T,titleY=F)

3、各变量相关分析

library(corrplot)
corrplot(cor(data[,2:7]),method="number",type="upper",tl.srt=45)

4、Kmeans聚类分析

1、标准化处理

scale_data<-apply(data[,2:7],2,scale,center=T,scale=T)
colnames(scale_data)<-paste0(colnames(data)[2:7],"_z")
scale_data<-na.omit(scale_data)

2、聚类可视化
本次聚类暂定聚类数目K=3

library(ggfortify)
set.seed(4869)
book_cluster<-kmeans(x=scale_data,centers=3,iter.max=100,nstart=30)
autoplot(book_cluster,data<-scale_data,label=F,lable.size=2,frame=TRUE)+theme_bw()

3、聚类结果检验
现对三种分类进行平均数差异检验,从统计学上判断各项指标是否存在显著差异,使用的是oneway.test()函数

#添加聚类标签
data_cluster<-data.frame(scale_data,book_cluster=book_cluster$cluster,stringsAsFactors=F)Ftest<-function(x,group){data<-data.frame(x,group)rst<-c(tapply(data$x,data$group,mean),c(unlist(oneway.test(x~group)))[c(1:4)])rst<-round(as.numeric(rst),3)names(rst)<-c("类别1均值","类别2均值","类别3均值","F值","分子自由度","分母自由度","P值")return(rst)
}test_cluster<-t(apply(data_cluster,2,Ftest,group=data_cluster$book_cluster))
test_cluster[1:nrow(test_cluster)-1,]

从检验结果可知,各指标均通过显著性检验,则表明三种聚类类型在这五个指标上均存在明显差异,可用于后续分析。根据3种聚类变量在价格和评价上的评价差异,可将其分为三类:性价比高(聚类1,价格适中,评价高),性价比低(聚类2,价格低,评价低),性价比适中(聚类3,价格高,但评价居中)

4、图书性价比分析
现在上述人工分类的基础上,展开进一步分析
1、不同性价比图书价格分布

data$book_cluster<-book_cluster$cluster
data$book_cluster<-factor(data$book_cluster,levels=c(1,2,3),labels=c("性价比高","性价比低","性价比适中"),ordered=T)CompareBoxPlot<-function(x,group,titleX=NULL,titleY=NULL){data<-data.frame(x,group)plot_ly(data=data,x=~x,color=~group,type="box",showlegend=FALSE)%>%layout(xaxis=list(title=titleX),yaxis=list(title=titleY))
}p7<-CompareBoxPlot(x=data$book_price_now,group=data$book_cluster,titleX="图书现价")
p8<-CompareBoxPlot(x=data$book_price_origin,group=data$book_cluster,titleX="图书原价")
p9<-CompareBoxPlot(x=data$book_price_cutoff,group=data$book_cluster,titleX="图书折扣")
subplot(p7,p8,p9,nrows=1,widths=c(0.33,0.33,0.33),heights=1,margin=0.05,shareX=F,shareY=F,titleX=T,titleY=T)

2、不同性价比图书评价分布

p10<-CompareBoxPlot(x=data$book_recommend,group=data$book_cluster,titleX="推荐指数")
p11<-CompareBoxPlot(x=data$book_comments,group=data$book_cluster,titleX="评论次数")
p12<-CompareBoxPlot(x=data$book_score_count,group=data$book_cluster,titleX="五星推荐次数")
subplot(p10,p11,p12,nrows=1,widths=c(0.33,0.33,0.33),heights=1,margin=0.05,shareX=F,shareY=F,titleX=T,titleY=T)

由箱线图分析可知,性价比高的图书在评价指标上整体优于其他两个类别

以上就是本次分享的全部内容~

数据分析实战(五)基于R语言的Kmean聚类分析实战相关推荐

  1. 《金融数据分析导论:基于R语言》习题答案(第一章)

     <金融数据分析导论:基于R语言>是芝加哥大学的教授Ruey S.Tsay所著,李洪成.尚秀芬.郝瑞丽翻译,机械工业出版社出版,是一本学习R语言和金融数据分析的很好的参考书籍. ** 注 ...

  2. R语言实战应用-基于R语言的对应分析

    一.基本概念和原理 对应分析(Correspondence Analysis)是在因子分析的基础上发展起来的,对应分析是多变量统计分析中有用的分析方法.对应分析把R型和Q型因子统一起来,通过R型因子分 ...

  3. 基于R语言的层次聚类分析-【案例实操】-基本操作,一看就会

    基本思想 每一个样本作为一类 按照某一种方法进行距离度量,比如"欧氏距离" 距离最短划为1类 重复步骤2和3,每次减少一类,直至所有样本合成1类 案例 数据 这里用鸢尾花数据集作为 ...

  4. R语言数据热力图绘制实战(基于原生R函数、ggplot2包、plotly包)

    R语言数据热力图绘制实战(基于原生R函数.ggplot2包.plotly包) 目录 R语言数据热力图绘制实战(基于原生R函数.ggplot2包.plotly包)

  5. 基于R语言混合效应模型(mixed model)案例研究

    全文链接: http://tecdat.cn/?p=2596 在本文中,我们描述了灵活的竞争风险回归模型.回归模型被指定为转移概率,也就是竞争性风险设置中的累积发生率(点击文末"阅读原文&q ...

  6. 基于R语言极值统计学及其在相关领域中的应用

    受到气候变化.温室效应以及人类活动等因素的影响,自然界中极端高温.极端环境污染.大洪水和大暴雨等现象的发生日益频繁:在人类社会中,股市崩溃.金融危机等极端情况也时有发生:今年的新冠疫情就是非常典型的极 ...

  7. python对电影进行预测评分_基于R语言构建的电影评分预测模型

    原标题:基于R语言构建的电影评分预测模型 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能BI.大数据分析 ...

  8. Protein Cell:基于R语言的微生物组数据挖掘最佳流程(大众评审截止14号晚6点)...

    Protein & Cell综述:基于R语言的微生物组数据挖掘的最佳流程 近日,中国农业科学院刘永鑫组联合南京农业大学袁军组在国际期刊 Protein & Cell (IF = 15. ...

  9. 【R语言实验】基于R语言的时间序列平稳性检验

    一.实验项目名称:基于R语言的时间序列平稳性检验 二.实验目的与要求: 平稳时间序列的概念,平稳性检验的时序图检验方法和自相关图检验方法. 三.实验原理: 时序图和自相关图检验时间序列的平稳性依据: ...

  10. 基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

    详情链接 :基于R语言.MaxEnt模型融合技术的物种分布模拟.参数优化方法.结果分析制图与论文写作 内容介绍:  第一章 .理论篇 以问题导入的方式,深入掌握原理基础 : 什么是MaxEnt模型? ...

最新文章

  1. flexnet licensing 启动多个服务_又小又灵巧,浪潮边缘计算服务器获深度评测高分...
  2. MapReduce编程基础
  3. “不要尝试欺骗我一个吻”(奥·安达尔摄影展)
  4. 格密码教程(六):高斯二维格规约,解决SVP问题
  5. Exchange安装过程中经常遇到的服务器需要重启问题
  6. 递归转手动管理栈的非递归
  7. android插件化-apkplug中OSGI服务基本原理-08
  8. pycharm中文乱码
  9. Linux下exec函数族比如execve等函数的基本使用
  10. 独家丨我在北工大看王校长吃热狗
  11. Postman 汉化教程
  12. Z-TEK USB转422接口问题 RS422接口常见使用注意事项
  13. 计算机专业职称入深户,深圳市人才引进入深户新政策
  14. 多项logistic回归系数解释_深入解读Logistic回归结果(一):回归系数,OR
  15. IPinfo上架uTools插件中心
  16. 模具分类以及塑胶模具设计流程
  17. 大数据时代,传输软件的优势与应用
  18. 使用”网上办税厅”节约大厅办税时间的技巧
  19. 没有密码如何解除工作表保护
  20. Python 基础学习02

热门文章

  1. 7个顶级静态代码分析工具
  2. 数据库设计-简化字典表
  3. 一文读懂等保二级和三级有什么区别
  4. layui框架引入TP教程
  5. python tk隐藏窗口_显示tkinter消息框时,隐藏root窗口
  6. MS17010漏洞利用姿势
  7. 网易云音乐:歌曲鉴赏人选品
  8. 易飞ERP工作流解决方案之【第三方OA系统集成】
  9. 数字化智慧工地,工地智能监管一体化解决方案
  10. php excel导出柱状图,YII2框架下使用PHPExcel导出柱状图