大佬,您的選房系統已上線

資料團學社發表於2018-11-19

本文約1500字,閱讀需要5分鐘

關鍵詞:買房 Python 選房 R 定價

本文講述了藉助Python,Gis和R語言製作房源定價系統的方法,對原理、過程都有詳細的講述

為了能在當今競爭激烈的社會活下去,我一直在孜孜不倦地開發自己的潛能,尋找更多的副職業增加收入,從而在雙十一後的雙十二可以繼續剁手。

這不,成為業餘房地產諮詢師的第一天,客戶戳我了:我要在上海16個區買16套房子,資金到位,您給估個價吧。

大佬,您的選房系統已上線

對於這類在在如此嚴峻的房地產政策之下,還想擁有兩位數以上房產的“忽悠”高手,我一向給予至尊VIP的待遇。

決定一套房子價格的因素主要是三個方面,房屋本身的屬性,房屋的空間位置和周邊的其他因素。這篇文章會講述考慮這些因素的分析——建模——檢驗的過程。

  資料集的準備 

這裡分為兩步:

第一步,抓取所有URL:

if __name__=='__main__':                 
    url_list = create_url(220,2#填寫區間最大面積和公差,保證按大於最大面積搜尋,房源數小於等於3000
    data_list = []
    #data_list = craw_second_url(url_list)
    craw_second_url(url_list)
    data =  pd.DataFrame(pd.Series(data_list),columns=['url'])
    data.to_csv('./urls.csv',encoding='gbk',index=0)
    print('finish')

接下來,爬取房源資訊:

def read_url(path):
    path = path
    data = pd.read_csv(path,engine='python')
    try:
        data_received = pd.read_csv('./house_inf_lianjia.csv',engine='python')
        print('匯入爬取資料')
        data_received_list = data_received['url'].tolist()
        print('轉換表格')
        url_list = data[~data['url'].isin(data_received_list)]['url'].unique().tolist()
        print('剔除已爬取資料')
        print(len(url_list))
    except :
        url_list = data['url'].unique().tolist()
        data = pd.DataFrame(
            columns=['house_id''name''price''area_price''area''room''livingroom''kitchenroom',
                     'bathroom''lng''lat''url'])
        data.to_csv('./house_inf_lianjia.csv', encoding='gbk', index=0)
        print('無歷史資料')
    return url_list

我還順手做了一個斷點續傳功能,每次開始爬蟲前會匹配URL列表,保證爬取過的不再爬取,方便更新和分時段爬取。詳細程式碼請見文末,我爬取了1W+的資料作為樣本:

大佬,您的選房系統已上線

另外,我準備了另一份資料:美團美食頻道1W+的餐飲POI. 同樣使用爬蟲獲取。

大佬,您的選房系統已上線

 建模準備 

這一部分我們會將房源資料和POI資料等資訊整合在一起用於建模,可以用ArcGis完成。

紅色的為餐飲POI,綠色的為房源資料(有時間的朋友可以爬取全量資料)

大佬,您的選房系統已上線

先對房源做緩衝區,緩衝區半徑為1KM,考慮這個範圍內的POI資料。

大佬,您的選房系統已上線

 結果如圖:

大佬,您的選房系統已上線

 然後使用緩衝區與餐飲POI進行空間關聯,這樣就可以統計出一個房源1KM半徑範圍內餐飲POI的數量,價格,評論數等等資訊,以便接下來建模使用。

大佬,您的選房系統已上線

 另外,常識告訴我們,一般離市中心越近,房價越高,隨意我們再增加一個距離屬性。先添個底圖:

大佬,您的選房系統已上線

 然後建立一個上海中心點點資料。上海的中心點,在人民廣場附近,方便起見,就在地圖上點一個吧!

大佬,您的選房系統已上線

 把圖層轉換成投影座標系,便於計算距離:

大佬,您的選房系統已上線

給中心點資料和緩衝區資料新增兩個欄位,存放投影經緯度

大佬,您的選房系統已上線

 然後使用計算幾何,獲取投影經緯度,單位選擇米

大佬,您的選房系統已上線

 結果如圖(部分):

大佬,您的選房系統已上線

 接下來計算距離,可以在GIS內直接操作,也可以匯出資料,在EXCEL中用兩點之間距離公式計算。

大佬,您的選房系統已上線

 

這樣,我們就整合完成了一份樣本資料,可以用來進行建模操作!

大佬,您的選房系統已上線

 建模操作 

左手python右手R,先匯入一堆包:


library(readr)
library(funr)
library(openxlsx)
library(dplyr)
library(caret)
library(readxl)
library(psych)
library(plyr)
library(ggplot2)


 建立工作路徑和讀取資料


########################################### path setting and data reading ##########################################
path <- get_script_path() # 獲取指令碼路徑
# path = '' #可以手動輸入工作路徑
print(path)
setwd(path) # 設定工作路徑
model_data <- read_csv("model_data.csv")


 然後,是資料清洗,提煉我們需要建模的屬性


########################################### Data cleaning ##########################################
model_data <- na.omit(model_data)
model_data 


 我們今天要擬合一個迴歸模型,所以,先來看一看屬性之間的相關性


psych::pairs.panels(model_data)#檢視相關性


這行程式碼會畫出一張逼格很高的圖:

大佬,您的選房系統已上線

理解幾個關鍵點:

1.相關性係數,絕對值越接近1表明相關性越顯著,比如房價和麵積相關度為0.77;

2.圖中的直方圖為每個維度的資料分佈

3.散點圖中圓越完美表明相關度越低,橢圓形狀表明相關度顯著

4.圖中的線條是檢視線性關係的,可以體現自變數和因變數之間的關係

 下面,我們使用全部屬性構建一個迴歸模型。Price是因變數,“~.”表示匯入所有自變數。最後列印模型結果檢視。


model <-lm(price~.,data=model_data)
print(summary(model))
print(car::vif(model))


 我們可以從結果中讀取到擬合後的函式,殘差,迴歸係數,P值,R方等。對於多元線性迴歸,R方會隨著變數的增多不變或增加,所以看實際R方並不科學,模型引入了懲罰因子,最後,我們以調整R方作為最終判定擬合度的依據。我們看到,R方為0.8393,擬合度應該相當不錯。

大佬,您的選房系統已上線

 

然後,我們還要關注一下共線問題。

什麼是共線問題?

簡單說就是兩個變數描述的是同一個內容,我們需要去掉其中一個。比如,“雙十一我剁手了”和”我這個月要吃土了”表達的是一個意思:沒錢!

我們看到緩衝區內餐廳數量和平均得分之和數字都超過了200,只要大於10的都屬於共線,應該根據具體情況刪減。

大佬,您的選房系統已上線

 下面我們使用逐步迴歸法,最佳化模型。

逐步迴歸分三種,這裡我直接百度介紹:

大佬,您的選房系統已上線



model_step <- step(model,direction = "both")# 使用逐步迴歸的方法篩選變數
print(summary(model_step))


 最佳化後的模型為:

大佬,您的選房系統已上線

我們看到,R方進一步提升,達到0.8415。不過,有一個問題,這裡去掉了餐廳數量,選擇使用評分總和作為其中一個變數,但這裡根據我們經驗,常識和習慣,這樣並不科學。

所以,我們人工替換回餐廳數量這個變數再一次擬合。

model_fin <- lm(formula = price ~ area + room + bathroom + Sum_allcommentNum + 
                  Avg_allcommentNum + Avg_avgprice + resturant_counts + len, data = model_data)

擬合結果:

大佬,您的選房系統已上線

 R方下降0.0001,幾乎沒有變化,完美!

我們匯出迴歸模型,方便檢視。

table = data.frame(summary(model_fin)[["coefficients"]])
table['variable']=row.names(table)
write.xlsx(x = table,file = 'coefficients.xlsx',
           sheetName = 'sheet1',
           row.names = FALSE,
           overwrite=TRUE)

Estimate為迴歸係數,std.error為標準誤差,t.value為t值,pr.t為P值,顯然所有變數P值均小於0.05,非常顯著。

大佬,您的選房系統已上線

 最後,我們來使用這個模型,來給房源定價:

predict_result <- predict(model_fin,
                          data.frame(area =108,
                                     room=3,
                                     bathroom=2,
                                     Sum_allcommentNum=56399,
                                     Avg_allcommentNum=247.36,
                                     Avg_avgprice=114.12,
                                     resturant_counts=228,
                                     len=6438),
                          interval = 'confidence')
print(predict_result)


用法很簡單,輸入房源的資訊,就能預測出結果。比如108平米,3房2衛,1KM半徑緩衝區內有228家餐廳,平均價格114.2,平均評論數247.36,評論綜合56399條,距離市中心6.438KM,最終結果如下:

(從左往右分別是:估價-最低估價-最高估價)

大佬,您的選房系統已上線

嘖嘖~按月薪1W計算,一年12W,需要工作


大佬,您的選房系統已上線


客戶看了我的定價模型以後,感覺非常滿意!悄悄地問我:在上海郊環以外,有沒有10平米的合租房?

原文連結:https://mp.weixin.qq.com/s/soPSbvJJnostZAE4J0GOKQ

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558017/viewspace-2220630/,如需轉載,請註明出處,否則將追究法律責任。

相關文章