在這一節裡,我們將會使用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)
其中,在繪製直方圖中,程式會預設猜測最適合的長條(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則可以對一資料集繪製兩兩變數之間的分配關係。