数据来源

Housing Price of Beijing from 2011 to 2017 by Qichen Qiu
https://www.kaggle.com/ruiqurm/lianjia
主要变量有Lng(经度)、Lat(纬度)、tradeTime(交易时间)、totalPrice(总价)、price(每平米单价)、square(面积)、livingRoom(客厅数)、constructionTime(建造时间)等, 详细内容可点击链接查看。

数据预处理

1. 离散变量赋值

将数字转换为文字:

df<-df%>%mutate(
buildingType=case_when(buildingType == 1 ~ "Tower",buildingType == 2 ~ "Bungalow",buildingType == 3 ~ "Plate/Tower",buildingType == 4 ~ "Plate")%>%as.factor(),
renovationCondition=case_when(renovationCondition == 1 ~ "Other",renovationCondition == 2 ~ "Rough",renovationCondition == 3 ~ "Simplicity",renovationCondition == 4 ~ "Hardcover")%>%as.factor(),
buildingStructure=case_when(buildingStructure == 1 ~ "Unknown",buildingStructure == 2 ~ "Mixed",buildingStructure == 3 ~ "Brick/Wood",buildingStructure == 4 ~ "Brick/Concrete",buildingStructure == 5 ~ "Steel",buildingStructure == 6 ~ "Steel/Concrete")%>%as.factor(),
elevator=case_when(elevator == 0 ~ "No_Elevator",elevator == 1 ~ "Has_Elevator")%>%as.factor(),
fiveYearsProperty=case_when(fiveYearsProperty == 0 ~ "GreaterThan5Years",fiveYearsProperty == 1 ~ "LessThan5Years")%>%as.factor(),
subway=case_when(subway == 0 ~ "No_subway",subway == 1 ~ "Near_subway")%>%as.factor(),
district=case_when(district == 1 ~ "DongCheng",district == 2 ~ "FengTai",district == 3 ~ "DaXing",district == 4 ~ "FaXing",district == 5 ~ "FangShang",district == 6 ~ "ChangPing",district == 7 ~ "ChaoYang",district == 8 ~ "HaiDian",district == 9 ~ "ShiJingShan",district == 10 ~ "XiCheng",district == 11 ~ "TongZhou",district == 12 ~ "ShunYi",district == 13 ~ "MenTouGou")%>%as.factor()
)

2. 去除不必要数据

  • url(数据链接)、id(交易id)、Cid(社区id)对房价并无影响可以删去
  • 删除totalPrice(总房价)<100万元、price(单位房价)<1万元的数据
  • 删除ladderRatio(梯户比)>=10的数据
  • 将数据以交易年份分组,发现2011年之前的数据总量非常少,因此仅保留2011年及之后的数据

3.缺失值处理

总数据量318851行,缺失值分布如下:

除DOM(市场活跃天数)外,其他的缺失值相对于数据总量而言占比非常小,可直接删除

将数据按tradeTime(交易时间)排序发现220000行之前的DOM数值较小,之后的较大,因此以220000行为分割点分别计算平均值替换NA

dom<-df$DOM
dom_na<-which(is.na(dom))
small_val<-dom[1:220000]%>%mean(na.rm=T)
large_val<-dom[220001:length(dom)]%>%mean(na.rm=T)
dom[dom_na[dom_na<=220000]]<-small_val
dom[dom_na[dom_na>220000]]<-large_val
df$DOM<-dom

数据可视化

1. 每平米单价直方图

ggplot(data=df, aes(x=price, y=..density..))+geom_histogram(alpha=.8)+geom_density(color='skyblue')+theme_light()ggplot(data=df, aes(x=log(price), y=..density..))+geom_histogram(alpha=.8)+geom_density(color='skyblue')+theme_light()

每平米单价呈右偏分布,log变换后呈正态分布:

2. 重要特征分布图

  • Bungalow(平房)的价格大幅高于其他种类,这里指的可能是四合院
  • 周边有地铁的二手房单价更高
  • 有电梯的二手房单价价更高
  • 五年产权对于单价似乎没有太大影响

  • 区域对二手房单价有着重要影响,西城区最高,门头沟最低
  • 西城区、东城区、海淀区大部分二手房单价都位于4w-6w之间,2w以下二手房几乎没有,且10w以上高价二手房比例相当高;其余地区大部分二手房单价位于2w-4w之间,除朝阳区外10w以上高价二手房比例非常低

建立模型

1. 数据划分

由于交易时间影响单价,不能随机划分训练集和测试集,否则测试准确度会比实际高。
将数据按交易时间排序,选取前80%作为训练集,后20%作为测试集。

2. 线性回归

之前提到了单价并不是正态分布,所以用log(price)进行建模。
由于总价=面积*单价,预测单价时需删除总价。

m.0<-lm(log(price)~1, data=train)
m.full<-lm(log(price)~.-totalPrice, data=train)
scope<-list(lower=formula(m.0), upper=formula(m.full))
fs<-step(object = m.0, scope = scope, direction = "forward", trace = 0)
be<-step(object = m.full, scope = scope, direction = "backward", trace = 0)

Forward Selection和Backward Elimination都保留了所有变量,使用Full Model进行之后的预测。
残差图:

可见残差大致是正态分布,拟合情况良好。
训练集 R2=0.8471R^{2}=0.8471R2=0.8471

pred.full<-predict(m.full, test)
mean(abs(exp(pred.full)-test$price))

MAE=14594.79MAE=14594.79MAE=14594.79

3. 决策树

决策树并没有正态分布的假设,可以直接使用price进行建模:

tree<-rpart(price~.-totalPrice, data=train, parms=list(split='information'), control = list(maxdepth=5))
pred.tree<-predict(tree, test)
mean(abs(pred.tree-test$price))

MAE=17774.07MAE=17774.07MAE=17774.07

4. Bagging

B=15
tree_pred<-matrix(nrow=B, ncol=nrow(test))
for(i in 1:B){index=sample(1:nrow(train), replace = T)tree<-rpart(price~.-totalPrice, data=train[index,], parms=list(split='information'), control = list(maxdepth=5))tree_pred[i, ]<-predict(tree,test)
}
pred.bagging<-apply(tree_pred, 2, mean)
mean(abs(pred.bagging-test$price))

MAE=17802.33MAE=17802.33MAE=17802.33

预测结果

线性回归得到的测试集mean absolute error(MAE)最小,使用full model对测试集最后97行进行预测的结果如图:

改进方向

  • 考虑线性回归中各变量的交互(interaction effect)
  • 由于房价随时间变化,可将数据转化为时间序列,使用ARIMA等模型
  • 使用随机森林等机器学习算法

北京二手房价分析及预测相关推荐

  1. 【项目实战】北京二手房房价分析与预测

    项目简介 本项目根据个人需求进行北京二手房信息的数据分析,通过数据分析观察住房特征规律,利用机器学习模型进行简单的预测. 数据源 通过爬虫爬取第三方房屋中间商网站(链家和安居客)获取数据源,仅供学习使 ...

  2. python建筑案例_Python数据分析实战-链家北京二手房价分析

    前言 最近在自学Python,通过学习大家的分享案例,看到使用Python进行较多的主要4个方面:爬虫,数据处理,数据可视化以及机器学习建模.对我来说目标就是: 熟练使用numpy pandas 进行 ...

  3. 广州二手房价分析与预测

    一.概述   1.1问题介绍与分析 随着社会经济的迅猛发展,房地产开发建设的速度越来越快,二手房市场迅猛发展,对二手房房产价格评估的需求也随之增大.因此,对二手房房价预测与分析是必要的.详细文档与代码 ...

  4. 深圳二手房房价分析及预测

    分析目标: 通过处理后的房价数据,筛选对房价有显著影响的特征变量. 确定特征变量,建立深圳房价预测模型并对假设情景进行模拟 数据预处理 import pandas as pd import os fi ...

  5. Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测

    Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测 目录 利用bs4和requests爬取了国内顶级某房源平 ...

  6. SQL实战:上海二手房价分析

    数据来源可见我的上篇博文Python数据分析实战:上海二手房价分析.将CSV文件中的数据导入到Navicat中,导入过程中需选择"10008(MAC-Simplified Chinese G ...

  7. 数据分析项目——深圳二手房价分析及价格预测

    目录 一.需求说明 1.1基本任务 1.2 任务目的 1.3测试数据 二.概要设计说明 三.详细设计 3.1 数据检测模块 3.2 因变量分析模块 3.3 自变量分析模块 3.4 可视化模块 3.5  ...

  8. 北京二手房房价分析(建模篇)

    数据科学俱乐部 中国数据科学家社区 本篇将继续上一篇数据分析用Python分析北京二手房房价之后进行数据挖掘建模预测,这两部分构成了一个简单的完整项目.结合两篇文章通过数据分析和挖掘的方法可以达到二手 ...

  9. 数据挖掘实战项目——北京二手房房价分析

    本次实战项目的主要目的是分析北京二手房房价,项目源自博文:入门Python数据分析最好的实战项目(一)和入门Python数据分析最好的实战项目(二).本篇文章仅记录博主在学习过程中的思路. 数据分析 ...

  10. Python数据分析实战:上海二手房价分析

    1 数据搜集 使用 urllib 库中的request 模块爬取赶集网发布的上海二手房信息,包括包括户型.面积.单价等,再使用BeautifulSoup 库解析爬取的HTML数据,最终将数据保存到CS ...

最新文章

  1. Java GC 日志详解
  2. python爬虫代码1000行-Python 你见过三行代码的爬虫吗
  3. javaweb成长之路:struts2的探索(一)
  4. Python3算法基础练习:编程100例(6 ~ 10)
  5. 2017年9月2日普级组T2 跳格子
  6. openpyxl写入一行数据_老板让我从几百个Excel中查找数据,我用Python一分钟搞定!...
  7. k8s-自动横向伸缩pod 根据CPU使用率,QPS访问数监控指标
  8. 百度飞桨开源Open Images Dataset V5目标检测比赛最好单模型MSF-DET
  9. java long 除法运算_java基础知识学习文档二
  10. mybaits 学习
  11. 重构 阅读心得(转)
  12. 清空分区linux,Linux使用fdisk删除分区详解
  13. 记录一次恶意软件排查
  14. JS(javascript)在自动化测试项目中的应用【软件测试开发入门教程】
  15. 单片机触发器或非门工作原理以及用途
  16. 「 LaTex 」写论文,作者旁添加ORCID
  17. I/Q信号解调分析过程
  18. 数据存储的声音 - 第9集:与Stephen Foskett的对话
  19. 著名超导论文被Nature撤稿
  20. ZR859 坤坤的篮球场 (单调队列)

热门文章

  1. 医院招聘计算机人员面试经典问题,医院收费员常见面试题目
  2. 磨刀不误砍柴工——模板方法模式
  3. 贴片电阻各种封装规格及阻值标注方法
  4. Instrument API介绍
  5. python学习方法总结(内附python全套学习资料)
  6. MySQL高级SQL语句
  7. windows/linux下批量修改文件名以及文件名后缀
  8. 我是凡尘最美的莲花-记再读仓央嘉措
  9. Python/python/xpath爬虫--妙招网
  10. vscode html修改默认浏览器,vscode修改默认浏览器的方法