1. 가상의 출제 문제 (Problem Definition)
[문제] A/B 테스트 전환율(CVR) 및 유의미성 분석
토스 송금 버튼의 색상을 **블루(A안)**에서 **레드(B안)**로 변경하는 테스트를 진행했습니다. 유저별로 배정된 실험군 정보(AbTestGroups)와 실제 송금 성공 로그(RemitLogs)를 결합하여 다음 지표를 산출하십시오.
- 실험군별 총 유저 수 (실험에 참여한 전체 유저)
- 실험군별 송금 성공 유저 수 (최소 1번 이상 송금 성공한 유저)
- 전환율(CVR): (송금 성공 유저 수 / 총 유저 수)
- 결과 정렬: 전환율이 높은 순서대로 정렬.
- 테이블 정보:
- AbTestGroups: user_id, group_name ('A', 'B')
- RemitLogs: user_id, event_timestamp
SELECT
g.group_name,
-- 1. 실험군별 총 유저 수 (분모)
COUNT(DISTINCT g.user_id) AS total_users,
-- 2. 송금 성공 유저 수 (분자: 로그가 있는 유저만 카운트)
COUNT(DISTINCT l.user_id) AS converted_users,
-- 3. 전환율 계산 (0으로 나누기 방지 및 소수점 처리)
ROUND(COUNT(DISTINCT l.user_id) / COUNT(DISTINCT g.user_id) * 100, 2) AS conversion_rate
FROM AbTestGroups g
LEFT JOIN RemitLogs l ON g.user_id = l.user_id
GROUP BY g.group_name
ORDER BY conversion_rate DESC;
풀이 방법
1. 중복 집계의 오류: COUNT(event_timestamp)를 하면 송금 횟수를 세게 됩니다. 우리는 **'성공한 사람 수'**가 필요하므로 COUNT(DISTINCT user_id)를 써야 합니다.
> A/B 테스트 쿼리의 핵심이 '전체 유저(분모) 확보'와 '유저 단위 집계'
- 로그 단위(Log-level): 유저 A가 송금 버튼을 5번 눌렀다면 데이터는 5줄입니다.
- 유저 단위(User-level): 유저 A는 '송금 성공 경험이 있는 유저 1명'으로 정의되어 데이터는 1줄이 됩니다.
2. 송금을 한번도 안한 유저는 RemitLogs에 없다. AbTestGroups (전체유저)를 기준으로 LEFT JOIN을 걸어야만 송금 안 한 유저까지 포함해 정확한 분모(총 유저 수)를 구할 수 있다.
'Data Science > SQL' 카테고리의 다른 글
| T사 SQL 쿼리테스트 대비4: 리텐션 분석 (Retention Analysis) (0) | 2026.02.05 |
|---|---|
| T사 SQL 쿼리테스트 대비3: 퍼널 분석 (Funnel Analysis) (0) | 2026.02.05 |
| T사 SQL 쿼리테스트 대비: MAU (0) | 2026.02.05 |
| [SQL/오답] 3회 연속 등장하는 숫자 찾기: LEAD vs 삼중 Self Join (LeetCode180 Medium) (0) | 2026.02.05 |
| [SQL/함수] N번째 높은 급여 찾기: 사용자 정의 함수 CREATE FUNCTION와 OFFSET (LeetCode177 Medium) (1) | 2026.02.04 |