Seaborn
Seaborn — надстройка над Matplotlib для статистической визуализации: распределения, тепло карты корреляции, boxplot'ы одной строкой.
1. Что такое Seaborn
Seaborn умеет сразу работать с таблицами Pandas: вместо ручной подписи осей достаточно передать DataFrame и имена колонок. По умолчанию отличается настраиваемой цветовой схемой и красивыми статистиками.
2. Установка
pip install seabornimport 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')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')Множество маленьких графиков по категориям — сильный приём презентаций.
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)axes_style/set_style— контролируют фон и линии;set(font_scale=1.2)— масштаб текста при увеличении размера фигуры;- DPI 150–300 — нормальный уровень для печати и презентаций.
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 | закрыть верхний/нижний треугольник |
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)- цвета
colorblindчитаются без искажения у 8% людей; - короткие заголовки-вопросы лучше длинных описаний;
- выносите основные выводы подпись-строкой под графиком.
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 оставляет колонки на месте и кластеризует только строки.
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 | сравнение средних/трендов |
- панели
colидеально ловят тренд по годам/категориям; - добавьте
hueдля второй категории и получите третий уровень сравнения; - для сравнения средних смотрите на
kind='point'— выбросы не пугают.
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 | отдельные категории, без ранга |
- не используйте rainbow для числовых данных — он не задаёт порядок;
- для печати палитры тестируйте в grayscale;
- люди с протанопией: избегайте пары «красный–зелёный» для различий.
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])- 90–100 бутстрап-итераций хватает на стабильную границу;
- при малых выборках CI широкий — это честная картина неопределённости;
- если хотите «инженерное» отклонение, укажите
errorbar='sd'или 'se'.
| errorbar | Что показывает |
|---|---|
| ('ci', 95) | доверительный интервал среднего |
| sd | разброс данных (не точность среднего) |
| se | стандартная ошибка среднего |
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)- hexbin лучше scatter для тысяч точек — гексагоны показывают плотность;
map_lower/map_upperубирают дублирование, давая разные виды на треугольники матрицы;- для скорости на больших данных включайте
kde=Trueс пониженнымlevels.
hue в PairGrid, чтобы сразу видеть, по какой категории различаются распределения — удобно для сегментов клиентов.Что дальше
Графики готовы: следующий шаг — машинное обучение на Scikit-Learn и глубокие сети в TensorFlow.