点赞、收藏必读文章--数据分析的多变量分析
數據探索性分析(EDA)——多(雙)變量分析
0 引言
上一篇文章震驚!Python單變量分析竟然如此簡單?
介紹了數據分析中的單變量分析,但是我們在實際場景中,遇到的數據大多數是具有多特征、多變量的,因此除了對單個變量進行分布、缺失等情況的探索,還需要對變量與變量之間的關系進行探索,因此今天小編就介紹一下多變量分析,而多變量分析本質上還是雙變量的分析,所以小編會使用較大篇幅來進行雙變量分析的介紹,再簡單介紹一下多變量分析。
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”,以使每個單元格為方形。
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的分布變化情況,再來做進一步分析。
如果需要小編使用的實驗數據,可以私信小編哦!
總結
以上是生活随笔為你收集整理的点赞、收藏必读文章--数据分析的多变量分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【vue2中引入阿里第三方图标库使用自定
- 下一篇: 阿联酋研发新冠病毒快速激光检测技术