Вступление
В предыдущей статье мы рассмотрели, как библиотеку Python Matplotlib можно использовать для визуализации данных. В этой статье мы рассмотрим Seaborn, еще одну чрезвычайно полезную библиотеку для визуализации данных в Python. Библиотека Seaborn построена на основе Matplotlib и предлагает множество расширенных возможностей визуализации данных.
Хотя библиотеку Seaborn можно использовать для рисования различных диаграмм, таких как матричные графики, сеточные графики, графики регрессии и т. Д., В этой статье мы увидим, как библиотеку Seaborn можно использовать для рисования распределительных и категориальных графиков. Во второй части серии мы увидим, как рисовать графики регрессии, матричные графики и сеточные графики.
Скачивание библиотеки Seaborn
Библиотеку seaborn
можно загрузить двумя способами. Если вы
используете установщик pip для библиотек Python, вы можете выполнить
следующую команду, чтобы загрузить библиотеку:
pip install seaborn
В качестве альтернативы, если вы используете дистрибутив Python для
Anaconda, вы можете выполнить следующую команду для загрузки библиотеки
seaborn
conda install seaborn
Набор данных
Набор данных, который мы собираемся использовать для построения
графиков, будет набором данных Titanic, который по умолчанию загружается
с библиотекой Seaborn. Все, что вам нужно сделать, это использовать
load_dataset
и передать ей имя набора данных.
Давайте посмотрим, как выглядит набор данных Титаника. Выполните следующий скрипт:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
dataset = sns.load_dataset('titanic')
dataset.head()
Приведенный выше сценарий загружает набор данных Titanic и отображает первые пять строк набора данных с помощью функции head. Результат выглядит так:
{.ezlazyload .img-responsive}
Набор данных содержит 891 строку и 15 столбцов и содержит информацию о пассажирах, которые поднялись на борт злополучного корабля "Титаник". Первоначальная задача состоит в том, чтобы предсказать, выжил ли пассажир, в зависимости от различных характеристик, таких как возраст, билет, каюта, в которую он сел, класс билета и т. Д. Мы будем использовать библиотеку Seaborn, чтобы увидеть, сможем ли мы найти какие-либо закономерности в данные.
Графики распределения
Графики распределения, как следует из названия, представляют собой тип графиков, которые показывают статистическое распределение данных. В этом разделе мы увидим некоторые из наиболее часто используемых графиков распределения в Seaborn.
График распределения
distplot()
показывает распределение данных гистограммы для одного
столбца. Имя столбца передается в качестве параметра функции
distplot()
. Посмотрим, как распределяется цена билета для каждого
пассажира. Выполните следующий скрипт:
sns.distplot(dataset['fare'])
Выход:
{.ezlazyload .img-responsive}
Вы можете видеть, что большинство билетов было решено от 0 до 50
долларов. Линия, которую вы видите, представляет оценку плотности
ядра . Вы
можете удалить эту строку, передав False
в качестве параметра для
kde
как показано ниже:
sns.distplot(dataset['fare'], kde=False)
Выход:
{.ezlazyload .img-responsive}
Теперь вы можете видеть, что на графике нет линии для оценки плотности ядра.
Вы также можете передать значение bins
, чтобы увидеть более или менее
подробную информацию на графике. Взгляните на следующий сценарий:
sns.distplot(dataset['fare'], kde=False, bins=10)
Здесь мы устанавливаем количество ячеек равным 10. На выходе вы увидите данные, распределенные по 10 ящикам, как показано ниже:
Выход:
{.ezlazyload .img-responsive}
Хорошо видно, что для более чем 700 пассажиров цена билета составляет от 0 до 50.
Совместный участок
jointplot()
используется для отображения взаимного распределения
каждого столбца. jointplot
необходимо передать три параметра. Первый
параметр - это имя столбца, для которого вы хотите отобразить
распределение данных по оси x. Второй параметр - это имя столбца, для
которого вы хотите отобразить распределение данных по оси Y. Наконец,
третий параметр - это имя фрейма данных.
Давайте построим совместный график age
и fare
чтобы увидеть, сможем
ли мы найти какую-либо связь между ними.
sns.jointplot(x='age', y='fare', data=dataset)
Выход:
{.ezlazyload .img-responsive}
Из выходных данных видно, что совместный сюжет состоит из трех частей. График распределения вверху для столбца по оси x, график распределения справа для столбца по оси Y и диаграмма разброса между ними, которая показывает взаимное распределение данных для обоих столбцов. Как видите, корреляции между ценами и тарифами не наблюдается.
Вы можете изменить тип совместного графика, передав значение для
параметра kind
Например, если вместо диаграммы рассеяния вы хотите
отобразить распределение данных в форме гексагонального графика, вы
можете передать hex
значение для параметра kind
Взгляните на
следующий сценарий:
sns.jointplot(x='age', y='fare', data=dataset, kind='hex')
Выход:
{.ezlazyload .img-responsive}
На гексагональном графике шестиугольник с наибольшим количеством точек становится более темным. Итак, если вы посмотрите на график выше, вы увидите, что большинство пассажиров в возрасте от 20 до 30 лет, и большинство из них заплатили за билеты от 10 до 50 лет.
Парный сюжет
paitplot()
- это тип графика распределения, который в основном строит
совместный график для всех возможных комбинаций числовых и логических
столбцов в вашем наборе данных. Вам нужно только передать имя вашего
набора данных в качестве параметра функции pairplot()
как показано
ниже:
sns.pairplot(dataset)
Снимок части вывода показан ниже:
{.ezlazyload .img-responsive}
Примечание. Перед выполнением приведенного выше сценария удалите все значения NULL из набора данных с помощью следующей команды:
dataset = dataset.dropna()
На выходе парного графика вы можете увидеть совместные графики для всех числовых и логических столбцов в наборе данных Titanic.
Чтобы добавить информацию из категориального столбца к парному графику,
вы можете передать имя категориального столбца в параметр hue
Например, если мы хотим отобразить информацию о поле на парном графике,
мы можем выполнить следующий сценарий:
sns.pairplot(dataset, hue='sex')
Выход:
{.ezlazyload .img-responsive}
В выходных данных вы можете увидеть информацию о самцах оранжевым цветом и информацию о самке синим цветом (как показано в легенде). На общем графике вверху слева отчетливо видно, что среди выживших пассажиров большинство составляли женщины.
Ковровый участок
rugplot()
используется для рисования небольших полос вдоль оси x для
каждой точки в наборе данных. Для построения участка коврика нужно
передать название столбца. Построим коврик для платы за проезд.
sns.rugplot(dataset['fare'])
Выход:
{.ezlazyload .img-responsive}
Из выходных данных вы можете видеть, что, как и в случае с distplot()
, большинство экземпляров для тарифов имеют значения от 0 до 100.
Это одни из наиболее часто используемых графиков распространения, предлагаемых библиотекой Python Seaborn. Давайте посмотрим на некоторые категориальные сюжеты в библиотеке Seaborn.
Категориальные графики
Категориальные графики, как следует из названия, обычно используются для построения категориальных данных. Категориальные графики отображают значения в категориальном столбце относительно другого категориального столбца или числового столбца. Давайте посмотрим на некоторые из наиболее часто используемых категориальных данных.
Барный участок
barplot()
используется для отображения среднего значения для каждого
значения в категориальном столбце по сравнению с числовым столбцом.
Первый параметр - это категориальный столбец, второй параметр - это
числовой столбец, а третий параметр - это набор данных. Например, если
вы хотите узнать среднее значение возраста пассажиров мужского и
женского пола, вы можете использовать гистограмму следующим образом.
sns.barplot(x='sex', y='age', data=dataset)
Выход:
{.ezlazyload .img-responsive}
Из выходных данных вы можете ясно видеть, что средний возраст пассажиров-мужчин составляет чуть менее 40 лет, а средний возраст пассажиров-женщин составляет около 33 лет.
Помимо определения среднего значения, гистограмма также может
использоваться для расчета других совокупных значений для каждой
категории. Для этого вам необходимо передать агрегатную функцию
estimator
. Например, вы можете рассчитать стандартное отклонение для
возраста каждого пола следующим образом:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.barplot(x='sex', y='age', data=dataset, estimator=np.std)
Обратите внимание, что в приведенном выше сценарии мы используем
агрегатную функцию std
numpy
для вычисления стандартного отклонения
для возраста пассажиров мужского и женского пола. Результат выглядит
так:
{.ezlazyload .img-responsive}
Сюжет графа
График подсчета похож на столбчатый график, однако он отображает количество категорий в определенном столбце. Например, если мы хотим подсчитать количество пассажиров мужского и женского пола, мы можем сделать это, используя график подсчета следующим образом:
sns.countplot(x='sex', data=dataset)
Выходные данные показывают количество следующим образом:
Выход:
{.ezlazyload .img-responsive}
Коробчатый сюжет
Ящичковая диаграмма используется для отображения распределения категориальных данных в форме квартилей. В центре рамки показано медианное значение. Значение от нижнего уса до низа прямоугольника показывает первый квартиль. От нижней части до середины прямоугольника лежит второй квартиль. От середины прямоугольника до его верха лежит третий квартиль и, наконец, от верха прямоугольника до верхнего уса - последний квартиль.
Вы можете узнать больше о квартилях и коробчатых диаграммах по этой ссылке .
Теперь давайте построим коробчатую диаграмму, которая отображает распределение возраста по каждому полу. Вам необходимо передать категориальный столбец в качестве первого параметра (в нашем случае это пол) и числовой столбец (в нашем случае возраст) в качестве второго параметра. Наконец, набор данных передается в качестве третьего параметра, взгляните на следующий скрипт:
sns.boxplot(x='sex', y='age', data=dataset)
Выход:
{.ezlazyload .img-responsive}
Попробуем разобраться в коробчатом сюжете для женщин. Первый квартиль начинается примерно с 5 и заканчивается на 22, что означает, что 25% пассажиров находятся в возрасте от 5 до 25 лет. Второй квартиль начинается примерно с 23 лет и заканчивается примерно на 32, что означает, что 25% пассажиров находятся в возрасте от 23 лет. и 32. Точно так же третий квартиль начинается и заканчивается между 34 и 42, следовательно, 25% пассажиров находятся в этом диапазоне, и, наконец, четвертый или последний квартиль начинается с 43 и заканчивается около 65 лет.
Если есть какие-либо выбросы или пассажиры, которые не принадлежат ни к одному из квартилей, они называются выбросами и представлены точками на прямоугольной диаграмме.
Вы можете сделать свои коробчатые диаграммы более привлекательными,
добавив еще один уровень распределения. Например, если вы хотите , чтобы
увидеть окно участки кормами пассажиров обоих полов, а также с
информацией о том или не выжили они, вы можете пройти survived
в
качестве значения hue
параметра , как показано ниже:
sns.boxplot(x='sex', y='age', data=dataset, hue="survived")
Выход:
{.ezlazyload .img-responsive}
Теперь, помимо информации о возрасте каждого пола, вы также можете увидеть распределение выживших пассажиров. Например, вы можете видеть, что среди пассажиров-мужчин в среднем выжило больше молодых людей, чем старших. Точно так же вы можете видеть, что разница в возрасте женщин-пассажиров, которые не выжили, намного больше, чем возраст выживших пассажиров-женщин.
Сюжет для скрипки
График скрипки похож на коробчатый график, однако график скрипки
позволяет нам отображать все компоненты, которые фактически
соответствуют точке данных. Функция violinplot()
используется для
построения графика скрипки. Как и блочная диаграмма, первый параметр -
это категориальный столбец, второй параметр - это числовой столбец, а
третий параметр - это набор данных.
Давайте построим график скрипки, который отображает возрастное распределение для каждого пола.
sns.violinplot(x='sex', y='age', data=dataset)
Выход:
{.ezlazyload .img-responsive}
Из рисунка выше видно, что графики скрипки предоставляют гораздо больше информации о данных по сравнению с коробчатым графиком. Вместо построения квартиля график скрипки позволяет нам видеть все компоненты, которые фактически соответствуют данным. Область, где сюжет скрипки более толстый, имеет большее количество экземпляров для возраста. Например, из скрипичного сюжета для мужчин ясно видно, что количество пассажиров в возрасте от 20 до 40 лет больше, чем у всех остальных возрастных групп.
Как и в случае коробчатых графиков, вы также можете добавить еще одну
категориальную переменную к графику скрипки, используя hue
как
показано ниже:
sns.violinplot(x='sex', y='age', data=dataset, hue='survived')
{.ezlazyload .img-responsive}
Теперь вы можете увидеть много информации по сюжету скрипки. Например, если вы посмотрите на нижнюю часть графика скрипки для мужчин, которые выжили (слева-оранжевый), вы увидите, что он толще, чем нижняя часть графика скрипки для мужчин, которые не выжили (слева-синий ). Это означает, что количество выживших молодых пассажиров-мужчин превышает количество выживших молодых пассажиров-мужчин. Сюжеты скрипки несут много информации, однако, с другой стороны, нужно немного времени и усилий, чтобы понять сюжеты скрипки.
Вместо того, чтобы строить два разных графика для пассажиров, которые
выжили, и тех, кто не выжил, вы можете разделить один график на скрипке
на две половины, где одна половина представляет выживших, а другая
половина - неживых пассажиров. Для этого вам необходимо пройти
относящиеся к True
в качестве значения для split
параметра
violinplot()
функции. Посмотрим, как это сделать:
sns.violinplot(x='sex', y='age', data=dataset, hue='survived', split=True)
Результат выглядит так:
{.ezlazyload .img-responsive}
Теперь вы можете ясно увидеть сравнение возраста пассажиров, которые выжили, и тех, кто не выжил, как для мужчин, так и для женщин.
И сценарии для скрипки, и для коробок могут быть чрезвычайно полезны. Однако, как показывает опыт, если вы представляете свои данные нетехнической аудитории, следует отдавать предпочтение коробчатым диаграммам, поскольку их легко понять. С другой стороны, если вы представляете свои результаты исследовательскому сообществу, удобнее использовать сценарий скрипки, чтобы сэкономить место и передать больше информации за меньшее время.
Участок полосы
Ленточный график представляет собой диаграмму рассеяния, в которой одна из переменных является категориальной. Мы видели графики разброса в разделах совместного графика и парного графика, где у нас были две числовые переменные. Ленточный график отличается тем, что в этом случае одна из переменных является категориальной, и для каждой категории в категориальной переменной вы увидите точечную диаграмму относительно числового столбца.
Функция stripplot()
используется для построения сценария скрипки. Как
и блочная диаграмма, первый параметр - это категориальный столбец,
второй параметр - это числовой столбец, а третий параметр - это набор
данных. Взгляните на следующий сценарий:
sns.stripplot(x='sex', y='age', data=dataset)
Выход:
{.ezlazyload .img-responsive}
Вы можете увидеть разбросанные графики возраста как для мужчин, так и
для женщин. Точки данных выглядят как полосы. Распределение данных в
такой форме трудно понять. Чтобы лучше понять данные, передайте True
для jitter
который добавляет к данным некоторый случайный шум.
Взгляните на следующий сценарий:
sns.stripplot(x='sex', y='age', data=dataset, jitter=True)
Выход:
{.ezlazyload .img-responsive}
Теперь у вас есть лучшее представление о возрастном распределении по полу.
Как и в скрипичных и коробчатых графиках, вы можете добавить
дополнительный категориальный столбец для полосовой диаграммы, используя
hue
как показано ниже:
sns.stripplot(x='sex', y='age', data=dataset, jitter=True, hue='survived')
{.ezlazyload .img-responsive}
Опять же, вы можете видеть, что у выживших самцов в нижней части графика больше очков, чем у тех, кто не выжил.
Как и скрипичные сюжеты, мы также можем разделить стрип-сюжеты. Выполните следующий скрипт:
sns.stripplot(x='sex', y='age', data=dataset, jitter=True, hue='survived', split=True)
Выход:
{.ezlazyload .img-responsive}
Теперь вы можете ясно увидеть разницу в возрастном распределении выживших пассажиров и пассажиров женского и мужского пола.
Заговор Роя
Сюжет роя представляет собой комбинацию сюжетов полосы и скрипки. На
графиках роя точки настроены таким образом, чтобы они не перекрывались.
Давайте построим график роя для распределения возраста по полу. Функция
swarmplot()
используется для построения графика скрипки. Как и блочная
диаграмма, первый параметр - это категориальный столбец, второй параметр
-
это числовой столбец, а третий параметр - это набор данных. Взгляните на следующий сценарий:
sns.swarmplot(x=‘sex’, y=‘age’, data=dataset)
{.ezlazyload .img-responsive}
Вы можете ясно видеть, что приведенный выше график содержит разбросанные точки данных, такие как полосовая диаграмма, и точки данных не перекрываются. Скорее они устроены так, чтобы дать вид, похожий на сюжет скрипки.
Давайте добавим еще один категориальный столбец к графику роя, используя
параметр hue
sns.swarmplot(x='sex', y='age', data=dataset, hue='survived')
Выход:
{.ezlazyload .img-responsive}
Из выходных данных видно, что доля выживших самцов меньше доли выживших самок. Так как для мужского сюжета синих точек больше и меньше оранжевых. С другой стороны, у женщин оранжевых точек (выживших) больше, чем синих (не выживших). Другое наблюдение: среди мужчин младше 10 лет выжило больше пассажиров, чем среди тех, кто этого не сделал.
Мы также можем разделить роевые диаграммы, как мы это делали в случае ленточных и коробчатых диаграмм. Для этого выполните следующий сценарий:
sns.swarmplot(x='sex', y='age', data=dataset, hue='survived', split=True)
Выход:
{.ezlazyload .img-responsive}
Теперь вы можете ясно видеть, что выжило больше женщин, чем мужчин.
Объединение сюжетов роя и скрипки
Графики роя не рекомендуются, если у вас огромный набор данных, так как они плохо масштабируются, потому что они должны отображать каждую точку данных. Если вам действительно нравятся участки роя, лучший способ - объединить два участка. Например, чтобы объединить сюжет скрипки с сюжетом роя, вам нужно выполнить следующий скрипт:
sns.violinplot(x='sex', y='age', data=dataset)
sns.swarmplot(x='sex', y='age', data=dataset, color='black')
Выход:
{.ezlazyload .img-responsive}
Хотя эта серия призвана стать подробным ресурсом по использованию Seaborn, есть много деталей, которые мы не сможем осветить в нескольких сообщениях в блоге. Также существует множество других библиотек визуализации для Python, функции которых выходят за рамки возможностей Seaborn. Чтобы получить более подробное руководство по визуализации данных в Python с помощью Seabor, а также 8 других библиотек, ознакомьтесь с Визуализацией данных в Python{.ebook-link} .
Заключение
Seaborn - это расширенная библиотека визуализации данных, построенная на основе библиотеки Matplotlib . В этой статье мы рассмотрели, как можно построить графики распределения и категорий, используя библиотеку Seaborn. Это первая часть серии статей о Seaborn. Во второй статье серии мы увидим, как мы поиграем с функциями сетки в Seaborn и как мы можем рисовать графики матриц и регрессии в Seaborn.