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

时间:2021-04-02 11:16:33   收藏:0   阅读:40

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

 

目的

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

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

结构如下:

数据准备

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

数据清理、特征创建

从最初的数据看:

 

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

检查缺失

 

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

 技术分享图片

技术分享图片

 

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

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

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

 

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

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

 

buildingTypecount
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的数量很少,因此我将再次丢弃这些行

  1.  
     
  2.  
    df2$renovationCondition <- sapply(df2$renovationCondition, ionCondition)
  3.  
     
  4.  
    df2$buildingStructure <- sapply(df2$buildingStructure, makeStructure)
  5.  
    df2$elevator <- ifelse(df2$elevator==1,‘has_elevator‘,‘no_elevator‘)
  6.  
     

缺失值检察

 

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

技术分享图片

 

 

kable(df %>% group_by(constructionTime) %>% summarise(count=n()) %>% arrange(-count) %>% head(5))
constructionTimecount
2004 21145
2003 19409
NA 19283
2005 18924
2006 14854

 

df3 <- data.frame(df2 %>% na.omit())

插补后的最终检查

 

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

探索性分析

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

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

数值特征

 

  1.  
    corrplot(cor(
  2.  
    df3 ,
  3.  
    tl.col=‘black‘)

技术分享图片

 

评论

分类特征

地图

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

 

建筑结构

 

makeEDA(‘buildingStructure‘ )

技术分享图片

 

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

建筑类型

 

makeEDA(‘buildingType‘ )

技术分享图片

 

装修条件

 

技术分享图片

技术分享图片

电梯

 

技术分享图片

 

地铁

 

技术分享图片

 

是否满五年

 

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

技术分享图片

 

区域

 

技术分享图片

 

回归模型

策略

平均价格总览

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

  1.  
    df3$year <- year(df3$tradeTimeTs)
  2.  
    df3$month <- month(df3$tradeTimeTs)

 

  1.  
    df3 %>% filter(year>2009) %>% group_by(monthlyTrad) %>%
  2.  
    summarise(count=n(), mean = mean(price)) %>%
  3.  
    ggplot(aes(x=monthlyTradeTS, y= mean)) +

技术分享图片

准备训练/测试样本

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

  1.  
    df_train <- data.frame(df %>% filter(year>2009 & year<2017))
  2.  
    df_test <- data.frame(df %>% filter(year>=2017))
  3.  
    as.data.frame(cbind(
  4.  
    df_train %>% select_if(is.numeric) %>% select(-Lng, -Lat, -year, -month),
  5.  
    ‘bldgType‘= dummy.code(df_train$buildingType),
  6.  
    ‘bldgStruc‘= dummy.code(df_train$buildingStructure),
  7.  
    ‘renovation‘= dummy.code(df_train$renovationCondition),
  8.  
    ‘hasElevator‘= dummy.code(df_train$elevator),

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

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

技术分享图片

技术分享图片

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

训练精度

 

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

 

技术分享图片

 

## [1] "MSE: 15952.845934 RMSE : 126.304576 R2 :0.795874"

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

 

  1.  
     
  2.  
     
  3.  
    # 训练样本->训练精度
  4.  
     
  5.  
    for (i in 1:length(dates_train)){
  6.  
    current_df <- prepareDF(current_df)
  7.  
    current_pred <- mean(predict(res[[1]],current_df))
  8.  
     
  9.  
     
  10.  
    #运行测试样本-->测试精度
  11.  
     
  12.  
    for (i in 1:length(dates_test)){
  13.  
    current_df <- prepareDF(current_df)
  14.  
    current_pred <- mean(predict(res[[1]],current_df))
  15.  
     

 

  1.  
     
  2.  
     
  3.  
    RES %>% reshape2::melt(id=c(‘date‘,‘split‘)) %>%
  4.  
    ggplot(aes(x=date,y=value)) + geom_line(aes(color=variable, lty=split),size=1) +
  5.  
     
  6.  
     

技术分享图片

 

改进

地理位置作为特征

 

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

技术分享图片


技术分享图片

最受欢迎的见解

1.R语言多元Logistic逻辑回归 应用案例

2.面板平滑转移回归(PSTR)分析案例实现

3.matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)

4.R语言泊松Poisson回归模型分析案例

5.R语言回归中的Hosmer-Lemeshow拟合优度检验

6.r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现

7.在R语言中实现Logistic逻辑回归

8.python用线性回归预测股票价格

9.R语言如何在生存分析与Cox回归中计算IDI,NRI指标请选中你要保存的内容,粘贴到此文本框

原文:https://www.cnblogs.com/tecdat/p/14609348.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!