Знакомство с 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.