python數據可視化之Seaborn(三):分佈可視化

寫在開頭:今天開始分享一下seaborn對於數據集分佈的設計。該文章主要借鑑seaborn文檔,會附在結尾鏈接。

前文回顧
第一節分享了Seaborn繪圖的整體顏色與風格比例調控,可點擊鏈接查看。
python數據可視化之Seaborn(一)
第二節分享了連續、分類、離散數據的繪圖顏色的方法,可點擊鏈接查看。
python數據可視化之Seaborn(二)

Seaborn可視化內容安排

在Seaborn的學習中安排如下,
一、畫風設置:會簡單介紹一下繪圖風格(一)與顏色風格(二)的設置;
二、繪圖技巧:這裏會介紹數據集(三)、相關數據(四)、分類數據(五)、線性關係(六)可視化的相關內容;
三、結構網絡:本節主要介紹數據識別結構網絡的繪圖(七)。

二、Seaborn繪圖技巧

數據集分佈可視化

當我們處理數據集數據的時候,我們往往需要查看數據的分佈情況,判斷其屬於哪種分佈,或者判斷其是否正態, 因爲在有些統計模型下需要正態的假定,本章我們就會對單變量數據的分佈直方圖、核密度圖,雙變量分佈矩陣圖進行和一些個性化設置進行分享。
繪製單變量分佈
在繪製圖之前我們先載入本章需要的包,

import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
np.random.seed(42)

直方圖
在seaborn中,對於單變量數據分佈方法觀察最便捷的方式就是繪製直方圖和核密度估計,使用的就是distplot()函數,直方圖其實就是根據數據的大小,將數據分成一段一段的矩形,來觀察數據的分佈情況。

sns.set_style("darkgrid")
x = np.random.normal(size=200)
sns.distplot(x, color='y')

在這裏插入圖片描述
我們可以移除核密度估計線,在軸上加上垂直小標籤來表示數據所在的位置,同樣還可以調整矩陣的數量,來對圖像進行重新繪製,

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

在這裏插入圖片描述
繪製直方圖可以粗略的觀察到數據的分佈情況,但直方圖存在比較大的缺陷就是其邊界問題,直方圖的邊界過於強硬,將數據按照固定的不能移動的距離進行分類,使得圖形包容性不夠強。爲此引入了核密度分析,核密度函數圖引入了核函數,使得邊界變得靈活。
核密度估計
核密度估計能夠將直方圖的信息更加全面的包括進來,繪製出更加光滑的曲線,同樣可以通過distplot()函數表示,

sns.distplot(x, hist=False, rug=True, color='g')

在這裏插入圖片描述
當然除了distplot()可以繪製核密度函數圖,還可以單獨使用kdeplot()繪製核密度,核密度估計最重要的兩個參數一個是核函數的選擇,另一個是窗寬的選擇,窗寬的選擇類似於直方圖矩形的寬長度的選擇,核函數的選擇也就是記錄一個窗寬裏數量的方法,一般是添加距離中心的數會賦予更大的權重,遠離中心賦予更小的權重。但最重要的還是窗寬的選擇,一般軟件會自動選擇最優窗寬,下面給大家進行展示,

sns.kdeplot(x)
sns.kdeplot(x, bw=.25, label="bw:0.25")
sns.kdeplot(x, bw=3, label="bw:3")
plt.legend()

在這裏插入圖片描述
從上圖可以看到,自動選擇曲線和0.25窗寬的曲線相近,說明自動選擇的窗寬可能近似於0.25。當然因爲上述的繪圖包含了全部的信息,爲了刪去左右較遠的信息,可以調節cut參數進行調節。

sns.kdeplot(x, shade=True, cut=0, color='y')
sns.rugplot(x, color='y')

在這裏插入圖片描述
數據分佈擬合
我們還能夠通過distplot()函數對數據分佈進行擬合繪製出一條光滑曲線,

x = np.random.gamma(7, size=200)
sns.distplot(x, kde=False, fit=stats.gamma)

在這裏插入圖片描述
繪製雙變量分佈
有時候雙變量分佈的可視化也是比較重要的,比如爲了觀察人羣身體形態分佈,身高體重二維變量就能夠很好的反映出一個綜合的情況,在seaborn中繪圖可以使用jointplot()進行繪圖,首先我們把數據進行模擬生成,根據經驗我們設置一下身高和體重的模擬數據。可以利用jointplot()繪製出一個二維的散點圖。
二維散點圖

#設置均值與協方差矩陣
mean, cov = [1.7, 130], [(1, .65),(.65, 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繪圖
hexbin圖是直方圖的雙變量類型的變種,用六邊形的顏色來表示在該區域觀測量的大小,可以利用jointplot()內置參數進行繪製,

with sns.axes_style("white"):
    sns.jointplot(x=x, y=y, kind="hex", color="r")

在這裏插入圖片描述
核密度估計
除了hexbin和散點圖來繪製二元分佈的方法外,還可以通過核密度估計來進行雙變量的可視化,使用的是多元核密度估計的方法,該方法與單變量的核密度估計差別不大。
在這裏插入圖片描述
同樣也可以使用kdeplot()函數來繪製二維核密度圖形,

f, ax= plt.subplots(figsize=(7, 7))
sns.kdeplot(df.x, df.y, ax=ax)
sns.rugplot(df.x, color="g", ax=ax)
sns.rugplot(df.y, vertical=True, ax=ax)

在這裏插入圖片描述
爲了使得圖形更加的光滑,可以改變n_levels參數的值使得出現更多的圈,來使得圖像柔和,

f, ax = plt.subplots(figsize=(7, 7))
cmap = sns.cubehelix_palette(start=.5, rot=-.6, as_cmap=True, dark=0, light=1, reverse=True)
ax = sns.kdeplot(df.x, df.y, cmap=cmap, n_levels=100, shade=True)

在這裏插入圖片描述
對於jointplot的個性化繪圖,還可以添加更多圖層來調整可視化,使用的方法是JointGrid()裏面添加圖層的方法,

plt.figure(figsize=(7,7))
sns.set_palette(sns.color_palette("GnBu"))
g = sns.jointplot(x="x", y="y", data=df, kind="kde")
g.plot_joint(plt.scatter, c="w", s=30, linewiDth=1, marker="*")
#這裏的collections[0].set_alpha(0.1)是設置添加背景圖層的透明圖,具體不是很明白
g.ax_joint.collections[0].set_alpha(0.1)
g.set_axis_labels("$height$","$weight$")

在這裏插入圖片描述
可視化分佈矩陣
可視化分佈矩陣,就有一點像相關可視化矩陣一樣,就是橫縱分別爲多個變量,然後圖像表示兩兩之間的關係,這種圖適合在變量不是很多的時候使用,

sns.set_palette(sns.color_palette("BuGn_d"))
iris = sns.load_dataset("iris")
sns.pairplot(iris)

在這裏插入圖片描述
joinplot()有joinGrid()函數,同樣pairplot()函數有PairGrid()一樣,

sns.set_palette(sns.color_palette("RdPu"))
g = sns.PairGrid(iris, hue="species")
g = g.map_diag(plt.hist)
g = g.map_offdiag(plt.scatter)
g = g.add_legend()

在這裏插入圖片描述
結語
本節講述瞭如何去展示數據的分佈可視化,這是瞭解數據分佈的第一步,後文會進一步展示面對不同數據的情況下,可以繪製哪些圖形。
謝謝閱讀。
參考
Seaborn可視化文檔
Seaborn函數文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章