分析及可视化二手房信息


分析及可视化二手房信息

前言:

房价是关乎我们切身利益的,房价又出现相对大起大落的形势,处于社会热点话题。本文通过爬取链家中武汉的二手房,并对数据进行可视化分析,带你一目了然武汉的二手房信息。

 

1.提出问题:

  1. 武汉二手房的数量及分布是怎么样的?
  2. 各地区房价怎么分布?
  3. 面积和价格有什么关系?
  4. 老百姓买二手房会考虑哪些因素?

2.本中主要涉及的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 类,统计各值出现的次数。

 

3.数据读取与处理

3.1. 数据读取

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

import pandas as pd

df = pd.read_csv('house_info.csv')
df.info()

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

 

3.2. 数据预处理

 1)  缺失值处理:

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

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

 

2) 列处理: 

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

处理内容:

  1. 提取 `floor` 楼层中的数字
  2. 将房价面积由 “85.99m²”-->“85.99
  3. 将东湖高新划分到洪山,沌口开发区划分到汉南
# 提取floor楼层中的数字
df['floor'] = df['floor'].str.extract(r'(\d+)', expand=False).astype('int')
# 将房价面积由“85.99m²”-->“85.99”
df['house_area'] = df['house_area'].apply(lambda x: x[:-1]).astype('float')

# 将东湖高新划分到洪山,沌口开发区划分到汉南
df.loc[df['region'] == '东湖高新', 'region'] = '洪山'
df.loc[df['region'] == '沌口开发区', 'region'] = '汉南'
# 将region列中值后添加“区”,如“汉阳”-->“汉阳区”
df['region'] = df['region'] + ''

 

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

df.describe()

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

4. 武汉各区二手房数量条形图

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

import pyecharts.options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType

region_list = df['region'].value_counts().index.tolist()
house_count_list = df['region'].value_counts().values.tolist()

c = Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK)
c.add_xaxis(region_list)
c.add_yaxis("武汉市", house_count_list)
c.set_global_opts(title_opts=opts.TitleOpts(title="武汉各区二手房数量柱状图", subtitle=""),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(interval=0)))
# c.render("武汉各区二手房数量柱状图.html")
c.render_notebook()

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

5. 武汉市各区房价分布2D地图

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

region_list = df['region'].value_counts().index.tolist()
median_unit_price = []
for region in region_list:
median_unit_price.append(df.loc[df['region'] == region, 'unit_price'].median())

# 绘制2D地图
from pyecharts.charts import Map
# 加载武汉市地图数据
json_data = json.load(open('武汉市.json', encoding='utf-8'))

data_pair = [list(z) for z in zip(region_list, median_unit_price)]

text_style = opts.TextStyleOpts(color='#fff')
c = Map(init_opts=opts.InitOpts(width='1500px', height='700px', bg_color='#404a58'))
c.add_js_funcs("echarts.registerMap('武汉市',{});".format(json_data))
c.add(series_name="武汉市", data_pair=data_pair, maptype="武汉市", label_opts=opts.LabelOpts(color='#fff'))
c.set_global_opts(legend_opts=opts.LegendOpts(textstyle_opts=text_style),
title_opts=opts.TitleOpts(title="武汉", title_textstyle_opts=text_style)
,visualmap_opts=opts.VisualMapOpts(split_number=6, max_=30000, range_text=['高', '低'],
textstyle_opts=text_style))
# c.render("武汉市各区房价分布2D图.html")
c.render_notebook()

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

 

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


由于 `pyecharts` 中的散点图不太方便绘制趋势线,我们直接使用 `seaborn` 来绘制,二手房面积分布及面积与价格的相关性。(不得不说,兼容 `pandas` 是真的方便,很多对数据的处理操作直接在方法内部实现。)

import matplotlib.pyplot as plt
import seaborn as sns

f, [ax1,ax2] = plt.subplots(1, 2, figsize=(16, 6))

# 房屋面积
sns.distplot(df['house_area'], ax=ax1, color='r')
sns.kdeplot(df['house_area'], shade=True, ax=ax1)
ax1.set_xlabel('面积')

# 房屋面积和价格的关系
sns.regplot(x='house_area', y='total_price', data=df, ax=ax2)
ax2.set_xlabel('面积')
ax2.set_ylabel('总价')

plt.show()

 

 

 


二手房面积主要分布在60 - 130m²之间,面积和总价肯定是成正相关的,这个有点常识的人应该都懂吧。我感觉最吸引人的还是面积 400m² ,总价 2000 万的那个点,鹤立鸡群。

 

7.武汉二手房各户型横向条形图

统计户型的种类和各种类的名称,绘制横向条形图。

series = df['house_type'].value_counts()
series.sort_index(ascending=False, inplace=True)
house_type_list = series.index.tolist()
count_list = series.values.tolist()

c = Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
c.add_xaxis(house_type_list)
c.add_yaxis("武汉市", count_list)
c.reversal_axis()
c.set_series_opts(label_opts=opts.LabelOpts(position="right"))
c.set_global_opts(title_opts=opts.TitleOpts(title="武汉二手房各户型横向条形图"),
                datazoom_opts=[opts.DataZoomOpts(yaxis_index=0, type_="slider", orient="vertical")],)
