分析及可視化二手房信息


分析及可視化二手房信息

前言:

房價是關乎我們切身利益的,房價又出現相對大起大落的形勢,處於社會熱點話題。本文通過爬取鏈家中武漢的二手房,並對數據進行可視化分析,帶你一目了然武漢的二手房信息。

 

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