Слушайте данные с любопытством и внимательно!

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

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

Начнем с чтения данных в фрейм данных Pandas:

import numpy as np
import pandas as pd
df = pd.read_csv("Telco-Customer-Churn.csv")

Первое, что нужно сделать, это проверить, что у нас есть.

df.shape
(7043, 21)
df.columns
Index(['customerID', 'gender', 'SeniorCitizen', 'Partner', 'Dependents','tenure', 'PhoneService', 'MultipleLines', 'InternetService','OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport','StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling',
'PaymentMethod', 'MonthlyCharges', 'TotalCharges', 'Churn'],
dtype='object')

Набор данных включает 7043 наблюдения (строки) и 21 объект (столбец) каждого наблюдения. Одна функция, «отток», является целевой переменной, которую мы стремимся предсказать, используя другие 20 функций. Целевая переменная является зависимой переменной, а остальные 20 функций - независимыми переменными.

Давайте посмотрим на первые 5 строк фрейма данных с помощью метода head:

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

pd.set_option("display.max_columns", 21)

Этот набор данных предварительно очищен, поэтому в нем нет отсутствующих значений, но для начала рекомендуется проверить и обработать отсутствующие значения:

df.isna().sum().sum()
0

Как и ожидалось, у нас нет пропущенных значений. df.isna (). sum () возвращает количество пропущенных значений в каждом столбце. Добавив еще одно суммирование, мы можем увидеть общее количество пропущенных значений во всем фрейме данных. Ниже приводится подробный пост о том, как найти и обработать отсутствующие значения:



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

df.Churn.value_counts()
No     5174
Yes    1869
Name: Churn, dtype: int64
plt.figure(figsize=(10,6))
sns.countplot('Churn', data=df).set_title('Distribution of Target Variable')

Целевая переменная имеет несбалансированное распределение классов. Положительный класс (Отток = Да) намного меньше положительного класса (Отток = Нет). Несбалансированное распределение классов отрицательно влияет на производительность модели машинного обучения. Для решения этой проблемы можно использовать повышающую или понижающую дискретизацию. Повышающая дискретизация увеличивает количество образцов класса с меньшим количеством образцов путем случайного выбора из него строк. Даунсэмплинг - это аналогичная процедура, применяемая к доминирующему классу для уменьшения количества наблюдений.

Давайте также проверим распределение независимых переменных. Мы можем начать с бинарных категориальных функций:

fig, axes = plt.subplots(2, 3, figsize=(12, 7), sharey=True)
sns.countplot("gender", data=df, ax=axes[0,0])
sns.countplot("SeniorCitizen", data=df, ax=axes[0,1])
sns.countplot("Partner", data=df, ax=axes[0,2])
sns.countplot("Dependents", data=df, ax=axes[1,0])
sns.countplot("PhoneService", data=df, ax=axes[1,1])
sns.countplot("PaperlessBilling", data=df, ax=axes[1,2])

В переменных SeniorCitizen и PhoneService наблюдается высокий дисбаланс. Большинство клиентов не являются старшими, и у большинства клиентов есть телефонная служба.

Мы также должны проверить распределения других категориальных переменных.

sns.countplot("InternetService", data=df)

Оптоволоконный кабель используется чаще, чем DSL, и есть клиенты, у которых нет доступа в Интернет.

fig, axes = plt.subplots(2, 3, figsize=(12, 7), sharey=True)
sns.countplot("StreamingTV", data=df, ax=axes[0,0])
sns.countplot("StreamingMovies", data=df, ax=axes[0,1])
sns.countplot("OnlineSecurity", data=df, ax=axes[0,2])
sns.countplot("OnlineBackup", data=df, ax=axes[1,0])
sns.countplot("DeviceProtection", data=df, ax=axes[1,1])
sns.countplot("TechSupport", data=df, ax=axes[1,2])

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

«Контракт» и «PaymentMethod» также являются категориальными переменными, поэтому мы можем проверять их аналогичным образом.

Давайте также посмотрим, как выглядят распределения непрерывных переменных.

fig, axes = plt.subplots(1,2, figsize=(12, 7))
sns.distplot(df["tenure"], ax=axes[0])
sns.distplot(df["MonthlyCharges"], ax=axes[1])

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

Связь независимых переменных с целевой (зависимой) переменной также очень важна. Нам нужно выявить корреляции и посмотреть, как каждая функция влияет на целевую переменную.

Мы можем использовать корреляционную матрицу для непрерывных переменных или функцию pandas groupby для исследования категориальной переменной. Перед тем, как начать этот шаг, нам нужно произвести небольшую манипуляцию с целевой переменной. Классы в столбце «Отток» представлены как «Да» и «Нет». Для численного анализа нам нужно изменить «Да» на 1 и «Нет» на 0:

new = {'Yes':1, 'No':0}
df.Churn = df.Churn.replace(new)

Начнем с функций «SeniorCitizen» и «Partner». Порядок не имеет значения, если вы подробно исследуете каждую переменную:

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

Давайте проверим еще пару:

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

Мне действительно интересно, играет ли пол роль в оттоке клиентов. Давай проверим:

Уровень оттока мужчин и женщин практически одинаков.

Я подозреваю, что переменные срока владения и контракта сильно коррелированы, потому что клиенты остаются дольше, если у них есть долгосрочные контракты. Давай проверим:

Результаты подтверждают мои подозрения. В этом случае нет необходимости использовать обе эти переменные в прогнозной модели. Достаточно будет включить один из них.

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

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

plt.figure(figsize=(10,6))
sns.heatmap(corr, square=True, center=0.5, yticklabels=False).set_title('Correlation Matrix')

Порядок переменных на оси Y такой же, как порядок на оси X (сверху вниз: отток, срок пребывания, ежемесячные платежи). Существует отрицательная корреляция между сроком полномочий и текучестью. Чем дольше клиент остается в компании, тем меньше вероятность, что он уйдет.

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

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

Заключение

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

Спасибо за чтение. Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.