閱讀439 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何解決租房煩惱?阿裏工程師寫了一套神奇的代碼

租房的煩惱,相信大家或多或少都有過。獨自一人在大都市打拚,找個溫暖的小窩實屬不易,租個稱心又價格公道的房子是件重要的事兒。

本文作者、阿裏工程師鹿星,也是眾多北漂中的一員。如何從各大租房網的房源裏麵,找到最稱心如意的小窩?今天讓鹿星帶大家看看數據能不能做出最優選擇。文末有代碼。

畢業到現在兩年多了,一直住的自如合租房,但因為各種原因住處已經換過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": "https://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": "https://www.ziroom.com/z/vr/60570725.html", "confGen": "4.0", "price": "2490", "nearestSubWayDist": "517"}

我隻關心合租房的數據,再做髒數據過濾,共得到4762條合租房數據。合租房房租的平均值和中位數非常接近,整體數據基本無偏,即低價位和高價位的房間數量差不多。

image

不同價格的房間數量分布如圖1,基本符合正態分布。

image
圖 1 合租房不同價格區間的房間數量分布

從上圖可以看到一間房超過了6000元,這勾起了我的好奇心,什麼房間能這麼貴。這間6290元月租金的房間鏈接是https://www.ziroom.com/z/vr/60558368.html ,如下圖。除了緊鄰西單商場其它屬性都沒什麼突出的。去鏈家上看了一下這個西黃城根45號院,小區均價14.6萬元/平米,好吧,似乎明白為啥這屋子這麼貴了。

image

為了膜拜一下這個西黃城根45號院,我又在自如上搜了這個小區的所有在租房間,如下。突然發現好像就這間很貴,而其它房間價格雖然也不算低,但也不像這間這麼離譜,有些房間的屬性甚至看起來還比這間更好。這個房間總感覺是被自如標錯價了,難不成它有什麼隱藏屬性(住進去每天精神值MAX)。


image

房間價格在地圖上的分布如圖2。紅色表示大於3000元/月的房間,綠色表示2000-3000元/月的房間,紫色表示小於2000元/月的房間。顏色越深表示同一個位置重疊有越多房屋,可見總體上北京北邊比南邊貴,東邊比西邊貴。而要想租到月租2000以下的房間,就得考慮去往五環之外了。

image
圖 2 合租房價格在地圖上的分布

接下來看一下自如對房間定價時考慮的因素主次。使用隨機森林算法對房間每月租金進行預測,選取如下14個特征:房間麵積、自如配置版本(1.0,2.0等)、配置類型(布丁、拿鐵等)、朝向、房間所在樓層、房間所在樓的總樓層、離最近地鐵站的距離、是否有獨立陽台、是否有獨立衛生間、幾室、幾廳、所在北京區縣、相對天安門的方位角、與天安門的距離。對其中的自如配置版本、配置類型、朝向、所在北京區縣這四個類別特征使用One-Hot Encoding進行編碼,最終擴展為41個特征。使用2/3的數據訓練模型,1/3的數據進行測試,在測試集上得到擬合優度R2=0.86,不同特征對租金的影響程度Top10如下:


image

可見所在方位、房間麵積大小、交通方便程度、有沒有獨衛是影響房間租金的主要因素。話說以前我還一直覺得房間加上朝南的屬性會更貴,現在看來好像是我的錯覺?

最後,回到本次分析的終極目標,找出最符合我預期的房間。我需要做的就是綜合我自己的關注屬性值對房間進行排序,我最關心的房間屬性是[房間麵積,房間租金,到公司的距離],這裏我使用的是灰度關聯分析法對房間進行打分,詳細計算過程網上都有,這裏我就不再羅列了。

首先我過濾掉屬性值超出我心理預期範圍的房間,將價格大於等於2200元/月,麵積小於等於8m2的房間過濾掉。過濾後的數據集中選5條數據如下:


image

對這三個屬性值無量綱化,這裏我使用的是離差標準化,如下。標準化後x_i^,的取值範圍為[0,1]。

image

後數據如下:


image


然後設定最優序列,最理想的狀態當然是房間麵積最大,租金最小,到公司距離最近了。因此最優序列為[1,0,0],計算每個屬性與最優序列相應屬性之間的關聯係數如下:

image

由於我對不同屬性的關注程度不同,因此這裏需要設定每個屬性的權重,權重值使用目標優化矩陣確定。

image

因此房間麵積權重為1/6,房間租金權重為1/3,到公司的距離權重為1/2,則每個房間的關聯係數=房間麵積關聯係數/6+房間租金關聯係數/3+到公司的距離關聯係數/2,計算結果如下:


image

計算出所有房間的關聯係數,從大到小排列後取Top10如下:

image

這下可以挑選房間的範圍就大大縮小了,以後要是再租房感覺煩惱少好多。當然由於自如網上房間信息變動較快,隨時都會有人下定,這套流程還得隨租隨用,不然篩選出房間後過個兩三天再看,說不定房間早就被別人搶了。

來源:阿裏技術
原文鏈接

最後更新:2017-08-13 22:35:37

  上一篇:go  8月4日雲棲精選夜讀:澳門擁抱阿裏雲:全麵應用智能技術,為城市裝上“大腦”
  下一篇:go  HiStore:阿裏巴巴海量數據場景下的OLAP解決方案