原文链接:http://tecdat.cn/?p=21467

目的

房价有关的数据可能反映了中国近年来的变化:

  • 人们得到更多的资源(薪水),期望有更好的房子

  • 人口众多

  • 独生子女政策:如何影响房子的几何结构?更多的卧室,更多的空间

我核心的想法是预测房价。然而,我不打算使用任何arima模型;相反,我将使用数据的特性逐年拟合回归。

结构如下:

  • 数据准备:将数值特征转换为分类;缺失值

  • EDA:对于数值特征和分类特征:平均价格与这些特征的表现

  • 建模:

    • 分割训练/测试给定年份的数据:例如,在2000年分割数据;根据这些数据训练回归模型

    • 然后,在2016年之前的所有新年里,预测每套房子的价值。

    • 用于验证的度量将是房屋的平均价格(即每年从测试样本中获得平均价格和预测值)

数据准备

我们对特征有了非常完整的描述:

  • url:获取数据(字符)的url

  • id:id(字符)

  • Lng:和Lat坐标,使用BD09协议。(数字)

  • Cid:社区id(数字)

  • 交易时间:交易时间(字符)

  • DOM:市场活跃日。(数字)

  • 关注者:交易后的人数。(数字)

  • 总价:(数值)

  • 价格:按平方计算的平均价格(数值)

  • 面积:房屋的平方(数字)

  • 起居室数(字符)

  • 客厅数(字符)

  • 厨房:厨房数量(数字)

  • 浴室数量(字符)

  • 房子高度

  • 建筑类型:包括塔楼(1)、平房(2)、板塔组合(3)、板(4)(数值)

  • 施工时间

  • 装修:包括其他(1)、粗(2)、简单(3)、精装(4)(数值)

  • 建筑结构:包括未清(1)、混合(2)、砖和木(3)、砖混凝土(4)、钢(5)和钢-混凝土复合材料(6)(数值)

  • 梯梯比:同层居民数与电梯数量的比例。

  • 电梯有(1)或没有电梯(0)(数值)

  • 五年期:业主拥有不到5年的财产(数字)

数据清理、特征创建

从最初的数据看:

  • 从网址上,我发现它有位置信息,如chengjiao/101084782030。同样,一个简单的regexp进行省特征提取。

  • 另一个大的数据准备工作是转换一些数字特征,比如地铁,地铁站附近的房子编码为1,相反的情况编码为0。

  • 还有很大一部分DOM缺失。我既不能在建模中使用这个特性,也不能删除NA,但它也会减小数据帧的大小。

#从网址中提取省份sapply(df$url, function(x) strsplit(x,'/')[[1]][4])

检查缺失

#缺失数据图ggplot(data = .,aes(x = V2, y = V1)) + geom_tile(aes(fill = value )) +

  • 如上所述,DOM的很大一部分丢失了。我决定先保留这个特性,然后用中间值来填充缺失的值(分布是非常倾斜的)

  • 否则,buildingType和communityAverage(pop.)中只有几个缺少的值,我决定简单地删除这些值。事实上,它们只占了约30行,而整个数据集的数据量为300k+,因此损失不会太大。

  • 下面我简单地删除了我以后不打算使用的特征。

ifelse(is.na(df$DOM),median(df$DOM,na.rm=T),df$DOM)

用于将数字转换为类别的自定义函数

对于某些特征,需要一个函数来处理多个标签,对于其他一些特征(客厅、客厅和浴室),转换非常简单。

df2$livingRoom <- as.numeric(df2$livingRoom)

似乎buildingType具有错误的编码数字值:

buildingType count
0.048 4
0.125 3
0.250 2
0.333 5
0.375 1
0.429 1
0.500 15
0.667 1
1.000 84541
2.000 137
3.000 59715
4.000 172405
NaN 2021

由于错误的编码值和NA的数量很少,因此我将再次丢弃这些行

df2$renovationCondition <- sapply(df2$renovationCondition, ionCondition)df2$buildingStructure <- sapply(df2$buildingStructure, makeStructure)
df2$elevator <- ifelse(df2$elevator==1,'has_elevator','no_elevator')

缺失值检察

# 缺失数据图
df2 %>% is.na %>% melt %>% ggplot(data = .,aes(x = Var2, y = Var1)) + geom_tile(aes(fill = value)) +scale_fill_manual(values = c("grey20","white")) + theme_minimal(14) +

kable(df %>% group_by(constructionTime) %>% summarise(count=n()) %>% arrange(-count) %>% head(5))
constructionTime count
2004 21145
2003 19409
NA 19283
2005 18924
2006 14854
df3 <- data.frame(df2 %>% na.omit())

插补后的最终检查

any(is.na(df3))
## [1] FALSE

探索性分析

由于有数字和分类特征,我将使用的EDA技术有:

  • 数值:相关矩阵

  • 分类:箱线图和地图

我们必须关注价格(单位价格/单位价格)以及总价格(百万元)
totalPrice将是回归模型的目标变量。

数值特征

corrplot(cor(df3  ,tl.col='black')

评论

  • totalPrice与communityAverage有很强的正相关关系,即人口密集区的房价较高

  • totalPrice与客厅、卫浴室数量有一定的正相关关系。

  • 至于面积变量,我们看到它与上述变量也有很强的相关性:这是有道理的,因为如果房子的面积大,可以建造更多的房间(显而易见)。

  • 其他一些有趣的相关性:communityAverage与建筑时间呈负相关,这意味着在人口密集区建房所需的时间更短

分类特征

地图

  • 中国三级(省)地图

  • 我看了看城郊,它位于北京附近,所以我过滤了那个特定省份的地图

ggplot() + geom_polygon(data = shapefile_test,aes(x = long, y = lat, group = group), BeijingLoc <- data.frame('Long'=116.4075,'Lat' = 39.904)

建筑结构

makeEDA('buildingStructure' )

砖木结构的房屋是最昂贵的,几乎是其他类型房屋的两倍

建筑类型

makeEDA('buildingType' )

  • 平房是最昂贵的

装修条件

电梯

  • 价格对电梯的依赖性非常小

  • 住宅的分布与这一特征是相对相等的。

地铁

  • 价格对地铁站附近的依赖性非常小。

  • 住宅的分布与这一特征是相对相等的。

是否满_五年_

makeFeatureCatEDA('fiveYearsProperty', length(unique(df3$fiveYearsProperty)))

  • 对于是否拥有不到5年房产来说,价格的依赖性确实很小

  • 就这一特征而言,房子的分布是相对平等的

区域

回归模型

策略

  • 从tradeTime中提取年份和月份

  • 按年度和月份分组,得到房屋的数量和均价

  • 拆分数据集:

    • 对于年[2010-2017]=在这组年上训练并运行回归模型

    • 对于>2017年:逐月对测试样本并预测平均价格

平均价格总览

首先我们需要看看我们想要预测什么

df3$year <- year(df3$tradeTimeTs)
df3$month <- month(df3$tradeTimeTs)
df3 %>% filter(year>2009) %>% group_by(monthlyTrad) %>% summarise(count=n(), mean = mean(price)) %>% ggplot(aes(x=monthlyTradeTS, y= mean)) +

  • 平均价格上涨至2017年中期,然后迅速下降

  • 同时,房屋数量随着价格的上涨而增加,而且现在房屋交易的数量也随着价格的上涨而减少。

准备训练/测试样本

我在2017-01-01拆分数据。对于所有样本,我需要把分类特征变成伪变量。

df_train <- data.frame(df  %>% filter(year>2009 & year<2017))
df_test <- data.frame(df %>% filter(year>=2017))
as.data.frame(cbind(df_train %>% select_if(is.numeric) %>% select(-Lng, -Lat, -year, -month),'bldgType'= dummy.code(df_train$buildingType),'bldgStruc'= dummy.code(df_train$buildingStructure),'renovation'= dummy.code(df_train$renovationCondition),'hasElevator'= dummy.code(df_train$elevator),

在这一步中,我只训练一个线性模型

regressors<-c('lm')Control <- trainControl(method = "cv",number = 5, repeats=3)
for(r in regressors){cnt<-cnt+1res[[cnt]]<-train(totalPrice ~., data = train ,method=r,trControl =  Control)

r^2在0.88左右,不错。让我们看看细节。

训练精度

g1<-ggplot(data=PRED,aes(x=Prediction,y=True)) + geom_jitter() + geom_smooth(method='lm',size=.5) +#计算指标mse <- mean((PRED$True-PRED$Prediction)^2)rmse<-mse^0.5SSE = sum((PRED$Pred - PR

## [1] "MSE: 15952.845934 RMSE : 126.304576 R2 :0.795874"
  • 所以看起来残差还不错(分布是正态的,以0为中心),但对于低价格来说似乎失败了。

训练和测试样本的预测与时间的关系

  • 基本上与上述相同,但我将重复预测所有月份的训练数据

  • 我的目标指标是平均房价。

  • 训练是在10多年的训练样本中完成的,因此逐月查看预测将非常有趣。

# 训练样本->训练精度for (i in 1:length(dates_train)){current_df <- prepareDF(current_df)current_pred <- mean(predict(res[[1]],current_df))#运行测试样本-->测试精度for (i in 1:length(dates_test)){current_df <- prepareDF(current_df)current_pred <- mean(predict(res[[1]],current_df))
RES %>% reshape2::melt(id=c('date','split')) %>% ggplot(aes(x=date,y=value)) + geom_line(aes(color=variable, lty=split),size=1) +

  • 预测对于2012年之后的数据确实非常好,这可能与有足够数据的月份相对应

改进

地理位置作为特征

  • 下面是一个有趣的图;它显示了每个位置的总价格。在二维分布的中心,价格更高。

  • 这个想法是计算每个房子到中心的距离,并关联一个等级/分数

BeijingLoc <- data.frame('Long'=116.4075,'Lat' = 39.904)
df3 %>% ggplot(aes(x=Lng,y=Lat)) + geom_point(aes(color=price),size=.1,alpha=.5)  + theme(legend.position = 'bottom') +


点击标题查阅往期内容

R语言多元逐步回归模型分析房价和葡萄酒价格:选择最合适的预测变量

R语言分位数回归Quantile Regression分析租房价格

重庆住房租赁市场现状分析:解读出租房市场的数据密码

R语言惩罚logistic逻辑回归(LASSO,岭回归)高维变量选择的分类模型案例

R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类

R语言实现CNN(卷积神经网络)模型进行回归数据分析

R语言中使用非凸惩罚函数回归(SCAD、MCP)分析前列腺数据

R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归

【视频】R语言实现CNN(卷积神经网络)模型进行回归数据分析

R语言ISLR工资数据进行多项式回归和样条回归分析

R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型

R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型

R语言如何和何时使用glmnet岭回归

更多内容,请点击左下角“阅读原文”查看报告全文

关注我们

案例精选、技术干货 第一时间与您分享

长按二维码加关注

更多内容,请点击左下角“阅读原文”查看报告全文

R语言线性回归和时间序列分析北京房价影响因素可视化案例相关推荐

  1. 拓端tecdat|R语言线性回归和时间序列分析北京房价影响因素可视化案例

    最近我们被客户要求撰写关于北京房价影响因素的研究报告,包括一些图形和统计输出. 目的 房价有关的数据可能反映了中国近年来的变化: 人们得到更多的资源(薪水),期望有更好的房子 人口众多 独生子女政策: ...

  2. R语言mgcv包时间序列分析在空气污染与健康领域的应用(3)---模型自由度选择

    广 义 相 加 模 型 ( generalized additional model,GAM)是对传统广义线性模型的非参数拓展,可有效处理解释变量与效应变量间复杂的非线性关系.GAM 目前已广泛应用于 ...

  3. R语言mgcv包时间序列分析在空气污染与健康领域的应用(1)

    在空气污染与健康研究领域,经常需要用时间序列方法将随时间变化的污染物暴露资料和随时间变化的事件发生数资料联系起来,分析人群健康结局与暴露水平之间的关系. 时间序列分析是根据系统观测得到的时间序列数据, ...

  4. 如何在R语言中建立六边形矩阵热图heatmap可视化

    原文链接:http://tecdat.cn/?p=18879 这是一个六边形热图可视化程序,主要用到的知识RColorBrewer,fields,也就是R中的可视化绘图库(点击文末"阅读原文 ...

  5. 视频|分类模型评估:精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现

    最近我们被客户要求撰写关于分类模型的研究报告,包括一些图形和统计输出. 本文将帮助您回答以下问题: ROC曲线是什么? 曲线下的面积是多少? 二元分类的决策阈值是多少? 分类模型可接受的 AUC值是多 ...

  6. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.4 探索所有男选手的跑步时间...

    本节书摘来自华章计算机<数据科学R语言实践:面向计算推理与问题求解的案例研究法>一书中的第2章,第2.4节,作者:[美] 德博拉·诺兰(Deborah Nolan) 邓肯·坦普·朗(Dun ...

  7. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.6 对个人跑步时间的变化进行建模...

    本节书摘来自华章计算机<数据科学R语言实践:面向计算推理与问题求解的案例研究法>一书中的第2章,第2.6节,作者:[美] 德博拉·诺兰(Deborah Nolan) 邓肯·坦普·朗(Dun ...

  8. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.1 引言...

    本节书摘来自华章计算机<数据科学R语言实践:面向计算推理与问题求解的案例研究法>一书中的第2章,第2.1节,作者:[美] 德博拉·诺兰(Deborah Nolan) 邓肯·坦普·朗(Dun ...

  9. 《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.3 数据清洗和变量格式化...

    本节书摘来自华章计算机<数据科学R语言实践:面向计算推理与问题求解的案例研究法>一书中的第2章,第2.3节,作者:[美] 德博拉·诺兰(Deborah Nolan) 邓肯·坦普·朗(Dun ...

最新文章

  1. PCL点云特征描述与提取(3)
  2. ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
  3. 物联网与万物互联有什么区别?
  4. php smarty模板配置,Smarty模板简单配置与使用方法示例
  5. PHP反射原理的实现
  6. jmeter接口测试----8用户定义的变量
  7. Python框架篇之Django(路由系统URL、视图函数views)
  8. python字符串索引位置替换 不搞虚的 直上代码
  9. Spring Boot整合Swagger3注解@ApiImplicitParam的paramType属性为“path“
  10. 远程办公的破冰行动!
  11. 在centos7上使用yum安装jdk1.8
  12. linux磁盘及文件系统管理
  13. __CTOR_LIST__和__DTOR_LIST__解释
  14. 获取post请求的几种常见方式
  15. 股指期货风险管理实证研究——以2015年股灾为例实证分析/VaR/EViews
  16. [论文写作笔记] C3 让题目闪光
  17. 四大卫星导航定位系统在天空中是如何排布的
  18. 哔哩哔哩bilibili 部分接口
  19. Android获取手机应用的版本名和版本号
  20. 同样是程序猿,为什么别人能进大公司而你不能?

热门文章

  1. 软件开发工具与环境 (课程代码:07169)
  2. 阿里云生成支付二维码并支付前端实现
  3. 计算机蓝屏 代码0000a,Win7系统出现蓝屏代码0x000000a的原因及解决方法
  4. android 实现挂电话和接电话
  5. RDP报表工具v2.3.*版本升级操作步骤
  6. 阻抗匹配(二):示波器
  7. 离散数学_十章-图 ( 5 ):连通性 - 下
  8. c++初级(本人scdn)
  9. 64位编译TrueCrypt
  10. spring boot设置session超时时长(自定义spring boot session超时时长)