A/B 테스트 분석 시각화

2024. 3. 3. 17:38TIL

다양한 시각화 툴 소개
  • Excel, Google Spreadsheet: 사실상 가장 많이 쓰이는 시각화 툴
  • Looker (구글)
  • Tableau (세일즈포스)
  • Power BI (마이크로소프트)
  • Apache Superset (오픈소스)
  • Mode Analytics, ReDash
  • Google Studio, AWS Quicksight
  • Python: 데이터 특성 분석(EDA: Exploratory Data Analysis)에 더 적합

 Looker 혹은 Tableau가 가장 많이 사용되는 추세이며 두 툴 모두 처음 배우는데 시간이 필요하다. Tableau의 가격이 더 싸고 투명하며 무료 버전도 존재해서 공부가 가능하다. 중요한 포인트는 셀프서비스 대시보드를 만드는 것으로 이런 측면에서는 Looker가 더 좋은 선택이지만 가격이 상당히 비싸다. 

 

좋은 지표란?

 KPI(Key Performance Indicator)는 조직 내에서 달성하고자 하는 중요한 목표로 정량적인 숫자가 선호된다. KPI의 수는 적을수록 좋고 잘 정의된 KPI는 현재 상황을 알고 더 나은 계획을 가능하게 한다. 지표와 KPI의 차이점은 중요도로 지표가 더 큰 개념이다. 팀/개인별로 중요한 성과 목표를 정량적으로 갖는 것이 중요하고 이는 데이터 문해력(Data Literacy)의 시작점이다. 좋은 지표의 특성은 3A(Accessible, Actionable, Auditable)이다.

  • 쉽게 볼 수 있어야 함 (Accessible)
    • 지표를 보는 것이 쉬워야 함
    • 시각화툴이 도움이 됨
  • 실행가능한 통찰력이 제공되어야 함 (Actionable)
    • 지표 등락의 의미가 분명해야 함
  • 감사가 가능해야 함 (Auditable)
    • 지표 계산이 제대로 되었는지 검증이 가능해야 함
    • 데이터 기반이어야 가능

 Next Dashboard Fallacy는 기존 지표 기반 결정을 못하고 대시보드를 계속해서 만드는 현상이다. 지표의 수가 적을수록 좋을 뿐만 아니라 대시보드의 수도 적을수록 좋다. 

 

용어 설명
  • Workbook
    • Tableau 프로젝트 파일을 부르는 이름
  • Data Source
    • 대시보드를 구성하는데 필요한 원천 데이터
  • Worksheet
    • 개별 차트
  • Dashboard
    • 개별 차트들의 집합
    • 대시보드라고 부를 수 있음
  • Calculated Fields
    • 데이터 원본의 기존 필드를 바탕으로 만드는 새 필드
    • 수식과 함수 사용 가능
    • 이를 이용해 Z-score 계산
  • Parameter
    • 동적인 값을 가질 수 있는 변수
    • Calculated Fields나 필터 등에서 사용 가능
  • Measures
    • Metrics (Revenue, Purchase, Click, Impression, …)
    • 숫자, 값 (정량적)
  • Dimensions
    • Categorical Breakdown of Measures (Mostly User or Product Properties)
    • 보통 사용자나 상품에 관한 메타 데이터 (정성적)
OLAP 큐브

 OLAP 큐브란 미리 모든 조합에 대해 지표 데이터를 수집한 것이다. 이를 바탕으로 시각화를 수행하며 장점은 데이터를 매번 읽어올 필요가 없어 속도가 빠르지만 단점은 필터가 변경될 때마다 데이터 수집 방법을 바꾸어야 한다. 가상 데이터로 OLAP 큐브를 만들어 본다. session 기반으로 Variant/Date/Age/Gender별(Dimension)로 Session 수, Impression, Click, Purchased, Revenue(Measure)를 계산한다. 최종 two sample t-test를 수행하려면 위 measure별로  크기(n), 값의 합산,   값의 제곱의 합산(이는 나중에 분산 계산을 위함)을 계산한다. OLAP 큐브 계산 SQL은 다음과 같다.

SELECT datestamp, variant_id, age, gender,
 'impression' category,
 count(1) n, -- number of sessions
 sum(num_of_items) sum, 
sum(num_of_items*num_of_items) sum2
FROM keeyong.analytics_variant_user_daily vds
GROUP BY 1, 2, 3, 4, 5

UNION

SELECT datestamp, variant_id, age, gender,
 'click' category,
 count(1) n, -- number of sessions
 sum(num_of_clicks) sum, 
