본문 바로가기

통계학 기초

[Python]독립표본(Independent Samples) T-Test를 활용한 A/B Test 검증(코드부터 결과 해석까지 한 번에)

반응형

E-commerce에서 가장 많이 하는 데이터 분석 업무 중 하나가 바로 A/B Test이다. 빈도주의 관점에서 실행할 수 있는 모델링 중 가장 기초적이면서도 바로 실무에 활용할 수 있는 모델이 독립표본 T-test이다. 이번 포스팅에서는 모델에 대한 기본 소개, 가설부터 시작하여 예제 코드까지 다루어볼 예정이다.

 

 

목차

1. E-commerce 환경에서 A/B Test의 기본적인 소개

2. 독립표본 T-Test의 소개 및 기본 가설

3. A/B Test 환경에서 실행하는 독립표본 T-Test

 

 

1. E-commerce 환경에서 A/B Test의 기본적인 소개

 

🔎 A/B Test라는 것은 무엇이며, 왜 필요하나요?

예시로 이해하는 A/B Test

쉬운 버전으로 말하면, A/B Test은 기본적으로 두 가지 대안이 있을 때, 어떤 옵션이 더 나은 성과를 보여주는지 진행하는 실험이다. 예를 들어서, 위의 나무 이모티콘 중 앱에서 어떤 이모티콘이 더 나을지 판단해야 하는 상황이라고 해보자. 누구는 야자수 나무가 더 매력적이라고 할 수 있고, 일반적인 나무가 더 매력적이라고 하는 사람들이 있을 수 있다. 하지만 다들 자신들의 주장일 뿐 객관적인 근거가 없다. 이런 상황에서 갈등이 지속되면 발전적인 논의가 불가능하고, 결국 목소리 큰 사람의 의견대로 될 것이 자명하다. 

 

A/B Testing의 필요성은 회사나 조직에서 의사결정을 할 때, 객관적인 데이터에 근거해서 소비자들이 실제로 어떤 대안을 좋아하는지, 비즈니스에 어떤 것이 더 더움이 되는지 판단할 수 있는 근거를 제공하는 역할을 해주기에 많은 회사들에서 채택하고 있다.

 

 

 

🔎 빈도주의 모델로 바라본 A/B Test 모델링

 

이번에는 조금 더 통계적인 관점에서 A/B Testing 모델링을 생각해보려 한다. 우선 상황을 바라보면, 독립변수는 Group에 해당하며 척도로 따지면 명목 척도(Nominal Scale)에 해당하고, 종속변수는 각 실험의 성공 지표로 보통은 CTR(클릭률) 또는 전환율(CVR)을 활용하게 되어 비율 척도(Ratio Scale)를 활용하게 된다.

 

 

E-commerece 환경에서 설정하는 가설 또한 굉장히 단순하다. 아래의 경우를 한 번 살펴보자.

  • E-commerce의 A/B Testing에서 설정하는 가설
    • 귀무가설(H0): Control Group's Metric(CVR, CTR) <= Treatment Group's Metric(CVR, CTR)
    • 대립가설(H1): Control Group's Metric(CVR, CTR) > Treatment Group's Metric(CVR, CTR)

이렇게 가설을 설정하는 이유는 굉장히 단순하다. 왜냐하면 새로 출시하는 Feature나 디자인이 기존 것보다 효과성이 떨어진다면 굳이 출시할 이유가 없기 때문이다. 또한 위의 가설로 실험했을 때 나중에는 기대수익과 기대손실까지 계산해 낼 수 있기 때문에 A/B Testing을 실행하게 된다.

 

 

독립변수는 명목척도에 종속변수는 비율척도인 상황에서 가설 검정을 위해서 채택할 수 있는 대표적인 모델은 T-Test와 Z-test가 있다. 또한 CVR과 CTR은 사실 0과 1로 이루어진 이항분포로도 볼 수 있기 때문에 카이제곱(chi-square) 모델링으로도 검증이 가능하다. 오늘은 이 모델들에 대해서 기본적인 개념과 실행하는 방법에 대해서 소개해보도록 하겠다. 

 

 

※ 참고 사항 - 독립변수가 3개 이상이되면 ANOVA를 실행해야 하지만, 이번 포스팅 주제와 다소 거리가 멀어질 것 같아 다른 포스팅에서 다루어보겠다.

 

 

 

 

2. 독립표본 T-Test의 소개 및 기본 가설

 

🔎 T-Test는 무엇인지 간단하게 설명해줄 수 있나요?

 

Independent T-Test(독립표본 T-Test)는 두 집단 평균 차이가 유의한 지 밝히는 대표적인 모델이다. 다른 이름으로는 Student T-Test라고 불리며, 많은 사회과학 논문에서 채택되고 있는 방법이다. 기본적으로 두 개의 표본으로부터 추정된 분산을 기반으로 두 집단 간 평균에 차이가 있는지 없는지를 밝혀내는 모델링이라고 이해하면 된다. 

 

  • T-Test의 귀무가설과 대립가설
    • 귀무가설: Control's CVR = Treament's CVR
    • 대립가설: Control's CVR ≠ Treatment's CVR
  • T-Test에서 지켜야 하는 기본적인 과정
    • 변수들의 분포는 양측대칭이어야 하는 특징이 있다.
    • 변수들의 분포는 등분산성을 가져야 한다. 

 

가설에서 볼 수 있듯이, T-Test는 두 집단 간 차이가 있는지를 알려주는 모델이지, 어떤 그룹이 더 높거나 얼마나 높은지 보여주는 모델이 아니다. 따라서 T-Test 결과가 나왔다고 해서 무조건적으로 Treatment Group이 평균적으로 더 높다고 해석하면 안 된다. Test 이후에 Effect Size에 대한 탐구는 더 심도 있는 분석을 통해서 밝혀내야 한다. 보통은 두 그룹의 분포를 그려보고, 이에 대한 기술 통계값을 내본다음에 최종적으로 Control을 선택할지 Treatment를 선택할지 밝히는 것이 일반적이다. 

 

참고로 T-Test에도 여러가지 종류가 있는데, 이번 포스팅 주제와는 다소 결이 다르니 다른 포스팅에서 조금 더 자세히 다루어볼 예정이다. 

 

 

 

3. A/B Test 환경에서 실행하는 독립표본 T-Test

 

🔎 A/B Testing에 상황을 통한 T-Test 활용의 이해

 

  • T-Test(Independent T-Test)로 A/B Test를 검증하는 과정
    • Step1. 실험을 통해 대응되는 표본 2개에서 데이터를 수집
    • Step2. 각 표본의 데이터가 정규 분포를 이루고 있는지 검증
    • Step3. 두 개의 표본 데이터가 등분산성을 이루고 있는지 검증
    • Step4. Independent T-test를 통해서 두 개의 집단 간 평균차이가 있는지 검증
    • Step5. 기술통계 및 분포를 확인하여 평균 차이를 계산

위에서 말한 5가지 과정을 거치면 독립표본 T-Test를 활용한 A/B Test를 검증할 수 있다. 각각의 과정을 Code로 설명해보고자 한다. 사실 Step1은 데이터를 수집하는 과정이라 임의의 데이터를 생성하여 대체하는 것으로 하겠다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## Step1. 실험 데이터 생성 
 
#control
mu_0 = 0.54
std_0 = 0.031
 
#treatment
mu_1 = 0.62
std_1 = 0.032
 
## 표본 사이즈 결정 
sample_size = 1000
 
## 
control = stats.norm(mu_0, std_0).rvs(sample_size)
treatment = stats.norm(mu_1, std_1).rvs(sample_size)
cs
 

 

 

 

두 번째 과정은 각 표본이 정규 분포를 형성하고 있는지 검증하는 과정이다. 이번 포스팅에서는 Shapiro 테스트를 통해서 정규성을 검증할 것이다. 주의할 점은 Shaprio 테스트는 P-value가 0.05 초과여야지 정규성이 확보가 되는 것이기 때문에 수치해석에 주의가 필요하다. 

 

1
2
3
4
5
6
## 각 표본의 정규성 
control_normal = shapiro(control)
treatment_normal = shapiro(treatment)
print(control_normal.pvalue
      , treatment_normal.pvalue
      , sep = '\n')
cs

Shapiro Test를 통한 정규성 검정
Shapiro Test를 통한 정규성 검정

 

 

세 번째 과정은 두 표본이 등분산성을 이루고 있는지 확인하는 것이다. 이번에는 Levene 모델을 활용하여 검증할 예정이다. 여기에서도 주의할 점은 Levene 테스트의 p-value가 0.05 초과여야 등분산성이 확보가 된 것이다. 결과 해석 시 주의가 필요한 부분이다. 

 

1
2
3
4
# 등분산성 고려
from scipy.stats import levene
print(levene(control, treatment))
 
cs

Levene Test를 통한 등분산성 검증
Levene Test를 통한 등분산성 검증

 

 

네 번째 과정은 대응 표본 T-Test 결과를 해석하는 것이다. 모델은 scipy.stats에 등록되어 있는 모델을 활용하였다. 아래의 사진을 보면 P-value가 0.05보다 훨씬 작은 숫자를 기록하였다. 따라서 두 모델 간 평균에는 차이가 확실하게 있는 것으로 볼 수 있다. 하지만 여기서도 아직 누구의 평균이 더 큰지는 모르는 것이기 때문에 주의해야 한다. 

 

python 대응표본 t test 수행
python  독립표본 t test 수행

 

 

마지막 과정은 실제 기술통계값을 확인하고 분포를 그려봐서, 누가 얼마나 더 높은지 확인을 해야 하는 과정을 거쳐야 한다. 아래의 사진을 보면 약 0.08 즉 8%의 전화율 차이를 보여주는 실험 결과를 확인할 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
plt.rcParams['figure.figsize'= (86)
 
sns.distplot(control)
sns.distplot(treatment)
 
plt.title('CVR Distribution of the Experiment', fontsize = 15, pad = 10)
 
plt.legend(['control''treatment'])
 
 
plt.axvline(control.mean(), linestyle = '--')
 
plt.axvline(treatment.mean(), linestyle = '--', color = 'r', alpha = 0.5)
 
plt.grid(alpha = 0.4);
cs
 
A/B Test 실험 결과 분포
T-Test 기술통계량 차이

 

 

여기까지 독립표본 T-Test를 활용해서 어떻게 A/B Test를 실행할 수 있는지에 대해서 알아보았다. 사실 다른 많은 방법들이 존재하고, 이는 그중 한 가지일 뿐이니 참고하기를 바란다.

반응형