Главная
#Математика и ML #Data Science #Time Series

Что такое Cohort analysis в Data Science и как смотреть на удержание по группам в 2026 году?

Cohort analysis — это способ смотреть на пользователей не как на одну усредненную массу, а как на группы, у которых есть общий момент входа в систему или общий сценарий старта. Для студентов Data Science это одна из тех тем, где аналитика внезапно перестает быть набором красивых графиков и начинает по-настоящему объяснять поведение продукта.

Содержание
  1. Почему cohort analysis сильнее, чем один общий retention
  2. Что вообще считается когортой
  3. Базовая формула retention по когорте
  4. Почему cohort table читается как карта, а не как просто таблица
  5. Сглаженный взгляд: доля перехода между соседними шагами
  6. Геометрический смысл retention-кривой
  7. Почему cohort analysis тесно связана с причинным мышлением
  8. Где здесь связь с оптимизацией
  9. Когда cohort analysis особенно полезна в Data Science
  10. Когда cohort analysis легко интерпретировать неправильно
  11. Python: как посчитать cohort retention на практике
  12. Что важно вынести из темы
  13. Kaggle notebook по теме:

Когда человек впервые видит общий retention по всей базе, ему часто кажется, что он уже понял картину. Но усреднение здесь очень опасно. Оно смешивает старых пользователей и новых, сильные каналы и слабые, удачные запуски и неудачные, праздничный трафик и органику. В результате одна кривая начинает выдавать себя за реальность, хотя на самом деле она является смесью совершенно разных историй.

Такие задачи лучше изучать как единый продуктовый контекст. Тогда cohort analysis перестает быть просто красивой таблицей и начинает работать как способ честно смотреть на поведение пользователей во времени, без смешения разных жизненных циклов в одну среднюю кривую.

Именно cohort analysis разделяет эти истории. Она отвечает не на вопрос “что в среднем происходит с пользователями?”, а на вопрос “что происходит с группой пользователей, которые стартовали в один и тот же период или пришли в один и тот же сценарий?”. Для продукта это почти всегда полезнее. Для Data Science это ещё важнее, потому что помогает не строить модели на смешанном поведении, которое скрывает причинность.

Почему cohort analysis сильнее, чем один общий retention

Представьте продукт, который в январе привлек очень качественную аудиторию, а в феврале запустил шумную рекламную кампанию с низким качеством трафика. Если смотреть на общий retention, вы увидите просто некоторую среднюю кривую. Она может казаться стабильной, хотя в реальности под ней скрываются две разные динамики: одна когорта удерживается хорошо, другая быстро разваливается.

Это и есть центральная интуиция темы. Cohort analysis не добавляет “еще один красивый отчет”. Она помогает не путать временной срез с жизненным циклом группы. Пользователь, который пришел вчера, не должен сравниваться напрямую с пользователем, который живет в продукте уже год. Их нужно выровнять по возрасту когорты, а не по календарной дате.

В этом смысле cohort analysis похожа на честный способ сравнивать траектории. Мы как будто берём несколько групп людей, запускаем для каждой собственные часы с нуля и смотрим, как быстро они исчезают, возвращаются, платят или активируются.

Что вообще считается когортой

Самый популярный вариант — time-based cohort. Например, все пользователи, которые зарегистрировались в одном месяце, образуют одну когорту. Но это далеко не единственный вариант. Когортой может быть группа по каналу привлечения, по первой покупке, по версии приложения, по городу, по стартовому тарифу, по первой feature activation или даже по экспериментальной ветке.

Главное, чтобы внутри группы был осмысленный общий момент старта. Тогда мы можем смотреть, как эта группа ведет себя на первом месяце жизни, на втором, на третьем и так далее. Если этот старт выбран правильно, cohort analysis начинает показывать не просто статистику, а динамику отношений между пользователем и продуктом.

Хабровская retention-матрица по когортам как базовая форма когортного анализа

Базовая формула retention по когорте

Самая важная формула здесь очень проста. Но именно в этой простоте и скрыта сила метода: удержание — это не “настроение графика”, а доля тех, кто остался активным относительно размера исходной когорты.

(Retention_{c,t}=\frac{N_{c,t}}{N_{c,0}})

Раздел математики: математическая статистика и анализ временных рядов по группам.

Что означает каждый символ:

(Retention_{c,t}) — удержание когорты (c) в момент возраста (t).

(N_{c,t}) — число пользователей из когорты (c), которые остались активными на шаге (t).

(N_{c,0}) — размер когорты в момент старта.

(c) — сама когорта, например пользователи одного месяца регистрации.

(t) — возраст когорты, например первый, второй или третий месяц жизни.

Формула появляется из самой природы удержания: нас интересует не абсолютное число активных пользователей, а доля сохранившихся относительно исходного размера группы.

Численный пример: пусть в январской когорте пришло (N_{c,0}=1000) пользователей. Через один месяц активны (N_{c,1}=420). Тогда удержание первого месяца равно (\frac{420}{1000}=0.42), то есть 42 процента. Через два месяца осталось (250), значит удержание второго месяца уже (0.25).

Связь с Machine Learning здесь не декоративная. Cohort retention часто становится downstream target для прогнозирования churn, LTV и product health. Если вы не понимаете, как устроено удержание по когортам, то и модель churn-а вы будете строить на усреднённой смеси разных сценариев.

Именно поэтому материал о том, как строить churn prediction, здесь особенно важен: он показывает, как cohort-логика превращается в более точную оценку риска ухода на уровне конкретного пользователя.

Хабровская heatmap когортной таблицы, которую читают как карту удержания по группам

Почему cohort table читается как карта, а не как просто таблица

Когда cohort analysis строят правильно, получается матрица: по строкам когорты, по столбцам возраст, а в ячейках retention. Эту таблицу нужно читать геометрически. Каждая строка — траектория жизни отдельной группы. Каждый столбец — момент времени, в котором разные группы достигли одинакового возраста. Диагонали в такой матрице часто отражают календарный эффект: сезонность, изменение продукта, сбой трекинга, новый onboarding, рекламную кампанию.

Это очень мощный способ думать. Например, если у нескольких последних когорт резко проседает первый месяц, мы начинаем подозревать проблему acquisition или onboarding. Если во всех когортах одновременно ломается один и тот же возрастной шаг, это уже похоже на продуктовый барьер или изменение сценария использования. То есть cohort table работает как карта напряжений внутри продукта.

В задачах с длинной пользовательской историей это почти неизбежно приводит и к разговору о корректной валидации по времени: отдельный разбор time-based validation помогает понять, почему поведение когорт нельзя проверять так же, как обычные статичные выборки.

Хабровская кривая удержания по шагам жизни когорты и переходам между соседними периодами

Сглаженный взгляд: доля перехода между соседними шагами

Иногда retention относительно стартового размера полезен, но недостаточен. Например, мы хотим понять не просто, сколько людей осталось к третьему месяцу, а насколько болезненным был именно переход от первого ко второму. Для этого полезно смотреть не только cumulative retention, но и step retention.

(StepRetention_{c,t}=\frac{N_{c,t}}{N_{c,t-1}})

Раздел математики: математическая статистика и дискретная динамика.

Что означает каждый символ:

(StepRetention_{c,t}) — удержание между соседними шагами для когорты (c).

(N_{c,t}) — число активных пользователей когорты на шаге (t).

(N_{c,t-1}) — число активных пользователей этой же когорты на предыдущем шаге.

Эта формула нужна, когда важно увидеть локальную потерю между соседними моментами, а не только накопленное сжатие относительно старта.

Численный пример: если в январской когорте на первом месяце осталось (420) пользователей, а на втором — (252), то step retention между первым и вторым месяцем равен (\frac{252}{420}=0.6). Это означает, что 60 процентов тех, кто дожил до первого месяца, дошли и до второго.

