Вы подписаны на Машинное обучение доступно
Отлично! завершите оплату для полного доступа к Машинное обучение доступно
Снова приветствуем Вас! Вы успешно авторизовались
Успех! Аккаунт активирован, и Вы имеете полный доступ к контенту.
Разведочный анализ данных (EDA), ч. 2

Разведочный анализ данных (EDA), ч. 2

in

Разведочный анализ данных (Exploratory Data Analysis) – предварительное исследование Датасета (Dataset) с целью определения его основных характеристик, взаимосвязей между Признаками (Feature), а также сужения набора методов, используемых для создания Модели (Model) Машинного обучения (ML).

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

  • Удаление дубликатов
  • Обработка пропусков
  • Обнаружение аномалий

И теперь продолжим глубже знакомиться с особенностями датасета.

Одномерный анализ

Описательная статистика

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

!pip install pandas_profiling --upgrade

Запустим профайлер и передадим df в качестве аргумента:

from pandas_profiling import ProfileReport

profile = ProfileReport(df)
profile

Профайлер высчитывает основные статистические метрики для каждой переменной и датасета в целом:

К примеру, в признаке "Длительность" мы вычислили:

  • Количество уникальных значений (Distinct)
  • Количество пропусков (Missing)
  • Вероятно, параметр "Бесконечность" ('Infinite'), рассчитываемый только для вещественных чисел, отыскивает сильно выделяющиеся значения, которыми иногда обозначают пропуски.
  • Среднее значение (Mean)
  • Минимум (Minimum)
  • Максимум (Maximum)
  • Количество нулей (Zeros)
  • Память, задействованная этой переменной (Memory Size)
  • Нормальность распределения (график)

Следующий интересный раздел – "Корреляции" ('Correlations'). Чем ярче (краснее / синее) ячейка, тем сильнее выражена корреляция между парой признаков. Диагональные ячейки игнорируются, поскольку являются результатом расчета коэффициента между переменной и ее копией.

Профайлер вычленил из датасета только числовые признаки, и потому матрица имеет размер 11 x 11. К примеру, "колебание уровня безработицы" и "европейская межбанковская ставка" сильно коррелируют друг с другом, но поскольку эти признаки второстепенны, в дальнейшем их можно объединить на этапе инжиниринга признаков (Feature Engineering). Зачастую целевая переменная не сильно коррелирует с предикторами.

Важность признаков

Прежде чем произвести инжиниринг признаков и сократить объем входных данных, стоит определить, какие признаки имеют первостепенную значимость, и в этом нам поможет Scikit-Learn и критерий Хи-квадрат (Chi-Squared Test).:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

X = df[['Возраст', 'Длительность', 'Кампания', 'День', 'Предыдущий контакт', 'Индекс потребительских цен', 'Европейская межбанковская ставка', 'Количество сотрудников в компании']]
y = df.iloc[:, -1]

bestfeatures = SelectKBest(score_func = chi2, k = 'all')
fit = bestfeatures.fit(X, y)
dfscores = pd.DataFrame(fit.scores_)
dfcolumns = pd.DataFrame(X.columns)

featureScores = pd.concat([dfcolumns, dfscores], axis = 1)
featureScores.columns = ['Specs', 'Score']  
print(featureScores.nlargest(10, 'Score'))  

Неожиданно, но самым важным признаком оказалась длительность разговора и день звонка. Люди склонны брать кредитные продукты, если им позвонили в определенный день недели и разговор длился оптимальное время.

Многомерный анализ

Рассмотрение парных особенностей

Чего только не создаст комьюнити в Науке о данных! Для нужд разведочного анализа крайне кстати будет и попарные графики, и здесь на помощь приходит другой великолепный класс - seaborn.pairplot(). Каждая из переменных ляжет в основу одной из осей двумерного точечного графика, и так, пока все пары признаков не будут отображены. Сократим названия длинных переменных, чтобы уместить их на скромном отведенном пространстве:

Уменьшение размерности, стандартизация

Рассмотрев признаки по отдельности и попарно, мы пришли к выводу, что некоторые признаки могут быть как бы объединены с помощью специальной техники – Анализ главных компонент (PCA). Итак, давайте создадим заменяющий столбец, который представляет эти признаки в равной мере и тем самым уменьшим размер данных.

# Создадим список признаков, подлежащих уменьшению
features = ['Колебание уровня безработицы', 'Индекс потребительских цен', 'Индекс потребительской уверенности', 'Европейская межбанковская ставка']

# Выбираем сокращаемые признаки и целевой
x = df.loc[:, features].values
y = df.loc[:,['y']].values

Выполняем Стандартизацию (Standartization) x, и это впоследствии станет частью тренировочных данных:

>>> from sklearn.preprocessing import StandardScaler

x = StandardScaler().fit_transform(x)
pd.DataFrame(data = x, columns = features).head()

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

Анализ главных компонент (Principal Component Analysis) представляет собой метод уменьшения размерности больших наборов данных путем преобразования большого набора переменных в меньший с минимальными потерями информативности.

from sklearn.decomposition import PCA

pca = PCA(n_components = 2)
principalComponents = pca.fit_transform(x)
principalDf = pd.DataFrame(data = principalComponents, columns = ['principal component 1', 'principal component 2'])
principalDf.head()

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


Нормализация

Еще один шаг, не затронутый в примере выше, – это Нормализация (Normalization), и порой приходится выбирать между ею и стандартизацией. Мы нормализуем те же признаки, характеризующие состояние экономики и потому загрузим датасет в исходном виде еще раз:

from sklearn import preprocessing

df = pd.read_csv('https://www.dropbox.com/s/62xm9ymoaunnfg6/bank-full.csv?dl=1', sep=';')

# Выберем признаки, выраженные вещественными числами и подлежащие 
# нормализации
features = ['Колебание уровня безработицы', 'Индекс потребительских цен', 'Индекс потребительской уверенности', 'Европейская межбанковская ставка']
x = df.loc[:, features].values

# Инициализируем нормализатор 
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled) 

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Фото: @yassine_khalfall