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

项目介绍

项目来源:天池大数据平台
项目思路:针对airbnb中listings表做数据处理,探索分析以及针对经纬度以及价格做地理价格图(pyecharts)
python:3.7.1
pyecharts:1.2.0

天池平台的这个比赛比较常见,本文给出了地理可视化的新思路
(想直接看图的可以拉到3/4)

模块导入

分析思路


image.png
#数据处理包导入
import pandas as pd
import numpy as np
from scipy import stats

#画图包导入
import matplotlib.pyplot as plt
import seaborn as sns

#日期处理包导入
import calendar
from datetime import datetime 

#jupyter notebook绘图设置
%matplotlib inline

#中文字体正确显示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

#警告删除
import warnings
warnings.simplefilter(action="ignore", category=FutureWarning)
warnings.filterwarnings('ignore')

#多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

# 显示正负号与中文不显示问题
plt.rcParams['axes.unicode_minus'] = False
sns.set_style('darkgrid', {'font.sans-serif':['SimHei', 'Arial']})

数据处理

导入数据

listings = pd.read_csv('listings.csv',parse_dates=['last_review'],dtype={'id':str,'host_id':str})# keep_default_na=False将空值设置为不显示方便之后处理

处理

listings.info()
image.png
  • 观察发现listings表有几个问题:
  • neighbourhood_group列存在很多空值,查看统计信息
  • neighbourhood列有中文有英文,仅保留neighbourhood列中文部分
  • 查看经纬度,价格,最小入住天数,365天,房东拥有房屋数中是否有异常值
  • 查看房屋类型有多少种
  • 查看评论数前10的id
  • 查看每月评论数前十的id
  • name,last_review和reviews_per_month中都存在空值,不过影响不大,name是因为没有命名标准,last_review为空值有可能说明没有评论过,没有last_review也就没有reviews_per_month
listings.head()
image.png

name虽然杂乱有中英文有英文但是不重要不需要处理,host_name中有错乱的数据比如East Apartments也不重要也不需要怎么处理,neighbourhood_group全为空值可以删除这列,neighbourhood可以截取为全中文列

listings.drop(['neighbourhood_group'],axis=1,inplace=True)
listings['neighbourhood'] = listings['neighbourhood'].str.split('/',expand=True)[0]
listings.sample(3)
image.png
#通过观察,last_review,reviews_per_month和reviews_per_month的空值是一致的
listings[listings['last_review'].isnull()]['number_of_reviews'].sum()
listings[listings['last_review'].isnull()]['reviews_per_month'].sum()

发现结果都是0
说明这些可能都是未评论房屋,将这些数据的reviews_per_month用0代替

listings.reviews_per_month.fillna(0,inplace=True)
listings[(listings['number_of_reviews']==0)].head()
image.png
listings.describe()
image.png

探索性处理

price,minimum_nights,number_of_reviews和calculated_host_listings_count等有异常值

首先看price

#通过直方图直观看出大部分价格在10000以内
listings.price.hist()
image.png
#缩小范围后再次查看直方图
listings_price1000 = listings.loc[listings['price']<1000]
listings_price1000.price.hist()
image.png

发现大部分房屋价格在200到700之间一晚,1000以上的异常值可能较多,比较符合常理,因为airbnb本来的品牌理念就是实现空闲房屋的共享使用,大部分提供的房屋都是普通型,价格过高的不会太多

#异常值查看
listings.loc[listings['price']==68983]
image.png
#异常值查看
listings.loc[listings['price']==0]
image.png

结论是:

  • 价格大部分分布在200-700
  • 异常值类别较多,且异常值和高价房屋不好判断
  • 异常值占比非常少

区域化分析

#区域房屋数量
listings['neighbourhood'].value_counts()
image.png
fig = plt.figure(figsize=(12,4))
sns.barplot(listings['neighbourhood'].value_counts().index,listings['neighbourhood'].value_counts().values,data = listings)
plt.title('区域房屋数量直方图',fontsize=20)
image.png

价格分析

#全北京房屋平均每晚房价是多少
listings.price.mean()  #所有房屋
listings_price1000.price.mean()   #价格小于1000的房屋

611.2033248980739
381.6178138595401

地理位置分析

安装与导入地图包

pip install echarts-countries-pypkg  -i https://mirrors.aliyun.com/pypi/simple# 全球国家地图
pip install echarts-cities-pypkg    -i https://mirrors.aliyun.com/pypi/simple# 全球城市地图
pip install echarts-china-provinces-pypkg  -i https://mirrors.aliyun.com/pypi/simple# 中国省级地图
pip install echarts-china-cities-pypkg  -i https://mirrors.aliyun.com/pypi/simple# 中国市级地图
pip install echarts-china-misc-pypkg -i https://mirrors.aliyun.com/pypi/simple # 中国区域地图
pip install echarts-united-kingdom-pypkg -i https://mirrors.aliyun.com/pypi/simple # 英国选区图可以用来画与政治经济相关的数据

数据预处理

data = pd.DataFrame(listings,columns=['id','price'])
data.head()
image.png
data_pair = []
for i in range(len(listings)):
    data_pair.append((data.iloc[i][0],int(data.iloc[i][1])))  #pyecharts是不支持numpy.int的
#导入地图库
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType
def test_geo():
    city = '北京'
    g = Geo()
    g.add_schema(maptype=city)
    # 定义坐标对应的名称,添加到坐标库中 add_coordinate(name, lng, lat)
    for i in range(len(data_pair)):
        g.add_coordinate(listings['id'][i],listings['longitude'][i],listings['latitude'][i])
    # 定义数据对
    g.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=5)    
    # 设置样式
    g.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    # 自定义分段 color 可以用取色器取色
    pieces = [
        {'max': 100, 'label': '100以下', 'color': '#50A3BA'},
        {'min': 101, 'max': 200, 'label': '100-200', 'color': '#3700A4'},
        {'min': 201, 'max': 300, 'label': '201-300', 'color': '#81AE9F'},
        {'min': 301, 'max': 400, 'label': '301-400', 'color': '#E2C568'},
        {'min': 401, 'max': 500, 'label': '401-500', 'color': '#FCF84D'},
        {'min': 501, 'max': 600, 'label': '501-600', 'color': '#DD0200'},
        {'min': 601, 'max': 700, 'label': '601-700', 'color': '#DD675E'},
        {'min': 701, 'label': '701以上', 'color': '#D94E5D'}  # 有下限无上限
    ]
    #  is_piecewise 是否自定义分段, 变为true 才能生效
    g.set_global_opts(
        visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),
        title_opts=opts.TitleOpts(title="{}-区域房屋以及价格分布".format(city)),
    )
    return g
g = test_geo()
g.render('test_render3.html')
image.png
  • 房源大部分还是密集分布在海淀,朝阳,西城,东城,石景山,丰台区,其他区以靠拢这几个区为主要房源分布地
  • 价格方面,越是密集的地方分布越是均匀,但是延庆怀柔昌平房山等相对来说经济不怎么发达的区域反而价格较高,可能是因为轰趴别墅野营农家乐的兴起,所以一些可供多人居住的"豪宅"数量增多

根据区域的不同类型查看价格分布以及数量分布

全价格分析

listings_gbneigh=listings.groupby(by='neighbourhood')
listings_gbneigh.price.mean().sort_values(ascending=False)
image.png
fig = plt.figure(figsize=(12,6))
sns.barplot(x=listings.neighbourhood,y=listings.price,data=listings,order=listings_gbneigh.price.mean().sort_values(ascending=False).index)
image.png

1000以内价格分析

listings_gbneigh1000=listings_price1000.groupby(by='neighbourhood')
listings_gbneigh1000.price.mean().sort_values(ascending=False)

![image.png](https://upload-images.jianshu.io/upload_images/16489569-b62af7bc4233d5a2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

```python
fig = plt.figure(figsize=(12,6))
sns.barplot(x=listings_price1000.neighbourhood,y=listings_price1000.price,data=listings_price1000,order=listings_gbneigh1000.price.mean().sort_values(ascending=False).index)
image.png
  • 和之前的结论相似,以轰趴别墅为主的郊区房屋每晚价格较高

根据房屋的不同类型查看价格分布以及数量分布

fig,axes = plt.subplots(1,3,figsize=(12,3))
sns.distplot(listings_price1000[listings_price1000.room_type=='Entire home/apt'].price,ax=axes[0],axlabel='Entire home/apt')
sns.distplot(listings_price1000[listings_price1000.room_type=='Private room'].price,ax=axes[1],axlabel='Private room',color='r')
sns.distplot(listings_price1000[listings_price1000.room_type=='Shared room'].price,ax=axes[2],axlabel='Shared room',color='green')
image.png
  • 整套房屋的价格数量分布比较平均,既有平价房也有高价房,且高价房占比不是很低,大部分房屋价格在250-550左右,
  • 而独立房间的价格相对来说较便宜一些,这可能是因为使用率较高的原因,价格大多在150-300之间
  • 而合住房间的价格是三者最平价的,以多人民宿,青年旅舍之类的共享房屋为主,大部分只是一个床铺的价格,价格大多在50-150之间

查看房源数量和房东人数的关系

#以host_id分组
df1=listings.groupby('host_id').count()['id'].to_frame() #以host_id分组,并计算每位房东的房屋数,转换为DT
df1['host_id'] = df1.index #将index转换为列
df1.reset_index(drop=True,inplace=True)
df1.rename(columns={'id':'room_num'},inplace=True)
df1 = pd.DataFrame(df1,columns=['host_id','room_num'])
print('以host_id分组:')
df1.head()
df1.room_num.max() #查看拥有最多房屋的房东的房屋数

以host_id分组:


image.png
#以room_num分组
df2=df1.groupby('room_num').count()['host_id'].to_frame() #以room_num分组,并计算拥有固定房屋数的房东数有多少,转换为DT
df2['room_num']=df2.index
df2.reset_index(drop=True,inplace=True)
df2=pd.DataFrame(df2,columns=['room_num','host_id'])
df2.rename(columns={'host_id':'host_num'},inplace=True)
print('以room_num分组:')
df2.head()
image.png
df2 = df2.sort_values(by='room_num',ascending=False)
df2.reset_index(drop=True,inplace=True)
df2['room_num_all']=df2['room_num']*df2['host_num']
df2['room_percentage'] = df2['room_num_all'].cumsum()/df2['room_num_all'].sum()*100
df2['host_percentage'] = df2['host_num'].cumsum()/df2['host_num'].sum()*100
df2.tail()
image.png
fig = plt.figure(figsize=(8,8))
ax = sns.lineplot(df2.host_percentage,df2.room_percentage)
ax.axvline(x=20,ls="--",c="green")#添加垂直直线
ax.axhline(y=60,ls="--",c="green")#添加垂直直线
ax.set_title(label='房东与房屋数量关系',fontsize=20)
image.png

可看出百分之六十的房源在百分之二十的房东手里

数据分析刚入门,各位巨佬手下留情

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354