(十七)Seaborn知識(shí)學(xué)習(xí)4-python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)實(shí)戰(zhàn)(學(xué)習(xí)筆記)

文章原創(chuàng),最近更新:2018-05-11

1.分布數(shù)據(jù)集的可視化的介紹
2.單變量分布
3.雙變量分布

課程來(lái)源: python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)實(shí)戰(zhàn)-唐宇迪

學(xué)習(xí)參考鏈接:
1、Seaborn(sns)官方文檔學(xué)習(xí)筆記(第三章 分布數(shù)據(jù)集的可視化)
2、Seaborn官方0.8.1版本

引言:這部分主要學(xué)習(xí)的是分布數(shù)據(jù)集的可視化

1.分布數(shù)據(jù)集的可視化的介紹

在處理一組數(shù)據(jù)時(shí),通常首先要做的是了解變量是如何分布的。這一章將簡(jiǎn)要介紹seborn中用于檢查單變量和雙變量分布的一些工具。

2.單變量分布

拿到一份數(shù)據(jù)之后,對(duì)數(shù)據(jù)進(jìn)行展開分析,首先要觀察數(shù)據(jù)內(nèi)部的情況.比如說(shuō)數(shù)據(jù)是由數(shù)據(jù)一個(gè)個(gè)特征組成的,每個(gè)特征的分布情況是什么樣的?通常就會(huì)做單變量,單特征的變量分析.

做單特征分析的一種很簡(jiǎn)單的情況就是將該特征的分布情況拿出來(lái),看一下當(dāng)前特征的分布狀況分布是什么樣的?

最方便的方式是快速查看單變量分布無(wú)疑是使用distplot()函數(shù)。默認(rèn)情況下,這將繪制一個(gè)直方圖,并擬合出核密度估計(jì)(KDE)。

2.1直方圖

直方圖應(yīng)當(dāng)是非常熟悉的函數(shù)了,在matplotlib中就存在hist函數(shù)。直方圖通過(guò)在數(shù)據(jù)的范圍內(nèi)切成數(shù)據(jù)片段,然后繪制每個(gè)數(shù)據(jù)片段中的觀察次數(shù),來(lái)表示整體數(shù)據(jù)的分布。

為了說(shuō)明這一點(diǎn),我們刪除密度曲線并添加了地毯圖,每個(gè)觀察點(diǎn)繪制一個(gè)小的垂直刻度。您可以使用rugplot()函數(shù)來(lái)制作地毯圖,但它也可以在distplot()中使用:

案例代碼如下:

import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))

x=np.random.normal(size=100)
sns.distplot(x,kde=False)

輸出結(jié)果如下:


將數(shù)據(jù)分為20組,顯示的結(jié)果又是怎么樣的呢?
distplot()的參數(shù)bins設(shè)置為20,就可以將數(shù)據(jù)分為20組.

案例代碼如下:

import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))

x=np.random.normal(size=100)
sns.distplot(x,bins=20,kde=False)

輸出結(jié)果如下:


這里涉及到的知識(shí)點(diǎn):
1)set(color_codes=True)
在一個(gè)步驟中設(shè)置美學(xué)參數(shù)。
seaborn.set(context ='notebook',style ='darkgrid',palette ='deep',font ='sans-serif',font_scale = 1,color_codes = False,rc = None )

  • color_codes :布爾
    如果True并且palette是一個(gè)seaborn調(diào)色板,請(qǐng)將簡(jiǎn)寫顏色代碼(例如“b”,“g”,“r”等)重新映射到此調(diào)色板的顏色。

2)random.seed(sum(map(ord, "distributions")))
random.seed(123456789) # 種子不同,產(chǎn)生的隨機(jī)數(shù)序列也不同,隨機(jī)數(shù)種子都是全局種子.

要每次產(chǎn)生隨機(jī)數(shù)相同就要設(shè)置種子,相同種子數(shù)的Random對(duì)象,相同次數(shù)生成的隨機(jī)數(shù)字是完全相同的.

np.random.seed()的作用是當(dāng)每次運(yùn)行代碼時(shí),可以設(shè)置相同的seed時(shí),每次生成的隨機(jī)數(shù)也相同,如果不設(shè)置seed,則每次生成的隨機(jī)數(shù)都會(huì)不一樣

例如:
當(dāng)不使用seed的情況下,每次隨機(jī)數(shù)都不一樣.

from numpy.random import rand
a=rand(5)#不使用seed
print("rand(5)第一次打印:",a)
rand(5)第一次打印: [ 0.01786796  0.95757811  0.70141209  0.92666375  0.66817397]

