1. 程式人生 > >如何解決租房煩惱?阿里工程師寫了一套神奇的程式碼

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

摘要: 租房的煩惱,相信大家或多或少都有過。獨自一人在大都市打拼,找個溫暖的小窩實屬不易,租個稱心又價格公道的房子是件重要的事兒。 本文作者、阿里工程師鹿星,也是眾多北漂中的一員。如何從各大租房網的房源裡面,找到最稱心如意的小窩?今天讓鹿星帶大家看看資料能不能做出最優選擇。

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

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

選擇困難症

畢業到現在兩年多了,一直住的自如合租房,但因為各種原因住處已經換過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如下:
圖片描述
這下可以挑選房間的範圍就大大縮小了,以後要是再租房感覺煩惱少好多。當然由於自如網上房間資訊變動較快,隨時都會有人下定,這套流程還得隨租隨用,不然篩選出房間後過個兩三天再看,說不定房間早就被別人搶了。