0Pricing
Pandas & NumPy Academy · Урок

Категориальные графики: boxplot, barplot, violinplot

Сравнивайте распределения по группам с помощью ящиков с усами и скрипичных диаграмм, а средние значения групп показывайте с доверительными интервалами с помощью barplot.

«Категориальные графики: boxplot, barplot, violinplot» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Зачем нужны графики сравнения категорий?

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

import seaborn as sns
import matplotlib.pyplot as plt

# Load the tips dataset — a classic Seaborn example
tips = sns.load_dataset('tips')
print(tips.groupby('day')['total_bill'].describe())

Коробчатые диаграммы с sns.boxplot

Коробчатая диаграмма описывает распределение с помощью пяти статистик: минимального значения, первого квартиля (Q1), медианы, третьего квартиля (Q3) и максимального значения (без учёта выбросов). Коробка простирается от Q1 до Q3 (межквартильный размах, IQR), линия внутри коробки обозначает медиану, а «усы» простираются до 1,5×IQR. Точки за пределами «усов» отображаются отдельно как выбросы. Коробчатые диаграммы отлично подходят для быстрого выявления асимметрии и выбросов.

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.boxplot(data=tips, x='day', y='total_bill', order=['Thur', 'Fri', 'Sat', 'Sun'])
plt.title('Total Bill Distribution by Day')
plt.xlabel('Day')
plt.ylabel('Total Bill ($)')
plt.show()

Добавление hue к коробчатым диаграммам

Параметр hue разделяет каждую категорию на подгруппы, которые отображаются рядом разными цветами. Например, добавление hue='smoker' к коробчатой диаграмме зависимости счёта от дня показывает по две коробки на каждый день: одну для курящих и одну для некурящих. Это упрощает сравнение трёх переменных без использования отдельных панелей. Используйте легенду, чтобы график оставался читаемым.

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.boxplot(
    data=tips,
    x='day',
    y='total_bill',
    hue='smoker',
    order=['Thur', 'Fri', 'Sat', 'Sun'],
    palette='Set2'
)
plt.title('Bill by Day and Smoker Status')
plt.legend(title='Smoker')
plt.show()

Столбчатые диаграммы с sns.barplot

sns.barplot() показывает среднее значение числовой переменной для каждой категории, а погрешности по умолчанию представляют 95%-ный доверительный интервал (в старых версиях Seaborn он вычислялся с помощью бутстрэппинга, а в новых — на основе стандартной ошибки). В отличие от гистограмм, столбчатые диаграммы сводят каждую группу к одному значению — они лучше всего подходят, когда Вас интересуют среднее значение и его неопределённость, а не полная форма распределения.

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Show mean tip per day with 95% CI
sns.barplot(
    data=tips,
    x='day',
    y='tip',
    order=['Thur', 'Fri', 'Sat', 'Sun'],
    palette='Blues_d',
    errorbar='ci'
)
plt.title('Average Tip by Day (with 95% CI)')
plt.ylabel('Average Tip ($)')
plt.show()

Скрипичные диаграммы с sns.violinplot

Скрипичная диаграмма объединяет коробчатую диаграмму с кривой KDE, зеркально отражённой по обе стороны. Ширина скрипки на каждом значении y показывает плотность данных в этой точке: широкие участки соответствуют большому числу наблюдений, узкие — малому. Скрипичные диаграммы передают больше информации, чем коробчатые, поскольку показывают, является ли распределение одномодальным или многомодальным, но для содержательной интерпретации им требуется больше данных (старайтесь иметь не менее 20 наблюдений в каждой группе).

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.violinplot(
    data=tips,
    x='day',
    y='total_bill',
    order=['Thur', 'Fri', 'Sat', 'Sun'],
    palette='pastel',
    inner='quartile'  # show quartile lines inside the violin
)
plt.title('Bill Distribution by Day — Violin Plot')
plt.show()

Параметр inner в violinplot

Параметр inner в violinplot определяет, что будет отображаться внутри скрипичной формы. Возможные варианты: 'box' (миниатюрная коробчатая диаграмма), 'quartile' (горизонтальные линии на уровнях Q1, медианы и Q3), 'point' (отдельные точки данных) и 'stick' (вертикальные отметки для каждого наблюдения). При значении inner=None отображается только оболочка плотности без внутренних отметок, что обеспечивает наиболее лаконичный вид при сравнении диаграмм рядом.

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

sns.violinplot(data=tips, x='smoker', y='tip',
               inner='box', ax=axes[0])
axes[0].set_title('inner="box"')

sns.violinplot(data=tips, x='smoker', y='tip',
               inner='point', ax=axes[1])
axes[1].set_title('inner="point"')

plt.tight_layout()
plt.show()

Сочетание точечных диаграмм с коробчатыми и скрипичными

Добавление sns.stripplot() поверх коробчатой или скрипичной диаграммы показывает каждую отдельную точку данных в виде точки, не позволяя скрыть выбросы и небольшой размер выборки. Установите jitter=True, чтобы равномерно распределить точки по горизонтали и не допустить их полного наложения друг на друга, а параметру alpha задайте значение для полупрозрачности точек, если их много.

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

ax = sns.boxplot(data=tips, x='day', y='tip',
                 order=['Thur', 'Fri', 'Sat', 'Sun'],
                 palette='Set3', width=0.5)

# Overlay individual points
sns.stripplot(data=tips, x='day', y='tip',
              order=['Thur', 'Fri', 'Sat', 'Sun'],
              color='black', alpha=0.3, jitter=True, size=3, ax=ax)

plt.title('Tip Distribution with Raw Points')
plt.show()

Выбор между boxplot, barplot и violinplot

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

catplot: интерфейс уровня фигуры

sns.catplot() — это оболочка уровня фигуры для всех категориальных диаграмм. Передайте kind='box', 'bar', 'violin', 'strip', 'swarm', 'count' или 'point', чтобы изменить тип диаграммы. Главное преимущество — параметры col и row, которые автоматически создают сетку подграфиков: например, отдельные панели для каждого пола или времени суток без необходимости вручную создавать plt.subplots.

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Faceted box plots: separate panel per time of day
sns.catplot(
    data=tips,
    x='day',
    y='total_bill',
    col='time',
    kind='box',
    order=['Thur', 'Fri', 'Sat', 'Sun'],
    height=5,
    aspect=0.8
)
plt.suptitle('Bill by Day, Faceted by Time', y=1.02)
plt.show()

Диаграммы частот для таблиц частот

sns.countplot() показывает, сколько наблюдений относится к каждой категории, то есть фактически является столбчатой диаграммой количества наблюдений. Это эквивалентно вызову value_counts() с последующим построением диаграммы. Используйте её, чтобы визуализировать дисбаланс классов в наборах данных, частоту категориальных значений или размер выборки в каждой группе перед сравнением распределений. Отсортировать столбцы по частоте можно с помощью order=df['col'].value_counts().index.

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Count by day, sorted by frequency
day_order = tips['day'].value_counts().index

sns.countplot(data=tips, x='day', order=day_order, palette='viridis')
plt.title('Number of Observations per Day')
plt.ylabel('Count')
plt.show()

Точечные диаграммы для сравнения эффектов

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

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.pointplot(
    data=tips,
    x='day',
    y='tip',
    hue='smoker',
    order=['Thur', 'Fri', 'Sat', 'Sun'],
    dodge=True,
    capsize=0.1
)
plt.title('Mean Tip by Day and Smoker Status')
plt.show()

Быстрая проверка

Проверьте, насколько хорошо Вы поняли категориальные диаграммы Seaborn из этого урока.

Итоги урока

В этом уроке Вы узнали, что sns.boxplot обобщает распределения с помощью медианы, IQR и выбросов, sns.barplot показывает средние значения групп с доверительными интервалами в виде погрешностей, а sns.violinplot раскрывает полную форму распределения, включая многомодальность. Далее Вы изучите точечные диаграммы и парные диаграммы для визуализации связей между числовыми переменными.

Часто задаваемые вопросы

Урок «Категориальные графики: boxplot, barplot, violinplot» бесплатный?

Да — полный текст урока «Категориальные графики: boxplot, barplot, violinplot» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Категориальные графики: boxplot, barplot, violinplot»?

Сравнивайте распределения по группам с помощью ящиков с усами и скрипичных диаграмм, а средние значения групп показывайте с доверительными интервалами с помощью barplot. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Категориальные графики: boxplot, barplot, violinplot»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Графики распределений: histplot и kdeplot
  2. Категориальные графики: boxplot, barplot, violinplot
  3. Диаграммы рассеяния и парные графики
  4. Тепловые карты корреляционных матриц
← Назад к Pandas & NumPy Academy