DataFrame.corr () - Линейная корреляция Пирсона, рассчитанная с теми же дублированными данными? - PullRequest
0 голосов
/ 14 января 2019

x=[0.3, 0.3, 0.3, ..., 0.3] (число 0,3: 10)

y=x

Каков коэффициент линейной корреляции между x и y?

Для этого x и y все пары указывают на одну и ту же точку (0.3, 0.3). Можем ли мы сказать, что x и y имеют линейную корреляцию?

scipy.stats.pearsonr(x, y) даст вам Да (1.0, 0.0). Но имеет ли это смысл?

Однако, если мы изменим все 0.3 на 3, Сципи даст вам (NaN, 1.0). Почему он отличается от предыдущего (0.3)? Связано с отклонением плавающих чисел? Но если мы будем использовать 3,0 вместо 3, мы все равно получим No (NaN, 1.0). Кто-нибудь знает, почему разные входы генерируют разные выходы?

# When using 0.3:
# result: (1.0, 0.0)
import scipy.stats
a=[]
for i in range(10):
    a.append(0.3)
b=a
scipy.stats.pearsonr(a,b)



# When using int 3:
# result: (nan, 1.0)
import scipy.stats
a=[]
for i in range(10):
    a.append(3)
b=a
scipy.stats.pearsonr(a,b)



# When using 3.0:
# result: (nan, 1.0)
import scipy.stats
a=[]
for i in range(10):
    a.append(3.0)
b=a
scipy.stats.pearsonr(a,b)

См. Встроенные комментарии выше.

1 Ответ

0 голосов
/ 14 января 2019

Использование коэффициента Пирсона R, предполагающего нормальное распределение данных, для группы констант является математически неопределенной операцией.

xm = x - x.mean()
ym = y - y.mean()
r = sum(xm * ym) / np.sqrt( sum(xm**2) * sum(ym**2) )

Другими словами, если в ваших данных нет изменений, вы делитесь на ноль.

Теперь причина, по которой он работает для повторения float 0,3:

a = [0.3 for _ in range(10)] #note that single-decimal only 0.3 and 0.6 fail
b = [3.0 for _ in range(10)]
print(np.asarray(a).mean(), np.asarray(b).mean())
#0.29999999999999993 3.0
print(0.3 - 0.29999999999999993)
#5.551115123125783e-17

Итак, благодаря этому крошечному, крошечному отклонению с плавающей запятой, вытекающему из операции усреднения, есть что-то, что нужно вычислить, и корреляция может быть привязана к 1,0; хотя применение метода все еще недопустимо.

...