当前位置:   article > 正文

12张图,二手房数据分析及可视化_出租房屋数量条形统计图

出租房屋数量条形统计图

写在前面

本文用到的数据是之前在链家爬取的武汉二手房信息。这次我们来挖掘一下数据背后的秘密…

文中主要涉及的Python库

  • pandas:读取 csv 文件中的内容,并对数据进行处理。
  • matplotlib:它是基于 numpy 的一套 Python 工具包。这个包提供了丰富的数据绘图工具,主要用于绘制一些统计图形。
  • seaborn: seaborn 是基于 matplotlib 的图形可视化 python 包。是在 matplotlib 的基础上进行了更高级的 API 封装,使作图更加容易,相比于 matplotlib 中的一些图用 seaborn 做会更具有吸引力,但特色方面(绘图细节)不及 matplotlib 。一般将 seaborn 视为 matplotlib 的补充,而不是替代物。同时它能高度兼容 numpy 与 pandas 数据结构以及 scipy 与 statsmodels 等统计模式(后文中会体会到兼容 pandas 的好处的)。
  • pyecharts: pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。一般用它来绘制动态图,可视化效果非常好。
  • jieba:一款非常流行的中文分词包。主要有三种分词模式全模式、精确模式(本文使用)、搜索引擎模式。在分词前可以添加自定义词典来提升分词的准确率。
  • collections:主要使用 Counter 类,统计各值出现的次数。

话不多说,进入正题。

1.数据读取

首先读取 house_info.csv 文件,并查看数据集的结构信息。

  1. import pandas as pd
  2. df = pd.read_csv('house_info.csv')
  3. df.info()


根据上面的信息可以知道,数据集共 27 列,house_label 列中有较多的缺失值, floor 列和 house_area 的类型为 object 应将转成数值类型。

2.数据预处理

2.1缺失值处理

首先删除包含缺失值的行。删除后数据行数为 5108 行。

  1. df.dropna(inplace=True)
  2. df.reset_index(drop=True, inplace=True)

2.2列处理

由于后面需要通过 pyecharts 绘制地图,而 东湖高新区,沌口开发区 并未有详细经纬度划分,故根据大致地理位置,将其分别归属为 洪山区和汉南区 。

处理内容

  • 提取 floor 楼层中的数字
  • 将房价面积由 “85.99m²”–>“85.99”
  • 将东湖高新划分到洪山,沌口开发区划分到汉南
  1. # 提取floor楼层中的数字
  2. df['floor'] = df['floor'].str.extract(r'(\d+)', expand=False).astype('int')
  3. # 将房价面积由“85.99m²”-->85.99
  4. df['house_area'] = df['house_area'].apply(lambda x: x[:-1]).astype('float')
  5. # 将东湖高新划分到洪山,沌口开发区划分到汉南
  6. df.loc[df['region'] == '东湖高新', 'region'] = '洪山'
  7. df.loc[df['region'] == '沌口开发区', 'region'] = '汉南'
  8. # 将region列中值后添加“区”,如“汉阳”-->“汉阳区”
  9. df['region'] = df['region'] + '区'

通过 describe() 函数查看数值列的属性描述。如果查看全部列可以将参数 include 指定为 all (默认为 None )。

df.describe()


图中显示武汉二手房平均关注人数为 17 人,平均总价 184 万,平均单价 19364 元/m²,平均楼层 22 层,平均房屋面积 95 m²。另还有标准差、最小值、四分之一分位数、二分之一分位数、四分之三分位数、最大值等信息。

3.各区二手房数量条形图

获取数据中各区信息和对应区的房屋数量,绘制条形图。

  1. import pyecharts.options as opts
  2. from pyecharts.charts import Bar
  3. from pyecharts.globals import ThemeType
  4. region_list = df['region'].value_counts().index.tolist()
  5. house_count_list = df['region'].value_counts().values.tolist()
  6. c = Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK)
  7. c.add_xaxis(region_list)
  8. c.add_yaxis("武汉市", house_count_list)
  9. c.set_global_opts(title_opts=opts.TitleOpts(title="武汉各区二手房数量柱状图", subtitle=""),
  10. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(interval=0)))
  11. # c.render("武汉各区二手房数量柱状图.html")
  12. c.render_notebook()


尽管洪山区是将东湖高新区合并后统计的,但合并前二者二手房数量同样很多,其次为江岸区,江景独美。下面我们通过 2D地图 和 3D地图 的形式看各区房价在地图上的分布。

