2017-01-20 7 views
1

Возможно ли, что эти две корреляции различны?pandas spearman корреляция странная?

Панды версия 0.18.1

from pandas import Series 
a = ['Arsenal', 'Leicester', 'Man City', 'Tottenham', 'Crystal Palace'] 
b = ['Arsenal', 'Leicester', 'Man City', 'Tottenham', 'Man United'] 
c = ['Arsenal', 'Leicester', 'Man City', 'Tottenham', 'Man United'] 
d = ['Arsenal', 'Leicester', 'Man City', 'Tottenham', 'West Ham'] 


Series(a).corr(Series(b), method="spearman") 
0.69999999999999996 
Series(c).corr(Series(d), method="spearman") 
0.8999999999999998 
+0

python 3.5.2 и anaconda 4.4.1 –

+2

pandas должен каким-то образом ранжировать эти строки, и поэтому они классифицируются по алфавиту. Поэтому команды могут оцениваться по-разному в зависимости от того, какие другие команды присутствуют. Поэтому панды расчитывают «правильно», но это просто не операция, которую вы хотели. –

+0

Я не статистик, но не корреляция должна быть сделана на двух сериях чисел? Что вы ожидаете от вывода? В Pandas 0.19.2 приведенный выше пример кода падает, потому что строки не являются плавающими. – nico

ответ

1

Это ожидаемое поведение. Spearman Correlation является ранг корреляция, то есть она выполняется на ранжирование ваших данных, а не на самих данных. В вашем примере сами данные могут варьироваться только в одном месте, но различия в данных приводят к разным рейтингам. Как было предложено в комментариях, корреляция Спирмена, вероятно, не то, что вы на самом деле хотите использовать.

Чтобы расширить, под пандусом капюшона, по существу, вызывается scipy.stats.spearmanr для вычисления корреляции. Глядя на source code для spearmanr, она по существу заканчивается использование scipy.stats.rankdata выполнить ранжирование, то np.corrcoef получить корреляцию:

corr1 = np.corrcoef(ss.rankdata(a), ss.rankdata(b))[1,0] 
corr2 = np.corrcoef(ss.rankdata(c), ss.rankdata(d))[1,0] 

Который производит то же значение, что вы наблюдение. Теперь посмотрим на рейтинги, используемые в каждом расчете корреляции:

ss.rankdata(a) 
[ 1. 3. 4. 5. 2.] 

ss.rankdata(b) 
[ 1. 2. 3. 5. 4.] 

ss.rankdata(c) 
[ 1. 2. 3. 5. 4.] 

ss.rankdata(d) 
[ 1. 2. 3. 4. 5.] 

Обратите внимание, что рейтинг для a и b различаются в трех местах, по сравнению с рэнкинге c и d отличающегося в двух местах, так что мы ожидали бы результирующие корреляции должны быть разными.

 Смежные вопросы

  • Нет связанных вопросов^_^