Airbnb為人們游玩出差提供了一種新的租房選擇,該公司公布了其2019年以前的部分紐約房源租賃數據。對這些數據進行分析殴泰,嘗試得到消費者的一些信息以幫助公司增加盈利芒涡。
目錄:
1 數據預處理
2 分類特征對于房間價格和房源數量的影響
3 分類特征對其他數字特征的影響
4 數字特征之間的影響
5 位置(經緯度)對各項屬性的的影響
6 建立RFM 模型分析
1 數據預處理
1.1導入庫和數據
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
pd.set_option('display.width',None)
pd.set_option('display.max_columns',None)
df=pd.read_csv(r'E:\project\myproject\project2\AB_NYC_2019.csv')
1.2獲取數據基本信息
該數據源包含以下字段,分別意義如下:
id:掛牌號
name:掛牌房源標題
host_id:戶主ID
host_name: 戶主名
neighbourhood_group: 區(qū)域
neighbourhood :地區(qū)
latitude : 緯度
longitude:經度
room_type: 房間類型
price:價格/每晚
minimum_nights:最少預定天數
number_of_reviews: 評論數量
last_review: 最近評論時間
reviews_per_month:每月評論數量
calculated_host_listings_count:房主擁有的房間數
availability_365: 可以預定的天數
df.room_type.unique()
輸出:
array(['Private room', 'Entire home/apt', 'Shared room'], dtype=object)
房屋類型主要分三種:單人間物延,整租宣旱,共享房屋
df.neighbourhood_group.unique()
輸出:
array(['Brooklyn', 'Manhattan', 'Queens', 'Staten Island', 'Bronx'],dtype=object)
區(qū)域一共有五種類型,分別對應紐約市五個區(qū)
1.3缺失值補全
#查詢數據源基本信息
df.info()
數據有缺失的部分為:
hostname:由于戶主名對分析沒有幫助叛薯,因此刪除此列
name存在空值浑吟,用0填充
last_review和reviews_per_month 也存在部分空值,這些空值用0填充耗溜,表示無評論
df.drop('host_name',axis=1,inplace=True)
df=df.fillna(0)
1.4時間格式標準化
#將時間標準化
df['last_review']=pd.to_datetime(df.last_review,format='%Y-%m-%d')
#計算出距今時間(假設最后一個評論的時間是今天日期)
df['last_review_to_today']=(df.last_review.max()-df.last_review)/np.timedelta64(1,'D')
df.last_review.min()
#由此可知组力,該數據庫最早的記錄為1970-01-01,為異常值抖拴,應剔除這些數據
df=df.query('last_review_to_today!=18085')
2 分類特征對于房間價格和房源數量的影響
2.1 房價
本數據庫中忿项,分類特征主要包含房源類型和區(qū)域類型,先研究他們對房源數量和價格的影響城舞。
查看各個區(qū)域房價描述統計情況
df.groupby('neighbourhood_group').price.describe().T
可以看出轩触,
- 房源主要集中于曼哈頓區(qū)和布魯克林區(qū),共40000套家夺,而其他區(qū)域總計7000套左右脱柱。
- 各區(qū)域出租房源的均價在100-200美元左右,而極值是10000美元拉馋。少數偏離正常價格的數據影響了分析過程榨为。考慮距離平均值2倍標準差以內的值為正常值煌茴,對數據做過濾
df_filtered=df.loc[
((df.neighbourhood_group=='Bronx')&(df.price<299))|
((df.neighbourhood_group=='Brooklyn')&(df.price<496))|
((df.neighbourhood_group=='Manhattan')&(df.price<778))|
((df.neighbourhood_group=='Queens')&(df.price<433))|
((df.neighbourhood_group=='Staten Island')&(df.price<668))]
2.1.1 區(qū)域對房價的影響
首先采用提琴圖分析每個區(qū)域價格的總體情況
sns.violinplot(x='neighbourhood_group',y='price',data=df_filtered)
2.1.2 房間類型對房價的影響
由于不同房間類型的價格也有明顯區(qū)別随闺,因此繪制箱線圖時,將不同房間類型也作為一個維度加以區(qū)別蔓腐。
sns.boxplot(x='room_type',y='price',hue='neighbourhood_group',data=df_filtered,showfliers=False)
從圖中可以看出
- 曼哈頓區(qū)價格明顯高于其他區(qū)域矩乐,反映了其商業(yè)中心的定位。
- 曼哈頓和布魯克林區(qū)提琴形狀偏高瘦,房源價格分布較廣散罕,而其他三個區(qū)域價格較集中分歇。
- 整租價格大于單人間大于共享房屋,符合常理欧漱。且各區(qū)域之間相比职抡,共享房屋(低端需求)的價格差別不大,整租的房間(高端需求)價格差別較大误甚,各區(qū)域之間的價格差異也主要體現在這里缚甩。
- 布魯克林和斯塔恩島價格箱線圖中,中位數都較低窑邦,說明大部分房源價格較低蹄胰。
2.2房源數量的影響因素
pic3=df_filtered.pivot_table(index='neighbourhood_group',columns='room_type',values='price',aggfunc='count').plot.bar()
pic3.set_xlabel('Neighbourhood_group')
pic3.set_ylabel('Num of listings')
pic3.set_title('Num of listing by Room Type across zone',fontweight='bold')
pic3.set_xticklabels(pic3.get_xticklabels(),rotation=45)
plt.show()
可以看出
- 共享房源的數量遠少于其他種類的房源。
- 曼哈頓和布魯克林區(qū)的房源最多
- 曼哈頓與其他區(qū)域的一個顯著區(qū)別是其整租房源比單間房源數量多奕翔,這反映了商業(yè)中心人群的消費習慣和房源條件裕寨。
3 分類特征對其他數字特征的影響
3.1 區(qū)域對其他數字特征的影響
fig2=plt.figure()
ax1=fig2.add_subplot(2,2,1)
ax2=fig2.add_subplot(2,2,2)
ax3=fig2.add_subplot(2,2,3)
ax4=fig2.add_subplot(2,2,4)
sns.violinplot(x='neighbourhood_group',y='availability_365',data=df_filtered,ax=ax1)
sns.violinplot(x='neighbourhood_group',y='number_of_reviews',data=df_filtered[df_filtered.number_of_reviews<100],ax=ax2)
sns.violinplot(x='neighbourhood_group',y='calculated_host_listings_count',data=df_filtered[df_filtered.calculated_host_listings_count<8],ax=ax3)
sns.violinplot(x='neighbourhood_group',y='minimum_nights',data=df_filtered[df_filtered.minimum_nights<60],ax=ax4)
結論:
- availability_365 其值較大表明該房源是出租房,而其值較小則表明房源性質為自住房間派继,只是短暫出租宾袜。一般情況下較少出現值取中間的情況。大多數區(qū)域的分布也確實呈現出兩端分布較多驾窟,中間值較少的情況庆猫。
在布魯克林和曼哈頓區(qū),大部分房源都是自住房間绅络。而斯塔恩區(qū)大部分房源是出租房月培。 - number_of_reviews 在布魯克林和曼哈頓區(qū)主要集中在0-10之間。結合前面章節(jié)得出的各區(qū)域房源數量信息可知恩急,由于這兩個區(qū)域房源較其他區(qū)域更多杉畜,因此評論的分布更平均。而在房源較少的區(qū)域衷恭,如斯塔恩區(qū)此叠,由于市場較小,一部分房源集中了較多數量的評論随珠。
- calculated_host_listings_count 除了從圖中可以看出Brooklyn 和Manhattan 房源較多外灭袁,還可以看出這兩個區(qū)域很多房主擁有多套住房出租。原因是在核心地段窗看,有很多房主擁有大量固定資產茸歧。
df.pivot_table(index='host_id',values='calculated_host_listings_count').calculated_host_listings_count.value_counts()
由上查詢可知,其中最多的一位房主在曼哈頓擁有327套房產出租 - minimum_nights 主要分布集中于0-10天以內显沈,這種情況實際上并未對求租方提出太多時限的要求软瞎,短租即可。但是曼哈頓區(qū)有部分房源分布在30左右,即要求最短租賃一個月铜涉。說明該區(qū)部分房屋有很強的議價權,為賣方市場遂唧。
3.2 房屋類型對其他數字特征的影響
fig3=plt.figure()
ax1=fig3.add_subplot(2,2,1)
ax2=fig3.add_subplot(2,2,2)
ax3=fig3.add_subplot(2,2,3)
ax4=fig3.add_subplot(2,2,4)
sns.violinplot(x='room_type',y='availability_365',data=df_filtered,ax=ax1)
sns.violinplot(x='room_type',y='number_of_reviews',data=df_filtered[df_filtered.number_of_reviews<100],ax=ax2)
sns.violinplot(x='room_type',y='calculated_host_listings_count',data=df_filtered[df_filtered.calculated_host_listings_count<8],ax=ax3)
sns.violinplot(x='room_type',y='minimum_nights',data=df_filtered[df_filtered.minimum_nights<60],ax=ax4)
結論
- availability_365 該項數據中芙代,獨居和整租呈現相似的分布,可預訂時間集中在30以內盖彭。而shared_room(共享寢室)可預訂時間有很大一部分分布在300天左右纹烹。說明這類房間常常是長租的形式,對應的客戶群體的特征是:相比于隱私性召边,他們更在意價格铺呵。
- number_of_reviews 三者的分布沒有明顯差異
- calculated_host_listings_count 在整租房源上集中于1附近,說明這類房主大多數只有一套房源隧熙。而Private_room則相對分散片挂,這是因為這類戶主將一個房間分成很多單間出租,導致其擁有可租房源較多贞盯。
- minimum_nights 主要主要集中在0-10左右音念,30天附近也有集中。對于Private Room 躏敢,其客戶主要是旅游或出差的短租客戶闷愤,因此其0-10的集中較多。Entire room 和 Shared Room 雖然呈現相似的分布(30天附近分布較多)件余,但是推測其原因卻不相同讥脐。整租由于搬入搬出的清潔交接成本較高,限制最小租賃天數有助于減少邊際成本提高利潤率啼器。而Shared Room 類型的房間由于很多是租給在意價格的長租客旬渠,因此很多也限制了最小租賃天數。
4 數字特征之間的影響
num_feature=['price','minimum_nights','number_of_reviews','last_review_to_today','reviews_per_month','calculated_host_listings_count','availability_365']
sns.heatmap(df[num_feature].corr(),annot=True,cmap=sns.diverging_palette(200, 20, as_cmap = True), fmt= '.3f')
plt.xticks(rotation=45)
plt.yticks(rotation=45)
plt.title('Correlation between Number Features')
#annot = True 在熱力圖上顯示值 fmt 格式化值
結論:
- 沒有任何兩個字段是強相關的
- 相關性比較強的字段是last_review_to_today端壳,review_per_month及number_of_reviews坟漱。即,最新評論距今時間越長更哄,則每月評論數越少芋齿,總評論數也越少。
5 位置(經緯度)對各項屬性的的影響
精確位置(經緯度)作為房源的一個特殊重要的屬性成翩,進行單獨的分析
fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
ax4=fig.add_subplot(2,2,4)
df_filtered.plot(kind='scatter',x='longitude',y='latitude',marker='.',c='price',cmap=plt.get_cmap('jet'),colorbar=True,ax=ax1)
df_filtered.query("number_of_reviews<100").plot(kind='scatter',x='longitude',y='latitude',marker='.',c='number_of_reviews',cmap=plt.get_cmap('jet'),colorbar=True,ax=ax2)
df_filtered.query("calculated_host_listings_count<15").plot(kind='scatter',x='longitude',y='latitude',marker='.',c='calculated_host_listings_count',cmap=plt.get_cmap('jet'),colorbar=True,ax=ax3)
df_filtered.query("minimum_nights<90").plot(kind='scatter',x='longitude',y='latitude',marker='.',c='minimum_nights',cmap=plt.get_cmap('jet'),colorbar=True,ax=ax4)
#cmap: 繪圖顏色
#為了避免離群值對分析結果的影響觅捆,因此數據進行了過濾
- 圖一中,暖色代表價格高的區(qū)域麻敌,點的密度表示房源的密度栅炒。曼哈頓區(qū)房價最高,且房源數量最多∮蓿皇后區(qū)和布魯克林區(qū)中乙漓,靠近曼哈頓區(qū)的房價較高,明顯受到了曼哈頓區(qū)的溢出效應释移。而斯坦頓島和布朗克斯區(qū)中叭披,在地區(qū)中心有部分高價的房源,推測是區(qū)域的商業(yè)中心玩讳。
- 圖二中展示了評論數的分布情況涩蜘。與圖一對比可知,在房價高的區(qū)域熏纯,評論數較低同诫。
- 圖三和圖四中calculated_host_listings_count 和Minimum_nights 分布較為松散,沒有明顯規(guī)律樟澜。
6 RFM 模型分析
將每一個戶主作為一個客戶误窖,套用經典的RFM模型進行分析。
host=pd.DataFrame()
host['id']=df.groupby('host_id').last_review_to_today.min().index
#R 最近消費時間秩贰》妨裕可用房主名下所有房源的最新評論時間來近似(消費后才有評論)
host['R']=df.groupby('host_id').last_review_to_today.min().values
#F 消費頻率。如果消費后評論的比率穩(wěn)定萍膛,則該值用每月評論次數來近似
host['F']=df.groupby('host_id').reviews_per_month.sum().values
#M 總消費吭服。對于一個房間,房間單價*最短租賃時間為客單價蝗罗,在乘以總評論數即該房間總消費額艇棕。因此對于一個戶主,其總消費額即為其名下所有房間總消費額的加和串塑。
host['M']=df.groupby('host_id').apply(lambda x: sum(x.price*x.minimum_nights*x.number_of_reviews)).values
#根據最新消費時間沼琉,消費頻率和總消費額將戶主分為8類,分別對應不同的營銷策略桩匪。
#host 列表中新建label 列打瘪,用于儲存客戶類型分類
def label_func(x):
#值越大越好時的判斷邏輯
level=x.apply(lambda x : '1' if x>=0 else '0')
#值越小越好時的判斷邏輯
level_min=x.apply(lambda x : '1' if x<=0 else '0')
label=level_min.R+level.F+level.M
d={'111':'重要價值房主','011':'重要挽留房主','101':'重要保持房主','001':'重要發(fā)展房主','110':'一般價值房主','010':'一般挽留房主','100':'一般保持房主','000':'一般發(fā)展房主'}
return d[label]
host['label']=host[['R','F','M']].apply(lambda x :x- x.mean()).apply(label_func,axis=1)
# 查看各類型戶主貢獻營業(yè)額的比重
plt.rcParams['font.sans-serif']=['SimHei']#中文顯示設置
plt.rcParams['axes.unicode_minus']=True
host.groupby('label').sum().M.plot.pie()
plt.title('Revenue Composition Chart')
從圖中可以看出,在通過AirBnb發(fā)布房源的房主人群中傻昙,為網站創(chuàng)造主要利潤的群體主要分為三類:
一是房源單價高闺骚,出租頻率高且最近有出租行為的‘重要價值房主’
二是房源單價高,最近有出租行為但是房源出租頻率不高的‘重要保持房主’
三是是房源評論或消費頻率很高妆档,然而最近一次房源出租時間已經比較遠的“重要發(fā)展房主”
其中前兩類用戶的營業(yè)額占據AirBnb網站營業(yè)額的68%僻爽。對這兩類用戶,繪制散點圖分析他們房源的最近消費時間和消費頻率
#在列表host中贾惦,增加color列胸梆,存儲他們在圖中的標注顏色
host.color='b'
host.loc[host.label=='重要價值房主','color']='g'
host.loc[host.label=='重要保持房主','color']='r'
#由于離群值偏離正常值較多敦捧,因此做過濾使散點圖更清晰
list1=host.query('R<500&F<50')
list1.plot.scatter('F','R',c=list1.color)
plt.title('Scatter of host category')
plt.xlabel('Frenquency')
plt.ylabel('Recency')
根據對房源發(fā)布者的三個維度進行的分類,有助于網站針對不同類型的房源發(fā)布者制定不同的營銷策略碰镜,鼓勵他們完善自己的房源產品兢卵,增加出租天數,從而為網站縮減營銷成本绪颖,增加利潤秽荤。