Условие
Нужно построить модель оттока (churn) клиентов. Объясните, какие фичи вы создадите для каждого пользователя на дату T. Объясните, почему именно эти.
Решение
Что такое отток и горизонт
Сначала уточняем определение churn:
- «нет покупок за 30 дней после
T»?60?90? - Hard churn (отписка) или soft churn (бездействие)?
Это влияет на target и фичи.
Базовый набор — RFM
Recency, Frequency, Monetary — классика:
| Фича | Формула | Что отражает |
|---|---|---|
recency_days |
T - last_purchase_date |
Свежесть контакта |
frequency_30d |
число заказов за [T-30, T) |
Активность |
frequency_90d |
то же за [T-90, T) |
Стабильность |
monetary_30d |
сумма заказов за [T-30, T) |
Доходность |
monetary_lifetime |
вся история | LTV-прокси |
avg_check_30d |
mean(amount) за 30d | Покупательская сила |
Это минимум, который должен быть.
Поведенческие
| Фича | Формула | Идея |
|---|---|---|
sessions_30d |
число визитов | Engagement |
pageviews_per_session_30d |
глубина | Интерес |
bounce_rate_30d |
сессии с 1 page view | Низкий интерес → риск ухода |
device_diversity |
число уникальных платформ | Multi-platform = lock-in |
feature_X_used_count |
использование ключевых фич | Тот, кто открыл «избранное», вернётся |
Динамика (производные)
| Фича | Формула | Идея |
|---|---|---|
freq_30d / freq_90d |
соотношение «недавнего» к «давнему» | Падает → уходит |
monetary_30d / monetary_90d (приведя к одному периоду) |
то же по деньгам | Снижение чека = риск |
delta_avg_check |
avg_check_30d - avg_check_180d |
Тренд чека |
days_since_last_login |
Раньше вообще не заходил? |
Лояльность и контактность
| Фича | Формула | Идея |
|---|---|---|
tenure_days |
T - signup_date |
Стаж |
support_tickets_30d |
жалобы | Конфликты |
nps_score_recent |
если есть | Прямой сигнал |
unsubscribed_email |
флаг | «Закрылся» от коммуникаций |
app_uninstall_event |
флаг | Сильный сигнал |
Продуктовые
| Фича | Что |
|---|---|
| Категории/подкатегории, которые покупает (one-hot или topN) | Сегмент |
| Распределение времени суток / дня недели | Поведенческий профиль |
| Доля акционных покупок | Чувствительность к цене |
| Среднее время доставки | Если задерживалось — может уходить |
Внешние
- Сезон, праздники, дни до зарплаты.
- Гео (через регион/город).
- Маркетинговые кампании, где он был.
Подводные камни
- Лик target в фичи. Любая фича с использованием данных после
T— катастрофа. Считайте «всё на моментT - 1». - Тренировка на «зомби». Если выборка только из активных, модель будет переоценивать engagement. Включайте уже ушедших и тех, кто только что зашёл.
- Шкалы. Recency может быть огромным; стандартизуйте или используйте
log1p. - Categorical с высокой кардинальностью (категории товаров): target encoding с CV или embeddings.
- Дисбаланс классов. Churn часто 5–15%. Используйте
class_weight,scale_pos_weight, или sample. - Concept drift. Модель ломается с временем — переобучение раз в месяц.
- Stationarity. Многие фичи нестабильны (расходы клиентов в новогодние праздники). Добавляйте сезонные индикаторы.
- Правильная валидация. Time-based split, не random — иначе утечка.
Эталонный ответ
Список из ~30 фич, сгруппированных по слоям: RFM, поведенческие, динамика (тренды), лояльность, продуктовые, внешние. Каждая фича — с обоснованием. Плюс пункт «как избежать утечек и как правильно валидироваться».