1. Введение
Отток клиентов — серьезная проблема, с которой сталкиваются компании, особенно в сфере услуг, таких как телекоммуникации. Понимание и анализ уровня оттока клиентов имеет решающее значение, поскольку позволяет понять поведение клиентов, выявить факторы, способствующие оттоку, и реализовать эффективные стратегии удержания. Этот проект направлен на то, чтобы помочь телекоммуникационной компании понять свои данные и прогнозировать отток клиентов. Компания предоставила доступ к трем различным наборам данных: первый набор данных с 3000 записями, хранящимися в удаленной базе данных Microsoft SQL Server, второй набор данных с 2000 записями, хранящимися в OneDrive, и третий набор данных, размещенный в репозитории GitHub.
Цели проекта включают в себя получение информации о демографии клиентов, предоставляемых услугах и платежных реквизитах; оценка пожизненной ценности каждого клиента путем выявления факторов, влияющих на отток; и разработка прогностической модели для точного определения оттока клиентов. Следуя структуре межотраслевого стандартного процесса интеллектуального анализа данных (CRISP-DM), включающей исследование данных, обработку отсутствующих значений, разработку функций, разработку моделей, оценку, интерпретацию, оптимизацию и настройку гиперпараметров: проект направлен на предоставление ценных идей и надежная прогностическая модель для стратегий принятия решений и удержания клиентов в телекоммуникационной компании.
1.1. Обзор/описание данных
Для загрузки наборов данных были выполнены следующие шаги. Сначала были установлены необходимые библиотеки. Библиотека pyodbc использовалась для установки соединения с базой данных Microsoft SQL Server, а библиотека dotenv использовалась для загрузки переменных среды из файла .env
. Другие библиотеки, такие как numpy, pandas, matplotlib, seaborn, scikit-learn, среди прочих связаны с анализом данных и моделированием.
Для загрузки первого набора данных из базы данных SQL была создана строка подключения с использованием сервера, базы данных, имени пользователя и пароля, полученных из файла .env
. Библиотека pyodbc использовалась для установления соединения с базой данных, а для извлечения данных выполнялся запрос SQL. Затем результат был загружен в кадр данных pandas под названием df_db
.
Для второго набора данных файл Excel с именем «Telco-churn-second-2000.xlsx» был прочитан во фрейм данных pandas с именем df_excel
с использованием функции read_excel
.
Третий набор данных, файл CSV с именем «LP2_Telco-churn-last-2000.csv», был прочитан в кадр данных pandas с именем df_csv
с использованием функции read_csv
.
Чтобы организовать наборы данных в обучающие и тестовые наборы, первый набор данных из SQL Server (df_db
) и третий набор данных из CSV-файла (df_csv
) были объединены в один набор данных с помощью функции concat
. Результирующий фрейм данных был присвоен train_df
. Второй набор данных (df_excel)
был назначен тестовым набором данных (test_df)
. Эти шаги позволили загрузить и упорядочить наборы данных, заложив основу для дальнейшего анализа и задач моделирования.
На основе обзора наборов данных были сформулированы следующие вопросы и гипотезы:
Гипотеза:
H0: Уровень оттока клиентов в телекоммуникационной компании существенно не зависит от различных факторов, связанных с их демографическими данными, услугами и способами оплаты.
H1: На скорость оттока клиентов в телекоммуникационной компании влияют различные факторы, связанные с их демографией, услугами и способами оплаты.
Вопросы:
- Есть ли связь между ежемесячными платежами и вероятностью оттока?
- У клиентов, у которых есть интернет-услуги, в частности оптоволокно, более высокий уровень оттока по сравнению с теми, у кого есть DSL или нет интернет-услуг?
- Влияет ли доступность онлайн-безопасности, онлайн-резервного копирования, защиты устройств и технической поддержки на скорость оттока?
- Как показатель оттока зависит от пола клиентов?
- Влияет ли наличие партнера на вероятность оттока?
- Есть ли корреляция между сроком пребывания клиентов и их коэффициентом оттока?
Эти вопросы и гипотезы будут направлять анализ наборов данных для изучения взаимосвязи между различными факторами и коэффициентом оттока клиентов в телекоммуникационной компании.
2. Исследовательский анализ данных (EDA)
Во-первых, я изучил обучающие и тестовые наборы данных, изучив информацию в их столбцах. Я обнаружил, что в обоих наборах данных отсутствуют значения в определенных столбцах. Кроме того, столбец «SeniorCitizens» в тестовом наборе данных был в формате объекта, а в наборе данных поезда это было целое число. Как и ожидалось, в тестовом наборе данных нет столбца «Отток». Этот столбец не нужен, потому что «Churn» — это переменная, которую мы хотим предсказать. Цель состоит в том, чтобы использовать обученную модель, чтобы предсказать, будут ли клиенты в тестовых данных уходить или нет, на основе других доступных функций.
Более того, столбец TotalCharges в обоих наборах данных изначально был представлен как объектные (строковые) значения, но я преобразовал их в числовые типы данных.
Затем я проверил форму наборов данных и заметил, что в наборе данных поезда было 5043 строки и 21 столбец, а в тестовом наборе данных было 2000 строк и 20 столбцов. Это подтвердило предыдущее различие, отмеченное в отношении отсутствия столбца «Отток» в тестовом наборе данных.
Затем я проанализировал уникальные значения в каждом столбце наборов данных. Я заметил расхождения между обучающими и тестовыми наборами данных в разных столбцах.
Расхождения в уникальных значениях столбцов между обучающими и тестовыми наборами данных были следующими:
я. Столбец «SeniorCitizen»: набор данных train_df имеет логические значения (False и True), а набор данных test_df имеет числовые значения (0 и 1).
II. Столбцы «Партнер» и «Зависимые». В наборе данных train_df этот столбец содержит логические значения (Истина и Ложь) и строковые значения (Да и Нет), тогда как в наборе данных test_df они содержат категориальные значения (Да и Нет). ).
III. Столбец «PhoneService»: в наборе данных train_df эти столбцы содержат логические (True и False) и строковые значения (Yes и No), тогда как в наборе данных test_df он содержит категориальные значения (Yes и No).
IV. Столбец «MultipleLines»: в наборе данных train_df этот столбец содержит логические значения (False и True) и строковые значения (No, Yes, No phone service), а в наборе данных test_df он содержит категориальные значения (Yes, Нет и нет телефонной связи).
в. Столбцы «OnlineSecurity», «OnlineBackup», «DeviceProtection», «TechSupport», «StreamingTV» и «StreamingMovies». Данные обучения в этих столбцах содержат сочетание логических (True и False) и строковых значений ( Нет, Да, Нет интернет-сервиса), в то время как тестовые данные имеют только строковые значения (Нет, Да, Нет интернет-сервиса).
vi. Столбец «PaperlessBilling»: обучающие данные содержат логические значения (True и False) и дополнительные строковые значения («Да», «Нет») по сравнению с тестовыми данными. который имеет только строковые значения («Да», «Нет»).
vii. Столбец «PaymentMethod»: некоторые значения содержат в скобках слово «автоматически». Эти номиналы слишком длинные, чтобы их можно было использовать в качестве галочек в визуализациях.
viii. Столбец «Изменение»: набор данных train_df содержит логические значения (False и True) и категориальные значения (Нет, Нет и Да) в столбце «Изменение». Набор данных test_df не имеет столбца «Изменение», как объяснялось ранее.
Чтобы устранить эти несоответствия, я внес несколько изменений в наборы данных для обучения и тестирования, используя цикл for. Сначала я изменил столбец «SeniorCitizen» в тестовом наборе данных. Используя функцию replace()
, я заменил значения 0 и 1 на «Нет» и «Да» соответственно, чтобы добиться согласованности с набором данных поезда.
Затем я определил список под названием "columns_to_modify", который содержал имена столбцов, которые необходимо изменить как в обучающем, так и в тестовом наборах данных. Этими столбцами были: «Партнер», «Пожилой гражданин», «Зависимые», «PhoneService», «MultipleLines», «OnlineSecurity», «OnlineBackup», «DeviceProtection», «TechSupport», «StreamingTV», «StreamingMovies» и « Безбумажный биллинг».
Затем я перебрал каждый столбец в списке columns_to_modify, используя цикл for. В цикле я заменил логические значения (False/True) на «Нет» и «Да» соответственно, используя функцию replace()
. Кроме того, я заменил значение «Нет телефонной связи» на «Нет». Эти замены были сделаны в обоих наборах данных, чтобы обеспечить согласованность маркировки и представления данных.
Наконец, я изменил столбец «Churn» в наборе данных поезда. Используя функцию replace()
, я заменил значения «Нет», «Нет» и «Да» соответствующими логическими значениями «Ложь», «Ложь» и «Истина» соответственно. Это изменение было сделано для преобразования целевой переменной в двоичное представление для дальнейшего анализа и моделирования.
Затем я удалил ненужные столбцы, такие как «идентификатор клиента», из обоих наборов данных. Я также удалил слово «автоматически» из названий способов оплаты. Я также удалил «автоматический» из названий способов оплаты.
Чтобы получить представление о распределении и характеристиках числовых переменных, я изучил сводную статистику обучающих и тестовых наборов данных. Например, я проанализировал переменные «Срок пребывания» и «Ежемесячные платежи», отметив их диапазоны, средние значения, стандартные отклонения и медианы.
Я также проверил пропущенные значения в наборах данных. В наборе данных поезда были отсутствующие значения в нескольких столбцах, причем «OnlineSecurity», «OnlineBackup», «DeviceProtection», «TechSupport», «StreamingTV» и «StreamingMovies» имели наибольшее количество. В столбце «TotalCharges» отсутствовало 8 значений, а в столбце «Churn» — 1 отсутствующее значение. С другой стороны, в тестовом наборе данных в столбце «TotalCharges» отсутствовало только 3 значения.
Чтобы обработать отсутствующие значения в столбце «TotalCharges» обоих наборов данных, я заметил, что у них срок владения равен 0, хотя «MontlyCharges» не был нулевым для этих записей. Эта информация оказалась противоречивой, и поэтому я исключил эти наблюдения из набора данных. При этом в тестовом наборе данных не было пропущенных значений.
Кроме того, я заменил отсутствующие значения, которые были обозначены «Нет» на NaN в столбцах «MultipleLines», «OnlineSecurity», «OnlineBackup», «DeviceProtection», «TechSupport», «StreamingTV» и «StreamingMovies» набора данных поезда. . Затем я заменил недостающие значения в этих столбцах значением режима. Все отсутствующие значения в обучающих и тестовых наборах данных были обработаны.
Я также проверил наличие повторяющихся значений в наборах данных. В наборе данных поезда было 10 дубликатов, которые я удалил, чтобы обеспечить целостность данных. Точно так же в тестовом наборе данных было 3 дубликата, которые были удалены.
Наконец, я сохранил измененный набор данных о поездах в новом CSV-файле под названием «Train_Data.csv» для будущего использования в визуализации PowerBI.
Кроме того, я сопоставил столбец «Изменение» с числовыми значениями, поскольку файл CSV для визуализации PowerBI, требующий категориальных значений, уже сохранен.
Двумерный и многомерный анализ
В своем анализе оттока клиентов я провел двумерный и многомерный анализ, чтобы выявить ключевые факторы, влияющие на отток клиентов. С помощью различных визуализаций я исследовал взаимосвязь между переменными, такими как ежемесячная плата, тип интернет-услуги, тип контракта, срок пребывания в должности и демографические данные клиентов. Выводы показали, что клиенты с более высокими ежемесячными платежами и услугами оптоволоконного интернета с большей вероятностью уйдут. Кроме того, клиенты с более коротким сроком пребывания, ежемесячными контрактами и определенными способами оплаты имели более высокие показатели оттока. Эти анализы предоставили ценную информацию о факторах, влияющих на отток клиентов, и могут помочь компаниям разработать стратегии для улучшения удержания клиентов.
Проверка гипотез и ответы на вопросы
Проверка гипотезы
Чтобы получить представление о факторах, влияющих на отток клиентов, я провел проверку гипотез, сгруппировав столбцы на основе демографических данных, услуг и способов оплаты. Затем я провел тест независимости хи-квадрат для каждой группы, сравнив скорость оттока клиентов с различными факторами в каждой группе.
Нулевая гипотеза была отвергнута для всех трех групп: демография, услуги и способы оплаты. Это означает, что существует статистически значимая связь между факторами внутри каждой группы и коэффициентом оттока клиентов. Другими словами, демография, услуги и способы оплаты влияют на отток клиентов.
Отвечая на вопросы
а. Есть ли связь между ежемесячными платежами и вероятностью оттока?
Я визуализировал распределение ежемесячных платежей для клиентов, которые ушли, и тех, кто не ушёл. Блочная диаграмма предполагает, что клиенты, которые уходят, как правило, имеют немного более высокие ежемесячные платежи.
б. У клиентов, у которых есть интернет-услуги, в частности оптоволокно, более высокий уровень оттока по сравнению с теми, у кого есть DSL или нет интернет-услуг?
Анализ коэффициента оттока в зависимости от типа интернет-услуг показал, что клиенты с оптоволоконным интернет-сервисом, как правило, имеют более высокий коэффициент оттока по сравнению с клиентами с DSL.
в. Влияет ли доступность онлайн-безопасности, онлайн-резервного копирования, защиты устройств и технической поддержки на скорость оттока?
Клиенты, которым не хватало онлайн-безопасности, онлайн-резервного копирования, защиты устройств или технической поддержки, имели более высокие показатели оттока по сравнению с теми, у кого были эти услуги.
д. Как показатель оттока зависит от пола клиентов?
Нет существенной разницы в показателях оттока между клиентами мужского и женского пола.
е. Влияет ли наличие партнера на вероятность оттока?
Клиенты без партнера, как правило, имеют немного более высокий уровень оттока по сравнению с теми, у кого есть партнер.
ф. Есть ли корреляция между сроком пребывания клиентов и их коэффициентом оттока?
Существует слабая отрицательная корреляция между сроком пребывания в должности и коэффициентом оттока. Клиенты с меньшим сроком действия (меньшее количество месяцев подписки) с большей вероятностью уйдут. Однако по мере увеличения срока пребывания уровень оттока постепенно снижается, что указывает на то, что клиенты с более длительным сроком пребывания более лояльны и менее склонны к оттоку.
Из этого анализа телекоммуникационная компания может извлечь ценную информацию для улучшения стратегий удержания клиентов.
Разработка функций
На этапе разработки функций я выполнил однократное кодирование категориальных переменных в наборах данных поезда и теста. Этот процесс включает преобразование категориальных столбцов в числовые представления, которые будут использоваться в моделях машинного обучения.
Для набора данных поезда я использовал функцию pd.get_dummies()
для выполнения быстрого кодирования в выбранных категориальных столбцах. Параметр drop_first=True
использовался для удаления первой категории в каждом закодированном столбце, чтобы избежать мультиколлинеарности. Полученный набор данных закодированного поезда был сохранен в train_df_encoded
DataFrame.
Затем я создал новый DataFrame с именем train_int_df
, который содержит числовые столбцы из набора данных поезда, а именно «срок пребывания», «ежемесячные расходы», «общие расходы» и «отток». Этот DataFrame включает числовую информацию, которая будет использоваться вместе с закодированными категориальными переменными.
Чтобы создать окончательный набор данных поезда, я провел горизонтальную конкатенацию, используя функцию pd.concat()
с параметром axis=1
. Это объединило train_df_encoded
и train_int_df
DataFrames, в результате чего появился train_df_final
DataFrame. Этот окончательный набор данных содержит как закодированные категориальные переменные, так и числовые переменные, необходимые для моделирования.
Я следовал аналогичному процессу для тестового набора данных. Используя pd.get_dummies()
, я выполнил однократное кодирование выбранных категориальных столбцов в тестовом наборе данных, а закодированные данные были сохранены в test_df_encoded
DataFrame. test_int_df
DataFrame был создан для хранения числовых столбцов "tenure", "MonthlyCharges" и "TotalCharges" из тестового набора данных.
Как и в наборе данных поезда, я выполнил горизонтальную конкатенацию, используя pd.concat()
с axis=1
, чтобы соединить закодированные категориальные переменные в test_df_encoded
и числовые переменные в test_int_df
. Результирующий DataFrame, test_df_final
, представляет окончательный обработанный тестовый набор данных.
Чтобы гарантировать сохранение очищенных и закодированных тестовых данных для использования в будущем, я сохранил их в CSV-файле с именем Test_Data.csv, используя функцию to_csv()
с параметром index=False
. Этот файл будет использоваться для тестирования обученной модели на невидимых данных после ее оценки с использованием набора данных проверки.
После правильного кодирования категориальных переменных как в обучающем, так и в тестовом наборах данных полученные кадры данных теперь готовы для дальнейшего моделирования и анализа.
Моделирование
Я выполнил несколько шагов для моделирования и оценки данных для прогнозирования оттока. Вот что произошло:
Во-первых, я разделяю данные поезда и теста на переменные X и Y, где X_test представляет набор тестовых данных.
Затем я разделил переменные X и y на наборы для обучения и оценки, используя функцию train_test_split. Обучающий набор был дополнительно разделен на функции (X_train) и целевую переменную (y_train), а оценочный набор состоял из X_eval и y_eval.
Чтобы обеспечить согласованность масштабирования функций, я применил MinMaxScaler как к функциям обучения (X_train), так и к функциям оценки (X_eval). Затем я преобразовал масштабированные функции обратно в DataFrames.
Чтобы устранить несбалансированный набор данных, я использовал алгоритм SMOTE для балансировки данных путем передискретизации класса меньшинства. Это привело к созданию X_train_balanced и y_train_balanced.
Чтобы оценить различные модели машинного обучения, я инициализировал пустые словари и создал пустой фрейм данных под названием «Результаты» для хранения результатов оценки. Затем я инициализировал несколько моделей, в том числе логистическую регрессию, случайный лес, K-ближайших соседей, классификатор дерева решений, классификатор повышения градиента и гауссовский наивный байесовский метод.
Используя несбалансированный набор данных, я обучил каждую модель, сделал прогнозы по оценочному набору (X_eval_scaled) и оценил их производительность. Метрики оценки включали матрицу путаницы, отчет о классификации, достоверность, прецизионность, полноту и оценку F1. Результаты были сохранены в DataFrame «Результаты».
После оценки всех моделей я определил модель с лучшим показателем F1 как модель логистической регрессии.
Чтобы дополнительно оценить производительность модели логистической регрессии, я применил перекрестную проверку в k раз с пятью кратностями. Я рассчитал баллы F1 для каждой складки и получил средний балл F1 и стандартное отклонение. Средний балл F1 составил 0,83, что указывает на достаточную точность прогнозирования оттока, в то время как стандартное отклонение 0,01 указывает на постоянную производительность по всем складкам.
Чтобы улучшить модель логистической регрессии, я выполнил настройку гиперпараметров с помощью перекрестной проверки поиска по сетке. Я определил сетку гиперпараметров с разными значениями для «штрафа» и «С». Метрика подсчета очков была установлена как оценка F1. Затем был выполнен поиск по сетке, и были получены лучшие гиперпараметры и соответствующие баллы F1. Лучшими гиперпараметрами были {'C': 0,01, «штраф»: «12»}, а лучший показатель F1 был 0,81.
Заключение
В целом, этот проект демонстрирует эффективность моделей машинного обучения в прогнозировании оттока в наборе телекоммуникационных данных. В частности, модель логистической регрессии показала многообещающие результаты. Используя такие методы, как масштабирование функций, балансировка данных, перекрестная проверка и настройка гиперпараметров, я повысил прогностическую эффективность модели. Этот проект предоставляет ценную информацию для предприятий телекоммуникационной отрасли, стремящихся уменьшить отток клиентов и удержать своих клиентов.
Для более глубокого понимания проекта, включая подход, анализ данных, создание модели и оценку, вы можете посетить мой репозиторий GitHub. Репозиторий содержит полную документацию и реализацию кода, предлагая подробный обзор проекта. Он служит ценным ресурсом для понимания сложностей прогнозирования оттока клиентов в телекоммуникационной отрасли. Чтобы получить доступ к репозиторию, перейдите по предоставленной Ссылке на репозиторий GitHub.