轉摘:https://segmentfault.com/a/1190000015440560segmentfault
1、數據初探網絡
首先導入要使用的科學計算包numpy
,pandas
,可視化matplotlib
,seaborn
,以及機器學習包機器學習
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import matplotlib as mpl 5 6 import matplotlib.pyplot as plt 7 from IPython.display import display 8 plt.style.use("fivethirtyeight") 9 sns.set_style({'font.sans-serif':['simhei','Arial']}) 10 %matplotlib inline 11 12 13 # 檢查Python版本 14 from sys import version_info 15 if version_info.major != 3: 16 raise Exception('請使用Python 3 來完成此項目')
而後導入數據,並進行初步的觀察,這些觀察包括瞭解數據特徵的缺失值,異常值,以及大概的描述性統計。ide
1 # 導入二手房數據 2 lianjia_df = pd.read_csv('lianjia.csv') 3 display(lianjia_df.head(n=2))
初步觀察到一共有11
個特徵變量,Price
在這裏是咱們的目標變量,而後咱們繼續深刻觀察一下。性能
1 # 檢查缺失值狀況 2 lianjia_df.info()
發現了數據集一共有23677
條數據,其中Elevator
特徵有明顯的缺失值。學習
lianjia_df.describe()
上面結果給出了特徵值是數值的一些統計值,包括平均數,標準差,中位數,最小值,最大值,25%分位數,75%分位數。這些統計結果簡單直接,對於初始瞭解一個特徵好壞很是有用,好比咱們觀察到 Size 特徵
的最大值爲1019平米,最小值爲2平米,那麼咱們就要思考這個在實際中是否是存在的,若是不存在沒有意義,那麼這個數據就是一個異常值,會嚴重影響模型的性能。spa
1 # 添加新特徵房屋均價 2 df = lianjia_df.copy() 3 df['PerPrice'] = lianjia_df['Price']/lianjia_df['Size'] 4 5 # 從新擺放列位置 6 columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price'] 7 df = pd.DataFrame(df, columns = columns) 8 9 # 從新審視數據集 10 display(df.head(n=2))
發現 Id
特徵其實沒有什麼實際意義,因此將其移除。因爲房屋單價分析起來比較方便,簡單的使用總價/面積就可獲得,因此增長一個新的特徵 PerPrice
(只用於分析,不是預測特徵)。另外,特徵的順序也被調整了一下,看起code
來比較舒服。blog
2、可視化分析排序
Region特徵分析:對於區域特徵,咱們能夠分析不一樣區域房價和數量的對比。
1 # 對二手房區域分組對比二手房數量和每平米房價 2 df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index() 3 df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index() 4 5 f, [ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,15)) 6 sns.barplot(x='Region', y='PerPrice', palette="Blues_d", data=df_house_mean, ax=ax1) 7 ax1.set_title('北京各大區二手房每平米單價對比',fontsize=15) 8 ax1.set_xlabel('區域') 9 ax1.set_ylabel('每平米單價') 10 11 sns.barplot(x='Region', y='Price', palette="Greens_d", data=df_house_count, ax=ax2) 12 ax2.set_title('北京各大區二手房數量對比',fontsize=15) 13 ax2.set_xlabel('區域') 14 ax2.set_ylabel('數量') 15 16 sns.boxplot(x='Region', y='Price', data=df, ax=ax3) 17 ax3.set_title('北京各大區二手房房屋總價',fontsize=15) 18 ax3.set_xlabel('區域') 19 ax3.set_ylabel('房屋總價') 20 21 plt.show()
使用了pandas
的網絡透視功能 groupby
分組排序。區域特徵可視化直接採用 seaborn
完成,顏色使用調色板 palette
參數,顏色漸變,越淺說明越少,反之越多。
能夠觀察到:
Size特徵分析 :
1 f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5)) 2 # 建房面積的分佈狀況 3 sns.distplot(df['Size'], bins=20, ax=ax1, color='r') 4 sns.kdeplot(df['Size'], shade=True, ax=ax1) 5 # 建房面積和出售價格的關係 6 sns.regplot(x='Size', y='Price', data=df, ax=ax2) 7 plt.show()
Size 分佈:
經過 distplot
和 kdeplot
繪製柱狀圖觀察 Size 特徵的分佈狀況,屬於長尾類型的分佈,這說明了有不少面積很大且超出正常範圍的二手房。
Size 與 Price 的關係:
經過 regplot
繪製了 Size 和 Price 之間的散點圖,發現 Size 特徵基本與Price呈現線性關係,符合基本常識,面積越大,價格越高。可是有兩組明顯的異常點:1. 面積不到10平米,可是價格超出10000萬;2. 一個點面積超過了1000平米,價格很低,須要查看是什麼狀況。
1 df.loc[df['Size']< 10]
df.loc[df['Size']>1000]
經觀察這個異常點不是普通的民用二手房,極可能是商用房,因此纔有1房間0廳確有如此大超過1000平米的面積,這裏選擇移除。
df = df[(df['Layout']!='疊拼別墅')&(df['Size']<1000)]
從新進行可視化發現就沒有明顯的異常點了
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 特徵分析
1 df['Renovation'].value_counts()
精裝 11345
簡裝 8497
其餘 3239
毛坯 576
發現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層的通常都沒有電梯。有了這個標準,那麼剩下的就簡單了。
1 # 因爲存在個別類型錯誤,如簡裝和精裝,特徵值錯位,故須要移除 2 df['Elevator'] = df.loc[(df['Elevator'] == '有電梯')|(df['Elevator'] == '無電梯'), 'Elevator'] 3 4 # 填補Elevator缺失值 5 df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有電梯' 6 df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '無電梯' 7 8 f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10)) 9 sns.countplot(df['Elevator'], ax=ax1) 10 ax1.set_title('有無電梯數量對比',fontsize=15) 11 ax1.set_xlabel('是否有電梯') 12 ax1.set_ylabel('數量') 13 sns.barplot(x='Elevator', y='Price', data=df, ax=ax2) 14 ax2.set_title('有無電梯房價對比',fontsize=15) 15 ax2.set_xlabel('是否有電梯') 16 ax2.set_ylabel('總價') 17 plt.show()
結果觀察到,有電梯的二手房數量居多一些,畢竟高層土地利用率比較高,適合北京龐大的人羣須要,而高層就須要電梯。相應的,有電梯二手房房價較高,由於電梯前期裝修費和後期維護費包含內了(但這個價格比較只是一個平均的概念,好比無電梯的6層豪華小區固然價格更高了)。
Year 特徵分析:
1 grid = sns.FacetGrid(df, row='Elevator', col='Renovation', palette='seismic',size=4) 2 grid.map(plt.scatter, 'Year', 'Price') 3 grid.add_legend()
在Renovation和Elevator的分類條件下,使用 FaceGrid
分析 Year 特徵,觀察結果以下:
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層。固然,正常狀況下中間樓層是比較受歡迎的,價格也高,底層和頂層受歡迎度較低,價格也相對較低。因此樓層是一個很是複雜的特徵,對房價影響也比較大。