обработка данных
April 15, 2023

Корреляция Спирмена, когда полезна и почему о ней надо знать

Осознанность — это восприятие всех деталей происходящего по отдельности и в целом. Когда ты переживаешь их, видишь, понимаешь суть и взаимосвязи (Ольга Нестерова). Самым распространенным способом определения зависимости между признаками является корреляция Пирсона, но она обладает рядом особенностей, в том числе не устойчива к выбросам. В демонстрационных целях рассмотрим корреляцию для двух датафреймов, в которых отличаются только последние строки (используем метод corr, в котором по умолчанию применяется способ Пирсона - method='pearson'):

import pandas as pd

df1 = pd.DataFrame([[1,2], [8,10], [7,9], [10,1]])
display(df1.corr())

df2 = pd.DataFrame([[1,2], [8,10], [7,9], [100,1]])
display(df2.corr())

Как можно заметить, коэффициент сильно меняется при изменении значений.

А теперь вызовем corr с параметром method='spearman' и убедимся в устойчивости к выбросам:

display(df1.corr(method='spearman'))
display(df2.corr(method='spearman'))

Метод Спирмена устойчивее к выбросам, так как считает корреляцию между рангами элементов, а не их величинами. При этом коэффициент можно посчитать по формуле (𝑥𝑖,𝑦𝑖 - ранги значений):

df = df1.join(df1.rank(), rsuffix='_rank')
df
1-((6*((df['0_rank']-df['1_rank']).pow(2)).sum()))/(df.shape[0]*(df.shape[0]-1)*(df.shape[0]+1))

Альтернативным способом подсчета является вычисление корреляции Пирсона для рангов:

df.filter(regex=r'_rank').corr()

Вышеуказанная формула выводится из определения корреляции Пирсона, примененной к рангам значений из выборок:

Учтем, что (читай тут):

Тогда один из множителей знаменателя считается так:

Преобразуем числитель:

Учтем, что:

Тогда:

Полезные ссылки: