Получить доступ

Как посчитать когортный retention на SQL?

MiddleSQL для аналитикаSQL
Ещё спрашивают так:
  • Как построить когортную таблицу удержания?
Коротко

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

  • Размер когорты — число пользователей в периоде 0
  • Период считают от даты первого действия, а не от календарных границ (или явно оговаривают)
  • Последние когорты ещё «не доросли» — их правые ячейки пустые, а не нулевые

А ещё Для N-day retention — день активности относительно дня регистрации

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Зачем когорты. Общий DAU растёт вместе с притоком новых пользователей и маскирует то, что люди уходят. Когортная таблица показывает, как долго остаются пользователи, пришедшие в разное время, — видно влияние изменений продукта на свежие когорты.

Решения, которые нужно оговорить:

  • что считается активностью (любое событие или ключевое действие);
  • календарные недели или окна от даты регистрации;
  • классический (активен именно в периоде N) или rolling (активен в периоде N или позже) retention;
  • часовой пояс для границ дней.

Чтение таблицы: по строке — как когорта затухает; по диагонали — эффект календарных событий (праздники, сбой) на все когорты сразу; по столбцу — стали ли новые когорты удерживаться лучше.

Пример

WITH first_seen AS (
  SELECT user_id, DATE_TRUNC('week', MIN(event_time)) AS cohort
  FROM events GROUP BY user_id
),
activity AS (
  SELECT DISTINCT e.user_id, f.cohort,
         (DATE_TRUNC('week', e.event_time)::date - f.cohort::date) / 7 AS week_no
  FROM events e JOIN first_seen f USING (user_id)
),
sizes AS (
  SELECT cohort, COUNT(*) AS cohort_size FROM first_seen GROUP BY cohort
)
SELECT a.cohort, a.week_no,
       COUNT(*) AS active,
       ROUND(100.0 * COUNT(*) / s.cohort_size, 1) AS retention_pct
FROM activity a JOIN sizes s USING (cohort)
GROUP BY a.cohort, a.week_no, s.cohort_size
ORDER BY a.cohort, a.week_no;

Что хотят услышать

  • Шаги: когорта, номер периода, активные, деление на размер.
  • Какие определения нужно согласовать.
  • Как читать когортную таблицу.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем