Перейти к основному контенту

Data Science в маркетинге: прогноз оттока клиентов

Узнайте, как использовать модели машинного обучения на Python для прогнозирования оттока клиентов и превращать маркетинговые данные в практические инсайты.
Обновлено 31 авг. 2026 г.  · 10 мин читать

Изучить с помощью AI

ChatGPTClaudePerplexity

 

Введение 

За последние 10–15 лет, по мере развития цифровых технологий, маркетинговые стратегии заметно изменились. Известные бренды и нишевые игроки накопили огромные массивы данных о транзакциях, покупках, предпочтениях, платёжеспособности, покупательной активности, демографии, отзывах и т. д. Все эти данные помогают маркетологам понимать поведение клиентов на разных этапах — от намерения купить до реальной покупки и перехода в разряд постоянных клиентов. Здесь и раскрывается потенциал data science.

Data science превращает большие данные маркетинга в практические выводы, даже если на первый взгляд они могут быть неочевидны — например, скрытые паттерны поведения и совместные проявления. В результате маркетологи лучше видят целевую аудиторию, привлекают новых и удерживают текущих клиентов, оптимизируют стратегии, повышают узнаваемость компании, создают более результативные рекламные кампании, подключают новые каналы и, в итоге, значительно увеличивают выручку.

Один из самых типичных сценариев применения data science в маркетинге — прогнозирование оттока клиентов. Разберём эту тему подробнее.

Кейс использования Data Science в маркетинге: прогноз оттока клиентов

Отток клиентов — это склонность пользователей отменять подписку на сервис, которым они пользовались, и, соответственно, переставать быть его клиентами. Показатель оттока — это доля ушедших клиентов за заданный период. Это противоположность показателю прироста клиентов, который отслеживает новых пользователей.

Показатель оттока — важный индикатор удовлетворённости клиентов и общего здоровья бизнеса. Помимо естественного оттока, который присутствует в любом бизнесе, или сезонного оттока, характерного для отдельных услуг, есть и другие факторы, сигнализирующие, что в компании что-то пошло не так и это следует исправить. Среди них:

  • отсутствие или низкое качество клиентской поддержки,
  • негативный опыт клиентов,
  • переход к конкуренту с лучшими условиями или ценовой политикой,
  • изменение приоритетов у клиентов,
  • длительные клиенты перестали быть довольны,
  • сервис не оправдал ожиданий клиентов,
  • финансовые трудности,
  • защита от мошенничества при платежах клиентов.

Высокий отток — серьёзная проблема для любой компании по следующим причинам:

  • Он напрямую коррелирует с потерей выручки.
  • Привлечение новых клиентов обходится значительно дороже, чем удержание существующих. Особенно это верно для высококонкурентных рынков.
  • Если клиенты уходят из-за плохого сервиса, репутация компании может серьёзно пострадать из‑за негативных отзывов бывших клиентов в соцсетях и на сайтах с отзывами.

Удержание клиентов — ключевой элемент стратегии для всех сервисов по подписке. Чтобы прогнозировать отток и предпринимать профилактические меры, необходимо собирать и анализировать данные о поведении клиентов (интервалы покупок, общий стаж клиента, отмены, последующие звонки и сообщения, онлайн‑активность) и выявлять признаки и их сочетания, характерные для тех, кто в группе риска. Зная заранее, какие клиенты могут вскоре уйти, особенно если это высокодоходные или давние клиенты, компания может сосредоточиться именно на них и разработать эффективную стратегию, чтобы попытаться их удержать. Подход может включать персональный звонок с предложением подарка, скидки, апгрейда подписки по той же цене или иного индивидуального предложения.

Технически прогноз оттока — это типичная задача классификации в машинном обучении: клиенты маркируются как «да» или «нет» с точки зрения риска ухода. Разберём этот кейс на Python с использованием реальных данных.

Мы смоделируем отток в телеком‑бизнесе, где у клиента может быть несколько услуг одного оператора в рамках одного основного договора. Набор данных содержит признаки, отражающие очищенную активность клиентов, и метку оттока, указывающую, ушёл клиент или нет.

Посмотрим на данные и распределение оттока:

import pandas as pd

telcom = pd.read_csv('telco.csv')
print(f'Number of customers: {telcom.shape[0]:,}\n'
      f'Churn values: {set(telcom['Churn'])}\n\n'
      f'Churn distribution, %:\n{round(telcom.groupby(['Churn']).size()/telcom.shape[0]*100).convert_dtypes()}')
Number of customers: 7,032
Churn values: {0, 1}

Churn distribution, %:
Churn
0    73
1    27
dtype: float64

27% клиентов ушли — это довольно высокий показатель. По сравнению с предыдущим кейсом по data science, в этом наборе данных, однако, нет серьёзного дисбаланса классов.

Теперь подготовим данные к применению методов машинного обучения для прогнозирования оттока. Для этого разделим данные на обучающую и тестовую выборки и выделим признаки и целевую переменную:

from sklearn.model_selection import train_test_split

target = ['Churn']
custid = ['customerID']

cols = [col for col in telcom.columns if col not in custid + target]

X = telcom[cols]
y = telcom[target]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

Первая модель, которую мы используем для прогнозирования и оценки точности, — это простая логистическая регрессия:

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

lr = LogisticRegression()
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.8009

Далее добавим в модель логистической регрессии ещё одну возможность — запустим её на масштабированных данных с L1‑регуляризацией, чтобы одновременно с обучением выполнить отбор признаков. Разные значения параметра C (обратная величина силы регуляризации) влияют на точность модели. Пока зададим C равным 0.025:

lr = LogisticRegression(penalty='l1', C=0.025, solver='liblinear')
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.7969

Теперь настроим параметр C для L1‑регуляризации, чтобы найти оптимальное значение, которое уменьшит сложность модели при сохранении хороших метрик качества. Для этого переберём разные значения C, обучим по ним логистическую регрессию и рассчитаем метрики.

Список C заранее сформирован с возможными значениями параметра. Массив l1_metrics содержит 3 столбца: первый — значения C, два следующих — заполнители для числа ненулевых коэффициентов и точности модели. Попробуем этот подход:

 C  Non-Zero Coeffs  Accuracy
0  1.0000             23.0  0.801479
1  0.5000             22.0  0.799204
2  0.2500             21.0  0.802048
3  0.1000             20.0  0.802617
4  0.0500             18.0  0.802048
5  0.0250             13.0  0.796928
6  0.0100              5.0  0.790102
7  0.0050              3.0  0.783276
8  0.0025              2.0  0.745734

Видно, что меньшие значения C сокращают число ненулевых коэффициентов (то есть используемых признаков), уменьшая сложность модели, но одновременно снижают точность. Оптимальным выглядит C = 0.05: количество признаков уменьшается до 18, а точность чуть выше, чем у нерегуляризованной модели.

Теперь попробуем другой алгоритм — модель решающего дерева:

from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.7275

Чтобы выбрать более точную модель и избежать переобучения, можно настроить глубину дерева (параметр max_depth) и определить её оптимальное значение. Технически процесс схож с подбором оптимального C в логистической регрессии: переберём варианты max_depth, обучим дерево для каждого и посчитаем метрики.

Список depth_list заранее сформирован с возможными значениями параметра. Массив depth_tuning содержит 2 столбца: первый — кандидаты глубины, второй — заполнитель для точности. Применим этот подход и найдём оптимальную глубину:

depth_list = list(range(2, 15))
depth_tuning = np.zeros((len(depth_list), 2))
depth_tuning[:, 0] = depth_list

for index in range(len(depth_list)):
    clf = DecisionTreeClassifier(max_depth=depth_list[index])
    clf.fit(X_train, y_train)
    predictions = clf.predict(X_test)
    depth_tuning[index, 1] = accuracy_score(y_test, predictions)
   
