Короткий ответ
Для когортного анализа сначала определяют месяц регистрации каждого пользователя (когорту), затем для каждого события считают номер месяца относительно когорты, после чего строят pivot_table с когортой в строках, номером месяца жизни в столбцах и числом активных пользователей в ячейках.
Как это работает подробнее
когорта обычно определяется как месяц первой активности или регистрации пользователя (df.groupby('user_id')['date'].min()); "номер месяца жизни" = разница в месяцах между датой события и датой когорты пользователя; дальнейший pivot_table с aggfunc='nunique' по user_id даёт число уникальных активных пользователей в каждой ячейке когорта × месяц жизни.
Пример кода
Пример на Python
import pandas as pd
events = pd.DataFrame({
'user_id': [1, 1, 2, 2, 3],
'date': pd.to_datetime(['2024-01-10', '2024-02-05', '2024-01-15', '2024-03-01', '2024-02-20'])
})
cohort = events.groupby('user_id')['date'].min().dt.to_period('M').rename('cohort')
events = events.join(cohort, on='user_id')
events['period'] = (events['date'].dt.to_period('M') - events['cohort']).apply(lambda x: x.n)
table = events.pivot_table(index='cohort', columns='period', values='user_id', aggfunc='nunique')
print(table)Что использовать на практике
- На практике. после построения абсолютных чисел их часто переводят в проценты от размера когорты (retention rate), деля каждую строку на значение в её первом столбце (месяц 0); такую таблицу удобно визуализировать как тепловую карту для наглядного сравнения удержания между когортами.
- Проверка. для когорты 2024-01 (пользователи 1 и 2) в period=0 должно быть 2 активных пользователя, а в period=1 — 1 пользователь (user_id=1, вернувшийся в феврале), что проверяется ручным пересчётом по исходным датам.
Подводные камни
- Частые ошибки. путают дату события и дату когорты при расчёте разницы в месяцах, используя субтракцию календарных дат вместо разницы номеров года-месяца, что даёт неверный результат на границах месяцев; считают "активность" без уникализации по user_id (используя count вместо nunique), что переоценивает когорту при наличии нескольких событий одного пользователя в месяц.