R语言实战:预测钻石的价格
来源:互联网 发布:手机壁纸知乎 编辑:程序博客网 时间:2024/04/26 17:06
作者:刘小芬,R语言中文社区专栏作者。知乎专栏:https://www.zhihu.com/people/liu-xiao-fen-10/columns
数据来源:R中的ggplot2包的自带数据diamond
数据分析目的:建模,预测钻石的价格。
数据分析思路:
1.单变量跟价格的关系:分别探讨克拉、颜色、纯度、深度、体积、切割跟价格的关系。
2.多变量跟价格的关系:分别探讨多个维度跟价格的关系。
数据分析过程:
一、导入数据
library(ggplot2)data(diamonds)View(diamonds)names(diamonds)
理解数据:
carat:克拉
cut:切割(Levels: Fair < Good < Very Good < Premium < Ideal)
color:颜色(Levels: D < E < F < G < H < I < J)
clarity:纯度(Levels: I1 < SI2 < SI1 < VS2 < VS1 < VVS2 < VVS1 < IF)
depth:深度
table:台面
price:价格
二、数据分析
加载包:
library(dplyr)library(ggplot2)library(gridExtra)library(RColorBrewer)library(GGally)library(scales)library(memisc)library(lattice)library(MASS)library(car)library(reshape2)library(RCurl)library(bitops)
因为数据分析的目的建模预测价格,所以首先画讨价格直方图,探讨价格的分布规律:
###价格直方图qplot(x=price,data = diamonds,fill=I("skyblue"))+ scale_x_continuous(breaks = seq(0,20000,1000))+ ggtitle("The Price Of Diamonds")
大部分价格是分布在2000元以下,对这部分画图:
qplot(x=price,data =subset(diamonds,price < 2000),col=I("skyblue"),fill=I("pink"),binwidth=20)+ scale_x_continuous(limits = c(0,2000),breaks = seq(0,2000,100))+ ggtitle("The Low Price Of Diamonds")
可以看出,大部分的价格是分布在700-800元之间。
接下来开始分析各变量跟价格的关系:
2.1分析切割跟价格的关系
qplot(x=price,data = diamonds,col=I("black"),fill=factor(cut),binwidth=200)+ facet_wrap(~cut,nrow = 3,scales="free_y")+ scale_x_continuous(limits = c(0,20000),breaks = seq(0,20000,4000))+ ggtitle("The Price Of Diamonds By Cut")
可以看出,仍然是低价格的占据最多,那么哪个切割水平钻石最贵、最便宜?
by(diamonds$price,diamonds$cut,summary)
最贵的钻石的切割水平为Premium,最便宜的钻石的切割水平为Ideal和Premium。也就是说切割水平跟钻石的价格没有太直接的关系。
考虑每克拉钻石的价格跟切割水平是否有关系:
diamonds$perprice <- diamonds$price/diamonds$caratqplot(x=perprice,data = diamonds,col=I("black"),binwidth=.02, fill=factor(cut))+ facet_wrap(~cut,scales = "free_y",nrow = 3)+ scale_x_log10()+ ggtitle("The Perprice Of Diamonds By Cut")
可以看出根据切割水平分类,每克拉的价格呈现正态分布,也就是两者呈现正态关系。
2.2分析深度跟价格的关系
ggplot(data = diamonds,aes(x=price,y=depth))+ geom_point(alpha=1/100)+ scale_x_continuous(breaks = seq(0,15000,2000))+ ggtitle("The Price Vs Depth")cor.test(diamonds$price,diamonds$depth)
cor.test(diamonds$price,diamonds$depth)
价格跟深度是负相关,也就是说价格越高,深度越低。跟图表示的意思相同。
2.3分析克拉跟价格的关系
为了确保数据的可靠性,将离散值去掉,主要是去最高1%的价格和克拉:
ggplot(data =diamonds,aes(x=price,y=carat))+ geom_point()+ scale_x_continuous(lim=c(0,quantile(diamonds$price,0.99)))+ scale_y_continuous(lim=c(0,quantile(diamonds$carat,0.99)))+ ggtitle("The Price Vs carat")
如图所示,克拉跟价格呈现线性关系,且价格越高,克拉数越大。
cor.test(diamonds$price,diamonds$carat)
价格跟克拉属于正相关,而且还是强正相关,符合图所表示的意思。
2.4分析体积跟价格的关系
diamonds$volume <- with(diamonds,x*y*z)ggplot(data = diamonds,aes(x=price,y=volume))+ geom_point()+ ggtitle("The Price Vs Volume")
有两个离散值,去掉离散值,选择体积数在0-800之间:
ggplot(data = subset(diamonds,volume < 800 & volume > 0), aes(x=price,y=volume))+ geom_point(alpha=1/100)+ ggtitle("The Price Vs Volume")
同样的,体积跟价格也是呈现线性关系,我们添加一条曲线看看:
ggplot(data = subset(diamonds,volume < 800 & volume > 0), aes(x=price,y=volume))+ geom_point(alpha=1/100)+ geom_smooth()+ ggtitle("The Price Vs Volume")
可以看出,体积跟价格属于正相关关系。
2.5分析纯度跟价格的关系
将价格按照纯度进行分类,同时计算每组分类中的价格均值、价格最大值、价格最小值、价格中位数。
diamondsByClarity <- diamonds %>% group_by(clarity) %>% summarise(mean_price=mean(price), median_price=median(price), min_price=min(price), max_price=max(price), n=n())
总共分成了八组。从均值、中位数、最大值和最小值看,价格跟纯度并不存在相关关系,就是说纯度越高并不意味着价格更高或更低等等。
2.6分析颜色跟价格的关系
ggplot(aes(x=log(price)),data = diamonds)+ facet_wrap(~color,scales="free_y")+ geom_histogram(aes(color=cut,fill=cut))+ ggtitle("The Price VS Color")
从图中可以看出,两者关系并不大。
接下来分析多变量跟价格的关系:
抽取1000个样本,比较各变量之间的相关性。
set.seed(789)diamonds_samp <- diamonds[sample(1:length(diamonds$price),1000),]ggpairs(diamonds_samp)
价格跟克拉的相关性最大,所以,接下来分析纯度、切割、颜色与克拉同时对价格的影响。
2.7分析纯度、克拉跟价格的关系
同时考虑纯度、克拉对价格会有什么影响:
ggplot(aes(x=carat,y=price,color=clarity),data = diamonds)+ geom_point(alpha=0.5,size=1,poosition="jitter")+ scale_color_brewer(type = "div", guide=guide_legend(title = "Clarity", reverse = T, override.aes = list(alpha=1,size=2)))+ scale_x_continuous(trans = cuberoot_trans(), limits = c(0.2,3), breaks = c(0.2,0.5,1,2,3))+ scale_y_continuous(trans = log10_trans(), limits = c(350,15000), breaks = c(350,1000,5000,10000,15000))+ ggtitle("Price (log10) by Cube-Root of Carat and Clarity")
纯度、克拉对价格的影响是呈现线性正相关关系,即相同的克拉下,纯度越高价格越高,同样的,相同的纯度下,克拉越高价格越高。
2.8分析克拉、切割跟价格的关系
同时考虑克拉、切割对价格的影响:
ggplot(aes(x=carat,y=price,color=cut),data = diamonds)+ geom_point(alpha=0.5,size=1,poosition="jitter")+ scale_color_brewer(type = "div", guide=guide_legend(title = "cut", reverse = T, override.aes = list(alpha=1,size=2)))+ scale_x_continuous(trans = cuberoot_trans(), limits = c(0.2,3), breaks = c(0.2,0.5,1,2,3))+ scale_y_continuous(trans = log10_trans(), limits = c(350,15000), breaks = c(350,1000,5000,10000,15000))+ ggtitle("Price (log10) by Cube-Root of Carat and Cut")
切割、克拉对价格的影响是呈现线性正相关关系,即相同的克拉下,切割等级越高价格越高,同样的,相同的切割等级下,克拉越高价格越高。
2.9分析克拉、颜色跟价格的关系
同时考虑克拉、颜色对价格的影响:
ggplot(aes(x=carat,y=price,color=color),data = diamonds)+ geom_point(alpha=0.5,size=1,poosition="jitter")+ scale_color_brewer(type = "div", guide=guide_legend(title = "color", reverse = F, override.aes = list(alpha=1,size=2)))+ scale_x_continuous(trans = cuberoot_trans(), limits = c(0.2,3), breaks = c(0.2,0.5,1,2,3))+ scale_y_continuous(trans = log10_trans(), limits = c(350,15000), breaks = c(350,1000,5000,10000,15000))+ ggtitle("Price (log10) by Cube-Root of Carat and Color")
可以看出,颜色、克拉对价格的影响是呈现线性正相关关系,即相同的克拉下,颜色越趋于无色等级价格越高,同样的,相同的颜色等级下,克拉越高价格越高。
至此,可以得出钻石中的4C,即颜色、切割、纯度、克拉都会对价格造成影响。
接下来是建模,构建模型,预测钻石的价格。
三、建模,预测价格
因为颜色、切割、纯度、克拉都会对价格造成影响,因此构建的回归模型,将这几个变量都纳入模型中:
modeldiamonds <- lm(I(log(price))~I(carat^(1/3))+I(carat)+I(cut) +I(color)+I(clarity),data = diamonds)
查看模型:
模型公式为:
log(price)=0.145+9.14*carat^1/3-1.09*carat+(...*color+...*clarity+...*cut)+Q
但是由于数据不多,且是属于2008年的钻石数据,并不能代表所有的钻石,对于钻石的预测还是有一定的误差,因此在 https://github.com/solomonm/diamonds-data下载bigdiamonds数据,选取价格小于10000且属于GIA发布的数据,进行建模:
diamondsbig <- load("BigDiamonds.rda")diamondsbig$logprice <- log(diamondsbig$price)modeldiamondsbig <- lm(logprice ~ I(carat^(1/3))+ carat+cut+color+clarity, data = diamondsbig[diamondsbig$price < 10000 & diamondsbig$cert == "GIA",])
模型公式为:
log(price)=-0.46+8.32*carat^1/3-0.76*carat+(...*color+...*clarity+...*cut)+Q
接下来是利用模型对钻石价格进行预测:
预测钻石:
carat为1.01,cut为Ideal,color为E,clarity为VS2的钻石的价格,置信区域为0.95:
thisDiamond <- data.frame(carat=1.01,cut="Ideal", color="E",clarity="VS2")modelEdtimate <-predict(modeldiamondsbig,newdata = thisDiamond, interval = "prediction",level = .95)exp(modelEdtimate)
在置信区域95时,此类钻石的价格在5099.363~9310.083之间浮动,浮动点的值为6890.246元。
四、总结
这个价格的预测模型只是基于4C基础下作出的预测,但是价格还会受到其他因素的影响,例如商家的利润、购买时间、购买优惠度等等,所以,即使有模型也不能过分的依赖模型,还是需要考虑其他因素
公众号后台回复关键字即可学习
回复 R R语言快速入门免费视频
回复 统计 统计方法及其在R中的实现
回复 用户画像 民生银行客户画像搭建与应用
回复 大数据 大数据系列免费视频教程
回复 可视化 利用R语言做数据可视化
回复 数据挖掘 数据挖掘算法原理解释与应用
回复 机器学习 R&Python机器学习入门
- R语言实战:预测钻石的价格
- 钻石与价格预测
- R语言预测初步(R语言预测实战-节选)
- R语言实战分析预测海藻数量
- 外推预测法(R语言预测实战-节选)
- 对英国房屋价格建模并预测 ---《量化金融R语言初级教程》
- R语言:读取淘宝的单品页的名称和价格
- 预测海藻数量(R语言)
- R语言 决策树--预测模型
- R语言svm预测股票走势
- 用R语言预测鱼塘鱼尾的长度
- R语言 绘制三维散点图的预测曲面
- 基于R语言构建的电影评分预测模型
- 基于R语言构建的电影评分预测模型
- 基于R语言构建的电影评分预测模型
- R语言利用ROCR评测模型的预测能力
- R语言估算不同分类器的预测误差
- 基于R语言构建的电影评分预测模型
- 终于等到你——ggplot2树状图
- 标准差
- R|ggplot2(七)|自定义主题
- 【零基础 趣味玩数据】用R语言深度解读十九大报告,十行代码绘制党徽图案词云
- 左手用R右手Python系列——模拟登陆教务系统
- R语言实战:预测钻石的价格
- 我的商业数据分析成长之路(书籍方面) | 引言
- jdbc详解
- 左手用R右手Python系列16——XPath与网页解析库
- 2017中国“互联网+”数字经济指数 | 腾讯研究院
- TP5路由解析与搭建restful API应用
- python和C语言混编的几种方式
- 国密
- 11-CSS透明度 margin取值以及圣杯,滑动门, 三角