본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

온라인 평가: 운영 환경에서의 A/B 테스트

~18 min · systems, ab-testing, production

Level 0추측자
0 XP0/55 lessons0/10 achievements
0/150 XP to next level150 XP to go0% complete

가장 정직한 평가는 실제 사용자에게서 나와

오프라인 평가는 평가 데이터셋에서 어떤 결과가 나오는지 알려줘. 온라인 A/B 테스트는 실제 사용자가 어떻게 행동하는지 알려줘. 둘 다 중요하지만, 온라인 평가는 정답에 가장 가까워. 참여도, 유지율, 수익화처럼 오프라인에서 레이블을 붙일 수 없는 항목을 측정하는 유일한 방법이기도 해.

온라인 A/B 테스트만 측정할 수 있는 것

  • 참여도 — 사용자가 새 버전에서 대화를 더 오래 이어 가?
  • 과제 완료 — 실제 목표를 완료한 사용자의 비율은 얼마야?
  • 만족도 — 명시적인 좋아요·싫어요나, 후속 질문이 필요 없는지 같은 암묵적 신호를 확인해.
  • 지연 시간 허용 범위 — 더 느려도 더 나은 응답을 기다려, 아니면 더 자주 이탈해?
  • 장기 유지 — 사용자가 다시 돌아와?

방법론의 기본 원칙

  1. 사용자 수준의 무작위 배정 — 세션 수준이 아니야.
  2. 사전 등록된 지표 — 테스트를 시작하기 전에 주요 지표를 선언해. 그렇지 않으면 우연히 "이긴" 지표를 골라내게 돼.
  3. 표본 크기 계산 — 미리 검정력 분석을 하고, 중간 결과는 들여다보지 마.
  4. 신규성 효과를 포착할 만큼 충분한 기간 — 첫 주에 나타난 효과가 계속된다는 보장은 없어.
  5. 안전장치 지표 관찰 — 주요 지표가 좋아졌더라도 지연 시간, 오류율, 비용이 급증하지 않았는지 확인해.
원칙: 오프라인 평가는 후보를 제시하고, 온라인 A/B 테스트가 최종 판단을 내려. 오프라인 수치만 보고 대규모 변경 사항을 출시하면 안 돼.

방향뿐 아니라 통계적 유의성까지 봐

"버전 B가 2% 더 나았어"라는 말은 신뢰 구간이 없으면 의미가 없어. 실험군당 사용자가 1,000명이라면 대부분 지표가 잡음만으로도 ±5% 안팎 흔들릴 수 있어. 승자를 선언하기 전에 p값이나 신뢰 구간을 계산해. statsmodels, ABBA 또는 플랫폼의 내장 통계 기능에 계산을 맡길 수 있어.

Code

사용자 수준의 무작위 배정·python
import hashlib

def ab_assign(user_id, variant_count=2, salt="experiment-2026-q2"):
    """Stable, deterministic, uniform assignment."""
    h = hashlib.sha256(f"{salt}:{user_id}".encode()).hexdigest()
    bucket = int(h[:8], 16) % variant_count
    return bucket

# Same user → same bucket every call. Different experiment → different salt.
# Avoids 'session-level' assignment (different responses on different visits).
완료율에 대한 두 비율 z 검정·python
from statistics import NormalDist

def two_prop_z_test(c_a, n_a, c_b, n_b):
    p_a, p_b = c_a / n_a, c_b / n_b
    p_pool = (c_a + c_b) / (n_a + n_b)
    se = (p_pool * (1 - p_pool) * (1/n_a + 1/n_b)) ** 0.5
    z = (p_a - p_b) / se
    p_value = 2 * (1 - NormalDist().cdf(abs(z)))
    return {
        "p_a": p_a, "p_b": p_b,
        "diff": p_a - p_b,
        "z": z,
        "p_value": p_value,
        "significant": p_value < 0.05,
    }

print(two_prop_z_test(c_a=420, n_a=1000, c_b=465, n_b=1000))
# diff=0.045 (4.5pp), p_value~0.04 → just barely significant

External links

Exercise

제품에서 실행하고 싶은 온라인 A/B 테스트를 하나 정의해. 배정 단위, 주요 지표, 보조 지표, 안전장치, 표본 크기 계산, 중단 기준을 적어. 평가를 시작하기 전에 동료에게 보여줘.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.