Как считается корреляционная матрица?
Что проверяют
Понимаете ли вы, что стоит за df.corr(): формулу Пирсона, её матричную форму и ограничения. Следом обычно спрашивают, чем Пирсон отличается от Спирмена и что происходит с матрицей при пропусках.
Как отвечать
- формула:
r = cov(X, Y) / (σX·σY), ковариация, нормированная на стандартные отклонения. Значение лежит от минус единицы до единицы и показывает силу линейной связи; - матричная форма: центрируем и нормируем каждый столбец, получаем матрицу
Z, тогдаR = ZᵀZ / (n-1). То же самое: взять ковариационную матрицу и поделить каждый элемент на произведение двух стандартных отклонений. Стоимость порядка n·d², память d²; - свойства: матрица симметрична, на диагонали единицы, она положительно полуопределённая;
- Спирмен: тот же Пирсон, но по рангам. Ловит монотонную нелинейную связь и устойчивее к выбросам. Кендалл считает согласованные пары, медленнее, но надёжнее на малых выборках;
- инструменты:
df.corr()по умолчанию считает Пирсона, естьmethod="spearman"иmethod="kendall". Вnp.corrcoefпеременными считаются строки, для таблицы признаков нуженrowvar=False. В Spark естьpyspark.ml.stat.Correlation.
Практика: при пропусках pandas считает каждую пару по своим полным строкам, и итоговая матрица может перестать быть положительно полуопределённой. С pandas 2.0 нечисловые столбцы по умолчанию дают ошибку, нужен numeric_only=True или явный отбор колонок. Для категориальных признаков Пирсон не подходит, берут V Крамера.
В ML матрицей ищут мультиколлинеарность и дубли признаков, но для отбора признаков по связи с таргетом одной корреляции мало.
Где спотыкаются
Говорят, что перед расчётом данные нужно стандартизировать. Корреляция не зависит от масштаба, нормировка уже встроена в формулу.
Читают нулевую корреляцию как отсутствие связи. Зависимость y = x² на симметричном отрезке даёт r около нуля при полной функциональной связи.
Не смотрят на выбросы: одна экстремальная точка может дать r около 0,9 там, где связи нет. Рядом с матрицей полезно построить диаграммы рассеяния или посчитать Спирмена.