數據分析項目之:鏈家二手房數據分析


項目分享目的:在學習完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層。當然正常 情況下中間樓層是比較受歡迎的,價格相對較高,底層和頂層受歡迎度較低,

  價格也相對較低。所以樓層是一個非常復雜的特征,對房價影響也比較大。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM