自由度在資料科學中雖然重要性不如傳統統計分析,但在處理分類別變數和避免多重共線性問題時仍需注意。ANOVA 則適用於比較多組資料,例如 A/B 測試,用於判斷組間差異是否顯著。排列檢驗提供了一種非引數方法來評估組間差異,而 F 統計量則用於衡量組間變異與組內變異的比例。理解變異數分解有助於深入理解 ANOVA 的原理。此外,文章也介紹了多因素 ANOVA 的應用,用於分析多個因素對結果變數的影響。卡方檢定則是用於評估觀察到的計數資料與預期分佈之間的差異,常用於分析分類別資料,例如比較不同廣告點選率。重抽樣方法提供了一種非引數方法來計算卡方檢定的 p 值,而卡方分佈則提供了理論基礎。費雪精確檢定適用於小樣本或稀疏資料,可以提供更準確的結果。

自由度與 ANOVA 分析在資料科學中的應用

在統計學中,自由度(degrees of freedom)是一個重要的概念,尤其是在傳統的統計假設檢定中扮演關鍵角色。然而,在資料科學的領域裡,自由度的實際應用價值相對有限,主要因為資料規模通常較大,使得某些統計細節的影響變得微不足道。

自由度的定義與重要性

  • 自由度(d.f.):用於標準化測試統計量,使其能與參考分佈(如 t 分佈、F 分佈)進行比較。
  • 當處理分類別變數並將其轉換為二元指標(dummy variables)時,自由度的概念至關重要,以避免多重共線性問題。

關鍵觀念

  • 自由度是標準化測試統計量的一部分,用於與參考分佈進行比較。
  • 在迴歸分析中,將分類別變數分解為 n-1 個指標變數,以避免多重共線性。

ANOVA 分析:多組資料的比較

當需要比較多組資料(如 A/B/C/D 測試)時,ANOVA(分析變異數)是一種合適的統計方法,用於檢測這些組別之間是否存在顯著差異。

ANOVA 的關鍵術語

  • 成對比較(Pairwise comparison):對多組資料中的任意兩組進行假設檢定。
  • 整體檢定(Omnibus test):對多組平均值之間的整體變異進行單一假設檢定。
  • 變異數分解(Decomposition of variance):將個別資料值分解為多個組成部分,如整體平均值、處理平均值和殘差誤差。
  • F 統計量(F-statistic):衡量組間平均值差異是否超出偶然性預期的標準化統計量。
  • 平方和(SS):指資料對於某個平均值的偏差平方和。

網頁黏著度測試例項

假設我們有四個不同的網頁設計,並希望比較它們的黏著度(以訪客停留時間衡量)。每個網頁隨機展示給五位訪客,資料如下表所示:

| 網頁 1 | 網頁 2 | 網頁 3 | 網頁 4 | |


-|


-|


-|


-| | 164 | 178 | 175 | 155 | | 172 | 191 | 193 | 166 | | 177 | 182 | 171 | 164 | | 156 | 185 | 163 | 170 | | 195 | 177 | 176 | 168 | | 平均:172 | 平均:185 | 平均:176 | 平均:162 | | 總平均:173.75 |

面臨的問題

當比較多組資料時,成對比較的數量會迅速增加,這增加了被隨機誤差誤導的風險。ANOVA 提供了一個整體檢定方法,用於回答「所有組別是否具有相同的潛在黏著度,而觀察到的差異是由於隨機分配造成的?」

ANOVA 的執行步驟

  1. 將所有資料合併到一個集合中。
  2. 重複隨機抽取四組,每組五個資料,並記錄每組的平均值。
  3. 計算這四組平均值之間的變異數。
  4. 重複步驟 2 和 3 多次(如1000次),並記錄每次的變異數。
  5. 計算重抽樣變異數超過觀察到的變異數的比例,這即是 p 值。

程式碼範例與解析

# 使用 lmPerm 包中的 aovp 函式進行排列檢定
library(lmPerm)
# 假設資料儲存在 dataframe 中,頁面標籤在 "page" 列,黏著度在 "stickiness" 列
summary(aovp(stickiness ~ page, data = your_dataframe))

