在這一節裡,我們將會使用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的結果。 方法如下。
1 2 | #只顯示直方圖 sns.distplot(x, kde = False ) |

1 2 | #只顯示KDE sns.distplot(x, hist = False ) |

其中,在繪製直方圖中,程式會預設猜測最適合的長條(bin)數量,我們當然可以選擇自己設定,如下。
1 | sns.distplot(x, bins = 20 , kde = False ) |

而在KDE繪製中,也有類似的參數bw可以選擇,以下程式碼顯示選擇不同的寬度所繪製出的圖形不同。
1 2 3 4 | 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方法打印出前五行數據。
1 2 3 4 5 | 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來繪製兩變數之間的分配關係
1 | sns.jointplot(x = "x" , y = "y" , data = df) |

當然,我們也可以使用KDE方法來繪製,如以下程式碼所示。
1 | sns.jointplot(x = "x" , y = "y" , data = df, kind = "kde" ); |

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

當我們使用pairplot快速繪製出變數之間的兩兩關係後,我們就可以快速判識出有高度正向關以及負相關的變數,並可以很好的對於資料有第一時間的理解。
小結
在這一小節中,我們介紹了三個函式,其中displot繪製單一變數的資料分配情況,jointplot繪製雙變數的分配情況,而pairplot則可以對一資料集繪製兩兩變數之間的分配關係。