Boxplot SNS: как создавать информативные графики в библиотеке Seaborn

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Для кого эта статья:

  • аналитиков данных и статистиков
  • студентов, обучающихся аналитике данных
  • профессионалов, заинтересованных в визуализации данных

    Визуализация данных определяет, насколько точно аудитория воспримет ваши аналитические выводы. Диаграмма размаха (boxplot) — мощный инструмент для понимания распределения данных и выявления выбросов, который часто недооценивают в пользу более привычных графиков. Библиотека Seaborn предоставляет элегантный способ создания таких визуализаций всего несколькими строками кода, превращая сырые данные в убедительные аргументы. Изучив приемы работы с boxplot в SNS, вы не просто улучшите свои презентации — вы сделаете ваши данные говорящими. 📊

Хотите профессионально визуализировать данные, а не просто рисовать графики? Курс «Аналитик данных» с нуля от Skypro поможет вам освоить не только Seaborn и boxplot, но и полный стек инструментов для аналитики. Наши выпускники создают визуализации, которые моментально выявляют аномалии в данных и помогают бизнесу принимать решения на основе фактов, а не интуиции. Научитесь превращать цифры в инсайты, которые понятны даже нетехническим специалистам.

Основы boxplot и его роль в анализе распределения данных

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

Основные элементы boxplot включают:

  • Медиана — центральная линия внутри "ящика", показывающая значение, делящее выборку на две равные части
  • Ящик (Box) — прямоугольник, ограниченный первым (Q1) и третьим (Q3) квартилями, содержащий 50% всех наблюдений
  • Усы (Whiskers) — линии, простирающиеся от ящика до крайних точек в пределах 1.5 × IQR (межквартильный размах)
  • Выбросы (Outliers) — точки за пределами усов, представляющие аномальные значения
Элемент boxplotЧто показываетЗначение для анализа
МедианаЦентральное значение распределенияУстойчива к выбросам, в отличие от среднего
Ящик (Q1-Q3)Межквартильный размах (IQR)Показывает вариативность центральных 50% данных
УсыДиапазон нормальных значенийОпределяет границы типичных наблюдений
ВыбросыАномальные значенияУказывают на необычные наблюдения, требующие внимания

Boxplot особенно полезен при:

  • Сравнении распределений нескольких групп данных
  • Выявлении асимметрии распределения (если медиана смещена относительно центра ящика)
  • Обнаружении выбросов, которые могут искажать результаты статистического анализа
  • Компактном представлении большого объема данных

Анна Романова, ведущий специалист по обработке данных

Однажды я анализировала данные о времени загрузки веб-страниц для крупного интернет-магазина. Гистограммы показывали приемлемое среднее время, и клиент был доволен. Однако, построив boxplot, я обнаружила значительное количество выбросов — случаев, когда страницы загружались катастрофически долго. Эти проблемы затрагивали около 5% пользователей, которые, вероятно, просто покидали сайт.

Без boxplot мы бы не заметили эту проблему, скрытую за "хорошим средним". После оптимизации проблемных страниц конверсия выросла на 12% — именно те пользователи, которые раньше не могли нормально пользоваться сайтом, теперь совершали покупки. Boxplot буквально позволил увидеть невидимое и трансформировать это в бизнес-результат.

Кинга Идем в IT: пошаговый план для смены профессии

Создание базовых boxplot графиков с помощью Seaborn

Seaborn — это библиотека для создания статистических графиков в Python, построенная на основе matplotlib. Она значительно упрощает процесс создания привлекательных и информативных визуализаций, включая boxplot. Начнем с базовых примеров.

Для начала работы необходимо импортировать необходимые библиотеки:

Python
Скопировать код
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Устанавливаем стиль
sns.set_style("whitegrid")

Создание простейшего boxplot в Seaborn требует минимум кода:

Python
Скопировать код
# Загружаем встроенный датасет
tips = sns.load_dataset("tips")

# Создаем базовый boxplot
plt.figure(figsize=(10, 6))
sns.boxplot(x=tips["total_bill"])
plt.title("Распределение счетов в ресторане")
plt.show()

Для сравнения распределения по категориям добавляем параметр y:

Python
Скопировать код
# Boxplot с категориальной переменной
plt.figure(figsize=(10, 6))
sns.boxplot(x="day", y="total_bill", data=tips)
plt.title("Распределение счетов по дням недели")
plt.show()

Seaborn предлагает несколько ключевых параметров для настройки boxplot:

ПараметрФункцияПример использования
dataDataFrame с данными для визуализацииdata=tips
x, yИмена колонок для осей x и yx="day", y="total_bill"
hueДобавляет третье измерение (группировку)hue="sex"
orderЗадает порядок категорийorder=["Sun", "Sat", "Fri", "Thur"]
widthШирина блоковwidth=0.8

Типичный рабочий процесс создания boxplot в Seaborn включает:

  1. Подготовку и осмотр данных
  2. Базовую визуализацию с sns.boxplot()
  3. Добавление группировки с помощью параметра hue
  4. Настройку внешнего вида и осей
  5. Добавление заголовка и подписей

Важно обработать выбросы. По умолчанию, Seaborn показывает все выбросы как отдельные точки, но это поведение можно настроить:

Python
Скопировать код
# Настройка отображения выбросов
plt.figure(figsize=(10, 6))
sns.boxplot(x="day", y="total_bill", data=tips, 
flierprops={"marker": "x", "markerfacecolor": "red"})
plt.title("Распределение счетов с выделенными выбросами")
plt.show()

Если у вас очень большой набор данных, может быть полезно использовать showfliers=False для скрытия выбросов, чтобы сосредоточиться на общем распределении.

Настройка внешнего вида boxplot в SNS: цвета и стили

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

Начнем с изменения общего стиля Seaborn:

Python
Скопировать код
# Доступные стили: 'darkgrid', 'whitegrid', 'dark', 'white', 'ticks'
sns.set_style("darkgrid")

# Изменение масштаба элементов
sns.set_context("talk") # Варианты: 'paper', 'notebook', 'talk', 'poster'

Цветовые схемы существенно влияют на восприятие диаграмм. Seaborn предлагает готовые палитры и возможность создания собственных:

Python
Скопировать код
# Использование встроенных цветовых палитр
plt.figure(figsize=(12, 6))
sns.boxplot(x="day", y="total_bill", data=tips, 
hue="time", palette="Set2")
plt.title("Распределение счетов по времени и дням")
plt.show()

# Создание собственной палитры
custom_palette = {"Lunch": "#2ecc71", "Dinner": "#e74c3c"}
plt.figure(figsize=(12, 6))
sns.boxplot(x="day", y="total_bill", data=tips, 
hue="time", palette=custom_palette)
plt.title("Распределение счетов с кастомными цветами")
plt.show()

Детальная настройка элементов boxplot позволяет создать уникальную визуализацию:

Python
Скопировать код
plt.figure(figsize=(12, 6))
sns.boxplot(x="day", y="total_bill", data=tips,
# Настройка ящика
boxprops={"facecolor": "lightblue", "edgecolor": "navy", "alpha": 0.7},
# Настройка медианы
medianprops={"color": "red", "linewidth": 2},
# Настройка усов
whiskerprops={"color": "darkblue", "linestyle": "--"},
# Настройка краев ящика
capprops={"color": "darkblue", "linewidth": 2},
# Настройка выбросов
flierprops={"marker": "o", "markerfacecolor": "red", 
"markersize": 10, "alpha": 0.5})
plt.title("Детально настроенный boxplot")
plt.show()

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

Python
Скопировать код
plt.figure(figsize=(12, 6))
# Основной boxplot
ax = sns.boxplot(x="day", y="total_bill", data=tips, 
palette="pastel", width=0.6)

# Добавляем точки средних значений
sns.pointplot(x="day", y="total_bill", data=tips, 
color="black", markers="d", scale=1.5, ax=ax)

plt.title("Boxplot с выделенными средними значениями")
plt.show()

Для создания более сложных визуализаций часто требуется прямое обращение к объекту осей matplotlib:

Python
Скопировать код
fig, ax = plt.subplots(figsize=(12, 6))
sns.boxplot(x="day", y="total_bill", data=tips, ax=ax)

# Добавление аннотаций
for i, day in enumerate(tips["day"].unique()):
day_data = tips[tips["day"] == day]["total_bill"]
ax.text(i, day_data.max() + 2, 
f"n = {len(day_data)}\nмакс: {day_data.max():.1f}", 
ha='center')

# Добавление сетки только по оси Y
ax.grid(axis="y", linestyle="--", alpha=0.7)
plt.title("Boxplot с дополнительными аннотациями")
plt.tight_layout()
plt.show()

Сергей Васильев, визуальный аналитик данных

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

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

Эффект был мгновенным. "Теперь я вижу картину целиком," — сказал клиент. В итоге, именно благодаря этим кастомизированным boxplot он выбрал два района для инвестиций, которые через год показали рост на 17% выше рынка. Правильная настройка визуализации превратила абстрактные данные в инструмент для принятия решений стоимостью в миллионы.

Многомерные boxplot-визуализации для сравнения групп

Истинная сила boxplot раскрывается при сравнении распределения данных в различных группах или категориях. Многомерные boxplot-визуализации позволяют выявлять паттерны и различия, которые могут оставаться скрытыми при традиционном анализе. Рассмотрим основные подходы к созданию таких визуализаций. 📊

Начнем с группировки по одной дополнительной категориальной переменной с помощью параметра hue:

Python
Скопировать код
plt.figure(figsize=(12, 6))
sns.boxplot(x="day", y="total_bill", hue="sex", data=tips)
plt.title("Распределение счетов по дням и полу клиента")
plt.show()

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

Python
Скопировать код
# Создаем сложную группировку
plt.figure(figsize=(14, 8))
sns.boxplot(x="day", y="total_bill", hue="time", 
data=tips, palette="Set3",
dodge=True) # dodge разделяет группы
plt.title("Распределение счетов по дням, времени приема пищи")
plt.legend(title="Время", loc="upper right")
plt.show()

Когда категорий слишком много, эффективнее использовать сеточную структуру с facetgrid:

Python
Скопировать код
# Создание сетки графиков
g = sns.FacetGrid(tips, col="time", row="sex", height=4, aspect=1.5)
g.map_dataframe(sns.boxplot, x="day", y="total_bill")
g.add_legend()
g.fig.suptitle("Распределение счетов по дням, полу и времени", 
y=1.05, fontsize=16)
plt.tight_layout()
plt.show()

Для сравнения нескольких числовых переменных одновременно можно использовать различные подходы:

  1. Многовариантный boxplot — отображение нескольких переменных на одном графике
  2. Парные boxplot — сетка боксплотов для попарного сравнения
  3. Приведенные масштабы — нормализация переменных для сравнимости
Python
Скопировать код
# Преобразование данных для многовариантного сравнения
tips_long = pd.melt(tips, 
id_vars=["day", "time", "sex", "smoker", "size"],
value_vars=["total_bill", "tip"],
var_name="measure", value_name="amount")

plt.figure(figsize=(12, 6))
sns.boxplot(x="day", y="amount", hue="measure", data=tips_long)
plt.title("Сравнение счетов и чаевых по дням")
plt.show()

Использование статистических тестов с визуализацией повышает объективность сравнения:

Python
Скопировать код
# Добавление статистики с помощью statplot
plt.figure(figsize=(14, 8))
ax = sns.boxplot(x="day", y="total_bill", data=tips)

# Добавляем p-значения для попарных сравнений
from statannotations.Annotator import Annotator

pairs = [("Sun", "Sat"), ("Sun", "Thur"), ("Sat", "Thur")]
annotator = Annotator(ax, pairs, data=tips, x="day", y="total_bill")
annotator.configure(test='Mann-Whitney', text_format='star', loc='inside')
annotator.apply_and_annotate()

plt.title("Распределение счетов с статистическими сравнениями")
plt.show()

Для большей информативности можно комбинировать boxplot с другими типами графиков:

Python
Скопировать код
plt.figure(figsize=(14, 8))

# Основной boxplot
ax = sns.boxplot(x="day", y="total_bill", data=tips, 
color="lightgray", width=0.5)

# Наложение violin plot для отображения плотности распределения
sns.violinplot(x="day", y="total_bill", data=tips, 
inner=None, color="skyblue", alpha=0.4)

# Добавление точек реальных наблюдений
sns.stripplot(x="day", y="total_bill", data=tips, 
size=4, color="darkblue", alpha=0.3)

plt.title("Комбинированная визуализация распределения счетов")
plt.show()

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

Python
Скопировать код
# Нормирование данных
from sklearn.preprocessing import StandardScaler

# Создаем копию данных с нормированными числовыми колонками
tips_scaled = tips.copy()
scaler = StandardScaler()
tips_scaled[["total_bill", "tip"]] = scaler.fit_transform(
tips[["total_bill", "tip"]]
)

# Визуализируем нормированные данные
plt.figure(figsize=(12, 6))
sns.boxplot(x="day", y="total_bill", hue="time", data=tips_scaled)
plt.title("Стандартизованное распределение счетов")
plt.ylabel("Счет (стандартизованный)")
plt.show()

Наиболее информативные многомерные boxplot визуализации сочетают:

  • Чёткую группировку данных по нескольким признакам
  • Сопутствующую статистическую информацию
  • Интуитивно понятное цветовое кодирование
  • Адекватную плотность информации без перегрузки графика
  • Последовательную логику представления для нескольких графиков

Заинтересованы в создании многомерных визуализаций, но не уверены, подходит ли аналитика данных для вас? Тест на профориентацию от Skypro поможет определить, насколько ваши навыки и интересы соответствуют профессии аналитика. Вы получите персональные рекомендации по развитию карьеры, узнаете свои сильные стороны, которые можно применить в работе с данными и визуализациями, включая создание сложных boxplot-диаграмм в Seaborn для многомерного анализа.

Практические кейсы применения boxplot SNS в аналитике

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

Кейс 1: Анализ цен на недвижимость в разных районах города

Цены на недвижимость образуют часто несимметричное распределение с выбросами, что делает boxplot идеальным инструментом для их анализа:

Python
Скопировать код
# Загружаем данные о недвижимости
housing = sns.load_dataset("housing")

plt.figure(figsize=(14, 8))
sns.boxplot(x="neighborhood", y="price", data=housing, 
palette="viridis", order=housing.groupby("neighborhood")["price"].median().
sort_values(ascending=False).index)
plt.xticks(rotation=45, ha="right")
plt.title("Распределение цен на недвижимость по районам")
plt.tight_layout()
plt.show()

Этот график позволяет:

  • Ранжировать районы по медиане цен
  • Выявить районы с наибольшим разбросом цен (потенциально перспективные для инвестиций)
  • Обнаружить аномально дорогие объекты (выбросы), которые могут искажать средние показатели
  • Оценить симметричность распределения цен в каждом районе

Кейс 2: Мониторинг производительности системы

Boxplot отлично подходит для анализа временных рядов производительности, особенно когда нас интересует не только среднее значение, но и стабильность системы:

Python
Скопировать код
# Создаем синтетические данные времени отклика
import numpy as np
performance = pd.DataFrame({
"hour_of_day": np.repeat(range(0, 24), 100),
"response_time_ms": np.concatenate([
np.random.normal(100, 10, 100) + h * 5 if h < 12 
else np.random.normal(250, 50, 100) – (h-12) * 10 
for h in range(24)
]),
"server": np.random.choice(["Server A", "Server B"], 24*100)
})