a=rand(5)#不使用seed
print("rand(5)第二次打印:",a)
rand(5)第二次打印: [ 0.80940914  0.36203074  0.76397746  0.27343798  0.4564159 ]

當(dāng)使用seed的情況下,每次隨機(jī)數(shù)都一樣.

from numpy.random import rand
import numpy as np
np.random.seed(3)#使用seed
b=rand(5)
print("rand(5)第一次打印:",b)

rand(5)第一次打印: [ 0.5507979   0.70814782  0.29090474  0.51082761  0.89294695]

np.random.seed(3)#使用seed
b=rand(5)
print("rand(5)第二次打印:",b)

rand(5)第二次打印: [ 0.5507979   0.70814782  0.29090474  0.51082761  0.89294695]

3)random.normal(size=100)
numpy.random.normal(loc=0.0, scale=1.0, size=None)
參數(shù)的意義為:

  • loc:float,此概率分布的均值(對(duì)應(yīng)著整個(gè)分布的中心centre)
  • scale:float,此概率分布的標(biāo)準(zhǔn)差(對(duì)應(yīng)于分布的寬度,scale越大越矮胖,scale越小,越瘦高)
  • size:int or tuple of ints,輸出的shape,默認(rèn)為None,只輸出一個(gè)值
    我們更經(jīng)常會(huì)用到的np.random.randn(size)所謂標(biāo)準(zhǔn)正態(tài)分布(μ=0,σ=1μ=0,σ=1),對(duì)應(yīng)于np.random.normal(loc=0, scale=1, size)。


4)distplot(x,bins=20,kde=False)
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)

  • a:series或一維數(shù)組或列表類型的數(shù)據(jù)
  • bins:設(shè)置矩形條的數(shù)量
  • kde:bool,可選.是否繪制高斯核密度估計(jì),默認(rèn)繪制.

2.2擬合參數(shù)分布

還可以使用distplot()將參數(shù)分布擬合到數(shù)據(jù)集,并可視化地評(píng)估其與觀察數(shù)據(jù)的對(duì)應(yīng)關(guān)系:

統(tǒng)計(jì)的時(shí)候,要把數(shù)據(jù)一個(gè)整體的輪廓表現(xiàn)出來(lái),就是看一下數(shù)據(jù)的分布狀況,什么樣的?

需要將distplot()中的參數(shù)fit寫進(jìn)來(lái),比如fit=stats.gamma,fit是統(tǒng)計(jì)的一個(gè)指標(biāo),可以看清楚當(dāng)前的數(shù)據(jù)是在某一個(gè)統(tǒng)計(jì)指標(biāo)下它的一個(gè)分步狀態(tài).

案例代碼如下:

import seaborn as sns
import numpy as np
from scipy import stats,integrate
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))

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

輸出結(jié)果如下:


這里涉及到知識(shí)點(diǎn)

  1. np.random.gamma()
    numpy.random.gamma(shape, scale=1.0, size=None)
    從Gamma分布中繪制樣本。
    • shape:float或float_like,伽瑪分布的形狀。應(yīng)該大于零。

    • scale:float或float_like,可選,伽瑪分布的范圍。應(yīng)該大于零。默認(rèn)值等于1。

    • size:int或int的元組,可選
      返回:ndarray或標(biāo)量,從參數(shù)化伽馬分布中繪制樣本。

    • 輸出形狀。如果給定的形狀是,例如,然后 抽取樣本。如果大小是(默認(rèn)),則返回單個(gè)值,如果和都是標(biāo)量。否則,繪制樣本。


參考鏈接:numpy.random.gamma官網(wǎng)網(wǎng)站

  1. sns.distplot()中的參數(shù)x, kde=False, fit=stats.gamma
    3)distplot(x,bins=20,kde=False)
    seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)

    • x:series或一維數(shù)組或列表類型的數(shù)據(jù)
    • kde:bool,可選.是否繪制高斯核密度估計(jì),默認(rèn)繪制.
    • fit:控制擬合的參數(shù)分布圖形
  2. from scipy import stats,integrate

    • stats :Python有一個(gè)很好的統(tǒng)計(jì)推斷包。那就是scipy里面的stats。Scipy的stats模塊包含了多種概率分布的隨機(jī)變量,隨機(jī)變量分為連續(xù)的和離散的兩種
    • integrate: scipy.integration提供多種積分的工具,主要分為以下兩類,一是對(duì)給出的函數(shù)公式積分,二是對(duì)于采樣數(shù)值進(jìn)行積分.

