Seaborn

Seaborn — надстройка над Matplotlib для статистической визуализации: распределения, тепло карты корреляции, boxplot'ы одной строкой.

Уровень: начальный 17 разделов ⏱ 2–3 часа

1. Что такое Seaborn

Seaborn умеет сразу работать с таблицами Pandas: вместо ручной подписи осей достаточно передать DataFrame и имена колонок. По умолчанию отличается настраиваемой цветовой схемой и красивыми статистиками.

2. Установка

pip install seaborn
import seaborn as sns
import matplotlib.pyplot as plt

# встроенный набор данных
df = sns.load_dataset('tips')
print(df.head())

3. Распределения (dist/hist)

sns.histplot(df, x='total_bill', bins=30, kde=True)
sns.kdeplot(data=df, x='total_bill', hue='sex', fill=True)

KDE — сглаженная плотность, отлично показывает форму распределения.

4. Boxplot и виола

sns.boxplot(x='day', y='total_bill', data=df)
sns.violinplot(x='day', y='total_bill', data=df)

Boxplot — медиана, квартили и выбросы ("усы"). Violin совмещает boxplot и плотность.

5. Scatter и категориальные точки

sns.scatterplot(x='total_bill', y='tip', hue='sex', style='day', data=df)
sns.stripplot(x='day', y='tip', data=df, jitter=True)

Цвет (hue) и форма (style) добавляют измерения без третьей оси.

6. Тепло карта корреляции

corr = df.select_dtypes('number').corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f')
Тепло карта корреляции — первый шаг в любом сборе признаков для ML: видно, какие столбцы дублируют информацию.

7. Pairplot

sns.pairplot(df, hue='sex')

Матрица графиков по всем числовым парам — мгновенный обзор данных перед моделями.

8. Категориальные оценки

sns.barplot(x='day', y='total_bill', data=df, errorbar='ci')
sns.pointplot(x='time', y='total_bill', hue='sex', data=df)

errorbar показывает доверительные интервалы.

9. Стили и темы

sns.set_theme(style='darkgrid', palette='muted')
sns.set_palette('husl')

Palettes: deep, muted, bright, pastel, dark, colorblind.

10. FacetGrid — сетка по группам

g = sns.FacetGrid(df, col='time', row='day', height=3)
g.map(sns.histplot, 'total_bill')

Множество маленьких графиков по категориям — сильный приём презентаций.

Seaborn требует DataFrame; передавай колонки строками. Если колонки невидимы — проверь опечатки и пробелы в именах (df.columns.tolist()).

11. Настройка фигур и осей

По умолчанию Seaborn подбирает размер полотна сам. Для отчётов управляйте шириной, высотой и подписями явно: параметр figsize передаётся в matplotlib, а прочие детали — через оси.

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(10, 6))
sns.histplot(df, x='total_bill', bins=30, kde=True, ax=ax)
ax.set_title('Распределение суммы счёта', fontsize=16)
ax.set_xlabel('Сумма, $')
ax.set_ylabel('Частота')
plt.tight_layout()
plt.savefig('report.png', dpi=150)
Сохраняйте графики в SVG для веба и векторных материалов: файл маленький, а масштабируется без пикселей.

12. Тепловые карты и корреляции

Тепловая карта корреляции — главный инструмент разведки данных. Она показывает, какие признаковые пары дублируют информацию, а какие независимы.

numeric = df.select_dtypes('number')
corr = numeric.corr()

sns.heatmap(corr, annot=True, fmt='.2f',
            cmap='RdBu_r', vmin=-1, vmax=1)
ПараметрНазначение
annotрисовать числа в ячейках
fmtформат чисел (.2f)
cmapцветовая шкала: RdBu_r, coolwarm, YlGnBu
maskзакрыть верхний/нижний треугольник
Коэффициент корреляции видит только линейные связи: при «подковообразной» зависимости он может быть близок к нулю. Всегда дополняйте heatmap scatter-проверкой.
Сильно закоррелированные признаки жертвуют перед обучением моделей — см. курс Scikit-Learn: дубли признаков раздувают модель и мешают интерпретации.

13. Представление в отчётах

Визуализации в жизни аналитика — это результат «вшитый» в доклад или дашборд. Соберите набор одинаково оформленных графиков в одну сетку.

fig, axes = plt.subplots(2, 3, figsize=(15, 9))

for ax, col in zip(axes.flat, numeric.columns):
    sns.histplot(df, x=col, kde=True, ax=ax)
    ax.set_title(col)

fig.suptitle('Обзор числовых признаков')
plt.tight_layout()
sns.pairplot(df, hue='sex', diag_kind='kde',
             palette='colorblind', corner=True)
Палитры и темы настраиваются один раз через sns.set_theme(): тогда все графики проекта выглядят как единая серия, а не набор случайных картинок.

14. Регрессионные графики: regplot и lmplot

Когда нужно показать связь двух переменных и линию тренда — используйте регрессионные графики. regplot строит scatter с линией, lmplot добавляет сетку по категориям, а residplot показывает ошибки модели против предсказанных значений.

sns.regplot(x='total_bill', y='tip', data=df, ci=95)
sns.lmplot(x='total_bill', y='tip', hue='sex', data=df)
sns.residplot(x='total_bill', y='tip', data=df)

ci=95 рисует доверительную зону: если она широкая — данных мало или связь слабая. Остатки без систематического рисунка — признак подходящей линейной модели.

График остатков — быстрый тест перед регрессией: если остатки «выстраиваются» кривой, модель стоит усложнить или добавить признак.

15. Временные ряды: lineplot

lineplot умеет агрегировать даты и рисовать доверительные полосы. Перед построением колонка с датой приводится к типу datetime, а значения пересэмплируются осмысленным периодом.

sales['date'] = pd.to_datetime(sales['date'])
daily = sales.set_index('date')['amount'].resample('D').sum()

# линия + разброс между повторами
sns.lineplot(x='date', y='amount', data=sales, errorbar='sd')
# несколько серий через hue
sns.lineplot(x='date', y='amount', hue='region', data=sales)

Сезонность удобно рассматривать сеткой FacetGrid из раздела 10 — например, по годам или месяцам: глаз сразу ловит повторяющиеся пики.

Линия между точками искажает пропуски: если дат нет, кривая «прыгает». Работайте с результатом resample, а не с сырым DataFrame.

16. Кластерные тепловые карты: clustermap

Строки и столбцы можно отсортировать не вручную, а по близости: clustermap строит дендрограммы и переставляет данные так, чтобы похожее оказалось рядом. Это стандартный приём для таблиц с десятками признаков.

sns.clustermap(corr, annot=True, cmap='RdBu_r',
               metric='euclidean', method='ward')
sns.clustermap(scaled, standard_scale=1, col_cluster=False)

standard_scale=1 приводит каждый столбец к одинаковой шкале: без него признаки разного масштаба выглядят неправдоподобно. col_cluster=False оставляет колонки на месте и кластеризует только строки.

Увидели «кварталы» на дендрограмме? Они часто совпадают с настоящими сегментами — готовая подсказка для кластеризации в Scikit-Learn.

17. Большие выборки и производительность

На сотне тысяч строк Seaborn рисует каждый объект — построение замедляется, а файл раздувается. Для больших данных есть три приёма: прозрачность, растерная отрисовка и случайная подвыборка.

sns.scatterplot(x='total_bill', y='tip', data=df,
                alpha=0.05, edgecolor='none', rasterized=True)

small = df.sample(n=20000, random_state=42)
sns.kdeplot(data=small, x='total_bill', hue='sex')
ПриёмЭффект
alphaплотность проявляется цветом без наложения объектов
rasterizedв векторном файле большие точки «падают» в PNG
sampleподвыборка сохраняет структуру за секунды
Исследуйте полные данные, а для экспорта в отчёт берите компактные подвыборки — вывод почти не меняется, а вес файла падает в разы.

18. catplot: все категориальные графики из одного API

Вместо того чтобы запоминать пять функций (stripplot, boxplot, violinplot и т.д.), используйте единый интерфейс catplot. Параметр kind переключает тип, а сетка col/row строит панели автоматически.

sns.catplot(data=df, x='city', y='price',
            kind='box', col='year', height=4, aspect=1.2)
kindКогда удобно
stripсырые точки, мало данных
swarmточки без наложения
boxмедианы, квартили, выбросы
violinформа распределения + box
pointсравнение средних/трендов
Сравните виды на одних данных: box «сплющивает» бимодальные распределения, где violin показывает два горба — всегда смотрите оба.

19. Свои палитры и цветовые пространства

Цвет в дашборде — не украшение, а кодирование данных. Seaborn позволяет строить собственные палитры: последовательные, дивергентные или качественные — под задачу.

import seaborn as sns

seq = sns.light_palette('#2c7fb8', as_cmap=True)   # от светлого к тёмному
div = sns.diverging_palette(250, 15, s=80, l=50)    # два хвоста вокруг нуля
cat = sns.color_palette('husl', 10)                 # качественные цвета
ТипПрименение
sequentialвеличина от минимума к максимуму
divergingотклонение от середины (тепло/холод)
qualitativeотдельные категории, без ранга
Каждая палитра нужна своя: последовательная в heatmap, качественная в scatter по категориям. Перегруженные «всеми цветами» графики нечитаемы.

20. Что скрывает доверительный интервал

Seaborn рисует полосы «ошибки» на линейных и категориальных графиках по умолчанию. Важно понимать, откуда берутся эти границы: по умолчанию bootstrap — повторные выборки с возвращением вычисляют CI для среднего.

sns.lineplot(data=df, x='month', y='sales',
             errorbar=('ci', 95))      # доверительный интервал
n = 1000; ci = 95
samples = [df['sales'].sample(n, replace=True).mean()
           for _ in range(1000)]
lower, upper = np.percentile(samples, [2.5, 97.5])
errorbarЧто показывает
('ci', 95)доверительный интервал среднего
sdразброс данных (не точность среднего)
seстандартная ошибка среднего
Разница «sd» и «ci» решает, что вы говорите читателю: «большой разброс» против «плохо оценено среднее». Подписывайте легенду честно.

21. Многомерные графики: jointplot и PairGrid

Для пары переменных jointplot показывает оба распределения и связь сразу: гистограммы по краям + scatter/hexbin в центре. А PairGrid даёт полный контроль над сеткой всех пар признаков.

sns.jointplot(data=df, x='budget', y='profit',
              kind='hex')          # hexbin для большой плотности

grid = sns.PairGrid(df[['price','rooms','area']])
grid.map_upper(sns.scatterplot, alpha=.4)
grid.map_lower(sns.kdeplot, levels=4)
grid.map_diag(sns.histplot, kde=True)
PairGrid на 10 признаках рисует 90 маленьких графиков — суммарно тяжело и нечитаемо. Сначала сузьте признаки (корреляции из раздела 5), потом PairGrid.
Добавьте hue в PairGrid, чтобы сразу видеть, по какой категории различаются распределения — удобно для сегментов клиентов.

Что дальше

Графики готовы: следующий шаг — машинное обучение на Scikit-Learn и глубокие сети в TensorFlow.

← Вернуться к курсам