グロースハックのためのSQL – コーホート分析

Tech, グロースハック, ツール, 作ってみたSQL, コーホート分析

コホート分析とは

定義

ユーザーを一定の条件や属性によってグループに分け、時間の経過に伴って、グループごとにどんな行動の変化があるかを分析するものです

Udemy メディア グロースハックとは?事例から成功手法まで5分で理解できる記事 ( https://udemy.benesse.co.jp/marketing/growth-hack.html#i-4)

よくある図と読み方

赤枠に注目して説明する

たいてい、Google検索で「cohort analysis」と検索すると上のような表が出てくる。
Google Analyticsを使ったことがある人は、自動生成される表を見たことがあるかもしれない。

赤枠で囲った部分から得られる示唆は下記になる
・ 1/25に登録したユーザーは、2日目には23.5%再訪している
・2/2に登録したユーザーは、2目には18.5%再訪している

-> ユーザーのサービス定着率が下がっている(23.5% -> 18.5% )

SQLでコーホート表(のようなもの)を作る

テーブル構成

シンプルなテスト用のテーブルを用意した。

user_idが0の人は、2019-05-01に非アクティブ(=ログインしてない / 買い物してない / 動画を再生していないなど意味合いはなんでもよし)というレコードが入っている

【自分で試したい人用】SQLダンプはこちら

各ユーザーのactiveの推移を見るSQL

SELECT
  ul1.user_id,
  ul1.date AS first_access_day,
  ul1.login AS day01,
  ul2.login AS day02,
  ul3.login AS day03
FROM
  user_log ul1
  -- 同じユーザー・翌日の日付で自己結合
  LEFT JOIN user_log ul2 ON ul1.user_id = ul2.user_id
  AND ul1.date = DATE_SUB(ul2.date, INTERVAL 1 DAY)
  -- 同じユーザー・翌々日の日付で自己結合
  LEFT JOIN user_log ul3 ON ul1.user_id = ul3.user_id
  AND ul1.date = DATE_SUB(ul3.date, INTERVAL 2 DAY)

全ユーザーのactive率の推移を見るSQL & 7日間に拡張

1週間に期間を広げ、登録日でGroup by すると一気にコーホート表感が出る。

SELECT
  ul1.date AS first_access_day,
  SUM(ul1.active) / COUNT(*) AS day01,
  SUM(ul2.active) / COUNT(*) AS day02,
  SUM(ul3.active) / COUNT(*) AS day03,
  SUM(ul4.active) / COUNT(*) AS day04,
  SUM(ul5.active) / COUNT(*) AS day05,
  SUM(ul6.active) / COUNT(*) AS day07,
  SUM(ul7.active) / COUNT(*) AS day07
FROM
  user_log ul1
  LEFT JOIN user_log ul2 ON ul1.user_id = ul2.user_id
  AND ul1.date = DATE_SUB(ul2.date, INTERVAL 1 DAY)
  LEFT JOIN user_log ul3 ON ul1.user_id = ul3.user_id
  AND ul1.date = DATE_SUB(ul3.date, INTERVAL 2 DAY)
  LEFT JOIN user_log ul4 ON ul1.user_id = ul4.user_id
  AND ul1.date = DATE_SUB(ul4.date, INTERVAL 3 DAY)
  LEFT JOIN user_log ul5 ON ul1.user_id = ul5.user_id
  AND ul1.date = DATE_SUB(ul5.date, INTERVAL 4 DAY)
  LEFT JOIN user_log ul6 ON ul1.user_id = ul6.user_id
  AND ul1.date = DATE_SUB(ul6.date, INTERVAL 5 DAY)
  LEFT JOIN user_log ul7 ON ul1.user_id = ul7.user_id
  AND ul1.date = DATE_SUB(ul7.date, INTERVAL 6 DAY)
GROUP BY
  ul1.date
ORDER BY
  ul1.date
溢れ出るコーホート感

キレイにスタイリングして上司に褒められる

SQLの取得結果でも充分示唆は得られるが、スプレッドシートに出力して条件付き書式をつけると見やすくなる。
※今回は乱数でデータを作っているので規則的なグラデーションにはなっていない