作者:刘小芬,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$carat
qplot(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语言实战:预测钻石的价格相关推荐

  1. 计算机书籍-R语言机器学习预测分析实战

    书名:机器学习与R语言实战 作者:丘祐玮 出版社:机械工业出版社 ISBN:9787111535959 去当当网了解

  2. R语言必看推荐:R语言入门经典版(中文版)+R语言实战第二版(中文完整版)

    R语言入门经典(中文版)R for beginners R语言经典教材 第二版 适合初学者 作者:Emmanuel Paradis R 语言实战第二版(中文完整版) R语言实战(第2版)注重实用性,是 ...

  3. R语言实战笔记--第十五章 处理缺失数据

    R语言实战笔记–第十五章 处理缺失数据 标签(空格分隔): R语言 处理缺失数据 VIM mice 缺失值(NA),是导致我们计算错误的一大来源,处理缺失数据在实际的应用中有着较为重要的作用. 基本方 ...

  4. R语言实战(九)主成分和因子分析

    本文对应<R语言实战>第14章:主成分和因子分析 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量成为主成分. 探索性因子分析(EFA)是 ...

  5. 《R语言实战》:广义线性模型R实现

    广义线性模型 理论部分取自<R语言实战>: 当因变量结果为计数型变量(非负有限值).二值变量或多分类变量时进行适用广义线性模型. 标准线性模型中假设y符合正态分布,而广义线性模型使用连接函 ...

  6. R语言实战笔记--第十四章 主成分和因子分析

    R语言实战笔记–第十四章 主成分和因子分析 标签(空格分隔): R语言 主成分分析 因子分析 原理及区别 主成分分析与因子分析很接近,其目的均是为了降维,以更简洁的数据去解释结果,但这两种方法其实是相 ...

  7. 对比《学习R》PDF代码+《R语言实战第2版》PDF代码+《R数据科学》PDF代码分析

    R语言是世界上最流行的用于数据处理和统计分析的脚本语言.考古学家用它来跟踪古代文明的传播,医药公司用它来探索哪种药物更安全.更有效,精算师用它评估金融风险以保证市场的平稳运行.总之,在大数据时代,统计 ...

  8. 李倩星r语言实战_基于PCR的全球平均气温研究

    段晓鸣 [摘 要] 本文运用主成分回归的方法研究了全球平均气温与CO2,N2O,CFC.11,CFC.12,TSI,Aerosols六个自变量之间的关系,选取了自1983年5月到2008年12月的数据 ...

  9. R 语言实战-Part 4 笔记

    R 语言实战(第二版) ## part 4 高级方法 -------------第13章 广义线性模型------------------ #前面分析了线性模型中的回归和方差分析,前提都是假设因变量服 ...

最新文章

  1. 使用Pygame制作微信打飞机游戏PC版
  2. php数组转字符串 join,jQuery中将数组转换成字符串join()和push()使用
  3. dataframe 空值替换为0_缓解Pandas中DataFrame占用内存过高
  4. linux存储库rep 61082,安装informatic过程中的错误
  5. HashMap can be replaced with SparseArray--Android应用性能优化之使用SparseArray替代HashMap
  6. Android学习摘要一之Android历史
  7. 计算机操作系统》第06章在线测试,《计算机操作系统》第06章在线测试
  8. 文件io(二)--unix环境高级编程笔记
  9. 使用阿里云加速器解决docker下载镜像太慢的问题
  10. 构建虚拟局域网与漏洞扫描x-scan
  11. 中小企业财务会计管理框架及应用
  12. matlab软件moran值,MATLAB 的moran,LM值
  13. 模糊神经网络应用实例,神经网络与模糊控制
  14. ERP实施-有色金属-铜冶炼
  15. 脱离鼠标后必须记住地快捷命令方式
  16. beaglebone black下接nrf24l01与RFID标签的通信(基于EZSDK linux平台)
  17. 对接支付宝当面付,记录过程
  18. 老男孩46期—冯仁波
  19. torchtorchvision对应版本
  20. 解决 HP Quality Center 在IE9下无法打开问题

热门文章

  1. pixel一代升级android10,谷歌Pixel系列首次Android 10更新:我们都应该知道些什么
  2. python中字典的循环遍历的两种方式
  3. SpringBoot - SpringBoot配置说明
  4. ButterKnife与Fragment的爱恨情仇(java.lang.IllegalStateException: Bindings already cleared.)
  5. python人物抠图算法_比PS还好用!Python 20行代码批量抠图
  6. ARP中使用driftnet工具捕获图片
  7. 大制作,1500多行python代码实现各大平台音乐搜索,下载,收听
  8. springboot毕业设计 基于springboot校园二手交易网站系统毕业设计设计与实现参考
  9. sql语句查询出重复的数据
  10. linux 格斗游戏,新闻|“战斗砖块剧场”占据了 Steam 上 Linux游戏排行榜首位