Порог оттока клиентов — это решение о ценообразовании.
Как экономические показатели предприятия должны определять критерии классификации, и почему это редко происходит.
Делиться
Когда модель оттока клиентов говорит: «вероятность ухода этого клиента составляет 0,4», а ваш код predict(X) >= 0.5 , вы только что приняли ценовое решение: вы решили, что стоимость отправки предложения по удержанию клиенту, который остался бы, в точности равна стоимости потери клиента, который ушел бы, и на наборе данных IBM Telco (пожалуй, самом часто используемом наборе данных об оттоке клиентов на Kaggle и GitHub) это решение неверно в 13 раз.
Я собрал корпус из 36 общедоступных анализов оттока клиентов IBM Telco (блокноты Kaggle, репозитории GitHub, сообщения в блогах, рецензируемые статьи), и закономерности в представленных данных поразительны: примерно девять из десяти сообщают о точности классификации или F1-критерии, чуть более одного из семи — о кривой прибыли, и ни один не использует анализ выживаемости для расчета пожизненной ценности клиента.
В результате в литературе, где один и тот же набор данных был переработан сотни раз, каждая модель с пороговым значением по умолчанию оставляет мизерные затраты: около 86 долларов на клиента в виде предотвратимых убытков при стандартном 20%-ном распределении тестовых данных, а в масштабе до 100 000 подписчиков с тем же профилем оттока это составило бы 8,6 миллиона долларов возмещаемых затрат; показатель оттока в IBM Telco (26,5% в год) необычайно высок, а в более здоровом сегменте B2C SaaS с годовым оттоком 5–8% показатель на одного клиента снизился бы примерно в 3–4 раза, поэтому неизменным в любой ситуации, чувствительной к затратам, остается не столько сумма в долларах, сколько асимметрия — в 13 раз дороже упустить клиента, который ушел, чем чрезмерно заботиться о лояльном клиенте.

В этой статье последовательно рассматриваются три момента: во-первых, что сообщается в литературе IBM Telco и что в ней упускается; во-вторых, как рассчитать долларовую стоимость ошибочной классификации, используя общедоступные эталонные показатели B2C SaaS 2026 года и анализ выживаемости Каплана-Мейера, без использования упрощенного расчета стоимости привлечения клиента; в-третьих, почему стандартная формула порогового значения Байеса проигрывает методу перебора, когда модель обучается на данных, сбалансированных по алгоритму SMOTE, и что с этим делать.
Все числа в этой статье можно воспроизвести с помощью скриптов, ссылки на которые приведены в конце статьи.
1. Пробел в 36 статьях
Набор данных IBM Telco Customer Churn невелик (7032 очищенные строки), упорядочен, имеет метки и уже почти десять лет является каноническим вводным набором данных об оттоке клиентов на Kaggle.
Чтобы понять, что именно измеряет общедоступный корпус данных, я проиндексировал 36 анализов на Kaggle, GitHub и в ведущих блогах по анализу данных, оценив каждый из них по десяти параметрам отчетности, начиная от показателя F1 и заканчивая кривой прибыли, основанной на CAC и LTV.
Полученная закономерность показана на рисунке 2.

