Python教程 – seaborn函式庫教學(三) – 繪製資料分佈情形

在這一節裡,我們將會使用seaborn來繪製給定資料集的分佈情形,以下是一個快速的例子。

[python]
import numpy as np
import seaborn as sns
x = np.random.normal(size=100)
sns.displot(x)
[/python]

在這邊我們匯入numpy套件庫以及seaborn套件庫,numpy套件庫是一套提供高速矩陣運算的python套件庫,我們利用裡面內建函式從一常態分配獨立抽出100個樣本,並利用這100樣本點使用seaborn的displot函式繪製分配圖,結果如上。

從這張圖可以看出,實際上displot函式繪製出來的圖包含兩個部份,第一個部份是直方圖,函式會根據資料的值,統計在每一個值範圍下樣本的數量,藉此畫出一個個長條區域。而另一方面,同時displot函式也會計算這筆數據的KDE(Kernel Density Estimation)。在這邊程式會預設kernal函數為高斯分配,在之後的實戰文章,會在詳細解釋kde算法的細節,在這邊,可以先理解為根據給定的分配函數(kernel函數),使用資料去估計對應的參數,最後出估計出一條分配曲線,相對於直方圖,KDE還能夠呈現沒有在資料出現的數值的機率推估,可以讓我們對於資料分配有更全面的了解。

當然,我們也可以控制函式參數使得繪製出來的圖形只顯示直方圖或是KDE的結果。 方法如下。

#只顯示直方圖
sns.distplot(x, kde=False)

只顯示直方圖
#只顯示KDE
sns.distplot(x, hist=False)

只顯示KDE

其中,在繪製直方圖中,程式會預設猜測最適合的長條(bin)數量,我們當然可以選擇自己設定,如下。

sns.distplot(x, bins=20, kde=False)

而在KDE繪製中,也有類似的參數bw可以選擇,以下程式碼顯示選擇不同的寬度所繪製出的圖形不同。

import matplotlib.pyplot as plt
sns.kdeplot(x, bw=.2, label="bw: 0.2")
sns.kdeplot(x, bw=2, label="bw: 2")
plt.legend();

繪製雙維度的資料分配

seaborn也提供了jointplot()這個函式來繪製多維度資料的分配情況,如以下程式碼,我們先產生一組(x,y)變數,這組變數服從二維度的多重常態分配,其期望值向量為[0,1]以及兩者間的共變異數為0.5,產生200點(x,y)的樣本點後,用df這個變數存下來,存下來的方式為pandas所提供的資料框物件(DataFrame)。資料框可以想像為一張excel表的抽象物件化,我們用資料框物件的提供的head方法打印出前五行數據。

import pandas as pd
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
print(df.head())

這時候我們使用jointplot來繪製兩變數之間的分配關係

sns.jointplot(x="x", y="y", data=df)

當然,我們也可以使用KDE方法來繪製,如以下程式碼所示。

sns.jointplot(x="x", y="y", data=df, kind="kde");

複雜資料集的快速視覺化

當然,我們通常會遇到十分複雜的資料集,裡面包含了數十個以上的變數,要處理這種情況,我們可以使用pairplot來快速繪製資料集裡面資料兩兩之間的關係,如以下的例子,我們直接載入seaborn所提供的iris資料庫,並使用pairplot快速繪製兩兩變數之間的關係。

iris = sns.load_dataset("iris")
sns.pairplot(iris)

當我們使用pairplot快速繪製出變數之間的兩兩關係後,我們就可以快速判識出有高度正向關以及負相關的變數,並可以很好的對於資料有第一時間的理解。

小結

在這一小節中,我們介紹了三個函式,其中displot繪製單一變數的資料分配情況,jointplot繪製雙變數的分配情況,而pairplot則可以對一資料集繪製兩兩變數之間的分配關係。

Share

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *