摘要

房价预测一直是人们持续关注的问题,而对于房价的影响因素中,除了外在经济环境以及政策调控之外,更关键的是房屋本身的硬件及软件设施的水平。本文根据Kaggle数据竞赛平台的“美国西雅图国王县房价数据集”,对该数据集中数据进行数据探索性分析,分析变量之间关系。结合分析结果,从房屋本身的内在因素出发,应用线性回归建立三种不同变量选择及处理的房价预测模型,通过比较模型的预测以及残差、拟合优度等结果,得到最终预测效果最佳的模型。

关键词:数据探索性分析;线性回归;房价预测

绪论

研究背景及意义

在近十年来,经济迅速发展,房价也飞速增长,成为社会持续关注的热点问题,而且近年来住宅消费已经成为我国居民消费比例最大的支出,让很多打算或者计划买房的人忧心忡忡。影响房价的因素错综复杂,和供需关系、政府调控、城镇规划等都有一定的关联。因此,如何对房价作出科学有效的预测,也成为该领域一个炙手可热的问题。 线性回归模型作为经典模型,对于房价预测这一研究不在少数,但是大部分对房价预测的研究都集中在对整体经济环境以及国家政策调控等外在因素的影响,对于房屋本身对房价的影响研究十分少见。本文基于西雅图国王县房屋数据,对房屋本身的内在特征与房价之间的关系进行研究,得到预测效果较好的预测房价模型。

研究思路

本文主要内容分为两大部分,分别是数据探索分析和模型建立,本文所有数据的处理均使用R语言。首先对数据进行基本情况进行阐述,根据数据的基本情况对缺失值、变量中的异常值进行预处理,得到最终用来建模的数据集。通过对数据集中各变量之间关系的探索性分析,为后续模型建立提供依据。房价模型建立部分,将建模数据随机划分训练集和验证集,一共建立三个线性模型,分别对模型预测、残差以及拟合效果进行比较,得到效果最好的模型。

数据来源及预处理

数据来源

本文数据来源于Kaggle竞赛网站(https://www.kaggle.com/harlfoxem/housesalesprediction),此数据集是西雅图国王县的2014年5月至2015年5月间出售的房屋销售价格,其中包含的变量名称含义如下:

id——房子的编号;date——房屋出售日期;price——价格(即为因变量);

bedrooms——卧室数量/房子;bathrooms——浴室数量/房子;sqft_living——房屋面积;

sqft_lot——停车面积;floors——房屋楼层;waterfront——是否沿海;

view——是否购买前查看;condition——总体条件;grade——基于国王县住房单元分级系统的整体等级;

sqft_above——除地下室外的房屋面积;sqft_basement——地下室面积;yr_built——建造年份;

yr_renovated——房子装修的年份;zipcode——邮政编码;lat——纬度坐标;

long——经度坐标;sqft_living15——2015年房屋面积;sqft_lot15——2015年停车面积。

library(tidyverse)
library(modelr)
library(ggplot2)
options(scipen = 200)
knitr::opts_chunk$set(
  warning = FALSE,
  message=FALSE
)
library(readr)
data <- read_csv("C:/Users/Administrator/Desktop/kc_house_data.csv")

基本数据情况

首先可以看到原始数据的基本结构为:

dim(data)
## [1] 21613    21

原始数据中的变量类型如下,可以看到,数据集中将waterfront、view等一些分类变量已经进行了数值化的处理,变量在数据集中均以数值型数据表示。

data %>% map_chr(typeof)
##            id          date         price      bedrooms     bathrooms 
##   "character"      "double"      "double"     "integer"      "double" 
##   sqft_living      sqft_lot        floors    waterfront          view 
##     "integer"     "integer"      "double"     "integer"     "integer" 
##     condition         grade    sqft_above sqft_basement      yr_built 
##     "integer"     "integer"     "integer"     "integer"     "integer" 
##  yr_renovated       zipcode           lat          long sqft_living15 
##     "integer"     "integer"      "double"      "double"     "integer" 
##    sqft_lot15 
##     "integer"

对原始数据的缺失值进行处理,根据筛选结果可以看到,数据集比较整齐,不含有缺失值,

sum(is.na(data))
## [1] 0

对原始数据集中所有变量基本情况进行展示,包括变量的极值、分位数以及均值的情况。

summary(data)
##       id                 date                         price        
##  Length:21613       Min.   :2014-05-02 00:00:00   Min.   :  75000  
##  Class :character   1st Qu.:2014-07-22 00:00:00   1st Qu.: 321950  
##  Mode  :character   Median :2014-10-16 00:00:00   Median : 450000  
##                     Mean   :2014-10-29 04:38:01   Mean   : 540088  
##                     3rd Qu.:2015-02-17 00:00:00   3rd Qu.: 645000  
##                     Max.   :2015-05-27 00:00:00   Max.   :7700000  
##     bedrooms        bathrooms      sqft_living       sqft_lot      
##  Min.   : 0.000   Min.   :0.000   Min.   :  290   Min.   :    520  
##  1st Qu.: 3.000   1st Qu.:1.750   1st Qu.: 1427   1st Qu.:   5040  
##  Median : 3.000   Median :2.250   Median : 1910   Median :   7618  
##  Mean   : 3.371   Mean   :2.115   Mean   : 2080   Mean   :  15107  
##  3rd Qu.: 4.000   3rd Qu.:2.500   3rd Qu.: 2550   3rd Qu.:  10688  
##  Max.   :33.000   Max.   :8.000   Max.   :13540   Max.   :1651359  
##      floors        waterfront            view          condition    
##  Min.   :1.000   Min.   :0.000000   Min.   :0.0000   Min.   :1.000  
##  1st Qu.:1.000   1st Qu.:0.000000   1st Qu.:0.0000   1st Qu.:3.000  
##  Median :1.500   Median :0.000000   Median :0.0000   Median :3.000  
##  Mean   :1.494   Mean   :0.007542   Mean   :0.2343   Mean   :3.409  
##  3rd Qu.:2.000   3rd Qu.:0.000000   3rd Qu.:0.0000   3rd Qu.:4.000  
##  Max.   :3.500   Max.   :1.000000   Max.   :4.0000   Max.   :5.000  
##      grade          sqft_above   sqft_basement       yr_built   
##  Min.   : 1.000   Min.   : 290   Min.   :   0.0   Min.   :1900  
##  1st Qu.: 7.000   1st Qu.:1190   1st Qu.:   0.0   1st Qu.:1951  
##  Median : 7.000   Median :1560   Median :   0.0   Median :1975  
##  Mean   : 7.657   Mean   :1788   Mean   : 291.5   Mean   :1971  
##  3rd Qu.: 8.000   3rd Qu.:2210   3rd Qu.: 560.0   3rd Qu.:1997  
##  Max.   :13.000   Max.   :9410   Max.   :4820.0   Max.   :2015  
##   yr_renovated       zipcode           lat             long       
##  Min.   :   0.0   Min.   :98001   Min.   :47.16   Min.   :-122.5  
##  1st Qu.:   0.0   1st Qu.:98033   1st Qu.:47.47   1st Qu.:-122.3  
##  Median :   0.0   Median :98065   Median :47.57   Median :-122.2  
##  Mean   :  84.4   Mean   :98078   Mean   :47.56   Mean   :-122.2  
##  3rd Qu.:   0.0   3rd Qu.:98118   3rd Qu.:47.68   3rd Qu.:-122.1  
##  Max.   :2015.0   Max.   :98199   Max.   :47.78   Max.   :-121.3  
##  sqft_living15    sqft_lot15    
##  Min.   : 399   Min.   :   651  
##  1st Qu.:1490   1st Qu.:  5100  
##  Median :1840   Median :  7620  
##  Mean   :1987   Mean   : 12768  
##  3rd Qu.:2360   3rd Qu.: 10083  
##  Max.   :6210   Max.   :871200

由于价格为本次模型建立的因变量,这里重点对价格的分布进行可视化:

ggplot(data=data, aes(x = price)) +
  geom_histogram(col = 'black',  binwidth = 200000, center = 100000)

根据房价的数据分布可以看到,房价整体呈现右偏,房价在2000000美元至4000000美元之间隐约可以看到少量房屋价格在这个范围内,但是4000000美元以上的大部分的留白说明数值存在异常值。结合房价变量的六数结果可以知道,房价最小值为75000美元,均值为540088美元,最大值为7700000美元。根据房价分布图可知,数据集中的房价集中在321950美元至645000美元,以房价中位数代表房价的平均水平,即540088美元。由于房价的整体分布非正态,则在后续建模时需要考虑对房价这一变量进行适当的变化以提高模型的预测能力。

数据预处理

根据输出的变量基本情况可以看到bedrooms,sqft_living,sqft_lot15三个变量的极值都为与现实情况不符的异常值,同时,在对价格变量的频数分布图中分析得到,价格变量中也存在一定的异常值,为对异常值进行处理,重点关注变量取某些值时的数量少于10个的情况,进行可视化得到下图:

ggplot(data=data,aes(x=price))+
  geom_histogram(col = 'black',binwidth = 200000,center = 100000)+
  coord_cartesian(ylim = c(0,10))

由上图可以看到房价大于6000000美元的豪宅数量极少,这里考虑到删除这部分极值影响。

ggplot(data,aes(x=bedrooms))+
  geom_histogram(col = 'black')+
  coord_cartesian(ylim = c(0,10))

在卧室数量这一变量中只存在一个异常值,即一个房屋中有33个卧室,显然是可能不是存在这种情况,可能是记录时出现失误,这里直接删除这条记录。

ggplot(data,aes(x=sqft_living))+
  geom_histogram(col = 'black')+
  coord_cartesian(ylim = c(0,10))+
  scale_x_continuous(breaks = seq(0,15000,4000))

由图可知,房屋面积大于8000平方英尺的个数很少,且现实生活中这么大面积的房屋交易情况也极少,所以考虑将这部分数据列为异常值,删掉记录。

ggplot(data,aes(x=sqft_lot15))+
  geom_histogram(col = 'black')+
  coord_cartesian(ylim = c(0,10))

根据2015年房屋停车场面积分布的局部图可以看到,面积大于500000平方英尺的数据只有三条,为异常值,故删除。

结合数据基本结构的输出结果以及变量个数的局部情况,为避免建模时可能出现的负面影响,进行异常值处理。同时,由于本文重点在于房屋自身的条件对房价影响,而与交易房屋的时间等外部因素无关,所以删除房子编号和日期两个变量,最终得到数据data_house,包括21600条房屋记录,一共19个变量。

data_house<-data%>%
  filter(bedrooms!=33,
         sqft_living <= 8000,
         price <= 6000000,
         sqft_lot15 <= 500000)%>%
  select(price:sqft_lot15)
dim(data_house)
## [1] 21600    19

探索性数据分析

变量数据分析可视化

(1)每年建设房屋的数量

通过对数据按照建造时间分组,得到每个年份建造房屋的数量,绘制折线图以及整体数量变化趋势线,得到下图。可以从图中看出,从1900年到2015年,房屋的建造数量整体呈现增加趋势,但是相邻较短间隔的年份之间的房屋建造数量存在一定波动性。

data_house%>%group_by(yr_built)%>%
  summarise(n = n()) %>%
  ggplot(aes(x = yr_built, y = n)) +
  geom_line(color = 'black') +
  geom_point(color = 'red', size = 0.5) +
  geom_smooth(method="lm", color = 'blue', size = 0.5,se=FALSE)

(2)房屋建造时间和装修时间

绘制房屋建造时间与价格之间的散点图,同时将装修时间作为散点图中点的颜色,由此可得到房屋建造时间与装修时间之间的关系。从下图中可以看到,1900年至1975年左右建造的房屋,在2000年左右进行装修的情况较多。

options(repr.plot.width=6, repr.plot.height=3)
ggplot(data_house,aes(x=yr_built,y=price,col=yr_renovated))+
  geom_point(position = "jitter")

(3)房屋装修时间与等级

由于大部分房屋的装修时间取值为零,即未进行装修,这里使用filter函数将1900之后进行装修的记录筛选出来,与房屋条件一起绘制出分层柱状图,根据柱状图首先可以得到房屋装修时间集中在2000年左右的结论,与上文结论一致。还可以看到进行装修的房屋大部分都属于第三类条件,尤其2000年及之后装修的房屋属于第三类条件的数量多于装修时间早的房屋,1975年至2000年间装修的房屋属于第四类条件的数量多于其他时间装修的房屋。

options(repr.plot.width=6, repr.plot.height=3)
data_house %>% filter(yr_renovated>1900)%>%
  ggplot(aes(x=yr_renovated,fill=factor(condition)))+
  geom_histogram(binwidth=2)+
  theme(legend.position="bottom")+
  scale_x_continuous(limits=c(1900,2017))

(4)2015年房屋面积与停车区域面积、房屋登记、房屋整体条件

本文将两个数值型变量sqft_living15,sqft_lot15和两个类别型的变量grade,condition放在同一张图上进行可视化分析,这里由于类别型变量同为数值型,所以进行因子型变量的转化。根据绘制的图可以看到等级为6-8级的房子和整体条件为第三类的房屋数量占主导地位。

ggplot(data_house, aes(x = sqft_living15, y = sqft_lot15)) +
  geom_point(alpha = 0.5, aes(shape = as.factor(condition), color = as.factor(grade)),
             position = "jitter")

变量相关性可视化

在模型中具有太多特征并不总是一件好事,因为当我们想要预测新数据集的值时,它可能会导致过度拟合和恶化结果。因此,如果某个特征不能很好地改进建立的模型,那么不添加它可能是更好的选择。接下来会对数据集中可用的自变量与需要进行预测的因变量(即价格)之间的相关关系进行分析,这些分析应该为后续建立回归模型提供一些参考见解。

(1)相关系数矩阵图

这里使用“GGally”包中的ggcorr函数,绘制数据集中所有变量之间的相关系数矩阵图如下:

library(GGally)
ggcorr(data[,3:21] ,name = "corr", label = TRUE, hjust = 1, label_size = 2.5, 
       angle = -45, size = 3)

上图中最后一行即为房价与其他变量之间的相关系数。首先可以看到的是卧室数量、房屋面积、房屋等级、除地下室以外的房屋面积以及2015年的房屋面积这五个变量与房价之间的相关系数较高,而停车区域面积、房屋整体条件、房屋建造时间、装修时间、邮政编码、纬度以及2015年的停车面积这几个变量似乎与房价之间关系不大。此外,sqft_living与例如浴室数量之间存在较大的相关性。 这是常识,随着房屋面积的增加,浴室的数量一定也在增加。

在得到相关矩阵后,由于本文的数据集并不是含有非常多的特征,因而我们可以逐一检查其中的大部分特征。本文选择与因变量相关为0.3及以上的变量和因变量分别绘制图形,通过可视化来探索单个变量与因变量之间的潜在关联,并获得一些有用的分析结果。

(2)离散型变量与因变量之间关系

使用map函数将房价与房屋等级、浴室数量、卧室数量、楼层数、是否沿海以及是否看过房屋六个离散型的变量绘制箱线图,由于这些变量的取值带有一定的含义,故这里进行转化为因子变量进行处理,得到以下六张图:

data_house%>%
  select(grade,bathrooms,bedrooms,floors,waterfront,view)%>%
  map(~ggplot(data=data.frame(.),aes(x=as.factor(.),y=data_house$price))+
                   geom_boxplot()+
                     labs(x=names(.)))
## $grade

## 
## $bathrooms

## 
## $bedrooms

## 
## $floors

## 
## $waterfront

## 
## $view

根据绘制得到的箱线图可以看出:

<1>图1中随着房屋等级的增加,房价的中位数也在不断增加,呈现明显的线性趋势,说明房屋等级与房价之间的确存在较强的相关关系;

<2>图2是浴室数量,虽然整体房价随浴室数量增加,但也存在明显的低点;

<3>图3为卧室数量,整体来看房价中位数变化不大,但是箱线图可以看出极端值情况出现较多;

<4>图4为楼层数,房价中位数波动很小,但楼层数为2.5的房价水平更高一些,这里将房屋内的楼层记为0.5;

<5>图5可以看到,房屋是否沿海是一个二元变量,具有潜在的连续分布,对房价存在不小的影响。不沿海取值的箱体较短,表明整体而言该取值下的房价非常接近,沿海取值箱体较高,说明房价差距较大,两种取值分布之间存在明显的形状差异,表明一般来说,对于沿海的房屋而言,销售价格较高。

<6>最后一张图为是否看过房屋,可以看到变量取值的增大会伴随房价的中位数增加,表明view变量与房价之间存在一定的线性关系。

(3)连续型变量与因变量之间关系

data_house%>%
  select(sqft_living,sqft_above,sqft_lot15,sqft_basement)%>%
  map(~ggplot(data=data.frame(.),aes(x=.,y=data_house$price))+
        geom_point()+
        geom_smooth(method="lm",se=F,alpha=0.6,size=0.5,color="blue")+
        labs(x=names(.)))
## $sqft_living

## 
## $sqft_above

## 
## $sqft_lot15

## 
## $sqft_basement

<1>由前两幅图可以看出,房屋面积和房屋除地下室的面积与房价之间存在高度的相关性,且两个变量的散点分布情况非常相似。根据变量的相关系数矩阵图可以知道sqft_livng、sqft_basement和sqft_above这3个变量之间存在强烈的正相关关系(r>0.7)。很明显,对于sqft_above来说,它等于sqft_livng-sqft_basement。所以我们知道它们都会对价格产生影响。

<2>由图4可以看出sqft_basement分布中有很多零(即没有地下室),sqft_basement与房价之间在取值不为零时存在一定的相关关系,但因为零这一取值整体变量之间不再有那么强的相关性。

<3>另外,根据第三幅图可以看到2015年的停车面积与房价之间的关系似乎不大。

通过绘制了价格与某些特征变量之间的关系图,得到了与相关矩阵平行的结果。可以发现,在价格和这些单个特征之间,并没有一个完美的线性关系,因而考虑建立多元线性回归模型对房价进行预测。

预测模型建立及分析

本文为更好的检验模型预测效果,首先将数据集中的70%划分为训练集数据,用于模型建立,30%划分为验证集数据,用于验证模型样本外预测效果。考虑建立三个模型进行模型拟合以及预测效果的比较,得到最终效果最佳的模型。

建立预测模型

首先将数据划分为训练集train_data和验证集数据test_data:

set.seed(1234)
id<-sample(2,nrow(data_house),prob=c(0.70,0.30),replace=TRUE)
train_data<-data_house[id==1,]
test_data<-data_house[id==2,]

(1)相关性较高的变量

使用与因变量房价的相关系数在0.5及以上的5个变量(即bathrooms,sqft_living,grade,sqft_above,sqft_living15)进行建模,考虑到变量之间存在一定的交互效应,所以采用交互性的模型建立,得到model1:

model1<-lm(price~bathrooms*sqft_living*grade*
             sqft_above*sqft_living15,data=train_data)

利用建立好的模型1预测验证集数据,并可视化预测模型,可以初步看到模型预测效果一般。

pred1<-test_data%>%
  add_predictions(model1)
ggplot(pred1,aes(x=price,y=pred))+
  geom_point()+
  geom_abline(color="blue")

(2)所有变量

由于只使用相关系数较高的变量建模效果一般,可能是因为有些房价的影响因素没有考虑进去,第二个模型建立时使用数据集中的所有变量建立模型model2:

model2<-lm(price~.,data = train_data)

同样利用验证集数据在model2上进行预测并可视化模型得到下图,可以看到model2的模型效果明显比model1要好,说明model1中变量对因变量的解释能力不够,应该使用所有变量进行建模,但图中模型的预测能力还是不太理想,预测模型得到的直线下方数据信息没能很好的吸收进模型中。

pred2<-test_data%>%
  add_predictions(model2)
ggplot(pred2,aes(x=price,y=pred))+
  geom_point()+
  geom_abline(color="blue")

但是由于使用所有变量建模时出现“从秩不足的拟合预测可能会产生误导”的警告,则对model2的模型进行深入的研究。使用summary函数得到model2模型的细节,可以看到sqft_basement变量的信息均为NA,这里NA作为回归中的系数表示变量sqft_basement与其他变量之间存在高度线性相关,根据前文变量相关性分析可知,sqft_basement等于sqft_livng - sqft_above,则模型仍需要进行改进。

summary(model2)
## 
## Call:
## lm(formula = price ~ ., data = train_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1268957   -97465   -10289    75105  3147101 
## 
## Coefficients: (1 not defined because of singularities)
##                    Estimate    Std. Error t value             Pr(>|t|)    
## (Intercept)   5240359.90487 3361124.75302   1.559             0.118992    
## bedrooms       -33739.25036    2258.61539 -14.938 < 0.0000000000000002 ***
## bathrooms       39895.48972    3748.20243  10.644 < 0.0000000000000002 ***
## sqft_living       137.16993       5.04128  27.209 < 0.0000000000000002 ***
## sqft_lot            0.16190       0.05274   3.070             0.002145 ** 
## floors          14102.54965    4121.24847   3.422             0.000623 ***
## waterfront     600360.42498   20126.23681  29.830 < 0.0000000000000002 ***
## view            49939.70961    2467.90356  20.236 < 0.0000000000000002 ***
## condition       27150.66221    2694.21257  10.077 < 0.0000000000000002 ***
## grade           95196.18814    2466.57704  38.594 < 0.0000000000000002 ***
## sqft_above         27.23341       5.02234   5.422         0.0000000597 ***
## sqft_basement            NA            NA      NA                   NA    
## yr_built        -2616.47583      83.52841 -31.324 < 0.0000000000000002 ***
## yr_renovated       13.22391       4.17741   3.166             0.001551 ** 
## zipcode          -545.05059      37.69742 -14.459 < 0.0000000000000002 ***
## lat            592411.81527   12226.82185  48.452 < 0.0000000000000002 ***
## long          -200531.80790   15051.67954 -13.323 < 0.0000000000000002 ***
## sqft_living15      33.88552       3.97946   8.515 < 0.0000000000000002 ***
## sqft_lot15         -0.36977       0.08800  -4.202         0.0000266011 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 192800 on 15099 degrees of freedom
## Multiple R-squared:  0.7032, Adjusted R-squared:  0.7028 
## F-statistic:  2104 on 17 and 15099 DF,  p-value: < 0.00000000000000022

(3)因变量取对数且筛选变量

根据model2的模型系数信息,考虑删除sqft_basement变量,故对训练集和验证集数据进行删除变量的处理,得到train_data1和test_data1.又因为由第二章内容可知,房价变量的分布非正态分布,所以本文这里将因变量进行取10对数处理再与其余自变量进行建模,得到model3。

train_data1<-train_data[,-which(names(train_data)=="sqft_basement")]
test_data1<-test_data[,-which(names(train_data)=="sqft_basement")]
model3<-lm(log10(price)~.,data = train_data1)

利用验证集数据进行预测,并对model3进行可视化,可以大致判断model3的效果还不错。

pred3<-test_data1%>%
  add_predictions(model3)
ggplot(pred3,aes(x=price,y=10^pred))+
  geom_point()+
  geom_abline(color="blue")

预测模型残差分析

利用add_residuals函数得到三个模型的预测残差,并逐个对模型残差进行残差分布以及残差散点的可视化。

(1)model1误差可视化

model1的残差分布与标准正态分布相比,呈现尖峰薄尾,说明虽然误差大部分集中在一个区域内,但是仍然存在较大的误差存在,说明模型数据中仍有信息未被利用。根据model1的误差散点图可以看到模型误差呈放射状,说明模型存在一定异方差。

resid1<-pred1%>%
  add_residuals(model1)
ggplot(resid1,aes(resid))+
  geom_freqpoly()

ggplot(resid1,aes(x=sqft_living,y=resid))+
  geom_ref_line(h=0)+
  geom_point()

(2)model2误差可视化

对model2误差分布进行可视化,可以看到model2的误差分布右偏,说明误差中存在一定的结构信息未被挖掘出来。且从model2的残差散点图可以看到,残差并未均匀分布在0左右。

resid2<-pred2%>%
  add_residuals(model2)
ggplot(resid2,aes(resid))+
  geom_freqpoly()

ggplot(resid2,aes(x=sqft_living,y=resid))+
  geom_ref_line(h=0)+
  geom_point()

(3)model3误差可视化

根据model3的残差可视化结果可以首先看到,该模型的残差近似呈现正态分布,且残差散点图中的残差均匀分布在误差为0的直线附近,说明对房价进行对数处理的做法合理有效。

resid3<-pred3%>%
  add_residuals(model3)
ggplot(resid3,aes(resid))+
  geom_freqpoly()

ggplot(resid3,aes(x=sqft_living,y=resid))+
  geom_ref_line(h=0)+
  geom_point()

模型结果比较

经过模型以及模型残差的可视化基本可以确定建立的model3的效果最好,本文还进行了模型拟合优度以及模型预测均方误差的比较,进一步验证模型比较结果。使用broom包中的glance函数对模型的结果进行计算,提取结果中的调整后的R方,并使用mse函数来计算模型预测的均方误差。由于model3对因变量进行对数处理,所以数量量纲与前两个模型存在差异,故对数据进行还原再进行mse计算。最终结果得到下表:

r1=broom::glance(model1)$adj.r.squared
mse1=mse(model1,test_data)
r2=broom::glance(model2)$adj.r.squared
mse2=mse(model2,test_data)
r3=broom::glance(model3)$adj.r.squared
pred3_10<-10^resid3$pred
mse3=mean((pred3_10-resid3$price)^2)
x<-tibble(Model=c("model1","model2","model3"),
              adj.r.squared=c(r1,r2,r3),
              MSE=c(mse1,mse2,mse3))
pander::pandoc.table(x)
## 
## --------------------------------------
##  Model    adj.r.squared       MSE     
## -------- --------------- -------------
##  model1      0.6087       49960308373 
## 
##  model2      0.7028       36945764243 
## 
##  model3      0.7704       34617275436 
## --------------------------------------

根据模型结果表可以看到,与前文分析结果相同,通过三次对模型变量的调整选择,模型的拟合优度以及均方误差都在不断的优化改善,最终对房价进行对数处理且去掉sqft_basement变量后得到的model3的调整后R方最大为0.7704,MSE最小为34617275436。故对房价进行预测时,采用model3的建模形式更为合理。

结论及展望

结论

本文通过使用西雅图国王县房屋数据,对房屋本身的内在特征与房价之间的关系进行数据探索性分析,对变量间关系进行可视化。基于变量关系研究,建立预测房价的三种模型,通过将数据分为训练集和验证集对模型的预测效果、预测残差进行可视化,直观看到对房价进行对数处理且去掉sqft_basement变量后得到的model3的预测效果最好,同时通过模型的拟合优度以及均方误差值比较进一步证明了这一结果。

展望

(1)本文数据来自Kaggle竞赛网站,且数据时效性不强,区域局限性较大,对于其他地区的模型适用性未知。后续可以结合中国地区数据对模型进行完善,进一步提高模型的泛化程度,增大模型适用性。

(2)本文对数据的探索性分析较为简单,还有很多变量之间的关系未挖掘出来。