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 — для стратегических (сколько инвестировать в привлечение).