大佬,您的選房系統已上線
本文約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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 石家莊線上教育系統熱線:您的教育問題解決了嗎?
- 怎樣選擇優質的線上教育系統原始碼原始碼
- 線上CRM系統
- 華納云為您介紹香港機房伺服器選擇哪條線路好?伺服器
- 壹基比給您介紹香港機房伺服器選擇哪一條線路伺服器
- 選擇好用的CRM系統,這些事情您需要知道!
- 鵝廠大佬親身經歷證明,一週上線百萬級併發系統
- 如何為您選擇合適的製造執行系統(MES)?
- 您的檔案加速專車已停穩,請上車!!!
- 如何修復“您的系統已耗盡應用程式記憶體”錯誤記憶體
- 搭建線上上課的網校系統,教育體系的新理念
- win10線上重灌系統怎麼操作_怎麼線上裝系統windows10系統Win10Windows
- 上線部署系統-瓦力
- 線上直播系統原始碼,取CTreeCtrl控制元件選中節點的文字原始碼控制元件
- 使用線上教育SaaS系統的優勢
- 六個線上CRM系統的優勢
- 房產小程式搭建 房產報備系統原始碼的使用原始碼
- 房產中介適合用哪個房產管理系統?
- 線上教育app系統開發APP
- 線上CRM系統哪裡好用?
- 線上電影系統設計
- 房產中介管理ERP系統
- golang版supervisor 已經線上上使用Golang
- OKR系統改變您的團隊OKR
- 如何深度應用您的CRM系統
- windows10線上重灌系統圖文詳解_如何線上重灌win10系統WindowsWin10
- 房產界已上市和IPO路上的難兄難弟:房天下與房多多
- 線上抽獎系統的測試報告測試報告
- 線上CRM系統的安全性高嗎?
- ERP系統上線後的生存和發展
- 業務寶-免費線上的CRM系統
- 選擇CRM系統後的十個優勢上
- TP FANS線上教育系統|慕課網|線上視訊|
- 實踐 | 嘉益仕(Litns)帶您讀懂MES系統:選型篇
- 基於servlet線上書店系統Servlet
- 小型線上圖書系統需求分析
- 易學堂線上教學系統
- 貨架安全線上監測系統