項目分享目的:在學習完Numpy,Pandas,matplotlib后,熟練運用它們的最好方法就是實踐並總結。在下面的分享中,我會將每一步進行分析與代碼展示,
希望能對大家有所幫助。
項目名稱:鏈家二手房數據分析
項目概述:本項目主要利用上面提到的三個工具進行數據的處理,從不同的維度對北京各區二手房市場情況進行可視化分析,為后續
數據挖掘建模預測房價打好基礎。
數據鏈接:鏈接:https://pan.baidu.com/s/1v7MXARXxFdMmniyW7aNuAA 密碼:kucd
分析步驟:工具庫導入--->數據加載--->數據清洗--->數據可視化分析
導包
# 數據分析三劍客 import numpy as np import seaborn as sns import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt sns.set_style({'font.sans-serif':['simhei','Arial']}) %matplotlib inline
# 設置忽略警告 import warnings warnings.filterwarnings('ignore')
# 設置全局字體 plt.rcParams['font.sans-serif'] = 'Songti SC' plt.rcParams['axes.unicode_minus'] = False
數據載入
lj_data = pd.read_csv('./lianjia.csv') display(lj_data.head(),lj_data.shape)
查看數據概況
display(lj_data.info(),lj_data.describe()) ''' 通過觀察: 1. Elevator列存在嚴重的數據缺失情況 2. Size列最小值為2平米,最大值為1019平米,跟據常識,初步判斷為異常值 '''
添加新屬性房屋均價(PerPrice),並且重新排列列位置
''' 觀察發現: 1. ID屬性對於本次分析沒有什么意義,所以可以將其移除; 2. 由於房屋單價分析起來比較方便,簡單使用總價/面積即可得到,所以增加一列PerPrice(只用於分析,不是預測特征); 3. 原數據屬性的順序比較雜亂,所以可以調整一下。 '''
# 添加 PerPrice(單位均價) 列 df = lj_data.copy() df['PerPrice'] = (lj_data['Price']/lj_data['Size']).round(2) # 重新擺放列位置 columns = ['Region','District','Garden','Layout','Floor','Year','Size','Elevator', 'Direction','Renovation','PerPrice','Price'] df = pd.DataFrame(df,columns = columns) # 重新查看數據集 df.head(3)
數據可視化分析
1. Region特征分析
對於區域特征,我們可以分析不同區域房價和數量的對比
# 對二手房區域分組,對比二手房數量和每平米房價 df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending = False).to_frame().reset_index() df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending = False).to_frame().reset_index() # display(df_house_count.head(2),df_house_mean.head(2))
繪圖
1 # 創建子視圖對象 2 f,[ax1,ax2,ax3] = plt.subplots(3,1,figsize = (20,18)) 3 4 # 設置繪圖參數 5 sns.barplot(x='Region',y='PerPrice',palette='Blues_d',data=df_house_mean,ax=ax1) 6 ax1.set_title('北京各區二手房單位平米價格對比',fontsize=15) 7 ax1.set_xlabel('區域') 8 ax1.set_ylabel('單位平米價格') 9 10 sns.barplot(x='Region',y='Price',palette='Greens_d',data=df_house_count,ax=ax2) 11 ax2.set_title('北京各區二手房數量對比',fontsize=15) 12 ax2.set_xlabel('區域') 13 ax2.set_ylabel('數量') 14 15 sns.boxplot(x='Region',y='Price',data=df,ax=ax3) 16 ax3.set_title('北京各區二手房房屋總價',fontsize=15) 17 ax3.set_xlabel('區域') 18 ax3.set_ylabel('房屋總價') 19 20 # 展示 21 plt.show()
分析報告
可以觀察到:
二手房均價:西城區房價最貴均價大約11萬/平,因為西城在二環以里,且是熱門學區房聚集地。
其次是東城約10萬/平,海淀約8.5萬/平,其他均低於8萬/平。
二手房數量:從數量統計來看,可以看到目前二手房市場比較火熱的區域。海淀和朝陽區二手房數量最多,
差不多都接近3000套。然后是豐台區,近幾年正在改造建設,有趕超之勢。
二手房總價:通過箱型圖看到,各大區房屋總價中位數都在1000萬以下,而且房屋總價離散值較高,
西城最高達到了6000萬,說明房屋價格不是理想的正態分布。
2. Size特征分析
# 創建子視圖 f,[ax1,ax2] = plt.subplots(1,2,figsize=(15,5)) # 房屋面積分布情況 sns.distplot(df['Size'],bins=20,ax=ax1,color='r') sns.kdeplot(df['Size'],shade=True,ax=ax1) # 房屋面積和出售價格的關系 sns.regplot(x='Size',y='Price',data=df,ax=ax2) # 展示 plt.show()
注:下面👇的圖是后面刪除數據后繪制出的結果,這里的代碼繪制出的圖不一樣,請各位留意,無需疑惑,接着往下看即可
分析報告
Size分布:
通過 distplot 和 kdeplot 繪制柱狀圖觀察 Size 特征的分布情況,屬於長尾形的分布,
這說明有很多面積很大且超出正常范圍的二手房。
Size 和 Price 的關系:
通過 regplot 繪制了 Size 和 Price 之間的散點圖,發現 Size 特征基本與 Price 呈線性關系,
符合基本常識,即面積越大,價格越高。但是有兩組明顯的異常點:
1. 面積不到10平米,但是價格超過1000萬;
2. 一個點面積超過了1000平米,但是價格很低。
需要查看是什么情況。
# 查看異常值 cond = df['Size'] < 10 df[cond]
經查看並對比發現這組數據是別墅,出現異常的原因是由於別墅結構比較特殊(無朝向無電梯),字段定義與二手商品房不太一樣, 導致爬蟲爬取數據錯位。
也因為別墅類型二手房不在我們的考慮范圍之內,所以將這些數據移除再次觀察 Size和 Price關系。
cond1 = df['Size'] > 1000 df[cond1]
經觀察發現這個異常點不是普通的民用二手房,很可能是商用寫字樓,所以才有 1房間0廳如此大超過1000平的面積,這里選擇移除。
# 刪除異常數據 df = df[(df['Layout'] != '疊拼別墅') & (df['Size'] < 1000)]
重新可視化后發現基本沒有明顯異常點了(重新可視化后的效果是最開始展示的圖)
Layout特征分析
f,ax = plt.subplots(figsize=(20,20)) sns.countplot(y='Layout',data=df,ax=ax) ax.set_title('房屋戶型',fontsize=15) ax.set_xlabel('數量') ax.set_ylabel('戶型') plt.show()
分析報告
通過觀察才知道有各種廳室組合搭配,居然還有9室3廳,4室0廳的結構。其中2室1廳占絕大部分,其次室3室1廳,2室2廳,3室2廳。
但是經過仔細觀察,特征分類下還有很多不規則的命名,如:2房間1衛,別墅等,沒有統一的叫法。這樣的特征是肯定不能作為機器學習
模型的數據輸入的,需要使用特征工程進行相應的處理。
Renovation特征分析
df['Renovation'].value_counts() ''' 精裝 11345 簡裝 8496 其他 3239 毛坯 576 Name: Renovation, dtype: int64 '''
f,[ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,20)) sns.countplot(df['Renovation'],ax=ax1) sns.barplot(x='Renovation',y='Price',data=df,ax=ax2) sns.boxplot(x='Renovation',y='Price',data=df,ax=ax3) plt.show()
分析報告
觀察到,精裝修的二手房數量最多,簡裝其次,這也符合我們的常識。對於價格來說,毛坯型價格最高,精裝其次。
Elevator特征分析
df.info() ''' <class 'pandas.core.frame.DataFrame'> Int64Index: 23656 entries, 0 to 23676 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Region 23656 non-null object 1 District 23656 non-null object 2 Garden 23656 non-null object 3 Layout 23656 non-null object 4 Floor 23656 non-null int64 5 Year 23656 non-null int64 6 Size 23656 non-null float64 7 Elevator 15419 non-null object 8 Direction 23656 non-null object 9 Renovation 23656 non-null object 10 PerPrice 23656 non-null float64 11 Price 23656 non-null float64 dtypes: float64(3), int64(2), object(7) memory usage: 3.0+ MB '''
發現存在空值
處理辦法:
1. 刪除空值
2. 插值:平均值/中位數/線性插值/拉格朗日插值等
插值思路:根據樓層 Floor判斷有無電梯。6層以上都有電梯,6層及以下無電梯(其實也有缺陷,Floor表示的是 房屋所在樓層,並不代表樓的總層數)
cond = (df['Floor'] > 6) & (df['Elevator'].isnull()) cond1 = (df['Floor'] <= 6) & (df['Elevator'].isnull()) df['Elevator'][cond] = '有電梯' df['Elevator'][cond1] = '無電梯' df.info()
# 創建子視圖 f,[ax1,ax2] = plt.subplots(1,2,figsize=(20,5)) sns.countplot(df['Elevator'],ax=ax1) ax1.set_title('有無電梯數量對比',fontsize=15) ax1.set_xlabel('是否有電梯') ax1.set_ylabel('數量') sns.barplot(x='Elevator',y='Price',data=df,ax=ax2) ax2.set_title('有無電梯房價對比',fontsize=15) ax2.set_xlabel('是否有電梯') ax2.set_ylabel('總價') plt.show()
分析報告
根據結果觀察到,有電梯的二手房數量居多一些,畢竟在北京,人口數量龐大,高層對於土地的利用率高,高層自然也會配置電梯。相應的,電梯二手房價格較高,
因為電梯前期安裝費和后期維修費已經包含在內(這個價格比較只是一個平均的概念,比如無電梯的6層豪華小區當然價格更高)。
Year特征分析
grid = sns.FacetGrid(df,row='Elevator',col='Renovation',palette='seismic',size=4) grid.map(plt.scatter,'Year','Price') grid.add_legend()
分析報告
在 Renovation和 Elevator的分類條件下,使用 FacetGrid 分析 Year特征,觀察結果如下:
1. 整個二手房房價趨勢隨着時間增長而增長;
2. 2000年后建造的房屋二手房房價相較於2000年以前有很明顯的價格上漲;
3. 1980年之前幾乎不存在有電梯的二手房數據,說明1980年以前還沒有大量安裝電梯;
4. 1980年之前的無電梯二手房中,簡裝占大多數,精裝反而很少。
Floor特征分析
# 創建子視圖 f,ax = plt.subplots(figsize=(20,5)) sns.countplot(df['Floor'],ax=ax) ax.set_title('房屋樓層',fontsize=15) ax.set_xlabel('樓層') ax.set_ylabel('數量') plt.show()
分析報告
可以看到,6層二手房數量最多,但單獨的樓層特征沒什么意義,因為每個小區的住房總樓層不一樣,我們需要知道樓層的相對意義。 另外,樓層與文化也有很重要的聯系。
比如中國常說七上八下,七層可能更受歡迎,房價也貴,而一般不會有4層或18層。當然正常 情況下中間樓層是比較受歡迎的,價格相對較高,底層和頂層受歡迎度較低,
價格也相對較低。所以樓層是一個非常復雜的特征,對房價影響也比較大。