Короткий ответ
Когорта — группа пользователей, объединённых общим стартовым событием (например, месяц регистрации); retention считается как доля пользователей когорты, вернувшихся на N-й день/неделе/месяце после старта, и визуализируется матрицей или кривыми по когортам для сравнения их поведения во времени.
Как это работает подробнее
для каждой когорты и каждого периода (day 1, day 7, day 30…) считается доля изначального размера когорты, выполнившая целевое действие (визит, покупку); это позволяет сравнивать поведение пользователей, пришедших в разное время, независимо от общего календарного тренда.
Пример кода
SQL-запрос
-- PostgreSQL: когорта по месяцу первой активности и retention на 30-й день
WITH first_seen AS (
SELECT user_id, MIN(event_date) AS cohort_date
FROM events GROUP BY user_id
)
SELECT
date_trunc('month', f.cohort_date) AS cohort_month,
COUNT(DISTINCT f.user_id) AS cohort_size,
COUNT(DISTINCT CASE WHEN e.event_date = f.cohort_date + INTERVAL '30 day' THEN e.user_id END) AS retained_day30
FROM first_seen f
LEFT JOIN events e ON e.user_id = f.user_id
GROUP BY 1;Что использовать на практике
- На практике. форма кривой retention важна не меньше, чем конкретные числа: быстро падающая и затем выполаживающаяся кривая обычно означает наличие устойчивого «ядра» лояльных пользователей, а кривая, стремящаяся к нулю, — отсутствие такого ядра. При сравнении когорт по времени важно учитывать внешние факторы (сезонность запуска, маркетинговые кампании, привлекавшие разный по качеству трафик), которые могут объяснять разницу в retention помимо продуктовых изменений. Дополнительно полезно сравнивать когорты не только по времени привлечения, но и по каналу/источнику трафика, так как качество привлечённой аудитории может сильно влиять на форму кривой удержания независимо от продуктовых изменений.
- Пример. Sanity check: retained_day30 никогда не должен превышать cohort_size; доля retained_day30/cohort_size должна монотонно не расти при переходе к более поздним точкам (day60, day90) при том же определении bounded retention.
Подводные камни
- Частые ошибки. сравнивать retention когорт разного размера или привлечённых из разных каналов без учёта состава трафика; использовать усечённые данные для последних когорт (например, day-30 retention для когорты, которой всего 10 дней) как будто они уже посчитаны полностью; путать unbounded retention (вернулся хотя бы раз после дня N) с bounded retention (вернулся именно в день N) — это разные определения с разными кривыми. Ещё одна ошибка — интерпретировать выполаживание кривой retention как постоянное плато, не проверяя, продолжает ли она медленно снижаться на более длинном горизонте наблюдения.