5 видов графиков, необходимых каждому Data Scientist’у

Визуализация данных является одной из первоочередных задач Data Science и Machine Learning. Графическое представление помогает увидеть зависимости между переменными, будь то оценка эпидемии, отношение рубля к доллару, значение ВВП в разных странах, уровень ДТП в регионах или изменение качества модели ML-модели с каждой эпохой обучения.
В этой статье мы расскажем вам о 5 видах графиках: диаграмме рассеяния, линейном, барном, гистограмме и ящике с усами. В качестве инструмента визуализации будем пользоваться библиотекой Python — matplotlib, чтобы ее скачать, введите в командной строке:

pip install matplotlib

Пробуем на вкус вино — подбор датасета

Для примера возьмем датасет с отзывами о вине, доступный для скачивания на сайте Kaggle — онлайн-площадке для соревнований по машинному обучению. Данный датасет содержит информацию о качестве вина, протестированные 19-ю экспертами. Каждое вино имеет свою цену, родину, описание и отзыв с балами (от 0 до 100) от эксперта.
В первую очередь импортируем библиотеки:

import pandas as pd
import matplotlib.pyplot as plt

Заметим, мы импортируем только модуль pyplot из matplotlib, так как именно он обеспечивает необходимыми графиками.
Далее, также как и в нашей предыдущей статье c помощью pandas создадим DataFrame, отбросив некоторые атрибуты для экономии места:

data = pd.read_csv('winemag-data-130k-v2.csv')
data = data.drop(['description', 'title', 'Unnamed: 0'], axis=1)
data.head()

Данные выглядят следующим образом:

Отображение первых пяти строк датасета
Отображение 5 первых строк

Ключевыми атрибутами являются price — цена и points — балы. А теперь начнем построение графиков.

Диаграмма рассеяния (Scatter plot) в matplotlib

Диаграмма рассеяния отображает пространство одних вещественных чисел в пространстве других вещественных чисел. Иными словами, каждая точка одного атрибута соответствует каждой точке другого. В matplotlib он имеет название scatter:

plt.xlabel('points')
plt.ylabel('price')
plt.scatter(x=data['points'], y=data['price'])

xlabel и ylabel служат для обозначения осей x и y, соответственно. В качестве аргументов принимает одномерные массивы x и y. Сам график выглядит следующим образом:

Отобажение диаграммы рассеяния matlpotlib
Диаграмма рассеяния

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

Линейный график (plot) в matplotlib

Линейный график необходим для построения линии от точки к точке. В matplotlib.pyplot он называется plot:

d = data.groupby('points').mean()
plt.xlabel('points')
plt.ylabel('Средняя цена')
plt.plot(d.index, d.values)

Расположенная выше диаграмма рассеяния имеет слишком много точек для каждого бала. Поэтому было решено с группировать датафрейм по баллам методом groupby и взять для каждого бала среднюю цену. Заметим, после группировки обращение к балам (points) осуществляется через атрибут index. Функция plot также принимает в качестве аргументов x и y. График выглядит так:

Отображение линейного графикa mtplotlib
Линейный график

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

Барный график (bar plot)

Барный график представляет собой столбчатую диаграмму, которая показывает количественное отношение категориального признака. Например, выберем 7 стран, в которых производится большое число винных изделий. Каждый бар будет представлять страну, а высота определять количество вин, произведенных в этой стране. В matplotlib барный график называется bar, принимающий в качестве аргументов x — массив категорий и height — массив значений этой категории:

countries = data['country'].value_counts().head(7)
plt.xlabel('Cтрана')
plt.ylabel('Количество вин')
plt.bar(x=countries.index, height=countries.values)

Метод value_counts считает количество значений каждой категории, и оттуда мы выбираем 7 первых (подсчитанные сортируются по убыванию). И вот так выглядит график:

Отображение барного графика matlotlib
Барный график matlotlib

Как видно, США производит больше вин, чем любая другая страна в этом датасете.

Гистограмма (hist plot)

Для отображения частотного показателя анализируемого атрибута используется гистограмма. Гистограммы похожи на барный график за исключением того, что вместо категориальных признаков берутся числовые, поэтому используются диапазоны значений. Кроме того, с помощью гистограмм можно построить плотность распределения. Так и сделаем. В matplolib гистограмма имеет название hist:

plt.xlabel('points')
plt.ylabel('Вероятность')
plt.hist(x=data['points'], bins=40, density=True)

В качестве аргумента он принимает x, как массив значений, bins — количество значений, разбиваемых на диапазоны, denisty, равное True, представляет данные в виде плотности распределения. Сам график в Jupyter Notebook:

Отображение гистограммы matplotlib
Гистограмма matplotlib

Прошу заметить, функция hist также вернула bins, которых насчитывается 41:

array([ 80. , 80.5, 81. , 81.5, 82. , 82.5, 83. , 83.5, 84. ,
84.5, 85. , 85.5, 86. , 86.5, 87. , 87.5, 88. , 88.5,
89. , 89.5, 90. , 90.5, 91. , 91.5, 92. , 92.5, 93. ,
93.5, 94. , 94.5, 95. , 95.5, 96. , 96.5, 97. , 97.5,
98. , 98.5, 99. , 99.5, 100. ]),
<a list of 40 Patch objects>)

hist разбивает числовой атрибут на равные промежутки. Например, здесь значения взяты по 0.5. Таким образом, получается близкое к 40 значений атрибута, после берутся пары из этих значений: [80, 80.5), [80.5, 81), [81, 81.5) и так далее. В итоге получается 20 столбцов.

Ящик с усами (box plot)

Ящик с усами, он же диаграмма размаха, можно сравнить с плотностью распределения. Он тоже показывает диапазон значений, лежащих около среднего. Помимо прочего, с его помощью можно определить выбросы — те данные, которые находятся далеко от среднего. Удаление выбросов является важным шагом подготовки модели машинного обучения, что очень важно для Data Scientist’a. В matplotlib ящик с усами называется boxplot:

plt.boxplot(x=data['points'])

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

Отображение ящика с усами matplotlib
Ящик с усами

Нижняя и верхняя границы соответствуют 25% и 75% квартилям, соответственно; горизонтальная черта внутри ящика показывает среднее значение; а концы “усов” определяются, как края статистически значимой выборки [1].
Можно заметить, на графике имеются две точки — это выбросы. При желании от них можно избавится, если они слишком сильно влияют на обучение модели, с помощью того же метода drop в pandas.
Исходный код вместе с Jupyter Notebook выложен в репозиторий на github.

Методы визуализации могут стать визитной карточкой вашего проекта. Они позволяют наиболее полно понять данные сквозь огромное количество цифр. В нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве вы познакомитесь с качественным применением визуализации в Python, поймете когда и где это лучше применять. В следующей статье мы расскажем как строить эти же самые графики с помощью pandas, не импортируя matplotlib.

Cмотрите также:

Курс VIP: Визуализация данных на языке Python

Источники
  1. https://ru.wikipedia.org/wiki/%D0%AF%D1%89%D0%B8%D0%BA_%D1%81_%D1%83%D1%81%D0%B0%D0%BC%D0%B8
  2. https://github.com/DataLatata/python-school/blob/master/basic-figures-matplotlib/plots.ipynb

Добавить комментарий

Поиск по сайту