Boxplot SNS: как создавать информативные графики в библиотеке Seaborn
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- аналитиков данных и статистиков
- студентов, обучающихся аналитике данных
профессионалов, заинтересованных в визуализации данных
Визуализация данных определяет, насколько точно аудитория воспримет ваши аналитические выводы. Диаграмма размаха (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 буквально позволил увидеть невидимое и трансформировать это в бизнес-результат.

Создание базовых boxplot графиков с помощью Seaborn
Seaborn — это библиотека для создания статистических графиков в Python, построенная на основе matplotlib. Она значительно упрощает процесс создания привлекательных и информативных визуализаций, включая boxplot. Начнем с базовых примеров.
Для начала работы необходимо импортировать необходимые библиотеки:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Устанавливаем стиль
sns.set_style("whitegrid")
Создание простейшего boxplot в Seaborn требует минимум кода:
# Загружаем встроенный датасет
tips = sns.load_dataset("tips")
# Создаем базовый boxplot
plt.figure(figsize=(10, 6))
sns.boxplot(x=tips["total_bill"])
plt.title("Распределение счетов в ресторане")
plt.show()
Для сравнения распределения по категориям добавляем параметр y
:
# Boxplot с категориальной переменной
plt.figure(figsize=(10, 6))
sns.boxplot(x="day", y="total_bill", data=tips)
plt.title("Распределение счетов по дням недели")
plt.show()
Seaborn предлагает несколько ключевых параметров для настройки boxplot:
Параметр | Функция | Пример использования |
---|---|---|
data | DataFrame с данными для визуализации | data=tips |
x, y | Имена колонок для осей x и y | x="day", y="total_bill" |
hue | Добавляет третье измерение (группировку) | hue="sex" |
order | Задает порядок категорий | order=["Sun", "Sat", "Fri", "Thur"] |
width | Ширина блоков | width=0.8 |
Типичный рабочий процесс создания boxplot в Seaborn включает:
- Подготовку и осмотр данных
- Базовую визуализацию с
sns.boxplot()
- Добавление группировки с помощью параметра
hue
- Настройку внешнего вида и осей
- Добавление заголовка и подписей
Важно обработать выбросы. По умолчанию, Seaborn показывает все выбросы как отдельные точки, но это поведение можно настроить:
# Настройка отображения выбросов
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:
# Доступные стили: 'darkgrid', 'whitegrid', 'dark', 'white', 'ticks'
sns.set_style("darkgrid")
# Изменение масштаба элементов
sns.set_context("talk") # Варианты: 'paper', 'notebook', 'talk', 'poster'
Цветовые схемы существенно влияют на восприятие диаграмм. Seaborn предлагает готовые палитры и возможность создания собственных:
# Использование встроенных цветовых палитр
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 позволяет создать уникальную визуализацию:
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 с другими элементами:
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:
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
:
plt.figure(figsize=(12, 6))
sns.boxplot(x="day", y="total_bill", hue="sex", data=tips)
plt.title("Распределение счетов по дням и полу клиента")
plt.show()
Для более сложных сравнений можно использовать несколько категориальных переменных, создавая многоуровневые группировки:
# Создаем сложную группировку
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:
# Создание сетки графиков
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()
Для сравнения нескольких числовых переменных одновременно можно использовать различные подходы:
- Многовариантный boxplot — отображение нескольких переменных на одном графике
- Парные boxplot — сетка боксплотов для попарного сравнения
- Приведенные масштабы — нормализация переменных для сравнимости
# Преобразование данных для многовариантного сравнения
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()
Использование статистических тестов с визуализацией повышает объективность сравнения:
# Добавление статистики с помощью 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 с другими типами графиков:
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()
Когда требуется сравнение относительных изменений, а не абсолютных значений, полезно нормировать данные:
# Нормирование данных
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 идеальным инструментом для их анализа:
# Загружаем данные о недвижимости
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 отлично подходит для анализа временных рядов производительности, особенно когда нас интересует не только среднее значение, но и стабильность системы:
# Создаем синтетические данные времени отклика
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: Сравнение эффективности маркетинговых кампаний
При анализе результатов маркетинговых кампаний важно учитывать не только средние показатели, но и их вариативность:
# Данные по маркетинговым кампаниям
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 в практических задачах:
- Сортируйте категории по медиане для облегчения интерпретации
- Добавляйте референтные линии для сравнения с целевыми показателями
- Используйте цветовое кодирование для выделения важных групп
- Комбинируйте boxplot с другими визуализациями для полноты картины
- Включайте размер выборки (n) для каждой группы на график
- Адаптируйте отображение выбросов в зависимости от целей анализа
- Применяйте логарифмический масштаб для данных с большим диапазоном значений
Понимание распределения данных и выявление закономерностей с помощью boxplot — одно из фундаментальных умений современного аналитика. Переосмысление визуализации как инструмента поиска истины, а не просто способа представления известных фактов, позволяет находить неочевидные инсайты. Используя техники, описанные в этой статье, вы сможете превратить любой набор данных в говорящую историю, которая направит принятие решений в правильное русло. Каждый boxplot — это не просто график, а возможность глубже понять ваши данные.