阿里天池:Airbnb短租房数据集分析

阿里天池:Airbnb短租数据集分析

  • 1.项目介绍
  • 2.字段介绍
  • 3.分析目的和思路
  • 4.模块导入与数据读取
  • 5.探索性分析
    • (一)整体分析
    • (二)按区域划分
    • (三)按房型划分

1.项目介绍

数据来源:https://tianchi.aliyun.com/competition/entrance/231715/information
Python版本:3.7.1
Pycharm版本:社区版2019.2
共享,通过让渡闲置资源的使用权,在有限增加边际成本的前提下,提高了资源利用效率。随着信息的透明化,越来越多的共享发生在陌生人之间。短租,共享空间的一种模式,不论是否体验过入住陌生人的家中,你都可以从短租的数据里挖掘有趣的信息。

2.字段介绍

(一)listings表:数据为短租房源基础信息,包括房源、房东、位置、类型、价格、评论数量和可租时间等等,具体如下。

属性名 含义
id 房间编号
name 房间名称
host_id 房东编号
host_name 房东名称
neighbourhood_group 所属区域组
neighbourhood 行政区划
latitude 纬度
longitude 经度
room_type 房间类型(整套、独立房间、床位)
minimum_nights 最少住几晚
price 价格
number_of_reviews 评论数
last_review 上一次评论
reviews_per_month 平均每月评论数
calculated_host_listings_count 房间数
availability_36 一年内可租用天数

(二)reviews表:数据为短租房源的评论信息,仅包括房源 listing_id和评论日期。

属性名 含义
listing_id 被评论的短租房
date 评论日期

3.分析目的和思路

(一)目的:基于Airbnb 2019 年 4 月 17 日公开的北京地区数据,进行行政区划和短租房类型的维度拆分,对短租房供给、需求等进行探索性分析。
(二)思路
阿里天池:Airbnb短租房数据集分析_第1张图片

4.模块导入与数据读取

(一)模块导入

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts.globals import ChartType
from matplotlib.pyplot import MultipleLocator

(二)数据读取

plt.rc('font', family='SimHei', size='12')
io = 'D:/PythonProject/(天池)短租数据集分析/数据集-汇总版/listings.csv'
# 数据导入
data = pd.read_csv(io)
listings_df = pd.DataFrame(data)

(三)DataFrame相关信息查看

print('记录行数为:{}'.format(len(listings_df)))
print(listings_df.count())        # 统计每一行的非NA单元数
# rint(listings_df.info())         # 列dtype
# print(listings_df.describe())   # 计算部分统计数据

如下图,发现有不少记录缺失某些字段的值。
阿里天池:Airbnb短租房数据集分析_第2张图片
如下图,发现neighbourhood列数据不统一。
阿里天池:Airbnb短租房数据集分析_第3张图片
因此,对DataFrame做如下一些调整。

# 由于neighbourhood_group的值全部一样且都是空值,将此删除
listings_df.drop('neighbourhood_group', axis=1)
# 保留neighbourhood'/'前的数据
listings_df['neighbourhood'] = listings_df['neighbourhood'].str.split('/').str[0]

5.探索性分析

(一)整体分析

1.1、价格分布

listings_df['price'].hist(bins=50, rwidth=0.98, alpha=0.8)
plt.show()

如下图,发现短租房的价格大部分在6000元以下。
阿里天池:Airbnb短租房数据集分析_第4张图片
进一步,限定价格区间。

listings_df_2000 = listings_df.loc[listings_df['price'] < 2000]
listings_df_2000['price'].hist(bins=20, rwidth=0.98, alpha=0.8)
my_x_ticks = np.arange(0, 2000, 100)
plt.xticks(my_x_ticks)
plt.show()

发现大部分房屋价格在100到700之间。因为Airbnb本来的品牌理念就是实现空闲房屋的共享使用,大部分提供的房屋都是普通型,价格过高的不会太多。
阿里天池:Airbnb短租房数据集分析_第5张图片
1.2、地理位置分布
绘制地图的话,可以使用pyecharts库。

# 数据预处理
listings_i_p = pd.DataFrame(listings_df, columns=['id', 'price'])
print(listings_i_p.head())
data_pair = []
for i in range(len(listings_df)):
    data_pair.append((listings_i_p.iloc[i][0], int(listings_i_p.iloc[i][1])))


def get_geo():
    city = '北京'
    geo = Geo()
    geo.add_schema(maptype=city, itemstyle_opts=opts.ItemStyleOpts(color="#eeeeee", border_color="#111"))
    # add_coordinate(点名称,经度,纬度) 在地图上新增坐标点
    for i in range(len(data_pair)):
        geo.add_coordinate(listings_df['id'][i], listings_df['longitude'][i], listings_df['latitude'][i])
    # geo.add()展示坐标点。type_=GeoType.EFFECT_SCATTER 散点图, ChartType.HEATMAP 热力图   symbol="pin" 点形状
    geo.add('', data_pair, type_=ChartType.EFFECT_SCATTER, symbol_size=4)
    geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    # 数据分段
    pieces = [
        {'max': 100, 'label': '100以下', 'color': '#00008B'},
        {'min': 101, 'max': 300, 'label': '100-200', 'color': '#87CEEB'},
        {'min': 301, 'max': 500, 'label': '201-300', 'color': '#9370DB'},
        {'min': 501, 'max': 700, 'label': '301-400', 'color': '#D8BFD8'},
        {'min': 701, 'max': 900, 'label': '401-500', 'color': '#EE82EE'},
        {'min': 901, 'max': 1100, 'label': '501-600', 'color': '#FF00FF'},
        {'min': 1101, 'label': '价格1101以上', 'color': '#FF0000'}
    ]
    # 设置全局配置项
    geo.set_global_opts(
        visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),
        title_opts=opts.TitleOpts(title="北京各区域短租房分布图"))
    return geo
beijing_geo = get_geo()
# 在浏览器中渲染图表
beijing_geo.render('北京各个区域短租房分布图.html')

如下地理位置图所示, 中心地区点的密集程度相对较大,所供给的房子较多,且价格集中在500以下。其中,以100-400元的居多。 昌平区,怀柔区,延庆县等非中心片区高价房源占比较多,平价房源比较稀少。

阿里天池:Airbnb短租房数据集分析_第6张图片

(二)按区域划分

# 各个区域各有多少房源信息
neighbourhood_count = listings_df['neighbourhood'].value_counts()
# 每种room_type有多少, 共三种房间类型:Entire home/apt, Private room, Shared room
room_type_count = listings_df['room_type'].value_counts()

2.1、各区域短租房的数量

listings_df_n_c = listings_df.groupby(['neighbourhood'])['id'].count()
# 各区域短租房的数量柱形图
bar1 = Bar()
# 增加x轴数据
bar1.add_xaxis(listings_df_n_c.index.tolist())
# 增加y轴数据
bar1.add_yaxis('', listings_df_n_c.values.tolist())
# 全局配置设置
bar1.set_global_opts(title_opts=opts.TitleOpts(title="北京各区域短租房的数量分布"),
                     yaxis_opts=opts.AxisOpts(name="数量"),
                     xaxis_opts=opts.AxisOpts(name="区域", axislabel_opts=opts.LabelOpts(font_size=10, interval=0)),
                     visualmap_opts=opts.VisualMapOpts(is_show=True, type_="color",
                                                       max_=max(listings_df_n_c.values.tolist()), pos_left='-20')) 
# 系列配置设置
bar1.set_series_opts(markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="max"),
                                                             opts.MarkPointItem(name="min", type_="min")]),
                     markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(name="average", type_="average")])  # 均值线
                     )
bar1.render('bar1.html')

效果如下
阿里天池:Airbnb短租房数据集分析_第7张图片
2.2、各区域短租房数量占比

neighbourhood_label = neighbourhood_count.index
neighbourhood_c_max = neighbourhood_count.idxmax()
explode = {}
for i in neighbourhood_label:
    if i in neighbourhood_c_max:
        explode[i] = 0.03
    else:
        explode[i] = 0
plt.figure(figsize=(8, 10), dpi=120)
# 绘制饼图
plt.pie(neighbourhood_count, labels=neighbourhood_label, explode=explode.values(), autopct='%.2f%%', startangle=90,
        counterclock=False, colors=sns.color_palette('hls', n_colors=16))
plt.title('短租房分布区域占比图')
plt.show()

占比排名前三的朝阳、东城、海淀区的房源合计约占整体的60%,其中,朝阳区占了总房源数的37%。
阿里天池:Airbnb短租房数据集分析_第8张图片
2.3、各区域的短租房的均价

listings_df_n_m = round(listings_df.groupby(['neighbourhood'])['price'].mean(), 2)
bar2 = Bar()
bar2.add_xaxis(listings_df_n_m.index.tolist())
bar2.add_yaxis('', listings_df_n_m.values.tolist())
bar2.set_global_opts(title_opts=opts.TitleOpts(title="北京各区域短租房的均价"),
                     yaxis_opts=opts.AxisOpts(name="均价"),
                     xaxis_opts=opts.AxisOpts(name="区域", axislabel_opts=opts.LabelOpts(font_size=10, interval=0)),
                     visualmap_opts=opts.VisualMapOpts(is_show=True, type_="color",
                                                       max_=max(listings_df_n_m.values.tolist()),
                                                       pos_left='-20')
                     )
bar2.set_series_opts(markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="max"),
                                                             opts.MarkPointItem(name="min", type_="min")]),
                     markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(name="average", type_="average")]))
bar2.render('bar2.html')

如下图所示,均价排名前5的怀柔、延庆、昌平、平谷和密云区,均价在整体水平760.35以上,且这几个区域均分布于北京的偏北部,不算是中心市区。其中,怀柔区的短租房均价约平均水平的2倍。另外,价格最便宜的是丰台区,地理上处于北京的中心地带。这也大致上验证了1.2中的结论。
阿里天池:Airbnb短租房数据集分析_第9张图片
2.4 / 2.5 各区域各类型短租房的数量/均价
这里在区域维度下,再进行不同房型的划分。

listings_df_nr_c = listings_df.groupby(['neighbourhood', 'room_type']).agg({'id': 'size'})
listings_df_nr_m = listings_df.groupby(['neighbourhood', 'room_type']).agg({'price': np.mean})
listings_df_nr_c_r = listings_df_nr_c.unstack()
listings_df_nr_m_r = listings_df_nr_m.unstack()
# 2.4 各区域各类型短租房的数量
plt.subplot(211)
plt.plot(listings_df_nr_c_r)
plt.legend(loc='best',  labels=['Entire home/apt', 'Private room', 'Shared room'])
plt.title('各区域各类型短租房的数量')
# 2.5 各区域各类型短租房的均价
plt.subplot(212)
plt.plot(listings_df_nr_m_r)
plt.legend(loc='best',  labels=['Entire home/apt', 'Private room', 'Shared room'])
plt.title('各区域各类型短租房的均价')
plt.tight_layout()
plt.show()

如下图所示,整体上来说,在数量上,整租房>独享房>床位房。而在均价方面,差异则较大,其中,朝阳区的三种房型都是最多的,但是价格却是相对低廉。根绝图2.2,怀柔区(非中心区域)中房子的数量排整体的第九,但是整租房、独享房和床位房的均价都位列前茅。
阿里天池:Airbnb短租房数据集分析_第10张图片

(三)按房型划分

3.1 各类型的短租房数量占比

room_type_label = room_type_count.index
plt.figure(figsize=(8, 10), dpi=120)
plt.pie(room_type_count, labels=room_type_label, explode=[0.03, 0.03, 0.03], autopct='%.2f%%', startangle=90,
        counterclock=False, colors=sns.color_palette('hls', n_colors=16))
plt.title('短租房类型占比图')
plt.show()

如下图所示,整租房数量最多,约占整体60%;而床位房仅约占整体6%左右。看得出,Airbnb在房源供给上,更倾向于提供中高质量的整租房,而非相对廉价的床位房。
阿里天池:Airbnb短租房数据集分析_第11张图片
3.2 可租用天数
以20天作为一个区间间隔进行统计。
这里room_type_a_y的数据是另外进行统计的,就不在此赘述了。

# 将可租用的天数划分为如下24个区间。若用value_counts(bin=24)的话,可能显示存在负数和小数
room_type_a_x = ['[0, 25)', '[25, 50)', '[50, 75)', '[75, 100)', '[100, 125)',
                 '[125, 150)', '[150, 175)', '[175, 200)', '[200, 225)', '[225, 250)',
                 '[250, 275)', '[275, 300)', '[300, 325)', '[325, 350)', '[350, 365]']
room_type_a_y = [
     [1498, 366, 731, 2254, 387, 257, 1018, 1424, 80, 137, 219, 240, 328, 1051, 6965],
     [1458, 300, 382, 1654, 92, 150, 474, 937, 34, 90, 209, 143, 161, 437, 3317],
     [237, 36, 32, 248, 11, 8, 50, 174, 1, 10, 23, 4, 14, 50, 761]
]
# 绘制堆叠图
room_type_a_bar = pyec.Bar()
room_type_a_bar.add_xaxis(room_type_a_x)
room_type_a_bar.add_yaxis('Entire home/apt', room_type_a_y[0], stack='stack1')
room_type_a_bar.add_yaxis('Private room', room_type_a_y[1], stack='stack1')
room_type_a_bar.add_yaxis('Shared room', room_type_a_y[2], stack='stack1')
room_type_a_bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                                markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(name="average", type_="average")]))
room_type_a_bar.set_global_opts(title_opts=opts.TitleOpts(title='可租用天数', pos_left='right'),
                    yaxis_opts=opts.AxisOpts(name="短租房数量"),
                    xaxis_opts=opts.AxisOpts(name="租房天数", axislabel_opts=opts.LabelOpts(font_size=10, interval=0)))
