方法框架:框架
理解問題:查看每一個變量而且根據他們的意義和對問題的重要性進行哲學分析。函數
單因素研究:只關注因變量( SalePrice),而且進行更深刻的瞭解。ui
多因素研究:分析因變量和自變量之間的關係。spa
基礎清洗:清洗數據集而且對缺失數據,異常值和分類數據進行一些處理。.net
檢驗假設:檢查數據是否和多元分析方法的假設達到一致。3d
介紹:箱線圖code
ErrorBar(偏差棒圖)orm
是統計學中經常使用的圖形。ErrorBar圖涉及到數據的「平均值」和「標準差」。blog
下面舉例子理解偏差棒圖中涉及到的「平均值」和「標準差」。進程
某地降雨量的偏差棒圖[1]如圖1所示,從橫縱1月份的刻度值往正上查找時,可發現1月份的降雨量對應於一個「工」字型的圖案。該「工」字型的圖案的中間的點對應的縱軸的刻度值(大約12),表示該地1月份的降雨量的「平均值」,大約12cm。而「工」字型圖案的上橫線或下橫線所對應的縱軸的刻度值到中間點(即均值)的差值大約爲0.5,表示該地1月份的降雨量的「標準差」大約爲0.5cm。
最重要的事情——分析「房價」描述性數據總結:df_train['SalePrice'].describe()
直方圖
sns.distplot(df_train['SalePrice']);
從直方圖中能夠看出:
·偏離正態分佈
·數據正偏
·有峯值
相關變量分析:
1.散點圖:數字型變量間的關係
1.‘Grlivarea’ 與 ‘SalePrice’ 散點圖
var = 'GrLivArea' data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1) data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));
能夠看出’’SalePrice’和’'GrLivArea' 關係很密切,而且基本呈線性關係。
2.‘TotalBsmtSF’ 與 ‘SalePrice’散點圖
var = 'TotalBsmtSF' data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1) data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));
TotalBsmtSF' 和 'SalePrice'關係也很密切,從圖中能夠看出基本呈指數分佈,但從最左側的點能夠看出特定狀況下’TotalBsmtSF' 對'SalePrice' 沒有產生影響。
2.箱型圖:與類別型變量的關係
1.‘OverallQual’與‘SalePrice’箱型圖
var = 'OverallQual' data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1) f, ax = plt.subplots(figsize=(8, 6)) fig = sns.boxplot(x=var, y="SalePrice", data=data) fig.axis(ymin=0, ymax=800000);
能夠看出’SalePrice' 與 'OverallQual'分佈趨勢相同。
2.‘YearBuilt’與‘SalePrice’箱型圖
var = 'YearBuilt' data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1) f, ax = plt.subplots(figsize=(16, 8)) fig = sns.boxplot(x=var, y="SalePrice", data=data) fig.axis(ymin=0, ymax=800000);plt.xticks(rotation=90);
兩個變量之間的關係沒有很強的趨勢性,可是能夠看出建築時間較短的房屋價格更高。
總結:
'GrLivArea' 和 'TotalBsmtSF' 與 'SalePrice'彷佛線性相關,而且都是正相關。 對於 'TotalBsmtSF',線性關係的斜率十分的高。
·'OverallQual' 和 'YearBuilt' 與 'SalePrice'也有關係。'OverallQual'的相關性更強, 箱型圖顯示了隨着總體質量的增加,房價的增加趨勢。
3.相關係數矩陣
1.「客觀分析」
觀察哪些變量會和預測目標關係比較大,哪些變量之間會有較強的關聯
corrmat = df_train.corr() f, ax = plt.subplots(figsize=(12, 9)) sns.heatmap(corrmat, vmax=.8, square=True);
首先兩個紅色的方塊吸引到了我,第一個是'TotalBsmtSF' 和'1stFlrSF' 變量的相關係數,第二個是 'GarageX' 變量羣。這兩個示例都顯示了這些變量之間很強的相關性。實際上,相關性的程度達到了一種多重共線性的狀況。咱們能夠總結出這些變量幾乎包含相同的信息,因此確實出現了多重共線性。
另外一個引發注意的地方是 'SalePrice' 的相關性。咱們能夠看到咱們以前分析的 'GrLivArea','TotalBsmtSF',和 'OverallQual'的相關性很強,除此以外也有不少其餘的變量應該進行考慮,這也是咱們下一步的內容。
2.'SalePrice' 相關係數矩陣 特徵選擇
k = 10 #number ofvariables for heatmap cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index cm = np.corrcoef(df_train[cols].values.T) sns.set(font_scale=1.25) hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values) plt.show()
從圖中能夠看出:
·'OverallQual', 'GrLivArea' 以及 'TotalBsmtSF' 與 'SalePrice'有很強的相關性。
·'GarageCars' 和 'GarageArea' 也是相關性比較強的變量. 車庫中存儲的車的數量是由車庫的面積決定的,它們就像雙胞胎,因此不須要專門區分'GarageCars' 和 'GarageArea' ,因此咱們只須要其中的一個變量。這裏咱們選擇了'GarageCars'由於它與'SalePrice' 的相關性更高一些
·'TotalBsmtSF' 和 '1stFloor' 與上述狀況相同,咱們選擇 'TotalBsmtSF' 。
·'FullBath'幾乎不須要考慮。
·'TotRmsAbvGrd' 和 'GrLivArea'也是變量中的雙胞胎。
·'YearBuilt' 和 'SalePrice'相關性彷佛不強。
4 「缺失數據」
關於缺失數據須要思考的重要問題
·這一缺失數據的廣泛性如何?
·缺失數據是隨機的仍是有律可循?
這些問題的答案是很重要的,由於缺失數據意味着樣本大小的縮減,這會阻止咱們的分析進程。除此以外,以實質性的角度來講,咱們須要保證對缺失數據的處理不會出現偏離或隱藏任何難以忽視的真相。
total= df_train.isnull().sum().sort_values(ascending=False) percent = (df_train.isnull().sum()/df_train.isnull().count()).sort_values(ascending=False) missing_data = pd.concat([total, percent], axis=1, keys=['Total','Percent']) missing_data.head(20)
當超過15%的數據都缺失的時候,咱們應該刪掉相關變量且假設該變量並不存在。
根據這一條,一系列變量都應該刪掉,例如'PoolQC', 'MiscFeature', 'Alley'等等,這些變量都不是很重要,由於他們基本都不是咱們買房子時會考慮的因素。
'GarageX' 變量羣的缺失數據量都相同,因爲關於車庫的最重要的信息均可以由'GarageCars' 表達,而且這些數據只佔缺失數據的5%,咱們也會刪除上述的'GarageX' 變量羣。一樣的邏輯也適用於 'BsmtX' 變量羣。
對於 'MasVnrArea' 和 'MasVnrType',咱們能夠認爲這些因素並不重要。除此以外,他們和'YearBuilt' 以及 'OverallQual'都有很強的關聯性,而這兩個變量咱們已經考慮過了。因此刪除 'MasVnrArea'和 'MasVnrType'並不會丟失信息。
最後,因爲'Electrical'中只有一個缺失的觀察值,因此咱們刪除這個觀察值,可是保留這一變量。
此外,咱們還能夠經過補充缺失值,經過實際變量的含義進行補充,例如類別型變量,就能夠補充成 No,數值型變量能夠補充成 0,或者用平均值來填充。
5.離羣點
單因素分析
這裏的關鍵在於如何創建閾值,定義一個觀察值爲異常值。咱們對數據進行正態化,意味着把數據值轉換成均值爲0,方差爲1的數據。
saleprice_scaled= StandardScaler().fit_transform(df_train['SalePrice'][:,np.newaxis]); low_range = saleprice_scaled[saleprice_scaled[:,0].argsort()][:10] high_range= saleprice_scaled[saleprice_scaled[:,0].argsort()][-10:] print('outer range (low) of the distribution:') print(low_range) print('nouter range (high) of thedistribution:') print(high_range)
進行正態化後,能夠看出:
·低範圍的值都比較類似而且在0附近分佈。
·高範圍的值離0很遠,而且七點幾的值遠在正常範圍以外。
雙因素分析
1. 'GrLivArea'和'SalePrice'雙因素分析
var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));
從圖中能夠看出:
·有兩個離羣的'GrLivArea' 值很高的數據,咱們能夠推測出現這種狀況的緣由。或許他們表明了農業地區,也就解釋了低價。 這兩個點很明顯不能表明典型樣例,因此咱們將它們定義爲異常值並刪除。
·圖中頂部的兩個點是七點幾的觀測值,他們雖然看起來像特殊狀況,可是他們依然符合總體趨勢,因此咱們將其保留下來。
刪除點
df_train.sort_values(by = 'GrLivArea',ascending = False)[:2]
df_train = df_train.drop(df_train[df_train['Id'] == 1299].index)
df_train = df_train.drop(df_train[df_train['Id'] == 524].index)
2. 'TotalBsmtSF'和'SalePrice'雙因素分析
var = 'TotalBsmtSF'
data = pd.concat([df_train['SalePrice'],df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice',ylim=(0,800000));
核心部分
「房價」 究竟是誰?
這個問題的答案,須要咱們驗證根據數據基礎進行多元分析的假設。
咱們已經進行了數據清洗,而且發現了 SalePrice 的不少信息,如今咱們要更進一步理解 SalePrice 如何遵循統計假設,可讓咱們應用多元技術。
應該測量 4 個假設量:
正態性
同方差性
線性
相關錯誤缺失
正態性:
應主要關注如下兩點:
直方圖 – 峯度和偏度。
正態機率圖 – 數據分佈應緊密跟隨表明正態分佈的對角線。
以後內容請看頂部連接