DataFrame.corr() - Линейная корреляция Пирсона, рассчитанная с теми же дублированными данными?
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, мы все равно получим Нет (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 ответ
Использование коэффициента Пирсона 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; хотя применение метода все еще недействительно.