转自 | 数据团学社,微信搜索metrodata_xuexi 即可关注

本文约1500字,阅读需要5分钟

关键词:买房 Python 选房 R 定价

本文讲述了借助Python,Gis和R语言制作房源定价系统的方法,对原理、过程都有详细的讲述

为了能在当今竞争激烈的社会活下去,我一直在孜孜不倦地开发自己的潜能,寻找更多的副职业增加收入,从而在双十一后的双十二可以继续剁手。

这不,成为业余房地产咨询师的第一天,客户戳我了:我要在上海16个区买16套房子,资金到位,您给估个价吧。

对于这类在在如此严峻的房地产政策之下,还想拥有两位数以上房产的“忽悠”高手,我一向给予至尊VIP的待遇。

决定一套房子价格的因素主要是三个方面,房屋本身的属性,房屋的空间位置和周边的其他因素。这篇文章会讲述考虑这些因素的分析——建模——检验的过程。

数据集的准备

这里分为两步:

第一步,抓取所有URL:

if __name__=='__main__':                 url_list = create_url(220,2) #填写区间最大面积和公差,保证按大于最大面积搜索,房源数小于等于3000data_list = []#data_list = craw_second_url(url_list)craw_second_url(url_list)data =  pd.DataFrame(pd.Series(data_list),columns=['url'])data.to_csv('./urls.csv',encoding='gbk',index=0)print('finish')

接下来,爬取房源信息:

def read_url(path):path = pathdata = pd.read_csv(path,engine='python')try:data_received = pd.read_csv('./house_inf_lianjia.csv',engine='python')print('导入爬取数据')data_received_list = data_received['url'].tolist()print('转换表格')url_list = data[~data['url'].isin(data_received_list)]['url'].unique().tolist()print('剔除已爬取数据')print(len(url_list))except :url_list = data['url'].unique().tolist()data = pd.DataFrame(columns=['house_id', 'name', 'price', 'area_price', 'area', 'room', 'livingroom', 'kitchenroom','bathroom', 'lng', 'lat', 'url'])data.to_csv('./house_inf_lianjia.csv', encoding='gbk', index=0)print('无历史数据')return url_list

我还顺手做了一个断点续传功能,每次开始爬虫前会匹配URL列表,保证爬取过的不再爬取,方便更新和分时段爬取。详细代码请见文末,我爬取了1W+的数据作为样本:

另外,我准备了另一份数据:美团美食频道1W+的餐饮POI. 同样使用爬虫获取。

建模准备

这一部分我们会将房源数据和POI数据等信息整合在一起用于建模,可以用ArcGis完成。

红色的为餐饮POI,绿色的为房源数据(有时间的朋友可以爬取全量数据)

先对房源做缓冲区,缓冲区半径为1KM,考虑这个范围内的POI数据。

结果如图:

然后使用缓冲区与餐饮POI进行空间关联,这样就可以统计出一个房源1KM半径范围内餐饮POI的数量,价格,评论数等等信息,以便接下来建模使用。

另外,常识告诉我们,一般离市中心越近,房价越高,随意我们再增加一个距离属性。先添个底图:

然后创建一个上海中心点点数据。上海的中心点,在人民广场附近,方便起见,就在地图上点一个吧!

把图层转换成投影坐标系,便于计算距离:

给中心点数据和缓冲区数据添加两个字段,存放投影经纬度

然后使用计算几何,获取投影经纬度,单位选择米

结果如图(部分):

接下来计算距离,可以在GIS内直接操作,也可以导出数据,在EXCEL中用两点之间距离公式计算。

这样,我们就整合完成了一份样本数据,可以用来进行建模操作!

建模操作

左手python右手R,先导入一堆包:

library(readr)
library(funr)
library(openxlsx)
library(dplyr)
library(caret)
library(readxl)
library(psych)
library(plyr)
library(ggplot2)

创建工作路径和读取数据

########################################### path setting and data reading ##########################################
path <- get_script_path() # 获取脚本路径
# path = '' #可以手动输入工作路径
print(path)
setwd(path) # 设定工作路径
model_data <- read_csv("model_data.csv")

然后,是数据清洗,提炼我们需要建模的属性

