Классификация данных и задачи EDA | Анализ и обработка данных

Классификация данных и задачи EDA

Все курсы > Анализ и обработка данных > Занятие 3

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

Раздел по исследовательскому анализу данных состоит из двух занятий:

  1. На первом теоретическом занятии мы рассмотрим различные классификации данных, их взаимосвязь с задачами EDA, а также коротко поговорим про четыре библиотеки Питона для построения визуализаций (Matplotlib, Pandas, Seaborn и Plotly Express).
  2. На втором занятии мы на практике используем полученные знания для системного анализа двух датасетов (параллельно изучив новые инструменты описательной статистики). Кроме того, мы поговорим про технические особенности построения графиков в Matplotlib.

Очевидно, навыки проведения EDA приобретаются только с практикой, однако я надеюсь, что этот раздел станет достаточно надежной отправной точкой в этом процессе.

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

Откроем ноутбук к этому занятию

Классификация данных

Качественные и количественные данные

Начнем с того, что более внимательно посмотрим на существующие типы данных. Их правильное понимание позволит более качественно проводить EDA.

категориальные и количественные данные

Коротко опишем каждый из типов данных.

Качественные данные

Качественные или категориальные данные (categorical data) описывают принадлежность объекта к определенной группе. Категориальные данные бывают двух видов: номинальные и порядковые.

Категории номинальных данных (nominal categorical data) не могут быть упорядочены, их сравнение не имеет смысла. Например, на прошлом занятии мы рассматривали марки автомобилей. Сравнение брендов в отрыве от их характеристик невозможно. То же самое касается типов товаров, жанров музыкальных произведений и т.д.

Приведем пример данных о количестве автомобилей различных марок у дилера.

номинальные категориальные данные

Выведем эти данные с помощью столбчатой диаграммы.

график номинальных категориальных данных

При этом категориям порядковых данных (ordinal categorical data) свойственна внутренняя иерархия, их можно проранжировать. Например, к таким категориям относятся значения шкалы удовлетворенности потребителей (очень доволен, доволен, в целом доволен и т.д.) или возрастные категории (до 18 лет, от 18 до 24 и т.д.).

В качестве примера используем различные оценки, которые поставили потребители.

порядковые категориальные данные

Визуализируем эти данные с помощью countplot (используем библиотеку Seaborn).

Типы графиков и технические особенности их построения мы рассмотрим на следующем занятии.

график порядковых категориальных данных

Количественные данные

Количественные признаки (которые также называют вещественными или числовыми) могут быть дискретными или непрерывными.

Дискретные данные (discrete numerical data) принимают строго определенные значения. Например, это может быть количество сотрудников на предприятии или количество бракованных деталей в произведенной партии.

Непрерывные данные (continuous numerical data) всегда выражены неограниченным числом значений. Говоря более точно, они не имеют конечной точности измерений. Примером могут быть измерения каких-либо физических показателей (температура, плотность и т.д.).

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

Распределение Пуассона

В качестве примера дискретных данных возьмем новое для нас распределение Пуассона (Poisson discrete distribution), которое используется для моделирования частоты какого-либо события в определенный интервал времени.

$$X \sim P(\lambda) $$

Функция вероятности (pmf, probability mass function) распределения Пуассона описывается следующей формулой.

$$ P(X = k) = \frac{\lambda^k}{k!}e^{-\lambda} \text{,}$$

где

  • $k$ — количество событий
  • $\lambda$ — матожидание случайной величины (то есть среднее количество событий за интервал времени)

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

Посмотрим, сколько раз звонили в течение минуты и как часто встречалось такое количество звонков. Другими словами, посмотрим сколько раз могли звонить ноль раз, один раз, два раза и т.д.

В частности, мы видим, что 53 раза в колл-центр не поступило ни одного звонка, 141 раз поступил один звонок и т.д.). Выведем эту информацию на графике.

абсолютное эмпирическое распределение Пуассона

Теперь посмотрим, как распределено количество звонков относительно их общего числа.

относительное эмпирическое распределение Пуассона

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

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

По большому счету, мы посчитали количество наблюдений в столбцах, где было 7, 8, 9 и 11 звонков в минуту и разделили на их общее количество. Аналогично посчитаем относительное количество наблюдений в столбцах 2, 3, 4, 5 и 6.

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

теоретическое распределение Пуассона

Теперь воспользуемся функцией poisson.cdf(), то есть функцией распределения (cumulative distribution function), для расчета теоретической вероятности получить более шести звонков в минуту и вероятности получить от двух до шести звонков.

Напомню, что функция распределения рассчитывает вероятность P того, что случайная величина X примет значение меньшее или равное $k$.

$$ cdf = P(X \leq k) $$

Например, рассчитаем вероятность получения нуля звонков или одного звонка в час.

Теперь перейдем к решению исходной задачи.

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

Примером непрерывных количественных данных может служить рост человека, который, как мы уже знаем, следует нормальному распределению.

Перекрестные данные, временные ряды и панельные данные

Еще одной классификацией данных является разделение на перекрестные данные, временные ряды и панельные данные.

перекрестные данные, временные ряды и панельные данные

Перекрестные данные

Примером перекрестных данных (cross-sectional data) могут быть расходы на здравоохранение и образование на душу населения/учащегося в трех странах мира в 2019 году.

перекрестные данные: датафрейм

Теперь выведем данные на графике.

перекрестные данные: столбчатая диаграмма

Временные ряды

Расходы на здравоохранение и образование одной страны, но на протяжении десяти лет будут считаться временными рядами (time-series).

временные ряды: датафрейм

Выведем эти данные с помощью линейного графика.

временные ряды: линейный график

Панельные данные

