Введение

Исследовательский анализ данных (EDA) — одна из основных задач, которую выполняет Data Scientist, начиная работу с новым набором данных. Этот процесс информирует нас о распределении или взаимосвязи между переменными, выявляет отсутствующие и нечистые данные и выявляет выбросы. Это помогает в разработке и обновлении конвейеров данных для предварительной обработки входящих данных.

Существуют различные библиотеки Python, которые поддерживают как статистический, так и научный анализ и представление данных. Это делает Python одним из наиболее предпочтительных языков для EDA. В этом посте вы узнаете, как использовать библиотеку Seaborn для EDA и записывать созданные таким образом диаграммы в Comet для совместного использования и совместной работы с командой, а также для облегчения создания отчетов.

Настроить проект Comet

Войдите на Comet.com и нажмите Зарегистрироваться в правом верхнем углу.

Добавьте свои данные или зарегистрируйтесь, используя учетную запись GitHub.

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

Добавьте имя проекта, описание и настройки видимости. Настройки для этой демонстрации показаны на скриншоте ниже.

Нажав на «Краткое руководство», вы получите инструкции по настройке и ключ API.

В разделе «Начало работы с Comet» нажмите Python. Это отобразит команды терминала для установки библиотеки Comet в вашей локальной среде Python.

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

Запустите приведенную ниже команду в своем терминале.

pip install comet_ml

Прежде чем писать код, добавьте следующий код в начало скрипта Python (файл .py) или блокнота Jupyter (файл .ipynb).

from comet_ml import Experiment
experiment = Experiment(
    api_key="add your api key here",
    project_name="add your project name here",
    workspace="add your workspace name here",
)

Вы можете найти приведенный выше код прямо на странице «Начало работы с Comet». Вы можете подтвердить, прослушивает ли платформа Comet ваши эксперименты на той же странице. Пожалуйста, обратитесь к скриншоту ниже.

Исследовательский анализ данных

Для этой демонстрации мы будем использовать набор данных House Prices — Advanced Regression Techniques от Kaggle. Это проблема регрессии, где целевой переменной является цена дома, а атрибуты дома, такие как площадь, структура и удобства поблизости, составляют независимые переменные. Поэтому проанализируем взаимосвязь между независимыми переменными и ценой продажи дома. Пойдем!

Импорт необходимых библиотек

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

Прочитайте данные CSV и просмотрите первые пять строк.

train = pd.read_csv('train.csv')
train.head()

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

train.describe().T

Показать распределение продажной цены

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

plt.figure(figsize=(15,10))
fig = sns.histplot(data = train, x = "SalePrice", hue="MSZoning")
experiment.log_figure(figure_name = "Sale Price Distribution", figure=fig.figure, overwrite=False)

Распределение имеет положительную асимметрию. Вы можете выполнить логарифмическое преобразование, чтобы исправить перекос. Код для построения графика и регистрации неасимметричного распределения выглядит следующим образом:

train['log_sales_price'] = np.log(train['SalePrice'])
plt.figure(figsize=(15,10))
sns.histplot(train, x="log_sales_price", hue="MSZoning")
plt.show()

Лучше! Получить числовое значение перекоса и эксцесса так же просто, как показано ниже:

print("Skewness: %f" % train['SalePrice'].skew())
print("Kurtosis: %f" % train['SalePrice'].kurt())

Значение перекоса равно 1,88, а эксцесс равен 6,54, что соответствует положительному перекосу. Точно так же мы можем построить график распределения продажной цены с другими переменными.

for i in train.columns:
    if len(train[i].value_counts()) < 5 and len(train[i].value_counts()) > 1:
        fig = sns.displot(train, x="SalePrice", kde=True, hue=i)
        plt.title('Sales Price Distribution by '+i)
        experiment.log_figure(figure_name = "Pairplot distribution and Scatterplots", figure=fig.figure, overwrite=False)

Используя вышеуказанные фильтры, мы получаем 15 графиков распределения цен продаж. Ниже показаны три диаграммы для справки.

Форма лота IR1 является популярным выбором и требует более высоких продажных цен по сравнению с обычными формами лота. У него также есть длинный правый хвост, представляющий положительный перекос.

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

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

График продажной цены по сравнению с независимыми переменными

Теперь давайте посмотрим на соотношение цены с. непрерывные переменные с использованием диаграммы рассеяния.

plt.figure(figsize=(15,10))
fig = sns.scatterplot(data=train, x='GrLivArea', y='SalePrice', hue = "MSZoning", palette="deep", style="Street")
experiment.log_figure(figure_name = "Complete Data", figure=fig.figure, overwrite=False)

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

train['log_GrLivArea'] = np.log(train['GrLivArea'])
train['log_SalePrice'] = np.log(train['SalePrice'])
plt.figure(figsize=(15,10))
plt.title("Log transform of Sales Price vs Ground Floor Living Area")
fig = sns.scatterplot(data=train, x='log_GrLivArea', y='log_SalePrice', hue = "MSZoning", palette="deep", style="Street")
experiment.log_figure(figure_name = "Log transform of Sales Price vs Ground Floor Living Area", figure=fig.figure, overwrite=False)

Ах, намного лучше! Кандидат на линейную регрессию.

Давайте поищем следующий лучший предсказатель, начнем с подвала.

plt.figure(figsize=(15,10))
plt.title("Sales Price vs Basement Area")
fig = sns.scatterplot(data=train, x='TotalBsmtSF', y='SalePrice', hue = "MSZoning", palette="deep", style="Street")
experiment.log_figure(figure_name = "Sales Price vs Basement Area", figure=fig.figure, overwrite=False)

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

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

plt.figure(figsize=(15,10))
plt.title("Sales Price vs Overall Quality")
fig = sns.scatterplot(data=train, x='OverallQual', y='SalePrice', hue = "MSZoning", palette="deep", style="Street")
experiment.log_figure(figure_name = "Sales Price vs Overall Quality", figure=fig.figure, overwrite=False)

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

plt.figure(figsize=(25,15))
plt.title("Sales Price vs Year Built")
fig = sns.boxplot(data=train, x='YearBuilt', y='SalePrice')
plt.xticks(rotation=75)
experiment.log_figure(figure_name = "Sales Price vs Year Built", figure=fig.figure, overwrite=False)

Графики показывают, что цены продажи выше для недавно построенных и старинных домов.

Изоляция сложных выборок данных? Комета может это сделать. Узнайте больше о нашем сценарии PetCam и откройте для себя кометные артефакты.

Тепловые карты корреляции

Числовые переменные наделены такими показателями, как корреляция, которая показывает, связаны ли две величины (положительно или отрицательно) или нет.

plt.figure(figsize=(35,20))
plt.title("Correlation Heat Map")
fig = sns.heatmap(train.corr(), annot=True)
experiment.log_figure(figure_name = "Correlation Heat Map", figure=fig.figure, overwrite=False)

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

Давайте сузим наш поиск до сильно коррелированных переменных.

cols = list(train.corr().nlargest(5, 'SalePrice')['SalePrice'].index) + list(train.corr().nsmallest(5, 'SalePrice')['SalePrice'].index)
plt.figure(figsize=(15,10))
plt.title("Top 5 highly correlated variables - Correlation Heat Map")
fig = sns.heatmap(train[cols].corr(), annot=True)
experiment.log_figure(figure_name = "Top 5 highly correlated variables - Correlation Heat Map", figure=fig.figure, overwrite=False)

Выберите пять первых переменных с положительной и отрицательной корреляцией, вызвав функции nlargest() и nsmalest() соответственно в матрице корреляции.

Общее качество и жилая площадь сильно коррелируют с ценой дома.

Парные участки

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

cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt']
plt.figure(figsize=(15,10))
fig = sns.pairplot(train[cols])
plt.title("Pairplot distribution and Scatterplots")
experiment.log_figure(figure_name = "Pairplot distribution and Scatterplots", figure=fig.figure, overwrite=False)

Помимо ранее выявленных взаимосвязей, GrLivArea и TotalBsmtSF имеют слабую положительную взаимосвязь, что заслуживает дальнейшего изучения в ходе моделирования.

Определение пропущенных значений

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

total = train.isnull().sum().sort_values(ascending=False)
percent = (train.isnull().sum()/train.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
missing_data.head(20)

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

train = train.drop((missing_data[missing_data['Total'] >= 1]).index,1)
train.isnull().sum().max()

Вывод приведенного выше кода равен нулю, как и ожидалось.

Просмотр зарегистрированных визуализаций

Перейдите по ссылке эксперимента Comet и щелкните вкладку Графика. Здесь вы найдете все свои сюжеты в одном месте.

Красивый! Не так ли?

Вы можете легко использовать эти диаграммы и графики в своих отчетах.

Примечание. Не забудьте вызвать experiment.end() при использовании Jupyter Notebook.

Краткое содержание

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

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

Независимая от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и командам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим нашим авторам и не продаем рекламу.

Если вы хотите внести свой вклад, перейдите к нашему призыву к участию. Вы также можете подписаться на получение нашего еженедельного информационного бюллетеня (Еженедельник глубокого обучения), заглянуть в блог Comet, присоединиться к нам в Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов и событий. и многое другое, что поможет вам быстрее создавать более качественные модели машинного обучения.