【轉】數據分析

詳解 Kaggle 房價預測競賽優勝方案:用 Python 進行全面數據探索

方法框架:框架

  • 理解問題:查看每一個變量而且根據他們的意義和對問題的重要性進行哲學分析。函數

  • 單因素研究:只關注因變量( SalePrice),而且進行更深刻的瞭解。ui

  • 多因素研究:分析因變量和自變量之間的關係。spa

  • 基礎清洗:清洗數據集而且對缺失數據,異常值和分類數據進行一些處理。.net

  • 檢驗假設:檢查數據是否和多元分析方法的假設達到一致。3d

介紹:箱線圖code

 

數據異常值

箱形圖爲咱們提供了識別異常值的一個標準:異常值被定義爲小於Q1-1.5IQR或大於Q3+1.5IQR的值。
衆所周知,基於 正態分佈的3σ法則或z分數方法是以假定數據服從正態分佈爲前提的,但實際數據每每並不嚴格服從正態分佈。它們判斷異常值的標準是以計算數據批的均值和 標準差爲基礎的,而均值和標準差的耐抗性極小, 異常值自己會對它們產生較大影響,這樣產生的異常值個數不會多於總數0.7%。顯然,應用這種方法於非正態分佈數據中判斷異常值,其有效性是有限的。
箱形圖的繪製依靠實際數據,不須要事先假定數據服從特定的分佈形式,沒有對數據做任何限制性要求,它只是真實直觀地表現數據形狀的原本面貌;另外一方面,箱形圖判斷異常值的標準以 四分位數四分位距爲基礎,四分位數具備必定的耐抗性,多達25%的數據能夠變得任意遠而不會很大地擾動四分位數,因此異常值不能對這個標準施加影響,箱形圖識別異常值的結果比較客觀。因而可知,箱形圖在識別異常值方面有必定的優越性。

偏態和尾重

比較標準 正態分佈、不一樣 自由度t分佈和非對稱分佈數據的箱形圖的特徵,能夠發現:對於標準正態分佈的大樣本,只有 0.7%的值是 異常值, 中位數位於上下 四分位數的中央,箱形圖的方盒關於 中位線對稱。選取不一樣自由度的t分佈的大樣本,表明對稱 重尾分佈,當t分佈的自由度越小,尾部越重,就有越大的機率觀察到異常值。以 卡方分佈做爲非對稱分佈的例子進行分析,發現當卡方分佈的自由度越小,異常值出現於一側的機率越大,中位數也越偏離上下四分位數的中心位置,分佈 偏態性越強。異常值集中在較大值一側,則分佈呈現右偏態;異常值集中在較小值一側,則分佈呈現左偏態。下表列出了幾種分佈的樣本數據箱形圖的特徵(樣本數據由 SAS的隨機數生成函數自動生成),驗證了上述規律。這個規律揭示了數據批分佈偏態和尾重的部分信息,儘管它們不能給出偏態和尾重程度的精確度量,但可做爲咱們粗略估計的依據。
 

數據的形狀

同一數軸上,幾批數據的箱形圖並行排列,幾批數據的 中位數尾長異常值、分佈區間等形狀信息便一目瞭然。在一批數據中,哪幾個數據點出類拔萃,哪些數據點表現不及通常,這些數據點放在同類其它羣體中處於什麼位置,能夠經過比較各箱形圖的異常值看出。各批數據的 四分位距大小,正常值的分佈是集中仍是分散,觀察各方盒和線段的長短即可明瞭。每批數據分佈的 偏態如何,分析 中位線和異常值的位置也可估計出來。
若是對同類羣體的幾批數據的箱形圖進行比較,分析評價,即是 常模參照解釋方法的可視圖示;若是把受測者數據批的箱形圖與外在 效標數據批的箱形圖比較分析,即是效標參照解釋的可視圖示。箱形圖結合這些分析方法用於質量管理、人事測評、 探索性數據分析等統計分析活動中去,有助於分析過程的簡便快捷,其做用顯而易見。

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 個假設量:

  • 正態性

  • 同方差性

  • 線性

  • 相關錯誤缺失

正態性:

應主要關注如下兩點:

  • 直方圖 – 峯度和偏度。

  • 正態機率圖 – 數據分佈應緊密跟隨表明正態分佈的對角線。

 以後內容請看頂部連接

Python Pandas數據處理入門(Kaggle Titanic競賽數據)

相關文章
相關標籤/搜索