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

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

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

課程來源: python數(shù)據(jù)分析與機器學習實戰(zhàn)-唐宇迪

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

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

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

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

2.單變量分布

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

做單特征分析的一種很簡單的情況就是將該特征的分布情況拿出來,看一下當前特征的分布狀況分布是什么樣的?

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

2.1直方圖

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

為了說明這一點,我們刪除密度曲線并添加了地毯圖,每個觀察點繪制一個小的垂直刻度。您可以使用rugplot()函數(shù)來制作地毯圖,但它也可以在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é)果如下:


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

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

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

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

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

例如:
當不使用seed的情況下,每次隨機數(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 ]

當使用seed的情況下,每次隨機數(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,此概率分布的均值(對應著整個分布的中心centre)
  • scale:float,此概率分布的標準差(對應于分布的寬度,scale越大越矮胖,scale越小,越瘦高)
  • size:int or tuple of ints,輸出的shape,默認為None,只輸出一個值
    我們更經(jīng)常會用到的np.random.randn(size)所謂標準正態(tài)分布(μ=0,σ=1μ=0,σ=1),對應于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,可選.是否繪制高斯核密度估計,默認繪制.

2.2擬合參數(shù)分布

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

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

需要將distplot()中的參數(shù)fit寫進來,比如fit=stats.gamma,fit是統(tǒng)計的一個指標,可以看清楚當前的數(shù)據(jù)是在某一個統(tǒng)計指標下它的一個分步狀態(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é)果如下:


這里涉及到知識點

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

    • scale:float或float_like,可選,伽瑪分布的范圍。應該大于零。默認值等于1。

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

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


參考鏈接: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,可選.是否繪制高斯核密度估計,默認繪制.
    • fit:控制擬合的參數(shù)分布圖形
  2. from scipy import stats,integrate

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

mean是均值,cov是協(xié)方差,想根據(jù)均值以及協(xié)方差通過numpy這個庫,生成一組二維數(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ù)是單變量,只需要分析一維,對數(shù)據(jù)分析而說,通查要看數(shù)據(jù)特征以及數(shù)據(jù)特征之間的關(guān)系.對二維數(shù)據(jù)來說,比如x,y數(shù)據(jù)之間的特征關(guān)系是什么樣的?要分析特征以及特征之間的一個內(nèi)部的聯(lián)系,最好使用的方法是散點圖.單特征最好使用直方圖描述.

這里涉及到知識點:

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

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

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

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

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

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

3.雙變量分布

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

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

3.1繪制雙變量分布

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

這里的x="x", y="y", 分別表示x維度,y維度,然后data=df,df表示的是傳進來的數(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)系畫出來,也將x,y分別自身的狀況也畫出來,此外相關(guān)系數(shù)也計算出來.jointplot()函數(shù)用于分析特征與特征之間的關(guā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 =無,marginal_kws =無,annot_kws =無,** kwargs )
用雙變量和單變量圖繪制兩個變量的圖。

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

3.2HexBin圖

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

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

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

案例代碼如下:

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è)均沒有變化,都有直方圖.數(shù)據(jù)量比較大的時候,這里通過顏色的差異,以此確定那一部分區(qū)域的散點圖更多一些.而普通的散點圖通過點的分布是很難查看出來.而用"hex"查看方式,能夠很清晰的看到.顏色越深,出現(xiàn)的值越多,顏色越淺,出現(xiàn)的值越少.可以更好的看出兩個變量直接的相互關(guā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ù)集中成對的關(guān)系

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

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

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

案例代碼如下:

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

輸出結(jié)果如下:



從輸出結(jié)果可以看出,對角線是直方圖,其他位置是散點圖.對角線是直方圖的原因是兩個數(shù)據(jù)的特征均是同一個數(shù)據(jù)特征,對于單變量而言,就是一個直方圖.而不是對角線的圖,因為是不同的兩個特征,所以用散點圖.

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

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

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

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

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