Когортный анализ простыми словами

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Короткое объяснение

Cohort analysis — разделение пользователей на группы по дате первого контакта с продуктом и отслеживание их поведения во времени.

Помогает отличить «проблемы старых» от «проблем новых» и видеть, становится ли продукт лучше с каждой новой когортой.

Пример

Допустим, общий DAU стабилен. Но:

Когорта    | D0  | D1  | D7  | D30
-----------|-----|-----|-----|-----
Jan 2026   |100% | 40% | 20% | 10%
Feb 2026   |100% | 45% | 25% | 15%
Mar 2026   |100% | 35% | 15% | 5%   ← проблема!

Общий DAU стабилен, но когорта Mar retention-ится хуже. Проблема видна ТОЛЬКО через cohort analysis.

Зачем

1. Отделить новые от старых

Общий retention может быть стабилен, потому что старые держат метрику. Cohort покажет реальное состояние product-market fit для новых.

2. Отслеживать улучшения продукта

«Мы улучшили onboarding» → retention новых когорт должен расти.

3. Валидировать A/B

После релиза новой фичи — сравнить cohort до и после.

4. Прогноз LTV

Retention curve → LTV через площадь под кривой.

Формат: heatmap

Строки — когорта (дата регистрации). Столбцы — период с момента регистрации (D1, D7, D30, M1, M2, M3...). Ячейка — retention / метрика.

В SQL

WITH cohorts AS (
    SELECT
        user_id,
        DATE_TRUNC('month', MIN(event_at)) AS cohort_month
    FROM events
    GROUP BY user_id
),
activity AS (
    SELECT DISTINCT
        user_id,
        DATE_TRUNC('month', event_at) AS active_month
    FROM events
)
SELECT
    c.cohort_month,
    a.active_month,
    EXTRACT(MONTH FROM AGE(a.active_month, c.cohort_month)) AS months_since_signup,
    COUNT(DISTINCT a.user_id) AS active_users
FROM cohorts c
JOIN activity a ON a.user_id = c.user_id
GROUP BY 1, 2, 3
ORDER BY 1, 3;

Подробнее: когортный анализ SQL.

В Python

import pandas as pd

df['cohort'] = df.groupby('user_id')['event_at'].transform('min').dt.to_period('M')
df['period'] = (df['event_at'].dt.to_period('M') - df['cohort']).apply(lambda x: x.n)

cohort_table = df.groupby(['cohort', 'period'])['user_id'].nunique().unstack('period')
cohort_size = cohort_table[0]
retention = cohort_table.divide(cohort_size, axis=0)

Как интерпретировать

По строке

Retention падает во времени для данной когорты. Нормально.

По столбцу

Сравнение когорт. Если Mar D7 хуже, чем Jan D7 — продукт стал хуже для новых.

Диагональ

«Тренд» одного периода: D7 retention всех когорт. Идеально — растёт.

Smiley curve — идеальная retention

        ___.___.___ <- плато > 0
       /
      /
     /
100% (D0)

Если кривая падает до нуля → churn 100%. Продукт не приживается.

Cohort по разным метрикам

Retention (классика)

Сколько вернулись в период N.

Revenue

Средний revenue per cohort за период. Должен расти с «возрастом» (loyal customers spend more).

Activation

Сколько дошли до aha moment за период. Тест onboarding.

Feature adoption

Когда когорта начинает использовать определённую фичу.

Quasi-cohorts (нестандартные когорты)

Можно когортировать не только по дате регистрации, а по:

  • Дате первого платежа
  • Каналу привлечения (paid vs organic cohort)
  • Типу устройства (iOS vs Android cohort)
  • Сегменту тарифа

Полезно для сравнения характеристик, не только времени.

Когда применять

  • Продуктовая аналитика: retention, LTV, engagement
  • Маркетинг: эффективность каналов по cohort
  • A/B-тесты: long-term эффект
  • Финансы: MRR / net retention по cohort

На собесе

Типичные вопросы:

«Что такое cohort analysis?» Разделение на группы по дате регистрации, отслеживание метрики во времени.

«Зачем нужен?» Отделить новых от старых, видеть тренды улучшения продукта.

«Как построить в SQL?» CTE с cohort date, JOIN с activity, pivot по period.

«Разница cohort и просто group by?» Cohort — время с момента первого контакта (dynamic). Group by — по статической характеристике.

Частые ошибки

1. Cohort без time dimension

«Когорта Москва» — это сегмент, не cohort. Cohort = time-based.

2. Общий retention вместо cohort

Общий retention маскирует проблемы.

3. Слишком широкая cohort

Quarter cohort может скрыть weekly изменения. Month обычно ok.

4. Маленькая cohort — шум

Cohort < 100 users → статистика нестабильная.

Связанные темы

FAQ

Cohort или funnel?

Cohort — через время. Funnel — через шаги. Разные инструменты.

Какой период cohort?

Обычно месяц. Для быстрых продуктов — неделя.

Сколько когорт нужно?

6-12 для тренда. Больше — шум и ретроспектива.

Как визуализировать?

Heatmap с retention %. Или retention curve (line chart по время).


Тренируйте продуктовую аналитику — откройте тренажёр с 1500+ вопросами для собесов.