Условие
В отчёт для 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 — монотонные связи, устойчив к выбросам и нелинейностям. Для продуктовых метрик обычно лучше.
Подводные камни
- Без
vmin=-1, vmax=1цвет адаптируется к данным — heatmap для разных групп нельзя сравнивать. corr()молча игнорирует NaN попарно — две колонки могут оказаться посчитаны на разных наборах строк. Лучшеdropna(subset=metrics)заранее.- На категориальных переменных Pearson/Spearman бессмысленны — для них Cramér's V (готовых нет в seaborn).
- Большая heatmap (50×50) нечитабельна — кластеризуйте через
sns.clustermap. - Корреляция ≠ причинность — в подписи к графику явно отметить, что это связи, а не каузация.
Эталонный ответ
sns.heatmap(df.corr(method='spearman'), mask=triu, cmap='RdBu_r', center=0, vmin=-1, vmax=1, annot=True, fmt='.2f', square=True) — стандарт.