Три важных вывода:
- Насыщенность : F1, точность, AUC, скриншоты матрицы ошибок и сравнения SMOTE и не-SMOTE встречаются в 80–90% корпуса, при этом настройка гиперпараметров с помощью Optuna или поиска по сетке является почти универсальным приемом.
- Редкость : кривая прибыли (общая долларовая стоимость ошибочной классификации как функция порогового значения принятия решения) встречается менее чем в 15% проанализированных мной случаев, а если и встречается, то показатели стоимости ложноотрицательных/ложноположительных результатов обычно берутся из учебника, не привязываясь к реальным показателям стоимости привлечения клиента или пожизненной ценности клиента.
- Отсутствует : ни один из 36 проиндексированных мной анализов не вычисляет пожизненную ценность клиента с помощью анализа выживаемости в зависимости от
tenure; большинство либо полностью пропускают расчет LTV, либо используют формулу Скока для стационарного состоянияLTV = ARPU / monthly_churn_rate, которая предполагает однородную клиентскую базу — что является серьезным утверждением для набора данных, где тип контракта, способ оплаты и стаж взаимодействия существенно влияют на удержание клиентов.
Пропуск анализа выживаемости важен, поскольку решение о пороговом значении зависит от LTV: если вы неправильно оцените LTV в 2 раза, вы неправильно оцените стоимость упущенного клиента в 2 раза, и оптимальный по стоимости пороговый уровень будет изменяться вместе с ним.
Следующие два раздела дополняют недостающий элемент, а затем подставляют его обратно в задачу определения порогового значения.
2. Стоимость ошибки в долларах.
Стоимость каждого прогноза в долларах определяется тремя показателями (средний доход на абонента, валовая прибыль и стоимость привлечения клиента); два из них берутся непосредственно из набора данных, а один — из общедоступных отраслевых показателей на 2026 год.
import pandas as pd df = pd.read_csv("telco.csv") df["TotalCharges"] = pd.to_numeric(df["TotalCharges"], errors="coerce") df = df.dropna().reset_index(drop=True) arpu = df["MonthlyCharges"].mean() # $64.80 mean_tenure = df["tenure"].mean() # 32.42 months churn_rate = (df["Churn"] == "Yes").mean() # 26.58 % realised_ltv_churned = df.loc[df["Churn"] == "Yes", "TotalCharges"].mean() # $1,531.80
Показатели ARPU и стажа взаимодействия являются собственными данными набора данных: средняя ежемесячная плата составляет $64.80 , средний наблюдаемый стаж взаимодействия — 32,4 месяца, а фактическая пожизненная ценность клиента (LTV) для клиентов, которые уже ушли, составляет $1,531.80 (просто средняя TotalCharges по клиентам, которые уже ушли), поэтому, если ARPU остается неизменным, три распространенных подхода к определению LTV дают совершенно разные верхние пределы:

Ни один из этих трех вариантов не является правильным ответом, а первый явно неверен. ARPU × mean_tenure — это то, к чему стремятся большинство учебных пособий, и она ошибочна в корне. ARPU — это не свойство клиента; это совокупный результат всех факторов, влияющих на отток клиентов — тип контракта, способ оплаты, пакет услуг, структура домохозяйства. Доход уходит вместе с клиентом , поэтому ARPU и срок пользования не являются независимыми величинами, и классическое разложение LTV ≈ E[ARPU] × E[lifetime] справедливо только тогда, когда Cov(ARPU, lifetime) = 0 В любом наборе данных об оттоке, который стоит моделировать, эта ковариация отлична от нуля — если бы она была равна нулю, модели нечего было бы предсказывать — и клиент с ежемесячной платой $80/month и сроком пользования 8 месяцев не является «клиентом с высоким доходом»; его $80 и 8 months — это два показателя одного и того же базового профиля риска.
Добавьте к этому тот факт, что средний доход на пользователя (ARPU) меняется в течение жизни одного и того же клиента — например, группа новых клиентов, оформивших подписку по акции, платит $30/month в течение первых трех месяцев и $80/month после этого, давний клиент, сохранивший льготный тариф в $50/month в то время как новые клиенты платят $90/month за тот же продукт — и умножение среднего значения одного распределения на среднее значение другого описывает клиента, которого нет в данных.
Формула Скока, по крайней мере, использует устойчивый уровень оттока клиентов, но предполагает, что этот уровень остается постоянным навсегда. Реализованная пожизненная ценность клиента (LTV) — это действительное число, но оно описывает только тех клиентов, которых вы уже потеряли.
Ни один из этих трех методов не показывает, когда затраты на привлечение нового клиента окупаются — для этого необходима реальная кривая удержания, о которой мы поговорим в следующем разделе, но сначала несколько слов о стоимости привлечения клиента (CAC) .
Для B2C SaaS в бенчмарках 2026 года CAC варьируется от примерно $68 (электронная коммерция) до более чем $200 (финтех), при этом продукты подписки среднего сегмента концентрируются около $150 ([1], [2]); стоимость привлечения абонентов телекоммуникационных компаний существенно выше ( $300+ после амортизации субсидий на мобильные телефоны), поэтому $150 — это консервативная оценка для этого набора данных, и выбор более высокого числа только увеличит расчет расходов в Разделе 4.

Валовая прибыль для B2C SaaS находится в диапазоне 70–85%, при этом 75% обычно является средним значением, соответствующим предположениям Дэвида Скока о моделировании экономики устойчивого состояния SaaS ([3]).
Это дает нам основу для расчета стоимости одной ошибки прогнозирования.
CAC = 150 ARPU = 64.80 REMAINING_TENURE_MONTHS = 18 FN_COST = CAC + ARPU * REMAINING_TENURE_MONTHS # $1,316.40 FP_COST = 100 # typical campaign cost (midpoint) ratio = FN_COST / FP_COST # 13.2 : 1
Ложноотрицательный результат (сообщение клиенту о том, что он останется, хотя на самом деле он уйдет) обходится вам в сумму, равную затратам на привлечение нового клиента ( $150 ) плюс 18 месяцев упущенной прибыли ( $64.80 × 18 = $1,166.40 ), что в сумме составляет $1,316.40 , в то время как ложноположительный результат (пометка клиента как потенциального клиента, который собирается остаться) обходится примерно в $100 расходов на кампанию и скидки, в результате чего соотношение затрат составляет 13,2 к 1 .
Несколько слов о том, что представляет собой эта структура и чем она не является. Стоимость привлечения клиента (CAC) $150 и стоимость ложноположительного результата $100 в этой статье являются приблизительными значениями; CAC существенно варьируется в зависимости от канала привлечения, а $100 — это сокращенное обозначение реальных затрат на мероприятия по удержанию клиентов — скидка, звонок менеджеру по работе с клиентами, обновление пакета услуг, изучение продукта. Ни одно из этих значений не является взаимозаменяемым, и повсеместная скидка не является стратегией удержания : это механизм отсрочки, который удерживает клиентов только до истечения срока действия скидки, одновременно оплачивая удержание клиентов, которые никогда не собирались уходить (и, что еще хуже, приучая их ожидать следующей скидки). Реальная стратегия удержания определяет факторы оттока — клиент, уходящий из-за постоянных сбоев backup_online , удерживается путем исправления backup_online , а не с помощью электронного письма со скидкой 10% — и выделяет бюджет на улучшение продукта, при этом стоимость кампании используется в качестве краткосрочного моста, пока инженеры не наверстают упущенное. Кривая прибыли здесь — это инструмент для установления пороговых значений, который работает после того, как вы определили свою стратегию удержания (какие мероприятия применяются к кому и с какой реальной стоимостью); Это не заменяет собой данное решение. Рассматривайте $150 и $100 как единую репрезентативную пару; разделите их, и структура будет сегментироваться вместе с ними.
Именно это соотношение является основной причиной того, почему threshold = 0.5 является неправильным значением по умолчанию: граница принятия решений должна отражать асимметрию, и мы перейдем к точной формуле, но сначала рассмотрим часть, касающуюся LTV (пожизненной ценности клиента).
3. Кривая прибыли по показателю LTV
В большинстве отчетов об оттоке клиентов пожизненная ценность клиента рассматривается как статичная денежная величина, которую нужно умножить на коэффициент риска.
Анализ выживаемости показывает лучшие результаты.
Он измеряет удержание клиентов непосредственно на основе данных и преобразует LTV в кривую: совокупная маржа прибыли на одного клиента как функция количества месяцев с момента привлечения, начиная с −CAC в нулевой день (вы заплатили за привлечение клиента и ничего не заработали) и увеличиваясь по мере того, как каждый последующий месяц добавляет к балансу ARPU × gross_margin × P(still alive) .
Основной расчет производит оценка Каплана-Мейера, где в качестве продолжительности используется tenure , а в качестве события Churn == "Yes" , что позволяет построить общую кривую, показанную на рисунке 4.
from lifelines import KaplanMeierFitter import numpy as np CAC, GROSS_MARGIN, HORIZON = 150, 0.75, 72 kmf = KaplanMeierFitter().fit(df["tenure"], (df["Churn"] == "Yes").astype(int)) months = np.arange(0, HORIZON + 1) S = kmf.survival_function_at_times(months).values monthly = ARPU * GROSS_MARGIN * S ltv_curve = np.cumsum(monthly) - CAC ltv_curve[0] = -CAC # day zero, only CAC is sunk

Три книги, которые стоит прочитать:
- Точка безубыточности на 3-м месяце (в расчете на одного клиента, а не на одного клиента) : в рамках первоначальной привлеченной когорты совокупный вклад, взвешенный по выживаемости, покрывает затраты на привлечение клиента в
$150к 3-му месяцу, а окупаемость CAC менее чем за двенадцать месяцев соответствует эмпирическому правилу Дэвида Скока, которое Telco превосходит в четыре раза. Это правильное значение для планирования расходов на удержание клиентов на уровне когорты, но это среднее значение по когорте, скрывающее бимодальную вариативность: клиент, который уходит в 1-м месяце, вносит вклад в размере одного месяца прибыли ($48.60) и никогда не окупает свои затраты на привлечение клиента, в то время как клиент, остающийся с компанией в течение 70 месяцев, вносит вклад, превышающий$3,400. Взвешивание по методу Каплана-Мейера правильно учитывает эти ранние потери — просто они не получают звездочку на кривой. - Показатель LTV на 72-месячном горизонте составляет приблизительно 2527 долларов на клиента : в сочетании с CAC в
$150это дает соотношение LTV:CAC около 17,8:1, что значительно выше минимального значения 3:1, на которое ориентируются большинство инвесторов в SaaS-компании, и является полезной проверкой того, что набор данных описывает здоровый бизнес с точки зрения экономики единицы продукции, а не бизнес, находящийся на грани краха. - На уровне когорты эффект снижения оттока незначителен : снижение оттока на 10% увеличивает конечную пожизненную ценность клиента примерно на 2,8%, а снижение на 20% — примерно на 5,7%. Таким образом, эффект реален, но не чрезмерен, и решение о привлечении клиента имеет большее значение, чем меры по его удержанию.
Разделение того же вычисления по Contract (рисунок 5) – вот где эта структура действительно оправдывает себя.

Клиент, заключивший двухлетний контракт, приносит около $3,372 за 72 месяца, в то время как клиент, оплачивающий услугу ежемесячно, приносит $1,620 (менее половины), при одинаковом среднем доходе на пользователя (ARPU) и одинаковой стоимости привлечения клиента (CAC), поэтому вся разница обусловлена удержанием клиентов; с точки зрения маркетинговых расходов, целевой клиент справа (клиент, за привлечение которого следует платить больше) — это клиент с фиксированным контрактом, даже несмотря на то, что в любой конкретный момент времени он выглядит «менее прибыльным в месяц».
Это тот тип решений, который стандартный анализ IBM Telco принять не может, поскольку он изначально не вычисляет LTV в зависимости от вероятности выживания.
4. Кривая прибыли по классификации
Имея на руках стоимость ложноотрицательных результатов (FN), стоимость ложноположительных результатов (FP) и показатель LTV, основанный на выживаемости, вопрос о пороговом значении сводится к одномерной оптимизации: обучить модель, получить прогнозируемые вероятности на тестовом наборе данных, изменить пороговое значение от 0 до 1, вычислить общую стоимость в долларах при каждом пороговом значении и выбрать минимум.
Представленная здесь модель — это оптимизированный XGBoost, обученный с помощью SMOTE только на обучающей выборке, по стандартному алгоритму Telco.
import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import confusion_matrix from imblearn.over_sampling import SMOTE from xgboost import XGBClassifier y = (df["Churn"] == "Yes").astype(int) X = pd.get_dummies(df.drop(columns=["customerID", "Churn"]), drop_first=True).astype(float) X_tr, X_te, y_tr, y_te = train_test_split( X, y, test_size=0.20, stratify=y, random_state=42) scaler = StandardScaler().fit(X_tr) X_tr_s, X_te_s = scaler.transform(X_tr), scaler.transform(X_te) X_tr_b, y_tr_b = SMOTE(random_state=42).fit_resample(X_tr_s, y_tr) model = XGBClassifier(n_estimators=400, max_depth=5, learning_rate=0.05, subsample=0.9, colsample_bytree=0.9, random_state=42, eval_metric="logloss") model.fit(X_tr_b, y_tr_b) probs = model.predict_proba(X_te_s)[:, 1] thresholds = np.linspace(0.01, 0.99, 99) totals = [] for t in thresholds: pred = (probs >= t).astype(int) tn, fp, fn, tp = confusion_matrix(y_te, pred).ravel() totals.append(fn * 1316.40 + fp * 100)
Результат представлен на рисунке 6.

Результаты, полученные на тестовом наборе данных, содержащем 1407 строк:

Переход от 0,5 к эмпирическому минимуму позволяет вернуть $121,160 на тестовом наборе данных, что составляет $86.11 per customer , а применение этого показателя к книге с 100 000 подписчиков дает в итоге $8.6M ; ваши результаты будут варьироваться в зависимости от стоимости привлечения клиента (CAC), среднего дохода на пользователя (ARPU) и кривой удержания, но именно множитель (в 13 раз дороже упустить потенциального клиента, чем чрезмерно заботиться о лояльном) делает разрыв таким значительным.
Когда формула из учебника проигрывает пороговому методу
Откройте любой справочник по классификации с учетом стоимости (каноническим является «Data Science for Business» Провоста и Фосетта [4]), и вы найдете формулу порогового значения, оптимального по Байесу:
t* = C_FP / (C_FP + C_FN)
Подставляем наше соотношение затрат: t* = 100 / (100 + 1316.40) ≈ 0.0706 , что является правильным математическим расчетом, и в модели с откалиброванными вероятностями этот порог минимизирует ожидаемые затраты; но в результате сканирования получаем t = 0.03 , и при этом пороге стоимость тестового набора на $8,661 ниже, чем при 0.07 , так где же разрыв?
Формула Байеса для оптимального решения предполагает, что прогнозируемые моделью вероятности откалиброваны: прогноз 0,5 должен соответствовать 50% истинной вероятности оттока, но наша модель обучается на сбалансированном по SMOTE наборе данных, который увеличивает долю миноритарного класса до 50% во время обучения, и затем алгоритмы обучения на основе деревьев выдают вероятности, смещенные в сторону более высоких значений, причем значение «0,07» модели примерно соответствует истинному значению 0,03 в откалиброванном пространстве вероятностей; формула из учебника не ошибочна, она применяется к нестандартным входным данным.
Есть два простых решения:
- Сначала откалибруйте вероятности : примените масштабирование Платта или изотоническую регрессию к отложенному набору данных, затем используйте байесовский оптимальный порог на откалиброванных выходных данных, используя
CalibratedClassifierCVиз библиотеки scikit-learn, который сделает это в одну строку. - Пропустите калибровку и сканирование : это дешево, это терпимо к дрейфу калибровки, и на небольшом наборе данных, таком как Telco, сканирование на тестовом наборе данных более надежно, чем калибровочная модель, построенная на сотнях отложенных строк.
На практике, для производственных систем с регулярным переобучением, большинство команд используют метод сканирования; формула — это то, чему следует обучать (с пометкой «калибровка»), и оба метода должны присутствовать в любом честном описании модели управления оттоком клиентов, чувствительной к затратам.
Ни один из них не обнаружен в проиндексированном мной корпусе данных IBM Telco.
5. О чём должна быть опубликована следующая статья об IBM Telco?
Три конкретных изменения сделают следующие 36 анализов IBM Telco более полезными, чем предыдущие 36:
Представьте кривую прибыли, а не матрицу ошибок. Показатель F1 при пороговом значении 0,5 — это турнирная метрика (полезная для ранжирования моделей, когда нужно выбрать одну, но бесполезная для принятия решения о способе ее выпуска), а кривая на рисунке 6 содержит больше информации, имеющей значение для принятия решений, чем все сравнения точности в корпусе вместе взятые.
Применяйте LTV в анализе выживаемости, а не в предположениях о стационарном состоянии. Расчет Каплана-Мейера для tenure — это 30 строк кода на Python; точка безубыточности, LTV на горизонте планирования и кривая сегментации по контрактам дают маркетинговым операциям полезный бюджет для расходов на удержание клиентов, а также обоснованный ответ на вопрос «какого клиента нам следует привлекать активнее?», а формула Скока остается скорее хорошей проверкой на адекватность, чем надежной оценкой LTV.
При указании оптимального порога Байеса следует раскрывать предположение о калибровке. Либо сначала проведите калибровку, либо явно укажите, что сообщаемый порог является эмпирическим минимумом, полученным в результате сканирования, а Ван и др. ([5]) приводят очень похожий аргумент с помощью более сложной метрики (e-Profits), которая использует анализ выживаемости от начала до конца, с той же основной идеей.
Сегментируйте вмешательство, а не только оценку. Кривая прибыли предполагает единую стоимость ложноположительного результата (цена «лечения» одного ложного срабатывания), но на практике самое дешевое вмешательство для лояльного клиента с высокой ценностью отличается от самого дешевого для нового клиента, находящегося в группе риска: обновление пакета услуг для одного, исследование ценовых рисков для другого, ничего не делать для третьего; сегментированные затраты на ложноположительные результаты (и сегментированные пороговые значения) являются естественным продолжением представленной здесь концепции.
Я ожидал, что проблема будет в моделировании. Но это не так.
Набор данных IBM Telco был тщательно изучен с точки зрения точности прогнозирования, и он по-прежнему может показать, приводят ли наши конвейеры к принятию правильных решений, а не просто к точным прогнозам.
Для этого необходимы три вещи: денежные затраты на ошибки, реальные кривые удержания клиентов и честный пороговый уровень для классификатора — четыре сценария и модель Каплана-Мейера помогут вам этого добиться.
Ссылки
[1] Genesys Growth Marketing, Показатели стоимости привлечения клиентов: 44 статистических данных, которые должен знать каждый руководитель отдела маркетинга в 2026 году (2026), genesysgrowth.com.
[2] Proven SaaS, CAC Payback Benchmarks 2026: SaaS Customer Acquisition Cost (2026), proven-saas.com.
[3] Д. Скок, Метрики SaaS 2.0: Подробные определения (2014, обновлено в 2024 г.), forentrepreneurs.com.
[4] Ф. Провост и Т. Фосетт, Наука о данных для бизнеса (2013), O'Reilly Media, гл. 7–8.
[5] Y. Wang, S. Albrecht и др., e-Profits: A Business-Aligned Evaluation Metric for Profit-Sensitive Customer Churn Prediction (2025), arXiv:2507.08860.
[6] C. Davidson-Pilon, lifelines: survival analysis in Python (2019), Journal of Open Source Software 4(40), 1317.
[7] В. Вербеке, Т. Вердонк и С. Мальдонадо, Деревья решений, ориентированные на прибыль, для прогнозирования оттока (2018), Европейский журнал операционных исследований, 284(3).
[8] Н. Эль Аттар и М. Эль-Хадж, Систематический обзор подходов к прогнозированию оттока клиентов в телекоммуникациях (2026), Frontiers in Artificial Intelligence.
Код, данные и воспроизводимые скрипты для каждой диаграммы доступны по запросу. Используемый набор данных — это набор данных IBM Telco Customer Churn, полностью синтетические примеры данных, опубликованные IBM в своем официальном репозитории (github.com/IBM/telco-customer-churn-on-icp4d) под лицензией Apache License 2.0, которая разрешает использование, производный анализ и публикацию с указанием авторства. Данные являются синтетическими и не содержат реальных клиентов или персональных данных.
Спасибо за внимание! Если у вас есть вопросы или вы хотите связаться со мной, не стесняйтесь писать мне в LinkedIn. 👋
Фабио Оливейра Посмотреть все от Фабио Оливейра
Источник: towardsdatascience.com
Похожие записи
Оцените материал:
Похожие записи
SAPPHIRE Radeon RX 9070 XT NITRO+ с адаптером питания GC-HPWR близится к выходу
18.12.2025
Festivitas позволяет украсить ваши устройства Apple праздничной иллюминацией и снегом
02.12.2025
Сексуальный подтекст андроида Эша или как Бильбо Бэггинс попал в фильм непонятной категории
22.11.2025Присоединяйтесь и подпишитесь на рассылку самых свежих новостей по Email
Получайте свежие новости и идеи на почту. Без спама — только самое интересное.
Нажимая «Подписаться», вы соглашаетесь с политикой конфиденциальности.
