AI-система CRM-аналітики для iGaming (сегментація, retention, bonus optimization)

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
AI-система CRM-аналітики для iGaming (сегментація, retention, bonus optimization)
Середній
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    587
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

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) потребує персонального менеджера, не масових розсилок.