Панды анализируют и очищают данные продаж с помощью графиков и pandas.

EDA в открытом доступе (Часть 3): RFM-анализ для сегментации клиентов в Pandas

Содержание

Как шаг за шагом создавать, оценивать и интерпретировать сегменты RFM.

Делиться

Исследовательский анализ данных с использованием Pandas

Снова здравствуйте! Если вы следили за нашими обновлениями, то знаете, что мы прошли долгий путь. В первой части мы проделали «грязную работу» по уборке и подготовке.

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

Но вот в чем дело: бизнес на самом деле продает не «месяцам» или «странам». Он продает людям .

Если вы относитесь ко всем клиентам одинаково, вы совершаете две очень дорогостоящие ошибки:

  • Чрезмерная скидка: выдача купона на «20% скидки» тому, кто и так уже собирался достать кошелек.
  • Игнорирование «тихих» клиентов: Неспособность заметить, когда ранее лояльный клиент перестает посещать заведение, пока не пройдет полгода, и не станет слишком поздно вернуть его.

Решение? Поведенческая сегментация.

Вместо того чтобы гадать, мы будем использовать данные, чтобы клиенты сами рассказали нам, кто они. Мы делаем это, используя золотой стандарт розничной аналитики: RFM-анализ .

  • Актуальность (R): Как давно они совершили покупку? (Они по-прежнему взаимодействуют с нами?)
  • Частота (F): Как часто они совершают покупки? (Они лояльны или это был разовый случай?)
  • Денежные затраты (М): Сколько они тратят? (Каково их общее влияние на бизнес?)

К концу этой части мы выйдем за рамки «Топ-10 товаров» и фактически присвоим каждому клиенту в базе данных NovaShop конкретную, действенную метку .

Подготовка данных: сводная таблица «Отсутствующие идентификаторы»

Прежде чем начать подсчет очков, нам необходимо рассмотреть решение, принятое нами еще в первой части.

Если вы помните нашу первоначальную проверку , мы заметили, что примерно в 25% строк отсутствовал CustomerID. Тогда мы приняли стратегическое бизнес-решение сохранить эти строки. Они были необходимы для точного расчета общей выручки и определения наиболее популярных товаров.

В RFM-анализе правила меняются. Невозможно отслеживать поведение без четко определенной личности. Мы не можем знать, насколько «часто» посещает наш сайт клиент, если не знаем, кто он!

Итак, наш первый шаг в Части 3 — выделить нашу «отслеживаемую вселенную», отфильтровав строки, в которых присутствует CustomerID.

Разработка метрик RFM

Теперь, когда у нас есть набор данных, где каждая строка связана с конкретным человеком, нам необходимо объединить все его индивидуальные транзакции в три сводных показателя: давность, частота и денежная сумма.

Определение даты создания снимка

Перед расчетом RFM нам необходима точка отсчета во времени , обычно называемая датой снимка.

Здесь мы берем самую последнюю дату транзакции в наборе данных и добавляем один день. Эта дата отражает момент, на который мы оцениваем поведение клиентов.

snapshot_date = df['InvoiceDate'].max() + dt.timedelta(days=1)

Мы добавили один день, поэтому у клиентов, совершивших покупку в последнюю дату, значение «Дата покупки» по-прежнему равно 1 дню, а не 0. Это делает показатель интуитивно понятным и позволяет избежать проблем, связанных с частными случаями.

Агрегирование транзакций на уровне клиента.

rfm = df.groupby('CustomerID').agg({ 'InvoiceDate': lambda x: (snapshot_date — x.max()).days, 'InvoiceNo': 'nunique', 'Revenue': 'sum' })

Каждая строка в нашем наборе данных представляет собой отдельную транзакцию. Для расчета RFM нам необходимо объединить эти транзакции в одну строку для каждого клиента .

Мы делаем это, группируя данные по CustomerID и применяя различные функции агрегирования:

  • Актуальность : Для каждого клиента мы определяем дату его последней покупки и вычисляем, сколько дней прошло с тех пор.
  • Частота: Мы подсчитываем количество уникальных счетов-фактур, связанных с каждым клиентом. Это показывает, как часто они совершали покупки.
  • Денежная сумма : Мы суммируем общий доход, полученный каждым клиентом по всем транзакциям.

Переименование столбцов для большей ясности.

rfm.rename(columns={ 'InvoiceDate': 'Recency', 'InvoiceNo': 'Frequency', 'Revenue': 'Monetary' }, inplace=True)py

На этапе агрегирования сохраняются исходные названия столбцов, что может вызывать путаницу. Переименование делает фрейм данных сразу читаемым и приводит его в соответствие со стандартной терминологией RFM.

Теперь каждая колонка четко отвечает на деловой вопрос:

  • Актуальность → Как давно клиент совершил покупку?
  • Частота → Как часто они совершают покупки?
  • Денежная → Какую выручку они приносят?

Проверка результата

print(rfm.head())

Итоговый фрейм данных rfm содержит по одной строке на каждого клиента , с тремя интуитивно понятными показателями, суммирующими его поведение.

Выход:

8c62680423e2089f2fb622f2ce24f423

Давайте обсудим это так же, как если бы мы вели реальный разговор с NovaShop.

«Когда этот покупатель в последний раз совершал у нас покупку?»

Именно на это и отвечает компания Recency .

Возьмем клиента 12347 :

  • Актуальность = 2
  • Перевод: «Этот покупатель совершил покупку всего два дня назад».

Они помнят бренд. Они по-прежнему заинтересованы.

Теперь сравним это с клиентом 12346 :

  • Актуальность = 326
  • Перевод: «Они ничего не покупали почти год».

Несмотря на то, что этот клиент раньше много тратил, сейчас он молчит.

С точки зрения NovaShop: новизна показывает, кто еще прислушивается к нам, а кому, возможно, нужен толчок (или «пробуждение»).

«Это покупатель, который приобрел недвижимость один раз, или тот, кто возвращается сюда снова и снова?»

Вот тут-то и вступает в дело Frequency .

Взгляните еще раз на клиента 12347 :

  • Частота = 7
  • Они покупали не один раз — они возвращались снова и снова.

Теперь взгляните на несколько других примеров:

  • Частота = 1
  • Одна покупка, и всё.

С точки зрения бизнеса, частота покупок отличает случайных покупателей от постоянных клиентов.

«Кто же на самом деле зарабатывает деньги?»

Это рубрика «Денежно-кредитная политика ».
И вот тут начинается самое интересное.

Клиент 12346 :

  • Денежная сумма = 77 183,60 фунтов стерлингов
  • Частота = 1
  • Актуальность = 326

Это рассказывает очень конкретную историю:

Один-единственный, очень крупный заказ… давным-давно… и с тех пор ничего.

Теперь сравним это с клиентом 12347 :

  • Снижение общих расходов
  • Множественные покупки
  • Совсем недавняя активность

Важный вывод для NovaShop: «ценный» клиент в прошлом не обязательно является ценным клиентом сегодня.

Почему эта точка зрения меняет ход дискуссии

Если бы NovaShop ориентировалась только на общую выручку, она могла бы сосредоточить все свое внимание на таких клиентах, как 12346 .

Но RFM показывает нам следующее:

  • Некоторые клиенты однажды потратили много денег и исчезли.
  • Некоторые тратят меньше, но остаются верными.
  • Некоторые из них активны прямо сейчас и готовы к участию.

Эти данные помогают NovaShop перестать гадать и начать расставлять приоритеты:

  • Кому следует отправлять письма с напоминаниями о сохранении аккаунта?
  • Кому нужны кампании по повторной активации?
  • Кто уже проявил лояльность и заслуживает вознаграждения?

На данный момент это всего лишь абсолютные цифры.

На следующем этапе мы ранжируем и оцениваем этих клиентов, чтобы NovaShop не приходилось вручную интерпретировать строки. Вместо этого они будут видеть четкие сегменты, такие как:

  • Чемпионы
  • Постоянные клиенты
  • Группа риска
  • Потерянный

Именно здесь это становится настоящим инструментом принятия решений, а не просто фреймом данных.

Превращение RFM-данных в значимые сегменты клиентов

На данном этапе у NovaShop есть таблица, полная цифр. Полезно, но не совсем удобно для принятия решения.

В реальности маркетинговая команда не может просто просмотреть сотни или тысячи строк с вопросом:

  • Хорошо это или плохо, если показатель «недавно — 19»?
  • Впечатляет ли показатель Frequency = 2?
  • Насколько высока денежная стоимость?

Наша цель — ранжировать клиентов относительно друг друга и преобразовать исходные значения в баллы.

Шаг 1: Ранжирование клиентов по каждому показателю RFM.

Вместо того чтобы рассматривать показатели давности, частоты и денежного обращения как абсолютные значения, мы анализируем положение каждого клиента по сравнению со всеми остальными .

  • Клиенты, совершившие покупки относительно недавно, должны получить более высокий балл.
  • Клиенты, которые совершают покупки чаще, должны получать более высокие баллы.
  • Клиенты, которые тратят больше, должны получать более высокие баллы.

На практике мы делаем это, разделяя каждый показатель на квантили (обычно 4 или 5 групп).

Однако есть один небольшой нюанс, который проявляется в реальных условиях. С этим я столкнулся во время работы над этим проектом.

В транзакционных наборах данных часто можно увидеть следующее:

  • Много клиентов с одинаковой частотой посещений (например, разовые покупатели)
  • Сильно искаженные денежные значения
  • Небольшие выборки, где квантильное разбиение может оказаться неэффективным.

Для обеспечения надежности и читаемости кода мы обернем логику подсчета баллов в небольшую вспомогательную функцию.

def rfm_score(series, ascending=True, n_bins=5): # Ранжируем значения для обеспечения уникальности ranked = series.rank(method='first', ascending=ascending) # Используем pd.qcut для рангов, чтобы назначить интервалы return pd.qcut( ranked, q=n_bins, labels=range(1, n_bins+1) ).astype(int)

Чтобы объяснить, что здесь происходит:

  • Мы создаём вспомогательную функцию, которая преобразует необработанный числовой столбец в корректный RFM-балл с использованием квантильного биннинга.
  • Сначала значения ранжируются. Таким образом, вместо того, чтобы напрямую группировать исходные значения, мы ранжируем их в первую очередь. Этот шаг гарантирует уникальный порядок , даже если у многих клиентов одинаковое значение (распространенная проблема в данных RFM).
  • Флаг возрастания позволяет изменять логику в зависимости от показателя — например, чем ниже давность, тем лучше, а чем выше частота и денежная стоимость.
  • Далее мы применяем квантильное разбиение на группы. Функция qcut разбивает ранжированные значения на n_bins равных по размеру групп. Каждому клиенту присваивается оценка от 1 до 5 (по умолчанию), где оценка отражает его относительное положение в распределении.
  • В заключение, результаты будут преобразованы в целые числа для удобства использования в анализе и сегментации.

Вкратце, эта функция предоставляет надежный и многократно используемый способ оценки метрик RFM без возникновения ошибок, связанных с дублированием границ интервалов, и без излишнего усложнения логики.

Шаг 2: Применение полученных баллов

Теперь мы можем оценивать каждый показатель корректно и последовательно:

# Присваиваем баллы R, F, M rfm['R_Score'] = rfm_score(rfm['Recency'], ascending=False) # Недавние покупки = высокий балл rfm['F_Score'] = rfm_score(rfm['Frequency']) # Более частые покупки = высокий балл rfm['M_Score'] = rfm_score(rfm['Monetary']) # Большие расходы = высокий балл