mean是均值,cov是協(xié)方差,想根據(jù)均值以及協(xié)方差通過(guò)numpy這個(gè)庫(kù),生成一組二維數(shù)據(jù).

案例代碼如下:

import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))

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)

輸出結(jié)果如下:

            x         y
0   -0.966779  1.224554
1    1.326123  0.467515
2   -1.233853  0.459449
3   -0.877749  0.512031
4   -1.682080  2.193876
5   -0.427656  2.252601
..        ...       ...
195  0.415857  0.815041
196 -0.141024  0.214063
197 -1.879956  0.599829
198 -1.056075 -0.086185
199 -0.786835  2.789600

[200 rows x 2 columns]

之前分析的數(shù)據(jù)是單變量,只需要分析一維,對(duì)數(shù)據(jù)分析而說(shuō),通查要看數(shù)據(jù)特征以及數(shù)據(jù)特征之間的關(guān)系.對(duì)二維數(shù)據(jù)來(lái)說(shuō),比如x,y數(shù)據(jù)之間的特征關(guān)系是什么樣的?要分析特征以及特征之間的一個(gè)內(nèi)部的聯(lián)系,最好使用的方法是散點(diǎn)圖.單特征最好使用直方圖描述.

這里涉及到知識(shí)點(diǎn):

  • mean, cov = [0, 1], [(1, .5), (.5, 1)]

  • np.random.multivariate_normal(mean, cov, 200)
    np.random.multivariate_normal方法用于根據(jù)實(shí)際情況生成一個(gè)多元正太分布矩陣(正太分布基本概念戳這里),其在Python3中的定義如下:

    • mean:mean是多維分布的均值維度為1;

    • cov:協(xié)方差矩陣(協(xié)方差基本概念戳這里),注意:協(xié)方差矩陣必須是對(duì)稱的且需為半正定矩陣;

    • size:指定生成的正太分布矩陣的維度(例:若size=(1, 1, 2),則輸出的矩陣的shape即形狀為 1X1X2XN(N為mean的長(zhǎng)度))。

參考鏈接:np.random.multivariate_normal方法淺析

3.雙變量分布

觀測(cè)兩個(gè)變量之間的分布關(guān)系最好用散點(diǎn)圖.

雙變量分布的最熟悉的可視化方式無(wú)疑是散點(diǎn)圖,其中每個(gè)觀察結(jié)果以x和y值表示。這是兩個(gè)方面的地毯圖??梢允褂胢atplotlib中的plt.scatter函數(shù)繪制散點(diǎn)圖,它也是jointplot()函數(shù)顯示的默認(rèn)方式。

3.1繪制雙變量分布

在繪制兩個(gè)變量的雙變量分布也是有用的。在seaborn中這樣做的最簡(jiǎn)單的方法就是在jointplot()函數(shù)中創(chuàng)建一個(gè)多面板數(shù)字,顯示兩個(gè)變量之間的雙變量(或聯(lián)合)關(guān)系以及每個(gè)變量的單變量(或邊際)分布和軸。

這里的x="x", y="y", 分別表示x維度,y維度,然后data=df,df表示的是傳進(jìn)來(lái)的數(shù)據(jù).

案例代碼如下:

import seaborn as sns
import numpy as np
import pandas as pd
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))

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)

輸出結(jié)果如下:


從輸出的結(jié)果可以看出,x與y之間的關(guān)系,jointplot()函數(shù)不僅可以將x,y之間的關(guān)系畫出來(lái),也將x,y分別自身的狀況也畫出來(lái),此外相關(guān)系數(shù)也計(jì)算出來(lái).jointplot()函數(shù)用于分析特征與特征之間的關(guān)系非常方便.當(dāng)然也可以自定義顏色.

這里涉及到的知識(shí)點(diǎn):
1)jointplot()函數(shù)
seaborn.jointplot(x,y,data = None,kind ='scatter',stat_func = <function pearsonr>,color = None,size = 6,ratio = 5,space = 0.2,dropna = True,xlim = None,ylim = None,joint_kws =無(wú),marginal_kws =無(wú),annot_kws =無(wú),** kwargs )
用雙變量和單變量圖繪制兩個(gè)變量的圖。

  • x,y:字符串或向量,數(shù)據(jù)或變量名稱data。
  • data : 當(dāng)x,y是變量名,DataFrame, 可選.

3.2HexBin圖

直方圖的雙變量類似物被稱為“hexbin”圖,因?yàn)樗@示了落在六邊形倉(cāng)內(nèi)的觀測(cè)數(shù)。該圖適用于較大的數(shù)據(jù)集。通過(guò)matplotlib plt.hexbin函數(shù)和jointplot()中的樣式可以實(shí)現(xiàn)。 它最好使用白色背景,可以更好的看出數(shù)據(jù)分布的一個(gè)規(guī)則.

散點(diǎn)圖可以查看什么樣的區(qū)域分布的點(diǎn)比較多?如果數(shù)據(jù)非常多的時(shí)候,點(diǎn)會(huì)非常密集,看不出來(lái)哪個(gè)點(diǎn)比較多?哪個(gè)點(diǎn)比較少?

數(shù)據(jù)量比較大的時(shí)候,最好設(shè)置jointplot()函數(shù)中的參數(shù)kind,設(shè)置為"hex",改變散點(diǎn)圖的查看方式.

案例代碼如下:

import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))


mean, cov = [0, 1], [(1, .5), (.5, 1)]
x,y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
    sns.jointplot(x=x, y=y,kind="hex", color="k")

輸出結(jié)果如下:



從輸出的結(jié)果可以看出,上側(cè)和右側(cè)均沒(méi)有變化,都有直方圖.數(shù)據(jù)量比較大的時(shí)候,這里通過(guò)顏色的差異,以此確定那一部分區(qū)域的散點(diǎn)圖更多一些.而普通的散點(diǎn)圖通過(guò)點(diǎn)的分布是很難查看出來(lái).而用"hex"查看方式,能夠很清晰的看到.顏色越深,出現(xiàn)的值越多,顏色越淺,出現(xiàn)的值越少.可以更好的看出兩個(gè)變量直接的相互關(guān)系是怎么樣的.

這里涉及到的知識(shí)點(diǎn):

  1. sns.jointplot(x=x, y=y, kind="hex", color="k")
    seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=<function pearsonr>, color=None, size=6, ratio=5, space=0.2, dropna=True, xlim=None, ylim=None, joint_kws=None, marginal_kws=None, annot_kws=None, **kwargs)
    • x,y:字符串或向量
    • kind:{“scatter”| “reg”| “resid”| “kde”| “hex”},可選,繪制的情節(jié)
    • color:matplotlib顏色,可選,用于繪圖元素的顏色

3.3呈現(xiàn)數(shù)據(jù)集中成對(duì)的關(guān)系

要在數(shù)據(jù)集中繪制多個(gè)成對(duì)雙變量分布,可以使用pairplot()函數(shù)。這將創(chuàng)建一個(gè)軸的矩陣,并顯示DataFrame中每對(duì)列的關(guān)系。默認(rèn)情況下,它也繪制每個(gè)變量在對(duì)角軸上的單變量:

比如這里有一份數(shù)據(jù)集,有4個(gè)特征,包含花瓣與花萼之間的關(guān)系.有花瓣的長(zhǎng)度和花瓣的寬度,花萼的長(zhǎng)度和花萼的寬度.反正當(dāng)成有4個(gè)特征就可以了.在這四個(gè)特征中,想查看兩兩之間的關(guān)系,pairplot()提供了非常便利的方法.

首先seaborn這個(gè)庫(kù)已經(jīng)內(nèi)置了"iris"這個(gè)數(shù)據(jù)集,我們可以直接使用這個(gè)數(shù)據(jù)集.如果不用這個(gè)數(shù)據(jù)集,也可以用pandas讀進(jìn)數(shù)據(jù)集也可以.這里用sns.pairplot()會(huì)將數(shù)據(jù)的特征兩兩之間的關(guān)系都畫出來(lái).

案例代碼如下:

import seaborn as sns
iris = sns.load_dataset("iris")
sns.pairplot(iris)

輸出結(jié)果如下:



從輸出結(jié)果可以看出,對(duì)角線是直方圖,其他位置是散點(diǎn)圖.對(duì)角線是直方圖的原因是兩個(gè)數(shù)據(jù)的特征均是同一個(gè)數(shù)據(jù)特征,對(duì)于單變量而言,就是一個(gè)直方圖.而不是對(duì)角線的圖,因?yàn)槭遣煌膬蓚€(gè)特征,所以用散點(diǎn)圖.

總結(jié),pairplot()對(duì)角線畫出的是直方圖,是同一個(gè)數(shù)據(jù)特征.而非對(duì)角線是散點(diǎn)圖,是兩個(gè)特征之間的相互關(guān)系的圖形.

這里涉及到的知識(shí)點(diǎn):
1)load_dataset("iris")與pairplot(iris)
這里的iris不是某個(gè)文件,而是seaborn自帶的展示用數(shù)據(jù)集,與
iris = sns.load_dataset("iris")與sns.pairplot(iris)這兩段代碼搭配使用.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容