#### 內容解密:

  • library(lmPerm) 載入 lmPerm 包,這是一個用於執行排列檢定的 R 軟體包。
  • aovp()lmPerm 包中的函式,用於執行 ANOVA 的排列檢定版本。它允許我們評估觀察到的組間差異是否顯著超過了隨機波動的預期。
  • stickiness ~ page 定義了模型,表示 stickiness 是因變數,而 page 是預測變數,即我們想了解不同頁面對黏著度的影響。
  • summary() 用於輸出檢定結果的摘要,包括 p 值等重要統計量。

方差分析(ANOVA)在多組實驗中的應用

在進行多組實驗比較時,例如測試四個不同的網頁設計對使用者停留時間的影響,統計學中的方差分析(ANOVA)提供了一種有效的方法來評估不同組別之間的差異是否顯著超過隨機變異的範圍。

排列檢驗(Permutation Test)

首先,我們可以使用排列檢驗來評估觀察到的組間差異是否可能是由於隨機變異引起的。以 R 語言中的 lmPerm 套件為例,我們可以進行如下的排列檢驗:

> library(lmPerm)
> summary(aovp(Time ~ Page, data=four_sessions))

輸出結果如下:

[1] "Settings: unique SS "
Component 1 :
         Df R Sum Sq R Mean Sq Iter Pr(Prob)    
Page      3   831.4    277.13 3104   0.09278 .  
Residuals 16  1618.4    101.15                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

內容解密:

  • Df:自由度,分別表示不同來源的變異所對應的自由度。
  • R Sum SqR Mean Sq:分別表示平方和與均方,用於衡量不同組別之間的變異程度。
  • Iter:表示進行了3104次迭代的排列檢驗。
  • Pr(Prob):給出了觀察到的差異(或更極端的結果)在隨機情況下發生的機率(p值),此處為0.09278,表明在沒有真實差異的情況下,約9.3%的機率會觀察到如此極端或更極端的結果。

在 Python 中,我們可以使用以下程式碼實作類別似的排列檢驗:

observed_variance = four_sessions.groupby('Page').mean().var()[0]
print('Observed means:', four_sessions.groupby('Page').mean().values.ravel())
print('Variance:', observed_variance)

def perm_test(df):
    df = df.copy()
    df['Time'] = np.random.permutation(df['Time'].values)
    return df.groupby('Page').mean().var()[0]

perm_variance = [perm_test(four_sessions) for _ in range(3000)]
print('Pr(Prob)', np.mean([var > observed_variance for var in perm_variance]))

內容解密:

  1. 首先計算觀察到的組間方差 observed_variance
  2. 定義一個函式 perm_test,對資料進行隨機排列並重新計算組間方差。
  3. 重複執行 perm_test 3000 次,得到一系列隨機排列下的組間方差 perm_variance
  4. 透過比較 observed_varianceperm_variance,計算出觀察到的差異在隨機情況下發生的機率(p值)。

F 統計量與方差分析(ANOVA)

除了排列檢驗外,我們還可以使用根據 F 統計量的方差分析來評估不同組別之間的差異。在 R 中,可以使用 aov 函式進行 ANOVA 分析:

> summary(aov(Time ~ Page, data=four_sessions))

輸出結果如下:

            Df Sum Sq Mean Sq F value Pr(>F)  
Page         3   831.4   277.1   2.74 0.0776 .
Residuals   16  1618.4   101.2                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

在 Python 中,可以使用 statsmodels 包實作相同的 ANOVA 分析:

model = smf.ols('Time ~ Page', data=four_sessions).fit()
aov_table = sm.stats.anova_lm(model)
aov_table

內容解密:

  • Df:自由度。
  • Sum SqMean Sq:平方和與均方,分別衡量不同來源的變異程度。
  • F value:F 統計量,用於評估組間變異是否顯著大於組內變異。
  • Pr(>F):給出了在零假設下觀察到當前 F 值或更極端值的機率(p值)。

