數據可視化 seaborn繪圖(1)


seaborn是基於matplotlib的數據可視化庫.提供更高層的抽象接口.繪圖效果也更好.

 

用seaborn探索數據分布

  1. 繪制單變量分布
  2. 繪制二變量分布
  3. 成對的數據關系可視化

 

繪制單變量分布

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);

 

這種散點圖有一個問題,相同的點會覆蓋在一起.導致我們看不出來濃密和稀疏.

 
         
六邊形圖  hexbin  
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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM