北京二手房价分析及预测
数据来源
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等模型
- 使用随机森林等机器学习算法
北京二手房价分析及预测相关推荐
- 【项目实战】北京二手房房价分析与预测
项目简介 本项目根据个人需求进行北京二手房信息的数据分析,通过数据分析观察住房特征规律,利用机器学习模型进行简单的预测. 数据源 通过爬虫爬取第三方房屋中间商网站(链家和安居客)获取数据源,仅供学习使 ...
- python建筑案例_Python数据分析实战-链家北京二手房价分析
前言 最近在自学Python,通过学习大家的分享案例,看到使用Python进行较多的主要4个方面:爬虫,数据处理,数据可视化以及机器学习建模.对我来说目标就是: 熟练使用numpy pandas 进行 ...
- 广州二手房价分析与预测
一.概述 1.1问题介绍与分析 随着社会经济的迅猛发展,房地产开发建设的速度越来越快,二手房市场迅猛发展,对二手房房产价格评估的需求也随之增大.因此,对二手房房价预测与分析是必要的.详细文档与代码 ...
- 深圳二手房房价分析及预测
分析目标: 通过处理后的房价数据,筛选对房价有显著影响的特征变量. 确定特征变量,建立深圳房价预测模型并对假设情景进行模拟 数据预处理 import pandas as pd import os fi ...
- Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测
Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测 目录 利用bs4和requests爬取了国内顶级某房源平 ...
- SQL实战:上海二手房价分析
数据来源可见我的上篇博文Python数据分析实战:上海二手房价分析.将CSV文件中的数据导入到Navicat中,导入过程中需选择"10008(MAC-Simplified Chinese G ...
- 数据分析项目——深圳二手房价分析及价格预测
目录 一.需求说明 1.1基本任务 1.2 任务目的 1.3测试数据 二.概要设计说明 三.详细设计 3.1 数据检测模块 3.2 因变量分析模块 3.3 自变量分析模块 3.4 可视化模块 3.5 ...
- 北京二手房房价分析(建模篇)
数据科学俱乐部 中国数据科学家社区 本篇将继续上一篇数据分析用Python分析北京二手房房价之后进行数据挖掘建模预测,这两部分构成了一个简单的完整项目.结合两篇文章通过数据分析和挖掘的方法可以达到二手 ...
- 数据挖掘实战项目——北京二手房房价分析
本次实战项目的主要目的是分析北京二手房房价,项目源自博文:入门Python数据分析最好的实战项目(一)和入门Python数据分析最好的实战项目(二).本篇文章仅记录博主在学习过程中的思路. 数据分析 ...
- Python数据分析实战:上海二手房价分析
1 数据搜集 使用 urllib 库中的request 模块爬取赶集网发布的上海二手房信息,包括包括户型.面积.单价等,再使用BeautifulSoup 库解析爬取的HTML数据,最终将数据保存到CS ...
最新文章
- Java GC 日志详解
- python爬虫代码1000行-Python 你见过三行代码的爬虫吗
- javaweb成长之路:struts2的探索(一)
- Python3算法基础练习:编程100例(6 ~ 10)
- 2017年9月2日普级组T2 跳格子
- openpyxl写入一行数据_老板让我从几百个Excel中查找数据,我用Python一分钟搞定!...
- k8s-自动横向伸缩pod 根据CPU使用率,QPS访问数监控指标
- 百度飞桨开源Open Images Dataset V5目标检测比赛最好单模型MSF-DET
- java long 除法运算_java基础知识学习文档二
- mybaits 学习
- 重构 阅读心得(转)
- 清空分区linux,Linux使用fdisk删除分区详解
- 记录一次恶意软件排查
- JS(javascript)在自动化测试项目中的应用【软件测试开发入门教程】
- 单片机触发器或非门工作原理以及用途
- 「 LaTex 」写论文,作者旁添加ORCID
- I/Q信号解调分析过程
- 数据存储的声音 - 第9集:与Stephen Foskett的对话
- 著名超导论文被Nature撤稿
- ZR859 坤坤的篮球场 (单调队列)