【轉】數據分析
詳解 Kaggle 房價預測競賽優勝方案:用 Python 進行全面數據探索
方法框架:
理解問題:查看每個變量並且根據他們的意義和對問題的重要性進行哲學分析。
單因素研究:只關註因變量( SalePrice),並且進行更深入的了解。
多因素研究:分析因變量和自變量之間的關系。
基礎清洗:清洗數據集並且對缺失數據,異常值和分類數據進行一些處理。
檢驗假設:檢查數據是否和多元分析方法的假設達到一致。
介紹:箱線圖
數據異常值
箱形圖為我們提供了識別異常值的一個標準:異常值被定義為小於Q1-1.5IQR或大於Q3+1.5IQR的值。 眾所周知,基於正態分布的3σ法則或z分數方法是以假定數據服從正態分布為前提的,但實際數據往往並不嚴格服從正態分布。它們判斷異常值的標準是以計算數據批的均值和標準差為基礎的,而均值和標準差的耐抗性極小,異常值本身會對它們產生較大影響,這樣產生的異常值個數不會多於總數0.7%。顯然,應用這種方法於非正態分布數據中判斷異常值,其有效性是有限的。 箱形圖的繪制依靠實際數據,不需要事先假定數據服從特定的分布形式,沒有對數據作任何限制性要求,它只是真實直觀地表現數據形狀的本來面貌;另一方面,箱形圖判斷異常值的標準以四分位數和四分位距為基礎,四分位數具有一定的耐抗性,多達25%的數據可以變得任意遠而不會很大地擾動四分位數,所以異常值不能對這個標準施加影響,箱形圖識別異常值的結果比較客觀。由此可見,箱形圖在識別異常值方面有一定的優越性。偏態和尾重
數據的形狀
ErrorBar(誤差棒圖)
是統計學中常用的圖形。ErrorBar圖涉及到數據的“平均值”和“標準差”。
下面舉例子理解誤差棒圖中涉及到的“平均值”和“標準差”。
某地降雨量的誤差棒圖[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 個假設量:
-
正態性
-
同方差性
-
線性
-
相關錯誤缺失
正態性:
應主要關註以下兩點:
-
直方圖 – 峰度和偏度。
-
正態概率圖 – 數據分布應緊密跟隨代表正態分布的對角線。
之後內容請看頂部鏈接
Python Pandas數據處理入門(Kaggle Titanic競賽數據)
【轉】數據分析