베이즈 팩터 vs E-value(안전 검정): 수렴 조건 완전 분석과 Safe Testing 실무 선택 가이드
safestats로 A/B 테스트를 처음 돌릴 때 e-value와 베이즈 팩터가 거의 같은 숫자를 출력하는 장면을 마주한다면, 그건 우연이 아닙니다. 두 프레임워크는 특정 조건에서 수학적으로 일치하며, 그 조건을 이해하면 어떤 상황에서 무엇을 써야 할지가 분명해집니다.
통계 검정에는 오랫동안 p-값(귀무가설이 참일 때 지금 관측값 이상의 극단적 결과가 나올 확률)이 표준으로 쓰였지만, A/B 테스트 플랫폼 운영, ML 모델 비교, 임상시험 중간 분석처럼 실험 도중 결과를 확인해야 하는 환경에서는 한계가 드러났습니다. 이 공백을 채우는 두 대안이 **베이즈 팩터(Bayes Factor)**와 **E-value(e-통계량, 안전 검정)**입니다. 2024–2025년 Grünwald 외의 Safe Testing 논문이 JRSS-B에 게재되고, Ramdas·Wang의 E-value 교과서가 공개되면서 두 프레임워크의 관계가 더욱 정밀하게 정리되었습니다.
단순 귀무가설에서는 베이즈 팩터 자체가 e-variable이 되지만, 복합 귀무가설과 순차 실험에서는 e-value만이 타입-I 오류(귀무가설이 참인데 기각하는 오류)를 완전히 보장합니다. 이 글은 두 프레임워크가 수렴하는 조건과 갈라지는 조건을 정확히 짚고, 데이터 과학자와 ML 엔지니어가 실무에서 즉시 적용할 수 있는 선택 기준을 정리합니다.
핵심 개념
베이즈 팩터: 두 가설의 증거 비율
베이즈 팩터(BF)는 두 경쟁 가설 H₀와 H₁ 하에서 관측 데이터의 주변 우도(marginal likelihood, 사전분포로 적분한 평균 우도) 비율입니다.
$$BF_{10} = \frac{P(\text{data} \mid H_1)}{P(\text{data} \mid H_0)}$$
BF > 1이면 H₁을, BF < 1이면 H₀를 지지합니다. p-값과 달리 귀무가설에 유리한 증거도 수치로 표현할 수 있다는 점이 강점입니다. Jeffreys(1935)가 도입한 다음 해석 척도가 오늘날에도 널리 쓰입니다.
| Jeffreys 척도 | BF 범위 | 해석 |
|---|---|---|
| 근거 없음 | 1 ~ 3 | 언급할 만한 수준 아님 |
| 약한 증거 | 3 ~ 10 | H₁에 대한 실질적 증거 |
| 강한 증거 | 10 ~ 100 | H₁에 대한 강한 증거 |
| 결정적 증거 | > 100 | H₁에 대한 결정적 증거 |
주의: 베이즈 팩터를 계산하려면 반드시 **사전분포(prior, 데이터 관측 전에 가정하는 모수 분포)**를 지정해야 합니다. 확률의 합이 무한한 부적합 사전분포(improper prior)는 사용할 수 없으며, 사전분포 선택에 따라 결과가 달라집니다.
E-value(안전 검정): 베팅 자본으로서의 통계량
E-value는 귀무가설 H₀ 하에서 기댓값이 최대 1인 비음수 확률변수입니다.
$$E \geq 0, \quad E_0[E] \leq 1$$
직관적으로는 "귀무가설이 참인 세계에서, 1원으로 시작한 베팅 자본"으로 이해할 수 있습니다. 귀무가설이 참이라면 기대 자산이 늘지 않으므로, Ville의 부등식에 의해 어떤 정지 규칙에서도 타입-I 오류가 α 이하로 통제됩니다.
$$P_0!\left(E \geq \frac{1}{\alpha}\right) \leq \alpha$$
수학적 배경: Ville의 부등식은 마르코프(Markov) 부등식의 확장입니다. 마르코프 부등식 P(X ≥ t) ≤ E[X]/t에 t = 1/α를 대입하면 P₀(E ≥ 1/α) ≤ E₀[E] · α ≤ α가 즉시 성립합니다. 핵심 업그레이드는 마르코프가 고정 시점에서만 성립하는 데 반해, Ville은 임의의 정지 시점 T에서도 P₀(E_T ≥ 1/α) ≤ α를 보장한다는 점입니다. 이것이 옵셔널 스탑핑을 수학적으로 안전하게 만드는 핵심입니다.
이 성질을 옵셔널 스탑핑(optional stopping) 안전성이라 부릅니다. Vovk·Wang(2021)과 Grünwald·de Heide·Koolen(2024, JRSS-B)이 이 프레임워크를 체계화했습니다.
GRO — 두 프레임워크를 잇는 연결 개념
GRO(Growth-Rate Optimality)는 E-value를 설계하는 실용적 기준이자, 베이즈 팩터와 e-value가 교차하는 수학적 지점입니다. 대안 분포 Q 하에서 로그 기댓값을 최대화하는 e-variable을 찾습니다.
$$\max_{E} ; E_Q[\log E] \quad \text{subject to} \quad E_0[E] \leq 1$$
t-검정에서 GRO 최적 e-variable은 Cauchy 사전분포를 사용한 베이즈 팩터와 정확히 일치합니다. 왜 Cauchy 분포일까요?
GRO 최적화는 "귀무가설이 틀렸을 때 자본을 빠르게 불리는 베팅 전략"을 찾습니다. 이를 위해 사전분포는 특정 효과 크기에만 집중하면 안 되고, 크고 작은 효과 크기 모두에 충분한 확률 질량을 부여해야 합니다. 정규 분포보다 훨씬 두꺼운 꼬리(heavy tail)를 가진 Cauchy 분포가 정확히 이 역할을 합니다 — 효과 크기가 어떤 값이든 베팅을 포기하지 않겠다는 전략적 판단이 Cauchy 사전분포로 수렴합니다.
중요 제한: GRO e-variable과 베이즈 팩터가 일치하는 것은 사전분포가 GRO-최적 조건을 충족할 때뿐입니다. 임의의 사전분포로 계산한 베이즈 팩터를 e-value처럼 취급하는 것은 오류입니다.
수렴과 분기를 결정하는 조건
| 조건 | 베이즈 팩터 | E-value |
|---|---|---|
| 단순 귀무가설 (H₀: θ = θ₀) | E₀[BF] = 1 → e-variable 조건 충족 | 동일 결과 도출 가능 |
| 복합 귀무가설 (H₀: θ ≤ 0) | E₀[BF] ≠ 1 → 타입-I 오류 미보장 | REGROW 등으로 대응 가능 |
| GRO-최적 사전분포 사용 시 | BF = GRO e-variable → 완전 일치 | 동일 |
| 일반 사전분포 사용 시 | BF ≠ e-variable | 별개 |
| 순차 실험 / 옵셔널 스탑핑 | 타입-I 오류 일반적으로 미보장 | 항상 보장 |
실전 적용
예시 1: 온라인 A/B 테스트 — 순차 실험에서의 E-value
실험 도중 결과를 확인하면서 조기 중단을 결정해야 하는 시나리오입니다. 고전적 t-검정은 표본 크기를 미리 고정해야 유효하지만, e-value 기반 safe test는 언제 멈춰도 오류율을 보장합니다.
# R - safestats 패키지 활용
library(safestats)
# 재현 가능한 예시 데이터 생성 (실무에서는 실제 관측값으로 교체)
set.seed(42)
obs_data <- rnorm(50, mean = 0.3, sd = 1.0)
# 단측 z-검정용 safe test 설계
# delta: 탐지하고자 하는 최소 효과 크기 (Cohen's d)
design <- designSafeZ(
alternative = "greater",
alpha = 0.05,
beta = 0.20,
delta = 0.3
)
# 데이터가 축적될 때마다 e-process 업데이트
e_process <- safeZTest(x = obs_data, design = design)
# 임계값 도달 시 언제든 기각 가능 (alpha 보장)
threshold <- 1 / 0.05 # = 20
if (e_process$eValue >= threshold) {
cat(sprintf("e-value = %.2f >= %.0f → 귀무가설 기각 가능\n",
e_process$eValue, threshold))
} else {
cat(sprintf("e-value = %.2f < %.0f → 아직 충분한 증거 없음\n",
e_process$eValue, threshold))
}| 코드 요소 | 역할 |
|---|---|
designSafeZ() |
GRO 기준으로 최적 e-variable 설계 |
delta = 0.3 |
탐지하고자 하는 최소 효과 크기 지정 |
safeZTest() |
누적 데이터에 대해 e-process 계산 |
threshold = 1/alpha |
Ville 부등식에 의한 기각 임계값 |
e-process: 시간에 따라 누적되는 e-value의 곱. 각 시점의 우도비가 독립이면 곱 역시 e-variable이므로 순차 업데이트가 자연스럽게 성립합니다.
Python에서 직접 구현이 필요한 경우, 정규 분포 e-process를 다음과 같이 작성할 수 있습니다.
import numpy as np
def compute_e_process(observations: list[float], delta_alt: float) -> float:
"""
단순 단측 e-process (정규 분포, 분산 = 1로 알려진 경우 가정)
E_t = ∏ exp(δ·xᵢ - δ²/2) [우도비: N(δ, 1) vs N(0, 1)]
한계 (실무 적용 시 주의):
- 분산이 알려진 경우에만 정확 — 분산 미지의 경우 anytime-valid t-test 구현 필요
- 배치 업데이트나 적응형 설계에는 확장 구현 필요
- 단측 검정(δ > 0)만 다룸 — 양측 검정에는 λ-mixture 방식 사용 권장
Args:
observations: 순차 수집된 관측값 리스트
delta_alt: 대안 가설의 효과 크기 (H₁: μ = delta_alt)
"""
if len(observations) == 0:
raise ValueError("관측값이 비어 있습니다.")
e_process = 1.0
for x in observations:
likelihood_ratio = np.exp(delta_alt * x - 0.5 * delta_alt ** 2)
e_process *= likelihood_ratio
return e_process
# 사용 예시
data_stream = [0.4, 0.3, 0.5, 0.2, 0.6, 0.7, 0.1, 0.8]
alpha = 0.05
threshold = 1 / alpha # = 20
e_val = compute_e_process(data_stream, delta_alt=0.3)
print(f"e-value: {e_val:.4f}")
if e_val >= threshold:
print(f"e-value {e_val:.2f} >= {threshold:.0f} → 기각 가능")
else:
print(f"e-value {e_val:.2f} < {threshold:.0f} → 데이터 더 필요")예시 2: 베이지안 모델 비교 — 베이즈 팩터가 적합한 시나리오
표본 크기가 사전에 확정되어 있고, 도메인 지식을 사전분포로 인코딩할 수 있는 경우입니다. 두 모델의 상대적 타당성을 비교할 때 베이즈 팩터가 직관적인 해석을 제공합니다.
import numpy as np
from scipy import integrate, stats
def bayes_factor_ttest_jzs(
data: np.ndarray,
mu0: float = 0.0,
r: float = np.sqrt(2) / 2,
) -> float:
"""
단일 표본 t-검정 베이즈 팩터 (JZS Cauchy 사전분포, Rouder et al. 2009)
BF > 10: 강한 증거, BF > 100: 결정적 증거 (Jeffreys 척도)
한계:
- 정규 모집단 가정 (비정규 데이터에 부적합)
- 단변량 단일 표본 검정에 한정
- 고차원·반복측정 설계에는 R의 BayesFactor 패키지 사용 권장
Args:
data: 관측 데이터 (1차원 배열)
mu0: 귀무가설의 기준 평균
r: Cauchy 사전분포 스케일 파라미터 (기본값 sqrt(2)/2 ≈ "medium")
"""
if len(data) == 0:
raise ValueError("데이터가 비어 있습니다.")
n = len(data)
t_stat = (np.mean(data) - mu0) / (np.std(data, ddof=1) / np.sqrt(n))
# H₁ 주변 우도: δ ~ Cauchy(0, r) 사전분포에 대해 수치 적분
def integrand(delta: float) -> float:
ncp = delta * np.sqrt(n) # 비중심 t 모수
log_lik = stats.nct.logpdf(t_stat, df=n - 1, nc=ncp)
log_prior = stats.cauchy.logpdf(delta, loc=0, scale=r)
return np.exp(log_lik + log_prior)
marginal_H1, _ = integrate.quad(integrand, -np.inf, np.inf, limit=200)
# H₀ 우도: 중심 t 분포 (비중심 모수 = 0)
marginal_H0 = stats.t.pdf(t_stat, df=n - 1)
if marginal_H0 == 0:
raise ValueError("H₀ 우도가 0입니다. 데이터와 귀무가설을 확인하세요.")
return marginal_H1 / marginal_H0
# 사용 예시
np.random.seed(42)
sample_data = np.random.normal(loc=0.5, scale=1.0, size=30)
bf = bayes_factor_ttest_jzs(sample_data)
print(f"베이즈 팩터 BF₁₀ = {bf:.2f}")
if bf > 100:
print("결정적 증거 — H₁ 강력 지지")
elif bf > 10:
print("강한 증거 — H₁ 지지")
elif bf > 3:
print("실질적 증거 — H₁ 지지")
elif bf > 1 / 3:
print("애매한 증거")
else:
print("H₀ 지지")R 사용자를 위한 참고: Python의 전용 BF 라이브러리는 아직 성숙 단계 미완입니다. R 환경에서는
BayesFactor::ttestBF(x = data, mu = 0, rscale = "medium")이 더 안정적인 선택입니다.
장단점 분석
장점
| 항목 | 베이즈 팩터 | E-value |
|---|---|---|
| 귀무가설 지지 정량화 | H₀에 유리한 증거를 수치로 직접 표현 | 직접 정량화 어려움 |
| 사전 지식 활용 | 도메인 지식을 사전분포로 인코딩 가능 | 사전분포 불필요, 빈도론적 접근 가능 |
| 모델 비교 | 여러 모델의 증거 비율 직관적 비교 | 주로 이진 검정에 적합 |
| 타입-I 오류 제어 | 단순 귀무 + GRO 사전 시 자동 충족 | 항상 충족 (Ville 부등식) |
| 결합 가능성 | 같은 사전일 때만 곱셈 결합 유효 | 독립 e-value의 곱이 e-value → 자유로운 결합 |
| 옵셔널 스탑핑 | 미보장 (표본 크기 사전 고정 필요) | 완전 보장 |
단점 및 주의사항
| 항목 | 베이즈 팩터 | E-value | 대응 방안 |
|---|---|---|---|
| 옵셔널 스탑핑 | 타입-I 오류 미보장 | 완전 보장 | BF 사용 시 표본 크기 사전 고정 |
| 복합 귀무가설 | E₀[BF] ≠ 1, 오류율 제어 불가 | REGROW로 대응 가능 | Rescaled BF(BF/μ*) 사용 |
| 계산 복잡도 | 고차원 주변 우도 적분 필요 | 상대적으로 단순 | PyMC Bridge Sampling, JASP 활용 |
| 귀무가설 증거 | 정량화 가능 | 직접 정량화 어려움 | 필요 시 BF 병행 사용 고려 |
| 검정력 | 원 BF 수준 유지 | Rescaled BF는 원 BF보다 낮은 검정력 | GRO 최적 설계(designSafeZ) 활용 |
| 사전분포 | 필수, 부적합 사전 사용 불가 | 불필요 | — |
Rescaled Bayes Factor:
BF / μ*형태로 변환하면 복합 귀무가설에서도 e-variable 조건을 만족합니다. 단, μ* > 1이면 원 BF보다 낮은 값이 되어 검정력이 감소합니다.
FBST e-value 주의: 풀 베이지안 유의성 검정(FBST, Full Bayesian Significance Test)의 ev는 이름이 유사하지만 이 글의 e-value와 완전히 다른 개념입니다. 타입-I 오류 제어 보장이 없어 혼용하면 심각한 오류로 이어질 수 있습니다.
실무에서 가장 흔한 실수
- 복합 귀무가설에 베이즈 팩터를 그대로 사용하기: H₀: θ ≤ 0처럼 복합 귀무가설 상황에서 일반 베이즈 팩터는 타입-I 오류를 제어하지 않습니다. Rescaled BF(
BF/μ*) 또는 e-value 기반 검정으로 전환하는 것을 권장합니다. - 표본 크기를 고정하지 않고 베이즈 팩터를 반복 확인하기: 베이즈 팩터도 옵셔널 스탑핑에 대해 일반적으로 안전하지 않습니다. 순차 모니터링이 필요하다면
safestats패키지의 safe test 활용을 권장합니다. - GRO 일치 조건을 과도하게 일반화하기: GRO e-variable과 베이즈 팩터가 일치하는 것은 사전분포가 GRO-최적 조건을 충족할 때뿐입니다. 임의의 사전분포로 계산한 베이즈 팩터를 e-value처럼 취급하는 것은 오류입니다.
마치며
실무 선택 기준을 한 장으로 정리하면 다음과 같습니다.
실험 도중 결과를 확인해야 하는가? (A/B 테스트, 중간 분석)
├─ 예 → E-value [safestats::designSafeZ → safeZTest]
└─ 아니오
└─ 도메인 사전분포가 있고, 귀무가설이 단순(θ = θ₀)인가?
├─ 예 → 베이즈 팩터 [BayesFactor::ttestBF]
└─ 아니오 (복합 귀무, 사전분포 없음)
└─ E-value 또는 Rescaled Bayes Factor이 글을 읽기 전에는 "베이즈 팩터와 e-value가 같은 숫자를 낼 때가 있는 이유"가 불분명했을 수 있습니다. 그 답은 GRO 최적화에 있으며, GRO-최적 사전분포가 Cauchy 분포로 귀결되는 이유는 두꺼운 꼬리가 모든 효과 크기에 대해 베팅을 포기하지 않는 전략이기 때문입니다. 두 프레임워크는 경쟁 관계가 아니라 보장하는 성질이 다른 도구이고, 그 성질의 차이가 선택 기준의 전부입니다.
지금 바로 시작해볼 수 있는 3단계:
- safestats 패키지를 직접 실행해볼 수 있습니다: R에서
install.packages("safestats")후 위의 R 코드 블록을 그대로 실행하면 e-process가 임계값 20에 도달하는 과정을 확인할 수 있습니다.vignette("safestats-vignette")에는 z-검정·t-검정의 전체 순차 예시가 포함되어 있어 바로 참고할 수 있습니다. - Python 코드를 Google Colab에서 실행해볼 수 있습니다: 위의
compute_e_process()와bayes_factor_ttest_jzs()코드를 Colab 셀에 붙여넣어np.random.normal()로 시뮬레이션 데이터를 만들고, 두 값을 나란히 비교해보시면 GRO 수렴 조건이 직관적으로 확인됩니다. - ★ 필독 자료 한 편부터 시작해볼 수 있습니다: 아래 참고 자료 중 별표(★)로 표시된 두 편이 이 글에서 다룬 내용의 수학적 기반을 가장 체계적으로 정리합니다. 두 편 중 하나를 먼저 읽는 것을 권장합니다.
다음 글: 컨포멀 예측(Conformal Prediction)에 e-value를 통합하면 ML 모델의 불확실성 추정이 어떻게 달라지는지 — 배치·순차 설정에서의 적용 방법을 다룰 예정입니다.
참고 자료
★ 필독
- Grünwald, de Heide, Koolen — Safe Testing | JRSS-B 2024
- Ramdas & Wang — Hypothesis Testing with E-values (2025 교과서)
추가 학습
- Rescaled Bayes Factors: A Class of E-variables | arXiv 2024
- E-values as Statistical Evidence: A Comparison to Bayes Factors, Likelihoods, and p-values | arXiv 2025
- Bayes, E-values, and Testing | arXiv 2026
- Game-Theoretic Statistics and Safe Anytime-Valid Inference | Statistical Science 2023
- Test Martingales, Bayes Factors and p-Values — Shafer, Vovk | Statistical Science
- safestats R 패키지 | CRAN
- Safe Flexible Hypothesis Tests 비네트
- E-Values Expand the Scope of Conformal Prediction | arXiv 2025
- Anytime-Valid FDR Control with Stopped e-BH Procedure | ScienceDirect 2025
- A Critical Evaluation of the FBST ev for Bayesian Hypothesis Testing | Springer