智慧城市賽道之房產租金預測(一)

房產租金預測共分爲6個階段,任務概覽:

賽題分析\to數據清洗\to特徵工程\to模型選擇\to模型融合\to比賽整理

這裏,我們分階段進行討論,每次進行一個。

賽題分析

一、比賽背景

近幾年,國內住房租賃市場進入全新的發展階段,長期公寓市場作爲租賃市場的重要部分,越來越受到廣泛的關注。但同時中國長期公寓市場也面臨着企業市場進入、業務(門店)擴張、資本市場博弈、企業重組併購等多重挑戰,其中,如何準確的預測租金便成爲該行業發展進程中的一大難題。

本次賽題主要是通過房產市場、租賃市場、市場需求以及房屋配置來做出合理的房租預測,以應對市場變化對運營商和房產機構帶來的影響。命題方向爲運用機器學習人工智能等模型算法,結合模型的創新能力,來實現準確預測的目的。

二、數據集字段說明

  • 對於小區信息中,關於cityregionplate三者的關係:city>region>plate
  • 土地數據中,土地樓板面積是指在土地上建築的房屋總面積
  • 相關類別及說明:

1.租賃房源:
ID——房屋編號            數值型                   
area——房屋面積          數值型             
rentType——出租方式:整租/合租/未知       類別型
houseType——房型               類別型
houseFloor——房間所在樓層:高/中/低      類別型
totalFloor——房間所在的總樓層數        數值型
houseToward——房間朝向           類別型
houseDecoration——房屋裝修         類別型

2.小區信息:
CommunityName——小區名稱         類別型
city——城市                  類別型
region——地區                類別型
plate——區域板塊              類別型
buildYear——小區建築年代          類別型
saleSecHouseNum——該板塊當月二手房掛牌房源數   數值型

3.配套設施:
subwayStationNum——該板塊地鐵站數量       數值型
busStationNum——該板塊公交站數量         數值型
interSchoolNum——該板塊國際學校的數量      數值型
schoolNum——該板塊公立學校的數量        數值型
privateSchoolNum——該板塊私立學校數量      數值型
hospitalNum——該板塊綜合醫院數量         數值型
DrugStoreNum——該板塊藥房數量         數值型
gymNum——該板塊健身中心數量          數值型
bankNum——該板塊銀行數量           數值型
shopNum——該板塊商店數量           數值型
parkNum——該板塊公園數量           數值型
mallNum——該板塊購物中心數量         數值型
superMarketNum——該板塊超市數量       數值型

4.二手房:
totalTradeMoney——該板塊當月二手房成交總金額   數值型
totalTradeArea——該板塊二手房成交總面積      數值型 
tradeMeanPrice——該板塊二手房成交均價       數值型
tradeSecNum——該板塊當月二手房成交套數      數值型

5.新房:
totalNewTradeMoney——該板塊當月新房成交總金額   數值型
totalNewTradeArea——該板塊當月新房成交的總面積   數值型
totalNewMeanPrice——該板塊當月新房成交均價     數值型
tradeNewNum——該板塊當月新房成交套數        數值型
remainNewNum——該板塊當月新房未成交套數      數值型
supplyNewNum——該板塊當月新房供應套數       數值型

6.土地:
supplyLandNum——該板塊當月土地供應幅數      數值型
supplyLandArea——該板塊當月土地供應面積      數值型
tradeLandNum——該板塊當月土地成交幅數       數值型
tradeLandArea——該板塊當月土地成交面積       數值型
landTotalPrice——該板塊當月土地成交總價       數值型
landMeanPrice——該板塊當月樓板價(元/m2m^{2})      數值型

7.人口:
totalWorkers——當前板塊現有的辦公人數         數值型
newWorkers——該板塊當月流入人口數(現招聘的人員)  數值型
residentPopulation——該板塊常住人口          數值型

8.客戶:
pv——該板塊當月租客瀏覽網頁次數           數值型
uv——該板塊當月租客瀏覽網頁總人數          數值型
lookNum——線下看房次數               數值型

9.真實租金:
tradeTime——成交日期               類別型
tradeMoney——成交租金              數值型

二、探索性數據分析EDA

加載包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snn
from scipy.stats import norm

獲取數據

##--Load train data and test data--
train_df = pd.read_csv('train_data.csv')
test_df = pd.read_csv('test_a.csv')
1. 缺失值分析
#train_df.info()
combine = [train_df,test_df]
for dataSet in combine:
    Total = dataSet.isnull().sum().sort_values(ascending=False)
    Percent = Total/dataSet.isnull().count()
    Missing_count = pd.concat([Total,Percent],axis=1,keys=['Total','Percent'],sort=False)
    print(Missing_count.head(2))
    print('--------------------')

