seaborn是基於matplotlib的數據可視化庫.提供更高層的抽象接口.繪圖效果也更好.
用seaborn探索數據分布
- 繪制單變量分布
- 繪制二變量分布
- 成對的數據關系可視化
繪制單變量分布
seaborn里最常用的觀察單變量分布的函數是distplot()。默認地,這個函數會繪制一個直方圖,並擬合一個核密度估計.如下所示:
x = np.random.normal(size=100) sns.distplot(x);
首先解釋一下啥叫核密度估計.wiki wiki里的一大堆數學證明看着就可怕....
簡單地說:所謂核密度估計,就是采用平滑的峰值函數(“核”)來擬合觀察到的數據點,從而對真實的概率分布曲線進行模擬.
說人話的話,就是:我們有很多樣本,但再多的樣本,也是離散的.所謂核密度估計,就是根據離散采樣,估計連續密度分布. 所以樣本量得大,假如你就3,5個樣本,還有什么好估計的.
那核密度估計的原理是啥呢?
你上網搜索的話,大概率會搜到這個:
核密度函數的原理比較簡單,在我們知道某一事物的概率分布的情況下,如果某一個數在觀察中出現了,我們可以認為這個數的概率密度很大,和這個數比較近的數的概率密度也會比較大,而那些離這個數遠的數的概率密度會比較小。
基於這種想法,針對觀察中的第一個數,我們可以用K去擬合我們想象中的那個遠小近大概率密度。對每一個觀察數擬合出的多個概率密度分布函數,取平均。如果某些數是比較重要的,則可以取加權平均。
說實在的,我還是覺得很難理解.......
好在,一圖勝千言!
x = np.random.normal(0, 1, size=30) bandwidth = 1.06 * x.std() * x.size ** (-1 / 5.) support = np.linspace(-4, 4, 200) kernels = [] for x_i in x: kernel = stats.norm(x_i, bandwidth).pdf(support) kernels.append(kernel) plt.plot(support, kernel, color="r") sns.rugplot(x, color=".2", linewidth=3);
.
即:假如有x個樣本,如果我們用Gaussian Kernel Density(就是常說的正態分布啦),對每一個樣本,我們都認為這個樣本處在一個正態分布的峰值位置,(因為我們已經發現這個樣本了).這樣,就擬合出了x個正態分布曲線. 將這些曲線疊加取平均再正則化,就得到了最終的核密度估計分布曲線.
這里我們用的是kernel是gaussian.其實kernel有很多種,其中gau是最常用的.
kernel : {‘gau’ | ‘cos’ | ‘biw’ | ‘epa’ | ‘tri’ | ‘triw’ }, optional
displot參數
sns.distplot(x, kde=False, rug=True);
rug=True:繪制出離散樣本
sns.distplot(x, bins=20, kde=False, rug=True);
bins=20:直方圖的"柱子"的個數
更多參數,看文檔去吧:displot api
繪制雙變量分布
最常用的方法是散點圖繪制 matplotlib.scatter seaborn中是jointplot
首先我們生成一個二元正態分布矩陣
mean, cov = [0, 1], [(1, .5), (.5, 1)] data = np.random.multivariate_normal(mean, cov, 200) df = pd.DataFrame(data, columns=["x", "y"])
散點圖繪制sns.jointplot(x="x", y="y", data=df);

這種散點圖有一個問題,相同的點會覆蓋在一起.導致我們看不出來濃密和稀疏.
sns.jointplot(x=x, y=y, kind="hex", color="k");

核密度分布估計
jointpoint函數使用JointGrid對象來繪圖.為了提供更多的靈活性,jointpoint()返回一個JointGrid對象,你可以繪制出自己定制的圖.
g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m") g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+") g.ax_joint.collections[0].set_alpha(0) g.set_axis_labels("$X$", "$Y$");
繪制成對的數據關系可視化
以著名的iris數據集為例. iris數據集有4個特征.那么兩兩組成一個pair的話,就有16種組合.用pairplot()繪制如下:
和jointplot類似,pairplot是基於PairPlot對象的.直接用PairPlot對象,可以更加靈活地繪制你想要的圖
比如繪制iris數據集的核密度分布估計.
g = sns.PairGrid(iris) g.map_diag(sns.kdeplot) g.map_offdiag(sns.kdeplot, n_levels=6);