가상 데이터 기반 A/B 테스트 분석

2024. 2. 29. 18:23TIL

가상 A/B 테스트 데이터 소개

 가상으로 만든 A/B 테스트 데이터의 테이블은 Production DB에 저장되는 정보들을 Data Warehouse로 적재했다고 가정한다. 테이블은 총 3개이고 다음과 같다. 

  • raw_data.user_event
    • 사용자/날짜/아이템별로 impression이 있는 경우 그 정보를 기록하고 impression으로부터 클릭, 구매, 구매 시 금액을 기록
    • 실제 환경에서는 이런 aggregate 정보를 로그 파일 등의 소스(하나 이상의 소스가 될 수도 있음)로부터 만들어내는 프로세스가 필요함
CREATE TABLE raw_data.user_event (
 user_id int,
 datestamp timestamp,
 item_id int,
 clicked int,
 purchased int,
 paidamount int
);
  • raw_data.user_variant
    • 사용자가 소속한 AB test variant를 기록한 파일 (control vs. test)
    • 보통은 experiment와 variant 테이블이 별도로 존재함
    • 테이블에도 언제 variant_id로 소속되었는지 타임스탬프 필드가 존재하는 것이 일반적
    • 프로덕션에 있는 데이터베이스에서 가져오는 것이 일반적
CREATE TABLE raw_data.user_variant (
 user_id int,
 variant_id varchar(32) -- control vs. test
);
  • raw_data.user_metadata
    • 사용자에 관한 메타 정보가 기록된 파일 (성별, 나이 등등)
    • 이를 이용해 다양한 각도에서 AB 테스트 결과를 분석해 볼 수 있음
CREATE TABLE raw_data.user_metadata (
 user_id int,
 age varchar(16),
 gender varchar(16)
);

 

 위 3개의 테이블을 가지고 요약 테이블(Variant별, 사용자별, 날짜별로 통계정보를 만들어주는 ELT 테이블)을 만들 수 있다. 

CREATE TABLE analytics.variant_daily_sessions AS
SELECT 
 variant_id,
 user_id,
 datestamp,
 count(distinct item_id) num_of_items, -- 총 impression
 sum(clicked) num_of_clicks, -- 총 click
 sum(purchased) num_of_purchases, -- 총 purchase
 sum(paidamount) revenue -- 총 revenue
FROM raw_data.user_event ue 
JOIN raw_data.user_variant uv ON ue.user_id = uv.user_id
GROUP by 1, 2, 3

 

 해당 테이블로 A/B 테스트를 진행하기 위해 Two-Sample t-test를 통해 두 그룹의 값을 비교할 때 t-score를 직접 계산하거나 scipy.stats.ttest_ind 함수로 계산할 수 있다.

tscore, pvalue = stats.ttest_ind(b, a)
print(tscore, pvalue)

 

Two-Sample t-test 리뷰와 실습

 t-score를 직접 계산하기 위한 공식은 다음과 같다. x1과 x2는 각 집단의 평균, n1과 n2는 각 집단의 크기, s1과 s2는 각 집단의 표준편차이다.

 

Impression / Click / Purchase / Amount 비교

 Impression / Click / Purchase / Paidamount 지표들을 Two Sample T-Test 계산을 통해 비교해 볼 것이다. "paidamount” 대상으로 직접 계산해 보면 먼저 A와 B로 그룹을 나누고 각각 세션의 수, 매출액의 합, 매출액 평균, 매출액 제곱의 합, 매출액 제곱 평균, 매출액 분산을 구한다. 앞선 공식대로 t-score를 계산하고 그 값이 양측 검정으로 1.96과 -1.96 사이인지 확인한다. 파이썬 모듈을 사용한다면 Test와 Control의 raw value들을 각각 얻어온 뒤, 이를 scipy의 stats.ttest_ind의 인자로 지정하여 t-score와 p-value를 받으면 된다. 

 

A/B 테스트 분석은 어떻게 구현이 되나?

 A/B 테스트 분석 시각화 대시보드를 만들기 위해서는 선택된 필터에 따라 z-score 계산을 해야 한다. 먼저 선택된 필터에 맞춰 raw data 수집이 이뤄져야 하거나 모든 가능한 조합에 대해 미리 수집을 해놓고 필터 선택에 따라 지표들을 aggregate 해야 한다. 하지만 어느 대시보드도 A와 B 양쪽의 선택된 필터를 읽어와서 z-score를 계산하지 않는다. 그래서 모든 대시보드는 A와 B 양쪽에서 표본 수, 표본의 합, 표본 제곱의 합을 각각 가지고 와서 z-score를 계산해야 한다. Tableau의 경우 모든 필터 조합에 대해 미리 계산하고, Looker는 동적으로 SQL을 실행해서 계산한다.

 

 Tableau를 사용한다면 A와 B별로 impression/click/purchase/paidamount에 대해 가능한 모든 date, age, gender 조합에 대해 미리 계산하여 데이터를 수집하고 이를 바탕으로  t-score 계산을 수행한다. 장점은 데이터를 매번 읽어올 필요가 없으므로 속도가 빠르나 단점은 필터가 변경될 때마다 데이터 수집 방법도 바뀌어야 한다. 이렇게 미리 모든 조합에 대해 계산된 데이터를 OLAP Cube라고 부른다.

/* OLAP Cube 생성 SQL 예시 */
SELECT 
 variant_id,
 'impression' category,
 datestamp,
 age, 
 gender,
 count(1) n, -- number of sessions
 sum(num_of_items) sum,
 sum(num_of_items*num_of_items) sum2 -- square
FROM analytics_variant_user_daily
GROUP BY 1, 2, 3, 4, 5

 

'TIL' 카테고리의 다른 글

A/B 테스트 분석 시각화  (0) 2024.03.03
dbt(Data Build Tool) 학습  (0) 2024.03.01
A/B Test 관련 통계 살펴보기  (1) 2024.02.28
A/B 테스트 과정 살펴보기  (0) 2024.02.28
애자일 A/B Test 소개  (0) 2024.02.25