結果:
在這裏插入圖片描述
我們可以看到:pvuv都有少量的缺失值,其中pv表示該板塊當月租客瀏覽網頁次數,uv表示該板塊當月租客瀏覽網頁總人數 。這裏,我們可以使用均值,中位數,衆數等簡單的方法進行填充。
但是,通過散點圖分析,這兩個點有很強的的關聯,故可以用一個特徵來表示:
在這裏插入圖片描述

2. 特徵和與預測值關聯性分析

本來我想利用相關性分析,找出與要預測的變量tradeMoney關聯較大的變量,在畫出散點圖,直觀表示的,結果。。。

corr_mat = train_df.corr()
fig,ax = plt.subplots(figsize = (30,20))
snn.heatmap(corr_mat,vmax=.8,square=True,ax=ax,cmap='YlGnBu')
plt.xticks(rotation = 90)
plt.yticks(rotation = 0)
plt.show()

結果:
在這裏插入圖片描述
好像關聯性都不是很強。。。數據非常不好,很 “髒”

3. 特徵nunique分佈
3.1 出現在測試集中的commuity,但在訓練集中很少
train_community = train_df['communityName'].value_counts().sort_values(ascending=True)
test_community =  test_df['communityName'].value_counts()
print(train_community.head(10))

在這裏插入圖片描述

3.2 統計特徵值出現頻次大於100的特徵
feature_frency=train_df.describe(include=['O'])
print('統計各個特徵出現的最大頻數:\n', feature_frency)
print('-------------------------------------------------------------------------------')
print('統計各個分類特徵的特徵值頻數是否大於100:\n',feature_frency[feature_frency.index=='unique'].apply(lambda x:x>100))

結果:
在這裏插入圖片描述

4. Label分佈

先對明顯的outlier做了處理,

Q1 = train_df['tradeMoney'].quantile(q=0.75)
Q2 = train_df['tradeMoney'].quantile(q=0.25)
train_df= train_df[(train_df['tradeMoney']<Q1+3*(Q1-Q2))&(train_df['tradeMoney']>Q2-3*(Q1-Q2))]

Q11 = train_df['area'].quantile(q=0.75)
Q12 = train_df['area'].quantile(q=0.25)
train_df= train_df[(train_df['area']<Q11+3*(Q11-Q12))&(train_df['area']>Q12-3*(Q11-Q12))]

Q21 = test_df['area'].quantile(q=0.75)
Q22 = test_df['area'].quantile(q=0.25)
test_df= test_df[(test_df['area']<Q21+3*(Q21-Q22))&(test_df['area']>Q22-3*(Q21-Q22))]

觀察訓練集和測試集中的樣本分佈,

train_df.hist(bins=50,figsize=(15,10))
plt.tight_layout(pad=0.5)
plt.show()

訓練集的特徵分佈:
在這裏插入圖片描述
測試集的特徵分佈:

 train_df.hist(bins=50,figsize=(15,10))
 plt.tight_layout(pad=0.5)
 plt.show()

在這裏插入圖片描述
經過簡單的異常值處理以後,可以看出,訓練集和測試集特徵分佈大體相同。

4.1. 因變量 tradeMoney 分佈
fig,ax = plt.subplots(figsize=(12,9))
snn.distplot(train_df['tradeMoney'],fit=norm,ax=ax)
plt.show()

結果:
在這裏插入圖片描述
數據存在明顯的 outlier,本來應該先清洗一下的,但按照流程是放在第二部分的。
Label進行切分,

pd.qcut(train_df['tradeMoney'],q=4)

對切分的四份數據進行分析,

tradeMoney_1 = train_df.loc[train_df['tradeMoney']<=2800,'tradeMoney']
tradeMoney_2 = train_df.loc[(train_df['tradeMoney']>2800)&(train_df['tradeMoney']<=4000),'tradeMoney']
tradeMoney_3 = train_df.loc[(train_df['tradeMoney']>4000)&(train_df['tradeMoney']<=5500),'tradeMoney']
tradeMoney_4 = train_df.loc[train_df['tradeMoney']>5500,'tradeMoney']
fig,(ax1,ax2,ax3,ax4) = plt.subplots(1,4,figsize=(30,20))
snn.distplot(tradeMoney_1,fit=norm,ax=ax1)
snn.distplot(tradeMoney_2,fit=norm,ax=ax2)
snn.distplot(tradeMoney_3,fit=norm,ax=ax3)
snn.distplot(tradeMoney_4,fit=norm,ax=ax4)
plt.show()

結果:
在這裏插入圖片描述

4.2. 分類數據 category feature 的分佈

在這裏插入圖片描述
在這裏插入圖片描述

train_df['tradeMounth'] = train_df['tradeTime'].apply(lambda x:int(x.split('/')[1]))

在這裏插入圖片描述
在這裏插入圖片描述
後期的分析和代碼鍵github:https://github.com/ZhangHongBo2019/test

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章