QA/QC 내일 배움 캠프 28일차

방귀현·2026년 4월 15일

1. T-test 이론

1. T-test와 AB 검정

AB 테스트란?

  • 두 그룹(A,B) 중 어느 것이 더 효과적인지 평가하기 위해 사용하는 검정 방법.
  • 마케팅, 웹사이트 디자인 등에 주로 전후 차이를 비교하는 데 많이 사용.
  • 목적 두 그룹 간의 변화가 유의미 한지를 확인하기 위해 실시(T-test와 유사)


이떄 T test를 진행할 경우 두 그룹의 평균 차이가 평균으로부터 얼마나 떨어져 있는지를 통해 p-value 값을 구할 수 있음. 즉, AB테스트는 두그룹의 차이를 분석하는 만큼 T-test를 유용하게 활용할 수 있는 검정임.

* 실제 예시
알리미에서는 실제 여러나라를 대상으로 AB테스트를 실시. 예를 들어 앱 다운로드와 관련하여 슬로건 강조여부, 대상 고객 정의, 이미지 변환을 통해 전후 차이를 비교하기도 하였음.

주의
1. AB테스트를 진행할 경우 AB테스트의 리소스는 제한되어 있기에 AB테스팅의 파급력을 고려해야함.
2. A/B테스트를 실행할 경우 외부 요인을 제한해야함. 예를 들어 기간 별로 A/B 테스팅을 별개로 진행할 경우 외부요인으로 인해 달라진 것일 수 있기 때문.
3. 적절한 모수를 찾아야한다. 모수가 적을 경우 제대로된 결정을 내리기 힘들기 때문.

1종 오류와 2종 오류

  • 1종 오류는 귀무가설이 참인데 기각하는 오류 이며, 2종 오류는 대립가설이 참인데 기각하는 오류를 말함.
귀무가설 참대립가설 참
귀무가설 채택옳은 결정제 2종오류
대립가설 채택제 1종 오류옳은 결정

* 이떄 1종 오류가 발생하지 않을 확률을 1α1-\alpha라 하며, 2종 오류가 발생하지 않을 확률을
1β1-\beta라고 한다.
* 실제 가설을 검증하는 과정에서 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
여기 참조.

2. T-test 실습

  • T-test 종류: 단일 표본, 독립표본, 대응표본, 다중검증
    -사용 데이터셋: seaborn 라이브러리에 속한 tip데이터셋

1. 단일 표본

가설: 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("귀무가설을 채택")


단일 표본을 사용하는 경우는 내가 얻은 수치의 평균이 실제 평균과 비슷한지 정합성을 검증하기 위해 사용한다.

2. 독립 표본

가설: 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는 기존과 차이가 명확하다고 볼 수 있다.

3. 대응 표본

가설: 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값의 절대값이 훨씬 작은 것을 알 수 있다. 이는 실제 독립 때 보다 차이가 훨씬 더 적기에 발생한 것으로 보인다.
*주의: 대응 표본을 할 경우, 전후 같은 대상을 바탕으로 대응을 해야함.

4. 다중 검증

가설: 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의 증가는 생각보다 크게 영향을 준다고 볼 수 있다.
*주의

  • 하나의 검정에서 제1종 오류가 발생하지 않을 확률은 1α1-\alpha이다.
  • m개의 독립된 검정에서 제1종 오류가 전혀 발생하지 않을 확률은 (1α)m(1-\alpha)^{m}이다.
  • 따라서, m개의 검정에서 하나 이상의 제1종 오류가 발생할 확률(즉, 전체 제1종 오류율)은 1(1α)m1-(1-\alpha)^{m}이다.
  • 이 값은 m이 커질수록 빠르게 증가한다. 예를 들어, α=0.05, m=10인 경우
  • 1(10.05)100.4011-(1-0.05)^{10} \approx 0.401
  • 즉, 10개의 가설을 동시에 검정할 때 하나 이상의 가설에서 제 1종 오류가 발생할 확률이 약 40.1% 이므로 개별검증에서 발생하는 오류율(5%)보다 높다.
  • 이에 대처하기 위해서는 본페로니 보정, 튜키 보정, 던넷 보정, 윌리엄스 보정 등을 사용하여 보정을 해야함.

3. 다중검증 시 오류 보정 방법

1. 본페르니 보정

  • 유의 수준을 가설 검증의 갯수로 나누어 더 엄격하게 유의수준을 낮추는 방식.
#본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)

*장점. Anova뿐만 아니라 비모수 검정 등 다양한 상황에 적용 가능
*단점. 비교 횟수가 많아지면 통계적 유의성이 작아져 찾기가 더욱 어려워짐.

2. 튜키 보정

  • 모든 가능한 쌍의 평균 차이를 비교
from statsmodels.stats.multicomp import pairwise_tukeyhsd

#tukey 적용
tukey = pairwise_tukeyhsd(endog=df['value'],     # 데이터 값
                          groups=df['group'],   # 그룹 분류
                          alpha=0.05)           # 유의수준

*장점. 집단 간 표본 수가 같을 때 가장 널리 사용되며, 보수적인 본페로니에 비해 탐지율이 높음.(Anova분석 이후 집단별로 분석할 때 좋음)
*단점. 집단 수가 매우 많으면 비교 횟수가 폭발적으로 증가.(처리 시간 증가->비효율)

3. 더넨 보정

  • 하나의 대조군(Control)과 나머지 실험군들(Treatment)만 비교.
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이 바로 비교 대상)

profile
QA/QC 전문가를 목표로!

0개의 댓글