
이떄 T test를 진행할 경우 두 그룹의 평균 차이가 평균으로부터 얼마나 떨어져 있는지를 통해 p-value 값을 구할 수 있음. 즉, AB테스트는 두그룹의 차이를 분석하는 만큼 T-test를 유용하게 활용할 수 있는 검정임.
* 실제 예시
알리미에서는 실제 여러나라를 대상으로 AB테스트를 실시. 예를 들어 앱 다운로드와 관련하여 슬로건 강조여부, 대상 고객 정의, 이미지 변환을 통해 전후 차이를 비교하기도 하였음.

주의
1. AB테스트를 진행할 경우 AB테스트의 리소스는 제한되어 있기에 AB테스팅의 파급력을 고려해야함.
2. A/B테스트를 실행할 경우 외부 요인을 제한해야함. 예를 들어 기간 별로 A/B 테스팅을 별개로 진행할 경우 외부요인으로 인해 달라진 것일 수 있기 때문.
3. 적절한 모수를 찾아야한다. 모수가 적을 경우 제대로된 결정을 내리기 힘들기 때문.
| 귀무가설 참 | 대립가설 참 | |
|---|---|---|
| 귀무가설 채택 | 옳은 결정 | 제 2종오류 |
| 대립가설 채택 | 제 1종 오류 | 옳은 결정 |
* 이떄 1종 오류가 발생하지 않을 확률을 라 하며, 2종 오류가 발생하지 않을 확률을
라고 한다.
* 실제 가설을 검증하는 과정에서 1종 오류와 2종 오류는 완전히 없앨 수 없다. 1종 오류를 줄이기 위해 신뢰구간을 키울 경우 2종오류를 키울 수 있으며, 신뢰구간을 줄일 경우 1종오류가 커질 수 있다.(결국 표본을 키워서 데이터의 안정성을 높여야함.)
+ 신뢰구간에 대한 내용은
https://velog.io/@dkanrjteh1/QAQC-%EB%82%B4%EC%9D%BC-%EB%B0%B0%EC%9B%80-%EC%BA%A0%ED%94%84-26%EC%9D%BC%EC%B0%A8
여기 참조.
가설: 30개의 표본에서 얻은 tip의 평균은 3(모집단 평균)일 것이다.
score=np.random.choice(data["tip"],30)
mu=3
t_stat, p_value = stats.ttest_1samp(score, mu)
print(f'T값은 {t_stat}, p-value는{p_value}')
if p_value<0.05:
print("대립가설을 채택")
else:
print("귀무가설을 채택")

단일 표본을 사용하는 경우는 내가 얻은 수치의 평균이 실제 평균과 비슷한지 정합성을 검증하기 위해 사용한다.
가설: tip의 값이 이전보다 2정도 증가했을 때 기존과 차이가 없을 것이다.
data2=data.copy()
#기존 tip에+2가 들어간 tip+열 제작
data2["tip+"]=data2["tip"]+2
score1=np.random.choice(data["tip"],30)
score2=np.random.choice(data2["tip+"],30)
t_stat2,p_value2=stats.ttest_ind(score1,score2)
print(f'T값은 {t_stat}, p-value는{p_value}')
if p_value<0.05:
print("대립가설을 채택")
else:
print("귀무가설을 채택")

대립가설을 채택하였으므로, +2는 기존과 차이가 명확하다고 볼 수 있다.
가설: tip 값이 2 정도 증가했을 때 전후 차이는 없을 것이다.
#같은 위치에서의 데이터 셋 가져오기
before=data2["tip"][:30]
after=data2["tip+"][:30]
t_stat3,p_value3=stats.ttest_rel(before,after)
print(f'T값은 {t_stat3}, p-value는{p_value3}')
if p_value3<0.05:
print("대립가설을 채택")
else:
print("귀무가설을 채택")

대응 표본 T-test를 수행한 결과 위와 같이 +2를 할 경우 대립가설이 채택되는 것을 알 수 있다. 그리고 이전 독립 표본 t-test와 비교할 때 T값의 절대값이 훨씬 작은 것을 알 수 있다. 이는 실제 독립 때 보다 차이가 훨씬 더 적기에 발생한 것으로 보인다.
*주의: 대응 표본을 할 경우, 전후 같은 대상을 바탕으로 대응을 해야함.
가설: tip이 2,3 정도 증가했을 때, 서로간에 차이는 없을 것이다.
data2=data.copy()
data2["tip+"]=data2["tip"]+2
data2["tip++"]=data2["tip"]+3
score1=np.random.choice(data["tip"],30)
score2=np.random.choice(data2["tip+"],30)
score3=np.random.choice(data2["tip++"],30)
#3 그룹간 평균 차이에 대한 T-test 실시
p_values = []
p_values.append(stats.ttest_ind(score1, score2).pvalue)
p_values.append(stats.ttest_ind(score2, score3).pvalue)
p_values.append(stats.ttest_ind(score3, score1).pvalue)
#본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)
for i, p in enumerate(p_values):
print(f'검정 {i+1}, p-value는{p}')
if p<adjusted_alpha:
print("대립가설을 채택")
else:
print("귀무가설을 채택")

다중 검증 결과 대부분 모든 검증 사이에서는 대립가설이 채택되었다는 것을 볼 수 있었다. 즉 +2와 +3의 증가는 생각보다 크게 영향을 준다고 볼 수 있다.
*주의
#본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)
*장점. Anova뿐만 아니라 비모수 검정 등 다양한 상황에 적용 가능
*단점. 비교 횟수가 많아지면 통계적 유의성이 작아져 찾기가 더욱 어려워짐.
from statsmodels.stats.multicomp import pairwise_tukeyhsd
#tukey 적용
tukey = pairwise_tukeyhsd(endog=df['value'], # 데이터 값
groups=df['group'], # 그룹 분류
alpha=0.05) # 유의수준
*장점. 집단 간 표본 수가 같을 때 가장 널리 사용되며, 보수적인 본페로니에 비해 탐지율이 높음.(Anova분석 이후 집단별로 분석할 때 좋음)
*단점. 집단 수가 매우 많으면 비교 횟수가 폭발적으로 증가.(처리 시간 증가->비효율)
import scikit_posthocs as sp
# 던넷 보정(Dunnett's test) 수행
result = sp.posthoc_dunnett(
df,
val_col='value',
group_col='group',
control='Control'
)
*장점. 대조군 대비 유의성을 확인할 때 튜키보다 더 유력한 검정력을 가짐.(Ex. 새로운 약물이 기존 대조군보다 효과있는지를 파악할 경우 기존 A,B약물과 새로운 C약물하고 만 비교, A,B사이에는 비교X)
*단점. 비교 대상이 반드시 필요.(위의 Control이 바로 비교 대상)