plt.figure(figsize=(16, 6))
sns.boxplot(x="hour_of_day", y="response_time_ms", hue="server", 
data=performance, palette="cool")
plt.axhline(y=150, color='r', linestyle='--', 
label="Критический порог")
plt.title("Время отклика серверов по часам")
plt.legend(title="")
plt.tight_layout()
plt.show()

Данная визуализация позволяет:

  • Выявить часы пиковой нагрузки с повышенным временем отклика
  • Сравнить стабильность работы разных серверов (по размеру ящиков)
  • Определить часы с аномальными всплесками (выбросы)
  • Оценить соответствие производительности установленному порогу

Кейс 3: Сравнение эффективности маркетинговых кампаний

При анализе результатов маркетинговых кампаний важно учитывать не только средние показатели, но и их вариативность:

Python
Скопировать код
# Данные по маркетинговым кампаниям
campaigns = pd.DataFrame({
"campaign": np.repeat(["Email", "Social", "Search", "Display", "Affiliate"], 50),
"cpa": np.concatenate([
np.random.gamma(shape=5, scale=5, size=50), # Email
np.random.normal(30, 10, 50), # Social
np.random.normal(20, 5, 50), # Search
np.random.normal(40, 15, 50), # Display
np.random.exponential(scale=25, size=50) # Affiliate
]),
"channel_type": np.repeat(["Direct", "Direct", "Paid", "Paid", "Indirect"], 50)
})

plt.figure(figsize=(12, 6))
# Основной boxplot
ax = sns.boxplot(x="campaign", y="cpa", data=campaigns, 
order=campaigns.groupby("campaign")["cpa"].median().
sort_values().index,
palette={"Email": "#3498db", "Social": "#2ecc71", 
"Search": "#f1c40f", "Display": "#e74c3c", 
"Affiliate": "#9b59b6"})

# Добавляем информацию о средних значениях
for i, campaign in enumerate(ax.get_xticklabels()):
campaign_name = campaign.get_text()
mean_cpa = campaigns[campaigns["campaign"] == campaign_name]["cpa"].mean()
ax.text(i, -5, f"μ={mean_cpa:.1f}", ha='center')

plt.axhline(y=25, color='r', linestyle='--', 
label="Целевой CPA")
plt.title("Стоимость привлечения клиента (CPA) по каналам")
plt.legend()
plt.tight_layout()
plt.show()

Такой анализ позволяет:

  • Ранжировать каналы по эффективности (медиана CPA)
  • Оценить стабильность результатов (ширина ящика)
  • Выявить кампании с непредсказуемыми результатами (длинные усы, много выбросов)
  • Определить каналы, не соответствующие целевому показателю CPA
Область примененияОсобенности boxplot анализаКлючевые инсайты
Финансовый анализОценка распределения доходности активовВыявление активов с высокой волатильностью
Медицинские исследованияСравнение эффективности препаратовРазличия в вариабельности ответа на лечение
Контроль качестваМониторинг производственных параметровВыявление процессов с нестабильными результатами
HR-аналитикаАнализ зарплат по отделамВыявление неравенства в оплате труда
UX-исследованияОценка времени выполнения задачИдентификация функций с непредсказуемым UX

Советы для эффективного применения boxplot в практических задачах:

  1. Сортируйте категории по медиане для облегчения интерпретации
  2. Добавляйте референтные линии для сравнения с целевыми показателями
  3. Используйте цветовое кодирование для выделения важных групп
  4. Комбинируйте boxplot с другими визуализациями для полноты картины
  5. Включайте размер выборки (n) для каждой группы на график
  6. Адаптируйте отображение выбросов в зависимости от целей анализа
  7. Применяйте логарифмический масштаб для данных с большим диапазоном значений

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