
什麼是驗證性資料分析
與探索性資料分析(EDA)不同的地方在於,CDA 著重於驗證已提出的理論或假設,並透過統計方法進行精確的測試。
舉例來說:
- 行銷中我們可能想知道某廣告是否真的提升了銷售量
- 醫學研究中則可能想驗證某藥物是否改善患者的健康指標
這些問題都可以透過 CDA 方法進行驗證。
CDA 的基本流程
以下是 CDA 的建議流程:
- 進行 EDA:初步探索資料分布與特性。
- 提出假設:根據 EDA 發現形成可測試的假設。
- 選擇 CDA 方法:根據研究目的選擇合適的檢定或模型(如 t-test、迴歸分析)。
- 進行分析:驗證假設並解讀結果。
- 報告結果:清楚呈現分析過程與結論。
CDA 分析方法介紹
Python 常用套件準備
在 Python 中進行 CDA,我們可以使用以下套件:
- NumPy 和 Pandas:進行資料處理。
- 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
# ==============================================================================
迴歸分析結果說明
- Coefficients:解釋每個變數對目標值的影響,這邊指的是成績。
Intercept是截距,在這裡也可以解釋為 A 組的平均值。group_num的係數(4.3953)表示 B 組比 A 組多出 4.395 分。
- p-value:檢驗係數是否顯著。
group_num的 p-value(0.006)小於 0.05,表示 B 組的平均值顯著高於 A 組。
- 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 結果可以顯示各組之間的平均值差異及其顯著性。
- 表格解釋:
group1和group2:比較的兩組。meandiff:兩組的平均值差異。p-adj:調整後的 p-value(控制多重比較的第一型錯誤)。lower和upper:平均值差異的信賴區間(95% CI)。reject:是否拒絕虛無假設(True表示拒絕,顯著差異;False表示接受)。
- 結果分析:
- 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 的平均值存在顯著差異。
- 根據結果觀察組間差異:
- A 和 B 無顯著差異。
- A 和 C 存在顯著差異。
- B 和 C 存在顯著差異。
結論
透過 Python 的實作,我們可以快速進行 CDA 分析,從檢驗假設到模型擬合均可快速的完成。
無論是商業上的 A/B 測試,還是學術研究中的假設驗證,CDA 都是不可或缺的重要工具。
CDA 可以幫助我們對於資料的分布有更明確的掌握,其中也有更多詳細的分析說明,麥特在這邊只有進行簡單的說明,希望能夠讓更多的人認識 CDA,並對他有進一步的認識,也方便我們再拿到第一手資料的當下,能對資料的狀態更有把握唷!
也祝你在資料分析的旅程當中有所收穫~