sum(num_of_clicks*num_of_clicks) sum2
FROM keeyong.analytics_variant_user_daily vds
GROUP BY 1, 2, 3, 4, 5

UNION

SELECT datestamp, variant_id, age, gender,
 'purchase' category,
 count(1) n, -- number of sessions
 sum(num_of_purchases) sum, 
sum(num_of_purchases*num_of_purchases) sum2
FROM keeyong.analytics_variant_user_daily vds
GROUP BY 1, 2, 3, 4

UNION

SELECT datestamp, variant_id, age, gender,
 'revenue' category,
 count(1) n, -- number of sessions
 sum(revenue) sum, sum(revenue*revenue) sum2
FROM keeyong.analytics_variant_user_daily vds
GROUP BY 1, 2, 3, 4;

 

Traffic Trend Chart 모양 만들기

A/B 테스트 분석 시각화를 위해 만들어볼 Calculated Field은 다음과 같다.

  • n_test
    • Test(“B”)에 속한 세션의 수
    • sum(if [Variant Id]='test' then [N] end)
  • f_test
    • Test(“B”)에 속한 세션의 전체에서의 비율
    • 이 값이 통계적으로 봤을 때 50% 임을 Proportional Z 테스트로 검증해야 함
    • [n_test]/SUM([N])

본격적으로 Tableau을 이용한 Traffic Trend Chart를 만들어 볼 것이다.

  1. Tableau 화면 하단에서 Sheet 1을 선택
  2. Tableau의 Calculated Field를 이용해 두 개의 필드 추가
    • 왼쪽 Data 섹션에서 오른쪽 클릭하여 Create  Calculated Field를 선택
    • 두 개의 필드를 생성
      • n_test = sum(if [Variant Id]='test' then [N] end)
      • f_test = [n_test]/SUM([N])
  3. f_test와 n_test를 가지고 차트 생성
    • 추가된 n_test와 f_test를 Rows로 drag-n-drop
    • Measures -> Rows, Dimensions -> Columns
  4. 듀얼 차트로 변경
    • 이제 듀얼 축으로 해서 왼쪽에는 n_test를 보여주고 오른쪽에는 f_test를 보여주는 걸로 변경
    • AGG(f_test)를 오른쪽 클릭하고 Dual Axis를 선택
  5. 컬럼으로 datestamp를 추가
    • Columns에 datestamp를 드롭
    • 포맷을 변경하기 위해 YEAR(Datestamp)를 오른쪽 클릭하여 More → Custom을 선택하고 Month/Day/Year를 선택
  6. n_test를 bar 타입으로 변경하고 색상도 grey로 변경
Traffic Trend Chart - Z-score 계산해보기
  1. 다음과 같은 Calculated Fields들을 추가
    • f_test_diff : [f_test]-0.5
    • f_test_err : sqrt(([f_test]-[f_test]^2)/SUM([N]))
    • f_test_stat : [f_test_diff]/[f_test_err]
    •  f_test_95CL : IF abs([f_test_stat])>1.96 THEN 1 else -1 END
      • 이 결과에 따라 color coding이 되어야 함 : 1이면 문제가 있고 이 경우 빨간색으로 표시, -1이면 아무 문제가 없고 녹색으로 표시
  2. f_test 그래프를 f_test_95CL의 값에 맞춰 칼라코딩
    1. f_test_95CL 필드를 AGG(f_test)의 Color로 드롭
    2. 그러면 오른쪽 끝단에 주황색으로 AGG(f_test_95CL)이 나타남. 클릭하고 Edit Colors를 선택
    3. Edit Colors 박스의 Palette에서 Red-Green-Diverging을 선택. Stepped Color를 체크하고 Steps로 3을 입력
    4. Advanced 버튼을 클릭하고 Start에는 1, End에는 -1, Center에는 0을 입력. 
  3. 오른쪽 상단에 있는 AGG(f_test_95CL)과 n_test를 차트의 왼쪽 상단으로 이동
  4. 오른쪽 클릭 후 Rename 선택하여 시트 이름을 Traffic Trend로 저장