4.各区房价分布2D地图

统计各区名称及对应的单价中位数(中位数受极值的影响很小)。加载本地的武汉市地图数据(各区经纬度信息)。绘制房价分布 2D 地图。

  1. region_list = df['region'].value_counts().index.tolist()
  2. median_unit_price = []
  3. for region in region_list:
  4. median_unit_price.append(df.loc[df['region'] == region, 'unit_price'].median())
  5. # 绘制2D地图
  6. from pyecharts.charts import Map
  7. # 加载武汉市地图数据
  8. json_data = json.load(open('武汉市.json', encoding='utf-8'))
  9. data_pair = [list(z) for z in zip(region_list, median_unit_price)]
  10. text_style = opts.TextStyleOpts(color='#fff')
  11. c = Map(init_opts=opts.InitOpts(width='1500px', height='700px', bg_color='#404a58'))
  12. c.add_js_funcs("echarts.registerMap('武汉市',{});".format(json_data))
  13. c.add(series_name="武汉市", data_pair=data_pair, maptype="武汉市", label_opts=opts.LabelOpts(color='#fff'))
  14. c.set_global_opts(legend_opts=opts.LegendOpts(textstyle_opts=text_style),
  15. title_opts=opts.TitleOpts(title="武汉", title_textstyle_opts=text_style)
  16. ,visualmap_opts=opts.VisualMapOpts(split_number=6, max_=30000, range_text=['高', '低'],
  17. textstyle_opts=text_style))
  18. # c.render("武汉市各区房价分布2D图.html")
  19. c.render_notebook()

根据地图的信息,房价较高的区域集中在武汉市中心区域,以武昌区为首房价单价为 24600 元/m²。其余中心城市房价也均在 15000 元/m²以上。最低房价为新洲区,房价中位数为 7806 元/m²。下面通过3D地图来观察一下。

5.各区房价分布3D地图

所需要的数据与2D地图相同,代码较多这里就不在这里展示了(需要的朋友在文末获取)。


相比于2D,3D图中的各区房价差异会更加明显。看着也比较 NB!!
接下来通过箱型图详细看一下各区单价的异常值。

6.各区二手房单价箱型图

统计各区名称信息及对应单价信息,并绘制箱型图。

  1. # 统计各个区二手房单价信息
  2. unit_price_list = []
  3. for region in region_list:
  4. unit_price_list.append(df.loc[df['region'] == region, 'unit_price'].values.tolist())
  5. # 绘制箱型图
  6. from pyecharts.charts import Boxplot
  7. c = Boxplot(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
  8. c.add_xaxis(region_list)
  9. c.add_yaxis("武汉市", c.prepare_data(unit_price_list))
  10. c.set_global_opts(title_opts=opts.TitleOpts(title="武汉各区二手房总价箱型图"),
  11. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(interval=0)))
  12. # c.render("boxplot_base.html")
  13. c.render_notebook()


pyecharts 中的箱型图的上下边界为最大值最小值,与标准箱型图中的最大观察值,最小观察值不同。我们根据上四分位数和下四分位数的分布,可以看出洪山区、江岸区、武昌区这些房价较高的区域成典型的 右偏态 (异常值集中在较大值的一侧,尾部很长)。这说明很多二手房的价格可能因为地段,装修等原因,单价严重偏离当地房价平均水平。

7.二手房面积分布与价格关系图

由于 pyecharts 中的散点图不太方便绘制趋势线,我们直接使用 seaborn 来绘制,二手房面积分布及面积与价格的相关性。

  1. import matplotlib.pyplot as plt
  2. import seaborn as sns
  3. f, [ax1,ax2] = plt.subplots(1, 2, figsize=(16, 6))
  4. # 房屋面积
  5. sns.distplot(df['house_area'], ax=ax1, color='r')
  6. sns.kdeplot(df['house_area'], shade=True, ax=ax1)
  7. ax1.set_xlabel('面积')
  8. # 房屋面积和价格的关系
  9. sns.regplot(x='house_area', y='total_price', data=df, ax=ax2)
  10. ax2.set_xlabel('面积')
  11. ax2.set_ylabel('总价')
  12. plt.show()


二手房面积主要分布在60 - 130m²之间。最吸引人的还是面积 400m² ,总价 2000 万的那个点,鹤立鸡群。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/760903
推荐阅读
相关标签