Когортный анализ помогает понять, как меняется поведение пользователей или покупателей со временем: удержание, повторные покупки, выручка, реактивации. Чтобы результаты были интерпретируемыми, нужно правильно определить основание когорты, окно наблюдения и единицы учета, собрать события без разрывов и дедупликации, а затем проверить аномалии и статистические ловушки.
Что обязательно учесть при когортном анализе
- Сразу фиксируйте единицу анализа: user_id, device_id, account_id или order_id - и правила склейки.
- Выбирайте один первичный критерий когорты (регистрация/первая покупка/первый визит) и не смешивайте его с сегментацией.
- Задайте окно наблюдения и гранулярность периодов (дни/недели/месяцы) до расчета метрик.
- Определите правила "активности": что считается визитом/сессией/покупкой/возвратом и как учитывать отмены.
- Обеспечьте качество данных: дедупликация, таймзоны, задержки доставки событий, роботы/тестовые аккаунты.
- Отделяйте метрику (retention, repeat rate, ARPU) от объяснения (канал, промо, изменение UX).
Как правильно формировать когорты: выбор основания и окна наблюдения
Когорты формируйте по моменту первого значимого события: регистрация, активация, первая покупка или первый платеж. В когортном анализе в продуктовой аналитике часто берут регистрацию/активацию, а в когортном анализе в e commerce - первую покупку (или первый заказ, оплаченный заказ - важно выбрать одно).
Быстрые правила выбора
- Основание когорты: событие, которое одинаково логируется для всех и редко меняло определение.
- Окно наблюдения: не короче типичного цикла возвращаемости (для e-commerce часто нужен минимум один полный цикл повторной покупки).
- Период когорты: недельные когорты для быстрого продукта, месячные - если цикл длиннее.
Кому подходит
- Командам, которые оптимизируют удержание, монетизацию, повторные покупки, LTV и влияние изменений на "длинный хвост".
- Продуктам с заметной динамикой поведения во времени (онбординг, подписка, контент, маркетплейс, ритейл).
Когда лучше не начинать с когорт
- Нет стабильного user_id и нет понятных правил идентификации (аноним/логин постоянно меняются).
- События приходят с большими задержками, а таймзона/время события невалидны.
- Определения ключевых событий "плавают" от релиза к релизу и не зафиксированы.
Сбор данных: источники, качество и правила предобработки
Для надежного расчета нужен единый слой данных: события поведения (app/web), транзакции (оплаты/заказы), справочники (каталог/цены), маркетинговые атрибуты (канал/кампания), а также статусы отмен/возвратов. Если данных много и они в разных системах, заранее определите, какие инструменты когортного анализа будут "истиной": DWH (BigQuery/PostgreSQL/ClickHouse) + BI (Metabase/Superset/Tableau) или продуктовая аналитика (Amplitude/Mixpanel).
Минимальные требования к данным
- Идентификаторы: user_id (или account_id), order_id, event_id (или ключ для дедупликации).
- Время: event_time в UTC (или четко фиксированная таймзона), отдельно ingestion_time полезен для контроля лагов.
- Справочники: маппинг каналов, платформ, стран; статусы заказов; правила исключения тестов.
Правила предобработки (псевдокод)
- Нормализуйте время и период: приводите event_time к UTC и вычисляйте cohort_period и age_period одинаковым способом для всех витрин.
- Дедупликация событий: оставляйте единственную запись по (event_id) или по (user_id, event_name, event_time, payload_hash) при отсутствии event_id.
- Определите первое событие для когорты: "первая покупка" должна быть строго первой по времени среди валидных оплаченных заказов.
-- Псевдо-SQL: витрина "первая покупка" как основание когорты
WITH paid_orders AS (
SELECT
user_id,
order_id,
paid_at AT TIME ZONE 'UTC' AS paid_at_utc,
revenue_net
FROM fact_orders
WHERE status = 'paid' AND is_test = false
),
first_paid AS (
SELECT
user_id,
MIN(paid_at_utc) AS first_paid_at_utc
FROM paid_orders
GROUP BY 1
),
orders_labeled AS (
SELECT
o.user_id,
DATE_TRUNC('week', f.first_paid_at_utc) AS cohort_week,
DATE_TRUNC('week', o.paid_at_utc) AS order_week,
DATE_DIFF('week', DATE_TRUNC('week', f.first_paid_at_utc), DATE_TRUNC('week', o.paid_at_utc)) AS age_week,
o.revenue_net
FROM paid_orders o
JOIN first_paid f USING (user_id)
)
SELECT * FROM orders_labeled;
Ключевые метрики для продуктовых и e‑commerce когорт
-
Определите "событие активности" и "событие ценности".
Активность нужна для retention (например, app_open, session_start, просмотр товара). Ценность нужна для денег (оплата, заказ, подписка). Не смешивайте их в одну метрику.
- Продукт: activation rate, retention, stickiness (DAU/WAU/MAU) - если у вас есть корректные активные пользователи.
- E-commerce: repeat purchase rate, orders per user, revenue per user - если статусы заказов и возвраты очищены.
-
Постройте матрицу "кохорта × возраст".
Возраст (age) - это номер периода с момента основания когорты: week_0, week_1 и т.д. Старайтесь начинать с 0 и держать одинаковую длину окна для сравнения.
- Считайте базу когорты (cohort_size) один раз - по пользователям, попавшим в основание.
- Для каждого age считайте активных/покупающих/выручку - по тем же user_id.
-
Рассчитайте удержание и повтор.
Retention = active_users(age) / cohort_size. Для e-commerce аналог - repeat rate = buyers(age) / cohort_size (или / buyers(week_0), если измеряете только среди покупателей).
- Фиксируйте, что считается "возвратом": любая активность или только покупка.
- Не сравнивайте retention разных оснований когорты в одной таблице без явной маркировки.
-
Добавьте денежные метрики.
ARPU/Revenue per user по когорте позволяет видеть качество привлечения и эффект изменений. В e-commerce отдельно полезны AOV (средний чек) и orders per user.
- Явно решите, учитывать ли возвраты как отрицательную выручку и в какой период их отражать.
- Если есть подписка - разделяйте выручку от первичной и повторной оплаты.
-
Сегментируйте после базового расчета.
Сначала получите "чистую" когортную матрицу, затем режьте по каналу, платформе, стране, категории. Это снижает риск ошибочной интерпретации из-за малых чисел.
- Сегменты должны быть взаимоисключающими или вы должны явно понимать пересечения.
- Если сегментов много - используйте топ-N и "прочее", чтобы не утонуть в шумах.
Быстрый режим: минимальный алгоритм за 30-60 минут
- Выберите основание когорты (регистрация или первая покупка) и период (неделя/месяц).
- Соберите витрину: user_id, cohort_period, event_period, age, признак активности/покупки, выручка.
- Постройте матрицу retention и рядом - выручку на пользователя по age.
- Проверьте аномалии по чек-листу ниже, затем добавьте 1-2 сегмента (канал, платформа).
- Сформулируйте 3-5 гипотез и привяжите каждую к метрике и возрасту когорты (например, week_1 retention).
Визуализация и таблицы: как быстро увидеть тренды и аномалии
Удобный формат - когортная таблица (heatmap в BI или обычная таблица), где строки - когорты, столбцы - возраст, значения - retention/выручка. Ниже - компактный шаблон, который можно повторить для любой метрики.
| Когорта (неделя) | Размер когорты | Age 0: Retention | Age 1: Retention | Age 2: Retention | Age 0: Выручка/польз. | Age 1: Выручка/польз. | Age 2: Выручка/польз. | Примечание (изменения/кампании) |
|---|---|---|---|---|---|---|---|---|
| 2026‑W30 | N | R0 | R1 | R2 | Rev0 | Rev1 | Rev2 | Релиз/промо/смена канала |
| 2026‑W31 | N | R0 | R1 | R2 | Rev0 | Rev1 | Rev2 | - |
Проверка результата: чек-лист перед выводами
- Когорты идут без пропусков по времени; "дыр" нет, либо они объяснимы (остановка трекинга/сбои).
- Размер когорты не скачет "ступеньками" без причины (изменение определения события/фильтра тестов/каналов).
- Age 0 метрика интерпретируема: вы не считаете retention "в тот же день" для регистрации, если продукт предполагает возврат позже.
- Retеntion не растет вверх по возрасту систематически (если растет - ищите ошибку в знаменателе или фильтрах).
- Сегменты суммарно согласуются с общим итогом (если сегментация взаимоисключающая).
- Возвраты/отмены не "переносят" выручку между периодами неожиданным образом.
- Смена атрибуции каналов не ломает сопоставимость когорт.
- Для e-commerce проверено, что повторная покупка - это действительно следующий заказ, а не повторная запись того же.
Статистические ловушки и проверка значимости выводов

- Смешение оснований: часть пользователей попала в когорту по регистрации, часть - по покупке, и вы сравниваете "несравнимое".
- Survivorship bias: анализируете только тех, кто дожил до периода (например, только активных), и завышаете retention/ARPU.
- Смена трекинга: событие переименовали/изменили payload - cohort_size и активность становятся несопоставимыми.
- Разные таймзоны: когорты считаются по локальному времени, а события - по UTC, появляются "ложные" переходы между периодами.
- Малые когорты: колебания выглядят как тренд; не делайте выводов по единичным сегментам без минимального объема.
- Множественные сравнения: вы смотрите десятки метрик и сегментов и находите "улучшение" случайно; заранее фиксируйте 1-2 primary метрики.
- Конфундеры: одновременно с релизом шло промо/изменение цены/ассортимента - эффект нельзя приписать продукту без контроля.
- Неправильный знаменатель: retention посчитан от активных в age 0, хотя нужно от cohort_size (или наоборот) - меняется смысл метрики.
От инсайта к решению: приоритизация гипотез и A/B‑дорожная карта
Когортный анализ дает "где сломалось" и "когда проявляется". Дальше нужны действия: гипотезы, приоритет и проверка. Если вы понимаете, что нужно ускорить внедрение или не хватает ресурсов на витрины/валидацию, иногда разумно заказать когортный анализ как разовую услугу с передачей SQL/дашбордов и регламентов.
Как превратить наблюдение в план экспериментов
- Сформулируйте проблему через возраст: "падает week_1 retention у когорт после даты Х".
- Привяжите к механике: онбординг, пуши, скорость, ассортимент, доставка, цены, фрод-фильтры.
- Выберите primary метрику и guardrails: например, week_1 retention и guardrails по конверсии в оплату/марже.
- Соберите A/B‑дорожную карту: 2-4 эксперимента с ожидаемым эффектом и сроком созревания (какой age должен "дозреть" до оценки).
Альтернативы, когда A/B не лучший первый шаг

