解决人们「短期出行的居住、游玩需求」,是爱彼迎核心主营业务。和传统的酒店不同,爱彼迎并不提供房子。这只是一个平台,给用户提供短租房子信息,用户可以在网站或 App 上快速完成订房操作。而且,由于挂在爱彼迎上的房源是个体提供的,和酒店比具有两大优势:便宜、像家一样舒服。但也有两大劣势:服务质量缺乏标准化;沟通成本相对比较高。
这边文章主要是针对Airbnb在阿里天池上公开的数据集进行探索,目的是对民宿的区域分布,受欢迎的关键词以及房东的收入预估进行可视化以及分析。
数据集
本次数据来自 Airbnb 于 2019 年 4 月 17 日公开的北京地区数据。数据均来源于 Airbnb 网站的公开信息,不包含任何个人隐私数据。
初探数据
首先导入数据并查看一下数据的基本情况,通过对于数据的描述我们可以发现,除去Id以外总共有15个特征,并且每个特征都有28,452行数,但是对于name/neighbour_group/lastreview以及reviews_per_month存在一定程度的缺失,目前的思路:
- 是对于neighbour_group采取整列删除,因为没有任何数据
- 对于name列缺失一个数据应该是录入等一些原因,也采取直接删除这一行数据
-
对于其他几个特征,通过进一步观察发现,是因为本身总的评论数为0,所以自然就不会有lastreview和reviews_per_month,这里直接放着不做处理
2.png
接下来我们对数据特征进行一些简单的处理和描述,我们可以看到neighbour有中文和英文。
因此定义一个方法,直接全部转换为中文,具体代码如下,处理之后,neignhour特征段就会变成只有中文的型式。
#将neighbour处理成只有中文名
a = listing['neighbourhood']
def colum_to_str(data):
neighbourhood = []
a = data.str.findall('\w+').tolist()
for i in a:
neighbourhood.append(i[0])
return neighbourhood
1.4.jpg
最后在这一阶段,我们对连续性字段进行描述性分析:
data.describe()
1.5.png
通过连续型特征观察各个字段的分布,我们可以得出:
1、price价格分布较广,平均为600元左右,中位数为400元左右,但存在极大值的干扰,需要对极大值进行处理后续;
2、minimum_nights存在异常值,这里超过365天就认为是异常值,需要对异常值进行处理后续;
3、availability_365正常,观察得出有接近一半的民宿全年可住的天数为350天;
4、calculated_host_listings存在一些集值,表明一些房主可能是专门做名宿的运营着多套房子;
5、number_of_reviews存在极大值,可能要注意是否存在恶意刷评论的现象;
第一部分 -- 民宿分布分析
这一部分主要是针对民宿的一个分布情况进行分析和可视化描述,来展示北京民宿比较集中的地段以及大致的价格水平。导入专门的绘图文件,并对neighbour字段进行同样的处理。
对于matplotlib或者其他的python画图软件而言,它的原理其实和ps有一点相似,都是画层的一个叠加,对于地理分布也是一样,我们需要先画一个底,然后在底上画出目标的分布。具体的代码实现见下图:
def listing_to_gbd(data):
data['geometry'] = list(zip(data['longitude'],data['latitude']))#zip的作用为打包成为元组的列表,例如zip(a,b),将a、b中第一个元素放到列表中
data['geometry'] = data['geometry'].apply(Point)
data = gpd.GeoDataFrame(data)#转换成geopandas可识别
return data
listing_gbd = listing_to_gbd(listing)
listing_gbd.head()
#计算每个区的房间数量,并从大大小进行排列
neighbourhood_gpd_groupby = listing_gbd[['neighbourhood','id']].groupby('neighbourhood').count().sort_values(by='id',ascending=False).reset_index()
new_neighbourhood = neighbourhood_gpd.merge(neighbourhood_gpd_groupby,on='neighbourhood', how='left')
new_neighbourhood.head(5)
1.7.png
base = new_neighbourhood.plot(column='id',cmap='Oranges',scheme='fisher_jenks', legend=True,edgecolor='white',figsize=(20,20))#画第一层底
listing_gbd.plot(ax=base,color='lightgreen',marker='o',markersize=65,alpha=0.05)#在底上堆叠民宿的地理位置
plt.gca().xaxis.set_major_locator(plt.NullLocator())#去掉X轴
plt.gca().yaxis.set_major_locator(plt.NullLocator())#去掉y轴
1.8.png
因为图上没办法标注(还为探索出)板块的名称,对于北京不是很熟悉,我们画一个饼图来辅助我们看这几个区域分别是哪个区域。
#查看一下哪些区域是超过平均民宿数量的, 用之后做饼图的参数分配
def explode_situtation(data):
explode = {}
for i in range(len(data)):
if data[i]>data.mean():
explode[data.index[i]] = 0.1
else:
explode[data.index[i]] = 0
return explode
explode = list(explode_situtation(listing.neighbourhood.value_counts()).values())
data2 = listing.neighbourhood.value_counts()
label2 = listing.neighbourhood.unique().tolist()
plt.figure(figsize=(20,20))
plt.title('民宿区域分布比例图',fontdict={'fontsize':18})
plt.pie(data2,labels=label2,autopct='%.2f%%',explode=explode,startangle=90,
counterclock=False,textprops={'fontsize':12,'color':'black'},colors=sns.color_palette('hls',n_colors=18))
plt.legend(loc='best',shadow=True,fontsize=11)
1.9.png
综上所诉,我们可以发现:
1、超过60%的名宿集中在朝阳区、密云县以及东城区这三块北京核心区域
2、对于朝阳区、密云县和东城区周边的区域,其民宿分布也靠近这三块区域的边界,特别是西城区和海淀区
3、剩余区域名宿分布相对均匀,没有明显的中心出现
接着我们看一下不同区域的价格情况,具体代码如下:
#查看一下每个区域的价格情况
a = listing[['neighbourhood','price']].groupby(['neighbourhood','price']).count().reset_index()
for i in label2:
plt.hist(a[a['neighbourhood']==i].price)
plt.xlabel(i)
plt.show()
2.0.png
2.1.png
在对价格分析的时候,我们发现有一些民宿的价格是0,显然不是合理,而有一些价格是在1W元以上(好像是有这么贵的民宿吧)。我们对于价格为0的和测试房源(房间名称有测试字眼的)进行删除操作。
drop_index_list = price_is_0.index.tolist()+test_house.index.tolist()
listing_dealt = listing.drop(drop_index_list)
listing_dealt[listing_dealt['price']==0]
#清除完毕
对价格可视化
b = pd.DataFrame(listing_dealt['neighbourhood'].unique(),columns=['区域'])
b['最高价格'] = listing_dealt[['price','neighbourhood']].groupby('neighbourhood').max().price.tolist()
b['最低价格'] = listing_dealt[['price','neighbourhood']].groupby('neighbourhood').min().price.tolist()
b['中位数价格'] = listing_dealt[['price','neighbourhood']].groupby('neighbourhood').median().price.tolist()
b['25%价格位置'] = listing_dealt[['price','neighbourhood']].groupby('neighbourhood').quantile(0.25).price.tolist()
b['75%价格位置'] = listing_dealt[['price','neighbourhood']].groupby('neighbourhood').quantile(0.75).price.tolist()
b['四分卫数'] = np.array(listing_dealt[['price','neighbourhood']].groupby('neighbourhood').quantile(0.75).price.tolist()) - np.array(listing_dealt[['price','neighbourhood']].groupby('neighbourhood').quantile(0.25).price.tolist())
b
2.3.png
得出结论:
1、房山区的民宿价格总的来说最高(899元,比第二名大200元以上)、顺义次之(678元),第三是海淀区(597元),且这三个区域价格分布较广
2、拥有最多民宿的朝阳区、密云县和东城区大部分民宿价格在300到600元之间,这一定程度上解释了该区域民宿数量比较多的原因,区域中心且性价比比较高
3、每个区域的最高价和最低价相差较大,且一些区域的最高价出现超过万元以上,不确定是异常值还是民宿价本身这么高,可能要到大数据集区进一步分析
第二部分 -- 最受欢迎的民宿特点
我们用评价的数量去描述民宿的受欢迎程度,这里将超过90%的民宿的评价数和月平均评价数量的民宿认为是比较受欢迎的民宿。
avg_review = listing_dealt['number_of_reviews'].quantile(0.9)
avg_month_review = listing_dealt['reviews_per_month'].quantile(0.9)
print(avg_review)
print(avg_month_review)
popular_house = listing_dealt[(listing_dealt['number_of_reviews']>avg_review) & (listing_dealt['reviews_per_month']>avg_month_review)]
popular_house.sort_values(by=['number_of_reviews','reviews_per_month'],ascending=False).head(10)
2.4.png
可以得到:
1、最受欢迎的民宿大部分在朝阳区(5家),一部分在东城区(3家),还有一部分在西城区(2家)
2、价格跨度比较大,在87元到899之间;87元是分享房间,899元的是整套
3、前10的受欢迎的民宿中90%都是专业的运营团队,其名下不止一套房子;只有一家是个人运营的,间接说明个人运营的民宿相对来说入住率会比专业团队差一些,可能是推广和运营相关的环节,需要进一步观察一下各个步骤的转换率
4、前10的受欢迎的民宿中有4家整套、4家个单人房间,还有2家多人房,这与之前房子类型的结论基本一致;但同时我们也可以看到多人房也比较受欢迎,这里暂时判断如果要做民宿,可能多人房是一个不错的选择,竞争没有整套出租和单人房来的竞争激烈
接着对受欢迎的房子的名称描述做一个分析,看看哪些关键词能帮助民宿提高入住率:
def jieba_cut(data):
a = []
worddict = {}
with open('chineseStopWords.txt', encoding='gbk') as f:
result=f.read().split()
for i in data:
words = jieba.lcut(i)
word=[x for x in words if x not in result]
a.extend(word)
for word in a:
worddict.setdefault(word,0)
worddict[word]+=1
return worddict
popular_words = jieba_cut(reviews_top90.name.astype('str'))
popular_words
#对popular_words_df中的一些字段进行处理,例如空值和标点符号
def deal_with_meanless_word(data):
mean_words = {}
for i in data.keys():
if len(i) > 1:#认为小于一个长度的字没有意义,最好的情况下是自己定义一个没有意义的列表
mean_words[i] = data[i]
return mean_words
mean_words = deal_with_meanless_word(popular_words)
mean_words_df = pd.Series(mean_words).sort_values(ascending=False)
mean_words_df_top15 = mean_words_df.head(15)
mean_words_df_top15
2.7.png
#接下来画图
plt.figure(figsize=(15,8))
plt.title('最受欢迎的房间中描述关键词')
mean_words_df_top15.plot(kind='bar',ylim=[0,300])
2.9.png
w = WordCloud(scale=4,background_color='white', font_path='msyhbd.ttf',
max_words = 100,max_font_size = 60,random_state=20).generate(resultword)
plt.imshow(w)
2.8.png
通过对关键字的观察可以发现:
1、用户比较关系的关心的首先是交通,接下来是是否靠近北京一些主要的地标附近,例如三里屯、故宫和天安门等
2、出现最多的关键词是花园、禅意、故宫、梵希等,难道来北京旅游住民宿的都是佛系青年?这个有待观察
3、如果房东输入名称时采取上述关键词,应该能获得更好的入住效果
第三部分 -- 房东的收入分析
首先对于房东的类型进行分类,这里根据其名下有多少套民宿去判断其属于的类型,当然也可以采用Kmeans等聚类的方式去进行机器分类,这里就简单一点分类,对于小于5套的是个体,超过5套的是公司,具体又分为小型、中型和大型公司。
listing_dealt.loc[listing_dealt['calculated_host_listings_count']<=5,'renter_type'] = '个体'
listing_dealt.loc[(listing_dealt['calculated_host_listings_count']<=20)&(listing_dealt['calculated_host_listings_count']>5),'renter_type'] = '小型公司'
listing_dealt.loc[(listing_dealt['calculated_host_listings_count']<=100)&(listing_dealt['calculated_host_listings_count']>20),'renter_type'] = '中型公司'
listing_dealt.loc[listing_dealt['calculated_host_listings_count']>100,'renter_type'] = '大型公司'
renter_type = listing_dealt.groupby('renter_type').count().id.sort_values(ascending=False)
renter_type
3.1.png
plt.figure(figsize=(15,8))
plt.bar(x = renter_type.index, height=renter_type.values)
3.2.png
由上图我们可以得出:大部分民宿还是由个体经营,也就是只经营一套民宿,其次是5~20的小型公司,接着是20~100的中型公司,只有极小部分是大型公司100以上。
最后对于每个类型的房东,进行收入的分析:
接下来我看一下每个群体的每个月的大概收入(平均价格乘上每个月的评论数)
avg_price = listing_dealt[['renter_type','price']].groupby('renter_type').mean().reset_index()
avg_rent = listing_dealt[['renter_type','reviews_per_month']].groupby('renter_type').mean().reset_index()
revenue = pd.merge(avg_price,avg_rent, on='renter_type',how='left')
revenue['avg_revenue'] = revenue.price*revenue.reviews_per_month
revenue#可以看到个体和小型公司开民宿的收入比较高,大型公司收入最低,当然因为存在极值的影响,大型公司的手下的房子收入不一,被平均了。
3.6.png
可以看到个体和小型公司开民宿的收入比较高,大型公司收入最低,当然因为存在极值的影响,大型公司的手下的房子收入不一,被平均了。有机会会进行更加深入分析。
结尾
通过从民宿、房东以及地理位置的角度,我们对于该数据集进行一个初步的探索,可以得到一些有趣的结论,首先多人房间可能是潜在的一个机会点,其次房间名称描述中带有清心、梵文等字眼可能会提高入住率,大概去北京的很多是求佛、求清净。这一点很有意思。最后个人运营的名宿总体收入还不错,建议将民宿放在朝阳区、密云县以及东城区以及地标性建筑故宫等旁边,能加大入住的可能性。
网友评论