RFM - классический инструмент маркетинга для сегментации вашей клиентской базы. Я использую ее для работы в В2В, В2G сегменте. В основе него - понятные управленцу ценности: LTV и Purchase Frequency.
Как можно применять этот инструмент:
Посчитать отток клиентской базы
Найти клиентов в оттоке - самых крупных заказчиков, которые, почему-то, раньше покупали часто и много, а потом - перестали. В первую очередь, важно выяснить причину оттока и попытаться вернуть именно этих партнёров.
Определить ключевых заказчиков - которые покупают много, часто и давно. Этот сегмент самых лояльных пользователей можно использовать для опросов, создания совместных кейсов использования вашего продукта или услуги, воспитания адвокатов бренда, да и просто для укрепления дружественных связей - например, приглашения на мероприятия.
Определить сегмент пользователей, которые делают заказы часто и давно - работа с таким сегментом будет заключаться в попытках поднять средний чек - возможно, не обо всех продуктах и услугах компании известно этим пользователям.
Методология RFM вполне простая: исследователю нужно присвоить каждому заказчику степень «1», «2», «3» в зависимости от :
общей суммы отгруженных заказов (предоставленных и оплаченных услуг) за весь период работы с контрагентом. За нее отвечает показатель Monetary (M)
частоты заказов – Frequency (F)
насколько недавно была совершена последняя сделка – Recency (R)
Степеней может быть больше – это будет зависеть от того, насколько данные однородные. Какие могут встречаться комбинации в RFM:
R=3, F=1, M=1 = заказчики с самым высоким LTV и высокой частотой заказов, которые делали последний заказ давно, находятся в оттоке. Такие контрагенты требуют экстренных мероприятий по выявлению причин оттока и попыток вернуть клиента
M=1, F=1, R=1 = потенциально опинион-лидеры, адвокаты вашего бренда. Также полезно изучить качественный состав таких контрагентов при большом количестве сегментов целевой аудитории в вашей базе
M=2/3, F=1, R=1= в таком сегменте здорово проводить мероприятия, направленные на увеличение среднего чека
Большинство маркетологов, проводя это исследование, используют выгрузку из своей CRM и проводят сортировку в Excel. Такой подход имеет серьезные недостатки:
Отсутствует простое и быстрое решение исследования однородоности данных. Например, у 5% ваших заказчиков LTV может составлять более нескольких миллионов рублей (маржинальную прибыль вы рассматриваете или общий доход – не так важно), а у остальных 95% заказчиков – составлять менее нескольких сотен тысяч рублей. В такой ситуации «просто поделить базу на 3 сегмента» не получится
Excel работает очень медленно с большим массивом данных (в представленном мною примере мы изучали базу контрагентов производственной компании Первый Профильный Завод, состоящую из 3480 компаний)
Отсутствует простое и быстрое решение визуализации данных (в Python это реализуется в пару строк), визуализация понадобится нам для прогнозирования спроса, выявления тренда и сезонности (может, напишу материал об этой методологии исследования спроса и расскажу о своих попытках применить модели временных рядов, ARIMA и SARIMA на Python).
Я использую в работе Jupiter Notebook, библиотеки Python Numpy, Pandas, Matplotlib. Поехали.
В первую очередь мне понадобилось выполнить предобработку данных непосредственно в Excel и привести выгрузку из 1С к виду:
![](https://habrastorage.org/getpro/habr/upload_files/d54/772/f2d/d54772f2d3c1286634709e867ffb89ca.png)
В таблице представлены уникальные наименования контрагентов, даты и суммы всех их заказов за весь период сотрудничества. Уникальный User_id присваивается каждому уникальному наименованию ООО. Если вы – начинающий пользователь Python, обратите внимание на названия колонок таблицы – мы будем использовать их в коде. Мои комментарии к процессам работы вы найдете на скринах после ''#’ символа.
После выполнения предобработки данных, сохраним файл и скопируем путь к нему, откроем новый проект в Jupiter Notebook и импортируем необходимые библиотеки. Откроем файл с данными - наименование компании, id компании, даты заказов компании и суммы заказов. Библиотека Datetime понадобится нам для того, чтобы преобразовать строковый тип данных в дату и посчитать дельту дней между сегодняшним днём и последней датой заказа каждого контрагента.
![](https://habrastorage.org/getpro/habr/upload_files/aac/cdb/896/aaccdb896eb34f6dd2ee16b66ca65573.png)
Обращу внимание на принципы работы с датафреймами, которые помогут серьёзно сократить вам время исследования и избежать моих ошибок:
Обязательно пересохраняйте или создавайте новый датафрейм после преобразований.
Проверяйте количество строк в датафрейме после того, как задали индексы или соединили датафреймы методом merge
Переименовывайте колонки после выполнения преобразований над ними, это поможет не запутаться.
Далее мы должны преобразовать строковый тип данных в дату и найти частоту заказов Frequency (частота заказов будет совпадать с количеством упоминаний уникального user_id), это можно выполнить с помощью следующего кода:
![](https://habrastorage.org/getpro/habr/upload_files/7ac/b40/130/7acb40130a1b8f93ff788a1c7ed9e3a5.png)
Выполняем преобразования датафреймов по индексу:
![](https://habrastorage.org/getpro/habr/upload_files/eaf/259/ecd/eaf259ecd2f22b7ea8f27bf5d757a65d.png)
Вызываем волшебный инструмент, который исследует однородность данных. Функция describe оценивает столбцы с числовым типом данных и возвращает статистические данные, которые дают представление о распределении значений.
Можно отметить значительную разницу между максимальным количеством заказов по контрагенту и 99% процентами других контрагентов, вероятно, контрагентов с количеством заказов 50-1255 стоит выделить в отдельный RFM сегмент или имел место некоторый выброс данных (например, как в нашем случае, компания вешает весомую часть заказов за наличный расчёт на одного контрагента с общим уникальным наименованием и user_id):
![](https://habrastorage.org/getpro/habr/upload_files/fef/4d9/362/fef4d936269de955ee8e6e1feda55876.png)
Понятно, почему после исследования методом describe таблицы с частотой Frequency, мы обнаружили, что 80% контрагентов делали заказы 5 и менее раз - это связано с ростом количества новых клиентов в последний год.
Найдем общую сумму заказов по каждому контрагенту (LTV по общему доходу):
![](https://habrastorage.org/getpro/habr/upload_files/9dc/1c3/9d1/9dc1c39d134132f5e3085cd2c96dae87.png)
И переименуем колонку, чтобы избежать путаницы:
![](https://habrastorage.org/getpro/habr/upload_files/5a1/1ca/859/5a11ca8595ae530a41bcfa62c2644fc1.png)
Найдем даты последних заказов по каждому контрагенту, чтобы описать показатель Recency:
![](https://habrastorage.org/getpro/habr/upload_files/703/cb2/8be/703cb28bef678db9f08cfc36e9cae243.png)
Периодически я проверяю количество строк в получившемся датафрейме, чтобы избежать потери данных после неправильного преобразования индексов (своего рода самопроверка). Опять переименуем колонку, чтобы понимать, что мы получили в результате исследований дату именно последней отгрузки:
![](https://habrastorage.org/getpro/habr/upload_files/8e0/112/ac4/8e0112ac48fe897d6414257ef26fac52.png)
и удалим из датафрейма более не нужную нам колонку order_value:
![](https://habrastorage.org/getpro/habr/upload_files/c33/4df/62b/c334df62bcdaf565118416d7142cfa78.png)
Объединим два датафрейма - с LTV контрагента и датой его последней отгрузки по user_name и user_id:
![](https://habrastorage.org/getpro/habr/upload_files/904/3dc/225/9043dc2256037f394637cedc91d15798.png)
Используйте форматирование для того, чтобы оставить только два знака после запятой в столбцах с суммами, если того требует вашу чувство прекрасного и размеры монитора. Попробуем описать таблицу, получившуюся после слияния:
![](https://habrastorage.org/getpro/habr/upload_files/d09/06e/66d/d0906e66d5e478079d4b56372f1ed7ad.png)
![](https://habrastorage.org/getpro/habr/upload_files/acc/092/f57/acc092f57ea84cd621c2a4f66976eb6e.png)
Можно увидеть значительную разницу между максимальной суммой всех заказов одного покупателя и 97% остальных контрагентов, это может потребовать дополнительного изучения, стоит помнить об этом при RFM сегментации, скорректировать персентиль и изучить список контрагентов с самым высоким LTV. Такую картину можно наблюдать еще, если, например, все отгрузки за расчет по кассе вы кидаете на одного контрагента с общим уникальным наименованием - "Частное лицо", например. По - хорошему стоит избавиться от такого выброса данных. Пока я не нашла оптимального способа подбора персентиля для исследования однородности распределения данных и просто подбираю его вручную, в зависимости от амплитуды полученных значений. Клиентов с общей суммой всех отгруженных заказов свыше 716252.17 пока попробуем выделить в отдельный RFM сегмент most_monetary. Вызвав .shape, можно найти сразу, что количество таких контрагентов - 104 шт.
![](https://habrastorage.org/getpro/habr/upload_files/869/c3b/f59/869c3bf59863fe6f6d5e57c042d67af4.png)
Сегмент most_monetary состоит из 104 клиентов, отсортируем его по последней дате заказа, чтобы выделить клиентов, которые требуют действий для возвратности. Можно отметить, что в основном это заказчики - промышленные компании, а не строительные, что логично, так как серийное производство привязано к OEM-подряду и регулярно закупает комплектующие. Таким образом, теперь мы можем доказать собственнику, что самый важный сегмент (most_monetary) для расширения клиентской базы - именно промышленные компании, несмотря на то, что основную часть оборота составляют строительные материалы, а основную часть базы контрагентов - строительные компании:
![](https://habrastorage.org/getpro/habr/upload_files/148/e3f/f84/148e3ff845ac38341897259793cffc70.png)
![](https://habrastorage.org/getpro/habr/upload_files/771/53c/ede/77153cede8b08eccea43a903a95b390c.png)
Найдем, сколько клиентов делали свой последний заказ более 730 дней назад (6 месяцев, в среднем, по моим подсчетам, составляет цикл сделки в сфере Первого Профильного Завода: В2В, В2G производства комплектующих и строительства, далее вы поймете, почему я выбрала 730 дней для описания пользователей в оттоке - будет страшная история о несостоятельности гипотез. . ). Во время работы я сохранила данные и о пользователях, которые делали последний заказ более полугода назад, и о тех, кто делал последний заказ более года назад, приведу только пример с 730 днями:
![](https://habrastorage.org/getpro/habr/upload_files/317/2a4/f8c/3172a4f8ca7836990a1b896999dc31b5.png)
![](https://habrastorage.org/getpro/habr/upload_files/34b/8bc/2a7/34b8bc2a722deac3930ef139a0520de2.png)
Колонка churn_time покажет, сколько дней назад последний раз был отгружен заказ. Так мы сможем найти контрагентов в оттоке. Исследуем и эти данные на однородность. 50% пользователей делали последний заказ в промежутке между 705 и 1721 днями назад последний раз. Какой-то вопиющий процент оттока, подозрительно:
![](https://habrastorage.org/getpro/habr/upload_files/542/1cb/eb4/5421cbeb41deca6f1b406b9d56cac85d.png)
При первом рассмотрении данных возникла такая гипотеза: что госконтракты - разовые сделки для ООО , некоторые открывают ООО и ИП конкрентно под госпоставки, отсюда и отток.
Я уже собралась проводить опрос среди этих 50% контрагентов, чтобы определить причину отказа от сотрудничества, но меня вовремя остановили собственники - оказалось, что большинство из этих контрагентов были просто перенесены в базу из базы бывшей головной компании, чьими дилерами мы были до запуска своих производственных мощностей. Такой вот Data Science. Опять же, стоит исключить всех таких контрагентов из нашей базы и очистить RFM, но для моделирования пока будем использовать эту базу, присвоив ей статус "сферического коня в вакууме".
Отсортируем пользователей в оттоке по сумме заказов:
![](https://habrastorage.org/getpro/habr/upload_files/115/833/ac0/115833ac03f66124d99f48abb11cd385.png)
Добавили данные по частоте заказов и выбрали оттекших пользователей более 730 дней назад :
![](https://habrastorage.org/getpro/habr/upload_files/c9b/fff/a9d/c9bfffa9d1d118fdd377daabb2033ae0.png)
![](https://habrastorage.org/getpro/habr/upload_files/f94/516/b8a/f94516b8a1ffe811f906bbe99c3ee7b0.png)
Мне нужно было изучить и видеть все строки и колонки данных в этом датафрейме, так что вот волшебная кнопка:
![](https://habrastorage.org/getpro/habr/upload_files/048/256/408/0482564082ba276c42bcf4a7d0c50503.png)
Эти данные - контрагентов с последней датой заказов, частотой заказов и общим LTV и днями пребывания в оттоке уже можно было бы сохранить в виде таблицы, удалив ненужную колонку с информацией по current_date, которую мы использовали для "вычитания" дат.
Таким образом, мы создали базовые коды для быстрой аналитики клиентской базы Первого Профильного Завода для отдела продаж, можем найти клиентов с наибольшим общим доходом в оттоке и сформировать для них персональное предложение, провести опрос по причинам оттока. Приступим непосредственно к RFM-сегментации. Добавим коэффициент значение Monetary, учитывая то, что всего лишь 3% от всех контрагентов сделали заказов всего на сумму более 716252.51 и распределим по сегментам:
![](https://habrastorage.org/getpro/habr/upload_files/6d9/ba0/09d/6d9ba009d59f7fe2220588a40ebce53a.png)
![](https://habrastorage.org/getpro/habr/upload_files/a0d/e37/f92/a0de37f9216d665dfbaab266d997aa1c.png)
Присвоим индекс количества заказов F (вы помните, что после исследования методом describe таблицы с частотой, мы обнаружили, что 80% контрагентов делали заказы 5 и менее раз):
![](https://habrastorage.org/getpro/habr/upload_files/67b/59a/539/67b59a5392a93c89c18e164722c07c89.png)
Добавим коэффициент давности заказа на основе изучения churn time, помня о том, что был значительный рост оборота и прирост клиентской базы в последние 730 дней:
![](https://habrastorage.org/getpro/habr/upload_files/ef6/491/cd8/ef6491cd8a015483e91ae2c5d6265490.png)
Получили итоговую разбивку по RFM c учетом неоднородности данных клиентской базы:
![](https://habrastorage.org/getpro/habr/upload_files/d76/493/8e8/d764938e83dbde0569af4b8eb34de83e.png)
И проведем еще пару полезных манипуляций: Сегмент attention требует изучения причин оттока, одни из самых крупных клиентов с самыми старыми датами последних заказов, которых мы найдем так:
attention_raw = rfm_final.loc[rfm_final ['M'] == 1]
attention = attention_raw.loc[rfm_final ['R'] == 3]
И импортируем их в файл:
attention.to_csv('file1.csv')
Или найдем самых классных, верных и упитанных конрагентов, чтобы премировать их, создавать адвокатов бренда, свозить на море и прочее:
prize_raw = rfm_final.loc[rfm_final ['M'] == 1]
prize = prize_raw.loc[rfm_final ['R'] == 1]
prize_fin = prize.loc[rfm_final ['F'] == 1]
И импортируем их в файл:
prize_fin.to_csv('file2.csv')
Ура, теперь мы знаем, как можно использовать Python для изучения клиентской базы и RFM - сегментации. В будущем я постараюсь показать прогнозирование спроса, выявление его сезонности и тренда с помощью Python. Это мой первый пост на Хабре и первые попытки применить новый для себя инструмент в маркетинговой рутине - я буду очень благодарна за вашу критику и комментарии.
OBIEESupport
Неплохая лабораторная как по Питону, так и по сегментации данных. Еще пару графиков, насколько корзина премиальных клиентов увеличит число заказов при A/B анализе - будет хороший и простой инструмент для экономиста.
kaza4ka Автор
Добрый день и спасибо за ваш комментарий и оценку моего труда. Скажите, пожалуйста, какие графики хотелось бы видеть? Насколько я понимаю, хотелось бы увидеть, как повлияла работа с сегментом премиальных клиентов (по возвратности или по увеличению среднего чека)? Тут, боюсь, многое уже будет зависеть, по крайней мере в нашем случае, от человеческого фактора - все продажи идут от личных отношений. А вот если бы такое исследование сделали разработчики приложения (например, условно, Lamoda или Delivery) - это было бы показательно, тоже хотелось бы посмотреть
OBIEESupport
Если бы цель любого анализа была бы только прокачка способов продажи именно человеческим фактором, то известный анекдот про 4000 менеджеров приват-банкинга Дойче Банка, где они снимали незначащие суммы +/- потом их возвращая в этот же день, распространялся бы как широкая практика. Но хотелось бы увидеть, допустим, чисто ритейловые штуки, как то 3 по цене 2, 25% процентов бесплатно, или какой-либо товар-заместитель в корзину потребителя при снижении покупательной способности на определенное число процентов. Не спорю, менеджеры, их общая "тревожность" и "настройка на сделку" очень важна - стакан продаж департамента маркетинга на 200-300 групп товаров это обычно сразу показывает, но ведь если вы собираетесь премировать оптовых покупателей, то и 2-3% волатильности вы бы сразу получили наглядно. Что очень дополнило бы вашу статью.
kaza4ka Автор
Благодарю вас, прикину, как это можно реализовать в нашей специфике.
kaza4ka Автор
В В2В с акциями странно бывает, конечно. Изучала один проект разработчика системы автоматизации по подписке , регулярно проводили акции - заказчики ждали их, а между акциями услуги оформляли мало. Вот и как с такими работать ???? нужно создавать другие ценности и информационные поводы.