阿里天池: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 日公开的北京地区数据,进行行政区划和短租房类型的维度拆分,对短租房供给、需求等进行探索性分析。
(二)思路:
4.模块导入与数据读取
(一)模块导入
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom pyecharts.charts import Geofrom pyecharts import options as optsfrom pyecharts.charts import Barfrom pyecharts.charts import Linefrom pyecharts.globals import ChartTypefrom 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()) # 计算部分统计数据
如下图,发现有不少记录缺失某些字段的值。
如下图,发现neighbourhood列数据不统一。
因此,对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元以下。
进一步,限定价格区间。
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本来的品牌理念就是实现空闲房屋的共享使用,大部分提供的房屋都是普通型,价格过高的不会太多。
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元的居多。 昌平区,怀柔区,延庆县等非中心片区高价房源占比较多,平价房源比较稀少。
(二)按区域划分
# 各个区域各有多少房源信息neighbourhood_count = listings_df[\'neighbourhood\'].value_counts()# 每种room_type有多少, 共三种房间类型:Entire home/apt, Private room, Shared roomroom_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\')
效果如下
2.2、各区域短租房数量占比
neighbourhood_label = neighbourhood_count.indexneighbourhood_c_max = neighbourhood_count.idxmax()explode = {}for i in neighbourhood_label:if i in neighbourhood_c_max:explode[i] = 0.03else:explode[i] = 0plt.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%。
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中的结论。
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,怀柔区(非中心区域)中房子的数量排整体的第九,但是整租房、独享房和床位房的均价都位列前茅。
(三)按房型划分
3.1 各类型的短租房数量占比
room_type_label = room_type_count.indexplt.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在房源供给上,更倾向于提供中高质量的整租房,而非相对廉价的床位房。
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主打的还是整租房共享。
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采用某些运营方式驱动用户进行评论?
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次左右,该区域房子数量多,价格相对便宜,可能是由于出租次数多或者用户较活跃,后续我们可以对这些房子有针对性地分析,看看有什么指的借鉴的地方。
同理,可以基于房型的维度,查看月评论数。中位数方面,三者较为接近。但是极大值方面,整租房>独享房>床位房。
2)评论内容分析
对中文评论的词频进行统计,我的这篇博客有较详细的介绍,这里就不赘述了。
传送门:https://blog.csdn.net/lam_yx/article/details/107790023.
效果如下,发现 “干净”、“整洁”、“方便”、“热情”等词语出现频率居高。
另外,可以对中文评论内容进行情感分析,情感倾向值取值范围在[0, 1],越接近1表示正面情绪;越接近0表示负面情绪。
在我的这篇博客有较详细的介绍,这里就不赘述了:
传送门: https://blog.csdn.net/lam_yx/article/details/107847264 .
后续待完善