Единственным особым случаем здесь является давность :

  • Более низкие значения означают более недавнюю активность.
  • Таким образом, мы изменяем порядок ранжирования на ascending=False.
  • Всё остальное подчиняется естественному правилу «чем выше, тем лучше».

Что это значит для NovaShop

Вместо этого вы увидите следующее:

Актуальность = 326, Частота = 1, Денежная стоимость = 77 183,60

Теперь NovaShop видит что-то вроде:

R = 1, F = 1, M = 5

Это сразу же становится более понятным:

  • Недавнее событие
  • Нечасто
  • Город с высокими расходами (исторически)

Шаг 3: Создание комбинированного RFM-балла

Теперь объединим эти три показателя в один RFM-код:

rfm['RFM_Score'] = ( rfm['R_Score'].astype(str) + rfm['F_Score'].astype(str) + rfm['M_Score'].astype(str) )

В результате получаются значения следующего вида:

  • 555 → Лучшие клиенты
  • 155 → Люди, много тратящие, но не вернувшиеся
  • 111 → Клиенты, которые, вероятно, ушли

Теперь каждый клиент обладает компактным поведенческим отпечатком. И это еще не все.

Преобразование RFM-показателей в сегменты клиентов

Первичные оценки — это хорошо, но давайте будем честны: ни один менеджер по маркетингу не хочет весь день смотреть на 555, 154 или 311 .

NovaShop нужны метки, которые понятны с первого взгляда . Вот тут-то и пригодятся RFM-сегменты.

Шаг 1: Определение сегментов

Используя RFM-показатели, мы можем классифицировать клиентов по осмысленным категориям. Вот распространенный подход:

  • Чемпионы: лучшие показатели недавности, частоты, финансового успеха (555) — ваши лучшие клиенты
  • Постоянные клиенты: покупатели, возможно, тратят не больше всех, но постоянно возвращаются.
  • Крупные траты: значительные финансовые затраты, но не обязательно недавние или частые.
  • Рискованный вариант: Раньше покупал, но в последнее время не возвращался.
  • Поражение: низкие баллы по всем трем показателям — вероятно, невовлеченность.
  • Перспективные/Новые: Новые клиенты, которые недавно начали пользоваться услугами, но реже обращаются или тратят меньше денег.

Это превращает абстрактные числа в повествование , на основе которого маркетинг и менеджмент могут действовать.

Шаг 2: Сопоставление оценок с сегментами

Вот пример использования простой условной логики:

def rfm_segment(row): if row['R_Score'] >= 4 and row['F_Score'] >= 4 and row['M_Score'] >= 4: return 'Champions' elif row['F_Score'] >= 4: return 'Loyal Customers' elif row['M_Score'] >= 4: return 'Big Spenders' elif row['R_Score'] <= 2: return 'At-Risk' else: return 'Others' rfm['Segment'] = rfm.apply(rfm_segment, axis=1)

Теперь у каждого клиента есть понятная для человека метка , позволяющая немедленно предпринять необходимые действия.

Давайте проанализируем наши результаты с помощью функции rfm.head().

394063fac13b66c8f8b06e852493d5e2

Шаг 3: Превращение сегментов в стратегию

Благодаря сегментам с маркировкой, NovaShop может:

  • Наградите чемпионов → Эксклюзивные предложения, бонусные баллы
  • Возобновите взаимодействие с клиентами, совершающими крупные покупки, и клиентами из группы риска → Персонализированные электронные письма или скидки
  • Разумно направляйте маркетинговые усилия → Не тратьте силы на клиентов, которые действительно потеряны.

Это тот момент, когда данные превращаются в стратегию.

Что следует предпринять NovaShop в дальнейшем (ключевые выводы и рекомендации)

В начале этого анализа у компании NovaShop возникла знакомая проблема:
Имеется большой объем транзакционных данных, но недостаточно ясности в отношении поведения клиентов .

Применив RFM-методологию, мы превратили необработанную историю покупок в четкое, структурированное представление о том, кто являются клиентами NovaShop и как они себя ведут.

Теперь давайте поговорим о том, что с этим делать на самом деле.

1. Защищайте и вознаграждайте своих лучших клиентов.

Чемпионы и лояльные клиенты уже делают то, чего хочет каждый бизнес:

  • Они недавно совершили покупку.
  • Они часто совершают покупки
  • Они обеспечивают стабильный доход.

Эти клиенты не нуждаются в больших скидках — им нужно признание.

Рекомендуемые действия:

  • Ранний доступ к продажам
  • Бонусные баллы или VIP-уровни
  • Персонализированные благодарственные письма

Цель здесь не в привлечении новых клиентов, а в их удержании.

2. Возобновите взаимодействие с ценными клиентами, прежде чем они будут потеряны.

Самым опасным сегментом для NovaShop являются не «потерянные» клиенты.
Это группа риска и крупные транжиры .

Эти клиенты:

  • В прошлом продемонстрировали явную ценность.
  • Но в последнее время ничего не покупал.
  • Они находятся в одном шаге от полного перемешивания.

Рекомендуемые действия:

  • Целенаправленные кампании по возвращению клиентов
  • Персонализированные предложения (а не общие скидки)
  • Напоминания по электронной почте, привязанные к истории покупок.

Возвращение существующего клиента почти всегда обходится дешевле, чем привлечение нового.

3. Не вкладывайте слишком много средств в действительно потерянных клиентов.

Некоторые клиенты неизбежно уйдут. RFM помогает NovaShop выявлять таких клиентов на ранней стадии и избегать траты рекламного бюджета, скидок и маркетинговых усилий на пользователей, которые вряд ли вернутся. Речь идёт не о холодности, а об эффективности .

4. Используйте RFM как постоянно развивающуюся систему, а не как разовый анализ.

Настоящая мощь RFM проявляется тогда, когда:

  • Пересчитывается ежемесячно или ежеквартально.
  • Интегрировано в панели мониторинга
  • Используется для отслеживания перемещения между сегментами во времени.

Для NovaShop это означает задавать такие вопросы:

  • Сколько клиентов из группы риска стали лояльными в этом месяце?
  • Число чемпионов растет или сокращается?
  • Какие рекламные кампании действительно помогают клиентам подняться по карьерной лестнице?

RFM превращает поведение клиентов в нечто измеримое и отслеживаемое .

Заключительные мысли: Завершение серии публичных обсуждений EDA.

Когда я начинал эту серию статей об открытом разведочном анализе данных, я не стремился создать идеальный анализ или продемонстрировать продвинутые методы. Я хотел замедлиться и поделиться тем, как я на самом деле думаю, работая с реальными данными. Не отполированной версией, а сложным, итеративным процессом, который обычно остается скрытым.

Этот проект начался с шумного CSV-файла и множества открытых вопросов. В процессе работы возникали мелкие проблемы, которые обнаруживались только при более внимательном рассмотрении — даты, хранившиеся в виде строк, предположения, которые не совсем подтверждались, метрики, которые нуждались в контексте, прежде чем обрести смысл. Работа над этими моментами публично порой была некомфортной, но и по-настоящему ценной. Каждая корректировка делала анализ более сильным и честным.

Этот процесс укрепил во мне понимание того, что большинство значимых выводов не рождается из сложности. Они рождаются из замедления темпа, правильной структуризации данных и постановки более качественных вопросов. К моменту проведения RFM-анализа ценность заключалась не в самих формулах, а в том, с чем они заставляли меня столкнуться. Клиент, который когда-то потратил много денег, не обязательно ценен сегодня. Важно недавнее обращение. Важно частота обращений. И ни один из этих показателей сам по себе не имеет большого значения.

Завершение серии RFM показалось мне намеренным. Это точка, где техническая работа встречается с бизнес-мышлением, где таблицы превращаются в разговоры, а цифры — в решения. Именно здесь исследовательский анализ перестает быть чисто описательным и начинает приобретать практический характер. На этом этапе цель состоит уже не просто в понимании данных, а в принятии решения о дальнейших действиях.

Публичная работа над этим проектом изменила мой подход к анализу. Записывание результатов заставляло меня объяснять свои рассуждения, подвергать сомнению свои предположения и не бояться показывать несовершенства работы. Это напомнило мне, что разведочный анализ данных — это не контрольный список, который нужно быстро выполнить, а диалог с данными. Обмен этим диалогом делает вас более вдумчивым и ответственным.

Возможно, это заключительная часть серии «EDA в открытом доступе», но она не выглядит как конечная точка. Все, что здесь представлено, может развиться в панели мониторинга, автоматизированные конвейеры или более глубокий анализ потребностей клиентов.

Если вы основатель, аналитик или команда, работающая с данными о клиентах или продажах и пытающаяся в них разобраться, то именно в такой исследовательской работе часто достигается наибольшая ясность. Мне нравится решать именно такие проблемы — медленно, вдумчиво и с учетом бизнес-контекста.

Если вы документируете результаты собственного анализа, мне было бы интересно посмотреть, как вы к этому подходите. А если вы сталкиваетесь с похожими вопросами в своих данных и хотите обсудить их, не стесняйтесь обращаться ко мне на любой из платформ, указанных ниже. Хорошие дискуссии о данных обычно начинаются именно там.

Спасибо, что следили за обновлениями!

Середина

LinkedIn

Твиттер

YouTube

Источник: towardsdatascience.com

✅ Найденные теги: EDA, Pandas, RFM-анализ, клиенты, новости, Сегментация

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Фото сгенерированных лиц: исследование показывает, что люди не могут отличить настоящие лица от сгенерированных
Нейросети построили капитализм за трое суток: 100 агентов Claude заперли…
Скетч: цифровой осьминог и виртуальный мир внутри компьютера с человечком.
Сцена с жестами пальцами, где один жест символизирует "VPN", а другой "KHP".
‼️Paramount купила Warner Bros. Discovery — сумма сделки составила безумные…
Скриншот репозитория GitHub "Claude Scientific Skills" AI для научных исследований.
Структура эффективного запроса Claude с элементами задачи, контекста и референса.
Эскиз и готовая веб-страница платформы для AI-дизайна в современном темном режиме.
ideipro logotyp
Image Not Found
Звёздное небо с галактиками и туманностями, космос, Вселенная, астрофотография.

Система оповещения обсерватории Рубина отправила 800 000 сигналов в первую ночь наблюдений.

Астрономы будут получать оповещения о небесных явлениях в течение нескольких минут после их обнаружения. Теренс О'Брайен, редактор раздела «Выходные». Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной…

Мар 2, 2026
Женщина с длинными тёмными волосами в синем свете, нейтральный фон.

Расследование в отношении 61-фунтовой машины, которая «пожирает» пластик и выплевывает кирпичи.

Обзор компактного пресса для мягкого пластика Clear Drop — и что будет дальше. Шон Холлистер, старший редактор Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной странице вашего…

Мар 2, 2026
Черный углеродное волокно с текстурой плетения, отражающий свет.

Материал будущего: как работает «бессмертный» композит

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

Мар 2, 2026
Круглый экран с изображением замка и горы, рядом электронная плата.

Круглый дисплей Waveshare для креативных проектов

Круглый 7-дюймовый сенсорный дисплей от Waveshare создан для разработчиков и дизайнеров, которым нужен нестандартный экран.  Это IPS-панель с разрешением 1 080×1 080 пикселей, поддержкой 10-точечного ёмкостного сенсора, оптической склейкой и защитным закалённым стеклом, выполненная в круглом форм-факторе.…

Мар 2, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых