更新於 2024/08/11閱讀時間約 13 分鐘

【資料分析】資料分析起手式,理解數據並使用python找到資料間的關聯

raw-image

在開始進行資料分析之前,我們可以透過一些方法來衡量各變數之間的線性或非線性關係,以此找出變數之間的關聯強度和方向。

這個過程可以幫助我們:

  • 資料探索:初步分析變數之間的關聯,篩選出重要特徵。
  • 預測建模:幫助選擇相關變數進行建模。
  • 變數篩選:根據相關性篩選出對目標變數有顯著影響的特徵。


# 可使用目錄功能快速確認要閱覽的主題


理解數據

首先,在進行資料專案前,需要對數據集有一個全面的了解,包括特徵的類型和數據分佈。

理解數據能幫助我們在尋找資料間的關聯時,有更多的線索可以參考,或是分辨判斷結果的合理性。

以鐵達尼號存活預測的數據為例:

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:最大值

以鐵達尼號的摘要統計信息可以先對資料有初步的理解:

  1. Survived 的基本統計
  • 平均值為0.383838,表示大約 38.4% 的乘客生還。
  1. Pclass(票務等級)有三個不同的值(1、2、3),表示不同的艙等。
  • 平均值為 2.308642,表示大多數乘客在較低等級的艙等。
  1. Age 的範圍從 0.42 到 80。
  • 平均值為 29.699118,標準差為 14.526497,表示乘客年齡的分佈情況。
  1. SibSp(兄弟姐妹/配偶數量)的範圍從 0 到 8。
  • 平均值為 0.523008,標準差為 1.102743,表示大多數乘客沒有或只有少數兄弟姐妹/配偶同船。
  1. Parch(父母/子女人數)的範圍從 0 到 6。
  • 平均值為 0.381594,標準差為 0.806057,表示大多數乘客沒有或只有少數父母/子女同船。
  1. Fare(票價)的範圍從 0 到 512.329200。
  • 平均值為 32.204208,標準差為 49.693429,表示票價的分佈具有較大的變異性。
  1. AgeFare 有較大的標準差,這意味著這些特徵的值範圍較廣,可能需要進一步處理(如標準化或對數變換)。
  2. SibSpParch 具有較多的零值,這可能需要進一步分析它們對目標變數的影響。


利用相關矩陣來確認各變數間的關聯

相關矩陣(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 表示兩個變數完全獨立,值越大表示依賴性越強。


相互資訊的運作原理可以參考:

相互資訊


在資料科學中的用途

  1. 特徵選擇:相互資訊可以用來選擇與目標變數最相關的特徵,篩選出有助於預測的變數。
    • 在特徵選擇中,將計算得到的互資訊值排序,選擇前幾個最相關的特徵。
  2. 特徵工程:相互資訊可以幫助識別和創建新特徵。
    • 例如,根據互資訊結果,我們可以嘗試創建一些組合特徵來提高模型的表現。
  3. 建模:在構建機器學習模型時,可以使用相互資訊來評估特徵的重要性。
    • 這有助於理解特徵對模型預測的影響,並進一步調整特徵工程和模型參數。


使用範例

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
    • 當你的目標變數是連續變數時,使用這個函數。
    • 例如,當你要預測的目標變數是某個數值(例如房價、溫度等),這時候你的目標變數是連續的。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.