python數據分析項目:鏈家二手房分析
數據來源:爬蟲獲取
數據內容:北京二手房數據
數據特征:11個特征變量 , 1個目標變量 Price
Direction : 房屋位置所處的方向
District : 房屋位置
Elevator : 電梯
Floor : 樓層
Garden : 小區名字
Id : 房屋編號
Layout:戶型
Price : 價格
Region : 區域
Renovation : 裝修程度
Size : 房屋面積
Year : 房屋年份
1、數據准備
#導入數據包 import numpy as np import pandas as pd #導入畫圖包 import matplotlib.pyplot as plt import missingno as msno import seaborn as sns sns.set() sns.set_style({'font.sans-serif':['simhei','Arial']}) #jupyter notebook繪圖設置 %matplotlib inline %config InlineBack.figure_format="retina" #讀取數據 lianjia_df = pd.read_csv("E:/數據分析/數據分析項目實戰/python分析鏈家二手房數據/lianjia.csv") lianjia_df.head(5)
初步觀察,Elvator字段中存在缺失值。
下一步檢查缺失情況,有兩種方式。
# 檢查缺失值情況 lianjia_df.info()
#可視化查詢缺失值 msno.matrix(lianjia_df,figsize=(12,5))
由此可見,Elvator字段中缺失大量的值。
lianjia_df.describe()
上面結果給出了特征值是數值的一些統計值,包括平均數,標准差,中位數,最小值,最大值,25%分位數,75%分位數。這些統計結果簡單直接,對於初始了解一個特征好壞非常有用,比如我們觀察到 Size 特征 的最大值為1019平米,最小值為2平米,那么我們就要思考這個在實際中是不是存在的,如果不存在沒有意義,那么這個數據就是一個異常值,會嚴重影響模型的性能。
# 添加新字段 # 房屋均價 df = lianjia_df.copy() df["PerPrice"] = lianjia_df["Price"]/lianjia_df["Size"]
#重新擺放列位置 columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price'] df = pd.DataFrame(df,columns = columns) df.head()
這里添加了新的特征 “PerPrice”,特征的順序也進行了調整,Id沒什么分析意義,將其移除。
2、數據分析
# 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() f, [ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,15)) sns.barplot(x='Region', y='PerPrice', palette="Blues_d", data=df_house_mean, ax=ax1) ax1.set_title('北京各大區二手房每平米單價對比',fontsize=15) ax1.set_xlabel('區域') ax1.set_ylabel('每平米單價') sns.barplot(x='Region', y='Price', palette="Greens_d", data=df_house_count, ax=ax2) ax2.set_title('北京各大區二手房數量對比',fontsize=15) ax2.set_xlabel('區域') ax2.set_ylabel('數量') sns.boxplot(x='Region', y='Price', data=df, ax=ax3) ax3.set_title('北京各大區二手房房屋總價',fontsize=15) ax3.set_xlabel('區域') ax3.set_ylabel('房屋總價') plt.show()
可以看出:
- 二手房均價:西城區的房價最貴均價大約11萬/平,因為西城在二環以里,且是熱門學區房的聚集地。其次是東城大約10萬/平,然后是海淀大約8.5萬/平,其它均低於8萬/平。
- 二手房房數量:從數量統計上來看,目前二手房市場上比較火熱的區域。海淀區和朝陽區二手房數量最多,差不多都接近3000套,畢竟大區,需求量也大。然后是豐台區,近幾年正在改造建設,有趕超之勢。
- 二手房總價:通過箱型圖看到,各大區域房屋總價中位數都都在1000萬以下,且房屋總價離散值較高,西城最高達到了6000萬,說明房屋價格特征不是理想的正太分布。
# 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平米,但是價格超出10000萬;2. 一個點面積超過了1000平米,價格很低,需要查看是什么情況。
df.loc[df["Size"]<10]
經過查看發現這組數據是別墅,出現異常的原因是由於別墅結構比較特殊(無朝向無電梯),
字段定義與二手商品房不太一樣導致爬蟲爬取數據錯位。
也因別墅類型二手房不在我們的考慮范圍之內,故將其移除再次觀察Size分布和Price關系。
df.loc[df['Size']>1000]
經觀察這個異常點不是普通的民用二手房,很可能是商用房,所以才有1房間0廳確有如此大超過1000平米的面積,這里選擇移除。
df = df[(df['Layout']!='疊拼別墅')&(df['Size']<1000)] 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()
、
重新進行可視化發現就沒有明顯的異常點了。
#Layout特征分析
f, ax1= plt.subplots(figsize=(20,20)) sns.countplot(y='Layout', data=df, ax=ax1) ax1.set_title('房屋戶型',fontsize=15) ax1.set_xlabel('數量') ax1.set_ylabel('戶型') plt.show()
這個特征真是不看不知道,各種廳室組合搭配,竟然還有9室3廳,4室0廳等奇怪的結構。
其中,2室一廳占絕大部分,其次是3室一廳,2室2廳,3室兩廳。
但是仔細觀察特征分類下有很多不規則的命名,比如2室一廳與2房間1衛,還有別墅,沒有統一的叫法。
這樣的特征肯定是不能作為機器學習模型的數據輸入的,需要使用特征工程進行相應的處理。
#Renovation 特征分析
df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation'] 精裝 11345 簡裝 8497 其他 3239 毛坯 576 南北 20 Name: Renovation, dtype: int64
發現Renovation裝修特征中竟然有南北,它屬於朝向的類型,可能是因為爬蟲過程中一些信息位置為空,導致“Direction”朝向特征出現在這里,所以需要清除或替換掉。
# 去掉錯誤數據“南北”,因為爬蟲過程中一些信息位置為空,導致“Direction”的特征出現在這里,需要清除或替換 df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation'] # 畫幅設置 f, [ax1,ax2,ax3] = plt.subplots(1, 3, figsize=(20, 5)) 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 特征分析
初探數據的時候,我們發現 Elevator 特征是有大量缺失值的,這對於我們是十分不利的,首先我們先看看有多少缺失值:
misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator']) print('Elevator缺失值數量為:'+ str(misn))
Elevator 缺失值數量為:8237
這么多的缺失值怎么辦呢?這個需要根據實際情況考慮,常用的方法有平均值/中位數填補法,直接移除,或者根據其他特征建模預測等。
這里我們考慮填補法,但是有無電梯不是數值,不存在平均值和中位數,怎么填補呢?這里給大家提供一種思路:就是根據樓層 Floor 來判斷有無電梯,一般的樓層大於6的都有電梯,而小於等於6層的一般都沒有電梯。有了這個標准,那么剩下的就簡單了。
# 由於存在個別類型錯誤,如簡裝和精裝,特征值錯位,故需要移除 df['Elevator'] = df.loc[(df['Elevator'] == '有電梯')|(df['Elevator'] == '無電梯'), 'Elevator'] # 填補Elevator缺失值 df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有電梯' df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '無電梯' f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10)) 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的分類條件下,使用 FaceGrid 分析 Year 特征,觀察結果如下:
- 整個二手房房價趨勢是隨着時間增長而增長的;
- 2000年以后建造的二手房房價相較於2000年以前有很明顯的價格上漲;
- 1980年之前幾乎不存在有電梯二手房數據,說明1980年之前還沒有大面積安裝電梯;
- 1980年之前無電梯二手房中,簡裝二手房占絕大多數,精裝反而很少;
#Floor 特征分析
f, ax1= plt.subplots(figsize=(20,5)) sns.countplot(x='Floor', data=df, ax=ax1) ax1.set_title('房屋戶型',fontsize=15) ax1.set_xlabel('數量') ax1.set_ylabel('戶型') plt.show()
可以看到,6層二手房數量最多,但是單獨的樓層特征沒有什么意義,因為每個小區住房的總樓層數都不一樣,我們需要知道樓層的相對意義。
另外,樓層與文化也有很重要聯系,比如中國文化七上八下,七層可能受歡迎,房價也貴,而一般也不會有4層或18層。
當然,正常情況下中間樓層是比較受歡迎的,價格也高,底層和頂層受歡迎度較低,價格也相對較低。
所以樓層是一個非常復雜的特征,對房價影響也比較大。