Вы можете найти код в репозитории проекта Github здесь или просмотреть финальные слайды презентации здесь.

Зачем изучать отток клиентов?

Отток клиентов - одна из самых серьезных проблем, с которыми сталкивается большинство предприятий. Согласно Harvard Business Review, поиск нового клиента обходится в 5–25 раз дороже, чем удержание существующего. Другими словами, ваши существующие клиенты на вес золота!

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

Фон

Я использовал набор данных с Kaggle.com, который включал 7 033 уникальных записей о клиентах для телекоммуникационной компании Telco. Каждая запись содержала информацию о клиенте, которая включала такие функции, как:

Услуги - услуги, на которые подписан клиент (Интернет, телефон, кабельное телевидение и т. Д.)

Сумма ежемесячного счета

Срок владения - как долго они были клиентом

Основная демографическая информация - были ли они пожилыми людьми, были ли они на иждивении и т. Д.

Для целей нашего исследования зависимой переменной было то, был ли клиент «оттока» или нет в течение последнего месяца. Фактически, полные 27% наших клиентов были отмечены как ушедшие из компании в течение последнего месяца. При таком высоком уровне выбытия компания потеряет большую часть своих клиентов всего за несколько месяцев. своих клиентов - если мы не вмешиваемся.

Предположения

Для целей нашего анализа мы сделали 2 предположения:

  1. Для каждого клиента, ушедшего из компании, замена этого клиента будет стоить телекоммуникационной компании 500 долларов. Маркетинг, реклама, кампании и охват - затраты складываются.
  2. Мы могли удержать каждого покупателя, который мог уйти, вложив в него 100 долларов. Это может быть за счет скидок, улучшения обслуживания (например, увеличения скорости интернета) или предложения льгот.

Установка планки

Чтобы объявить о победе, нам нужно знать, как выглядит успех! Нашей основной мерой успеха будет то, насколько хорошо наша модель работает по сравнению с фиктивной моделью по умолчанию. Думайте об этом как о варианте «статус-кво». Поскольку мы знаем, что потратив 100 долларов на удержание клиента, мы сэкономим 500 долларов в долгосрочной перспективе - но мы не знаем, какие клиенты, скорее всего, откажутся от него - наша «фиктивная» модель по умолчанию просто тратит 100 долларов на всех наших клиентов, чтобы мы могли привлечь тех, кто уходит. Это модель, которую мы будем стремиться превзойти.

Методология

Для нашей модели мы сначала рассмотрели несколько различных алгоритмов машинного обучения, чтобы понять, с какими из них двигаться дальше. Нашим первым шагом было разделить наши данные на обучающие и тестовые наборы с помощью метода «обучение-тест-разбиение», что позволило бы нам позже проверить наши результаты на перекрестной проверке. Мы также стратифицировали разделение «поезд-тест», чтобы обеспечить одинаковую долю целевой переменной как в обучающем, так и в тестовом наборе.

# Stratify our train-test-split so that we have a balanced split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=40, stratify=y)

Мы также использовали некоторую передискретизацию меньшинства, чтобы сбалансировать наш набор данных. Поскольку только ~ 27% записей в нашей базе данных были помечены как «перемешанные», передача наших данных в наш алгоритм без передискретизации привела бы к недооценке нашей целевой переменной. Мы использовали SMOTE imblearn, чтобы довести наш класс меньшинства до 50% нашего набора данных.

sm = SMOTE(random_state=42, ratio=1.0)
X_train_res, y_train_res = sm.fit_sample(X_train, y_train)

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

X_train_2, X_test_2, y_train_2, y_test_2 = train_test_split(X_train_res, y_train_res, test_size=0.33, random_state=20)

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

Основываясь на этом графике, мы определили, что будем двигаться дальше с 4 основными моделями классификации: логистическая регрессия, повышение градиента, случайный лес и AdaBoost. Мы решили настроить эти модели, чтобы получить от них максимальную отдачу.

Для нашего анализа целевой метрикой была отзывчивость. Мы больше всего заботимся о том, чтобы получить как можно больше истинных положительных результатов (людей, которые могут отказаться от нашей модели), и нас меньше беспокоит то, что мы можем получить некоторые ложные отрицательные результаты (люди, которые не сбились) вместе с ними.

Зная об этом, мы затем использовали функцию GridSearchCV в Sci-Kit Learn, которая позволяет нам настроить нашу модель. Мы установили отзыв в качестве показателя оценки для оптимизации, а затем использовали комбинации различных гиперпараметров, чтобы найти модель, которая лучше всего подходит. Нашей целью было выжать из наших моделей все, что только возможно, и не меньше!

pipe = Pipeline([('scaler', StandardScaler()),
                 ('clf', RandomForestClassifier())])
​
param_grid = [{'clf__max_depth': [4, 5, 6],
               'clf__max_features': [5, 10, 15, 20],
               'clf__n_estimators': [50, 100, 150]}]
​
gs = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1, scoring='recall')
gs.fit(X_train_res, y_train_res)

GridSearchCV также включает удобную функцию перекрестной проверки (это то, что обозначает CV!), Поэтому мы выполняли перекрестную проверку стратифицированных K-складок при прохождении каждой модели новых параметров. Излишне говорить, что мы очень тщательно пытались избежать переобучения наших моделей.

Наконец, большая часть нашего анализа была связана с созданием функции «чистой экономии долларов», которая определяла бы, сколько денег мы потратили на удержание клиентов по сравнению с тем, сколько мы сэкономили, не заменяя их. . Это, наряду с отзывом, составило критерий принятия решения, по которому мы судили, была ли у нас успешная модель.

Полученные результаты

После настройки наших моделей, мы получили 3 модели с прямым вырезом. Нашим последним шагом была корректировка порога вероятности для каждой модели (от i = 0,01 до i = 1). Это позволило нам оптимизировать нашу функцию «чистой экономии долларов». По сути, для каждого порога вероятности i мы просили нашу модель предсказать, откажется клиент или нет - даже с очень низкими и очень высокими i-значениями. Конечно, когда i приближается к 0, наши модели по существу предсказывают, что все будут отказываться - и, наоборот, когда оно приближается к 1, что никто не откажется. Построив эту функцию, мы смогли увидеть точную вероятность, которая оптимизировала нашу функцию «чистой экономии долларов».

В конце концов, победу одержала модель логистической регрессии. Она показала отличную отзывчивость на уровне 81% и максимизировала нашу функцию «чистой экономии долларов». В целом наша модель сэкономила нам 272 200 долларов, что легко превзошло модель «статус-кво». Эта модель сэкономила всего (ничтожную) 162 000 долларов.

Спасибо за прочтение! Если вам понравился пост, найди меня в LinkedIn, похлопай на Medium или напиши мне сюда по электронной почте. Вперед и вверх, друзья!