Урок 24 · 10 мин чтения

Удержание и когортный анализ

Сколько клиентов остаётся с нами спустя месяц, два, три после первой покупки. Когортная матрица удержания на DAX.

«Новые и вернувшиеся» (прошлый урок) отвечают, кто пришёл. Следующий вопрос — кто остался. Привлекли 100 клиентов в январе: сколько из них покупали в феврале, марте, апреле? Это удержание (retention), а инструмент для него — когортный анализ. Разбираем по мотивам DAX Patterns SQLBI и когортных приёмов.

На каком примере

Как и в прошлом уроке: в учебном наборе нет клиентов, поэтому пример — на типовой рознице. Факт Продажи с КодКлиента, справочник Клиенты, помеченный Календарь со столбцом ГодМесяц (урок про календарь).

Что такое когорта

Когорта — группа клиентов, объединённая моментом входа: все, кто впервые купил в одном и том же месяце. Январская когорта, февральская и т.д. Дальше мы следим за каждой когортой во времени: какая доля её клиентов остаётся активной через 1, 2, 3 месяца.

Когорта = месяц первой покупки

В основе всего — та же «первая покупка за всю историю», что и в паттерне новых клиентов. Только теперь мы не считаем новых, а навешиваем на клиента ярлык когорты (месяц его первой покупки) и прослеживаем когорту во времени. Один ярлык на клиента, заданный навсегда.

Шаг 1. Ярлык когорты на клиента

Заводим расчётный столбец в Клиенты — месяц первой покупки:

КогортаМесяц =                       -- расчётный столбец в Клиенты
VAR _Первая = CALCULATE ( MIN ( Продажи[Дата] ) )
RETURN FORMAT ( _Первая, "YYYY-MM" )

CALCULATE ( MIN ( Продажи[Дата] ) ) в столбце таблицы Клиенты срабатывает через переход контекста (урок из базового курса): строка клиента превращается в фильтр, и MIN берёт дату его самого первого заказа. FORMAT(..., "YYYY-MM") сворачивает её до месяца.

Шаг 2. Размер когорты и активные

Две меры — знаменатель и числитель удержания:

Размер когорты =
CALCULATE ( DISTINCTCOUNT ( Клиенты[КодКлиента] ), ALL ( Календарь ) )

Активны в месяце =
DISTINCTCOUNT ( Продажи[КодКлиента] )
  • Размер когорты — сколько всего клиентов в когорте. ALL(Календарь) снимает фильтр даты: размер когорты не зависит от того, какой месяц мы рассматриваем (когорта фиксирована).
  • Активны в месяце — сколько уникальных клиентов покупали в текущем месяце контекста.

Шаг 3. Мера удержания

Удержание % =
DIVIDE ( [Активны в месяце], [Размер когорты] )

Теперь строим матрицу: в строки — Клиенты[КогортаМесяц] (когорта), в столбцы — Календарь[ГодМесяц] (календарный месяц), значение — [Удержание %].

На пересечении «январская когорта × март» мера посчитает: сколько клиентов январской когорты покупали в марте, делёное на размер январской когорты. По диагонали (месяц = месяц когорты) всегда 100% — все только что пришли; вправо от неё доля обычно падает — это и есть кривая удержания.

Почему получается «лесенка»

Когорта фильтрует клиентов (по месяцу первой покупки), а календарь фильтрует продажи (в каком месяце была активность). Их пересечение в ячейке и даёт «сколько из пришедших тогда покупали теперь». Размер когорты в знаменателе берётся без фильтра даты — поэтому доля корректно считается от исходного размера, а не от текущего месяца.

Смещение вместо календаря (refinement)

В классической когортной матрице по столбцам ставят не календарный месяц, а номер периода с момента входа: 0-й месяц, 1-й, 2-й… Тогда все когорты выравниваются по левому краю и кривые удержания сравнимы напрямую. Это делают через несвязанную таблицу «смещение» (как в what-if): мера считает активность в КогортаМесяц + смещение. Логика та же, добавляется лишь арифметика по месяцам.

Тонкости

  • Производительность. Ярлык когорты — расчётный столбец (считается раз при обновлении), а не мера: перебирать первую покупку в каждой ячейке матрицы было бы дорого.
  • Гранулярность. Месячные когорты — самые частые; бывают недельные и квартальные. Решается выбором формата ГодМесяц.
  • Что считать «активностью». Здесь — факт покупки в месяце. Для подписок активностью может быть «действует подписка» (это уже semi-additive логика, следующий урок).
Удержание считают от размера когорты, а не от прошлого месяца

Частая ошибка — делить активных этого месяца на активных прошлого. Это даёт «месяц-к-месяцу», а не удержание когорты. Классическое удержание — всегда доля от исходного размера когорты (сколько вошло), иначе кривые разных когорт несравнимы и теряется смысл «сколько из пришедших осталось».

Что дальше

Клиентские паттерны — приток, возврат, удержание — закрыты. Дальше возвращаемся к мерам, которые нельзя суммировать по времени: semi-additive остатки. Следующий урок.

От чего считается процент удержания когорты?
Удержание — это доля клиентов когорты, оставшихся активными спустя N месяцев, относительно её исходного размера (числа вошедших). Деление на прошлый месяц даёт другую метрику (месяц-к-месяцу) и делает когорты несравнимыми. Размер когорты берут без фильтра даты — ALL(Календарь).
Прогресс сохраняется в вашем браузере.
§ Power BI под ключ

Нужно внедрить
это в компании?

Соберём DWH, модель и дашборды под ваши данные. Бесплатная консультация — 30 минут.

Телефон+7 918 042 34 43