如何解决租房烦恼?阿里工程师写了一套神奇的代码

租房的烦恼,相信大家或多或少都有过。独自一人在大都市打拼,找个温暖的小窝实属不易,租个称心又价格公道的房子是件重要的事儿。

本文作者、阿里工程师鹿星,也是众多北漂中的一员。如何从各大租房网的房源里面,找到最称心如意的小窝?今天让鹿星带大家看看数据能不能做出最优选择。文末有代码。

选择困难症

毕业到现在两年多了,一直住的自如合租房,但因为各种原因住处已经换过4次,每次换租都是一件头疼的事。从茫茫房海中找一间中意的房间,实在是一件费时费力的活,对于我这种买东西直奔目的地的人来说,在这么多房间里对比各种房间属性选出最优的根本就是一种折磨(这里不得不说一下自如网的选房功能,列表筛选无法准备知道房间地点,而地图找房功能的筛选项又太少,实在无法满足我的需求),所以我每次都是草草选一个,将就着住。

最近在经历了又一次换租后,我萌生了把自如所有在租的房间数据都爬下来,找出最符合我预期的房间的想法,制作好一套流程以后再要换租的时候就可以无脑操作了。

爬取数据

分析之前需要从自如网上爬数据,我用的是Python的Scrapy爬虫框架,但第一遍采集后发现房间数量要比自如网上能查到的数量少,找了下原因发现是自如的房间列表页中有些房间条目是js动态生成的,因为Scrapy没有js引擎,只能爬取静态页面,这部分数据自然就没采集下来。利用scrapy-splash来提供js渲染服务,最终完整采集到了所有在租的自如房间数据,共7907条。采集到的数据样例如下。每一行是一个json格式的字符串

{"floorTotal": "6", "rooms": "2", "lng": "116.422213", "direction": "南", "floorLoc": "5", "halls": "1", "rentType": "整", "time_unit": "每月", "title": "青年沟2居室", "privateBathroom": "0", "confStatus": "1", "district": "东城", "lat": "39.968073", "area": "64.17", "privateBalcony": "0", "confType": "", "link": "http://www.ziroom.com/z/vr/60563968.html", "confGen": "", "price": "6590", "nearestSubWayDist": "367"}
{"floorTotal": "18", "rooms": "3", "lng": "116.400737", "direction": "西", "floorLoc": "6", "halls": "1", "rentType": "合", "time_unit": "每月", "title": "望陶园小区3居室-02卧", "privateBathroom": "0", "confStatus": "1", "district": "东城", "lat": "39.870957", "area": "10.7", "privateBalcony": "0", "confType": "布丁", "link": "http://www.ziroom.com/z/vr/60570725.html", "confGen": "4.0", "price": "2490", "nearestSubWayDist": "517"}

租金的整体印象

我只关心合租房的数据,再做脏数据过滤,共得到4762条合租房数据。合租房房租的平均值和中位数非常接近,整体数据基本无偏,即低价位和高价位的房间数量差不多。

不同价格的房间数量分布如图1,基本符合正态分布。


图 1 合租房不同价格区间的房间数量分布

神秘的最贵房间

从上图可以看到一间房超过了6000元,这勾起了我的好奇心,什么房间能这么贵。这间6290元月租金的房间链接是http://www.ziroom.com/z/vr/60558368.html ,如下图。除了紧邻西单商场其它属性都没什么突出的。去链家上看了一下这个西黄城根45号院,小区均价14.6万元/平米,好吧,似乎明白为啥这屋子这么贵了。

为了膜拜一下这个西黄城根45号院,我又在自如上搜了这个小区的所有在租房间,如下。突然发现好像就这间很贵,而其它房间价格虽然也不算低,但也不像这间这么离谱,有些房间的属性甚至看起来还比这间更好。这个房间总感觉是被自如标错价了,难不成它有什么隐藏属性(住进去每天精神值MAX)。

租金地图

房间价格在地图上的分布如图2。红色表示大于3000元/月的房间,绿色表示2000-3000元/月的房间,紫色表示小于2000元/月的房间。颜色越深表示同一个位置重叠有越多房屋,可见总体上北京北边比南边贵,东边比西边贵。而要想租到月租2000以下的房间,就得考虑去往五环之外了。


图 2 合租房价格在地图上的分布

谁最重要?

接下来看一下自如对房间定价时考虑的因素主次。使用随机森林算法对房间每月租金进行预测,选取如下14个特征:房间面积、自如配置版本(1.0,2.0等)、配置类型(布丁、拿铁等)、朝向、房间所在楼层、房间所在楼的总楼层、离最近地铁站的距离、是否有独立阳台、是否有独立卫生间、几室、几厅、所在北京区县、相对天安门的方位角、与天安门的距离。对其中的自如配置版本、配置类型、朝向、所在北京区县这四个类别特征使用One-Hot Encoding进行编码,最终扩展为41个特征。使用2/3的数据训练模型,1/3的数据进行测试,在测试集上得到拟合优度R2=0.86,不同特征对租金的影响程度Top10如下:

可见所在方位、房间面积大小、交通方便程度、有没有独卫是影响房间租金的主要因素。话说以前我还一直觉得房间加上朝南的属性会更贵,现在看来好像是我的错觉?

终极目标

最后,回到本次分析的终极目标,找出最符合我预期的房间。我需要做的就是综合我自己的关注属性值对房间进行排序,我最关心的房间属性是[房间面积,房间租金,到公司的距离],这里我使用的是灰度关联分析法对房间进行打分,详细计算过程网上都有,这里我就不再罗列了。

首先我过滤掉属性值超出我心理预期范围的房间,将价格大于等于2200元/月,面积小于等于8m2的房间过滤掉。过滤后的数据集中选5条数据如下:

对这三个属性值无量纲化,这里我使用的是离差标准化,如下。标准化后x_i^,的取值范围为[0,1]。

后数据如下:

然后设定最优序列,最理想的状态当然是房间面积最大,租金最小,到公司距离最近了。因此最优序列为[1,0,0],计算每个属性与最优序列相应属性之间的关联系数如下:

由于我对不同属性的关注程度不同,因此这里需要设定每个属性的权重,权重值使用目标优化矩阵确定。

因此房间面积权重为1/6,房间租金权重为1/3,到公司的距离权重为1/2,则每个房间的关联系数=房间面积关联系数/6+房间租金关联系数/3+到公司的距离关联系数/2,计算结果如下:

计算出所有房间的关联系数,从大到小排列后取Top10如下:

这下可以挑选房间的范围就大大缩小了,以后要是再租房感觉烦恼少好多。当然由于自如网上房间信息变动较快,随时都会有人下定,这套流程还得随租随用,不然筛选出房间后过个两三天再看,说不定房间早就被别人抢了。

来源:阿里技术
原文链接

时间: 2024-11-08 20:08:36

如何解决租房烦恼?阿里工程师写了一套神奇的代码的相关文章

这位阿里工程师的家,为何设置了重重机关?

有江湖传闻,许多阿里程序猿,最近每天下班之后,不打农药,不撩妹,蹲在家暗挫挫的布置机关,很痴迷的样子. 阿里工程师"木酱"童鞋就是其中一份子.↓↓↓ 下面带你走进木酱的家,感受不一样的天地. 表面上看,这只是一个普通的房子,但经过实地探访,满满都是心机. 在手机上呼唤Siri, 请打开客厅主灯,蹭的一下,亮了. 在沙发上看电影,吼一嗓子,窗帘合上了. 还有去厨房拿个冷饮,灯能自动感应. 躺在床上,说声晚安,家里的电器也都睡了. 这些埋在角落里的小机关,有的是人体感应器,有的是红外信号发

高德API+Python帮你解决租房问题

项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCit发布在实验楼,完整教程及在线练习地址:高德API+Python解决租房问题,可以直接在教程中下载代码使用demo. 一.项目介绍 1. 项目背景 来自一段租房血泪史(夸张):事情是这样的,笔者是接着念大四准备考研,而室友是应届毕业在找工作,说白了就是都没有钱,于是打算合租.因为穷所以不可能找有门店

没想到,阿里工程师每天必刷的网站是......

阿里人每日必逛的神奇内网 阿里内外是阿里内部员工使用的企业运行与协作平台.它诞生于2013年,彼时只是一个门户和企业社交的入口.但经过3年发展,阿里内外实现了平台化运营,不仅接入众多阿里应用与系统,阿里的生态公司也开始享受阿里内外提供的一体化服务.今年,阿里内外开始向3.0智能模式发展,通过互联网数据和算法技术,增加诸如企业搜索.企业推荐.智能工作辅助,通过智能模式提高员工协同办公效率. 阿里内外界面 阿里有一句老话:一个人可以走得很快,但是一群人可以走得很远.在阿里,组织文化与工作协同是最重要

写了个读文件的代码,但运行之后读出来的就乱了

问题描述 写了个读文件的代码,但运行之后读出来的就乱了 这是代码void Read()//从文件中读取{ int ij; FILE *fp; fp=fopen(""busline.txt""r+""); if(fp==NULL) { printf(""不能打开此文件!""); exit(0); } for(i=0;i<m;i++) { fscanf(fp%d""&bl[i]

jQuery模仿阿里云购买服务器选择购买时间长度的代码_jquery

jQuery仿阿里云购买服务器选择时间长度,操作简单,只需点击所要选的时间段.下面给大家展示下效果图,就什么都明白了,如果大家觉得不错,请参考实现代码. 效果图如下: 代码: <!doctype html> <html lang="en"> <head> <!-- 效果:http://hovertree.com/texiao/jquery// --> <meta charset="UTF-"> <ti

阿里员工借IPO解套$410亿 或产生离职潮

摘要: 复杂世界里,有「亿邦8条」就够了! 今天,你可以错过无数的八卦段子,但不能错过以下电商动态: 阿里员工借IPO解套$410亿 或产生离职潮 在阿里巴巴集团准备正式IPO之际,还一直就如 复杂世界里,有「亿邦8条」就够了! 今天,你可以错过无数的八卦段子,但不能错过以下电商动态: 阿里员工借IPO解套$410亿 或产生离职潮 在阿里巴巴集团准备正式IPO之际,还一直就如何管理股票套现所得向员工提供建议.已经有部分员工有机会在此前阿里巴巴的结构化股票出售中通过所谓的流动性计划抛售部分股票.阿

有接口 如何去搜索频点 找到电视台节目 不会写 搜频 和直播的代码

问题描述 有接口 如何去搜索频点 找到电视台节目 不会写 搜频 和直播的代码 麻烦大神给个思路 有接口 如何去搜索频点 找到电视台节目 不会写 搜频 和直播的 代码 解决方案 http://blog.csdn.net/zxh821112/article/details/17008589

关于JAVA的Comparable类不是很理解,写了一个有关比较的代码,但出现了异常,大神帮我看看

问题描述 关于JAVA的Comparable类不是很理解,写了一个有关比较的代码,但出现了异常,大神帮我看看 关于JAVA的Comparable类,我不是很理解,于是,我写了一个有关比较的代码,但出现了异常,大神帮我看看 解决方案 需要实现Comparable接口 Comparable implements Comparable 解决方案二: 首先,Java的array的sort方法要求传入的集合元素必须实现Comparable或者Comparator接口,其次,主要就是提供compareTo方

【译】使用 currentColor 属性写出更好的 CSS 代码

本文讲的是[译]使用 currentColor 属性写出更好的 CSS 代码, 总有一些极其强大的 CSS 属性在目前已经有了很好的浏览器支持,但却很少被开发者使用. currentColor 就是这样的属性之一. MDN 把 currentColor 定义为: currentColor 代表了当前元素被应用上的 color 颜色值.它允许让继承自属性或子元素属性的 color 属性为默认值而不再继承. 在本文中,我们将通过一些有趣的方式来概述如何使用 CSS currentColor 这一关键