Статистические графики: heatmap, pairplot, регрессия

Seaborn силён в разведочном анализе: heatmap, pairplot и регрессия за одну строку раскрывают структуру датасета.

«Прежде чем строить модель, посмотрите на матрицу корреляций и парные графики. Половину инсайтов вы получите здесь».

Когда вы впервые встречаете датасет, нужны инструменты быстрой разведки. Seaborn даёт три мощных: heatmap — матрица корреляций цветом, pairplot — все пары переменных в сетке, regplot/lmplot — связь с линией регрессии и доверительной полосой.

Эти три инструмента закрывают типичный маршрут разведочного анализа. Сначала heatmap корреляций даёт «вид с высоты птичьего полёта»: один взгляд на цветную матрицу показывает, какие признаки связаны сильно, какие — слабо, и нет ли мультиколлинеарности (двух почти дублирующих друг друга колонок, что вредит моделям). Затем pairplot спускается на уровень пар: для каждой интересной связки можно увидеть саму форму облака — линейна ли связь, нет ли выбросов, разделяются ли классы. Наконец, regplot формализует обнаруженную связь линией и доверительной полосой. Такой порядок — от обзорной матрицы к парам и далее к подгонке — экономит время: вы не строите регрессию вслепую, а идёте за тем, что подсветила heatmap.

У каждого инструмента есть свои условия честности. Heatmap по умолчанию считает корреляцию Пирсона, которая ловит только линейную связь и чувствительна к выбросам — для монотонных, но нелинейных зависимостей берут ранговую корреляцию Спирмена. Pairplot растёт квадратично: при k колонках получается k×k панелей, поэтому десяток признаков превращается в нечитаемую сотню клеток — для разведки выбирают 3–6 ключевых переменных. Параметр hue в pairplot бесценен: раскраска точек по категории мгновенно вскрывает, разделяются ли классы в пространстве признаков, — именно так на знаменитом датасете ирисов видно, что один вид отделяется идеально, а два других перекрываются.

import seaborn as sns

# матрица корреляций цветом
corr = df.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap="coolwarm", center=0, vmin=-1, vmax=1)

# все пары переменных + распределения по диагонали
sns.pairplot(df, hue="species")

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

center=0 в heatmap критичен для корреляций: палитра должна быть симметричной вокруг нуля, чтобы положительные и отрицательные связи читались зеркально.

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

Heatmap раскрашивает каждую ячейку матрицы по значению через colormap — поэтому важна правильная палитра (diverging для корреляций). Pairplot строит сетку scatter для всех пар колонок и гистограммы/KDE по диагонали. Regplot подгоняет линию методом наименьших квадратов и рисует бутстрэп-доверительную полосу вокруг неё.

Почему для корреляций нужна именно diverging-палитра с center=0: у такой матрицы есть осмысленная нейтральная точка — нулевая корреляция. Расходящаяся палитра (например, coolwarm) красит ноль в нейтральный цвет, а сильные положительные и отрицательные связи — в противоположные насыщенные оттенки, так что знак связи читается мгновенно. Если же взять секвенциальную палитру, ноль окажется не в середине шкалы, и слабые отрицательные корреляции зрительно перепутаются с заметными положительными. Фиксация vmin=-1, vmax=1 довершает дело: шкала привязана к теоретическим границам корреляции, поэтому цвета сопоставимы между разными heatmap, а не растягиваются под случайный диапазон конкретного датасета.

Доверительная полоса вокруг линии регрессии у regplot — это снова бутстрэп: Seaborn многократно пересэмплирует данные, каждый раз заново подгоняет прямую методом наименьших квадратов и смотрит, в каком коридоре эти прямые «гуляют». Полоса шире на краях диапазона X и уже в центре — это естественное свойство регрессии: вблизи центра масс данных оценка наклона устойчивее, а на краях экстраполяция ненадёжна. Отсюда практический вывод: доверять предсказанию линии за пределами облака точек нельзя. Важно и то, что regplot по умолчанию подгоняет прямую; если связь явно изогнута, прямая систематически промахивается, и нужно либо order=2 для полинома, либо непараметрический lowess, который следует за формой данных без жёсткого предположения о линейности.

Линия регрессии — это наклон и сдвиг по МНК. Посчитаем их вручную — за этим стоит вся «магия» regplot.

# Линейная регрессия y = a*x + b методом наименьших квадратов (вручную)
xs = [1, 2, 3, 4, 5, 6, 7]
ys = [2.1, 2.9, 3.7, 4.2, 5.1, 5.9, 6.8]

n = len(xs)
mx = sum(xs) / n
my = sum(ys) / n

# наклон a = cov(x,y) / var(x)
num = sum((x - mx) * (y - my) for x, y in zip(xs, ys))
den = sum((x - mx) ** 2 for x in xs)
a = num / den
b = my - a * mx

print("Наклон a =", round(a, 3))
print("Сдвиг  b =", round(b, 3))
print("Прогноз при x=8:", round(a * 8 + b, 2))

«Попробуй сам ▶» — наклон a и сдвиг b полностью задают ту линию, что lmplot рисует через облако точек.

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

Heatmap корреляций без center=0 и diverging-палитры — нули выглядят цветными. Pairplot на огромном числе колонок — нечитаемая сетка (берите подмножество). Регрессия там, где связь нелинейна — линия вводит в заблуждение. Доверять heatmap по малой выборке без проверки значимости.

Best practices

  • Heatmap корреляций — diverging-палитра с center=0, vmin=-1, vmax=1.
  • Pairplot — для 3–6 переменных, не для десятков.
  • Проверяйте линейность связи перед регрессией; для нелинейной — order=2 или lowess.
  • Используйте hue, чтобы вскрыть групповую структуру.

Итог: Seaborn — ваш набор для разведки. Дальше шагнём в интерактив с Plotly.

Проверьте себя
1. Почему для heatmap корреляций важна diverging-палитра с center=0?
AТак красивее
BЧтобы положительные и отрицательные связи читались симметрично, а ноль был нейтральным
CИначе heatmap не строится
DЧтобы ускорить расчёт
2. Что делает regplot/lmplot помимо точек?
AНичего, только точки
BПодгоняет линию регрессии (МНК) и рисует доверительную полосу
CСтроит pie
DСчитает медиану