在開始進行資料分析之前,我們可以透過一些方法來衡量各變數之間的線性或非線性關係,以此找出變數之間的關聯強度和方向。
這個過程可以幫助我們:
# 可使用目錄功能快速確認要閱覽的主題
首先,在進行資料專案前,需要對數據集有一個全面的了解,包括特徵的類型和數據分佈。
理解數據能幫助我們在尋找資料間的關聯時,有更多的線索可以參考,或是分辨判斷結果的合理性。
以鐵達尼號存活預測的數據為例:
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()
默認情況下只會計算數值型列的統計信息。輸出的描述性統計信息包括以下幾個指標:
以鐵達尼號的摘要統計信息可以先對資料有初步的理解:
相關矩陣(Correlation Matrix)是一種用於展示多個變數之間兩兩相關性的表格,相關矩陣有許多用途,以下是一些主要用途的詳細說明。
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之間,其中:
由上述例子可以看到,與特徵 '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)
各方法的是用情境
互資訊(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
: