1. 程式人生 > >【轉】數據分析

【轉】數據分析

算數 例子 sce 活動 排列 standards 對稱 兩個 發現

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

方法框架:

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

  • 單因素研究:只關註因變量( SalePrice),並且進行更深入的了解。

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

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

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

介紹:箱線圖

技術分享圖片

數據異常值

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

偏態和尾重

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

數據的形狀

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

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競賽數據)

【轉】數據分析