col_names = ['Max_Depth', 'Accuracy']
print(pd.DataFrame(depth_tuning, columns=col_names))
 Max_Depth  Accuracy
0         2.0  0.756542
1         3.0  0.783276
2         4.0  0.782708
3         5.0  0.791809
4         6.0  0.778157
5         7.0  0.780432
6         8.0  0.757110
7         9.0  0.762230
8        10.0  0.763936
9        11.0  0.752560
10       12.0  0.745165
11       13.0  0.732651
12       14.0  0.727531

Точность сначала растёт с увеличением глубины, а затем начинает снижаться. При max_depth = 5 дерево показывает наивысшую точность, значит это можно считать оптимальной глубиной.

Определив лучшие значения параметров для логистической регрессии и решающего дерева, восстановим эти модели, а затем выявим и интерпретируем ключевые факторы, повышающие или снижающие отток.

Для логистической регрессии извлечём и изучим экспоненты полученных коэффициентов:

# Reconstructing the best model
lr = LogisticRegression(penalty='l1', C=0.05, solver='liblinear')
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)

# Combining feature names and coefficients into one dataframe
feature_names = pd.DataFrame(X_train.columns, columns=['Feature'])
log_coef = pd.DataFrame(np.transpose(lr.coef_), columns=['Coefficient'])
coefficients = pd.concat([feature_names, log_coef], axis=1)

# Calculating exponents of the coefficients
coefficients['Exp_Coefficient'] = np.exp(coefficients['Coefficient'])

# Removing coefficients that are equal to zero
coefficients = coefficients[coefficients['Coefficient']!=0]
print(coefficients.sort_values(by=['Exp_Coefficient']))
                          Feature  Coefficient  Exp_Coefficient
21                          tenure    -0.907750         0.403431
4                 PhoneService_Yes    -0.820517         0.440204
17               Contract_Two year    -0.595271         0.551413
8                  TechSupport_Yes    -0.418254         0.658195
16               Contract_One year    -0.414158         0.660896
5               OnlineSecurity_Yes    -0.412228         0.662173
6                 OnlineBackup_Yes    -0.143100         0.866667
3                   Dependents_Yes    -0.039299         0.961463
7             DeviceProtection_Yes    -0.017465         0.982687
11            PaperlessBilling_Yes     0.071389         1.073999
1                SeniorCitizen_Yes     0.097904         1.102857
19  PaymentMethod_Electronic check     0.188533         1.207477
22                  MonthlyCharges     0.901454         2.463182

Видно, что наибольшее влияние на шансы ухода оказывает tenure (стаж клиента). В целом экспоненты коэффициентов меньше 1 уменьшают шансы оттока, а больше 1 — увеличивают.

Для решающего дерева извлечём и визуализируем правила if-else:

# Reconstructing the best model
clf = DecisionTreeClassifier(max_depth=5)
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)

from sklearn import tree
import graphviz

# Exporting a graphviz object from the trained decision tree
exported = tree.export_graphviz(decision_tree=clf,
                                out_file=None,
                                feature_names=cols,
                                precision=1,
                                class_names=['Not churn', 'Churn'],
                                filled=True)
graph = graphviz.Source(exported)
display(graph)

Дерево решений в машинном обучении

Получилась наглядная визуализация дерева решений, которую можно интерпретировать как набор правил if-else сверху вниз. Снова видим, что tenure — важнейшая переменная, определяющая отток. Дерево можно построить и глубже — это даст больше инсайтов по другим переменным.

Дальше можно тоньше настраивать параметры моделей, пробовать разные стратегии разбиения на train/test, применять и сравнивать другие алгоритмы машинного обучения, а также анализировать различные метрики для оценки качества.

Если хотите глубже разобраться в прогнозировании оттока и других применениях data science в маркетинге, обратите внимание на курс Machine Learning for Marketing in Python — это хорошая отправная точка.

Темы
Data Science
Машинное обучение