Когорта: что это простыми словами и зачем нужен когортный анализ
Когорта — группа пользователей с общим стартовым событием в одном периоде. Что такое когортный анализ, как построить и читать когортную таблицу, какие бывают когорты и почему последние когорты нельзя сравнивать с остальными.
Содержание статьи
Понедельник, разбор метрик за лето. Первый слайд радует: недельная аудитория выросла со 196 человек в первую неделю июня до 2118 в последнюю неделю августа. Второй слайд пугает: доля активных среди всех зарегистрированных упала с 90,5% до 45,9%. Оба графика построены по одной базе, и ни один не отвечает на главный вопрос: новые пользователи держатся так же, как раньше, или хуже? Ответ на него даёт когортный анализ.
Коротко
- Когорта — группа пользователей, у которых стартовое событие случилось в одном периоде: зарегистрировались в одну неделю, впервые оплатили в один месяц.
- Когортный анализ сравнивает такие группы на одинаковом «возрасте»: сколько вернулось на первой, второй, третьей неделе после старта.
- Общие графики смешивают старых и новых пользователей, и изменения в поведении новых в них тонут.
- Когортную таблицу читают по строкам (жизнь одной когорты), по столбцам (сравнение когорт одного возраста) и по диагоналям (одна календарная неделя).
- У последних когорт часть клеток ещё не наступила. Их оставляют пустыми, а не заполняют нулями.
Что такое когорта простыми словами
Когорта — это группа пользователей, у которых одно и то же стартовое событие произошло в один и тот же период. Например, все, кто зарегистрировался в неделю с 6 по 12 июля. Состав когорты не меняется: человек попадает в неё один раз и навсегда.
Слово пришло из демографии и медицинской статистики, где когортой называют людей, родившихся в один год или начавших лечение в одно время. Продуктовая аналитика взяла ту же идею: сравнивать не всех подряд, а тех, кто начал путь одновременно.
Когортный анализ — это сравнение когорт по «возрасту», то есть по времени, прошедшему со старта. Неделя 1 для когорты 6 июля — это 13–19 июля, для когорты 13 июля — 20–26 июля. Календарные даты разные, а возраст одинаковый, поэтому группы можно сравнивать честно.
Зачем нужен когортный анализ: общий график смешивает старых и новых
В учебной базе SQL-курса 4613 пользователей, которые регистрировались с 1 июня по 29 августа 2026 года, а события в ней идут до 30 августа. Регистрации растут почти каждую неделю: 196 в первую, 481 в предпоследнюю.
Недельная аудитория растёт вместе с ними, потому что каждая неделя добавляет новых людей, а все новые пользователи в базе активны в неделю регистрации. Рост WAU здесь в основном отражает приток, а не то, что продукт стал лучше удерживать.
Доля активных среди всех зарегистрированных падает по другой причине. В знаменателе копятся пользователи старых когорт, а на восьмой неделе после регистрации у июньских когорт активны только 28–39%. Чем больше в базе людей «в возрасте», тем ниже общая доля, даже если удержание каждой когорты не менялось.
Оба общих графика отражают состав базы. Когортный разрез убирает эффект состава: он сравнивает группы на одном возрасте. И в нём видно то, что общие графики прятали: первая неделя после регистрации стабильна, а вторая стала хуже. У когорт 1–22 июня на второй неделе возвращались 69,5–73,1%, у когорт с 6 июля по 3 августа — 60,9–64,8%.
| Неделя | WAU | Зарегистрировано к концу недели | Доля активных |
|---|---|---|---|
| 8–14 июня | 379 | 419 | 90,5% |
| 29 июня – 5 июля | 944 | 1241 | 76,1% |
| 20–26 июля | 1573 | 2373 | 66,3% |
| 10–16 августа | 1965 | 3661 | 53,7% |
| 24–30 августа* | 2118 | 4613 | 45,9% |
Учебная база SQL-курса, DuckDB. Когорты по неделе регистрации; показаны когорты, у которых обе недели уже полностью прошли.
Какие бывают когорты
Когорту задают два решения: какое событие считать стартом и какой период брать за одну группу. Период выбирают по темпу продукта. Для приложения с ежедневным использованием подойдут дни или недели, для подписки с месячной оплатой — месяцы.
Стартовое событие выбирают под вопрос. Если вопрос про удержание новых пользователей, стартом будет регистрация. Если про повторные покупки, первая покупка: регистрация без покупки в этом вопросе просто шум.
| Когорта | Стартовое событие | На какой вопрос отвечает |
|---|---|---|
| По неделе или месяцу регистрации | регистрация | как меняется удержание новых пользователей от периода к периоду |
| По каналу привлечения | регистрация с меткой канала | какой трафик остаётся, а не только приходит |
| По первой покупке или оплате | первая оплата | повторные покупки, LTV, срок окупаемости |
| По варианту эксперимента | первый показ варианта | держится ли эффект теста через недели после запуска |
| По первому ключевому действию | например, первый отчёт | что происходит с теми, кто дошёл до ценности продукта |
Как построить когортную таблицу в SQL
Когортная таблица — это матрица: строки — когорты, столбцы — возраст, в клетке — доля когорты, активная в этом возрасте. В тепловой карте цвет клетки зависит от значения, поэтому провалы видны сразу.
Запрос ниже строит её на учебной базе в четыре шага. cohorts присваивает каждому пользователю неделю регистрации. activity находит недели, в которые у него были события, и переводит их в возраст week_n. matrix считает активных для каждой когорты и возраста от 1 до 4. Последний select делит на размер когорты. Оператор // — целочисленное деление в DuckDB; в PostgreSQL для целых чисел достаточно обычного /.
Отдельно стоит last_week — неделя, на которой обрываются данные. Клетки, которые попадают в неё или ещё позже, запрос оставляет пустыми через case без else. Почему это нужно, разберём ниже.
Учебная база SQL-курса, DuckDB. Размер — число регистраций в когорте. Пустые клетки: неделя ещё не наступила или приходится на неполную неделю 24–30 августа.
with cohorts as (
select user_id, date_trunc('week', signup_date)::date as cohort_week
from users
),
activity as (
select distinct
c.cohort_week,
c.user_id,
(date_trunc('week', e.event_time)::date - c.cohort_week) // 7 as week_n
from cohorts as c
join events as e on e.user_id = c.user_id
),
last_week as (
-- неделя, в которой обрываются данные: она ещё не закончилась
select date_trunc('week', max(event_time))::date as started
from events
),
matrix as (
select
c.cohort_week,
count(distinct c.user_id) as cohort_size,
n.week_n,
count(distinct a.user_id) as active_users
from cohorts as c
cross join (values (1), (2), (3), (4)) as n(week_n)
left join activity as a
on a.user_id = c.user_id and a.week_n = n.week_n
group by c.cohort_week, n.week_n
)
select
m.cohort_week,
m.cohort_size,
m.week_n,
case
when m.cohort_week + 7 * m.week_n < lw.started
then round(100.0 * m.active_users / m.cohort_size, 1)
end as retention_pct
from matrix as m
cross join last_week as lw
where m.cohort_week between date '2026-07-06' and date '2026-08-10'
order by m.cohort_week, m.week_n;Как читать когортную таблицу: строки, столбцы и диагонали
Строка — жизнь одной когорты. Когорта 6 июля на первой неделе вернулась на 76,1%, на второй — на 62,9%, на третьей — на 51,8%. Строка отвечает на вопрос, как быстро группа теряет интерес и где кривая начинает выравниваться.
Значения в строке не обязаны только падать. У когорты 6 июля четвёртая неделя (53,1%) чуть выше третьей (51,8%): метрика считает тех, кто был активен именно в эту неделю, а не «хотя бы раз после». Часть людей пропускает неделю и возвращается.
Столбец — сравнение когорт одного возраста. Именно по столбцам видно, стал ли продукт лучше удерживать новых. Здесь первая неделя у всех когорт держится в районе 76–81%, а по второй неделе июльские когорты (60,9–64,8%) заметно ниже июньских из графика выше.
Диагональ — одна календарная неделя. Клетки «неделя 4 у когорты 20 июля», «неделя 3 у 27 июля», «неделя 2 у 3 августа» и «неделя 1 у 10 августа» относятся к одной и той же неделе 17–23 августа. Если в какую-то неделю был сбой или неудачный релиз, он ударит по всем когортам сразу и проявится полосой по диагонали. В учебной базе такой полосы нет: значения меняются при движении вниз по столбцу, то есть разница связана с тем, когда пришли пользователи, а не с тем, что случилось в конкретную календарную неделю.
Когорта из 30 человек может дать скачок на 10 пунктов из-за трёх пользователей. Колонка размера в таблице — не украшение, а способ отличить сигнал от случайности.
Ловушка незрелых когорт
Когорта 10 августа прожила на момент выгрузки меньше трёх недель. Её четвёртая неделя ещё не наступила, и никакого значения там быть не может. Если посчитать удержание без проверки зрелости, запрос вернёт в этой клетке 0: активных в неделю 4 нет, потому что самой недели нет.
Ноль в когортной таблице означает «никто не вернулся», пустая клетка — «данных для этого возраста ещё нет». Если перепутать их, итог искажается сильно. Доля пользователей, активных на четвёртой неделе, по всей базе получается 31,7%. Если взять только когорты, для которых четвёртая неделя уже закончилась (до 20 июля включительно, 2373 человека), — 53,4%.
Есть и второй, менее заметный вид незрелости — неполный последний период. В учебной базе события обрываются 30 августа в 12:59, а неделя 24–30 августа попадает в последнюю диагональ таблицы. Сырые значения там выглядят правдоподобно: 79,6% на первой неделе у когорты 17 августа, 59,5% на второй у когорты 10 августа. Но у пользователей было на полдня меньше, чтобы вернуться, поэтому в таблице эти клетки тоже пустые.
Практическое правило: клетка заполняется, только если соответствующий период целиком закончился до конца данных. Последние когорты показывайте, но с пустыми клетками, и не включайте их в средние по столбцу.
Частые ошибки в когортном анализе
Большинство ошибок возникает не в SQL, а в определениях, которые никто не записал рядом с таблицей.
- Не указано, что считается активностью. Вход в приложение и создание отчёта дадут разные таблицы. Название действия должно стоять в подписи.
- Смешаны календарные недели и окна по дням. Здесь неделя 1 — следующая календарная неделя после регистрации, поэтому у зарегистрированного в воскресенье нулевая неделя длится один день. Для точных сравнений берут окна от даты старта: 7–13 дней, 14–20 и так далее.
- Неделя 0 выдаётся за удержание. В учебной базе она равна 100% у всех когорт: каждый новый пользователь что-то сделал в день регистрации. Это факт о логировании, а не о продукте.
- Проценты когорт усредняются без весов. Когорта из 200 человек и когорта из 450 не должны влиять на итог одинаково. Считайте общую долю через суммы активных и размеров.
- Определение старта меняется посреди периода. Если регистрацию начали считать по-другому, старые и новые когорты уже нельзя сравнивать.
- Мелкие когорты читаются как крупные. Дневные когорты по 30 человек дают скачки, которые легко принять за эффект.
Когорта и сегмент: в чём разница
Сегмент — это группа по признаку: страна, устройство, тариф, канал. Сегментом можно разрезать любую метрику в любой момент, а состав некоторых сегментов меняется: пользователь переходит с бесплатного тарифа на платный.
Когорта — группа по времени старта, и её состав зафиксирован. Главное в когорте — ось возраста: метрику считают не по календарю, а по времени, прошедшему со стартового события.
На практике их комбинируют: берут когорты по неделе регистрации и внутри них делят по каналу. Так получается ответ на вопрос «удерживает ли платный поиск хуже органики у пользователей одного возраста», а не простое сравнение каналов, где у органики много старых пользователей, а у свежей рекламной кампании — только новые.
Где ещё используют когорты
Retention — самое частое применение: удержание по дням или неделям после регистрации и сравнение каналов на одинаковом возрасте. Подробный разбор с D1, D7 и D30 и SQL для дневных окон — в отдельных материалах, ссылки ниже.
LTV считают накопительно по когортам: сколько выручки принесла когорта к 1-му, 2-му, 3-му месяцу жизни. Иначе в среднем смешиваются клиенты, которые платят уже год, и те, кто пришёл на прошлой неделе.
Срок окупаемости (payback) — это возраст, на котором накопленная выручка когорты сравнялась с затратами на её привлечение. Без когорт его просто не на чем измерить.
Эксперименты тоже удобно смотреть как когорты: пользователи, увидевшие вариант в одну неделю, — отдельная группа. Так видно, держится ли эффект или затухает, когда новизна проходит.
Что читать дальше
Здесь когорта разобрана как понятие на одном примере. Для рабочих расчётов пригодятся материалы, где когорты применяются к удержанию, деньгам и каналам.
Материалы по теме

Churn rate и retention rate: что это и как посчитать отток
Churn rate — доля клиентов, которые ушли за период, из тех, кто был в его начале. Как посчитать отток клиентов и retention rate в подписке и в бесплатном продукте, чем customer churn отличается от revenue churn, как перевести месячный отток в годовой и где ошибаются со знаменателем.

Сегментация пользователей: что это, как делить и где она обманывает
Сегментация — деление пользователей на группы по признаку, чтобы увидеть различия, которые прячет среднее. Виды сегментов, отличие сегмента от когорты, RFM-анализ в SQL, маленькие сегменты, смена состава и сегменты в A/B-тестах — на учебной базе.

Когорты и retention в SQL: как считать возвращаемость по датам
Разбираем когортный retention в SQL: как определить дату старта, посчитать D1 и D7, собрать матрицу возвращаемости и сравнить каналы без самообмана.