A/B테스트 시 사용되는 비모수 통계검정 방법론
비모수 통계검정
- 비모수 통계검정(Non-parametric test)은 데이터가 특정한 분포(정규분포 등)를 따르지 않아도 적용할 수 있는 통계적 방법입니다.
- 즉, 데이터의 분포를 가정하지 않고 실험 결과를 비교할 수 있어 작은 샘플 크기나 분포가 불확실한 상황에서 유용하게 사용됩니다.
- 비모수 검정은 데이터를 순위로 변환하여 분석하거나, 데이터 자체의 분포에 대해 통계적 결론을 도출하는 방식으로 진행됩니다. 이러한 방법은 분포가 불명확하거나, 이상치(outliers)가 많을 때 적합합니다.
비모수 검정
Mann-Whitney U Test (Wilcoxon Rank-Sum Test)
- 정의: 두 개의 독립된 그룹 간의 차이를 검정하는 방법입니다. 두 그룹의 값들이 동일한 분포를 가지는지 검정하며, 보통 A/B 테스트에서 두 그룹의 중앙값을 비교할 때 사용됩니다.
- 장점: 데이터가 정규분포를 따르지 않거나, 이상치가 있는 경우에도 유용하게 사용할 수 있습니다.
- 사용 사례: A/B 테스트에서 전환율 차이를 비교할 때, 두 그룹의 전환율 분포가 정규분포를 따르지 않는 경우에 사용됩니다.
- Python 코드 예시:
import numpy as np
from scipy.stats import mannwhitneyu
# A/B 테스트 결과 (전환율 데이터)
group_A = np.random.binomial(1, 0.2, size=100) # 그룹 A의 전환율 데이터
group_B = np.random.binomial(1, 0.25, size=100) # 그룹 B의 전환율 데이터
# Mann-Whitney U Test
stat, p_value = mannwhitneyu(group_A, group_B)
print(f"Mann-Whitney U Test 결과: 통계량={stat}, p-value={p_value}")
Wilcoxon Signed-Rank Test
- 정의: 두 관련된 그룹(쌍으로 이루어진 데이터)의 차이를 검정하는 방법입니다. 예를 들어, A/B 테스트에서 동일한 사용자가 두 가지 버전의 실험을 경험했을 때, 각 사용자의 반응 차이를 비교할 수 있습니다.
- 장점: 동일한 피험자를 대상으로 서로 다른 조건을 테스트할 때 적합합니다.
- 사용 사례: 동일한 고객이 두 가지 버전(A/B)에 대해 행동을 보였을 때, 그 행동의 차이를 비교하는 상황에서 사용됩니다.
- Python 코드 예시:
from scipy.stats import wilcoxon
# 가상의 A/B 테스트 데이터
group_A = np.random.normal(10, 1, 50) # A 버전에서 사용자 행동
group_B = group_A + np.random.normal(0.5, 1, 50) # 동일한 사용자의 B 버전에서 행동
# Wilcoxon Signed-Rank Test
stat, p_value = wilcoxon(group_A, group_B)
print(f"Wilcoxon Signed-Rank Test 결과: 통계량={stat}, p-value={p_value}")
Kruskal-Wallis Test
- 정의: 세 개 이상의 독립된 그룹 간 차이를 검정하는 방법입니다. 일반적으로 A/B/C 테스트와 같이 여러 그룹 간의 차이를 검정할 때 사용됩니다.
- 장점: 세 그룹 이상 비교할 때 정규성을 가정하지 않아도 사용할 수 있는 방법입니다.
- 사용 사례: A/B/C 테스트에서 세 가지 이상의 버전에 대한 전환율 차이를 비교할 때 적합합니다.
- Python 코드 예시:
from scipy.stats import kruskal
# A/B/C 테스트 결과 (전환율 데이터)
group_A = np.random.binomial(1, 0.2, size=100) # 그룹 A의 전환율 데이터
group_B = np.random.binomial(1, 0.25, size=100) # 그룹 B의 전환율 데이터
group_C = np.random.binomial(1, 0.22, size=100) # 그룹 C의 전환율 데이터
# Kruskal-Wallis Test
stat, p_value = kruskal(group_A, group_B, group_C)
print(f"Kruskal-Wallis Test 결과: 통계량={stat}, p-value={p_value}")
비모수 검정의 장단점
장점:
- 분포 가정 없음: 데이터가 정규분포를 따르지 않아도 문제없이 사용할 수 있습니다.
- 이상치에 강함: 비모수 검정은 데이터의 순위를 사용하므로, 이상치의 영향이 적습니다.
- 작은 샘플에서도 유용: 데이터 샘플 크기가 작을 때도 신뢰성 있는 결과를 제공합니다.
단점
- 효율성 부족: 데이터가 정규분포를 따를 경우 비모수 검정은 모수 검정보다 효율성이 낮습니다. 즉, 동일한 데이터에서 비모수 검정이 유의미한 차이를 발견하기 어려울 수 있습니다 즉, 모수 검정에서 유의미한 차이가 있다고 검출되는 경우에도, 비모수 검정에서는 차이를 감지하지 못할 수 있습니다.
- 모수 검정은 구체적인 가설(예: 두 그룹의 평균이 같다 또는 다르다)에 대한 검정을 제공합니다. 반면 비모수 검정은 일반적인 가설(예: 두 그룹이 같은 분포를 가진다)에 대한 검정을 수행하므로, 세부적인 통계적 가설 검정에서는 모수 검정보다 덜 구체적일 수 있습니다.
- 해석이 복잡: 비모수 검정의 결과는 모수 검정만큼 직관적이지 않으며, 해석에 주의가 필요합니다. 비모수 검정에서 나오는 통계값은 모수 검정에서의 평균 차이와 달리 명확한 양적 차이를 나타내지 않습니다. 순위 기반으로 계산되기 때문에 크기 차이보다는 순위 차이를 강조하는 경향이 있습니다. 이는 결과 해석 시 더 많은 설명이 필요할 수 있음을 의미합니다
- 데이터의 크기나 분포의 세부적인 구조를 고려하지 않기 때문에, 데이터의 실제 크기에 대한 정보를 간과할 수 있습니다. 이는 중요한 정보가 숨겨질 수 있음을 의미합니다.
A/B 테스트에서 비모수 검정을 선택하는 이유
A/B 테스트에서 비모수 검정을 사용하는 이유는 다음과 같습니다:
- 데이터가 비정규적이거나, 이상치가 많을 경우.
- QQ Plot이나 Shapiro-Wilk Test를 통해서 우선 분포를 검정하고 결정
- 샘플 크기가 작은 경우에도 안정적인 결과를 얻을 수 있음.
- 비모수 검정은 작은 샘플에서도 사용할 수 있지만, 이는 동시에 샘플 크기에 민감하지 않을 수 있다는 의미입니다
- 다양한 사용자 행동 패턴으로 인해 데이터 분포가 불확실할 때.
보완 방법
상관 계수 검정
- 순위 기반 검정(예: Mann-Whitney U 테스트)이 아닌 Pearson 상관 계수나 Spearman 상관 계수를 사용하여 두 변수 간의 연관성을 더 구체적으로 확인할 수 있습니다.
- Pearson 상관 계수: 두 연속형 변수 간의 선형 관계를 측정합니다. 이는 정규성을 가정합니다.
- Spearman 상관 계수: 두 변수의 순위 간 상관 관계를 측정합니다. 이는 정규성을 가정하지 않으며 비모수적입니다.
다변량 분석
- 비모수 검정은 단일 변수 또는 두 그룹 간의 차이를 검정할 때 유용하지만, 데이터에 포함된 다양한 변수를 동시에 고려하는 방법은 아닙니다. 이를 보완하기 위해 다변량 분석 기법을 사용할 수 있습니다
주성분 분석 (Principal Component Analysis, PCA)
- 목적: 데이터의 차원을 축소하여 여러 변수 간의 상관 관계를 분석하는 기법입니다.
- 사용 사례: 고차원 데이터에서 주요 변수를 찾아내고, 두 그룹 간 차이가 나타나는 주된 요소를 분석하는 데 유용합니다.예를 들어, A/B 테스트에서 여러 사용자 특성이 있을 때, 각 그룹 간 주요 차이를 분석할 수 있습니다.
로지스틱 회귀 분석
- 목적: 범주형 종속 변수(예: 성공/실패)에 영향을 미치는 연속형 및 범주형 변수 간의 관계를 분석합니다.
- 사용 사례: A/B 테스트에서 두 그룹 간의 행동 차이가 다른 변인(나이, 지역 등)에 의해 영향을 받을 수 있을 때 사용됩니다.
이는 결과에 영향을 미치는 주요 변인을 식별하고, 그에 따른 정확한 가설 검정을 수행하는 데 유용합니다.
재표본추출 (Resampling)
- 재표본추출 방법은 데이터를 다시 무작위로 샘플링하여 가설 검정을 보완하는 방법입니다. 이는 비모수 검정의 순위 기반 검정을 넘어서 데이터 분포의 불확실성을 완화할 수 있는 방법입니다.
#### 부트스트랩 (Bootstrap)
- 목적: 데이터의 분포에 대한 가정을 줄이고, 반복적인 샘플링을 통해 신뢰 구간과 p-value를 추정할 수 있습니다.
- 사용 사례: A/B 테스트에서 데이터 크기가 작거나, 분포에 대한 가정을 최소화하고자 할 때 부트스트랩 기법을 사용할 수 있습니다.
import numpy as np
from sklearn.utils import resample
# 그룹 A와 그룹 B의 데이터를 다시 샘플링하여 부트스트랩 검정 수행
group_A = np.random.normal(100, 10, size=50)
group_B = np.random.normal(105, 12, size=50)
# 부트스트랩 재표본추출
boot_A = resample(group_A, n_samples=1000)
boot_B = resample(group_B, n_samples=1000)
# 평균 비교
mean_A, mean_B = np.mean(boot_A), np.mean(boot_B)
print(f"부트스트랩 샘플링 결과 - 그룹 A 평균: {mean_A}, 그룹 B 평균: {mean_B}")
### 베이지안 검정 (Bayesian Testing)
- 비모수 검정의 한계점을 보완하기 위해 베이지안 검정도 대안이 될 수 있습니다. 베이지안 방법은 데이터의 분포와 관련된 확률적 가정을 기반으로 보다 유연한 검정을 제공합니다.
- 베이지안 A/B 테스트: 고정된 p-value 대신, 사후 확률을 계산하여 두 그룹 간의 차이가 발생할 가능성을 추정합니다.
- 장점: p-value와 달리 샘플 크기에 덜 민감하며, 데이터를 확률적으로 해석할 수 있어 직관적입니다