- Реляционные графики
- Регрессионные графики
- Анализ совместных распределений и попарных отношений
- Статистические характеристики данных
- Тепловые карты
- Выводы
Библиотека Matplotlib предоставляет широкий спектр методов визуализации данных. Аналитики часто прибегают к ней в своей работе. Данная библиотека имеет низкоуровневую реализацию, что дает возможность тонкой настройки всех параметров отрисовки графиков и диаграмм. Однако за это приходится платить большим количеством шаблонных кодовых структур, что может быть излишним при решении типичных задач.
Для облегчения визуализации часто используемых графиков и диаграмм вместо Matplotlib используют библиотеку Seaborn. Эта библиотека специально создана для уменьшения объема кода и, тем самым, увеличения скорости разработки аналитических решений. На этом уроке мы познакомимся с некоторыми наиболее популярными графиками библиотеки Seaborn:
- реляционными и регрессионными
- распределениями данных и статистических показателей
- совместными распределениями и попарными отношениями
- тепловыми картами
Для работы будем использовать датасеты, которые поставляются вместе с Seaborn при установке. И начнем с простых графиков для анализа отношений между нескольками показателями в табличных данных.
Реляционные графики
Для работы возьмем табличный датасет tips
. Это записи о величине чаевых, которые оставляли посетители кафе. В качестве дополнительной информации приведены пол посетителя, день недели, время посещения и другие.
import seaborn as sns
sns.set(style="ticks")
tips = sns.load_dataset("tips")
print(tips.head())
# => total_bill tip sex smoker day time size
# 0 16.99 1.01 Female No Sun Dinner 2
# 1 10.34 1.66 Male No Sun Dinner 3
# 2 21.01 3.50 Male No Sun Dinner 3
# 3 23.68 3.31 Male No Sun Dinner 2
# 4 24.59 3.61 Female No Sun Dinner 4
Будем использовать устоявщееся сокращение sns
. Выше мы загрузили датасет в формате pandas.DataFrame
библиотеки pandas
.
Воспользуемся методом sns.relplot()
для нанесения на координатную плоскость точек, где по горизонтальной оси отложим значения итогового чека total_bill
, а по вертикальной - размер чаевых tip
.
Для дополнительной информации точки раскрасим в соответствии с днем недели.
g = sns.relplot(x="total_bill", y="tip", hue="day", data=tips)
В кодовой строке выше мы указали датафрейм tips
в качестве data
параметра, а все необходимые настройки передавали в виде названия соответствующих столбцов.
Данный тип графиков можно усложнять, добавляя разрезы по столбцам. В качестве примера мы сделаем разрез по времени time
.
g = sns.relplot(x="total_bill", y="tip", hue="day", col="time", data=tips)
Данный подход позволил нам на одном холсте отрисовать 2 графика зависимости показателей чека и чаевых в зависимости от времени посещения кафе.
В случае, если требуется отображать всю информацию на 1 графике, можно воспользоваться методом построения точечных графиков sns.scatterplot()
.
ax = sns.scatterplot(x="total_bill", y="tip", hue="day", style="time", data=tips)
В данном случае время посещения кафе отображается стилем точек на графике.
Указанные выше типы графиков используются аналитиками для оценки зависимостей в данных. Цвета и стили точек показывают группировку в данных, а также пересечения разных групп в разрезе времени или дня недели. На таких графиках часто можно увидеть зависимости линейного характера, когда увеличение или уменьшение одного показателя приводит к соответствующему увеличению или уменьшению другого. В этом случае используют регрессионные графики.
Регрессионные графики
Для построения регрессионных графиков необходимо воспользоваться методом sns.lmplot()
.
sns.lmplot(x="total_bill", y="tip", data=tips)
Как и на графиках выше, мы получили точки на графике, но при этом дополнительно появилась прямая, которая проведена "по середине" между точками. Для ее построения решается специальная задача минимизации суммарной удаленности точек от проводимой прямой. Область полутени рядом с прямой демонстрирует разброс ошибок при построении регрессии. Чем уже данная область, тем более точно построена прямая регрессии и тем сильнее линейная зависимость между показателями.
Дополнительно прибегают к построению регрессии в разрезе еще какого-либо параметра. В коде ниже покажем это в разрезе признака smoker
курящего и некурящего гостя.
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
Можно также добавить расределения значений на один график с регрессией. Так мы будем понимать характер распределения наших признаков и их статистические характеристики.
sns.jointplot(y="total_bill", x="tip", data=tips, kind="reg")
Мы рассмотрели подходы к совместным распределениям для двух признаков. Далее посмотрим, как это сделать сразу со всеми признаками данных.
Анализ совместных распределений и попарных отношений
Загрузим датасет классификации цветков ириса по 4 метрическим параметрам.
iris = sns.load_dataset("iris")
print(iris.head())
# => sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
Построим попарные графики для каждой пары признаков в данных
g = sns.pairplot(iris)
На рисунке по диагонали расположились гистограммы распределений каждого признака, а на остальных местах точечные графики для пар признаков.
Реляционные графики, регрессионный анализ и совместные распределения демонстрируют характер попарной зависимости признаков в данных. Следующим инструментом, который характеризует данные в целом, является статистический анализ. Далее мы посмотрим на доступные функции Seaborn для работы с ним.
Статистические характеристики данных
Для демонстрациии воспользуемся датасетом titanic
, хранящем информацию о пассажирах затонувшего Титаника.
titanic = sns.load_dataset("titanic")
hexlet_print(titanic.head())
# => survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
# 0 0 3 male 22.0 1 0 7.2500 S Third man True NaN Southampton no False
# 1 1 1 female 38.0 1 0 71.2833 C First woman False C Cherbourg yes False
# 2 1 3 female 26.0 0 0 7.9250 S Third woman False NaN Southampton yes True
# 3 1 1 female 35.0 1 0 53.1000 S First woman False C Southampton yes False
# 4 0 3 male 35.0 0 0 8.0500 S Third man True NaN Southampton no True
Данный датасет достаточно богат на признаки, более подробно о нем можно прочитать в документации.
Мы начнем анализ с простого подсчета каждой категории билетов пассажиров. Воспользуемся методом sns.countplot()
.
sns.countplot(x="class", data=titanic)
Продолжим со столбчатыми диаграммами. Посмотрим на средний возраст пассажиров каждого класса в разрезе пола. Для этого будем использовать метод sns.barplot()
.
sns.barplot(x="class", y="age", hue="sex", data=titanic)
На графике выше помимо средних значений отрисовываются вертикальные штрихи. Это отклонение значений возраста от среднего. Чем длиннее штрих, тем больше разброс возраста.
Для анализа среднего, разброса и поиска выбросов удобно использовать "ящики с усами" и "виолончели". Посмотрим на первый вариант.
sns.boxplot(x="sex", y="age", orient="v", data=titanic)
На диаграмме выше границы синего ящика описывают интервал, в который попадает наибольшее число значений возраста. Отходящие вверх и вниз от ящика "усы" показывают границы, в которых лежат практически все наблюдаемые значения. Если же значения выходят за пределы "усов", то это показатель того, что они маловероятны. Возможно это ошибка в данных - аналитик обязан обратить на это внимание.
В случае с виолончелью отрисовывается концентрация значений для определенного возраста: где виолончель шире, туда попадает наибольшее количество значений.
sns.violinplot(x="age", y="sex", hue="class", orient="h", data=titanic)
Для отображения распределения значений используется метод sns.displot()
.
sns.displot(titanic["age"], rug=True)
Гистограмма выше подсказывает аналитику о характере распределения значений и их концентрации. Позволяет выдвинуть гипотезы о типе распределения и его характеристиках.
Для анализа статистических характеристик исходных данных удобно использовать указанные выше методы. Однако иногда необходимо проанализировать и подсветить минимальные и максимальные значения признаков. Для этого используют тепловые карты.
Тепловые карты
Для примера сперва соберем сводную таблицу, в которой найдем количество пассажиров определенного пола и класса билета.
titanic_servived = titanic.pivot_table("survived", "sex", "class", aggfunc=np.sum)
print(titanic_servived.head())
# => class First Second Third
# sex
# female 91 70 72
# male 45 17 47
Далее будем использовать метод sns.heatmap()
, которым раскрасим полученную таблицу.
sns.heatmap(titanic_servived)
На рисунке выше мы подсвечиваем изменения значений от меньшего к большему оттенками от темного к светлому.
Выводы
На уроке мы познакомились с наиболее употребимыми типами графиков библиотеки Seaborn. Основной акцент был сделан на локаничности кода: многие графики строились в одну строку. На тестовых датасетах мы познакомились с
- реляционными и регрессионными графиками для визуализации и анализа взаимосвязи между показателями в данных
- типами графиков для визуализации распределейний и статистических показателей
- совместными распределениями и попарными отношениям
- тепловыми картами для упрощения чтения численных показателей в данных
Однако функционал библиотеки Seaborn гораздо шире. Для углубления знаний можно обратиться к документации Seaborn.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.