AI-система CRM-аналітики iGaming
iGaming CRM — це керування ігровою базою на основі сегментації поведінки, передбачення churn та оптимізації бонусних кампаній. Основне завдання: утримати прибуткових гравців, не стимулюючи проблемну поведінку, та реактивувати dormant сегмент економічно ефективно.
Сегментація та цінність гравців
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()
}
iGaming CRM з AI-сегментацією підвищує ефективність бонусних кампаній: ROI зростає з 80-120% до 150-250% за рахунок націлення правильних сегментів. Ключове: champion сегмент (5-10% бази, 50-70% GGR) потребує персонального менеджера, не масових розсилок.







