驗證性資料分析(CDA): 對新手友善的 Python 教學

驗證性資料分析(Confirmatory Data Analysis, CDA)是一種以假設為導向的資料分析方法,主要用於驗證或拒絕事前提出的假設。

什麼是驗證性資料分析

與探索性資料分析(EDA)不同的地方在於,CDA 著重於驗證已提出的理論或假設,並透過統計方法進行精確的測試。

舉例來說:

  • 行銷中我們可能想知道某廣告是否真的提升了銷售量
  • 醫學研究中則可能想驗證某藥物是否改善患者的健康指標

這些問題都可以透過 CDA 方法進行驗證。


CDA 的基本流程

以下是 CDA 的建議流程:

  1. 進行 EDA:初步探索資料分布與特性。
  2. 提出假設:根據 EDA 發現形成可測試的假設。
  3. 選擇 CDA 方法:根據研究目的選擇合適的檢定或模型(如 t-test、迴歸分析)。
  4. 進行分析:驗證假設並解讀結果。
  5. 報告結果:清楚呈現分析過程與結論。

CDA 分析方法介紹

Python 常用套件準備

在 Python 中進行 CDA,我們可以使用以下套件:

  • NumPyPandas:進行資料處理。
  • SciPy:用來進行假設檢定。
  • Statsmodels:進行迴歸分析和模型擬合。

在python環境一開始我們先載入需要的套件

import numpy as np
import pandas as pd
from scipy import stats
import statsmodels.api as sm
import statsmodels.formula.api as smf

範例資料與假設設計

假設我們有兩組資料(各30筆),分別代表 A 和 B 兩組的測試分數,並希望檢驗 B 組的平均分數是否高於 A 組。

# 模擬資料
np.random.seed(123)
group_A = np.random.normal(loc=50, scale=10, size=30)
group_B = np.random.normal(loc=55, scale=10, size=30)

data = pd.DataFrame({
    "value": np.concatenate([group_A, group_B]),
    "group": ["A"]*30 + ["B"]*30
})

# 隨機打印 10 筆資料
random_data = data.sample(n=10)
print(random_data)

#         value group
# 42  51.091002     B
# 49  77.381433     B
# 2   52.829785     A
# 24  37.461193     A
# 18  60.040539     A
# 51  44.612118     B
# 39  57.836273     B
# 41  37.723305     B
# 47  59.129122     B
# 43  60.738059     B

t-test 教學

假設檢定會有兩種假設推論,一般來說我們會先估計H₀(虛無假設),在設計H₀(虛無假設)的時候,我們要設計的論點是不需要有實際證據支持的論點,所以我這邊設計的推論是

假設:

  • H₀(虛無假設):兩組平均值沒有差異。
  • H₁(對立假設):B 組平均值高於 A 組。

我們可以使用 stats 套件來進行 t-test 檢驗兩組平均值是否有顯著差異。

t_stat, p_value = stats.ttest_ind(group_B, group_A, alternative='greater')
print(f"t={t_stat:.3f}, p={p_value:.3f}")

# t=1.910, p=0.031

若 p-value 小於 0.05,則表示我們可以拒絕 H₀,這邊的結果顯示 B 組的平均分數顯著高於 A 組。


迴歸分析教學

迴歸分析是一種常見的 CDA 方法,用於檢驗變數之間的關係。以下範例展示如何使用線性迴歸模型檢驗兩組分數的差異。

在這邊我們使用 smf.ols 是 Python 的 statsmodels.formula.api 模組中的方法,用於執行最小平方法(Ordinary Least Squares, OLS)的線性迴歸模型。

data["group_num"] = data["group"].map({"A": 0, "B": 1})

model = smf.ols("value ~ group_num", data=data).fit()
print(model.summary())

