pearsonr#
- scipy.stats.mstats.pearsonr(x, y)[источник]#
Коэффициент корреляции Пирсона и p-значение для проверки отсутствия корреляции.
Коэффициент корреляции Пирсона [1] измеряет линейную зависимость между двумя наборами данных. Расчёт p-значения основан на предположении, что каждый набор данных нормально распределён. (См. Ковальски [3] для обсуждения влияния ненормальности входных данных на распределение коэффициента корреляции.) Как и другие коэффициенты корреляции, этот варьируется от -1 до +1, где 0 означает отсутствие корреляции. Корреляции -1 или +1 подразумевают точную линейную зависимость.
- Параметры:
- x(N,) array_like
Входной массив.
- y(N,) array_like
Входной массив.
- Возвращает:
- rfloat
Коэффициент корреляции Пирсона.
- p-значениеfloat
Двустороннее p-значение.
- Предупреждает:
ConstantInputWarningВозникает, если входные данные являются постоянным массивом. Коэффициент корреляции не определен в этом случае, поэтому
np.nanвозвращается.NearConstantInputWarningВозникает, если входные данные «почти» постоянны. Массив
xсчитается почти постоянной, еслиnorm(x - mean(x)) < 1e-13 * abs(mean(x)). Численные ошибки в вычисленииx - mean(x)в этом случае может привести к неточному вычислению r.
Смотрите также
spearmanrКоэффициент корреляции Спирмена.
kendalltauТау Кендалла, мера корреляции для порядковых данных.
Примечания
Коэффициент корреляции рассчитывается следующим образом:
\[r = \frac{\sum (x - m_x) (y - m_y)} {\sqrt{\sum (x - m_x)^2 \sum (y - m_y)^2}}\]где \(m_x\) является средним вектора x и \(m_y\) является средним значением вектора y.
В предположении, что x и y взяты из независимых нормальных распределений (так что коэффициент корреляции генеральной совокупности равен 0), функция плотности вероятности выборочного коэффициента корреляции r равна ([1], [2]):
\[f(r) = \frac{{(1-r^2)}^{n/2-2}}{\mathrm{B}(\frac{1}{2},\frac{n}{2}-1)}\]где n — количество выборок, а B — бета-функция. Это иногда называют точным распределением r. Это распределение, которое используется в
pearsonrдля вычисления p-значения. Распределение является бета-распределением на интервале [-1, 1], с равными параметрами формы a = b = n/2 - 1. В терминах реализации бета-распределения в SciPy, распределение r:dist = scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2)
p-значение, возвращаемое
pearsonrявляется двусторонним p-значением. P-значение приблизительно указывает вероятность того, что некоррелированная система произведёт наборы данных с корреляцией Пирсона, по крайней мере, столь же экстремальной, как вычисленная из этих наборов данных. Более точно, для данной выборки с коэффициентом корреляции r, p-значение — это вероятность того, что abs(r') случайной выборки x' и y', взятой из популяции с нулевой корреляцией, будет больше или равна abs(r). В терминах объектаdistкак показано выше, p-значение для заданных r и длины n может быть вычислено как:p = 2*dist.cdf(-abs(r))
Когда n равно 2, указанное непрерывное распределение не определено корректно. Можно интерпретировать предел бета-распределения при стремлении параметров формы a и b к a = b = 0 как дискретное распределение с равными вероятностными массами при r = 1 и r = -1. Более непосредственно можно заметить, что при данных x = [x1, x2] и y = [y1, y2] и предположении x1 != x2 и y1 != y2 единственными возможными значениями для r являются 1 и -1. Поскольку abs(r') для любой выборки x' и y' длиной 2 будет равен 1, двустороннее p-значение для выборки длиной 2 всегда равно 1.
Ссылки
[1] (1,2)"Коэффициент корреляции Пирсона", Википедия, https://en.wikipedia.org/wiki/Pearson_correlation_coefficient
[2]Student, «Probable error of a correlation coefficient», Biometrika, Том 6, Выпуск 2-3, 1 сентября 1908, стр. 302-310.
[3]C. J. Kowalski, «On the Effects of Non-Normality on the Distribution of the Sample Product-Moment Correlation Coefficient» Journal of the Royal Statistical Society. Series C (Applied Statistics), Vol. 21, No. 1 (1972), pp. 1-12.
Примеры
>>> import numpy as np >>> from scipy import stats >>> from scipy.stats import mstats >>> mstats.pearsonr([1, 2, 3, 4, 5], [10, 9, 2.5, 6, 4]) (-0.7426106572325057, 0.1505558088534455)
Существует линейная зависимость между x и y, если y = a + b*x + e, где a,b — константы, а e — случайная ошибка, предполагаемая независимой от x. Для простоты предположим, что x стандартно нормален, a=0, b=1, и пусть e следует нормальному распределению со средним нуль и стандартным отклонением s>0.
>>> s = 0.5 >>> x = stats.norm.rvs(size=500) >>> e = stats.norm.rvs(scale=s, size=500) >>> y = x + e >>> mstats.pearsonr(x, y) (0.9029601878969703, 8.428978827629898e-185) # may vary
Это должно быть близко к точному значению, заданному
>>> 1/np.sqrt(1 + s**2) 0.8944271909999159
Для s=0.5 мы наблюдаем высокий уровень корреляции. В целом, большая дисперсия шума уменьшает корреляцию, в то время как корреляция приближается к единице, когда дисперсия ошибки стремится к нулю.
Важно помнить, что отсутствие корреляции не подразумевает независимость, если (x, y) не является совместно нормальным. Корреляция может быть даже нулевой при очень простой структуре зависимости: если X следует стандартному нормальному распределению, пусть y = abs(x). Заметим, что корреляция между x и y равна нулю. Действительно, поскольку математическое ожидание x равно нулю, cov(x, y) = E[x*y]. По определению, это равно E[x*abs(x)], что равно нулю из-за симметрии. Следующие строки кода иллюстрируют это наблюдение:
>>> y = np.abs(x) >>> mstats.pearsonr(x, y) (-0.016172891856853524, 0.7182823678751942) # may vary
Ненулевой коэффициент корреляции может вводить в заблуждение. Например, если X имеет стандартное нормальное распределение, определим y = x, если x < 0, и y = 0 в противном случае. Простой расчёт показывает, что corr(x, y) = sqrt(2/Pi) = 0.797…, что подразумевает высокий уровень корреляции:
>>> y = np.where(x < 0, x, 0) >>> mstats.pearsonr(x, y) (0.8537091583771509, 3.183461621422181e-143) # may vary
Это неинтуитивно, поскольку нет зависимости x и y, если x больше нуля, что происходит примерно в половине случаев при выборке x и y.