必讀文章!點贊、收藏!資料分析的多變數分析!

0 引言

上一篇文章介紹了資料分析中的單變數分析,但是我們在實際場景中,遇到的資料大多數是具有多特徵、多變數的,因此除了對單個變數進行分佈、缺失等情況的探索,還需要對變數與變數之間的關係進行探索,因此今天小編就介紹一下多變數分析,而多變數分析本質上還是雙變數的分析,所以小編會使用較大篇幅來進行雙變數分析的介紹,再簡單介紹一下多變數分析。

1 資料準備

本文中,小編在本地讀取了一個實驗所用的資料集,資料集沒有業務含義,只用於方法的講解。下圖展示了資料的前10行,由此檢視資料的大致情況:

必讀文章!點贊、收藏!資料分析的多變數分析!

本次資料共有v0~v9共10個特徵,其中v0、v1、v2是類別型變數,v3~v9是連續型變數。

2 雙變數分析

雙變數分析目的是為了探索變數之間的關係,來更好地發現規律或者進行特徵工程的建設。上文我們提到了變數可以分為連續型變數和類別型變數,因此根據變數型別的不同,雙變數分析組合也可以分為三種:連續型與連續型、連續型與類別型、類別型與類別型。

2。1 連續型與連續型

連續型與連續型變數的分析主要有兩種方法:迴歸分析和相關分析。其中迴歸分析主要的方法是散點圖和迴歸曲線,相關分析主要是計算相關性以及繪製相關性熱圖。

(1) 迴歸分析

迴歸分析主要使用散點圖+迴歸曲線進行觀察,單獨使用迴歸曲線用的比較少,因為在未知的情況下去觀察迴歸曲線的話,並不一定能得到有效的結果,而散點圖的形狀可以更加容易直觀地看出變數之間的關係是線性還是非線性,也能一定程度上判斷出相關程度。所以這裡我們用seaborn。regplot()方法繪製散點圖來檢視資料情況:

seaborn。regplot(x, y, data=None, ci=95, color=None, marker=’o’)

以下是是對幾個常用引數的說明:

x, y: 輸入變數。格式為字串、序列(series)或向量陣列(vector array)。如果是字串,應該與data中的列名相對應。 使用pandas物件時,軸將被Series的名字標記。

data: 資料集,型別為DataFrame,其中每列為一個變數,每行為一個觀測樣本。

color:(可選)用於選擇繪圖元素的顏色。

marker:(可選)用於散點圖的標記。

ci:(可選) 位於[0, 100]之間的整數或None,表示迴歸估計的置信區間的大小。表現在圖中為迴歸線周圍的半透明帶繪製。

下面就來實戰一下,選擇v3、v4列進行繪圖:

sns。regplot(x = “v3”, y = “v4”, data = data, color=‘green’, marker=‘*’)

plt。show()

必讀文章!點贊、收藏!資料分析的多變數分析!

直線附近的陰影區域為迴歸估計的置信區間,ci取值越大,陰影區域越大。圖中可以看到v3、v4線性關係並不強,散點圖分佈比較零散,沒有呈現線狀。

除了sns。regplot()方法,還有sns。jointplot()方法,用於繪製雙變數聯合分佈圖:

seaborn。jointplot(x,y,data=None,kind=‘scatter’)

x,y:分別記錄x軸與y軸的資料名稱

data:資料集,資料型別為DataFrame

kind:用於設定圖形的型別,可選的型別有:scatter、reg、resid、kde、hex,分別表示散點圖、迴歸圖、殘差圖、核密度圖和蜂巢圖

還是以v3、v4列進行繪圖:

sns。jointplot(x = “v3”, y = “v4”, data = data, kind=‘reg’)

plt。show()

必讀文章!點贊、收藏!資料分析的多變數分析!

從圖中就可以看到,sns。jointplot()其實就是在sns。regplot()圖的上方和左側再分別加上每個單變數的分佈,單變數的分佈在上一篇文章中有提到,可以用直方圖和核密度圖進行展示。

(2) 相關分析

散點圖能比較直觀地看出變數之間的關係,但是不能準確地量化變數之間的相關性,不能明確地反映變數關係的強弱。因為我們就可以用相關性來彌補散點圖的缺陷,對變數之間的關係進行量化分析。

相關性係數(Correlation)的取值範圍為[-1, 1],當Corr=1時,說明兩個變數強正線性相關;當Corr=0時,說明兩個變數不相關;當Corr=-1時,說明兩個變數強負線性相關。當然,我們在實踐的時候,並不會單純把變數的相關性分為以上三種,而是會把相關性取絕對值,再分別定義為無相關性(0-0。1)、弱相關(0。1-0。3)、中等相關(0。3-0。5)、強相關(0。5-1),其中,除了無相關性,其他三種又可以分為正負兩類。

對於相關性的計算,Python中有多種方法可以計算,比如NumPy包 的np。corrcoef()、Scipy包的scipy。stats。pearsonr(x, y) 、scipy。stats。spearmanr(x, y),還有就是pandas的x。corr(y),由於在平常資料分析用到pandas居多,所以小編這裡就講一下pandas:

data[‘v3’]。corr(data[‘v4’])

0。2289827482589131

可以看到v3、v4列的相關性為0。229,為弱相關。但是實際資料處理過程中,因為有多個特徵,所以我們一般不會兩個兩個特徵去分別計算相關性,我們可以直接以矩陣的形式計算出每一個特徵與其他所有特徵的相關性並以熱圖進行視覺化,具體計算方法在後文會介紹。

2。2 連續型與類別型

分析連續型與類別型變數的關係的思想:觀察對於類別型變數的不同類別,連續型變數的分佈情況。這個思想可以透過小提琴圖(Violin Plot)實現。小提琴圖是箱型圖與核密度估計圖的結合,它顯示了一個(或多個)分類變數多個屬性上的定量資料的分佈,從而可以比較這些分佈。與箱形圖不同,

其中所有繪圖單元都與實際資料點對應

,小提琴圖描述了基礎資料分佈的核密度估計。

seaborn。violinplot(x=None, y=None, hue=None, data=None)

x, y, hue:資料或向量資料中的變數名稱

data:DataFrame、陣列、陣列列表

這裡對引數的介紹比較簡單,想進一步瞭解的讀者可以移步官網。

前文提到了v0、v1、v2是類別型變數,所以小編就繪製v0和v3變數之間的小提琴圖:

sns。violinplot(x = “v0”, y = “v3”, data = data)

plt。show()

必讀文章!點贊、收藏!資料分析的多變數分析!

可以看到,變數v0共有0。0~7。0八個類別,每個類別分別對應的v3變數的分佈都不相同,由此可以對比在不同類別的情況下,連續變數v0的分佈情況。

2。3 類別型與類別型

類別型變數之間也存在多種分析方法,如卡方檢驗、小提琴圖、雙向表、堆疊柱狀圖。本文中小編會介紹小提琴圖以及卡方檢驗。

首先,繪製v0和v1變數之間的小提琴圖:

必讀文章!點贊、收藏!資料分析的多變數分析!

卡方檢驗用於屬於假設檢驗的一種,即比較理論頻次與實際頻次的吻合程度,這樣可以分析變數的擬合程度,如擬合優度檢驗。由於我們的資料中沒有對應的理論資料去檢驗相應的類別型變數,便不進行程式碼演示了。但是需要了解一下卡方檢驗的計算方法,可以用scipy包的stats模組中的chisquare()函式,又或者sklearn中的chi2方法。

3 多變數分析

有人可能疑問了,為啥把雙變數單獨列出來,雙變數難道不屬於多變數嗎?其實雙變數是屬於多變數的,但是由於雙變數分析的重要性,小編將雙變數分析單獨列出來講解,多次的雙變數分析就可以組成多變數分析,所以多變數分析實際上就是將多次的雙變數分析工作整合在了一起。雙變數分析用於你想了解兩個變數的關係,此時其實你已經確實你需要分析哪兩個變量了,而多變數分析可以用於你不知道哪些變數需要分析、哪些變數之間有相關性,則你就可以直接用一個多變數分析來觀察哪些變數有相關性從而進行進一步的分析。

3。1 多連續型

在上面提到了可以用散點圖觀察變數之間是否存線上性關係,而seaborn中同樣有方法seaborn。pairplot()可以以矩陣的形式呈現變數與其他所有變數之間的散點圖,由於散點圖比較適用於連續型變數之間,因此我們先把連續型變數選出來:

numeric_features = [‘v3’, ‘v4’, ‘v5’, ‘v6’, ‘v7’, ‘v8’, ‘v9’]

data_numeric = data[numeric_features]

再用seaborn。pairplot()方法進行散點圖矩陣視覺化:

seaborn。pairplot(data,kind=‘scatter’, diag_kind=‘auto’)

data:資料框架,其中每列是變數,每行是觀察量。

kind:(可選){‘scatter’, ‘reg’}。一種非等同關係的圖型別。

diag_kind:(可選){‘auto’, ‘hist’, ‘kde’}, 對角線子圖的一種圖形。

必讀文章!點贊、收藏!資料分析的多變數分析!

可以看到,整個矩陣中對角線呈現的是單個變數的核密度曲線,這個由diag_kind控制;其他的圖都是某變數與其他變數的散點圖,由kind控制。pairplot()圖可以直接觀察所有連續變數是否存線上性關係。

再計算連續型變數相關性並用熱度圖進行視覺化:

correlation = data_numeric。corr()

print(correlation)

v3 v4 v5 v6 v7 v8 v9

v3 1。000000 0。228983 -0。385337 -0。714666 -0。233040 0。692692 0。230217

v4 0。228983 1。000000 0。081398 0。007328 -0。017709 0。047354 0。999474

v5 -0。385337 0。081398 1。000000 -0。052123 -0。046994 -0。909977 0。104331

v6 -0。714666 0。007328 -0。052123 1。000000 -0。020796 -0。200386 0。006363

v7 -0。233040 -0。017709 -0。046994 -0。020796 1。000000 -0。230853 -0。029284

v8 0。692692 0。047354 -0。909977 -0。200386 -0。230853 1。000000 0。031585

v9 0。230217 0。999474 0。104331 0。006363 -0。029284 0。031585 1。000000

然後再進行視覺化,使用的方法為seaborn。heatmap():

seaborn。heatmap(data, vmin=None, vmax=None, square=False)

data:矩形資料集。可以強制轉換為 ndarray格式資料的 2 維資料集。如果提供了DataFrame 資料,索引/列資訊將用於標記列和行。

vmin, vmax:浮點型資料,可選引數。用於錨定色彩對映的值,否則它們是從資料和其他關鍵字引數推斷出來的。

square:布林值,可選引數。如果為True,則將座標軸方向設定為“equal”,以使每個單元格為方形。

plt。figure(figsize = (7, 7))

sns。heatmap(correlation,square = True)

必讀文章!點贊、收藏!資料分析的多變數分析!

3。2 多類別型

多個類別型變數的觀察不像連續型變數那樣靈活,一般可以透過小提琴圖或或者多柱狀圖進行視覺化。

其中,多柱狀圖可以透過seaborn。FacetGrid()來繪製在同一個網格中,該方法用於繪製條件關係的多圖網格,感興趣的讀者可以移步官網進行學習。

def count_plot(x, **kwargs):

sns。countplot(x=x)

f = pd。melt(data, value_vars=categorical_features)

g = sns。FacetGrid(f, col=“variable”, sharex=False, sharey=False, size=5)

g = g。map(count_plot, “value”)

必讀文章!點贊、收藏!資料分析的多變數分析!

但是多個count_plot圖只是單純把幾個圖集中在一起,不用一個個分別繪製了而已,卻無法進一步觀察變數之間的關係,所以可以使用上文提到小提琴圖進行多變數關係的繪製,具體如下:

plt。figure(figsize=(10,6))

sns。violinplot(x=“v0”, y=“v1”, hue=“v2”,data=data)

必讀文章!點贊、收藏!資料分析的多變數分析!

從圖中可以觀察v2=0和v2=1時,v0變化時v1的分佈變化情況,再來做進一步分析。

需要資料,請私信博主,傳送

多變數分析資料 即可領取實驗資料!