Корреляция Спирмена, когда полезна и почему о ней надо знать
Осознанность — это восприятие всех деталей происходящего по отдельности и в целом. Когда ты переживаешь их, видишь, понимаешь суть и взаимосвязи (Ольга Нестерова). Самым распространенным способом определения зависимости между признаками является корреляция Пирсона, но она обладает рядом особенностей, в том числе не устойчива к выбросам. В демонстрационных целях рассмотрим корреляцию для двух датафреймов, в которых отличаются только последние строки (используем метод 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()
Вышеуказанная формула выводится из определения корреляции Пирсона, примененной к рангам значений из выборок:
Учтем, что (читай тут):