AB 테스트 알아보기 - 2. 유의성 검증 (with p value, significance test)

3 minute read

이전 포스트에서 샘플 사이즈 계산에 대해 알아보았다. 이번에는 정해진 샘플 사이즈를 바탕으로 A/B 테스트 진행 후 실험의 가설이 유의한지를 검증해보는 p value 계산에 대해 알아보려 한다.

개념

p-value

p value는 유의확률이라고 하며 probability of getting statisitics at least $\bar{x}$ far from the mean 을 의미한다. 다시 풀어서 설명하면 $H_0$ 이 true라고 가정했을 때 나온 결과 ($\bar{x}$)가 나올 확률이 얼마나 되냐를 확률로 나타낸 것이다.

예를 들어 원래 유저 체류 시간에 대해 알고 있는 평균($H_0$ 의 평균)이 20분인데 기능 추가 후 뽑은 샘플에서 평균이 25분이 나왔다고 생각해보자. p value는 이 때 25분이라는 수치가 20분이 평균이라고 가정했을 때 얼마나 rare한 케이스인지를 확률적으로 계산해준다. 여기서 유의수준인 $\alpha$ 를 다시 사용하게 되고 $\alpha$ 로 0.05를 사용하게 되면 p value가 0.05 미만일 때만 케이스가 유의미하다고(충분히 rare해서 알고 있는 평균 20분을 기각할 수 있을 정도로) 판단하게 된다.

계산식으로 나타내면 $p(\bar{x} ≥ 25 min, H_0 \ true) = p(\bar{x} ≥ 25 min, \mu_0 = 20)$ 가 된다.

이제 케이스를 통해 어떻게 계산되는지 알아보자.

Case 1 - XX 기능 추가를 통한 평균 체류 시간 AB 테스트

Continous outcome을 사용하는 케이스의 가설은 아래와 같다.

$H_0$: XX 기능 추가는 체류 시간을 변화시키지 않을 것이다.

$H_a$: XX 기능 추가는 체류 시간을 늘릴 것이다.

AB 테스트의 경우 모집단의 표준편차를 복잡하게 추정할 필요 없이 A 군과 B 군의 평균과 표준편차를 이용해 z score를 계산해 p value를 구할 수 있다.

$\frac{\mu(n_a, A) - \mu(n_b, B)}{\sqrt{\frac{\sigma_b^{2}}{n_b} + \frac{\sigma_a^{2}}{n_a}}} \sim N(0, 1)$

이전 포스트에서 $\mu_0$ 과 $\mu_a$ 의 차이가 0을 나타내는 $H_0$ 의 분포가 위와 같은 식으로 변환될 수 있음을 확인했다. 이를 바탕으로 z score를 사용할 수 있다.

구체적인 AB 테스트 결과를 다음과 같이 생각해보자.

  • A - 대상: 10000명, 평균: 20분, 표준편차: 10분
  • B - 대상: 10000명, 평균: 21분, 표준편차: 10분
import numpy as np
from scipy.stats import norm


n_A, mu_A, std_A = 1000, 20, 10
n_B, mu_B, std_B = 1000, 21, 10

Z = (mu_B - mu_A)/np.sqrt(std_B**2/n_B + std_A**2/n_A)
pvalue = norm.sf(Z)

print("Z-score: {0}\np-value: {1}".format(Z,pvalue))  # Z-score: 2.23606797749979, p-value: 0.012673659338734126

z score를 사용해서 계산해보면 p value가 0.0127로 나오고 이는 0.05보다 작으므로 차이가 없다는 $H_0$ 분포에서 5% 미만으로 나오는 rare한 케이스여서 XX 기능 추가가 체류 시간을 변화시키지 않을 것이라는 $H_0$을 기각할 수 있다. 이를 바탕으로 XX 기능 추가가 체류 시간을 변화시킬 것이라고 AB 테스트 결과를 해석할 수 있게 된다.

Case 2 - YY 기능 추가를 통한 평균 전환율 AB 테스트

이번에는 proportion 케이스를 테스트해보자. 가설은 아래와 같다.

$H_0$: YY 기능 추가는 전환율을 변화시키지 않을 것이다.

$H_a$: YY 기능 추가는 전환율을 높일 것이다.

Proportion 케이스의 경우 continous mean에 비해 이항분포의 특성으로 얻게 되는 $\sigma$ 로 인해 따로 $\sigma$ 를 구할 필요가 없어 계산이 용이하다.

구체적인 AB 테스트 결과는 다음과 같다. 샘플 사이즈와 케이스는 AB 테스트 알아보기 - 1. 샘플 사이즈 계산 (with alpha, beta, power, critical value)을 참조하기 바란다.

  • A - 대상: 70000명, 평균: 2%
  • B - 대상: 70000명, 평균: 2.2%
import numpy as np
from scipy.stats import norm


n_A, mu_A = 70000, 0.02
std_A = np.sqrt(mu_A * (1 - mu_A))  # 이항 분포 특성 이용
n_B, mu_B = 70000, 0.022
std_B = np.sqrt(mu_B * (1 - mu_B))  # 이항 분포 특성 이용


Z = (mu_B - mu_A)/np.sqrt(std_B**2/n_B + std_A**2/n_A)
pvalue = norm.sf(Z)

print("Z-score: {0}\np-value: {1}".format(Z,pvalue))  # Z-score: 2.6095978565398292, p-value: 0.0045324357733418025

이 케이스의 경우 p value가 0.0045로 마찬가지로 0.05보다 작으므로 차이가 없다는 $H_0$ 을 기각할 수 있다. 이를 바탕으로 YY 기능 추가가 전환율을 변화시킬 것이라고 AB 테스트 결과를 해석할 수 있게 된다.

마치며

AB 테스트의 유의성을 검증하는 p value 계산에 대해 알아보았다. 포스트 내용처럼 A군과 B군 사이의 통계량을 바탕으로 현재 나온 B군의 결과가 유의한지를 위와 같이 테스트할 수 있지만 AB 테스트 해석에는 주의가 필요하다. 실험 설계 시 샘플 사이즈가 적절히 설정되었는지 뽑아놓은 샘플이 동질한 특성을 가지는 지, 기타 해석에 편향을 줄 수 있는 방식으로 실험이 설계되었는 지를 검증해봐야 한다.

References

Leave a comment