코호트 분석(Cohort Analysis)을 SQL로 구현하는 테스트 코드

Cohort Analysis

Cohort는 전향성 추적조사를 의미

  • 특정 요인에 노출된 집단과 노출되지 않은 집단을 추적하고 연구 대상 질병의 발생률을 비교하여 요인과 질병 발생 관계를 조사하는 연구 방법, 요인 대조 연구(factor - control study)라고도 불림

기준에 따라 그룹을 세분화하여 분석을 하는 방법

  • A라는 광고 채널을 통해 유입된 사용자 그룹
  • 관련 사용앱이 10~15개인 사용자 그룹

Cohort Analysis 분석 방향

  • 예를 들어 1월 1일에 처음 방문했던 사람들이 1월 2일과 1월 3일에 재방문하여 활동을 지속하는가를 관찰 => 그리고 다시 1월 5일에 처음 방문했던 사람들에 대해서도 관찰하여 비교 => 하지만 이렇게 기간만을 비교하면 의미가 크지않기 때문에 이에 대한 액션 혹은 개선 방안을 고민하는 것 자체가 어려워짐
  • 그래서 보통 어떠한 마케팅 액션별로 반응하는 방문자를 비교하는 것이 올바른 코호트 분석 방법임

SQL을 사용한 Cohort

# User 테이블
CREATE TABLE users (id INT(11) PRIMARY KEY NOT NULL,  
             name VARCHAR(40) NOT NULL, 
             date DATETIME NOT NULL);
# Event 테이블
CREATE TABLE events (id INT(11) PRIMARY KEY NOT NULL,  
             type VARCHAR(15), 
             user_id INT(11) NOT NULL, 
             date DATETIME NOT NULL, 
             FOREIGN KEY (user_id) REFERENCES users(id));
SELECT results.months,  
       results.cohort,
       results.actives AS active_users,
       user_totals.total AS total_users,
       results.actives/user_totals.total*100 AS percent_active
FROM  
  ( SELECT ROUND(DATEDIFF(events.date, users.date)/30.4) AS months,
           DATE_FORMAT(events.date, '%Y/%m') AS MONTH,
           DATE_FORMAT(users.date, '%Y/%m') AS cohort,
           COUNT(DISTINCT users.id) AS actives
   FROM users
   JOIN events ON events.user_id = users.id
   GROUP BY cohort, months ) AS results
JOIN  
  ( SELECT DATE_FORMAT(date, "%Y/%m") AS cohort, 
           count(id) AS total
   FROM users
   GROUP BY cohort ) AS user_totals ON user_totals.cohort = results.cohort
WHERE results.MONTH < DATE_FORMAT(NOW(), '%Y/%m');  

- [Ref0] http://mherman.org/blog/2013/07/19/cohort-analysis-data-sourcing-with-sql/#.VX-5OUbzmhE [Ref1] http://andrewchen.co/retention-is-king/ [Ref2] https://en.wikipedia.org/wiki/Listoftzdatabasetime_zones [Ref3] https://mariadb.com/kb/en/mariadb/time-zones/