Введение
Всем привет! Это мой выпускной проект в Яндекс.Практикуме. Задача — построить модель машинного обучения, которая предсказывает отток клиентов для телеком-оператора «ТелеДом».
Оператор хочет бороться с оттоком на опережение: находить клиентов, которые собираются расторгнуть договор, и предлагать им промокоды и специальные условия, чтобы удержать. Сейчас компания может реагировать только постфактум — когда клиент уже ушёл. Модель позволит действовать на шаг вперёд.
Данные
Исходные данные хранятся в SQLite-базе и состоят из четырёх таблиц:
| Таблица | Описание | Ключевые поля |
|---|---|---|
contract |
Информация о договоре | Дата начала, тип оплаты, сумма |
personal |
Персональные данные | Пол, возраст, семейное положение |
internet |
Услуги интернета | Тип подключения, доп. услуги |
phone |
Услуги телефонии | Наличие линии, несколько номеров |
После объединения таблиц получился датасет на ~7 000 клиентов, из которых 26.5% уже расторгли договор — это и есть наш целевой признак.
EDA и подготовка данных
Разведочный анализ выявил несколько важных закономерностей:
- Тип контракта — ключевой фактор: клиенты с помесячной оплатой уходят значительно чаще
- Длительность обслуживания — чем дольше клиент с оператором, тем ниже вероятность оттока
- Дополнительные услуги — наличие техподдержки, стриминга и онлайн-безопасности снижает отток
Feature engineering включал создание бинарных признаков для каждой услуги (есть/нет), а также извлечение признака TotalCharges из общей суммы платежей.
Балансировка классов
Для борьбы с дисбалансом применил комбинированную стратегию:
- Upsample — увеличил количество редкого класса (отток) за счёт дублирования
- Downsample — уменьшил количество частого класса (не отток) случайным удалением
Это позволило получить сбалансированную выборку, на которой модель учится распознавать оба класса без перекоса.
Модели и результаты
Обучил модели и сравнил их метрики:
| Модель | Precision | Recall | F1 | ROC-AUC |
|---|---|---|---|---|
| Logistic Regression | 0.82 | 0.79 | 0.80 | 0.88 |
| Random Forest | 0.84 | 0.81 | 0.82 | 0.91 |
| CatBoost | 0.86 | 0.84 | 0.85 | 0.93 |
CatBoost показал лучший результат — F1 = 0.85 и ROC-AUC = 0.93. Однако для бизнеса важна не просто метрика, а конкретный эффект.
Бизнес-метрики
Ключевой вопрос: сколько клиентов мы сможем удержать? Для этого:
- Подобрал оптимальный порог вероятности (не стандартный 0.5, а 0.3 — чтобы захватить больше потенциальных уходов)
- Рассчитал Retention — сколько клиентов из предсказанного оттока удастся удержать при разных сценариях
- Посчитал LIFT — во сколько раз модель эффективнее случайного выбора
Заключение
Проект показал, что даже на относительно небольшом датасете можно построить эффективную модель оттока. CatBoost отлично справился с задачей, а правильный подбор порога и фокус на бизнес-метрики превращают ML-модель из академического упражнения в реальный инструмент для бизнеса.
Что можно улучшить:
- Добавить внешние данные (платёжная дисциплина, обращения в поддержку)
- Использовать более сложные методы балансировки (SMOTE)
- Развернуть модель как API для интеграции с CRM
Ссылки
Полный Jupyter Notebook с кодом, визуализациями и детальным анализом:
GitHub: Выпускной проект — Прогнозирование оттока клиентов
Проект выполнен в рамках выпускной работы курса Яндекс.Практикум «Специалист по Data Science». Все код и визуализации доступны в открытом репозитории.