무던히 하다보면 느는

[mysql] Validating A/B Test Result 본문

코딩테스트

[mysql] Validating A/B Test Result

무던히 하다보면 느는 2025. 4. 24. 14:12

(1) 각 user_id 마다  실험 기간 동안 몇 번의 send_message 로그가 발생했는지 계산

실험기간 : 2014-06 한달간

대조군과 실험군의 각 send message 비교

- 실험배정 이후 유저의 행동확인, select ex.occurred_at

- 각 user 마다 실험에 참여한 시각이 다르기에 occurred_at ~ 2014-06-30 23:59:59 event log 참고

- events.occurred_at : 사용자가 실제로 어떤 행동을 한 시점

  experiments.occurred_at : 사용자가 실험(A/B 테스트)에 배정된 시점을 의미

더보기

e.occurred_at between ex.occurred_at and '2014-06-30 23:59:59'

 

events.occurred_at : 행동분석에 사용. A/B 테스트 이후 이 사용자가 어떤 행동을 했는지 확인

experiments.occurred_at : A/B 테스트 효과 분석 시, 이 시점부터 사용자의 행동을 관찰해야 하므로, 이 이후에 발생한 이벤트만 고려

- user가 실험기간 동안에 한 번도 이벤트를 발생 시키지 않은 유저일 수 있음 -> left join

- count(*) X 이벤트가 없는 user도 카운팅 됨

select u.user_id
     , u.activated_at
     , ex.experiment
     , ex.experiment_group
     , ex.occurred_at
     , count(e.user_id) as cnt_send_message -- count(*) X 이벤트가 없는 user도 카운팅 됨
from tutorial.yammer_experiments ex
  inner join tutorial.yammer_users u on ex.user_id = u.user_id
  left join tutorial.yammer_events e
          on ex.user_id = e.user_id
          and e.occurred_at between ex.occurred_at and '2014-06-30 23:59:59'
          and e.event_name = 'send_message'
where experiment = 'publisher_update'
group by u.user_id, u.activated_at, ex.experiment, ex.experiment_group,
        ex.occurred_at

 

(2) 그룹별 계산

select experiment_group
     , count(user_id) as users
     , avg(cnt_send_message) as average
     , sum(cnt_send_message) as total
from (
  select u.user_id
       , ex.experiment_group
       , count(e.user_id) as cnt_send_message -- count(*) X 이벤트가 없는 user도 카운팅 됨
  from tutorial.yammer_experiments ex
    inner join tutorial.yammer_users u on ex.user_id = u.user_id
    left join tutorial.yammer_events e
            on ex.user_id = e.user_id
            and e.occurred_at between ex.occurred_at and '2014-06-30 23:59:59'
            and e.event_name = 'send_message'
  where experiment = 'publisher_update'
  group by u.user_id, ex.experiment_group
) smbu -- send message by user
group by experiment_group