分析及可視化二手房信息
前言:
房價是關乎我們切身利益的,房價又出現相對大起大落的形勢,處於社會熱點話題。本文通過爬取鏈家中武漢的二手房,並對數據進行可視化分析,帶你一目了然武漢的二手房信息。
1.提出問題:
- 武漢二手房的數量及分布是怎么樣的?
- 各地區房價怎么分布?
- 面積和價格有什么關系?
- 老百姓買二手房會考慮哪些因素?
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`繪制地圖,而 東湖高新區,沌口開發區 並未有詳細經緯度划分,故根據大致地理位置,將其分別歸屬為 洪山區和漢南區 。
處理內容:
- 提取 `floor` 樓層中的數字
- 將房價面積由 “85.99m²”-->“85.99”
- 將東湖高新划分到洪山,沌口開發區划分到漢南
# 提取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²左右就足夠,太大的價格可能很高。裝修純看個人喜好,我個人喜歡自己裝修,自己的風格只有自己懂,別人裝的可能就感覺沒有溫馨的感覺。戶型就選熱門的 兩室兩廳一廚一衛。還有一些其他要注意的地方,比如采光、房齡、交通、環境 等方面。