Мира · маркетолог магазина настолок «Кубик»
Сколько клиентов от нас ушло? И кто уходит чаще: те, кто пришёл по промокоду, кто что-то вернул или кому опоздала доставка? Хочу знать, на кого тратить письма с «мы скучаем».
Возвращаемся в «Кубик» и к базе boardshop, где мы делили клиентов на сегменты в уроке про RFM. Там давность последней покупки была одним из трёх баллов. Сегодня из неё вырастает отдельная метрика: отток. Сначала договоримся, кого считать ушедшим, потом посчитаем, потом поищем признаки.
Абонемент и кофейня
У абонемента в спортзал отток считать просто. Абонемент кончился 31 марта, клиент его не продлил, значит, ушёл. Дата ухода записана в договоре.
В кофейне никакого договора нет. Постоянный гость не приходит неделю: заболел? уехал? нашёл кофейню получше? Он не скажет «я ухожу», он просто перестанет приходить. Ушёл он или нет, решаешь ты, и решаешь правилом.
Так и в продуктах. У подписки, вроде «Премиума на месяц» в «Хрониках», ушедший тот, кто не продлил. У магазина с разовыми покупками, как «Кубик», правило звучит так: клиент ушёл, если у него не было заказа N дней. Осталось выбрать N.
Какой N выбрать
Возьми N слишком маленьким, например 30 дней, и запишешь в ушедшие тех, кто покупает раз в два месяца. Возьми год, и узнаешь об уходе клиента, когда возвращать его уже поздно.
N подсказывают сами клиенты: сколько обычно проходит между двумя заказами одного человека. Паузу считаем через lag из урока про LAG и LEAD, отменённые заказы не считаем: отмена не покупка.
WITH o AS (
SELECT customer_id, created_at,
lag(created_at) OVER (PARTITION BY customer_id ORDER BY created_at) AS prev_at
FROM orders
WHERE status <> 'cancelled'
), gaps AS (
SELECT extract(epoch FROM created_at - prev_at) / 86400 AS days
FROM o
WHERE prev_at IS NOT NULL
)
SELECT count(*) AS pauses,
round(percentile_cont(0.5) WITHIN GROUP (ORDER BY days)::numeric, 1) AS p50,
round(percentile_cont(0.9) WITHIN GROUP (ORDER BY days)::numeric, 1) AS p90,
round(percentile_cont(0.95) WITHIN GROUP (ORDER BY days)::numeric, 1) AS p95
FROM gaps;
pauses | p50 | p90 | p95
--------+------+-------+-------
3251 | 50.1 | 134.0 | 168.5
Медиана паузы 50 дней: типичный клиент «Кубика» покупает раз в полтора-два месяца. А 90-й перцентиль 134 дня: 90% повторных заказов приходят не позже. Если клиент молчит дольше, он уже в хвосте, куда попадает только каждая десятая пауза. Берём N = 135 дней.
Почему перцентиль, а не средняя? Средняя пауза 65 дней, её тянут вверх редкие длинные перерывы, а нам нужна граница хвоста, а не центр. Почему 90-й, а не 99-й? Это выбор между двумя ошибками. Чем выше перцентиль, тем реже ошибочно хоронишь живого клиента и тем позже замечаешь реальный уход. 90-й обычный компромисс. Сколько стоит этот выбор, видно по данным: из 1843 клиентов, которые хоть раз молчали дольше 135 дней, 306, то есть 16,6%, потом всё-таки вернулись.
Отток на сегодня
Применим правило к последнему дню данных, 30 июня 2026. Клиент ушёл, если его последний неотменённый заказ раньше 16 февраля, то есть больше 135 дней назад. Таких 1630 из 2940 покупателей, 55,4%.
Но у этого числа кривой знаменатель. 656 клиентов сделали первый заказ меньше 135 дней назад: по нашему правилу они не могли уйти, даже если больше никогда не вернутся. Это правое цензурирование: конец данных обрезал их историю. Среди тех, у кого было время уйти, ушли 71,4%.
И это число нельзя сравнивать между годами или каналами. Клиент 2025 года прожил с нами дольше и успел уйти с большей вероятностью, чем клиент 2026 года. Для сравнения нужно одинаковое окно для всех.
урок из курса
Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.