← Повернутися до блогу
/Бізнес-аналітика/4 хв читання

RFM-аналіз клієнтів: AI знаходить тих, хто ось-ось піде

RFM-аналіз клієнтів: як за годину сегментувати базу, знайти тих, хто ось-ось піде, і повернути їх до покупки. Python + KeyCRM + GPT-4o, без data scientist.

AIавтоматизаціябізнес-аналітикаRFMутримання клієнтівCRM

Утримати клієнта дешевше, ніж залучити нового. За різними оцінками — у 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% «сплячих». Шаблонний — близько нуля.

З чого почати

  1. Витягніть замовлення з CRM за останні 12 місяців. Якщо їх немає в одному місці — зберіть. Це найважча частина.
  2. Проженіть код вище. Подивіться на цифру «Сплячі» — вона вас, найімовірніше, здивує.
  3. Дайте LLM список «сплячих» і попросіть написати листа. Відправте через SendPulse або eSputnik.
  4. Повторюйте щотижня через n8n: у понеділок скрипт рахує сегменти, LLM пише висновки, у Telegram падає звіт.

Уся схема коштує близько $3/міс на API — gpt-4o-mini на такому обсязі це копійки. Ні data scientist, ні BI-платформа не потрібні.

Витрачати бюджет на нових клієнтів, коли половина наявних мовчки йде — це лити воду в діряве відро. RFM показує діру. AI підказує, чим її залатати.

Хочете побачити сегментацію своєї бази? Напишіть нам — порахуємо RFM і покажемо, хто з клієнтів на межі відтоку. Перша консультація безкоштовна.

Команда AIRINEX

← Всі статті