본문 바로가기
Data Science/SQL

T사 SQL 쿼리테스트 대비2: A/B테스트

by 에르모사 쩐뉴 2026. 2. 5.

1. 가상의 출제 문제 (Problem Definition)

[문제] A/B 테스트 전환율(CVR) 및 유의미성 분석

토스 송금 버튼의 색상을 **블루(A안)**에서 **레드(B안)**로 변경하는 테스트를 진행했습니다. 유저별로 배정된 실험군 정보(AbTestGroups)와 실제 송금 성공 로그(RemitLogs)를 결합하여 다음 지표를 산출하십시오.

  1. 실험군별 총 유저 수 (실험에 참여한 전체 유저)
  2. 실험군별 송금 성공 유저 수 (최소 1번 이상 송금 성공한 유저)
  3. 전환율(CVR): (송금 성공 유저 수 / 총 유저 수)
  4. 결과 정렬: 전환율이 높은 순서대로 정렬.

 

  • 테이블 정보:
    • 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을 걸어야만 송금 안 한 유저까지 포함해 정확한 분모(총 유저 수)를 구할 수 있다.