지표가 왜 올라가는지(or 내려가는지)원인을 명확히 모르면 기능 개선건 마다 직감으로 선택하게 된다. 물론 도메인에 있는 사람들의 직감 그자체가 빅데이터가 될수 있다.
하지만 많은 다양한 실험에서는 이해할 수 있는 논리적 근거를 통해서 설득을 하여 의사결정을 유도해야 한다.
그렇게 발견한 원인을 바탕으로, 성공확률이 더 높은 도전을 해야한다. 오늘 다루어볼 A/B테스트 역시 그렇다.
원인을 기반으로 제대로 변경된 기능을 추가하여, 비교해서 실험을 해야 실험기간동안 발생한 비용에 가치를 부여할 수 있게 된다.
유명한 예시 중 하나로 쿠팡역시 지금의 쿠팡이 되기까지 여러가지의 일들이 있었겠지만, 인과추론을 통하여 로켓배송의 도입을 결정했고, 지금의 모두가 아는 위치가 되었듯이 비즈니스 핵심 가설검증에는 인과추론이 필요하다.
A/B테스트를 간단하게 이해하는것은 너무쉽다.
예를들어 스스로 이커머스 데이터분석가 라고 생각해보자.
현재는 고객들이 결제를 할때 "결제하기" 라는 버튼 하나로 디자인이 되어있다(대조군).
어느날 고객들이 결제를 더 편리하게 할 수 있게 결제를 할때 "결제하기"버튼 옆에 "간편하게결제하기"버튼을 통해서 미리 등록해둔 카드가 있으면 현재의 단계에서 바로 결제할 수 있게 버튼을 추가(처리군)하는게 어떨까? 라는 의견이 나왔다고 해보자.
우리는 직감이 아닌 데이터를 통해서 결정을 하기를 원한다. 이때 사용할 수 있는것이 A/B테스트 이다.
기존에 "결제하기" 버튼만 있는경우(대조군)와 "간편하게 결제하기" 버튼이 같이 있는(처리군)경우 를 무작위로 선발하여 두개의 디자인을 구분해서 보여준다.
그 중 어떤것이 더 결제를 최종 유도하는데 도움이 되었는지를 데이터를 뽑아보고 유의성 검증을 하는방법이다.
샘플사이즈결정, 검정력 등의 절차는 제외하고 진행한 예시이다.
import numpy as np
from scipy.stats import chi2_contingency
# 설정된 결제 전환율 (두개의 디자인에 대해서 각각의 결제 전환율이 10%, 12%라고 가정)
conversion_rate_a = 0.10
conversion_rate_b = 0.12
# 데이터 샘플 사이즈(두 그룹이 결제창 까지 도달한 수가 다른 경우로 설정 )
sample_size_a = 4500
sample_size_b = 5000
# 무작위 데이터 생성
np.random.seed(0)
data_a = np.random.choice([0, 1], size=sample_size_a, p=[1-conversion_rate_a, conversion_rate_a])
data_b = np.random.choice([0, 1], size=sample_size_b, p=[1-conversion_rate_b, conversion_rate_b])
# 결제 전환 횟수 계산
conversions_a = np.sum(data_a)
conversions_b = np.sum(data_b)
# 카이제곱 검정을 위한 데이터 테이블 준비
# 행: 디자인 A, B / 열: 전환 안 됨(0), 전환 됨(1)
contingency_table = np.array([
[sample_size_a - conversions_a, conversions_a], # 디자인 A
[sample_size_b - conversions_b, conversions_b] # 디자인 B
])
# 카이제곱 검정 실시
chi2, p_value,dof, expected = chi2_contingency(contingency_table)
# 출력
chi2, p_value, conversions_a, conversions_b
>>>
(2.2743414365720556, 0.13153098615543712, 472, 574)
이번 실습에서는 클릭한경우(0)/ 클릭하지않은경우(1)에 대한 A/B 테스트를 진행했기 때문에 명목형데이터의 유의성검증 방법중 하나인 카이제곱검정을 통해서 p_value를 산출해 봤고, 결과는 0.13이 나왔으며, 이 숫자는 0.05보다 크기때문에 B안을 채택한다고 해서 기존의 대조군대비 클릭율이 높다고 할 수 없다.
t검정으로 유의성검증을 할 수 있도록 체류시간 데이터를 임의로 만들어서 A/B 테스트 예시는 아래와 같다.
from scipy.stats import ttest_ind
# 가상 데이터 생성을 위한 설정
mean_a = 30 # 집단 A의 평균 체류 시간 (분)
std_a = 5 # 집단 A의 표준편차
size_a = 3000 # 집단 A의 샘플 크기
mean_b = 35 # 집단 B의 평균 체류 시간 (분)
std_b = 5 # 집단 B의 표준편차
size_b = 100 # 집단 B의 샘플 크기
# 무작위 데이터 생성
np.random.seed(0) # 결과의 일관성을 위한 시드 설정
data_a = np.random.normal(mean_a, std_a, size_a)
data_b = np.random.normal(mean_b, std_b, size_b)
# t-검정 실시
t_statistic, p_value = ttest_ind(data_a,
data_b,
equal_var=False
)
t_statistic, p_value
>>>
(-8.892728582407562, 1.8612566139829197e-14)
p값을 보면 매우작은값으로 처리군이 유의미하게 체류시간이 길 확률이 높은 결과가 나왔습니다.
equal_var = False를 : 표본수가 차이가나고, 분산이다른경우 -> 이번실험의 경우 표준편차가 동일하지만 보수적으로 생각했을때 표본수의 차이가 있기때문에 False를 사용 함으로서 "웰치의 T검정실행"
여기까지 간단하게 A/B테스트는 무엇이고, 테스트 단계중 결과해석 및 결론 도출부분에 대해서 이야기 했다.
다음 글에서는 A/B테스트를 설계하는 방법에대해 전체과정을 학습후 다루어볼것이다.