kaggle_新加坡爱彼迎租房数据探索
Airbnb是AirBed and Breakfast ( “Air-b-n-b” )的缩写,中文名称之为:空中食宿,是一家联系旅游人士和家有空房出租的服务型网站,可以为用户提供各式各样的住宿信息。
本文针对kaggle上关于爱彼迎在新加坡的一份数据进行探索分析。原notebook学习地址:https://www.kaggle.com/bavalpreet26/singapore-airbnb/notebook
爱彼迎将全球的租房数据进行了收集,并且放在了自己的官网上供参考,官方数据地址:http://insideairbnb.com/get-the-data.html
本文选择的是花园城市-狮城新加坡,是个出国旅游的好去处!
导入库
导入数据分析需要的库:
1 | import pandas as pd |
数据基本信息
导入我们获取到的数据:
查看数据的基本信息:形状shape、字段、缺失值等
1 | # 数据形状 |
具体解释下每个字段的中文含义为:
- id:记录ID
- name:房屋名字
- host_id:房东id
- host_name:房东名字
- neighbourhood:区域
- latitude:纬度
- longitude:经度
- room_type:房间类型
- price:价格
- minimum_nights:预订最低天数
- number_of_reviews:评论数量
- last_reviews:最近一次评论时间
- reviews_per_month:评论数/月
- calculated_host_listings_count:房东拥有的可出租房屋数量
- availability_365:房屋一年内可租天数
通过DataFrame的info属性我们能够查看数据的多个信息:
具体的缺失值情况:
缺失值处理
1、先查看字段的缺失值分布情况:从下面的图形中看出来也是last_review和reviews_per_month字段存在缺失值
1 | sns.set(rc={'figure.figsize':(19.7, 8.27)}) |
2、缺失值的字段(上面的两个)和name字段的两行记录直接删除
最终的数据变成了7905行和14个字段。原始数据是7907行,16个字段属性
数据EDA
EDA全称是:Exploratory Data Analysis,主要是为了探索数据的分布情况
价格price
整体的话,价格还是在1000以下
1 | sns.distplot(df["price"]) # 直方图 |
下面我们看看价格和最低预订天数的关系:
1 | sns.scatterplot( |
通过价格的散点图,也能够观察到主要的价格还是分布在最低预订天数在200以下的房源中
区域
查看房屋的区域(地理为)分布:更多的房子位于Central Region位置。
1 | sns.countplot(df["neighbourhood_group"]) |
上面是从房源的数量上对比每个区域,下面是对比不同
1 | df1 = df[df.price < 250] # 小于250房子较多 |
从箱型图中观察到:Central Region区域的房子
- 房价分布更为宽广
- 房价的均值也高于其他位置
- 价格分布没有比较其他的值,较为合理
上面是从房子的区域来比较,下面可以找找它们的具体经纬度:
1 | plt.figure(figsize=(12,8)) |
房源分布热力图
为了绘制地理位置的热力图,可以学下下这个库:folium
1 | import folium |
房间类型room_type
不同房间类型的占比
统计3种不同房间类型的总数和对应的百分比:
对这3种类型的占比进行可视化对比:
1 | labels = room_df.index |
结论:整租或者公寓方式的房源占比最大,可能更受欢迎。
不同区域的房间类型
1 | plt.figure(figsize=(12,6)) |
对比不同区域位置下的不同类型的房间,我们得到相同的结论:在不同的room_type下,Central Region位置的房间是最多的
个人增加部分:如何使用Plotly来绘制上面的分组状图?
1 | px.bar(type_group, |
房间类型和价格关系
1 | plt.figure(figsize=(12,6)) |
个人增加:使用Plotly绘制版本
房间名称
整体词云图
绘制基于房间名称name的词云图:
1 | from wordcloud import WordCloud, ImageColorGenerator |
- 2BR:2 Bedroom Apartments,两室房
- MRT:Mass Rapid Transit,新加坡的地铁;可能是靠近地铁的房子比较多
名字中的关键词
将名字进行切割后其中的关键词:
1 | # 将数据的名字全部装在列表names中 |
1 | top_20 = result[0:20] # 前20个的高频词语 |
1 | plt.figure(figsize=(10,6)) |
回访量统计
查看哪些房间的回访量较高:
1 | df1 = df.sort_values(by="number_of_reviews",ascending=False).head(1000) |
1 | import folium |
可租天数
在不同经纬度条件下,房子在一年中的可租天数对比:
1 | plt.figure(figsize=(10,6)) |
个人增加部分:使用Plotly如何绘制?
1 | # plotly版本 |
price小于500的房子的分布情况:
1 | # price小于500的数据 |
增加部分:更为简洁的Plotl8y版本
1 | # plotly版本 |
线性回归建模
预处理
基于线性回归的建模方案,先删除无效字段:
1 | df.drop(["name","id","host_name"],inplace=True,axis=1) |
编码类型的转化:
1 | cols = ["neighbourhood_group","neighbourhood","room_type"] |
建模
1 | # 模型实例化 |
测试集验证
1 | title=['Pred vs Actual'] |
个人增加部分:我们对比预测值和真实值,做出二者的差值diff(增加字段)
1 | error_airbnb["diff"] = error_airbnb["Predict"] - error_airbnb["Actual"] |
通过差异值diff的箱型图我们发现:真实值和预测值在有些数据中差别很大。通过下面的descride属性也可以看到:有的居然相差了6820(绝对值),属于异常值的情况;四分之一的中位为-19,差值为19,整体上二者还是较为接近