A/B테스트 진행시 체크해야 하는 이슈 중 하나인 SRM

A/B테스트 진행시 체크해야 하는 이슈 중 하나인 SRM
Photo by Chanhee Lee / Unsplash

Definition

  • **Sample Ratio Mismatch(SRM)**는 실험 설계나 데이터 수집 과정에서 샘플의 비율이 의도한 비율과 일치하지 않는 상황을 의미합니다
  • 예를 들어, A/B 테스트에서 두 그룹(A와 B)로 사용자 트래픽을 균등하게 나누려고 했으나, 실제 데이터에서는 비율이 맞지 않는 경우가 SRM입니다.
  • SRM은 실험의 무작위성(randomness)을 보장하고, 통계적 검증의 신뢰성을 높이기 위해 중요한 개념입니다.
  • SRM이 발생하면 실험 결과의 유효성이 의심될 수 있으며, 결과 해석에 오류가 발생할 수 있습니다.

Pros

  1. 문제 조기 발견: SRM을 감지하면 실험 설계나 데이터 수집 과정에서의 문제를 조기에 발견할 수 있습니다.
  2. 데이터 무결성 보장: 샘플 비율이 올바르게 유지되면 데이터의 무결성을 보장할 수 있습니다.
  3. 신뢰성 향상: 무작위성을 보장하여 실험 결과의 신뢰성을 높일 수 있습니다.

Cons

  1. 추가 작업 필요: SRM을 감지하고 수정하기 위해 추가 작업이 필요할 수 있습니다.
  2. 복잡성 증가: 실험 설계 및 데이터 수집 과정에서 SRM을 감지하고 수정하는 작업이 추가되면 복잡성이 증가할 수 있습니다.
  3. 리소스 소모: SRM을 감지하고 수정하는 과정에서 리소스가 소모될 수 있습니다.

Action Item

  1. 모니터링 시스템 도입: 실험 중 실시간으로 샘플 비율을 모니터링하여 SRM을 조기에 감지합니다.
  2. 사전 검증: 실험 시작 전에 샘플링 프로세스를 검증하여 SRM 발생 가능성을 줄입니다.
  3. 데이터 재수집: SRM이 감지된 경우, 데이터를 재수집하여 샘플 비율을 맞춥니다.

Sample

import numpy as np  
import matplotlib.pyplot as plt  
  
def detect_srm(group_a, group_b, tolerance=0.05):  
    n_a = len(group_a)  
    n_b = len(group_b)  
    total = n_a + n_b  
  
    ratio_a = n_a / total  
    ratio_b = n_b / total  
  
    expected_ratio = 0.5  
    srm_detected = abs(ratio_a - expected_ratio) > tolerance or abs(ratio_b - expected_ratio) > tolerance  
      
    return srm_detected, ratio_a, ratio_b  
  
def resample_data(group_a, group_b):  
    min_len = min(len(group_a), len(group_b))  
    resampled_a = np.random.choice(group_a, min_len, replace=False)  
    resampled_b = np.random.choice(group_b, min_len, replace=False)  
    return resampled_a, resampled_b  
  
# 샘플 데이터 생성  
np.random.seed(42)  
group_a = np.random.binomial(1, 0.5, 1000)  
group_b = np.random.binomial(1, 0.5, 1200)  # 의도한 비율이 맞지 않음  
  
# SRM 감지  
srm_detected, ratio_a, ratio_b = detect_srm(group_a, group_b)  
  
print(f"Group A ratio: {ratio_a:.2f}")  
print(f"Group B ratio: {ratio_b:.2f}")  
  
if srm_detected:  
    print("Sample Ratio Mismatch detected. Resampling data...")  
    group_a, group_b = resample_data(group_a, group_b)  
    srm_detected, ratio_a, ratio_b = detect_srm(group_a, group_b)  
    print(f"After resampling - Group A ratio: {ratio_a:.2f}, Group B ratio: {ratio_b:.2f}")  
else:  
    print("No Sample Ratio Mismatch detected.")  
  
# 시각화  
labels = ['Group A', 'Group B']  
ratios = [ratio_a, ratio_b]  
  
plt.bar(labels, ratios, color=['blue', 'orange'])  
plt.axhline(y=0.5, color='red', linestyle='--')  
plt.title('Sample Ratios')  
plt.ylabel('Ratio')  
plt.ylim(0, 1)  
plt.show()

Read more

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성(Multi Collinearity) * **Multi-Collinearity(다중공선성)**는 독립 변수들 간의 강한 상관관계가 존재할 때 발생합니다. 즉, 한 독립 변수가 다른 독립 변수에 의해 설명될 수 있을 정도로 상관관계가 높은 상황을 의미합니다. * 이 문제는 주로 회귀 분석에서 나타나며, 변수들 간의 관계를 해석하는 데 있어 큰 장애물이 될 수 있습니다. * 일반적인 회귀식을 $Y=

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P- Value * Bayesian P-Value는 **모델의 적합도(goodness-of-fit)**를 평가하는 데 사용됩니다. * 사후 분포(posterior distribution)를 이용하여 실제 데이터와 모델이 생성한 예상 데이터를 비교함으로써, 관측된 데이터가 모델에 의해 얼마나 잘 설명되는지를 평가합니다. * 빈도주의 p-값은 "관찰된 데이터보다 극단적인 데이터가 나올 확률"을 계산하지만, Bayesian P-Value는 "모델이 실제

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non Identifiability * Non-Identifiability는 주어진 데이터와 모델에 대해 특정 파라미터를 고유하게 식별할 수 없는 상황을 의미합니다. 즉, 여러 파라미터 값들이 동일한 데이터를 생성할 수 있으며, 이로 인해 특정 파라미터 값을 확정적으로 추정하기 어렵게 됩니다. * 베이지안 추론에서 Non-Identifiability는 사후 분포가 특정 파라미터 값에 대해 명확하게 수렴하지 않고, 여러 값들에 대해 비슷한 확률을

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram * 히스토그램의 변형으로 데이터가 비정규적이거나 큰 분산을 가지는 경우, 정확한 분포를 파악하기 위해 사용됩니다. * 일반적으로 히스토그램은 데이터의 빈도를 직접적으로 나타내기 때문에, 큰 값이 빈번하게 발생하는 경우 상대적으로 작은 값을 잘 드러내지 못하는 경향이 있습니다. 반면, Rootgram은 빈도를 제곱근 형태로 변환하여, 데이터 분포의 차이를 더 잘 시각화할 수 있도록 돕습니다 * 여기서