Теперь, если объединить анализ расходов на здравоохранение по нескольким странам (перекрестные данные) с измерением этих данных во времени (временные ряды), мы получим то, что принято называть панельными данными (panel data).

Создание датафрейма с панельными данными

Для создания датафрейма с панельными данными вначале передадим в функцию pd.DataFrame() словарь, в котором будет один столбец. В этом столбце поочередно укажем расходы на здравоохранение на душу населения для Франции, Бельгии и Испании в период с 2015 по 2019 годы.

Теперь подготовим кортежи для создания иерархического индекса и передадим их в функцию pd.MultiIndex.from_tuples(). После этого обновим атрибут index и выведем результат.

панельные данные: датафрейм

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

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

Интересно, что название библиотеки Pandas происходит как раз от словосочетания «панельные данные» (panel data).

Остается их визуализировать.

Визуализация панельных данных

Вначале превратим трехмерный массив обратно в двумерный с помощью метода .unstack().

панельные данные: unstacked

Теперь мы можем вывести эти данные на одном графике.

панельные данные: линейный график

Кроме того, с помощью параметра subplots = True метода .plot() мы можем разместить эти данные на трех подграфиках (в этот раз используем столбцатую диаграмму).

панельные данные: столбчатая диаграмма (подграфики)

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

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

В соответствии с еще одной классификацией данные предполагают одномерный и многомерный анализ.

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

При одномерном анализе (univariate analysis) мы сосредоточены на изучении одного единственного показателя. Многомерный анализ (multivariate analysis) предполагает, что мы изучаем сразу несколько признаков.

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

Для наглядности приведем пример многомерных временных рядов (multivariate time series) и панельных данных (multivariate panel data).

Многомерный временной ряд

Создадим временной ряд расходов на здравоохранение во Франции на душу населения в долларах с 2010 по 2019 годы и приведем процент ВВП, потраченный на образование, за аналогичный период.

многомерный временной ряд

Многомерные панельные данные

Теперь добавим расходы на образование в панельные данные.

многомерные панельные данные

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

Теперь давайте свяжем описанные выше классификации с задачами EDA.

Задачи EDA

В ходе исследовательского анализа данных нам необходимо решить три основные задачи:

  • описать данные
  • найти различия
  • выявить закономерности

Подробнее поговорим про каждую из них.

Описание данных

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

Анализ количественной переменной предполагает оценку среднего, стандартное отклонение, диапазон, персентили и другие показатели, характеризующие распределение вещественного признака.

Нахождение различий

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

Возможно нахождение различий количественного признака в разрезе определенной категории. Например, в том же датасете мы посмотрим на распределение возраста в зависимости от пола.

Выявление закономерностей

Закономерности или взаимосвязи в данных могут быть выявлены между двумя количественными признаками. Например, в датасете Tips («чаевые»), который мы также будем использовать сегодня для иллюстрации процесса EDA, мы можем попыться обнаружить взаимосвязь между размером счета и оставленными чаевыми.

Теперь про технические средства, которые нам понадобятся.

Какие библиотеки мы будем использовать

В рамках сегодняшнего занятия мы детально познакомимся с четырьмя библиотеками.

библиотеки Питона для построения графиков: Matplotlib, Pandas, Seaborn, Plotly

Библиотека Matplotlib

Стиль MATLAB

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

Сравните код в MATLAB для построения графика синусоиды и соответствующий код на Питоне с использованием библиотеки Matplotlib.

построение графика синусоиды в MATLAB
построение графика синусоиды в Matplotlib

Объектно-ориентированный подход

Кроме того, библиотека Matplotlib предполагает использование принципов объектно-ориентированного программирования. В Matplotlib есть два класса:

  • figure — класс-контейнер для хранения подграфиков
  • axes — подграфики внутри контейнера

Рассмотрим эти классы на практике.

Обратите внимание, что пока у объекта fig 0 axes, то есть контейнер мы создали, а подграфики еще нет.

Выведем информацию о количестве подграфиков с помощью атрибута number объекта fig.

Приведем пример наполнения подграфиков.

пустые подграфики в библиотеке Matplotlib

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

Библиотека Pandas

Когда мы работаем с датафреймами, зачастую бывает удобно строить графики непосредственно в библиотеке Pandas, в частности, с помощью метода .plot(). «Под капотом» библиотека Pandas использует объекты библиотеки Matplotilb для построения графиков.

метод .plot() библиотеки Pandas

Библиотека Seaborn

Библиотека Seaborn представляет собой надстройку к библиотеке Matplotlib и прекрасно интегрирована с датафреймами. Seaborn позволяет строить графики, используя меньшее количество кода, чем Matplotlib.

Примеры создания графиков с seaborn приведены выше.

В целом Seaborn или графики в Pandas удобно использовать для быстрого построения визуализаций и исследования данных. Matplotlib чаще используется в тех случаях, когда необходима гораздо более тонкая настройка графиков.

Модуль Plotly Express

Модуль Plotly Express библиотеки Plotly отличается тем, что позволяет строить интерактивные графики. По сути, это небольшие веб-приложения. Plotly Express обычно импортируется как px.

Рассмотрим несложный пример построения графика.

библиотека Plotly, функция bar()
Интерактивный график можно посмотреть в ноутбуке к занятию⧉.

Подведем итог

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

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

В качестве дополнительного материала мы детально рассмотрели распределение Пуассона.

Вопросы для закрепления

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

Посмотреть правильный ответ

Вопрос. Какие задачи решаются в процессе исследовательского анализа данных?

Посмотреть правильный ответ

Вопрос. О каких библиотеках для визуализации шла речь на сегодняшнем занятии?

Посмотреть правильный ответ

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