A/B 테스트 할당과 지표
실험 할당을 결과와 조인하고 변형별 지표를 계산합니다.
A/B 테스트 할당과 지표은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
A/B 테스트 문제에서 확인하는 내용
A/B 테스트 문제는 실험 할당과 결과를 올바르게 결합하고 변형별로 정확한 지표를 계산할 수 있는지 확인합니다.
함정은 거의 항상 결합 과정에 있습니다. 실험에 참여하지 않은 사용자의 결과를 세거나, 두 번 할당된 사용자를 중복 집계하는 경우입니다. 할당 결합을 올바르게 처리하면 지표 계산은 간단한 산술 문제가 됩니다.
제공되는 두 테이블
할당 테이블과 결과 테이블을 예상하시면 됩니다:
assignments(user_id, variant, assigned_at)테이블에서 변형은 대조군 또는 처리군입니다.orders(user_id, order_id, amount, created_at)테이블 또는 일반적인 이벤트 테이블입니다.
할당 테이블은 실험에 참여한 사용자를 판별하는 기준 데이터입니다. 결과는 사용자가 할당 테이블에 나타나는 경우에만 집계합니다.
CREATE TABLE assignments (
user_id INT,
variant VARCHAR(20),
assigned_at TIMESTAMP
);
CREATE TABLE orders (
user_id INT,
order_id INT,
amount NUMERIC,
created_at TIMESTAMP
);할당에서 시작해 결과를 LEFT JOIN하기
핵심 원칙은 할당 테이블을 기준으로 쿼리를 시작하고 결과를 LEFT JOIN하는 것입니다. 이렇게 해야 할당되었지만 아직 전환하지 않은 사용자가 유지되며, 정확한 분모를 계산할 수 있습니다.
INNER JOIN을 사용하면 전환하지 않은 사용자가 조용히 제외되어 전환율이 부풀려집니다.
SELECT
a.user_id,
a.variant,
o.order_id
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id;변형별 전환율 계산
전환율 = 변형별 전환 사용자 수 / 할당된 사용자 수입니다. 분자는 중복 없는 전환 사용자 수로 세고, 분모는 할당된 모든 사용자 수로 셉니다.
주문한 사용자를 대상으로 COUNT(DISTINCT ...)를 사용하면 한 사용자가 주문을 세 번 해도 전환 사용자 한 명으로 집계됩니다.
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters,
ROUND(100.0 * COUNT(DISTINCT o.user_id)
/ COUNT(DISTINCT a.user_id), 2) AS conv_rate_pct
FROM assignments a
LEFT JOIN orders o ON o.user_id = a.user_id
GROUP BY a.variant;이중 할당의 함정
한 사용자가 할당 테이블에 두 번, 각 변형에 한 번씩 나타나면 어떻게 될까요? 결합 결과에서 양쪽 모두에 집계되므로 실험이 오염됩니다.
면접관은 이런 상황을 일부러 제시합니다. 결합하기 전에 사용자당 하나의 변형만 남도록 할당 데이터를 중복 제거하여 대비하셔야 합니다. 일반적으로는 최초 할당을 사용합니다.
WITH dedup AS (
SELECT user_id, variant,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY assigned_at) AS rn
FROM assignments
)
SELECT user_id, variant
FROM dedup
WHERE rn = 1;할당 이후의 결과만 집계하기
사용자가 할당되기 전에 발생한 주문은 실험의 결과일 수 없습니다. 결과가 assigned_at과 같거나 이후에 발생해야 한다는 시간 조건을 추가합니다.
전환하지 않은 사용자도 유지하려면 이 조건을 LEFT JOIN의 ON 절에 넣어야 합니다.
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant;결과 결합에서 ON과 WHERE 비교
이 내용은 반드시 이어서 확인해야 합니다. o.created_at >= a.assigned_at 조건을 WHERE로 옮기면 LEFT JOIN이 내부 결합으로 바뀝니다. 사용자가 주문한 적이 없는 행에서는 o.created_at = NULL이므로 조건식의 결과가 UNKNOWN이 되고 해당 행이 사라집니다.
분모에서 전환하지 않은 사용자를 유지하려면 결과를 필터링하는 조건을 ON에 두셔야 합니다.
변형별 수익 지표
전환 외에도 면접관은 사용자당 수익(ARPU)과 전환 사용자당 수익을 묻습니다. 금액을 합산한 다음 올바른 분모로 나누시면 됩니다.
ARPU는 할당된 모든 사용자 수로 나누고, 전환 사용자당 수익은 주문한 사용자 수로만 나눕니다. 비즈니스에서 어떤 지표를 원하는지 명확히 하셔야 합니다.
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COALESCE(SUM(o.amount), 0) AS revenue,
ROUND(COALESCE(SUM(o.amount), 0)
/ COUNT(DISTINCT a.user_id), 2) AS arpu
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant;두 단계 집계 패턴
지표가 “사용자당 평균 주문 수”일 때 한 번에 계산하지 마십시오. 사용자 수준과 주문 수준의 집계 단위가 섞이기 때문입니다. 먼저 사용자 수준으로 집계한 다음 사용자 전체의 평균을 계산합니다.
사용자별로 집계한 후 변형별로 집계하는 이 패턴이 올바른 집계 단위이며, 면접에서 자주 변별 기준으로 사용됩니다.
WITH per_user AS (
SELECT a.variant, a.user_id,
COUNT(o.order_id) AS orders_cnt
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant, a.user_id
)
SELECT variant, ROUND(AVG(orders_cnt), 3) AS avg_orders_per_user
FROM per_user
GROUP BY variant;완전하고 근거가 명확한 쿼리
모든 내용을 결합합니다. 최초 할당만 남기도록 중복을 제거하고, 할당을 기준으로 쿼리를 시작하며, ON에서 결과에 시간 조건을 적용하고, 변형별 전환율과 ARPU를 보고합니다. 각 조건을 작성할 때 그 목적을 설명하셔야 합니다.
WITH enrolled AS (
SELECT user_id, variant, assigned_at
FROM (
SELECT user_id, variant, assigned_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY assigned_at) AS rn
FROM assignments
) x WHERE rn = 1
)
SELECT
e.variant,
COUNT(DISTINCT e.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters,
ROUND(100.0 * COUNT(DISTINCT o.user_id)
/ COUNT(DISTINCT e.user_id), 2) AS conv_pct,
ROUND(COALESCE(SUM(o.amount),0)
/ COUNT(DISTINCT e.user_id), 2) AS arpu
FROM enrolled e
LEFT JOIN orders o
ON o.user_id = e.user_id
AND o.created_at >= e.assigned_at
GROUP BY e.variant;면접관이 기대하는 타당성 확인
결과를 제시하기 전에 실험 설정을 검증합니다:
- 변형별 사용자 수가 대략 균형을 이루고 있습니까? 50/50을 의도했는데 90/10으로 나뉘었다면 오류를 의미합니다.
- 한 사용자가 두 변형에 모두 들어갔습니까? 서로 다른 변형이 둘 이상인 사용자의 수를 세어 보십시오.
- 가능한 결과 시간 범위가 없는 할당이 있습니까? 예를 들어 데이터 마감 시점 이후에 할당된 경우입니다.
이러한 확인을 요청받기 전에 먼저 제안하면 분석 역량을 보여 줄 수 있습니다.
SELECT user_id, COUNT(DISTINCT variant) AS variant_count
FROM assignments
GROUP BY user_id
HAVING COUNT(DISTINCT variant) > 1;빠른 확인
변형별 전환율을 계산하기 위해 주문을 할당에 LEFT JOIN했지만, o.created_at >= a.assigned_at 조건을 WHERE 절에 넣었습니다. 어떤 일이 발생합니까?
복습: A/B 테스트 할당과 지표
이제 근거를 갖춘 실험 분석 절차를 마련했습니다:
- 할당을 기준 데이터로 삼고 결과를 LEFT JOIN합니다.
- 사용자당 하나의 변형만 남도록 중복을 제거합니다(최초 할당).
- 전환하지 않은 사용자를 유지하려면 결과의 시간 조건을 ON 절에 넣고 WHERE에는 넣지 않습니다.
- 전환율, ARPU, 전환 사용자당 수익에 맞는 분모를 선택합니다.
- 사용자당 평균을 계산할 때는 먼저 사용자 단위로 집계합니다.
- 분할 비율의 균형과 교차 할당에 대해 타당성 확인을 실행합니다.
다음: 변형별 지표를 개선 폭, 유의성 및 안전 지표로 전환합니다.
자주 묻는 질문
“A/B 테스트 할당과 지표” 강의는 무료인가요?
네 — “A/B 테스트 할당과 지표” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“A/B 테스트 할당과 지표”에서 뭘 배우나요?
실험 할당을 결과와 조인하고 변형별 지표를 계산합니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“A/B 테스트 할당과 지표” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 다단계 퍼널 만들기
- 순서가 있는 이벤트와 시간 윈도
- A/B 테스트 할당과 지표
- SQL에서의 상승 효과, 유의성 및 안전장치