library(readr)
library(dplyr)
library(plyr)
library(reshape)
library(reshape2)
#基于kaggle数据集https://www.kaggle.com/orgesleka/used-cars-database
auto_original <- read_csv("~/autos.csv")
autos <- auto_original[2:16]
autos <- autos[!(autos$vehicleType %in% c("bus","limousine")),]
autos <- autos[autos$price >= 100 & autos$price <= 100000
& autos$powerPS > 0 & autos$powerPS < 600
& autos$yearOfRegistration >=1910 & autos$yearOfRegistration <= 2016,]
autos <- autos[,-(2:3)]
aggregate(price ~ vehicleType + gearbox, data = autos, function(x) mean(x))
#function(x)用于拓展函数内容
freq_ve <- as.data.frame(with(autos, table(vehicleType, gearbox)))
#该功能也可用aggregate的length(unique(x))实现
library(lattice)
histogram(~ price | vehicleType + gearbox, data = autos)
barchart(prop.table(table(autos$gearbox,autos$vehicleType),margin = 2)[,2:6])
是为了「解决看上去不同,那是否真的具有显著性差异」的问题
#不同车型的变速箱之间的区别
tmp_ve <- with(autos, table(vehicleType, gearbox))
chisq.test(tmp_ve)
#主要针对频数间的差异检验
结果显示,不同车型中变速箱类型的差异 p-value 远小于0.05,可以拒绝不同车型间变速箱类型的数量分布是相同的原假设,即不同车型间变速型类型的区别是有明显差异的。
不同车型和不同变速箱类型之间价格的区别检验,即组间均值检验
#价格分布,明显的偏态分布
hist(autos$price)
#针对两个样本均值间的差异
t.test(price ~ gearbox, data = autos)
如果要检验不只两个样本,则需要用于多组均值检验的方差检验
#先设置aov模型
aov.g <- aov(price ~ gearbox, data = autos)
aov.v <- aov(price ~ vehicleType, data = autos)
#再用anova返回ANOVA的结果
anova(aov.g)
anova(aov.v)
#也可以拓展到更复杂的层面
anova(aov(price ~ gearbox + vehicleType, data = autos))
结果显示,不仅在单因子分析的时候,不同车型和变速箱类型和价格间有显著差异,二者进入多因子分析后,差异依然显著,说明车型和变速箱是影响价格的两个独立变量。
#置信区间的可视化
library(multcomp)
aov.v.g <- aov(price ~ gearbox + vehicleType -1, data = autos)
#通过glht输出每个类的均值。尽管已经用-1移除截距(intercept)了,但依然还是有一个变量存在截距 只需以绝对值理解即可
plot(glht(aov.v.g))
首先是自动挡价格均值明显高于手动挡,其次,SUV依然是各类车型中价格最高的,微型车(Kombi)则是价格均值最低的。
逐步建模,ANOVA选择解释变量
#通过step函数,基于price建立aov模型,为避免过度耗费资源,选取几个认为可能影响价格的变量
aov.step <- step(aov(price ~ gearbox + vehicleType +abtest +yearOfRegistration
+powerPS +kilometer +fuelType +brand +notRepairedDamage, data = autos))
#通过模型的向后迭代,获得最终认为是最「好」的模型,即只移除了用于标示测试与否的abtest一个变量,其他变量均对价格有显著影响,随即即可建立ANOVA模型
anova(aov.step)
逐步建模结果:
ANOVA结果: