机器学习分析租房价格的影响因素
本篇文章主要会讲如何从网站上爬取租房数据,清洗数据,聚合数据,并最后用机器学习来分析影响租房价格的主要因素有哪些。
目录
0、前言
1、爬取数据
2、清洗筛选数据
3、聚合分析
4、机器学习分析
0、前言
由于去年下半年开始的地产行业大整顿,导致整体的行业大环境并不理想,所以我,一个做了7年商办地产投资的从业者决定在30岁之际换个方向,主要方向还是在数据分析+机器学习这块,这篇也算是我在这段时间自学后做的小小的一个研究,希望能和大家多多交流。
1、爬取数据
我们希望能够取得上海市全市的租房数据,进行分析研究。
那选取的获取数据的网站当仁不让,还是万能的【链家网】,主要原因有两个:一是链家上的数据比较全面且相对比较真实,二是链家没有反爬机制,只要你请求时间设置一定间隔基本上没有风险(像我就前前后后完整的把链家租房数据爬了4、5次,没有碰到过反爬)。
打开链家网,进入到租房总览界面,可以看到目前(2022年6月17日)的租房数据共有20246条:
调出F12,会发现下面每个房源信息也不存在ajax动态请求,都是能够在当前页面源代码中呈现的,但是别开心的太早,再往下拉会发现,在总览界面中能看到的房源信息只有100页,每页30个房源,即如果直接从总览页面中爬取房源信息,总共只能获得3000个房源,远小于显示的2万条房源。
那么既然在总览页面中无法完整获取,就只好在“按区域”中分别获取房源。
经过探索还发现,如果仅仅通过行政区来分块获取房源,由于【浦东】房源数较多,仍超过了3000条,还是会有遗漏。那索性在每个区域下,再按版块进行分块获取,就能够做到获取全部的房源了。
目前的爬虫思路是:通过循环1获取所有【行政区】的总览url,再通过循环2获取所有的【版块】的总览url,再通过循环3获取到当前板块中所有【房源】的详情url。
进入到具体租房房源界面,可以观察到租房信息还是比较全面。
把我们认为有用的信息比如:小区名称,房租,朝向,面积,房型,精装修,总楼层等都可以爬下来。
另外,链家也在房源详情界面上放了房源的位置,在源代码中也能找到房源的经纬度,且链家的地图也是用的百度地图,所以不需要进行地图编码的转换,把经纬度爬下来以作备用。至于周边有什么地铁线路,多少距离这些我们先放着不爬。
基本的爬虫代码我就不放了,但有个增加速度的方法的代码我放一下。
我会在每个请求url后面设定0.3-0.5秒不等的间隔,防止短时间内请求过快。但这样2万条的数据,爬下来会比较费时间,所以在此基础上做了一个线程池的设置,使得所有的行政区可以同时进行爬取,极大缩短了爬取时间,代码如下:
# 主程序中加线程池
with ThreadPoolExecutor(20) as t:for i in range(2, 18):t.submit(download_lianjia, i)
在爬取信息的同时,我考虑到从直观角度上来说,影响房租的因素可能还有外部因素,比如:周边1公里内地铁站数量,周边商场数量,离最近地铁线路的距离。
这块数据可以通过申请百度地图开发者AK利用poi数据来获取,代码我摘取一块放在下面:
--这里需要注意下对于坐标查询功能,百度地图的每日限额是3万条/天,所以要爬“商场”和“地铁”2组关键词的2万条数据我花了2天
for i in range(0,len(lng_data)):print(f'正在写入第{i}条数据')loc = str(lat_data[i])+ ',' + str(lng_data[i])#统计地铁情况url = "https://api.map.baidu.com/place/v2/search?query=" + \keyword1 + "&location=" + loc + "&radius=" + str(radius) + "&output=json&ak=" + ak + "&scope=2" # 构造请求网址resp = requests.get(url,verify=False)answ = resp.json()try:rail_s = len(answ['results']) #地铁数量railway_station.append(rail_s)except:rail_s = 0railway_station.append('')try:rail_d = answ['results'][0]['detail_info']['distance'] #地铁距离railway_distance.append(rail_d)except:rail_d = 0railway_distance.append('')
至此,我们获取了所有的所需数据如下:
2、清洗筛选数据
因为是自己爬下来的数据,所以内容也好,格式也好还算比较规整,也没有缺损值,来完整看下数据集情况:
(地铁距离在本文中暂没有作为特征项 )
可以发现在面积的最小值(0.1平)和楼层(255层)的最大值都有一些常识型的错误,经过查看发现分别有2个数据和1个数据有误,应该是网站的输入型错误,直接删除即可。
将户型拆成卧室数和客厅数(本意是希望将字符串型数据转化为整型类数据,不想形成太多的独热编码矩阵,但之后发现面积与卧室数和客厅数存在高度相关,最终舍弃了)。
另外,将月租金除以面积,添加新的一列“租金单价”,并查看租金单价的曲线:
可以发现,租金单价存在非常极化的现象,近20700组数据中,只有177组租金单价超过了10元/平/天,且最高达到了41元/平/天。来看看单价前十的小区租金:
查看所有特征的分布情况:
可以看到有些数据存在明显的右偏态分布,比如面积,楼层,在后续需要对其进行取对数变化,以便于更好的进行机器学习。
3、聚合分析
查看各行政区平均租金,可以发现黄浦、静安、长宁平均租金位于前三:
查看各版块平均租金:
查看房源精装修比例,发现精装修的房子占到了75%左右:
查看周边1公里内各地铁站数量的房源平均租金,会发现平均租金最高的是周边地铁站为5个,反而周边有9个地铁站的小区租金单价仅为4.11,还低于3个地铁站的房源的平均租金。
经过具体查看,发现9个地铁站的小区主要位于像龙华版块的上海游泳馆站,和武宁板块的曹杨路站附近,本身小区位置并非处在核心,且虽然地铁站多,但通常只会去最近的地铁站进行换乘,所以地铁站数量与租金并不成完全正相关关系。
4、机器学习分析
最开始是想用多元线性回归进行分析,出于数据集比较简单,且最后呈现的结果可解释性高的考虑,但跑完发现最后的拟合效果只有并不是很理想(r2只有0.4+),目前还在尝试采用不同的特征组合,看是否能够提高拟合效果。
在本文中最终选择了随机森林(RandomForest)模型进行回归分析,随机森林相当于是决策树的进化版本,通过选取多个“树”形成“森林”,具体的原理大家可以上网查看,有太多的教学视频,我这边就不展开了。随机森林模型的优点是拟合度较高,但容易产生过拟合。
这边先简单展示下线性回归的过程:
首先用corr()看下各特征间的相关性,可以看到面积和卧室数的相关性达到了0.8,属于高度相关了,且面积和客厅数的相关性也达到了0.7,那么鉴于此,暂时先放弃卧室数和客厅数两个特征,而选用面积作为特征。其余的特征之间的相关度都在可以接受的范围内。
之后选定特征X和标签y(月度租金),并对X进行归一标准化,以便于归因分析
切分训练集和测试集,并恢复索引,之后进行实例化建模,并且得出测试集的score
可以看到score只有0.45,属于比较不理想的拟合,通过绘图,查看y预测值和ytest实际值,发现在y的最大最小段,预测值和实际值有着相当大的差距,导致了整体结果的不理想。
查看各特征影响程度,可以发现对租金总价的影响因素中,面积占比最大且远远大于其他因素,当然是这样的,其次是地铁数量以及经度和纬度,即所谓的区位。
【随机森林】
我们先取n_estimators,即森林里的树的数量=20,采用交叉验证的方法来求得score
可以看到,明显的精准度比线性回归高了许多,但是否还有提升的空间呢?于是用学习曲线来寻找一下(见下图),当i=4,即树的数量取41颗时,score相对有了最优值。
于是,根据学习曲线的结果,我们来做影响房租的因素分析:
通过最后的图表可以看到,用随机森林模型得出面积仍旧是影响房租总价的最重要因素,其次是经纬度(区位)和楼层。
显而易见,房屋月租金的总价由于是单价与面积的相乘,所以面积是影响房租的最大因素从直观上是可以认同的。
那么,如果把标签换为租金单价,会是什么结果呢?
什么因素对房租单价影响最大呢?这才是我们真正想要了解的。
当我们把标签作为y时,再一次用随机森林作出归因分析:
可以看到地铁数量在影响房租单价的因素占比中占据了大头,达到了27%,其次才是经纬度(区位),这也比较符合我们日常的理解,地铁和位置也是通常人们租房最先考虑的两个因素。
以上就是本文对于房租影响因素的所有内容。还是有比较多的内容有待改进,比如如何通过特征选取进一步提高线性回归和随机森林的预测精确度,如果加入“地铁距离”特征又会对结果产生什么影响等等。
机器学习分析租房价格的影响因素相关推荐
- R语言分位数回归Quantile Regression分析租房价格
全文链接:http://tecdat.cn/?p=18422 本文想在R软件中更好地了解分位数回归优化.在查看分位数回归之前,让我们从样本中计算中位数或分位数(点击文末"阅读原文" ...
- 【计算机专业毕设之基于机器学习的大葱价格预测可视化分析-哔哩哔哩】 https://b23.tv/GLkWcjb
[计算机专业毕设之基于机器学习的大葱价格预测可视化分析-哔哩哔哩] https://b23.tv/GLkWcjb https://b23.tv/GLkWcjb
- TSC工业型条码打印机的价格的影响因素有哪些呢?
现代化企业的生产产品离不开条形码,而对于初次采购的人来说,什么样的条码打印机适合于企业的生产呢?其中TSC工业型条码打印机适合于企业生产,而它的价格的影响因素有哪些呢? 我们都知道一个产品的价格是由市 ...
- 利用神经网络预测链家网上海租房价格(Python)
代码详见:Predict-house-rent-with-neutral-network 简介 本项目利用Python的scrapy框架爬取链家网的上海市租房信息,利用pandas.numpy.mat ...
- 利用机器学习分析脑电数据(原理分析+示例代码+快速上手)
由于本人对于脑机接口以及脑电技术的极度爱好(其实目的是:是把U盘插到大脑里,然后就不用学习了哈哈哈哈),近几月看了较多这方面的内容,变打算写下博客总结分析一下. 目录 一. 机器学习分析简介 二.机 ...
- 疫情后北上广深租房价格跌了吗? | Alfred数据室
去年3月份我们发布了<北上广深租房图鉴>(点击阅读),细数了北上广深租房的各种因素对租房价格的影响.一年过去了,在面临新冠疫情的后续影响.城市尚未完全恢复正常运转.学校还没开学等情况下,北 ...
- ArcGIS学习09:选址分析——租房选址分析
选址分析--租房选址分析 文章目录 选址分析--租房选址分析 前言 一.案例场景及基础数据 1.1 案例场景 1.2 案例数据 二.使用工具 2.1 裁剪 2.2 相交 2.3 擦除 2.4 缓冲区 ...
- 基于机器学习的共享单车需求量影响因素的数据可视化分析
文章目录 前言 一.数据采集与处理 1.数据来源 2.数据预处理 二.可视化分析(统计学) 1.特征分解 2.整体关系图(pairplot) 3.相关性分析(heatmap) 4.参看各因素与coun ...
- 自如租房价格加密分析
记录一次学习研究自如友家租房模块遇到的反爬问题. (这里仅提供思路,做技术分享,不提供完整代码) 自如房源页面截图: 查看html源代码: <div class="Z_price&qu ...
- 机器学习实战1--预测链家租房价格
# coding: utf-8# ### 导入graphlab# In[112]:import graphlab# In[113]: graphlab.set_runtime_config('GRAP ...
最新文章
- 线性代数的本质与几何意义 02. 线性组合、张成的空间、基(3blue1brown 咪博士 图文注解版)...
- 离散余弦变换和C语言实现-win32版本
- 如何设计一门语言(五)——面向对象和消息发送
- [html] 怎样在<pre>标签内不转义<和>符号(原样输出html标签)?
- parted分区介绍
- react不同环境不同配置angular_叫雨山斗鸡优势在哪里,环境不同,价值不同
- Jquery取得iframe下内容的方法
- 苹果开发——设置iTunesnbsp;Connec…
- 华为实习面经(技术面+主管面)
- 解决margin坍塌
- win10迁移C盘Administrator目录
- 3大场景、4款新品公开亮相:「低速智能驾驶」新赛道惹关注
- 一键制作三维真实地形DEM
- 用 matplotlib 绘制 3D 时间序列动态图
- 双精度浮点数double
- 什么是Mybatis?Mybatis能干什么?Mybatis怎么配置?
- N本名著浓缩成的N句话
- 设计师收藏网站网址大全
- input onchange事件
- 读史蒂芬·利维《黑客:计算机革命的英雄》
热门文章
- FICO配置详解之三:固定资产会计配置
- Android流程图
- R语言Tukey检验进行事后检验(post hoc)实战:单因素方差分析告诉我们并不是所有的群体手段的效果是均等的,确切地找出哪些组彼此不同使用Tukey检验
- echarts设置标题样式_EChart 标题 title 样式,x轴、y轴坐标显示,调整图表位置等...
- python 等频分箱_数据分箱:等频分箱,等距分箱,卡方分箱,计算WOE、IV
- 双系统彻底删除Ubuntu启动项
- 难崩日记——从入门到入土的求生之路(二):文件上传中的路径问题
- 第二章 SPSS 的数据管理
- 内存带宽stream测试
- python两个excel做匹配_python链接两张excel表格数据-如何用python从excel中同时提取两个列的数据,并生......