Мистер наука о данных

Цель:

В этой статье я буду:

  • Опишите оценку плотности ядра практическим, не математическим способом.
  • Продемонстрируйте, как использовать KDE и визуализацию данных для исследовательского анализа данных.

Предположения:

Я предполагаю:

  • У вас установлен Python 3 и вы можете установить необходимые библиотеки
  • У вас есть некоторый опыт использования Python и, возможно, использования библиотек данных Python, таких как Pandas.

Справочная информация об оценках плотности ядра (KDE):

Часто ваши данные не будут соответствовать общей функции распределения — например, они могут иметь мультимодальное распределение (распределение данных имеет несколько пиков). Вместо того, чтобы пытаться подогнать данные к общему распределению, алгоритм используется для создания приблизительной функции плотности. Наиболее распространенный из этих алгоритмов называется оценкой плотности ядра, сокращенно KDE. [1]

Конечно, мы могли бы использовать гистограмму для моделирования распределения данных, но у гистограмм есть некоторые проблемы. Сначала нам нужно определиться с количеством бинов, и нет абсолютных правил, как это сделать, также трудно узнать конечные точки бинов. Оценщики, такие как KDE, частично решают эти проблемы. KDE по-прежнему производит оценку, модель, но обычно она лучше, чем гистограмма. KDE производит непрерывную функцию, гистограммы не являются непрерывными. [2]

Что в практическом смысле предлагает нам KDE? Как мы увидим в приведенных ниже примерах, KDE очень полезен для исследовательского анализа данных. Это позволяет нам визуализировать основное распределение числовых переменных в наборах данных, чтобы лучше понять переменные, например, имеет ли оно мультимодальное распределение. Используя KDE, мы также можем начать исследовать возможные связи между переменными и набором данных.

Прежде чем мы начнем, давайте настроим вашу среду:

Для визуализации KDE вам потребуется установить следующие библиотеки Python:

Использование графиков KDE для изучения данных о гейзерах Йеллоустонского национального парка

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

Давайте рассмотрим несколько примеров:

Пример 1

Нам нужны некоторые данные для работы и способ визуализации графиков плотности, поэтому мы будем использовать библиотеку визуализации данных под названием Seaborn. Эта библиотека поставляется с некоторыми наборами данных, которые мы можем использовать для демонстрации KDE, мы будем использовать набор данных geyser.

from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sns

Мы можем использовать функцию load_dataset для получения данных, функция возвращает кадр данных Pandas (df). Мы можем использовать функцию head для просмотра первых нескольких строк в кадре данных.

df = sns.load_dataset('geyser')
df.head()

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

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

df.isnull().sum(axis=0)
duration    0
waiting     0
kind        0
dtype: int64

Нулей вроде нет. Чтобы получить некоторое визуальное представление о том, как работает KDE, давайте начнем с коврика.

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

sns.set_style('white')
plt.rc('xtick', labelsize=10)
plt.rc('ytick', labelsize=10)
plt.figure(figsize=(12,3))
sns.distplot(df['duration'], rug=True, kde=False, hist=False)

sns.despine(left=True)
plt.xlim(0, 6)
plt.xlabel('duration in seconds')
plt.yticks([])
plt.title('Rug plot of duration variable in dataset')
plt.tight_layout();

Каждая синяя метка на графике выше представляет значение в столбце продолжительности. Мы можем получить представление о распределении, заметив расстояние между синими метками, похоже, что есть два пика, один около 2 секунд, а другой между 4 и 5 секундами. K в KDE означает ядро, что является еще одним способом сказать функцию распределения. Допустим, мы поместили небольшую функцию Гаусса над каждой синей меткой выше. Там, где функции перекрываются, мы добавляем их вместе. Делая это для всех точек, мы строим непрерывную функцию распределения вероятностей. Таким образом, KDE — это способ превратить конечный набор дискретных значений данных в непрерывную функцию плотности вероятности. Обратите внимание, что это не обязательно должна быть функция Гаусса, это может быть косинусная функция, прямоугольная функция или… неважно, какую функцию мы используем, важнее количество данных, которые у нас есть, чем больше, тем лучше .

Библиотека кода Seaborn упрощает создание графика KDE:

sns.kdeplot(df.duration);

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

sns.kdeplot(df.waiting, shade=True);

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

Пример 2

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

sns.violinplot(df.duration);

Используя график скрипки, мы видим, что данные в столбце продолжительности являются бимодальными (имеют два пика), минимальное значение составляет около 1,5 секунды, максимальное значение составляет около 5, а медиана составляет около 4 секунд. По форме видно, что продолжительность извержения не является полностью случайной. Мы можем разделить большинство извержений на одну из двух категорий — длительные извержения и короткие извержения. Мы также можем видеть из формы кривой KDE и среднего значения, что длительных извержений больше, чем коротких. Итак, с помощью нескольких строк кода мы начинаем понимать, как работает гейзер.

sns.violinplot(df.waiting);

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

sns.violinplot(x=df.kind,y=df.duration);

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

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

Пример 3

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

sns.set_style('whitegrid')
sns.kdeplot(df.duration, df.waiting, shade=True, shade_lowest=False, cbar=True);
plt.xlabel('Duration', fontsize=14)
plt.ylabel('Waiting', fontsize=14)
plt.title('Relationship between duration of eruption and time between eruptions')
plt.tight_layout();

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

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

Краткий обзор того, что вы узнали:

Если вы дошли до этого места, вы должны хорошо понимать:

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

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

Использованная литература:

  1. Браунли, Дж., доктор философии. Проверено 09 февраля 2021 . Оценка плотности вероятности
  2. Эдинбургский университет, Школа информатики. Проверено 09 февраля 2021. Оценщики плотности ядра

Свяжитесь с г-ном Наука о данных:

MrDataScience.com, GitHub, Средний,