########################################### Data cleaning ##########################################
model_data <- na.omit(model_data)
model_data <- model_data %>% select(price,area,room,livingroom,kitchenroom,bathroom,Count_,Sum_allcommentNum,Avg_allcommentNum,Avg_avgprice,Avg_avgscore,Sum_avgscore,len)#可以使用names(model_data)函数在Console中查看字段名称
model_data <- rename(model_data,c(Count_='resturant_counts'))

我们今天要拟合一个回归模型,所以,先来看一看属性之间的相关性

psych::pairs.panels(model_data)#查看相关性

这行代码会画出一张逼格很高的图:

理解几个关键点:

1.相关性系数,绝对值越接近1表明相关性越显著,比如房价和面积相关度为0.77;

2.图中的直方图为每个维度的数据分布

3.散点图中圆越完美表明相关度越低,椭圆形状表明相关度显著

4.图中的线条是查看线性关系的,可以体现自变量和因变量之间的关系

下面,我们使用全部属性构建一个回归模型。Price是因变量,“~.”表示导入所有自变量。最后打印模型结果查看。

model <-lm(price~.,data=model_data)
print(summary(model))
print(car::vif(model))

我们可以从结果中读取到拟合后的函数,残差,回归系数,P值,R方等。对于多元线性回归,R方会随着变量的增多不变或增加,所以看实际R方并不科学,模型引入了惩罚因子,最后,我们以调整R方作为最终判定拟合度的依据。我们看到,R方为0.8393,拟合度应该相当不错。

然后,我们还要关注一下共线问题。

什么是共线问题?

简单说就是两个变量描述的是同一个内容,我们需要去掉其中一个。比如,“双十一我剁手了”和”我这个月要吃土了”表达的是一个意思:没钱!

我们看到缓冲区内餐厅数量和平均得分之和数字都超过了200,只要大于10的都属于共线,应该根据具体情况删减。

下面我们使用逐步回归法,优化模型。

逐步回归分三种,这里我直接百度介绍:

model_step <- step(model,direction = "both")# 使用逐步回归的方法筛选变量
print(summary(model_step))

优化后的模型为:

我们看到,R方进一步提升,达到0.8415。不过,有一个问题,这里去掉了餐厅数量,选择使用评分总和作为其中一个变量,但这里根据我们经验,常识和习惯,这样并不科学。

所以,我们人工替换回餐厅数量这个变量再一次拟合。

model_fin <- lm(formula = price ~ area + room + bathroom + Sum_allcommentNum + Avg_allcommentNum + Avg_avgprice + resturant_counts + len, data = model_data)

拟合结果:

R方下降0.0001,几乎没有变化,完美!

我们导出回归模型,方便查看。

table = data.frame(summary(model_fin)[["coefficients"]])
table['variable']=row.names(table)
write.xlsx(x = table,file = 'coefficients.xlsx',sheetName = 'sheet1',row.names = FALSE,overwrite=TRUE)

Estimate为回归系数,std.error为标准误差,t.value为t值,pr.t为P值,显然所有变量P值均小于0.05,非常显著。

最后,我们来使用这个模型,来给房源定价:

predict_result <- predict(model_fin,data.frame(area =108,room=3,bathroom=2,Sum_allcommentNum=56399,Avg_allcommentNum=247.36,Avg_avgprice=114.12,resturant_counts=228,len=6438),interval = 'confidence')
print(predict_result)

用法很简单,输入房源的信息,就能预测出结果。比如108平米,3房2卫,1KM半径缓冲区内有228家餐厅,平均价格114.2,平均评论数247.36,评论综合56399条,距离市中心6.438KM,最终结果如下:

(从左往右分别是:估价-最低估价-最高估价)

啧啧~按月薪1W计算,一年12W,需要工作

客户看了我的定价模型以后,感觉非常满意!悄悄地问我:在上海郊环以外,有没有10平米的合租房?

大佬,您的选房系统已上线相关推荐

  1. python房价预测_您的选房系统已上线——利用python和R如何进行房价预测

    本文约1500字,阅读需要5分钟.讲述了如何使用python进行房价信息获取,如何利用R构建回归模型以达到预测上海某个地区房价的目的. 关键词:买房 Python 选房 R 定价 本文讲述了借助Pyt ...

  2. 新生报到系统_你的宿舍你做主!成电研究生新生选房系统上线

    2019级的研究生新生们注意啦! 电子科技大学2019级全日制硕士研究生网上自主选房马上开始啦! 小编了解到,今年研究生新生选房系统将于7月14日开放,新生可提前登陆选房系统查看房源情况并进行试选. ...

  3. JAVA在线选房系统(JAVA毕业设计含源码和教程)

    前言 课设毕设源码收集已上传到github,包括:C,C#,C++,JAVA,PHP 等源码,更多源码在整理中.地址:https://github.com/52JDK/Source-Collectio ...

  4. 鸿蒙电视应用市场,任正非:鸿蒙系统已上线,未来将被应用到手机、平板、电视系列产品上...

    鸿蒙系统已经完成了从面向物联网到面向智能设备的转化. 鸿蒙系统已经上线,未来将被应用到华为智能硬件系列产品上. 1月21日,时隔5年,华为创始人任正非再次亮相达沃斯世界经济论坛,在接受媒体采访时透露了 ...

  5. Duang,钉钉会议室预定系统已上线!

    简介:5分钟可以干什么?喝一杯咖啡,回一封邮件,还是开发上线一个钉钉应用.云开发平台联合钉钉开发平台推出0门槛打造你的第一个钉钉应用的活动,完成相应任务后,即可领取精美奖品.春暖花开,领个背包去踏春吧 ...

  6. Android版APP全新上线,12306订票App更新3.0版本 Android系统已上线

    [TechWeb报道]最近,12306 APP迎来了重要更新,3.0版本的Android平台已经上线,不过iOS版本还没有更新,预计很快就会到来.这次更新后交互界面和使用逻辑没有明显的变化,但风格有一 ...

  7. 物流信息不更新?难道丢了?Python快递查询系统已上线,爆赞!

    导语​ 随着网购的广泛普及,现在大部分年轻人都喜欢上了网购的方式. 很多东西物美价廉,出不出户也能满足你的购买需求! 尤其是中秋来临,哪些假期短回不了家的也想给家人带点儿中秋礼物~ 这不?赶上中秋了, ...

  8. c语言lol战绩查询系统,LOL:战绩阵容一键查询 云顶之弈战绩查询功能已上线!...

    原标题:LOL:战绩阵容一键查询 云顶之弈战绩查询功能已上线! 国服的云顶之弈上线也有一段时间了,不知道小伙伴们体验的怎么样了?相信在大家体验云顶之弈的过程中都会有一个困扰,那就是我怎么才能像查排位赛 ...

  9. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...

    阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程) (仅此纪念人生第一篇学习博客) 前阵子接了一个小小的JavaWe ...

最新文章

  1. 科大星云诗社动态20220115
  2. java cmd停服务_java代码启动cmd执行命令来开启服务出现无法连接的问题
  3. java emoji显示乱码_Java 解决Emoji表情过滤问题
  4. 计算机专业男生宿舍,实拍大学男生宿舍,男生们不是玩电脑游戏,就是瘫在床上看手机!...
  5. 11.无限分类表的数据库设计
  6. web开发网,前端实战项目百度云
  7. 【C语言】筛选法求素数
  8. 计算机语言output,output是什么意思
  9. 北交大计算机老师夏嘉楠,北京交通大学院系部处文件-馆档网.DOC
  10. Spring Cloud Hystrix 全解 (1) - 总览篇
  11. 学生信息管理系统 jsp + servlet + mysql (2020)
  12. [转载] iOS直播相关,感觉有点用
  13. 微信公众号网页 H5 video 标签自动播放
  14. python快速实现简易俄罗斯方块小游戏
  15. vue@2.6.14购物车统计总价
  16. python之pypinyin
  17. AD PCB各层含义
  18. HTML-图片热点、网页内嵌、网页拼接、快速切图
  19. 脉冲时间宽度c语言,基于AT89C52脉冲宽度测量仪的设计与实现
  20. 京东2017金融预测

热门文章

  1. Windows Server 2016 ServU-v6.30
  2. ServU漏洞利用靶场-单兵作战
  3. 源码网站合集[细选过的][转贴]
  4. 苹果联通 VoLTE 来了!
  5. python 空数组判断
  6. R语言旋转扇形图的绘制
  7. 小波分析——1. 初识小波分析
  8. 逻辑回归公式推导过程
  9. 关于移动设备的Flash播放器,Flash平台,和Flash未来的澄清
  10. 【Bug】无法访问Windows Installer服务