如何解決租房煩惱?阿里工程師寫了一套神奇的代碼
租房的煩惱,相信大家或多或少都有過。獨自一人在大都市打拚,找個溫暖的小窩實屬不易,租個稱心又價格公道的房子是件重要的事兒。
本文作者、阿里工程師鹿星,也是眾多北漂中的一員。如何從各大租房網的房源裡面,找到最稱心如意的小窩?今天讓鹿星帶大家看看數據能不能做出最優選擇。文末有代碼。
選擇困難症
畢業到現在兩年多了,一直住的自如合租房,但因為各種原因住處已經換過4次,每次換租都是一件頭疼的事。從茫茫房海中找一間中意的房間,實在是一件費時費力的活,對於我這種買東西直奔目的地的人來說,在這麼多房間里對比各種房間屬性選出最優的根本就是一種折磨(這裡不得不說一下自如網的選房功能,列表篩選無法準備知道房間地點,而地圖找房功能的篩選項又太少,實在無法滿足我的需求),所以我每次都是草草選一個,將就著住。
最近在經歷了又一次換租後,我萌生了把自如所有在租的房間數據都爬下來,找出最符合我預期的房間的想法,製作好一套流程以後再要換租的時候就可以無腦操作了。
爬取數據
分析之前需要從自如網上爬數據,我用的是Python的Scrapy爬蟲框架,但第一遍採集後發現房間數量要比自如網上能查到的數量少,找了下原因發現是自如的房間列表頁中有些房間條目是js動態生成的,因為Scrapy沒有js引擎,只能爬取靜態頁面,這部分數據自然就沒採集下來。利用scrapy-splash來提供js渲染服務,最終完整採集到了所有在租的自如房間數據,共7907條。採集到的數據樣例如下。每一行是一個json格式的字元串
租金的整體印象
我只關心合租房的數據,再做臟數據過濾,共得到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如下:
這下可以挑選房間的範圍就大大縮小了,以後要是再租房感覺煩惱少好多。當然由於自如網上房間信息變動較快,隨時都會有人下定,這套流程還得隨租隨用,不然篩選出房間後過個兩三天再看,說不定房間早就被別人搶了。
來源:阿里技術
租房爬蟲分析代碼(複製後在PC網頁端打開):
http://techforum-img.cn-hangzhou.oss-pub.aliyun-inc.com/%E7%88%AC%E8%99%AB%E5%92%8C%E5%88%86%E6%9E%90%E4%BB%A3%E7%A0%81.zip
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
推薦閱讀:
※大致介紹下SSL?
※瀏覽器地址欄里的 https 加密圖標,分別是什麼含義?
※HTTPS 可能被這樣劫持嗎?
※如何評價 Chrome Android 不再選用 ChaCha20 作為首選演算法?