Когортный анализ в Яндекс.Метрике: что это такое и какими способами можно выполнить
Когортный анализ — это вид анализа, в котором пользователи разбиваются на группы (когорты), а затем их поведение сравнивается с течением времени.
Пользователи объединяются в когорты по общему признаку или событию, чаще всего связанному с определённым моментом времени: датой первого визита, покупки или регистрации. Дополнительно когорты могут сегментироваться по характеристикам пользователей, источникам привлечения или поведению на сайте.
Когортный анализ позволяет дать ответы на подобные вопросы: какой процент пользователей совершает покупку после первого визита на первой неделе, а какой — на второй? Какая доля пользователей продолжает посещать сайт спустя 4 недели после первого визита? Пользователи из какого источника чаще возвращаются на сайт спустя месяц после первого визита?
С чего начать когортный анализ? Для начала необходимо определить событие или показатель, который мы хотим анализировать, принцип формирования когорт и временной шаг наблюдения — день, неделю или месяц.
Далее рассмотрим два способа выполнения когортного анализа на данных Яндекс Метрики. До лета 2026 года когортный анализ в Яндекс Метрике можно было выполнить либо через выгрузку сырых данных Logs API, либо через манипуляции с группировками дат первых визитов и дат визитов в интерфейсе, что неэффективно и времязатратно. На данный момент Яндекс Метрика получила обновление набора отчётов, и среди них появилась возможность составлять Retention-отчёты и когортный анализ. Мы рассмотрим в данной статье, как и в каком случае мы можем решить поставленные перед нами задачи, непосредственно используя новый функционал Метрики, а в каком случае задача нетривиальна и необходимо использовать выгрузку сырых данных Logs API.
Кейс 1. Необходимо было оценить удержание (Retention) пользователей, у которых первым источником трафика была рекламная система Яндекс Директ, с разбивкой пользователей на когорты по неделя.
Ранее для построения этого отчёта мы использовали выгрузку сырых данных и преобразовывали данные через Python-библиотеку pandas. Сейчас же это можно сделать напрямую в интерфейсе Метрики.
- Заходим в раздел с новыми отчетами:
Оценивать мы будем удержание (1) пользователей. Интерфейс позволяет рассчитывать и выбирать между Retention и Rolling Retention.
Это два разных способа расчёта удержания. Понять их разницу можно на конкретном примере. Предположим, что пользователь совершил визиты в 0-й, 2-й и 5-й дни. В Retention активность пользователя засчитывается только в 0-й, 2-й и 5-й дни. При Rolling Retention пользователь учитывается как удержанный с 0-го по 5-й день, поскольку на 5-й день он всё ещё возвращался на сайт.
Далее необходимо выбрать рассчитываемую метрику (2). На данный момент Метрика позволяет проводить расчёт следующих метрик, а также метрик по целям на счётчике и доходу по этим целям.
Группировка (3) позволяет задать, каким образом мы определяем нашу когорту. Доступны разбивки по дате, источнику и параметрам аудитории.
Последняя настройка (4) позволяет выбрать временной шаг, который мы анализируем: по дням, неделям или месяцам.
Для нашей конкретной задачи мы должны добавить условие — анализ пользователей с первым визитом из Яндекс Директа. Для этого используем стандартные для всех отчётов Метрики фильтры.
Добавляем фильтр из раздела «Люди» и условие «Источники > Рекламная система = Яндекс: Директ». Для нашей задачи важным условием является выбор условия, что это первый переход пользователя. Не забываем применить фильтры!
Финальный график показывает, что на протяжении первых семи недель Retention пользователей, впервые привлечённых через Яндекс Директ, выше Retention общей аудитории сайта.
Кейс 2. Во втором кейсе требовалось определить, как распределяется время от первого визита из определённой рекламной кампании до первой покупки пользователя. Возможностей стандартного когортного отчёта для решения этой задачи оказалось недостаточно, поэтому воспользуемся сырыми данными Logs API.
Выгружать будем данные по визитам. Минимальным набором полей из документации API для данной задачи будет следующий:
- ym:s:date — дата визита. Необходима для определения даты первого визита и первой конверсии.
- ym:s:visitID — ID визита.
- ym:s:counterUserIDHash — идентификатор посетителя (в рамках одного браузера), с помощью которого производится подсчёт уникальных посетителей сайта в интерфейсе Метрики. Мы рекомендуем использовать его для определения пользователя, а не ym:s:clientID.
- Поле, по которому мы будем определять факт интересующей нас конверсии. В нашем случае это ym:s:goalsID, из которого мы будем извлекать интересующий номер цели.
- Поле, по которому мы планируем фильтровать данные визитов. Так как мы будем смотреть пользователей только с первым визитом из определённой РК, мы выгружаем ym:s:isNewUser для определения новизны и ym:s:<attribution>UTMCampaign для определения источника визита. Атрибуцию мы будем использовать cross_device_last_significant, так как нам важен не только сам факт покупки после просмотра рекламы, но и отслеживание интересующей атрибуции.
- Для дополнительной чистоты данных мы также выгрузили поле ym:s:isRobotPro — для фильтрации роботных визитов по данным антифрода Директа и поведению на сайте. Учитывайте, что выгрузка ym:s:isRobotPro доступна только для счётчиков с Метрикой Про, а данные в поле актуальны с 19 апреля 2025 года.
После выгрузки данных за интересующий нас период приступаем к их обработке. Для удобства приведём данные к структуре, в которой каждому пользователю соответствует одна строка, содержащая ID пользователя, дату первого визита, дату первой покупки и разницу между ними в днях.
Сначала формируем список пользователей, удовлетворяющих трём условиям: isNewUser = 1, UTMCampaign = "Наша РК" и isRobotPro ≠ 1. После этого оставляем в исходной выгрузке все визиты найденных counterUserIDHash. Таким образом, рекламная кампания используется только для определения исходной аудитории, а дальнейшее поведение этих пользователей отслеживается независимо от источника последующих визитов.
Для каждого визита создаём признак isGoal, принимающий значение 1 при наличии интересующей цели в ym:s:goalsID и 0 - при её отсутствии. После этого для каждого пользователя определяем дату первого визита и минимальную дату визита с isGoal = 1 - дату первой конверсии.
Для каждого пользователя определяем дату первого визита, а среди визитов с isGoal = 1 - дату первой конверсии. После этого данные агрегируются до уровня пользователя: каждому counterUserIDHash соответствует одна строка с датой первого визита и первой покупки.
Рассчитываем количество дней между первым визитом и первой покупкой — искомое время до конверсии. Для визуализации результата формируем сводную таблицу: строки соответствуют когортам по дате первого визита, столбцы — количеству дней до первой покупки, а значения показывают долю пользователей, впервые совершивших покупку в соответствующий день, от общего размера когорты.
В результате получаем распределение, позволяющее одновременно сравнивать когорты между собой и оценивать, как быстро после первого привлечения пользователи совершают первую покупку.
Средствами визуализации из сводной таблицы мы получили вот такой график.
Подведем итог:
Яндекс Метрика предоставляет возможность провести когортный анализ разными способами, так, например, если нет необходимости вычислять время от действия до действия или как-то очень индивидуально определять когорту, то когортный анализ можно провести через интерфейс Яндекс Метрики. То есть если задача укладывается в возможности стандартных отчётов Метрики, то новый функционал появившийся летом 2026 позволяет получить результат непосредственно в интерфейсе и значительно сократить объём подготовки данных.
При этом помните, что у вас все еще есть возможность использовать сырые данные из Logs API. Он становится необходим в тех случаях, когда требуется нестандартная логика формирования когорт или расчёта показателей. Работа с сырыми данными требует дополнительной обработки, но позволяет самостоятельно определить состав когорт, условия конверсии и логику расчёта метрик под конкретную аналитическую задачу.