- Квазиэксперимент до/после: уместно при редких изменениях и стабильной сезонности, но требуются контрольные разрезы (канал/регион) для здравой интерпретации.
- Holdout для маркетинга: уместно, если эффект идет от коммуникаций (письма/пуши/ретаргет), и проще удерживать контрольную группу, чем рандомизировать продукт.
- Разделение по времени выката (staged rollout): уместно при постепенном релизе по процентам трафика; позволяет сравнивать когорты, затронутые релизом, с "не затронутыми".
- Качественная диагностика: уместно, когда когорты показывают деградацию в определенной точке, и нужно быстро найти причину (сессии, логи, записи, опрос).
Типичные вопросы и практические ответы по внедрению
Какой идентификатор лучше использовать: user_id или device_id?
Для долгосрочных когорт берите user_id/account_id, иначе смена устройства разорвет историю. Device_id подходит только для коротких окон или если у вас нет стабильной авторизации.
Что выбрать основанием когорты в интернет-магазине?
Чаще всего - первая оплаченная покупка, потому что она хорошо связана с повторными заказами и выручкой. Если важен онбординг до покупки, делайте отдельную когортность по регистрации/первому визиту.
Можно ли сравнивать когорты по разным периодам (дни vs недели)?
Сравнивать напрямую нельзя: меняется смысл возраста и "скорость" метрик. Выберите одну гранулярность под задачу и держите ее одинаковой для всех когорт в анализе.
Какие минимальные поля нужны, чтобы собрать когорты в DWH?
Нужны user_id, event_time, event_name и (для e-commerce) order_id, статус оплаты и выручка. Плюс фильтр тестовых данных и нормализация таймзоны.
Почему retention растет на поздних неделях?
Обычно это ошибка знаменателя или фильтра: вы делите на "доживших", а не на исходный cohort_size, или теряете часть пользователей из-за дедупликации/джойнов. Реже это эффект реактивации, который нужно считать отдельной метрикой.
Где строить отчеты: в продуктовой аналитике или в BI?
В продуктовой аналитике быстрее стартовать и проще сегментировать, но сложнее контролировать логику статусов заказов и возвратов. В BI/DWH больше контроля и воспроизводимости; часто оптимальна связка DWH + BI.
Как понять, что пора автоматизировать, а не считать вручную?
Если вы пересчитываете когорты после каждого релиза/кампании или спорите о определениях метрик, автоматизируйте витрину и один эталонный дашборд. Ручной расчет оставьте для разовых исследований и прототипов.