Impression Chart

 다음으로 Impression Chart를 만들어 볼 것이다.

  1. Calculated Field 생성(metric별로 z-score 계산에 사용)
    • n_ctr l: SUM(if [Variant Id]='control' then [N] end)
    • ctrl : SUM(if [Variant Id]='control' THEN [sum] END)/[n_ctrl]
    • ctrl_var : SUM(if [Variant Id]='control' THEN [sum2] END)/[n_ctrl]-[ctrl]^2
    • test : SUM(if [Variant Id]='test' THEN [sum] END)/[n_test]
    • test_var : SUM(if [Variant Id]='test' THEN [sum2] END)/[n_test]-[test]^2
    • diff : [test]-[ctrl]
    • diff_frac : [diff]/[ctrl]
    • diff_err : sqrt([test_var]/[n_test]+[ctrl_var]/[n_ctrl])
    • diff_95CL : IF [diff]/[diff_err] > 1.96 THEN 1 ELSEIF [diff]/[diff_err] < -1.96 THEN -1 ELSE 0 END
    • zscore : [diif]/[diff_err]
  2. 새로운 시트를 만들고 이름을 Impression으로 지정
  3. Category를 Filters로 드롭하고 impression 선택
  4. Measure Names를 Rows로 드롭하고 편집
    1. Measure Names(Dimension)를 Rows로 드롭
    2. Measure Values (Measure)를 Marks의 Text로 드롭
    3. Marks 밑의 Measure Values를 오른쪽클릭해서 Edit Filter 선택하고 ctrl, diff, diff_frac만 선택
    4. 3개의 measure를 diff_frac, diff, ctrl 순서로
    5. diff_err과 diff_95CL을 Marks로 드롭
  5. 3개의 Impression Measure를 Color Coding : Test가 더 크면 녹색으로 Test가 더 작으면 빨간색으로
    1. diff_95CL을 Color로 드롭
    2. 오른쪽 상단에서 AGG(diff_95CL)을 오른쪽 클릭해서 Edit Colors를 선택
    3. Edit Colors 박스에서 Palette를 “Red-Green Diverging”을 선택하고 아래값을 앞서 f_test에 적용했던 color coding을 적용

 다음으로 Filters 관련 필드를 생성하여 Impression에 추가할 것이다.

  1. Parameter로 지표 dimension을 무엇으로 할지 결정
  2. selected_dimension이란 Parameter 생성
    1. 이름을 selected_dimension을 주고 List로 Age, Gender, Datestamp, none을 추가
  3. dimension이란 calculated field 생성
  4. Dimension 필드를 Columns로 이동
    1. Dimension 필드를 Columns로 드롭하면 차트상의 값이 dimension 필드의 값을 기준으로 표시됨
    2. 차트 상의 dimension을 감춘다
  5.  Age를 Filters 섹션에 드롭하면 Filter박스가 뜨는데 거기서 모든 값을 선택 + Gender, Datestamp 필드에 반복한다
  6. Age와 Gender 필터를 보여줌. Datestamp 필터는 나중에 다르게 보여줄 예정
  7. 오른쪽 상단 필터 박스를 싱글 리스트 박스로 변경 (Age와 Gender)
  8. Parameter 섹션에서 selected_dimension를 오른쪽 클릭해서 Show Parameter 메뉴를 클릭
대시보드 마무리작업

 Click/Purchase/Revenue Charts도 Impression Chart를 복사한 후 catogory 필터만 변경하여 추가한다. 그리고 만든 워크시트들을 대시보드로 생성한다.

  1. 하단에서 New Dashboard 탭을 클릭하고 이름을 A/B Test로 지정
  2. 대시보드 시트에서 왼쪽 sheets 밑에서 Traffic Trend 시트를 오른쪽으로 드롭
  3. 오른편의 f_test_95CL과 Measure Names 박스를 삭제
  4. 상단의 Traffic Trend 타이틀 제거
  5. Impression 차트를 화면하단으로 드롭
  6. Dimension 필터를 왼쪽으로 이동
  7. imp_diff_95CL 박스는 제거
  8. Impression 차트의 폭을 Fit Width로 선택
  9. Click/Purchased/Revenue 차트를 화면으로 드롭하고 재구성
  10. Impression 차트에서 datestamp 필터를 선택
  11. 각 필터를 클릭하고 오른편 하단 메뉴에서 “Apply to Worksheets” -> “All Using This Data Source를 선택” 
  12. Tableau Public으로 저장하고 마무리

'TIL' 카테고리의 다른 글

Foundation 모델 활용해보기  (0) 2024.03.05
AI 발전 동향 이해  (1) 2024.03.04
dbt(Data Build Tool) 학습  (0) 2024.03.01
가상 데이터 기반 A/B 테스트 분석  (0) 2024.02.29
A/B Test 관련 통계 살펴보기  (1) 2024.02.28