美文网首页
Airbnb出租数据探索以及可视化

Airbnb出租数据探索以及可视化

作者: 纯野生程序员 | 来源:发表于2020-04-04 00:27 被阅读0次

解决人们「短期出行的居住、游玩需求」,是爱彼迎核心主营业务。和传统的酒店不同,爱彼迎并不提供房子。这只是一个平台,给用户提供短租房子信息,用户可以在网站或 App 上快速完成订房操作。而且,由于挂在爱彼迎上的房源是个体提供的,和酒店比具有两大优势:便宜、像家一样舒服。但也有两大劣势:服务质量缺乏标准化;沟通成本相对比较高
这边文章主要是针对Airbnb在阿里天池上公开的数据集进行探索,目的是对民宿的区域分布,受欢迎的关键词以及房东的收入预估进行可视化以及分析。

数据集
本次数据来自 Airbnb 于 2019 年 4 月 17 日公开的北京地区数据。数据均来源于 Airbnb 网站的公开信息,不包含任何个人隐私数据。

初探数据
首先导入数据并查看一下数据的基本情况,通过对于数据的描述我们可以发现,除去Id以外总共有15个特征,并且每个特征都有28,452行数,但是对于name/neighbour_group/lastreview以及reviews_per_month存在一定程度的缺失,目前的思路:

  1. 是对于neighbour_group采取整列删除,因为没有任何数据
  2. 对于name列缺失一个数据应该是录入等一些原因,也采取直接删除这一行数据
  3. 对于其他几个特征,通过进一步观察发现,是因为本身总的评论数为0,所以自然就不会有lastreview和reviews_per_month,这里直接放着不做处理


    2.png

    接下来我们对数据特征进行一些简单的处理和描述,我们可以看到neighbour有中文和英文。

1.3.png

因此定义一个方法,直接全部转换为中文,具体代码如下,处理之后,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字段进行同样的处理。

1.6.png

对于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

可以看到个体和小型公司开民宿的收入比较高,大型公司收入最低,当然因为存在极值的影响,大型公司的手下的房子收入不一,被平均了。有机会会进行更加深入分析。

结尾
通过从民宿、房东以及地理位置的角度,我们对于该数据集进行一个初步的探索,可以得到一些有趣的结论,首先多人房间可能是潜在的一个机会点,其次房间名称描述中带有清心、梵文等字眼可能会提高入住率,大概去北京的很多是求佛、求清净。这一点很有意思。最后个人运营的名宿总体收入还不错,建议将民宿放在朝阳区、密云县以及东城区以及地标性建筑故宫等旁边,能加大入住的可能性。

相关文章

  • Airbnb出租数据探索以及可视化

    解决人们「短期出行的居住、游玩需求」,是爱彼迎核心主营业务。和传统的酒店不同,爱彼迎并不提供房子。这只是一个平台,...

  • 天池竞赛airbnb中listings表处理以及画地理图

    项目介绍 项目来源:天池大数据平台项目思路:针对airbnb中listings表做数据处理,探索分析以及针对经纬度...

  • 数据可视化<第一天>

    数据可视化 数据可视化是指通过可视化表示来探索数据,它与数据挖掘紧密相关而数据挖掘指的是使用代码来探索数据集的规律...

  • Python数据可视化day0|安装matplotlib

    数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关联。...

  • python数据可视化

    数据可视化 指的是通过可视化表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关...

  • Python数据可视化

    数据可视化指的是通过可视化数据表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关...

  • python生成数据

    数据可视化指: 数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关。 数据挖掘: 数据挖掘指的是使用代...

  • [Caravel]Airbnb开源数据探查与可视化平台

    Airbnb开源数据探查与可视化平台Caravel - IT经理网http://www.ctocio.com/cc...

  • 数据可视化基础知识

    1. 数据可视化简介 创建图表探索数据并分享结果数据可视化:量化信息的可视化 2. 为何使用数据可视化? 安斯库姆...

  • Superset登录权限自定义开发

    Superset简介 Superset是Airbnb开源的一个数据可视化工具, 可以接入Druid, Presto...

网友评论

      本文标题:Airbnb出租数据探索以及可视化

      本文链接:https://www.haomeiwen.com/subject/xkdlphtx.html