Статистические графики: 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.