こんにちは、ミナピピン(@python_mllover)です。たまに仕事でN日後継続率を集計することがあるので、次からコピペですぐできるようにメモしておきます。
データを用意
<table1>
| install_datetime | user_id | login_datetime |
| 2021/1/1 9:29 | 1 | 2021/1/4 16:00 |
| 2021/1/1 9:29 | 1 | 2021/1/10 12:00 |
| 2021/1/1 9:29 | 1 | 2021/1/12 13:00 |
| 2021/1/1 9:29 | 1 | 2021/1/7 23:00 |
| 2021/1/1 9:29 | 1 | 2021/1/6 4:00 |
| 2021/1/2 1:47 | 2 | 2021/1/10 22:00 |
| 2021/1/2 1:47 | 2 | 2021/1/11 7:00 |
| 2021/1/2 1:47 | 2 | 2021/1/8 16:00 |
| 2021/1/3 10:36 | 3 | 2021/1/12 12:00 |
| 2021/1/3 10:36 | 3 | 2021/1/5 2:00 |
| 2021/1/3 10:36 | 3 | 2021/1/4 2:00 |
| 2021/1/3 10:36 | 3 | 2021/1/5 8:00 |
| 2021/1/3 10:36 | 3 | 2021/1/5 17:00 |
<作成コード>
import random
import datetime
import pandas as pd
now = datetime.datetime.now()
data = []
for i in range(1,6):
day_ = random.choice([1,2,3])
install_datetime = now.replace(day=day_, hour=random.randint(1,23), minute=random.randint(1,59), second=0, microsecond=0)
id_ = i
for s in range(random.choice([2,3,5])):
login_datetime = now.replace(day=random.randint(day_+1,10), hour=random.randint(1,23), minute=0, second=0, microsecond=0)
data.append([install_datetime, id_, login_datetime])
pd.DataFrame(data,columns=['install_datetime','user_id', 'login_datetime']).to_csv('user_access.csv',index=False)
できたCSVからbigqueryの適当なデータセットにテーブルを作成してください。
継続フラグを作る
N日後継続率を集計するためにはまずフラグを作成します。ログイン日をユーザ・インストール日でGROUP BYし、CASE・WHEN文でインストール日から24時間以上48時間以内にログインしているデータがあった場合は1、それ以外は0とするフラグを付け、MAXでその最大値を集計します。(これによってフラグは1か0となります)
SELECT user_id ,DATE(install_datetime) AS install_date ,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 24 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 48 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day1_flg ,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 48 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 72 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day2_flg ,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 72 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 96 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day3_flg ,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 120 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 144 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day5_flg ,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 172 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 192 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day7_flg FROM `dbdapi.blog_sample_data.n_login` GROUP BY user_id ,install_date
フラグ数の平均から継続率を算出
そして、そのテーブルをインストール日でGROUP BYしAVG()で平均を取ることで、N日後継続率を集計することができます。
SELECT
install_date
,AVG(day1_flg) AS day1_ratio
,AVG(day2_flg) AS day2_ratio
,AVG(day3_flg) AS day3_ratio
,AVG(day5_flg) AS day5_ratio
,AVG(day7_flg) AS day7_ratio
FROM
(
SELECT
user_id
,DATE(install_datetime) AS install_date
,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 24 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 48 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day1_flg
,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 48 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 72 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day2_flg
,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 72 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 96 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day3_flg
,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 120 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 144 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day5_flg
,MAX(CASE WHEN TIMESTAMP_ADD(install_datetime, INTERVAL 172 HOUR) < login_datetime and TIMESTAMP_ADD(install_datetime, INTERVAL 192 HOUR) > login_datetime THEN 1 ELSE 0 END) AS day7_flg
FROM
`dbdapi.blog_sample_data.n_login`
GROUP BY
user_id
,install_date
)
GROUP BY
install_date
ORDER BY
install_date
関連記事:【SQL】分析関数①ROW_NUMBERで集計対象ごとに順番付け
関連記事:【SQL】GROUP BYと集計関数での集計、HAVING・WHEREでの条件付き集計

コメント