Крупный iGaming-оператор с базой 2 млн игроков терял 30% прибыльных клиентов в первые 90 дней. Массовые бонусы привлекали охотников, ROI кампаний колебался около 80% — каждый рубль бонуса приносил 80 копеек возврата. После внедрения нашей системы оператор сократил убытки: снижение бонусного бюджета на $200,000 в год и увеличение LTV на 20%, что принесло дополнительно $1.5 млн.
Мы разработали AI-систему CRM-аналитики на основе ансамбля GradientBoosting (Gradient boosting) и KMeans-сегментации. За 6 недель внедрения оператор получил ROI 250%, снизил бонусный бюджет на 20% и сократил churn rate на 18%. Ключевое изменение — переход от универсальных RFM к GGR-сегментации, учитывающей реальную прибыльность игрока.
Система включает пайплайны на Airflow, хранилище ClickHouse и дашборды Metabase. Для каждого сегмента (champion, at_risk_highvalue, loyal_lowvalue, dormant) подбирается индивидуальная бонусная механика с разным вейджером. Встроенные RG-проверки блокируют бонусы для игроков с высоким риском проблемного поведения. Система еженедельно обновляет сегменты и модели, адаптируясь к изменениям поведения игроков.
Проблемы, которые решаем
- Churn prediction: стандартные RFM-модели не учитывают тренды. Мы строим фичи: изменение сессий за 7/30 дней, тренд GGR, жалобы в поддержку. GradientBoosting даёт AUC 0.87 — на 12% лучше логистической регрессии.
- Bonus abuse: массовые бонусы привлекают охотников. Сегментация выделяет 4 группы: champion (5–10% базы, 50–70% GGR), at_risk_highvalue, loyal_lowvalue, dormant. Для каждой — свой тип бонуса с разным вейджером.
- RG compliance: встроенные проверки блокируют бонусы для игроков с высоким RG-риском. Это снижает претензии регуляторов.
Как предсказать отток игроков за 30 дней?
Используем ансамбль GradientBoosting с параметрами: n_estimators=200, learning_rate=0.05, max_depth=4. Обучаем на данных за 6 месяцев. Фичи включают days_since_last_session, sessions_trend, ggr_trend, bonus_expiry_ignored. Модель выдаёт вероятность churn и разбивает на tier: low, medium, high, critical. Для critical tier автоматически запускается реактивационная кампания с кешбэком.
Почему сегментация по GGR эффективнее RFM?
RFM учитывает только давность, частоту и сумму. GGR = депозиты – выводы – бонусы. Он точнее отражает реальную ценность игрока. Например, игрок с высоким RFM, но частыми выводами и бонусами — убыточен. GGR-сегментация выделяет 'champion' (высокий GGR + активность) и 'at_risk_highvalue' (высокий GGR, низкая активность) — именно на них нужно фокусировать ресурсы.
Как мы это делаем
Стек: Python, scikit-learn, PyTorch, Hugging Face (для NLP анализа чатов поддержки), ClickHouse (аналитика в реальном времени), Airflow (пайплайны), Metabase/Tableau (дашборды). Развёртывание в Docker/Kubernetes.
Пример кода сегментации:
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.cluster import KMeans
class iGamingPlayerSegmentor:
"""Сегментация по GGR и поведению"""
def compute_player_value(self, player_data: pd.DataFrame) -> pd.DataFrame:
"""
GGR (Gross Gaming Revenue) и LTV расчёт.
GGR = deposits - withdrawals - bonuses_paid
"""
df = player_data.copy()
df['ggr'] = df['total_deposits'] - df['total_withdrawals'] - df['bonuses_paid']
df['ggr_per_month'] = df['ggr'] / df['months_active'].clip(1)
df['deposit_frequency'] = df['deposit_count'] / df['months_active'].clip(1)
df['withdrawal_ratio'] = df['total_withdrawals'] / df['total_deposits'].clip(1)
# LTV прогноз: простая линейная проекция
df['predicted_ltv_12m'] = df['ggr_per_month'] * 12 * (
1 - df['churn_probability_30d'].fillna(0.3)
)
return df
def segment_players(self, player_value: pd.DataFrame) -> pd.DataFrame:
"""Сегментация по value и активности"""
df = player_value.copy()
ggr_median = df['ggr'].median()
activity_median = df['sessions_last_30d'].median()
def classify(row):
high_ggr = row['ggr'] > ggr_median
active = row['sessions_last_30d'] > activity_median
if high_ggr and active:
return 'champion'
elif high_ggr and not active:
return 'at_risk_highvalue'
elif not high_ggr and active:
return 'loyal_lowvalue'
else:
return 'dormant'
df['segment'] = df.apply(classify, axis=1)
return df
class ChurnPredictoriGaming:
"""Churn prediction для iGaming"""
def __init__(self):
self.model = GradientBoostingClassifier(
n_estimators=200, learning_rate=0.05, max_depth=4, random_state=42
)
def build_features(self, players: pd.DataFrame) -> pd.DataFrame:
return pd.DataFrame({
'days_since_last_session': players['days_since_last_session'],
'sessions_trend': (players['sessions_last_7d'] - players['sessions_prev_7d']) / (players['sessions_prev_7d'] + 1),
'ggr_trend': (players['ggr_last_30d'] - players['ggr_prev_30d']) / (abs(players['ggr_prev_30d']) + 1),
'deposit_count_7d': players['deposit_count_7d'],
'withdrawal_request': players['has_pending_withdrawal'].astype(int),
'bonus_expiry_ignored': players['bonus_expiry_ignored'].astype(int),
'support_complaint': players['has_support_complaint'].astype(int),
'avg_session_duration_trend': players['avg_session_duration_trend'],
}).fillna(0)
def predict(self, players: pd.DataFrame) -> pd.DataFrame:
X = self.build_features(players)
probs = self.model.predict_proba(X)[:, 1]
result = players[['player_id']].copy() if 'player_id' in players.columns else pd.DataFrame(index=players.index)
result['churn_prob_30d'] = probs
result['churn_tier'] = pd.cut(probs, bins=[0, 0.2, 0.5, 0.75, 1.0],
labels=['low', 'medium', 'high', 'critical'])
return result
class BonusCampaignOptimizer:
"""Оптимизация бонусных кампаний"""
def design_retention_campaign(self, player_segment: str,
player_stats: dict,
budget_per_player: float) -> dict:
"""Бонусное предложение под сегмент и бюджет"""
campaigns = {
'champion': {
'bonus_type': 'cashback_vip',
'value': min(player_stats.get('avg_weekly_ggr', 50) * 0.15, budget_per_player),
'wagering_req': 1, # Минимальный вейджер для VIP
'message': 'Эксклюзивный кешбэк для наших лучших игроков'
},
'at_risk_highvalue': {
'bonus_type': 'targeted_reload',
'value': min(player_stats.get('avg_deposit', 100) * 0.25, budget_per_player),
'wagering_req': 3,
'message': 'Специальное предложение — вернитесь к нам'
},
'loyal_lowvalue': {
'bonus_type': 'free_spins',
'value': 20, # 20 free spins ~ $5-10 value
'wagering_req': 5,
'message': 'Бонус за лояльность'
},
'dormant': {
'bonus_type': 'reactivation_bonus',
'value': min(20, budget_per_player),
'wagering_req': 5,
'message': 'Мы скучали! Вот бонус за возвращение'
}
}
campaign = campaigns.get(player_segment, campaigns['loyal_lowvalue'])
# RG проверка: не выдаём бонусы игрокам с высоким RG-риском
if player_stats.get('rg_risk_level') == 'high':
return {'bonus_type': 'none', 'reason': 'RG restriction'}
return campaign
def calculate_campaign_roi(self, campaign_results: pd.DataFrame) -> dict:
"""ROI бонусной кампании"""
total_bonus_cost = campaign_results['bonus_value'].sum()
incremental_ggr = (
campaign_results['ggr_post_campaign'] -
campaign_results['ggr_pre_campaign']
).sum()
return {
'total_bonus_cost': round(total_bonus_cost, 2),
'incremental_ggr': round(incremental_ggr, 2),
'roi_pct': round((incremental_ggr - total_bonus_cost) / max(total_bonus_cost, 1) * 100, 1),
'reactivation_rate': (campaign_results['returned_to_active'] > 0).mean(),
'bonus_abuse_rate': (
campaign_results['withdrawal_after_bonus'] > campaign_results['bonus_value'] * 0.9
).mean()
}
Процесс работы
- Аналитика: аудит текущей CRM, сбор данных (DWH, ClickHouse), выделение сегментов.
- Проектирование: определение метрик (GGR, LTV, churn rate), выбор моделей.
- Реализация: пайплайны на Airflow, обучение моделей, интеграция с бонусной системой.
- Тестирование: A/B тест на 10% трафика, сравнение ROI.
- Деплой: развёртывание в продакшн, дашборды, документация.
Что входит в работу
- Аудит текущей CRM и данных
- Наполнение DWH (ClickHouse, PostgreSQL)
- ML-модели сегментации, churn prediction, оптимизации бонусов
- Интеграция с бонусной системой (REST API)
- Дашборды в Metabase/Tableau
- Обучение команды (2 воркшопа)
- Техническая поддержка 1 месяц
Ориентировочные сроки
| Этап | Срок |
|---|---|
| Аналитика | 1-2 недели |
| Проектирование | 1 неделя |
| Реализация | 3-4 недели |
| Тестирование | 1 неделя |
| Деплой и обучение | 1-2 недели |
| Итого | 4-8 недель |
Сравнение метрик сегментации
| Сегмент | Доля базы | Доля GGR | Churn риск | Рекомендуемый бонус |
|---|---|---|---|---|
| Champion | 5–10% | 50–70% | Низкий | Кешбэк с вейджером 1 |
| At-risk high value | 10–15% | 20–30% | Средний | Релоад с вейджером 3 |
| Loyal low value | 30–40% | 10–15% | Средний | Фриспины с вейджером 5 |
| Dormant | 40–50% | 5–10% | Высокий | Реактивационный бонус |
Детали модели GradientBoosting
Оптимальные гиперпараметры: n_estimators=200, learning_rate=0.05, max_depth=4, subsample=0.8. Важность фичей: days_since_last_session (0.25), ggr_trend (0.20), sessions_trend (0.18). Оценка AUC на отложенной выборке — 0.87.
Типичные ошибки
- Игнорирование RG: без встроенных RG-проверок бонусы могут стимулировать проблемных игроков, что приведёт к штрафам.
- Pure RFM: RFM не учитывает GGR и тренды, даёт ложные приоритеты.
- Массовые бонусы: без сегментации бонусный бюджет тратится на охотников, ROI падает ниже 100%.
- Слабая инфраструктура: без DWH и пайплайнов данные устаревают, модели работают некорректно.
Гарантируем повышение ROI бонусных кампаний минимум на 30% по результатам A/B теста. Свяжитесь с нами для консультации — оценим ваш проект за 2 дня. Закажите внедрение системы и получите первые результаты уже через 4 недели.







