首页 > 其他分享 >线性回归和时间序列分析北京房价影响因素可视化案例

线性回归和时间序列分析北京房价影响因素可视化案例

时间:2024-04-01 23:11:42浏览次数:24  
标签:aes df 模型 序列 可视化 线性 VAR 回归

全文链接: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)

点击标题查阅往期内容

图片

数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病

图片

左右滑动查看更多

图片

01

图片

02

图片

03

图片

04

图片

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

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

   
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' )

图片

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

 


点击标题查阅往期内容

图片

R语言用线性回归模型预测空气质量臭氧数据

图片

左右滑动查看更多

图片

01

图片

02

图片

03

图片

04

图片

 

 

建筑类型

   
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+1
     res[[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.5
    SSE = 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语言线性回归和时间序列分析北京房价影响因素可视化案例  ,点击“阅读原文”获取全文完整资料。

图片

点击标题查阅往期内容

向量自回归(VAR)模型分析消费者价格指数 (CPI) 和失业率时间序列
Matlab用BUGS马尔可夫区制转换Markov switching随机波动率模型、序列蒙特卡罗SMC、M H采样分析时间序列
Matlab创建向量自回归(VAR)模型分析消费者价格指数 (CPI) 和失业率时间序列
Stata广义矩量法GMM面板向量自回归 VAR模型选择、估计、Granger因果检验分析投资、收入和消费数据R语言时变向量自回归(TV-VAR)模型分析时间序列和可视化
R语言用向量自回归(VAR)进行经济数据脉冲响应研究分析
R语言arima,向量自回归(VAR),周期自回归(PAR)模型分析温度时间序列
R语言VAR模型的不同类型的脉冲响应分析
R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
R语言时变参数VAR随机模型
R语言估计时变VAR模型时间序列的实证研究分析案例
R语言向量自回归模型(VAR)及其实现
R语言实现向量自回归VAR模型
R语言估计时变VAR模型时间序列的实证研究分析案例
Python和R用EWMA,ARIMA模型预测时间序列
R语言用LASSO,adaptive LASSO预测通货膨胀时间序列
Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
R语言arima,向量自回归(VAR),周期自回归(PAR)模型分析温度时间序列
【视频】Python和R语言使用指数加权平均(EWMA),ARIMA自回归移动平均模型预测时间序列

标签:aes,df,模型,序列,可视化,线性,VAR,回归
From: https://www.cnblogs.com/tecdat/p/18109619

相关文章

  • 【跳频通信】基于Gold码序列跳频通信附Matlab代码
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 《Python从入门到实践》项目 数据可视化
    生成数据安装Matplotlibpython-mpipinstallmatplotlib绘制简单的折线图importmatplotlib.pyplotaspltsquares=[1,4,9,16,25]fig,ax=plt.subplots()ax.plot(squares)plt.show()首先导入pyplot模块,并给他指定别名plt,以免反复输入pyplot,然后调用subpl......
  • 序列化二叉树
    请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。数据范围树中节点数量 [0,1000]。样例你可以序列化如下的二叉树8/\122/\64为:"[8,12,2,null,null,6,......
  • 数据分析(三)线性回归模型实现
    1.惩罚线性回归模型概述线性回归在实际应用时需要对普通最小二乘法进行一些修改。普通最小二乘法只在训练数据上最小化错误,难以顾及所有数据。惩罚线性回归方法是一族用于克服最小二乘法(OLS)过拟合问题的方法。岭回归是惩罚线性回归的一个特例。岭回归通过对回归系数的平方......
  • grafana使用变量过滤时间序列
    这里我们为Dashboard创建了一个名为node的变量,并且指定其类型为Query。Query类型的变量,允许用户指定数据源以及查询表达式,并通过正则匹配(Regex)的方式对查询结果进行处理,从而动态生成变量的可选值函数作用label_values(label)返回Promthues所有监......
  • php反序列化——字符逃逸增加
    题目 放到本地环境 发现是这种情况:a:2:{i:0;s:1:"x";i:1;s:5:"aaaaa";}分成两部分: a:2:{i:0;s:1:"x              ";i:1;s:5:"aaaaa";}现在需要做的就是自己构造第二部分:  ";i:1;s:6:"123456";}  一共20个字符经过preg_replace函数 ......
  • 大屏可视化项目示例--基于Vue3+vite2+echart+mock+axios+dataV
    图例: 项目环境:Vite、Echarts、Npm、Node、axios、mock、vue3、dataV。项目地址:IofTV-Screen-Vue3:......
  • 数据结构 第二章(线性表)
    写在前面:本系列笔记主要以《数据结构(C语言版)》为参考,结合下方视频教程对数据结构的相关知识点进行梳理。所有代码块使用的都是C语言,如有错误欢迎指出。视频链接:第01周a--前言_哔哩哔哩_bilibili一、线性表的定义和特点        同一线性表中的元素必定具有相同的特性......
  • 02-03线性代数
    2.3线性代数1.基本数学对象对象数学符号代码标量xtorch.tensor(1.0)向量xtorch.arange(3)矩阵Atorch.arange(20).reshape(5,4)张量Xtorch.arange(24).reshape(2,3,4)2.基本运算法则及方法2.1标量加法x+y;乘法x*y;除法x/y;指......
  • 写模板, 线性筛
    筛质数:1需要:bitset位标记,vector存储质数2流程:标记了就是质数,加到vector。用当前数遍历所有已知质数进行标记,直到质数跑完或者质数为当前数的因子。3注意事项:合数被标记的原理是因为每个合数都由最小质因子来标记,所以当质因子为i的因子时,直接break。4延申:根据线性筛可以找......