본문 바로가기

프로그래밍/데이터사이언스

A/B 테스트를 하는 두가지 방법(p-value를 이용한 빈도론, 베이지안론) 설명과 파이썬으로 계산하기

A/B 테스트를 하는 대표적인 방법은 2가지가 있다.

첫 번째는 빈도론, 두 번째는 베이지안론이다.

 

일단 두 가지 이론을 알기 전에 A/B테스트가 무엇인지 알아보자.

A/B 테스트는 두 개의 그룹으로 나눈 다음 특정한 상황을 제시하고 각각의 반응을 비교하는 분석방법이다.

 

만약 새롭게 온라인 쇼핑몰을 열었다고 가정해보자. 

A라는 디자인의 웹 페이지가 있고 B라는 디자인의 웹 페이지가 있다. 그럼 당신은 이 둘 중에 하나를 선택해야 한다. 어떻게 선택할 것인가? 당연히 구매전환율이 높은 웹 페이지로 선택해야 된다. 그러면 A디자인의 웹 페이지를 들어온 사람 람들의 구매전환율과 B디자인의 웹 페이지로 접속한 사람들의 구매전환율을 파악한 다음 결정하면 된다.  이것이 바로 A/B 테스트이다.

 

빈도론

빈도론을 설명할 때 대표적인 예시로는 동전이 앞면, 뒷면이 있다. 동전을 던졌을 때, 앞면과 뒷면이 나올 확률은 각각 50%이다. 하지만 10번을 던진다고 해서 앞면 5번, 뒷면 5번이 나오는 것은 아니다. 앞면 1번, 뒷면 9번이 나올 수 도 있다. 따라서 10번을 던졌을 때의 앞면, 뒷면 횟수로 결론을 짓기에는 무리가 있다. 하지만 동전을 10000번 던진다고 가정해본다면 앞면이 나올 확률과 뒷면이 나올 확률을 거의 비슷할 것이다.

그러므로 빈도론은 무조건 실험 횟수가 많을수록 유의미하다.

 

빈도론 기반의 A/B 테스트는 각 상황에서 나온 결과가 과연 유의미한 통계적 차이를 갖는지 검사한다. 통계적 차이의 유의미함은 p-value로 결정하는데 보통 p-value가 0.05보다 낮다면 가설을 기각한다.

 

위에서 언급한 온라인 쇼핑몰을 예로 들어보자

A디자인으로 접속한 사람들이 500명이고, 구매로 이어진 사람들은 100명이라고 한다.

B디자인으로 접속한 사람들은 600명이고, 구매로 이어진 사람들은 80 명 이라고 한다.

 

  접속한 사람의 수 구매한 사람의 수
A 디자인 500 100
B 디자인 600 80

대립가설 : 웹 홈페이지의 디자인으로 인한 구매율의 차이는 있을 것이다.

기무가설 : 웹 홈페이지의 디자인과 구매율은 상관이 없다.

 

이 두개를 파이썬의 chi2_contingency를 이용해서 계산해본다.

import numpy as np
from scipy.stats import chi2_contingency

web = np.array([[500, 100], [600, 80]])
chi2, p, dof, ex = chi2_contingency(web)
print(p)

p-value가 0.014가 나왔다. 0.05보다 작은 값이므로 웹 홈페이지의 디자인으로 인해 구매율이 차이가 난다는 대립가설을 채택할 수 있다. 간단하게 말하면 홈페이지의 디자인 차이는 구매율에 영향을 준다.

 

베이지안론

빈도론은 경험적으로 어떠한 사건을 경험하고 확률을 얻는다. 하지만 베이지안론은 우리가 경험하지 않았던 사건에 대한 확율을 알려준다. 동전던지기를 예를 들어보자

빈도론
나는 동전을 1000번 던져봤어 그랬더니 앞면이 490번, 뒷면이 510번 나왔지(경험) 결국 앞면과 뒷면이 나올 확률은 반반이라고 보면 돼(추론)
베이지안론
동전을 1000번 던진다니, 그럴 필요가 없는걸(경험안함) 난 동전을 던졌을때 앞면과 뒷면이 나올 확률이 반반이라고 확신해(추론)

베이지안론의 확률식은 이렇습니다.

해석해보자면, P(A|B) => B가 일어났을 때 A가 일어날 확률을 구하는 식입니다.

 

베이지안의 예시를 음주운전 단속 예시로 들어보겠습니다.

- 전체 단속 검사자 중 0.5% 확률로 음주자가 있습니다.

- 술을 먹지 않았는데 음주운전 단속에 걸릴 확률은 0.1% 입니다.

- P(Drinker|+)는 음주운전 단속에 걸렸는데 실제로 술을 마신 사람입니다.

 

식으로 나타내면

P(Drinker|+) 

(해석 : 음주운전 단속에 걸렸는데 실제로 술을 마실 확률)

TPR = 0.99 # 민감도, 음주단속 결과가 양성일 때 실제 술을 마셨을 비율
drinker = 0.005 # 술을 마신 사람
FPR = 0.01 # 특이도, 음주단속 결과가 양성일 때 실제 술을 안마신 비율
not_drinker = 1 - drinker # 술을 안마신 사람

numerator = TPR * drinker 
denominator = (TPR * drinker) + (FPR * not_drinker)
posterior_probability = numerator / denominator
posterior_probability