Рубрики
Без рубрики

Библиотека Seaborn для визуализации данных на Python: Часть 1

Автор оригинала: Usman Malik.

Вступление

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

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

Загрузка библиотеки Сиборна

Библиотеку seaborn можно загрузить несколькими способами. Если вы используете pip installer для библиотек Python, вы можете выполнить следующую команду для загрузки библиотеки:

pip install seaborn

В качестве альтернативы, если вы используете дистрибутив Anaconda Python, вы можете выполнить следующую команду для загрузки библиотеки 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. Вывод выглядит следующим образом:

Набор данных содержит 891 строку и 15 столбцов и содержит информацию о пассажирах, которые поднялись на борт несчастного корабля “Титаник”. Первоначальная задача состоит в том, чтобы предсказать, выжил ли пассажир в зависимости от различных особенностей, таких как его возраст, билет, каюта, в которую он сел, класс билета и т. Д. Мы воспользуемся библиотекой Сиборна, чтобы посмотреть, сможем ли мы найти какие-либо закономерности в данных.

Распределительные Участки

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

Сюжет Dist

Функция display() показывает гистограммное распределение данных для одного столбца. Имя столбца передается в качестве параметра функции distplot () . Давайте посмотрим, как распределяется цена билета для каждого пассажира. Выполните следующий сценарий:

sns.distplot(dataset['fare'])

Выход:

Вы можете видеть, что большинство билетов были решены между 0-50 долларами. Линия, которую вы видите, представляет собой оценку плотности ядра . Вы можете удалить эту строку, передав False в качестве параметра для атрибута kde , как показано ниже:

sns.distplot(dataset['fare'], kde=False)

Выход:

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

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

sns.distplot(dataset['fare'], kde=False, bins=10)

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

Выход:

Вы можете ясно видеть, что для более чем 700 пассажиров цена билета составляет от 0 до 50.

Совместный Заговор

Функция joint plot() используется для отображения взаимного распределения каждого столбца. Вам нужно передать три параметра в joint plot . Первый параметр-это имя столбца, для которого вы хотите отобразить распределение данных по оси x. Второй параметр-это имя столбца, для которого вы хотите отобразить распределение данных по оси y. Наконец, третий параметр-это имя фрейма данных.

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

sns.jointplot(x='age', y='fare', data=dataset)

Выход:

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

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

sns.jointplot(x='age', y='fare', data=dataset, kind='hex')

Выход:

На шестиугольном графике шестиугольник с наибольшим количеством точек получает более темный цвет. Итак, если вы посмотрите на вышеприведенный график, то увидите, что большинство пассажиров находятся в возрасте от 20 до 30 лет, и большинство из них заплатили за билеты от 10 до 50.

Заговор Пары

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

sns.pairplot(dataset)

Снимок части выходных данных показан ниже:

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

dataset = dataset.dropna()

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

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

sns.pairplot(dataset, hue='sex')

Выход:

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

Сюжет Ковра

Функция rug plot() используется для рисования небольших полос вдоль оси x для каждой точки набора данных. Чтобы построить график ковра, вам нужно передать имя столбца. Давайте построим ковровый заговор для платы за проезд.

sns.rugplot(dataset['fare'])

Выход:

Из выходных данных вы можете видеть, что , как и в случае с distplot () , большинство экземпляров тарифов имеют значения от 0 до 100.

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

Категориальные сюжеты

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

Барный участок

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

sns.barplot(x='sex', y='age', data=dataset)

Выход:

Из выходных данных вы можете ясно видеть, что средний возраст пассажиров мужского пола составляет чуть менее 40 лет, в то время как средний возраст пассажиров женского пола составляет около 33 лет.

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

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 для вычисления стандартного отклонения для возраста пассажиров мужского и женского пола. Вывод выглядит следующим образом:

Графский заговор

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

sns.countplot(x='sex', data=dataset)

Выходные данные показывают количество следующим образом:

Выход:

Сюжет коробки

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

Вы можете узнать больше о квартилях и коробочных графиках по ссылке this link .

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

sns.boxplot(x='sex', y='age', data=dataset)

Выход:

Давайте попробуем разобраться в сюжете коробки для женщины. Первый квартиль начинается примерно с 5 и заканчивается на 22, что означает, что 25% пассажиров в возрасте от 5 до 25 лет. Второй квартиль начинается примерно с 23 и заканчивается примерно на 32, что означает, что 25% пассажиров находятся в возрасте от 23 до 32 лет. Точно так же третий квартиль начинается и заканчивается между 34 и 42 годами, следовательно, 25% пассажиров находятся в этом диапазоне, и, наконец, четвертый или последний квартиль начинается с 43 и заканчивается около 65.

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

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

sns.boxplot(x='sex', y='age', data=dataset, hue="survived")

Выход:

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

Сюжет скрипки

График скрипки похож на boxplot, однако график скрипки позволяет нам отображать все компоненты, которые на самом деле соответствуют точке данных. Функция violin plot() используется для построения скрипичного графика. Как и в boxplot, первый параметр-это категориальный столбец, второй параметр-числовой столбец, а третий параметр-набор данных.

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

sns.violinplot(x='sex', y='age', data=dataset)

Выход:

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

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

sns.violinplot(x='sex', y='age', data=dataset, hue='survived')

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

Вместо того, чтобы строить два разных графика для выживших пассажиров и тех, кто не выжил, вы можете разделить один график скрипки на две половины, где одна половина представляет выживших, а другая-не выживших пассажиров. Для этого вам нужно передать True в качестве значения параметра split функции violin plot () . Давайте посмотрим, как мы можем это сделать:

sns.violinplot(x='sex', y='age', data=dataset, hue='survived', split=True)

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

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

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

Участок Полосы

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

Функция strip plot() используется для построения скрипичного графика. Как и в boxplot, первый параметр-это категориальный столбец, второй параметр-числовой столбец, а третий параметр-набор данных. Посмотрите на следующий сценарий:

sns.stripplot(x='sex', y='age', data=dataset)

Выход:

Вы можете видеть разбросанные графики возраста как для мужчин, так и для женщин. Точки данных выглядят как полоски. Трудно понять распределение данных в таком виде. Чтобы лучше понять данные, передайте True для параметра jitter , который добавляет некоторый случайный шум к данным. Посмотрите на следующий сценарий:

sns.stripplot(x='sex', y='age', data=dataset, jitter=True)

Выход:

Теперь у вас есть лучшее представление о распределении возраста между полами.

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

sns.stripplot(x='sex', y='age', data=dataset, jitter=True, hue='survived')

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

Как и скрипичные сюжеты, мы также можем разделить сюжеты полос. Выполните следующий сценарий:

sns.stripplot(x='sex', y='age', data=dataset, jitter=True, hue='survived', split=True)

Выход:

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

Заговор роя

Сюжет роя представляет собой комбинацию сюжетов полосы и скрипки. На роевых графиках точки настраиваются таким образом, чтобы они не перекрывались. Давайте построим график роя для распределения возраста по полу. Функция swarm plot() используется для построения скрипичного графика. Как и в boxplot, первый параметр-это категориальный столбец, второй параметр-числовой столбец, а третий параметр-набор данных. Посмотрите на следующий сценарий:

sns.swarmplot(x='sex', y='age', data=dataset)

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

Давайте добавим еще один категориальный столбец к диаграмме роя, используя параметр hue .

sns.swarmplot(x='sex', y='age', data=dataset, hue='survived')

Выход:

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

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

sns.swarmplot(x='sex', y='age', data=dataset, hue='survived', split=True)

Выход:

Теперь ясно видно, что женщин выжило больше, чем мужчин.

Объединение сюжетов Роя и Скрипки

Роевые графики не рекомендуются, если у вас есть огромный набор данных, так как они плохо масштабируются, потому что им приходится строить каждую точку данных. Если вам действительно нравятся сюжеты роя, лучший способ-объединить два сюжета. Например, чтобы объединить сюжет скрипки с сюжетом роя, вам нужно выполнить следующий сценарий:

sns.violinplot(x='sex', y='age', data=dataset)
sns.swarmplot(x='sex', y='age', data=dataset, color='black')

Выход:

Хотя эта серия нацелена на то, чтобы быть подробным ресурсом по использованию Seaborn, есть много деталей, которые мы не сможем осветить в нескольких сообщениях в блоге. Существует также множество других библиотек визуализации для Python, которые имеют функции, выходящие за рамки того, что может сделать Seaborn. Более подробное руководство по визуализации данных в Python с помощью Seaboard, а также 8 других библиотек см.

Вывод

Seaborn – это расширенная библиотека визуализации данных, построенная поверх библиотеки Matplotlib . В этой статье мы рассмотрели, как можно нарисовать распределительные и категориальные графики с помощью библиотеки Seaborn. Это часть 1 серии статей о Сиборне. Во второй статье серии мы увидим, как мы играем с сеточными функциями в Seaborn и как мы можем рисовать матричные и регрессионные графики в Seaborn.