#                             OLS Regression Results                            
# ==============================================================================
# Dep. Variable:                  value   R-squared:                       0.126
# Model:                            OLS   Adj. R-squared:                  0.111
# Method:                 Least Squares   F-statistic:                     8.391
# Date:                Tue, 10 Oct 2023   Prob (F-statistic):            0.00590
# Time:                        00:00:00   Log-Likelihood:                -139.99
# No. Observations:                  60   AIC:                             284.0
# Df Residuals:                      58   BIC:                             287.8
# Df Model:                           1                                         
# Covariance Type:            nonrobust                                         
# ==============================================================================
#                  coef    std err          t      P>|t|      [0.025      0.975]
# ------------------------------------------------------------------------------
# Intercept     50.2156      1.820     27.601      0.000      46.573      53.858
# group_num      4.3953      1.519      2.896      0.006       1.356       7.435
# ==============================================================================

迴歸分析結果說明

  1. Coefficients:解釋每個變數對目標值的影響,這邊指的是成績。
    • Intercept 是截距,在這裡也可以解釋為 A 組的平均值。
    • group_num 的係數(4.3953)表示 B 組比 A 組多出 4.395 分。
  2. p-value:檢驗係數是否顯著。
    • group_num 的 p-value(0.006)小於 0.05,表示 B 組的平均值顯著高於 A 組。
  3. R-squared:模型擬合程度。
    • R-squared 為 0.126,說明模型僅能解釋 12.6% 的資料變異。

多組比較:Tukey HSD 教學

當有多組資料時,可以使用 Tukey HSD 測試來進行多重比較。

# 建立第三組資料 group_C
group_C = np.random.normal(loc=60, scale=10, size=30)

data_multi = pd.DataFrame({
    "value": np.concatenate([group_A, group_B, group_C]),
    "group": ["A"]*30 + ["B"]*30 + ["C"]*30
})

from statsmodels.stats.multicomp import pairwise_tukeyhsd

tukey = pairwise_tukeyhsd(endog=data_multi["value"], groups=data_multi["group"], alpha=0.05)
print(tukey)

#  Multiple Comparison of Means - Tukey HSD, FWER=0.05 
# ====================================================
# group1 group2 meandiff p-adj   lower    upper  reject
# ----------------------------------------------------
#      A      B   4.3953 0.0708  -0.3353   9.1259  False
#      A      C   9.7846  0.001   4.9538  14.6153   True
#      B      C   5.3892 0.0207   0.5584  10.2199   True
# ----------------------------------------------------

Tukey HSD 結果可以顯示各組之間的平均值差異及其顯著性。

  1. 表格解釋
    • group1 和 group2:比較的兩組。
    • meandiff:兩組的平均值差異。
    • p-adj:調整後的 p-value(控制多重比較的第一型錯誤)。
    • lower 和 upper:平均值差異的信賴區間(95% CI)。
    • reject:是否拒絕虛無假設(True 表示拒絕,顯著差異;False 表示接受)。
  2. 結果分析
    • A vs B:平均值差異為 4.3953,p-value 為 0.0708(> 0.05),不顯著,無法拒絕虛無假設。
    • A vs C:平均值差異為 9.7846,p-value 為 0.001(< 0.05),顯著,表示 A 和 C 的平均值存在顯著差異。
    • B vs C:平均值差異為 5.3892,p-value 為 0.0207(< 0.05),顯著,表示 B 和 C 的平均值存在顯著差異。
  3. 根據結果觀察組間差異:
    • A 和 B 無顯著差異。
    • A 和 C 存在顯著差異。
    • B 和 C 存在顯著差異。

結論

透過 Python 的實作,我們可以快速進行 CDA 分析,從檢驗假設到模型擬合均可快速的完成。

無論是商業上的 A/B 測試,還是學術研究中的假設驗證,CDA 都是不可或缺的重要工具。

CDA 可以幫助我們對於資料的分布有更明確的掌握,其中也有更多詳細的分析說明,麥特在這邊只有進行簡單的說明,希望能夠讓更多的人認識 CDA,並對他有進一步的認識,也方便我們再拿到第一手資料的當下,能對資料的狀態更有把握唷!

也祝你在資料分析的旅程當中有所收穫~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *