Знакомство с Seaborn

Seaborn — это Matplotlib, который думает в терминах статистики и DataFrame. Меньше кода, красивее по умолчанию.

«Seaborn берёт на себя статистику и эстетику, оставляя вам формулировку вопроса к данным».

Seaborn построен поверх Matplotlib. Он понимает таблицы (pandas DataFrame), сам считает агрегаты, доверительные интервалы и плотности, и выдаёт аккуратный результат с приятными темами «из коробки». Там, где в чистом Matplotlib нужно 15 строк, в Seaborn хватает одной.

Чтобы понять выгоду, представьте задачу «средние продажи по регионам с оценкой неопределённости». В чистом Matplotlib пришлось бы вручную сгруппировать DataFrame по региону, посчитать среднее каждой группы, вычислить доверительный интервал бутстрэпом, нарисовать столбики, добавить усы погрешности и подписать оси. В Seaborn это одна строка sns.barplot(data=df, x="region", y="sales") — вся статистика и оформление спрятаны внутри. Этот сдвиг меняет сам стиль работы: вы формулируете вопрос к данным («как сравнить группы?»), а не описываете пошаговую процедуру рисования. Поэтому Seaborn особенно ценен на этапе разведки, когда нужно быстро перебрать десяток срезов и не утонуть в рутинном коде.

Ключ к Seaborn — «длинный» (tidy) формат данных: одна строка таблицы — одно наблюдение, а переменные разложены по колонкам. Тогда отображение на график задаётся просто именами колонок: x, y, hue (цвет-категория), size, style, col/row (панели). Это и есть «грамматика данных»: вы декларативно связываете колонки с визуальными каналами, а Seaborn сам решает, как сгруппировать, агрегировать и раскрасить. «Широкие» данные (категории, разбросанные по столбцам) Seaborn тоже примет, но тогда вы теряете гибкость hue и фасетинга — поэтому перед визуализацией данные обычно приводят к длинному виду через pandas.melt.

import seaborn as sns
import pandas as pd

sns.set_theme(style="whitegrid")   # приятная тема и палитра

# одна строка вместо ручного группирования и расчёта средних
sns.barplot(data=df, x="region", y="sales")

# scatter с регрессией и доверительным интервалом
sns.lmplot(data=df, x="area", y="price")

# распределение с KDE
sns.histplot(data=df, x="age", kde=True)

Главное отличие от Matplotlib: вы передаёте имена колонок, а Seaborn сам достаёт данные, группирует и подписывает оси. Это «грамматика данных», а не ручное рисование.

Как работает под капотом

Seaborn под капотом всё равно вызывает Matplotlib: создаёт Figure и Axes, рисует artists. Но между вашими данными и графиком он вставляет статистический слой: группирует по категориям, считает среднее и бутстрэп-доверительный интервал (та самая «чёрточка» на barplot), оценивает плотность для KDE. Поэтому из barplot вы получаете не сырые числа, а агрегаты с оценкой неопределённости.

Бутстрэп, на котором держится доверительный интервал Seaborn, работает так: из вашей выборки многократно (по умолчанию около тысячи раз) берут случайную подвыборку того же размера с возвращением, каждый раз считают среднее и смотрят, как эти средние разбросаны. Перцентильный диапазон этого облака средних и есть доверительный интервал — отсюда видно, что чем меньше наблюдений в группе, тем шире усы, потому что среднее по малой выборке нестабильно. Это честнее, чем рисовать столбики без всякой оценки, и сразу подсказывает, каким различиям между группами можно доверять, а какие — в пределах шума. Важно помнить, что barplot по умолчанию показывает именно среднее (estimator=mean); если нужна сумма или медиана, это задаётся явным параметром estimator.

Поскольку Seaborn в итоге рисует обычными средствами Matplotlib, его результат полностью совместим с низкоуровневым API: объект Axes можно дооформить вручную — поменять подписи через ax.set_xlabel, повернуть тики, добавить аннотации. Это снимает ложную дилемму «или Seaborn, или Matplotlib»: на практике их сочетают — Seaborn делает тяжёлую статистическую часть, а Matplotlib доводит детали. Тему и палитру задают один раз через sns.set_theme(), и она применяется ко всем последующим графикам, включая нарисованные напрямую через Matplotlib, потому что Seaborn просто меняет глобальные rcParams.

Та «чёрточка погрешности» — это интервал вокруг среднего. Прикинем стандартную ошибку среднего вручную.

# Стандартная ошибка среднего (SEM) — основа "усов" на barplot
group = [21, 24, 19, 23, 25, 20, 22, 26, 18, 24]

n = len(group)
mean = sum(group) / n
var = sum((x - mean) ** 2 for x in group) / (n - 1)   # выборочная дисперсия
std = var ** 0.5
sem = std / (n ** 0.5)

print("mean =", round(mean, 2))
print("std  =", round(std, 2))
print("SEM  =", round(sem, 2), " -> примерный CI95 +/-", round(1.96 * sem, 2))

«Попробуй сам ▶» — SEM и интервал ±1.96·SEM и есть та чёрточка, что Seaborn рисует поверх столбика, показывая надёжность среднего.

Частые ошибки

Передавать в Seaborn неаккуратные «широкие» данные вместо «длинного» формата (tidy). Не понимать, что barplot показывает среднее, а не сумму. Игнорировать доверительный интервал. Бороться с темой Seaborn вручную вместо set_theme.

Best practices

  • Готовьте данные в «длинном» (tidy) формате: одна строка — одно наблюдение.
  • Задавайте тему один раз через sns.set_theme().
  • Помните: barplot — это среднее с CI, а не сумма (для суммы используйте Matplotlib или estimator=sum).

Итог: Seaborn ускоряет статвизуализацию. Дальше разберём ключевое различие его функций — figure-level против axes-level.

Проверьте себя
1. Что Seaborn делает за вас по сравнению с чистым Matplotlib?
AНичего, это просто тема
BГруппирует данные, считает агрегаты и доверительные интервалы
CЗаменяет Python
DРисует только в 3D
2. Что по умолчанию показывает чёрточка-«ус» на seaborn barplot?
AМаксимум
BДоверительный интервал вокруг среднего
CСумму
DМедиану