AB 테스트를 설계할 땐 고려해야 하는 것들이 여러 가지가 있는데 간단히 얘기하면 다음과 같다.
- MDE(Minumum Detectable Effect) : 비즈니스적으로 유의미한 차이가 어느 정도인지 미리 정의한다. 예를 들어 전환율에서 2%의 차이(절대 차이)를 탐지하려고 한다면 MDE는 0.02이다.
- 검정력(Power) : 귀무가설이 참이 아닐 때 귀무가설을 기각할 수 있는 능력. 보통 80%로 설정한다.
- 대립가설이 참일 때 귀무가설을 기각할 수 있는 능력. 즉, 실제로 차이가 있을 때 그 차이를 발견할 확률
- 검정력은 1-베타와 동일. (베타는 제2종의 오류)(2종의 오류=대립가설이 참일 때 귀무가설을 기각하지 않는 오류를 범할 확률)
- 표본 크기 : 몇 명을 대상으로 실험을 진행할지 알아야 한다. 이를 계산하기 위해 사전에 여러 기준들이 필요하다.
- 표본 크기가 충분히 커야만 효과를 잘 탐지할 수 있다. 이를 위해 사전 검정력 분석을 통해 필요한 표본 크기를 계산한다.
- 실험 기간 : 실험을 얼마나 진행할지 설계 단계에서 정해야 한다.
- 유의 수준(Alpha) : 보통은 0.05로 설정한다.
- 귀무가설이 참일 때 귀무가설을 기각하는 오류를 범할 확률의 허용 한계
특히, MDE와 검정력, 유의수준은 실험에 필요한 표본 크기를 계산하는 데에 필요하다. 하나씩 자세히 들여다보자.
MDE(Minumum Detectable Effect)
AB 테스트를 통해 감지하고자 하는 최소한의 효과 크기를 의미한다. 효과 크기는 이전 포스팅에서 설명했듯이 실험을 통한 A와 B군의 차이가 어느 정도인지를 의미하는 개념이다. 즉, 효과 크기는 '실험 후'에 측정할 수 있는 지표인데 MDE는 실험 이전의 '실험 설계' 단계에서 기대하는 최소한의 효과 크기를 미리 설정하는 개념이라고 생각하면 된다.
예를 들어, MDE를 0.02로 설정한다면 실험 후에 A와 B의 효과 크기가 최소한 2%p 이상인 경우를 감지하고 싶다는 것과 같다. 어떻게 보면 실험을 통해 기대하는 효과 크기의 목표치라고 생각해도 된다. 다르게 말하면 2%p 이상의 차이가 있을 때 테스트 결과를 유의미하게 검출할 수 있다는 것.
그렇다면 왜 실험 설계 단계에서 이 MDE를 미리 설정해야 하는 걸까? MDE는 실험에 필요한 표본의 크기를 계산하는 데에 필요하다.
실질적으로는 위와 같은 수식을 통해 효과 크기를 계산하게 되고, 이 값이 표본 크기를 계산하는 데에 쓰인다.
예를 들어, 다음과 같은 값들이 있다고 해보자.
기준
|
값
|
기존 전환율(p)
|
0.1 (10%)
|
MDE
|
0.02 (절대적 차이, 2%p)
|
이런 상황에서 아까의 수식을 통해 효과 크기를 계산하면 0.067이 나온다. 이때, 0.067은 Cohen's d 척도의 값이다. (Cohen's d는 두 그룹 간의 평균의 차이가 표준편차 단위로 얼마나 큰지를 나타내는 척도인데 보통 0.2, 0.5, 0.8을 기준으로 작은 효과, 중간 효과, 큰 효과라고 판단한다.)
즉, MDE는 실험 설계 단계에서 표본의 크기를 계산하기 위해 필요한 효과 크기를 계산하는 데에 필요한 것이다.
# MDE와 기존 전환율을 활용해 계산한 effect_size
effect_size = mde / math.sqrt(baseline_conversion_rate * (1 - baseline_conversion_rate))
※ MDE와 표본 크기와의 관계
(1) MDE를 작게 설정할 경우
MDE를 작게 설정한다는 것은 '작은 변화를 감지'한다는 것을 의미한다. 이렇게 되면 더 많은 표본들을 필요로 한다.
(2) MDE를 크게 설정할 경우
반면, MDE를 크게 설정한다는 것은 '비교적 큰 변화를 감지'한다는 것을 의미한다. 당연히 MDE를 작게 설정할 때보다 표본 자체는 적게 필요하지만 이렇게 될 경우, 실험을 통해 발생한 작은 차이를 놓칠 수 있게 된다.
[주의해야 할 시나리오]
Q) 만약, 실험 결과, 효과 크기가 1%p로 최초에 설정한 MDE(2%p)보다 작은데 p-value가 0.05보다 작다면(통계적으로 유의하다면)?
A) 실험의 결과가 통계적으로 유의미한 차이라고 볼 수 있다. 그러나, 설계에서 예상했던 것보다 작은 차이를 감지한 것이므로 이 효과 크기가 비즈니스적으로 의미 있는 차이인지 확인해 봐야 한다. 1%p라는 작은 차이가 비즈니스적으로 의미 있는 차이인지의 여부에 따라 이후에 취할 수 있는 액션이 달라진다.
검정력(Power)
검정력은 귀무가설이 틀렸을 때 귀무가설을 기각할 확률이다. 즉, 귀무가설이 거짓일 때 귀무가설을 채택할 오류인 제2종의 오류를 피할 확률이다. 수식으로 표현하면 검정력은 (1-베타)이다. 검정력이 0.8이라는 것은 2종의 오류를 범할 확률이 20%라는 의미다. (실제로 차이가 있음에도 그 차이를 감지하지 못할 가능성이 20%)
실무에선 보통 검정력을 80%로 설정하는데, 이는 실제로 실험이 효과가 있을 때 그 효과를 감지할 확률이 80%임을 의미한다.
검정력은 다음과 같은 요인들에 영향을 받는다.
1. 표본크기
|
표본크기가 클수록 검정력이 높아진다. 많은 데이터가 있을수록 효과가 있고 그 차이를 감지할 확률이 높아진다.
|
2. 효과 크기
|
효과 크기가 클수록 검정력이 높아진다. 차이가 클수록 그 차이를 감지하는 게 쉬워진다.
|
3. 유의 수준
|
유의수준이 높으면(즉, 더 높은 1종의 오류를 허용하면) 검정력이 높아진다. 그러나, 유의수준을 너무 높게 설정하면 1종의 오류(귀무가설이 참인데 귀무가설을 기각할 오류)의 위험이 커진다. 일반적으로 0.05로 설정한다.
|
4. 분산
|
데이터의 분산이 작을수록 검정력이 높아진다. 변동성이 작으면 데이터 간의 차이를 더 쉽게 감지할 수 있다.
|
결과적으로 표본 크기를 구할 때 필요한 검정력은 보통 0.8(80%)로 설정한다.
표본 크기 계산
실험 설계 단계에서 가장 중요한 것은 '통계적 유의성을 검정하기 위해 실험에서 필요한 표본의 크기'를 구하는 것이다. 표본의 크기를 계산하기 위해선 기존 전환율과 효과 크기, 유의수준, 검정력 값이 필요하다.
보통 파이썬의 statsmodels 라이브러리의 NormalIndPower과 TTestIndPower 클래스를 사용한다.
통계를 좀 공부해 본 사람은 두 클래스의 이름에서 느낌이 올 것이다.
NormalIndPower는 두 집단 간의 평균의 차이가 정규 분포를 따를 때 사용한다. 표본 크기가 크면 중심극한정리에 의해 표본평균의 분포가 정규분포에 근사해지므로 이런 경우엔 이 클래스를 사용할 수 있다(Z 검정).
반면, TTestIndPower는 모집단의 분산을 모르거나 표본 크기가 작을 때 활용한다(T 검정). 만약, 어떤 클래스를 사용할지 판단이 서질 않는다면 정규성 검정(Shapiro-wilk)을 해보고 정규성이 충족되지 않는다면 T 검정을 사용한다.
다음은 기존 전환율을 0.02, MDE를 0.03, 유의수준 0.05, 검정력 0.8로 설정했을 때 필요한 표본 크기를 계산하는 파이썬 코드다.
[주의해야 할 것]
TTestIndPower와 NormalIndPower 클래스에서 활용하는 effect_size는 "표준화된 효과 크기"이다.
예를 들어서 기존 전환율이 2%이고 우리가 실험의 결과로 기대하는 전환율이 5%라면, MDE는 3%(0.03)가 된다.
이를 바탕으로 실험 설계 단계에서 위의 파이썬 클래스의 effect_size 파라미터 값을 넣을 때, 0.03이 아니라 0.03을 활용해 표준화한 효과 크기의 값을 넣어야 한다는 뜻이다.
statsmodels의 공식 페이지에선 다음과 같이 설명하고 있다.
effect_size: standardized effect size, difference between the two means divided by the standard deviation. effect_size has to be positive.
from statsmodels.stats.power import TTestIndPower, NormalIndPower
import math
baseline_cvr = 0.02 # 기존 전환율 2%
mde = 0.03 # 3%p
alpha = 0.05 # 유의수준
power = 0.8 # 검정력 80%
# 효과크기 계산
effect_size = mde / math.sqrt(baseline_conversion_rate * (1 - baseline_conversion_rate))
# (1) Z-test 사용 시 (NormalIndPower)
normal_power_analysis = NormalIndPower()
sample_size_z = normal_power_analysis.solve_power(effect_size=effect_size, alpha=alpha, power=power)
print(f"Z-test 표본 크기: {sample_size_z}")
# (2) T-test 사용 시 (TTestIndPower)
t_test_power_analysis = TTestIndPower()
sample_size_t = t_test_power_analysis.solve_power(effect_size=effect_size, alpha=alpha, power=power)
print(f"T-test 표본 크기: {sample_size_t}")
실험 기간은 어떻게 설정하는가
실험 기간은 사전 검정력 분석을 통해 실험에 필요한 표본 크기를 계산한 후, 제품/서비스에서 실험이 진행되는 영역의 기존 트래픽 속도를 고려하여 결정한다. 즉, 필요한 표본 크기를 일별 트래픽으로 나누어 실험 기간을 추정할 수 있다. 물론, 트래픽 외에도 실험에 영향을 미칠 수 있는 시즌성, 특정 이벤트 등 외부 요인을 고려하며 실험 기간을 설정해야 한다.
방법론적으로는 이런데 실무에선 실험 기간을 최소한 1주~2주로 가져가는 걸 선호한다.
아무래도 많은 실험들을 빠르게 진행해야 하다 보니 실험 하나를 몇 주씩 끌고 가는 걸 지양하는 편이다. 그래도 최소 1주 이상을 가져가는 걸 추천한다.
실험은 절대 실험 종료 전까지 중간에 중단해선 안된다. 필요한 표본 크기가 충족되지 않은 실험 중간에 p-value가 유의수준보다 작게 나와 유의미하다고 판단하고 실험을 임의적으로 중단해서는 안 된다는 뜻이다.
'Product Analytics' 카테고리의 다른 글
[Stat] 회귀모형 평가하기 - RMSE(평균 제곱근 오차) (0) | 2024.12.24 |
---|---|
[Stat] 선형회귀(linear regression), 최소제곱법 (0) | 2024.12.24 |
통계적 유의성 검정이 절대적이지 않은 이유 : 통계적 유의성과 실무적 유의성 (0) | 2024.12.05 |
[AB 테스트] 실험의 순수 효과 측정 방법 - 이중차분법 (1) | 2024.12.05 |
[AB 테스트] 통계적 유의성 검정 방법 (1) | 2024.12.05 |