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

  • «Пол», «Старший гражданин», «Партнер», «Иждивенцы»,
  • «Владение», «Телефонное обслуживание», «Несколько линий», «Интернет-сервис»,
  • «OnlineSecurity», «OnlineBackup», «DeviceProtection», «Истощение»
  • «TechSupport», «StreamingTV», «StreamingMovies», «Contract»,
  • «Безбумажный биллинг», «Метод оплаты», «Ежемесячные платежи», «Общие расходы»

Перво-наперво, прежде чем импортировать какие-либо данные для работы, нам понадобится несколько библиотек. Мы будем использовать следующее.

import sklearn
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

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

df = pd.read_csv(r"C:\Users\leerowe\Desktop\customer_attrition.csv")
df.shape

(7043, 21) - это результат, который нам дан, что означает, что есть 21 различный столбец или переменная для работы, это переменные, которые указаны в списке выше. Вы можете заметить, что в указанном списке всего двадцать, и это потому, что я решил опустить столбец «customerID», поскольку он действительно не дает нам ничего ценного в данной ситуации.

df = df.drop('customerID', axis=1)

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

df.isnull().sum()

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

df.describe()

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

df['Attrition'].value_counts()

Результат этого кода возвращает нам 5 174 для категории Нет и 1869 для категории Да. Давайте посмотрим на то, что отображается визуально с помощью Seaborn.

sns.countplot(df['Attrition'])

amountKept = df[df.Attrition == 'No'].shape[0]
amountLost = df[df.Attrition == 'Yes'].shape[0]

Мы можем использовать переменные, которые мы создали выше, чтобы выполнить базовую математику и получить обратно некоторые проценты.

print(amountKept/(amountKept + amountLost) * 100,'% of customers stayed in the company')
print(amountLost/(amountKept + amountLost) * 100, '% of customers left with the company')

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

X = df.drop('Attrition', axis=1)
y = df['Attrition']
X = StandardScaler().fit_transform(X)

Теперь что касается сплита, мы выполним сплит 80/20.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

После того, как мы разделили все наши данные так, как нам хотелось бы, теперь нам нужно будет подогнать нашу модель. Кроме того, на этом этапе мы собираемся установить прогнозы для переменной, чтобы мы могли использовать classification_report (), чтобы хорошо рассмотреть все детали нашего теста.

model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)

Теперь для отчета о классификации, чтобы увидеть наши показатели запоминания, точности и f1, или, другими словами, насколько «точно» мы делаем прогнозы.

print(classification_report(y_test, predictions))

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