方差分解

任何觀察到的資料都可以分解為總平均、處理效應和殘差誤差三個部分。對於 A/B/C/D 測試資料,第一個值的分解過程如下:

  1. 總平均:173.75。
  2. 處理效應:-1.75(172 - 173.75)。
  3. 殘差誤差:-8(164 - 172)。
  4. 等於觀察值:164。

多因素方差分析(Two-Way ANOVA)

當存在多個影響因素時,例如週末與工作日的區別,可以採用多因素方差分析。在這種情況下,除了評估主效應外,還需要考慮因素之間的互動作用。

重點概念

  • ANOVA 是用於分析多組實驗結果的統計方法。
  • 它是 A/B 測試統計程式的擴充套件,用於評估不同組別之間的總體變異是否在隨機變異範圍內。

卡方檢定:評估觀察資料與預期分佈的差異

卡方檢定是一種統計方法,用於評估觀察到的計數資料是否符合某種預期的分佈。在實際應用中,卡方檢定最常見的用途是檢驗列聯表中的變數是否獨立。

卡方檢定的關鍵概念

  • 卡方統計量:衡量觀察資料與預期資料之間的差異程度。
  • 預期或期望值:在某個假設(通常是虛無假設)下,資料的預期結果。
  • r × c 列聯表:表示一個具有 r 行和 c 列的表格,用於呈現不同類別之間的關係。

卡方檢定的重抽樣方法

假設我們正在測試三個不同的標題(A、B 和 C),並將它們分別顯示給 1,000 位訪客,結果如下表所示:

標題ABC
點選14812
未點選986992988

首先,我們需要計算整體點選率,並根據虛無假設(即三個標題的點選率相同)計算預期的點選次數和未點選次數。然後,我們可以使用 Pearson 殘差來衡量觀察值與預期值之間的差異。

Pearson 殘差的計算公式為: R = (觀察值 - 預期值) / sqrt(預期值)

接下來,我們可以計算卡方統計量,即所有 Pearson 殘差的平方和。

程式碼範例:卡方檢定的重抽樣實作

import numpy as np
import random

# 定義觀察資料
clicks = np.array([[14, 8, 12], [986, 992, 988]])

# 定義預期值
expected_clicks = 34 / 3
expected_noclicks = 1000 - expected_clicks
expected = np.array([[expected_clicks, expected_clicks, expected_clicks], 
                     [expected_noclicks, expected_noclicks, expected_noclicks]])

# 計算卡方統計量
def chi2(observed, expected):
    pearson_residuals = []
    for row, expect in zip(observed, expected):
        pearson_residuals.append([(observe - expect) ** 2 / expect for observe in row])
    return np.sum(pearson_residuals)

chi2observed = chi2(clicks, expected)

# 重抽樣實作
box = [1] * 34
box.extend([0] * 2966)

def perm_fun(box):
    sample_clicks = [sum(random.sample(box, 1000)) for _ in range(3)]
    sample_noclicks = [1000 - n for n in sample_clicks]
    return chi2([sample_clicks, sample_noclicks], [expected_clicks, expected_noclicks])

perm_chi2 = [perm_fun(box) for _ in range(2000)]

# 計算重抽樣的 p 值
resampled_p_value = sum(1 for chi2_val in perm_chi2 if chi2_val > chi2observed) / len(perm_chi2)

print(f'觀察到的卡方值:{chi2observed:.4f}')
print(f'重抽樣的 p 值:{resampled_p_value:.4f}')

內容解密:

  1. 資料準備:首先,我們定義了觀察到的點選和未點選資料,以及根據虛無假設計算出的預期點選和未點選次數。
  2. chi2函式:用於計算卡方統計量。它遍歷觀察到的資料和預期資料,計算 Pearson 殘差的平方和。
  3. 重抽樣過程:我們建立了一個包含 34 個 1(代表點選)和 2966 個 0(代表未點選)的列表,代表總體資料。然後,我們隨機抽取三個樣本,每個樣本包含 1000 個元素,並計算每個樣本的點選次數。
  4. 計算 p 值:透過比較觀察到的卡方值與重抽樣得到的卡方分佈,計算出 p 值。

卡方檢定的統計理論基礎

卡方檢定的統計理論表明,卡方統計量的分佈可以近似為卡方分佈,其自由度由列聯表的行數和列數決定。對於一個 r × c 的列聯表,自由度為 (r-1) × (c-1)。

程式碼範例:使用卡方分佈近似 p 值

from scipy.stats import chi2_contingency

# 使用 scipy.stats.chi2_contingency 函式計算 p 值
chisq, pvalue, df, expected = chi2_contingency(clicks)

print(f'觀察到的卡方值:{chisq:.4f}')
print(f'p 值:{pvalue:.4f}')

內容解密:

  1. chi2_contingency函式:直接計算列聯表的卡方統計量和 p 值,無需手動計算預期值和卡方統計量。
  2. 結果解釋:輸出的 p 值表示在虛無假設成立的情況下,觀察到當前結果或更極端結果的機率。

卡方檢定與費雪精確檢定在資料科學中的應用

在資料科學的統計實驗和顯著性測試中,卡方檢定(Chi-Square Test)和費雪精確檢定(Fisher’s Exact Test)是非常重要的工具,用於評估觀察到的資料是否符合某種假設分佈,或用於比較不同組別之間的差異。

卡方檢定:原理與應用

卡方檢定主要用於評估觀察到的計數資料是否與預期計數有顯著差異。它廣泛應用於分類別資料的分析,例如比較不同廣告點選率的差異。卡方檢定的統計量計算公式為:

$$\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}$$

其中 $O_i$ 是觀察到的計數,$E_i$ 是預期計數。

程式碼範例:R 語言中的卡方檢定

# 假設有一個2x2的列聯表
clicks <- matrix(c(100, 200, 50, 300), nrow = 2)
fisher.test(clicks)

內容解密:

  1. matrix(c(100, 200, 50, 300), nrow = 2):建立一個2x2的矩陣,代表兩個變數之間的計數資料。
  2. fisher.test(clicks):執行費雪精確檢定,評估觀察到的資料是否顯著偏離預期。

費雪精確檢定:原理與應用

費雪精確檢定是一種用於小樣本或稀疏資料的精確檢定方法。它透過計算所有可能的排列組合來評估觀察到的結果是否顯著。費雪精確檢定在資料科學中的一個重要應用是確定網頁實驗的樣本大小,尤其是在點選率非常低的情況下。

程式碼範例:Python 中的費雪精確檢定實作

import scipy.stats as stats

# 定義觀察到的資料
observed = [[100, 200], [50, 300]]

# 執行費雪精確檢定
odds_ratio, p_value = stats.fisher_exact(observed)
print(f"p-value: {p_value}")

內容解密:

  1. stats.fisher_exact(observed):使用 SciPy 的 fisher_exact 函式計算費雪精確檢定的 p 值。
  2. observed:是一個2x2的列表,代表觀察到的計數資料。
  3. p_value:代表觀察到的結果在零假設下的機率,用於判斷顯著性。

科學造假偵測中的統計應用

一個有趣的案例是 Tufts University 研究員 Thereza Imanishi-Kari 被指控偽造資料的事件。調查人員透過分析實驗室資料中的數字分佈,發現其內部數字不符合均勻分佈的預期,進而使用卡方檢定來證明資料可能被偽造。

資料科學中的相關性

在資料科學中,卡方檢定和費雪精確檢定不僅用於傳統的顯著性測試,還可用於樣本大小計算、特徵篩選和空間統計分析。例如,在機器學習中,這些檢定可用於識別不同類別在特徵上的異常分佈,從而幫助篩選有用的特徵。

主要觀點

  • 卡方檢定和費雪精確檢定用於測試觀察到的計數資料是否符合獨立性假設。
  • 在小樣本或稀疏資料的情況下,費雪精確檢定比卡方檢定更準確。
  • 這些統計方法在資料科學中有廣泛的應用,包括樣本大小計算和特徵篩選。