Собесов

Сценарий: heatmap корреляций в seaborn для отчёта

PythonVisualizationЛёгкаяJunior

Условие

В отчёт для CPO нужно вставить heatmap корреляций между 12 продуктовыми метриками. Сделай аккуратный график.

Решение

Базовая версия

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
corr = df[metrics].corr(method='spearman')   # spearman устойчив к выбросам
 
mask = np.triu(np.ones_like(corr, dtype=bool), k=1)   # скрыть верх (зеркало)
 
fig, ax = plt.subplots(figsize=(10, 8))
sns.heatmap(
    corr,
    mask=mask,
    annot=True, fmt='.2f',
    cmap='RdBu_r', center=0, vmin=-1, vmax=1,
    square=True,
    linewidths=0.5, linecolor='white',
    cbar_kws={'shrink': 0.8, 'label': 'Spearman ρ'},
    ax=ax,
)
ax.set_title('Корреляции продуктовых метрик (Spearman)', fontsize=14, pad=12)
plt.tight_layout()
plt.savefig('corr.png', dpi=200, bbox_inches='tight')

Хитрости для презентаций

  • square=True — квадратные ячейки, выглядит аккуратнее.
  • Маска triu — убирает зеркальную половину, делает читаемее.
  • cmap='RdBu_r' с center=0, vmin=-1, vmax=1 — положительные синие, отрицательные красные, симметрично.
  • annot=True, fmt='.2f' — числа прямо на ячейках.
  • Большой figsize и dpi=200 для печати.

Spearman vs Pearson

  • Pearson — линейные связи, чувствителен к выбросам.
  • Spearman — монотонные связи, устойчив к выбросам и нелинейностям. Для продуктовых метрик обычно лучше.

Подводные камни

  1. Без vmin=-1, vmax=1 цвет адаптируется к данным — heatmap для разных групп нельзя сравнивать.
  2. corr() молча игнорирует NaN попарно — две колонки могут оказаться посчитаны на разных наборах строк. Лучше dropna(subset=metrics) заранее.
  3. На категориальных переменных Pearson/Spearman бессмысленны — для них Cramér's V (готовых нет в seaborn).
  4. Большая heatmap (50×50) нечитабельна — кластеризуйте через sns.clustermap.
  5. Корреляция ≠ причинность — в подписи к графику явно отметить, что это связи, а не каузация.

Эталонный ответ

sns.heatmap(df.corr(method='spearman'), mask=triu, cmap='RdBu_r', center=0, vmin=-1, vmax=1, annot=True, fmt='.2f', square=True) — стандарт.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти