
在開始進行資料分析之前,我們可以透過一些方法來衡量各變數之間的線性或非線性關係,以此找出變數之間的關聯強度和方向。
這個過程可以幫助我們:
- 資料探索:初步分析變數之間的關聯,篩選出重要特徵。
- 預測建模:幫助選擇相關變數進行建模。
- 變數篩選:根據相關性篩選出對目標變數有顯著影響的特徵。
# 可使用目錄功能快速確認要閱覽的主題
理解數據
首先,在進行資料專案前,需要對數據集有一個全面的了解,包括特徵的類型和數據分佈。
理解數據能幫助我們在尋找資料間的關聯時,有更多的線索可以參考,或是分辨判斷結果的合理性。
以鐵達尼號存活預測的數據為例:
import pandas as pd
import numpy as np
df = pd.read_csv('https://raw.githubusercontent.com/dsindy/kaggle-titanic/master/data/train.csv')
print(df.describe())
print(df.info())
print(df.isnull().sum())



從上面的資訊,我們大概可以知道我們有哪些欄位,分別紀錄著哪些資料,包括特徵的類型和數據分佈,數據的摘要統計信息,以及它們的缺失值狀況。
針對缺失值的處理可以參考:
【資料分析】python資料處理-缺失值處理基礎操作語法彙整
df.describe()
的輸出
df.describe()
默認情況下只會計算數值型列的統計信息。輸出的描述性統計信息包括以下幾個指標:
- count:非空值的數量
- mean:均值
- std:標準差
- min:最小值
- 25%:第一四分位數(25th percentile)
- 50%:中位數(50th percentile)
- 75%:第三四分位數(75th percentile)
- max:最大值

以鐵達尼號的摘要統計信息可以先對資料有初步的理解:
- Survived 的基本統計
- 平均值為0.383838,表示大約 38.4% 的乘客生還。
- Pclass(票務等級)有三個不同的值(1、2、3),表示不同的艙等。
- 平均值為 2.308642,表示大多數乘客在較低等級的艙等。
- Age 的範圍從 0.42 到 80。
- 平均值為 29.699118,標準差為 14.526497,表示乘客年齡的分佈情況。
- SibSp(兄弟姐妹/配偶數量)的範圍從 0 到 8。
- 平均值為 0.523008,標準差為 1.102743,表示大多數乘客沒有或只有少數兄弟姐妹/配偶同船。
- Parch(父母/子女人數)的範圍從 0 到 6。
- 平均值為 0.381594,標準差為 0.806057,表示大多數乘客沒有或只有少數父母/子女同船。
- Fare(票價)的範圍從 0 到 512.329200。
- 平均值為 32.204208,標準差為 49.693429,表示票價的分佈具有較大的變異性。
- Age 和 Fare 有較大的標準差,這意味著這些特徵的值範圍較廣,可能需要進一步處理(如標準化或對數變換)。
- SibSp 和 Parch 具有較多的零值,這可能需要進一步分析它們對目標變數的影響。
利用相關矩陣來確認各變數間的關聯
相關矩陣(Correlation Matrix)是一種用於展示多個變數之間兩兩相關性的表格,相關矩陣有許多用途,以下是一些主要用途的詳細說明。
在資料科學中的用途
- 1. 資料探索和理解:
- 識別變數之間的關係:相關矩陣可以幫助你快速識別資料集中變數之間的相關性。通過觀察相關矩陣中的值,你可以了解哪些變數之間存在強相關性,這對資料理解非常有幫助。
- 發現潛在的問題:例如,多重共線性問題(當多個自變數之間存在高度相關性時),可能會影響迴歸模型的穩定性和解釋性。
- 2. 特徵選擇:
- 篩選重要特徵:在機器學習和統計建模中,相關矩陣可以幫助你篩選出對目標變數影響較大的特徵。你可以選擇與目標變數高度相關的特徵來進行建模。
- 移除冗餘特徵:當兩個或多個特徵之間存在高度相關性時,可以考慮移除一些冗餘特徵,以減少模型的複雜度。
- 3. 資料可視化:
- 熱圖(Heatmap):相關矩陣經常與熱圖結合使用,以視覺化展示變數之間的相關性。這樣可以幫助你更直觀地觀察變數之間的關係。
- 4. 模型評估和診斷:
- 檢查多重共線性:在迴歸分析中,檢查自變數之間的相關性,以發現多重共線性問題。高共線性可能導致回歸係數的不穩定,影響模型的解釋性和預測性能。
- 選擇適當的變數:根據相關矩陣中的信息,選擇適當的變數來構建更穩定和有效的模型。
- 5. 時間序列分析:
- 多變量時間序列分析:相關矩陣可以用於多變量時間序列資料的分析,幫助理解不同時間序列之間的相互關係。
使用範例
import seaborn as sns
import matplotlib.pyplot as plt
# 使用皮爾森相關係數來計算相關矩陣
correlation_matrix = df.corr()
# 繪製熱力圖
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.show()

correlation_matrix = df.corr() 這段程式碼計算的是數據集中各特徵之間的相關矩陣(correlation matrix),不指定方法時,默認方法為皮爾森相關係數
。
皮爾森相關係數(Pearson Correlation Coefficient)是一種衡量兩個變數之間線性相關程度的統計指標。它的取值範圍在-1到1之間,其中:
- 1 表示完全正相關,即一個變數增加,另一個變數也增加。
- -1 表示完全負相關,即一個變數增加,另一個變數減少。
- 0 表示沒有線性相關。
由上述例子可以看到,與特徵 'Survived'
最有正相關的特徵是 'Fare'
,
意即票價越高的乘客,他生存的機率越高,
與'Survived'
最有負相關的特徵是 'Sex'
,
意即女性的生存機率高於男性。
皮爾森相關係數的運作原理可以參考:
使用範例二
# 針對目標變數使用皮爾森相關係數確認所有變數與目標變數的關聯
features = pd.Series(df_analysis.columns)
print(df[features].corrwith(df.Survived).sort_values(ascending=False))
"""
Survived 1.000000
Fare 0.257307
Embarked_C 0.168240
Parch 0.081629
Embarked_Q 0.003650
SibSp -0.035322
Age -0.080453
Embarked_S -0.149683
Pclass -0.338481
Sex -0.543351
dtype: float64
"""
更多相關矩陣方法
import pandas as pd
# 使用皮爾森相關係數(默認)
pearson_corr = df.corr(method='pearson')
print(pearson_corr)
# 使用肯德爾相關係數
kendall_corr = df.corr(method='kendall')
print(kendall_corr)
# 使用斯皮爾曼相關係數
spearman_corr = df.corr(method='spearman')
print(spearman_corr)
- Pearson(皮爾森)相關係數:
- 計算線性相關性。
- 取值範圍在 -1 和 1 之間。
- 默認方法。
- Kendall(肯德爾)相關係數:
- 計算排序相關性。
- 取值範圍在 -1 和 1 之間。
- 適用於非線性但單調的數據。
- Spearman(斯皮爾曼)相關係數:
- 計算排名相關性。
- 取值範圍在 -1 和 1 之間。
- 適用於非線性但單調的數據。
各方法的是用情境
- 皮爾森相關係數:適用於測量兩個連續變量之間的線性關係。假設數據是正態分佈的。
- 肯德爾相關係數:適用於測量兩個變量之間的排序一致性,對於樣本量較小且包含許多相同值的數據集效果更好。
- 斯皮爾曼相關係數:適用於測量兩個變量之間的單調關係,對於數據分佈非正態或存在離群點的數據集更為穩健。
利用相互資訊(MI)來衡量變數之間的依賴程度
互資訊(Mutual Information, MI)是一種用於衡量兩個變數之間的依賴程度的統計量。它來自於資訊理論,用於判斷一個變數對於另一個變數的資訊量,即了解一個變數後可以減少多少不確定性。互資訊在特徵選擇、特徵工程和建模中有廣泛應用。
MI 的值是非負值的,且沒有上限。MI 為 0 表示兩個變數完全獨立,值越大表示依賴性越強。
相互資訊的運作原理可以參考:
在資料科學中的用途
- 特徵選擇:相互資訊可以用來選擇與目標變數最相關的特徵,篩選出有助於預測的變數。
- 在特徵選擇中,將計算得到的互資訊值排序,選擇前幾個最相關的特徵。
- 特徵工程:相互資訊可以幫助識別和創建新特徵。
- 例如,根據互資訊結果,我們可以嘗試創建一些組合特徵來提高模型的表現。
- 建模:在構建機器學習模型時,可以使用相互資訊來評估特徵的重要性。
- 這有助於理解特徵對模型預測的影響,並進一步調整特徵工程和模型參數。
使用範例
import pandas as pd
from sklearn.feature_selection import mutual_info_classif
# 以鐵達尼號資料集為例,取出特徵變數 X 和目標變數 y
X = df.drop('Survived', axis=1)
y = df['Survived']
# 計算互資訊
mi = mutual_info_classif(X, y)
# 將結果轉為 DataFrame 以便查看
mi_df = pd.DataFrame(mi, index=X.columns, columns=['Mutual Information'])
print(mi_df.sort_values(by='Mutual Information', ascending=False))
"""
Mutual Information
Sex 0.136510
Fare 0.125579
Pclass 0.055062
Age 0.044215
Parch 0.021041
Embarked_Q 0.017950
SibSp 0.013410
Embarked_C 0.000000
Embarked_S 0.000000
"""
回歸問題與分類問題
當目標變數是分類變數時,使用mutual_info_classif
當目標變數是連續變數時,使用mutual_info_regression
# 分類問題示例
import pandas as pd
from sklearn.feature_selection import mutual_info_classif
# 假設我們有一個 DataFrame df,包含特徵變數 X 和目標變數 y
X = df.drop('target', axis=1)
y = df['target']
# 計算互資訊
mi = mutual_info_classif(X, y)
# 將結果轉為 DataFrame 以便查看
mi_df = pd.DataFrame(mi, index=X.columns, columns=['Mutual Information'])
print(mi_df.sort_values(by='Mutual Information', ascending=False))
# 回歸問題示例
from sklearn.feature_selection import mutual_info_regression
# 假設我們有一個 DataFrame df,包含特徵變數 X 和連續目標變數 y
X = df.drop('target', axis=1)
y = df['target']
# 計算互資訊
mi = mutual_info_regression(X, y)
# 將結果轉為 DataFrame 以便查看
mi_df = pd.DataFrame(mi, index=X.columns, columns=['Mutual Information'])
print(mi_df.sort_values(by='Mutual Information', ascending=False))
- 使用
mutual_info_classif
:- 當你的目標變數是分類變數時,使用這個函數。
- 例如,當你要預測的目標變數是類別標籤(例如"是/否","紅色/藍色/綠色"等),這時候你的目標變數是離散的。
- 使用
mutual_info_regression
:- 當你的目標變數是連續變數時,使用這個函數。
- 例如,當你要預測的目標變數是某個數值(例如房價、溫度等),這時候你的目標變數是連續的。