room_type_a_bar.render('room_type_a_bar.html')

如下图,整体上来看,接近全年可租用的房子数量是最多的,第二多的是[75,100)天这个区间,第三多的是一个月以下的。且无论在哪个区间,整租房占的数量都是最多的,最少的是床位房。看得出来,无论是面对有短期旅途而租房或者有较长期逗留而租房的客户,airbnb主打的还是整租房共享。
阿里天池:Airbnb短租房数据集分析_第12张图片
3.3 房源热度分析(评论数)
1)月评论量的时间序列
这里使用了reviews.csv的数据。

io2 = 'D:/PythonProject/(天池)短租数据集分析/数据集-汇总版/reviews.csv'
reviews_df = pd.DataFrame(pd.read_csv(io2))
reviews_df['date'] = pd.to_datetime(reviews_df['date'])
# 仅关注年月
reviews_df['date'] = reviews_df['date'].values.astype('datetime64[M]')
reviews_df_ym_r = reviews_df.groupby('date').count()
# 截取2016年之后的数据
reviews_df_ym_r_subset = reviews_df_ym_r['2016-01':]
ax3 = reviews_df_ym_r_subset.plot(marker='o', alpha=0.8, label='评论数')
plt.grid(linestyle='-.')
plt.xlabel("时间")
plt.ylabel("评论数")
plt.show()

发现,月评论总数整体上呈现逐年上升的趋势,但是在每年1~2月有下降的趋势(由于春节原因?)。对于整体的上升,会不会是由于使用Airbnb的用户越来越多?或者是Airbnb采用某些运营方式驱动用户进行评论?
阿里天池:Airbnb短租房数据集分析_第13张图片
2)分区域查看评论热度
基于北京各个区域短租房的月评论数,使用了箱型图和分布散点图进行可视化。

listings_df_n_rpm = listings_df[['neighbourhood', 'reviews_per_month']]
# 绘图
fig1 = plt.figure(figsize=(10, 10))
ax = sns.stripplot(x='neighbourhood', y='reviews_per_month', data=listings_df_n_rpm, jitter=0.1,
              palette=sns.color_palette("plasma_r", n_colors=16), alpha=0.3, size=6)
sns.boxplot(x="neighbourhood", y="reviews_per_month", data=listings_df_n_rpm,
            whis=np.inf, palette="Set3", width=0.5)
y_major_locator = MultipleLocator(1.5)
ax.yaxis.set_major_locator(y_major_locator)
plt.xlabel('区域', fontsize=10)
plt.ylabel('月评论数', fontsize=10)
plt.show()

各个区域短租房的月评论数的中位数基本在[0.5,1.5]的范围内,如果用户是在租完房后才评论,评论数高能否说明租房次数高?在朝阳区、东城区、丰台区和丰城区这些在市中心的房子中,有的月评论次数在20次左右,该区域房子数量多,价格相对便宜,可能是由于出租次数多或者用户较活跃,后续我们可以对这些房子有针对性地分析,看看有什么指的借鉴的地方。
阿里天池:Airbnb短租房数据集分析_第14张图片
同理,可以基于房型的维度,查看月评论数。中位数方面,三者较为接近。但是极大值方面,整租房>独享房>床位房。
阿里天池:Airbnb短租房数据集分析_第15张图片
2)评论内容分析
对中文评论的词频进行统计,我的这篇博客有较详细的介绍,这里就不赘述了。

传送门:https://blog.csdn.net/lam_yx/article/details/107790023.

效果如下,发现 “干净”、“整洁”、“方便”、“热情”等词语出现频率居高。
阿里天池:Airbnb短租房数据集分析_第16张图片
另外,可以对中文评论内容进行情感分析,情感倾向值取值范围在[0, 1],越接近1表示正面情绪;越接近0表示负面情绪。
在我的这篇博客有较详细的介绍,这里就不赘述了:

传送门: https://blog.csdn.net/lam_yx/article/details/107847264 .

阿里天池:Airbnb短租房数据集分析_第17张图片
后续待完善

你可能感兴趣的:(数据分析,数据分析,python,数据可视化,pycharm)