Для аналитики это очень полезно, потому что позволяет отличать “естественный общий спад после старта” от конкретных провалов на отдельных стадиях. А для ML это может подсказать, в каком временном окне строить признаки риска оттока.

Геометрический смысл retention-кривой

Если смотреть на retention-кривую геометрически, это не просто нисходящая линия. Это сжатие массы пользователей во времени. Чем резче кривая падает в начале, тем слабее продукт удерживает людей после первого контакта. Чем более пологой она становится дальше, тем устойчивее остаётся “ядро” аудитории. В некоторых продуктах кривая быстро падает и потом стабилизируется. В других идёт почти линейная эрозия. Эти формы несут очень разный смысл.

Поэтому cohort analysis хороша не только как набор процентов, но и как язык формы. Она помогает увидеть, где именно продукт теряет людей: на входе, после первого value moment, после trial, после платёжного шага, после первого месяца или после какого-то конкретного feature gap. Геометрия кривой здесь напрямую связана с поведением системы.

Почему cohort analysis тесно связана с причинным мышлением

Одна из причин, почему cohort analysis так любят сильные продуктовые аналитики, состоит в том, что она приближает нас к честному сравнению. Она не делает причинный вывод автоматически, но она хотя бы не смешивает в одну массу пользователей с разным жизненным возрастом. Это уже огромный шаг к корректной интерпретации.

Если после редизайна onboarding у новых когорт резко улучшился retention первого месяца, это не доказательство причинности в строгом статистическом смысле, но уже очень сильный сигнал гипотезы. Если же общий retention вырос просто потому, что в базе накопилось больше старых лояльных пользователей, cohort analysis как раз помогает не попасть в эту ловушку.

На следующем шаге такая логика почти всегда стыкуется с экспериментами: статья про A/B тесты и ML в продукте хорошо показывает, как отделять реальный эффект изменений от простого сдвига пользовательской структуры.

Где здесь связь с оптимизацией

В Data Science и ML оптимизация почти всегда означает выбор действия, которое улучшает целевую функцию. В продуктовой аналитике cohort analysis часто становится как раз той поверхностью, на которой мы оцениваем, улучшило ли решение реальную динамику удержания. Мы можем менять onboarding, pricing, коммуникации, рекомендации, ranking, push-стратегию или feature gating, а затем смотреть, как изменяются cohort curves.

Если говорить совсем строго, retention по когортам часто становится business metric, относительно которой потом подбираются модели churn prediction, uplift scoring или рекомендательные стратегии. То есть cohort analysis не заменяет оптимизацию, а дает ей правильную систему координат.

Когда cohort analysis особенно полезна в Data Science

Она особенно полезна там, где нам важно понимать долговременную динамику, а не только мгновенную метрику. Это удержание пользователей, платёжные воронки, подписки, игровой engagement, контентные продукты, образовательные платформы, мобильные приложения, SaaS и маркетинговые каналы. Во всех этих задачах cohort analysis помогает увидеть, какие группы действительно приносят долгую ценность, а какие только красиво выглядят на старте.

Для моделей это тоже важно. Например, если разные когорты принципиально различаются по поведению, имеет смысл добавлять cohort age, acquisition month, channel cohort или feature rollout cohort в признаки. Иногда именно это объясняет часть variance, которую модель иначе воспринимала бы как шум.

А если задача уже доходит до оценки денег, cohort analysis очень естественно продолжается в сторону LTV-моделей, потому что именно когорты часто помогают увидеть, какие группы пользователей дают не только лучший retention, но и реальную долгосрочную ценность.

Хабровская диаграмма искажений и ошибок чтения cohort analysis без учета зрелости и размера когорт

Когда cohort analysis легко интерпретировать неправильно

Самая частая ошибка — сравнивать когорты без учета того, что у новых строк ещё не было времени дожить до дальних столбцов. Вторая ошибка — путать retention с абсолютным числом активных пользователей. Третья — использовать нестабильные small cohorts и делать сильные выводы по группам, где размер слишком мал. Четвёртая — забывать, что удержание может зависеть от сезонности, промо-акций, смены продукта или особенностей логирования событий.

Поэтому в историях с длинным горизонтом и редкими событиями полезно держать рядом и более строгие методы проверки на временной оси, например backtesting или даже survival analysis, если ключевой вопрос упирается именно во время до оттока или до конверсии.

Еще одна важная ошибка — смотреть только на проценты и не помнить про denominator. Когорта из 10000 человек с retention 20 процентов и когорта из 80 человек с retention 35 процентов не должны автоматически читаться как “вторая лучше”. Нужен контекст, размер группы и устойчивость результата.

Python: как посчитать cohort retention на практике

import pandas as pd  # Подключаем pandas для работы с таблицами.

df = pd.read_csv("events.csv")  # Загружаем события пользователей.
df["event_date"] = pd.to_datetime(df["event_date"])  # Переводим дату события в datetime.

df["cohort_month"] = df.groupby("user_id")["event_date"].transform("min").dt.to_period("M")  # Для каждого пользователя находим месяц первого события.
df["event_month"] = df["event_date"].dt.to_period("M")  # Переводим каждое событие в месяц активности.

df["cohort_age"] = (df["event_month"] - df["cohort_month"]).apply(lambda x: x.n)  # Считаем возраст когорты в месяцах.

cohort_counts = (  # Начинаем строить таблицу размера активной аудитории по когортам.
    df.groupby(["cohort_month", "cohort_age"])["user_id"]  # Группируем по месяцу когорты и возрасту.
      .nunique()  # Считаем число уникальных активных пользователей.
      .reset_index()  # Возвращаем плоскую таблицу.
)

cohort_pivot = cohort_counts.pivot(index="cohort_month", columns="cohort_age", values="user_id")  # Переводим в cohort table.

cohort_sizes = cohort_pivot[0]  # Размер каждой когорты на нулевом шаге.
retention = cohort_pivot.divide(cohort_sizes, axis=0)  # Делим все значения строки на стартовый размер когорты.

print("Cohort sizes:")  # Печатаем размеры когорт.
print(cohort_sizes)  # Смотрим, насколько группы сопоставимы по масштабу.

print("Retention table:")  # Печатаем итоговую retention-матрицу.
print(retention.round(3))  # Округляем значения для удобства чтения.

Этот пример важен тем, что он показывает правильную логику построения когорты. Мы сначала находим момент первого появления пользователя, затем считаем возраст когорты, потом строим матрицу по строкам и столбцам, а уже потом нормируем относительно исходного размера группы. То есть вся магия cohort analysis на самом деле строится на очень дисциплинированной табличной логике.

Что важно вынести из темы

Cohort analysis — это способ смотреть на retention честно. Она отделяет жизненный цикл группы от календарного шума, помогает видеть различия между каналами, запусками и сегментами и превращает продуктовую динамику в понятную карту поведения. В этом смысле cohort table — не просто отчёт, а инструмент мышления.

Если сформулировать совсем коротко, сильный анализ удержания начинается не с одной общей кривой, а с вопроса: какие именно группы пользователей мы сейчас смешиваем в одно число? Как только этот вопрос задан, cohort analysis почти всегда становится следующим правильным шагом.

Kaggle notebook по теме:

https://www.kaggle.com/code/bryamblasrimac/cohorteanalysis-recencyfrequencymonetary-rfm-eda/notebook

Что читать дальше

Связанные статьи по этой теме

Инструменты Python в 2026 году: современный стек для профессиональной разработки Что должен знать Junior Data Scientist в 2026 году? Как собрать GitHub-портфолио для Data Science
Вернуться в блог