# c.render("武汉二手房各户型横向条形图.html")
c.render_notebook()

 

显示如下:

 

 

 

可以看到主要的房型有 **一室一厅一厨一卫****两室一厅一厨一卫****两室两厅一厨一卫****三室一厅一厨一卫****三室两厅一厨一卫****三室两厅一厨两卫****四室一厅一厨两卫**。其中最多的是 **两室两厅一厨一卫**,这也比较符合大多数人年轻人的要求。大的买不起,小的住不下。

 

8. 武汉二手房房屋装修饼状图

现在看看二手房房屋装修的情况,一般二手房的话猜测毛坯应该不多。看看实际情况如何,统计装修的种类和各种类的数量,绘制饼状图。

decoration_list = df['decoration'].value_counts().index.tolist()
count_list = df['decoration'].value_counts().values.tolist()

from pyecharts.charts import Pie

c = Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
c.add(series_name="房屋装修",
data_pair=[list(z) for z in zip(decoration_list, count_list)],
rosetype="radius",
radius="55%",
center=["50%", "50%"],
label_opts=opts.LabelOpts(is_show=False, position="center"))
c.set_global_opts(title_opts=opts.TitleOpts(
title="武汉二手房房屋装修饼状图",
pos_left="center",
pos_top="20",
title_textstyle_opts=opts.TextStyleOpts(color="#fff")),
legend_opts=opts.LegendOpts(is_show=False))
c.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 255)"))
# c.render("customized_pie.html")
c.render_notebook()

 

 根据图中信息超过一般的二手房是精装,毕竟之前住过人的,再简单装修一下,以更高的价格转手它不香吗?,将近 25% 左右的二手房是简装,剩余少量为其他装修类型和毛坯。毛坯二手房确实数量不多,和预料的差不多。

9. 武汉二手房有无电梯与房价关系图

一般有电梯的楼层都不会低,我所见7,8层楼如果没电梯,业主一般就要骂街了。有电梯的房价一般都要略高于无电梯的,下面我们看看各区二手房有无电梯数量比例,有无电梯的房屋单价有无差距。

根据上图中的信息,各区二手房中有电梯的数量占了绝大多数,除了东西湖区的房价无电梯比有电梯略高外,其余各区的有电梯房价均比无电梯房价要高,其中武昌区差距最明显,这也印证了上面楼层与房价的关系,武昌区由于江景的原因高楼很吃香。

10. 武汉热门二手房标题关键词

现在我们要提取热门二手房中标题的关键词(热门词),首先加载本地停用词。

def load_stopwords(read_path):
'''
读取文件每行内容并保存到列表中 :param read_path: 待读取文件的路径 :return: 保存文件每行信息的列表 ''' result = [] with open(read_path, "r", encoding='utf-8') as f: for line in f.readlines(): line = line.strip('\n') # 去掉列表中每一个元素的换行符 result.append(line) return result # 加载中文停用词 stopwords = load_stopwords('wordcloud_stopwords.txt') ``` 通过 `jieba` 分词获取标题的分词结果,并去除停用词。 ```python import jieba # 添加自定义词典 jieba.load_userdict("自定义词典.txt") token_list = [] # 对标题内容进行分词,并将分词结果保存在列表中 for title in detail_df['title']: tokens = jieba.lcut(title, cut_all=False) token_list += [token for token in tokens if token not in stopwords] len(token_list)

根据分词列表,使用 `Counter` 类统计分词列表中各词的出现次数,选取出现次数最多的前 100 ,绘制词云图。

from pyecharts.charts import WordCloud
from collections import Counter token_count_list = Counter(token_list).most_common(100) new_token_list = [] for token, count in token_count_list: new_token_list.append((token, str(count))) c = WordCloud() c.add(series_name="热词", data_pair=new_token_list, word_size_range=[20, 200]) c.set_global_opts( title_opts=opts.TitleOpts( title="武汉热门二手房标题关键词", title_textstyle_opts=opts.TextStyleOpts(font_size=23) ), tooltip_opts=opts.TooltipOpts(is_show=True), ) c.render("武汉热门二手房标题关键词.html") c.render_notebook()

 

 

 

热门二手房标题中出现较多的词有:电梯,楼层、采光、精装修、户型、满二、交通等。还有一些与位置相关的词汇,可以通过卖家的这些关键词来作为参考,说不定就是我们之后买房需要注意的内容。

11.总结

通过这么多方面的分析,也大致了解了武汉二手房的大致行情,市中心的房价 15000元/m² 起步,外围最低七八千左右。楼层根据自己的需要,如果想看看风景那么高层没毛病,但价格一般较高,如果不差钱武昌区就很香。面积的话,大致100m²左右就足够,太大的价格可能很高。装修纯看个人喜好,我个人喜欢自己装修,自己的风格只有自己懂,别人装的可能就感觉没有温馨的感觉。户型就选热门的 两室两厅一厨一卫。还有一些其他要注意的地方,比如采光、房龄、交通、环境 等方面。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM