OkBublewrap

2025-01-08 TIL (A/B Test, 통계분포) 본문

Today I Learning

2025-01-08 TIL (A/B Test, 통계분포)

옥뽁뽁 2025. 1. 8. 13:35

아티클 # 17

 

A/B 테스트 제대로 이해하기: ②A/B 테스트를 위한 기초 통계 이해하기 | 요즘IT

앞선 글에서 A/B 테스트를 설계하거나 수행할 때 ‘목표를 달성하기 위한 방안으로 A와 B 중 어느 게 더 나은가?’ 뒤에 숨은 진짜 질문에 관해 살펴보았다. 이번 글에서는 이러한 우리의 진짜 질

yozm.wishket.com

 

1. 아티클 주요 내용 요약

  • 핵심 주제 : 이게 우연인가?
  • 주요 내용 :
    • 일부를 통해서 전체에 대해 추론할 수 있다.
    • 양측 검정 :
      • 귀무가설 : A와 B사이 차이가 없다
      • 대립가설 : A와 B사이 차이가 있다
    • 단측 검정 :
      • 귀무가설: A − B ≤ 0 
      • 대립가설: A − B > 0
    • 실험 결과도 추측
      우리가 관심이 있는 특정 유형의 고객 중 실험에 노출된 일부를 바탕으로 해당 유형 고객의 전체를 추측한 것
    • 점 추정 : 특정 한점
    • 구간 추정 : 범위
    • 표준 오차 : 샘플 평균이 모집단 평균을 얼마나 잘 추정할 수 있는지를 나타내는 척도
    • 실험을 N번 하면 N번마다 결과는 다를 수 있다.
      왜냐하면 아무리 비슷하게 세팅해도 결국에는 모두 각각 다른 사람이니까

 

 

A/B Test 예제

Kaggle moilbe-games-ab-testing

참고 스터디

 

DataScienceForMarketing/03_[Retention]_ABtest.ipynb at master · pynoodle/DataScienceForMarketing

마케팅을 위한 데이터 분석. Contribute to pynoodle/DataScienceForMarketing development by creating an account on GitHub.

github.com

 

userid version sum_gamerounds retention_1 retention_7
9999441 gate_40 97 True False
9999710 gate_30 30 Fasle False

 

- version : 실험군, 대조군

- sum_gamerounds : 첫 설치후 14일 간 유저가 플레이한 라운드 수

- retention_1 : 유저가 설치 후 1일 이내에 다시 돌아왔는지 여부

- retention_7 : 유저가 설치 후 7일 이내에 다시 돌아왔는지 여부

 

문제 정의

Cookie Cats 게임에서는 특정 스테이지가 되면 스테이지가 Lock되게 합니다. Area Locked일 경우 Keys를 구하기 위한 특별판 게임을 해서 키 3개를 구하거나, 페이스북 친구에게 요청하거나, 유료아이템을 구매하여 바로 열 수 있다. Area Locked Lock을 몇 번째 스테이지에서 할 때 이용자 retention에 가장 좋을지 의사결정을 해야합니다.

 

Gate_30 그룹 : 44700

Gate_40 그룹 : 45489

 

이상치를 제거한 14일간 플레이한 라운드 수

 

100 라운드까지 게임한 유저 수

 

그룹별 1-day Retention의 평균

gate_30 0.448198
gate_40 0.442283

 

단순 평균 비교로 gate_30에 Area Locked Lock을 두는 것이 gate_40에 두는 것이 맞는 것일까?

 

Bootstrap - 두 그룹간의 차이가 유의미한지 알아보는 방법

Bootstrap : 무작위 중복 추출

df.sample(frac = 1,replace = True).groupby('version')['retention_1'].mean()

 

레벨 30에 있을 때 1-day retention이 클 확률 : 96.2%

 

그룹별 7-day Retention의 평균

gate_30 0.190183
gate_40 0.182000

 

bootstrap 방식으로 진행

레벨 30에 있을 때 7 -days이 클 확률 : 0.996

 

결론

부트스트랩 결과는 게이트 레벨 40에 있을 때 보다 레벨 30에 있을 때 7일 retention이 더 높다는 증거가 있음

rention을 늘리기 위해서 게이트를 레벨 30에서 레벨 40으로 이동해서는 안된다.

 

 

T-Test

독립표본 T-검정

1-day retention

  • 통계량 : 1.78711
  • p-value : 0.0739
  • df = 90186

7-day retention

  • 통계량 : 3.1575
  • p-value : 0.001591
  • df = 90186

 

해석

1. t-score이 크면 두 그룹이 다르다

2. p-value : 작을 수록 데이터가 우연히 발생한 것이 아니라는 것을 의미

3. 1-day retention은 유의미 하지 않게 나오고 7-day retention은 유의미한 차이가 있다

4. 7-day retention은 gate30그룹이 gate40보다 높은 것은 우연히 발생한 일이 아니다.

5. gate는 30에 있는 것이 40에 있는 것보다 7-day retention에서 더 좋은 선택지이다.

 

실행했던 T-test는 retension 여부를 0, 1으로 두고 분석한 것이기 때문에, 카이 제곱검정을 하는 것이 더 좋은 방법이다.

H0 : 독립적이다 (상관관계가 없다)

H1 : 독립적이지 않다 (상관관계가 있다)

sum()

  sum_gamerounds retention_1 retention_7
gate_30 2294941 20034 8501
gate_40 2333530 20119 8279

 

count()

  count
gate_30 44699
gate_40 45489

 

카이제곱-독립성 검정

1-day retention

  • 통계량 : 3.1698
  • p-value : 0.075009
  • dof = 1
20252.35 25236.64
19900.64 24798.36

 

7-day retention

  • 통계량 : 9.91527
  • p-value : 0.0016391
  • dof = 1
20252.35 25236.64
19900.64 24798.36

 

1-day retention은 유의확률이 0.075이고 귀무가설 채택, 즉 독립적이다(상관관계가 없다)

7-day retention은 유의확률이 0.0016이고 귀무가설 기각, 즉 독립적이지 않다(상관관계가 있다)

 

결론

gate는 30에 유지 해야 하고

더 다양한 메트릭을 고려해야 한다.

 

 


 

통계

베르누이 분포

정의 : 확률 변수가 취할 수 있는 경우 2가지인 경우

확률 : 0과 1사이 값이며 모든 경우 확률의 합은 1

확률 변수 : 변수가 가질 수 있는 경우의 수를 표현하는 방법

 

$$ P(X = x) = \begin{cases} p & \text{if } x = 1, \\ 1-p & \text{if } x = 0, \end{cases} $$

 

평균

$$ \mathbb{E}[X] = p $$

 

분산

$$ \text{Var}(X) = p(1-p) $$

 

이항 분포

베르누이 분포 N번 실행

 

$$ X \sim B(n, p) $$

 

$$ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k}, \quad k = 0, 1, 2, \dots, n $$

 

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom

# 이항분포 정의
n_large = 100  # 100명이 시행
p_large = 1 / 2  # 클릭 확률 0.5

#데이터 생성
x_large = np.arange(0, n_large + 1)

# 100명의 시행횟수 수행
y_large = binom.pmf(x_large, n_large, p_large)

# Normal approximation (mean and standard deviation)
mean = n_large * p_large
std = np.sqrt(n_large * p_large * (1 - p_large))
normal_approx = (1 / (std * np.sqrt(2 * np.pi))) * np.exp(-0.5 * ((x_large - mean) / std) ** 2)

# 이항분포와 정규분포 시각화
plt.figure(figsize=(10, 6))
plt.bar(x_large, y_large, color='blue', alpha=0.5, label='Binomial Distribution')
plt.plot(x_large, normal_approx, color='red', lw=2, label='Normal Approximation')
plt.xlabel('Number of Users Clicking')
plt.ylabel('Probability')
plt.title(f'Binomial Distribution (n={n_large}, p={p_large:.2f}) vs Normal Approximation')
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

 

균등 분포

정의 : 모든 x에 대애서 확률이 동일한 분포입니다.

연속확률 분포중 하나

 

정규 분포

$$ X \sim N(\mu, \sigma^2) $$

 

왜도(skewness) : 얼마나 치우쳐져있나

Right Skewness : Skewness > 0

Left Skewness : Skewness < 0

 

첨도(kurtosis) : 얼마나 평균에 모여있냐

 

  • Kurtosis > 0 (양의 첨도):
    • 뾰족한 분포를 나타냅니다.
    • 데이터가 평균 근처에 많이 몰려 있고, 꼬리가 길고 두꺼운 형태를 가집니다.
    • 예: 극단적인 값(꼬리 값)이 더 자주 나타나는 분포.
  • Kurtosis < 0 (음의 첨도):
    • 뭉툭한 분포를 나타냅니다.
    • 데이터가 중심에서 덜 몰려 있고, 꼬리가 짧고 얇은 형태를 가집니다.
    • 예: 극단적인 값이 적고, 분포가 더 평평함.

 

표준정규분포

$$ Z = \frac{\bar{x} - \mu}{\sigma}  \sim N(0, 1) $$

 

'Today I Learning' 카테고리의 다른 글

2025-01-10 TIL (QCC 리뷰)  (0) 2025.01.10
2025-01-09 TIL (SQL codekata, Sub Query)  (0) 2025.01.09
2025-01-07 TIL (A/B Test, SQL CodeKata)  (0) 2025.01.07
2025-01-06 TIL (가설 검증 방법)  (0) 2025.01.06
WIL -6주차  (0) 2025.01.04