RFM-аналіз клієнтів: AI знаходить тих, хто ось-ось піде
RFM-аналіз клієнтів: як за годину сегментувати базу, знайти тих, хто ось-ось піде, і повернути їх до покупки. Python + KeyCRM + GPT-4o, без data scientist.
Утримати клієнта дешевше, ніж залучити нового. За різними оцінками — у 5–7 разів. Але більшість українських бізнесів цього не робить, бо просто не знає, хто з клієнтів на межі відтоку. Вони бачать виручку за вчора і не помічають, що 30% бази вже місяць нічого не купувала.
Ми багато писали про гроші: P&L без бухгалтера, прогноз продажів. Але жодного посту про тих, хто ці гроші приносить. Цей — про клієнтів. Як за годину сегментувати базу за RFM, знайти тих, хто ось-ось піде, і дати відділу продажів готові дії.
RFM за десять хвилин
RFM — це три числа про кожного клієнта.
- Recency — скільки днів тому він купував востаннє.
- Frequency — скільки замовлень зробив.
- Monetary — скільки грошей лишив.
Кожен показник ділиться на п'ять рівнів (від 1 до 5), і з трьох цифр складається код. 555 — купував нещодавно, часто і багато. 111 — давно, один раз, на копійки.
За цими кодами база розкладається по сегментах. І тут починається найцікавіше.
Вивантажуємо замовлення з CRM
Уся RFM-математика зводиться до одного джерела — списку замовлень. У KeyCRM або KeepinCRM він уже є, лишається витягнути через API:
import requests headers = {"Authorization": "Bearer ВАШ_ТОКЕН", "Accept": "application/json"} resp = requests.get( "https://openapi.keycrm.app/v1/orders", headers=headers, params={"limit": 50, "page": 1}, ) orders = resp.json()
Деталі авторизації в кожної CRM свої, але суть одна: тягнете три поля на замовлення — customer_id, date, total. Решту RFM порахує сам.
Рахуємо RFM і розкладаємо по сегментах
Нижче припускаю, що замовлення вже лежать у DataFrame з колонками order_id, customer_id, date, total.
import pandas as pd from datetime import datetime today = datetime.now() rfm = orders.groupby("customer_id").agg( last_order=("date", "max"), freq=("order_id", "count"), money=("total", "sum"), ).reset_index() rfm["recency_days"] = (today - rfm["last_order"]).dt.days # Квінтилі: 5 — найкращий, 1 — найгірший rfm["R"] = pd.qcut(rfm["recency_days"], 5, labels=[5, 4, 3, 2, 1]) rfm["F"] = pd.qcut(rfm["freq"].rank(method="first"), 5, labels=[1, 2, 3, 4, 5]) rfm["M"] = pd.qcut(rfm["money"].rank(method="first"), 5, labels=[1, 2, 3, 4, 5]) def segment(row): if row["R"] >= 4 and row["F"] >= 4: return "Чемпіони" if row["R"] >= 4 and row["M"] >= 4: return "Великі чеки" if row["R"] == 3 and row["F"] >= 3: return "Потенційні" if row["R"] == 2: return "Сплячі" return "Втрачені" rfm["segment"] = rfm.apply(segment, axis=1) print(rfm["segment"].value_counts())
Сегменти говорять самі за себе. «Чемпіони» — ядро бази, зазвичай 10–20% клієнтів, які дають більшу частину виручки. «Сплячі» — не купували 45–90 днів, і саме вони найімовірніше підуть назавжди. «Втрачені» — ті, хто вже пішов.
Головна цифра, на яку дивитися: скільки клієнтів у «Сплячих» і скільки з них за місяць перейшло у «Втрачені». Це ваш відтік, побачений вчасно.
AI читає сегменти і пише, що робити
Таблиця з кодами — ще не дія. Власнику потрібне рішення: кому дзвонити, кому слати листа, що в ньому писати. Ось тут заходить LLM.
from openai import OpenAI client = OpenAI(api_key="ваш_ключ") sleeping = rfm[rfm["segment"] == "Сплячі"] prompt = f""" Ось сегменти клієнтів інтернет-магазину: {rfm["segment"].value_counts().to_string()} Ось «сплячі» клієнти (не купували 45-90 днів): {sleeping[["last_order", "freq", "money"]].head(20).to_string()} Напиши українською: 1. Що ця картина означає простими словами. 2. Три конкретні дії на цей тиждень. 3. Шаблон повідомлення для повернення «сплячого» клієнта. """ answer = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}], temperature=0.3, )
LLM не переказує таблицю, а бачить у ній сенс. Скажімо, «сплячі» купували кожні два тижні з середнім чеком 800 грн — отже, зникнення на два місяці це не норма, а сигнал. І лист він пише під цю конкретну аудиторію, а не шаблонне «поверніться до нас».
За нашим досвідом, лист під конкретний сегмент повертає 3–5% «сплячих». Шаблонний — близько нуля.
З чого почати
- Витягніть замовлення з CRM за останні 12 місяців. Якщо їх немає в одному місці — зберіть. Це найважча частина.
- Проженіть код вище. Подивіться на цифру «Сплячі» — вона вас, найімовірніше, здивує.
- Дайте LLM список «сплячих» і попросіть написати листа. Відправте через SendPulse або eSputnik.
- Повторюйте щотижня через n8n: у понеділок скрипт рахує сегменти, LLM пише висновки, у Telegram падає звіт.
Уся схема коштує близько $3/міс на API — gpt-4o-mini на такому обсязі це копійки. Ні data scientist, ні BI-платформа не потрібні.
Витрачати бюджет на нових клієнтів, коли половина наявних мовчки йде — це лити воду в діряве відро. RFM показує діру. AI підказує, чим її залатати.
Хочете побачити сегментацію своєї бази? Напишіть нам — порахуємо RFM і покажемо, хто з клієнтів на межі відтоку. Перша консультація безкоштовна.
Команда AIRINEX
← Всі статті