RFM-анализ — сегментация клиентов для аналитика
Что такое RFM-анализ
RFM-анализ — метод сегментации клиентов по трём измерениям: как давно человек покупал (Recency), как часто (Frequency) и на какую сумму (Monetary). Каждому клиенту присваивают балл по каждому измерению, а затем группируют в сегменты.
Метод появился в директ-маркетинге в 1990-х — задолго до ML и предиктивных моделей. Его сила в простоте: не нужны ни обучающая выборка, ни feature engineering. Достаточно таблицы заказов — и через один SQL-запрос вы получаете полную сегментацию клиентской базы.
На собеседованиях аналитиков RFM спрашивают регулярно — особенно в e-commerce, маркетинге и продуктовой аналитике. Просят объяснить принцип, написать SQL и предложить действия для каждого сегмента.
Три измерения
Recency — сколько дней прошло с последней покупки. Чем меньше — тем лучше. Клиент, купивший вчера, с большей вероятностью купит снова, чем тот, кто пропал полгода назад.
Frequency — сколько покупок сделал клиент за период. Высокая частота означает привычку и лояльность. Это ключевой индикатор удержания — подробнее о связи частоты и удержания в статье про retention.
Monetary — сумма покупок за период. Показывает ценность клиента в деньгах. Связана с LTV, но в RFM мы смотрим на конкретный временной отрезок, а не на всю историю.
Как считать баллы: квинтили
Каждое измерение разбивают на 5 групп (квинтили) — от 1 до 5. Используют функцию NTILE(5):
- Recency: 5 = купил совсем недавно, 1 = давно не покупал (инвертированная логика — меньше дней = выше балл).
- Frequency: 5 = покупает чаще всех, 1 = одна покупка.
- Monetary: 5 = тратит больше всех, 1 = минимальная сумма.
Каждый клиент получает трёхзначный код: например, 555 — лучший клиент, 111 — худший. Всего 125 комбинаций, которые затем группируют в 5–10 бизнес-сегментов.
SQL: полный расчёт RFM
WITH rfm_raw AS (
SELECT
user_id,
CURRENT_DATE - MAX(order_date)::DATE AS recency_days,
COUNT(DISTINCT order_id) AS frequency,
SUM(amount) AS monetary
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY user_id
),
rfm_scores AS (
SELECT
user_id,
recency_days,
frequency,
monetary,
NTILE(5) OVER (ORDER BY recency_days DESC) AS r_score,
NTILE(5) OVER (ORDER BY frequency ASC) AS f_score,
NTILE(5) OVER (ORDER BY monetary ASC) AS m_score
FROM rfm_raw
)
SELECT
user_id,
r_score,
f_score,
m_score,
r_score * 100 + f_score * 10 + m_score AS rfm_code,
CASE
WHEN r_score >= 4 AND f_score >= 4 AND m_score >= 4 THEN 'Champions'
WHEN r_score >= 4 AND f_score >= 3 THEN 'Loyal'
WHEN r_score >= 4 AND f_score <= 2 THEN 'New Customers'
WHEN r_score = 3 AND f_score >= 3 THEN 'Potential Loyalists'
WHEN r_score <= 2 AND f_score >= 3 AND m_score >= 3 THEN 'At Risk'
WHEN r_score <= 2 AND f_score >= 4 THEN 'Cant Lose Them'
WHEN r_score <= 2 AND f_score <= 2 THEN 'Lost'
ELSE 'Need Attention'
END AS segment
FROM rfm_scores
ORDER BY rfm_code DESCОбратите внимание: recency_days сортируется по убыванию (DESC), потому что меньше дней = лучше = выше балл. Frequency и Monetary — по возрастанию (ASC).
Типичные сегменты и что с ними делать
| Сегмент | R | F | M | Действие |
|---|---|---|---|---|
| Champions | 5 | 5 | 5 | Программа лояльности, ранний доступ к новинкам, реферальная программа |
| Loyal | 4–5 | 3–4 | 3–5 | Upsell, кросс-продажи, персональные рекомендации |
| New Customers | 4–5 | 1–2 | 1–3 | Онбординг, welcome-цепочка, образовательный контент |
| Potential Loyalists | 3 | 3–4 | 3–4 | Стимулировать повторные покупки, программа накопительных скидок |
| At Risk | 1–2 | 3–4 | 3–5 | Реактивация: скидка, напоминание, персональное предложение |
| Can't Lose Them | 1–2 | 4–5 | 4–5 | Высший приоритет реактивации: звонок, эксклюзивное предложение |
| Lost | 1–2 | 1–2 | 1–2 | Минимальные расходы: общая рассылка или исключение из активных кампаний |
Сегментация через RFM — хороший базовый уровень. Для более точного понимания ценности клиента комбинируйте RFM с когортным анализом и расчётом LTV.
Визуализация RFM
Классический способ — тепловая карта (heatmap): по одной оси R-score, по другой — F-score, цвет ячейки — средний Monetary или размер сегмента. Это позволяет быстро увидеть, где сосредоточены клиенты и какие зоны «горячие».
Альтернативы: treemap (площадь пропорциональна выручке сегмента) и столбчатая диаграмма с разбивкой по сегментам.
Типичные ошибки
Равный вес всех измерений. По умолчанию R, F и M считаются одинаково важными. В реальности это не так: для подписочного сервиса Recency критичнее Monetary, для luxury-ритейла — наоборот. Подбирайте веса под бизнес-контекст.
Игнорирование специфики бизнеса. Квинтили распределяют клиентов равномерно — по 20% в каждую группу. Но если 80% клиентов сделали одну покупку, разделение Frequency на 5 групп бессмысленно. Проверяйте распределение перед нарезкой.
Статичная модель. RFM-сегменты меняются со временем. Клиент-чемпион через 6 месяцев без покупок уйдёт в «At Risk». Пересчитывайте RFM регулярно — раз в неделю или месяц.
Отсутствие действий. Сегментация без маркетинговых кампаний — бесполезное упражнение. Каждый сегмент должен быть привязан к конкретному действию.
Вопросы с собеседований
Что такое RFM-анализ и зачем он нужен?
RFM — метод сегментации клиентов по трём параметрам: давность последней покупки, частота покупок и сумма. Позволяет без ML разделить базу на группы и настроить маркетинг под каждую. Прост в реализации, интерпретируем и работает с минимальными данными — достаточно таблицы транзакций.
Как бы вы рассчитали RFM в SQL?
Агрегирую данные по user_id: recency = разница между текущей датой и MAX(order_date), frequency = COUNT(DISTINCT order_id), monetary = SUM(amount). Затем через NTILE(5) разбиваю каждое измерение на квинтили. Для recency сортировка инвертирована — меньше дней = выше балл. Итого каждый клиент получает трёхзначный RFM-код.
У вас есть сегмент At Risk с высоким Monetary. Что предложите?
Это ценные клиенты, которые давно не покупали. Приоритет — реактивация. Варианты: персональная скидка, напоминание о незавершённом заказе, email с новинками в их категории. Важно действовать быстро — чем дольше без покупки, тем ниже вероятность возврата. Отслеживать эффективность через retention после кампании.
Почему NTILE может дать неточные результаты?
NTILE делит строки на группы равного размера. Если у многих клиентов одинаковое значение (например, 1 покупка), они попадут в разные квинтили случайно. Альтернатива — ручные пороги или PERCENT_RANK с кастомными границами.
Чем RFM отличается от кластеризации (k-means)?
RFM — детерминированный метод с фиксированной логикой: три измерения, квинтили, ручные правила сегментации. K-means — алгоритм ML, который сам находит кластеры в данных. RFM проще, интерпретируемее и не требует ML-пайплайна. K-means гибче, может учитывать больше признаков и находить неочевидные паттерны. На практике часто начинают с RFM, а потом переходят к ML.
Хотите потренировать вопросы по продуктовой аналитике и сегментации на практике? Мы собрали 1500+ вопросов с реальных собеседований — откройте тренажёр.
FAQ
Сколько сегментов выделять в RFM?
Стандартный подход — 5–10 сегментов. 125 комбинаций (5 × 5 × 5) слишком детальны для принятия решений. Группируйте похожие комбинации в бизнес-сегменты: Champions, Loyal, New, At Risk, Lost и т.д. Количество зависит от размера базы и ресурсов маркетинга — если некому работать с 10 сегментами, лучше 5.
Можно ли использовать RFM без Monetary?
Да. RF-анализ (без Monetary) подходит для продуктов, где нет прямых платежей или суммы покупок одинаковы (подписка с фиксированной ценой). В этом случае Recency и Frequency достаточно для сегментации по вовлечённости.
Как часто нужно пересчитывать RFM?
Зависит от частоты покупок. Для ежедневных товаров (еда, такси) — раз в неделю. Для e-commerce — раз в месяц. Для luxury или B2B с длинным циклом — раз в квартал. Главное — привязать пересчёт к маркетинговым циклам, чтобы сегменты были актуальны к моменту запуска кампании.
Как RFM связан с LTV?
RFM сегментирует клиентов по текущему поведению, LTV оценивает суммарную ценность за всё время. Champions в RFM обычно имеют высокий LTV, Lost — низкий. RFM полезен для тактических решений (какую кампанию запустить сейчас), LTV — для стратегических (сколько инвестировать в привлечение).