如何使用Seaborn進行探索性數據分析

探索性數據分析(EDA)是一種分析機器學習數據集以總結其主要特徵的方法。它用於理解數據,獲取有關它的一些上下文,理解變量和它們之間的關係,並制定在構建機器學習預測模型時可能有用的假設。

所有數據分析必須以一些關鍵問題或目標為指導。在開始任何數據分析任務之前,您應該有一個明確的目標。當您的目標允許您瞭解您的數據和問題時,您將能夠從分析中獲得有意義的結果!

在本教程中,我們將學習如何使用數據可視化來執行EDA。具體來說,我們將重點介紹seaborn,這是一個構建在matplotlib之上的Python庫,支持NumPy和panda。

seaborn使我們能夠製作出具有吸引力和信息豐富的統計圖形。儘管matplotlib使得可視化任何東西都成為可能,但是要使圖形具有視覺吸引力通常是困難和乏味的。seaborn通常用於使默認的matplotlib圖看起來更好,並引入了一些額外的圖類型。

我們將介紹如何進行視覺分析:

  • 直方圖的數值變量,
  • 帶有計數圖的分類變量,
  • 數值變量與散點圖,joint plots和pair plots之間的關係
  • 數值和分類變量與盒須圖和複雜條件圖之間的關係

通過有效地可視化機器學習數據集的變量及其關係,數據分析師或數據科學家能夠快速瞭解​​趨勢,異常值和模式。然後,可以使用這種理解來決策並創建機器學習預測模型。

數據準備

數據準備是任何數據分析的第一步,以確保以可分析的形式清理和轉換數據。

我們將在Ames Housing數據集上執行EDA(http://www.kankanyun.com/data/house.xls) 。這個數據集在那些開始學習數據科學和機器學習的人群中很受歡迎,因為它包含了愛荷華州艾姆斯出售的不同房屋幾乎所有特徵的數據。然後可以使用該數據來嘗試預測銷售價格。

請先進行數據集清理然後進行分析。我們要做的就是過濾一些變量來簡化我們的任務。首先,讓我們將數據讀取為panda DataFrame:這個數據集在那些開始學習數據科學和機器學習的人群中很受歡迎,因為它包含了愛荷華州艾姆斯出售的不同房屋幾乎所有特徵的數據。然後可以使用該數據來嘗試預測銷售價格。

此數據集已經過清理並可以進行分析。我們要做的就是過濾一些變量來簡化我們的任務。首先,讓我們將數據讀取為panda DataFrame:

import pandas as pd
import matplotlib as plt
housing = pd.read_csv('house.csv')
housing.info()
如何使用Seaborn進行探索性數據分析

如何使用Seaborn進行探索性數據分析

此圖像僅顯示數據集中前五列的信息

如果您在Jupyter notebook中運行此Python代碼,則可以看到有1,460個觀察值和81列。每列代表DataFrame中的變量。我們可以從每列的數據類型中看到它是什麼類型的變量。

我們將只處理其中的一些變量——讓我們將它們的名稱過濾並存儲在兩個名為numerical和categorical的列表中,然後重新定義我們的housing DataFrame,使其只包含這些變量:

numerical = [
'SalePrice', 'LotArea', 'OverallQual', 'OverallCond', '1stFlrSF', '2ndFlrSF', 'BedroomAbvGr'
]
categorical = [
'MSZoning', 'LotShape', 'Neighborhood', 'CentralAir', 'SaleCondition', 'MoSold', 'YrSold'
]
housing = housing[numerical + categorical]
housing.shape
如何使用Seaborn進行探索性數據分析

Out: (1460, 14)

從housing.shape中,我們可以看到DataFrame現在只有14列。讓我們來分析一下!

分析數值變量

我們的EDA目標是瞭解此數據集中的變量如何與房屋的銷售價格相關。

在我們做到這一點之前,我們需要先了解變量。讓我們從數值變量開始,特別是我們的目標變量SalePrice。

數值變量就是那些數值為數字的變量。當我們有數值變量時,我們要做的第一件事是瞭解變量可以取什麼值,以及分佈和離散度。這可以通過直方圖來實現:

import seaborn as sns
sns.set(style='whitegrid', palette="deep", font_scale=1.1, rc={"figure.figsize": [8, 5]})
sns.distplot(
housing['SalePrice'], norm_hist=False, kde=False, bins=20, hist_kws={"alpha": 1}
).set(xlabel='Sale Price', ylabel='Count');
如何使用Seaborn進行探索性數據分析

如何使用Seaborn進行探索性數據分析

SalePrice變量的分佈

請注意,seaborn庫被導入為sns。

只需一種方法sns.set(),我們就可以設計圖形樣式,更改顏色,增加字體大小以提高可讀性,並更改圖形大小。

我們使用distplot來繪製seaborn中的直方圖。默認情況下,這會繪製帶有核密度估計(KDE)的直方圖。您可以嘗試更改參數kde=True,看看它是什麼樣子的。

看一下直方圖,我們可以看到,很少有房子的價格低於10萬,大多數房子的價格在10萬到20萬之間,很少有房子的價格高於40萬。

如果我們想為所有數值變量創建直方圖,pandas提供最簡單的解決方案:

housing[numerical].hist(bins=15, figsize=(15, 6), layout=(2, 4));
如何使用Seaborn進行探索性數據分析

每個數值變量的分佈

從這個可視化中,我們獲得了大量信息。我們可以看到1stFlrSF(一樓面積)嚴重偏態,大多數房屋沒有二樓,並且有3個BedroomAbvGr(地上臥室)。大多數房屋的售價分別OverallCond of 5和OverallQual of 5或更高。LotArea可視化更難理解——但是我們可以看出,在建模之前可能需要刪除一個或多個異常值。

請注意,該圖保留了我們之前使用seaborn設置的樣式。

分析分類變量

分類變量是指其值被標註類別的變量。分類變量的值、分佈和離散度最好通過條形圖來理解。讓我們分析一下SaleCondition變量。seaborn為我們提供了一種非常簡單的方法來顯示每個類的觀測計數:countplot。

sns.countplot(housing['SaleCondition']);
如何使用Seaborn進行探索性數據分析

該圖中的條形表示每種銷售條件下的房屋數量

從可視化的角度,我們可以很容易地看到,大多數房屋是在Normal情況下出售的,而在AjdLand(毗連土地購買)、Alloca(分配:兩個有獨立契約的相互關聯的房產)和Family 家庭成員之間的銷售)條件下出售的很少。

為了可視化數據集中的所有分類變量,就像我們對數值變量所做的那樣,我們可以循環遍歷pandas序列來創建子圖。

使用plt.subplots,我們可以創建一個包含2行和4列網格的圖形。然後我們遍歷每個分類變量,使用seaborn創建countplot:

fig, ax = plt.subplots(2, 4, figsize=(20, 10))
for variable, subplot in zip(categorical, ax.flatten()):
sns.countplot(housing[variable], ax=subplot)
for label in subplot.get_xticklabels():
label.set_rotation(90)
如何使用Seaborn進行探索性數據分析

如何使用Seaborn進行探索性數據分析

每個分類變量的Countplots

第二個for循環只是獲取每個x-tick標籤並將其旋轉90度,以使文本更適合圖標(如果您想知道不旋轉文本的外觀,可以刪除這兩行)。

與我們的數值變量直方圖一樣,我們可以從這個視覺中收集大量信息 - 大多數房屋都有RL(住宅低密度)分區分類,有Regular地段形狀,並且有CentralAir。我們還可以看到,在夏季,房屋銷售頻繁,大多數房屋在NAmes(北艾姆斯)社區出售,2010年銷售有所下降。

但是,如果我們YrSold進一步檢查變量,我們可以看到這種“下降”實際上是由於只收集了截至7月的數據。

housing[housing['YrSold'] == 2010].groupby('MoSold')['YrSold'].count()
如何使用Seaborn進行探索性數據分析

正如您所看到的,徹底探索變量及其價值非常重要 - 如果我們在假設2010年銷售額下降的情況下建立了預測銷售價格的模型,那麼這種模型可能會非常不準確。

既然我們已經探索了數值和分類變量,那麼讓我們來看看這些變量之間的關係 - 更重要的是,這些變量如何影響我們的目標變量SalePrice!

分析數值變量之間的關係

繪製變量之間的關係使我們能夠輕鬆地瞭解模式和相關性。

該散點圖通常用於可視化兩個數值型變量之間的關係。seaborn創建散點圖的方法非常簡單:

sns.scatterplot(x=housing['1stFlrSF'], y=housing['SalePrice']);
如何使用Seaborn進行探索性數據分析

1stFlrSF與SalePrice之間的關係

從散點圖中,我們可以看到房子的1stFlrSF和房子的SalePrice之間存在正相關關係。換句話說,房子的一樓越大,可能的售價就越高。

您還可以看到,axis標籤在默認情況下是為我們添加的,並且標記是自動列出的,以使它們更加清晰——這與matplotlib相反,在matplotlib中這些不是默認的。

seaborn還為我們提供了一個很好的函數jointplot,它將為您提供一個散點圖,顯示兩個變量之間的關係以及邊距中每個變量的直方圖 - 也稱為邊際圖。

sns.jointplot(x=housing['1stFlrSF'], y=housing['SalePrice']);
如何使用Seaborn進行探索性數據分析

顯示1stFlrSF與SalePrice及其各自分佈關係的聯合圖

您不僅可以看到這兩個變量之間的關係,而且還可以看到它們是如何單獨分佈的。

分析數值和類別變量之間的關係

盒須圖通常用於可視化數值變量和分類變量之間的關係,複雜條件圖用於可視化條件關係。

讓我們先用seaborn的boxplot方法創建盒須圖:

fig, ax = plt.subplots(3, 3, figsize=(15, 10))
for var, subplot in zip(categorical, ax.flatten()):
sns.boxplot(x=var, y='SalePrice', data=housing, ax=subplot)
如何使用Seaborn進行探索性數據分析

如何使用Seaborn進行探索性數據分析

每個分類變量及其與SalePrice的關係的盒須圖

在這裡,我們遍歷了每個子圖,以生成所有類別變量和SalePrice之間的可視化。

我們可以看到具有FV(Floating Village Residential)zoning 分類的房屋的平均SalePrice高於其他zoning 分類,有CentralAir的房屋和部分(上次評估時未完成的房屋)銷售合同的房屋的平均售價也高於其他zoning分類。我們還可以看到,不同lotshape的房子之間,MoSold和yrsell之間的平均售價差異很小。

讓我們仔細看看Neighborhood變量。我們看到,對於不同的neighborhood,肯定有不同的分佈,但是可視化有點難以理解。讓我們使用額外的參數順序,按照最便宜的neighborhood到最昂貴的(按照中間價格)對box plot進行排序。

sorted_nb = housing.groupby(['Neighborhood'])['SalePrice'].median().sort_values()
sns.boxplot(x=housing['Neighborhood'], y=housing['SalePrice'], order=list(sorted_nb.index))
如何使用Seaborn進行探索性數據分析

如何使用Seaborn進行探索性數據分析

分類盒須圖顯示Neighborhood與SalePrice的關係

在上面的Python代碼片段中,我們按照median 價格對neighborhood進行了排序,並將其存儲在sorted_nb中。然後,我們將這個neighborhood名稱列表傳遞到order參數中,以創建一個排序的箱形圖。

這個數字給了我們很多信息。我們可以看到,在最便宜的街區,房屋的售價median價格約為10萬美元,在最昂貴的社區,房屋售價約為30萬美元。我們還可以看到,對於一些neighborhoods而言,價格之間的差異非常小,這意味著所有價格都相互接近。然而,在最昂貴的街區,我們看到一個大盒子——價格分佈有很大的分散性。

最後,seaborn還允許我們創建顯示條件關係的圖。例如,如果我們正在調整Neighborhood,使用該FacetGrid函數我們可以看到變量OverallQual和SalePrice變量之間的散點圖:

cond_plot = sns.FacetGrid(data=housing, col='Neighborhood', hue='CentralAir', col_wrap=4)
cond_plot.map(sns.scatterplot, 'OverallQual', 'SalePrice');
如何使用Seaborn進行探索性數據分析

如何使用Seaborn進行探索性數據分析

此圖像僅顯示前12個圖。實際上有25個圖 - 每個neighborhood一個

對於每個單獨的neighborhood ,我們可以看到OverallQual和SalePrice之間的關係。

我們還在hue參數(可選)中添加了另一個categorical變量CentralAir——橙色的點對應於沒有CentralAir的房屋。如你所見,這些房子的售價往往較低。

FacetGrid方法使生成複雜的可視化和獲取有價值的信息變得非常容易。生成這些可視化來快速瞭解變量關係是一個很好的實踐。

最後

在我們的探索過程中,我們發現了個別變量中的異常值和趨勢,以及變量之間的關係。這些知識可以用來建立一個模型來預測艾姆斯的房價。例如,由於我們發現SalePrice與CentralAir、1stFlrSf、SaleCondition和Neighborhood變量之間存在相關性,我們可以從使用這些變量的簡單機器學習模型開始。

本課程探索了NumPy的向量化操作,使用panda的EDA,使用matplotlib的數據可視化,使用seaborn的附加EDA和可視化技術,使用SciPy的統計計算,以及使用scikit-learn的機器學習。


分享到:


相關文章: