鑽石價格的預測
在優達學城學習了《用R進行數據分析》的課程,學些了如何利用回歸方程建模進行預測。
數據來源: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語言實戰之簡單數據處理
※遠的數據分析之路
※Docker+IPython,搭建線上數據分析環境
※用SQL實現 excel常用操作(附一些面試原題)
TAG:数据分析 |