scipy.stats.

pearsonr#

scipy.stats.pearsonr(x, y, *, alternative='two-sided', method=None, axis=0)[Quelle]#

Pearson-Korrelationskoeffizient und p-Wert zum Testen auf Nicht-Korrelation.

Der Pearson-Korrelationskoeffizient [1] misst die lineare Beziehung zwischen zwei Datensätzen. Wie andere Korrelationskoeffizienten variiert dieser zwischen -1 und +1, wobei 0 keine Korrelation bedeutet. Korrelationen von -1 oder +1 implizieren eine exakte lineare Beziehung. Positive Korrelationen bedeuten, dass mit steigendem x auch y steigt. Negative Korrelationen bedeuten, dass mit steigendem x y abnimmt.

Diese Funktion führt auch einen Test der Nullhypothese durch, dass die zugrunde liegenden Verteilungen der Stichproben unkorreliert und normalverteilt sind. (Siehe Kowalski [3] für eine Diskussion der Auswirkungen von Nicht-Normalität der Eingabe auf die Verteilung des Korrelationskoeffizienten.) Der p-Wert gibt ungefähr die Wahrscheinlichkeit an, dass ein unkorreliertes System Datensätze produziert, die eine Pearson-Korrelation aufweisen, die mindestens so extrem ist wie die aus diesen Datensätzen berechnete.

Parameter:
xarray_like

Eingabearray.

yarray_like

Eingabearray.

axisint oder None, Standard

Achse, entlang der die Berechnung durchgeführt wird. Standard ist 0. Wenn None, werden beide Arrays vor der Berechnung abgeflacht.

Hinzugefügt in Version 1.14.0.

alternative{‘two-sided’, ‘greater’, ‘less’}, optional

Definiert die Alternativhypothese. Standard ist ‘zweiseitig’. Folgende Optionen sind verfügbar

  • ‘two-sided’: die Korrelation ist ungleich Null

  • ‘less’: die Korrelation ist negativ (kleiner als Null)

  • ‘greater’: die Korrelation ist positiv (größer als Null)

Hinzugefügt in Version 1.9.0.

methodResamplingMethod, optional

Definiert die Methode zur Berechnung des p-Wertes. Wenn method eine Instanz von PermutationMethod/MonteCarloMethod ist, wird der p-Wert mithilfe von scipy.stats.permutation_test/scipy.stats.monte_carlo_test mit den bereitgestellten Konfigurationsoptionen und anderen geeigneten Einstellungen berechnet. Andernfalls wird der p-Wert wie in den Hinweisen dokumentiert berechnet.

Hinzugefügt in Version 1.11.0.

Rückgabe:
resultPearsonRResult

Ein Objekt mit den folgenden Attributen

statisticfloat

Pearson-Produkt-Moment-Korrelationskoeffizient.

pvaluefloat

Der p-Wert, der mit der gewählten Alternative verbunden ist.

Das Objekt hat die folgende Methode

confidence_interval(confidence_level, method)

Dies berechnet das Konfidenzintervall des Korrelationskoeffizienten statistic für das gegebene Konfidenzniveau. Das Konfidenzintervall wird in einem namedtuple mit den Feldern low und high zurückgegeben. Wenn method nicht angegeben ist, wird das Konfidenzintervall mithilfe der Fisher-Transformation [1] berechnet. Wenn method eine Instanz von BootstrapMethod ist, wird das Konfidenzintervall mithilfe von scipy.stats.bootstrap mit den bereitgestellten Konfigurationsoptionen und anderen geeigneten Einstellungen berechnet. In einigen Fällen können die Konfidenzgrenzen aufgrund eines degenerierten Resamples NaN sein, was typisch für sehr kleine Stichproben (~6 Beobachtungen) ist.

Löst aus:
ValueError

Wenn x und y keine Länge von mindestens 2 haben.

Warnungen:
ConstantInputWarning

Ausgelöst, wenn ein Input ein konstantes Array ist. Der Korrelationskoeffizient ist in diesem Fall nicht definiert, daher wird np.nan zurückgegeben.

NearConstantInputWarning

Ausgelöst, wenn eine Eingabe „nahezu“ konstant ist. Das Array x wird als nahezu konstant betrachtet, wenn norm(x - mean(x)) < 1e-13 * abs(mean(x)). Numerische Fehler bei der Berechnung x - mean(x) können in diesem Fall zu einer ungenauen Berechnung von r führen.

Siehe auch

spearmanr

Spearman-Rangkorrelationskoeffizient.

kendalltau

Kendalls Tau, ein Korrelationsmaß für ordinale Daten.

Pearsons Korrelation

Erweitertes Beispiel

Hinweise

Der Korrelationskoeffizient wird wie folgt berechnet

\[r = \frac{\sum (x - m_x) (y - m_y)} {\sqrt{\sum (x - m_x)^2 \sum (y - m_y)^2}}\]

wobei \(m_x\) der Mittelwert des Vektors x und \(m_y\) der Mittelwert des Vektors y ist.

Unter der Annahme, dass x und y aus unabhängigen Normalverteilungen stammen (sodass der Populationskorrelationskoeffizient 0 ist), ist die Wahrscheinlichkeitsdichtefunktion des Stichprobenkorrelationskoeffizienten r ([1], [2])

\[f(r) = \frac{{(1-r^2)}^{n/2-2}}{\mathrm{B}(\frac{1}{2},\frac{n}{2}-1)}\]

wobei n die Anzahl der Stichproben und B die Betafunktion ist. Dies wird manchmal als die exakte Verteilung von r bezeichnet. Dies ist die Verteilung, die in pearsonr verwendet wird, um den p-Wert zu berechnen, wenn der Parameter method auf seinem Standardwert (None) belassen wird. Die Verteilung ist eine Beta-Verteilung auf dem Intervall [-1, 1] mit gleichen Formparametern a = b = n/2 - 1. In Bezug auf SciPy's Implementierung der Beta-Verteilung ist die Verteilung von r

dist = scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2)

Der Standard-p-Wert, der von pearsonr zurückgegeben wird, ist ein zweiseitiger p-Wert. Für eine gegebene Stichprobe mit dem Korrelationskoeffizienten r ist der p-Wert die Wahrscheinlichkeit, dass abs(r’) einer zufälligen Stichprobe x’ und y’, die aus der Population mit Nullkorrelation gezogen wurden, größer oder gleich abs(r) wäre. Bezogen auf das oben gezeigte Objekt dist kann der p-Wert für ein gegebenes r und eine Länge n berechnet werden als

p = 2*dist.cdf(-abs(r))

Wenn n gleich 2 ist, ist die obige kontinuierliche Verteilung nicht gut definiert. Man kann den Grenzwert der Beta-Verteilung interpretieren, wenn die Formparameter a und b sich a = b = 0 nähern, als eine diskrete Verteilung mit gleichen Wahrscheinlichkeitsmassen bei r = 1 und r = -1. Direkter kann man beobachten, dass bei gegebenen Daten x = [x1, x2] und y = [y1, y2], und unter der Annahme, dass x1 != x2 und y1 != y2, die einzigen möglichen Werte für r 1 und -1 sind. Da abs(r’) für jede Stichprobe x’ und y’ der Länge 2 immer 1 ist, ist der zweiseitige p-Wert für eine Stichprobe der Länge 2 immer 1.

Aus Gründen der Abwärtskompatibilität verhält sich das zurückgegebene Objekt auch wie ein Tupel der Länge zwei, das die Statistik und den p-Wert enthält.

pearsonr hat experimentelle Unterstützung für Backends, die dem Python Array API Standard entsprechen, zusätzlich zu NumPy. Bitte erwägen Sie, diese Funktionen zu testen, indem Sie die Umgebungsvariable SCIPY_ARRAY_API=1 setzen und CuPy-, PyTorch-, JAX- oder Dask-Arrays als Array-Argumente bereitstellen. Die folgenden Kombinationen von Backend und Gerät (oder anderer Fähigkeit) werden unterstützt.

Bibliothek

CPU

GPU

NumPy

n/a

CuPy

n/a

PyTorch

JAX

⚠️ kein JIT

Dask

⚠️ berechnet Graph

n/a

Siehe Unterstützung für den Array API Standard für weitere Informationen.

Referenzen

[1] (1,2,3)

„Pearson correlation coefficient“, Wikipedia, https://en.wikipedia.org/wiki/Pearson_correlation_coefficient

[2]

Student, „Probable error of a correlation coefficient“, Biometrika, Band 6, Ausgabe 2-3, 1. September 1908, S. 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), Bd. 21, Nr. 1 (1972), S. 1-12.

Beispiele

>>> import numpy as np
>>> from scipy import stats
>>> x, y = [1, 2, 3, 4, 5, 6, 7], [10, 9, 2.5, 6, 4, 3, 2]
>>> res = stats.pearsonr(x, y)
>>> res
PearsonRResult(statistic=-0.828503883588428, pvalue=0.021280260007523286)

Um eine exakte Permutationsversion des Tests durchzuführen

>>> rng = np.random.default_rng()
>>> method = stats.PermutationMethod(n_resamples=np.inf, random_state=rng)
>>> stats.pearsonr(x, y, method=method)
PearsonRResult(statistic=-0.828503883588428, pvalue=0.028174603174603175)

Um den Test unter der Nullhypothese durchzuführen, dass die Daten aus *gleichmäßigen* Verteilungen stammen

>>> method = stats.MonteCarloMethod(rvs=(rng.uniform, rng.uniform))
>>> stats.pearsonr(x, y, method=method)
PearsonRResult(statistic=-0.828503883588428, pvalue=0.0188)

Um ein asymptotisches 90%-Konfidenzintervall zu erstellen

>>> res.confidence_interval(confidence_level=0.9)
ConfidenceInterval(low=-0.9644331982722841, high=-0.3460237473272273)

Und für ein Bootstrap-Konfidenzintervall

>>> method = stats.BootstrapMethod(method='BCa', rng=rng)
>>> res.confidence_interval(confidence_level=0.9, method=method)
ConfidenceInterval(low=-0.9983163756488651, high=-0.22771001702132443)  # may vary

Wenn N-dimensionale Arrays bereitgestellt werden, werden mehrere Tests in einem einzigen Aufruf gemäß den gleichen Konventionen wie die meisten scipy.stats-Funktionen durchgeführt

>>> rng = np.random.default_rng()
>>> x = rng.standard_normal((8, 15))
>>> y = rng.standard_normal((8, 15))
>>> stats.pearsonr(x, y, axis=0).statistic.shape  # between corresponding columns
(15,)
>>> stats.pearsonr(x, y, axis=1).statistic.shape  # between corresponding rows
(8,)

Um alle paarweisen Vergleiche zwischen den Slices der Arrays durchzuführen, verwenden Sie Standard-NumPy-Broadcasting-Techniken. Um beispielsweise die Korrelation zwischen allen Zeilenpaaren zu berechnen

>>> stats.pearsonr(x[:, np.newaxis, :], y, axis=-1).statistic.shape
(8, 8)

Es besteht eine lineare Abhängigkeit zwischen x und y, wenn y = a + b*x + e, wobei a, b Konstanten und e ein zufälliger Fehlerterm sind, der unabhängig von x angenommen wird. Der Einfachheit halber nehmen wir an, dass x standardnormal ist, a=0, b=1 und e einer Normalverteilung mit Mittelwert Null und Standardabweichung s>0 folgt.

>>> rng = np.random.default_rng()
>>> s = 0.5
>>> x = stats.norm.rvs(size=500, random_state=rng)
>>> e = stats.norm.rvs(scale=s, size=500, random_state=rng)
>>> y = x + e
>>> stats.pearsonr(x, y).statistic
0.9001942438244763

Dies sollte nahe am exakten Wert liegen, der durch

>>> 1/np.sqrt(1 + s**2)
0.8944271909999159

Für s=0.5 beobachten wir ein hohes Maß an Korrelation. Im Allgemeinen reduziert eine große Varianz des Rauschens die Korrelation, während die Korrelation gegen eins konvergiert, wenn die Varianz des Fehlers gegen Null geht.

Es ist wichtig zu bedenken, dass keine Korrelation keine Unabhängigkeit impliziert, es sei denn, (x, y) ist gemeinsam normalverteilt. Korrelation kann sogar Null sein, wenn eine sehr einfache Abhängigkeitsstruktur besteht: Wenn X einer Standardnormalverteilung folgt, sei y = abs(x). Beachten Sie, dass die Korrelation zwischen x und y Null ist. Tatsächlich gilt, da der Erwartungswert von x Null ist, cov(x, y) = E[x*y]. Per Definition ist dies gleich E[x*abs(x)], was aufgrund der Symmetrie Null ist. Die folgenden Codezeilen veranschaulichen diese Beobachtung

>>> y = np.abs(x)
>>> stats.pearsonr(x, y)
PearsonRResult(statistic=-0.05444919272687482, pvalue=0.22422294836207743)

Ein von Null verschiedener Korrelationskoeffizient kann irreführend sein. Wenn X beispielsweise eine Standardnormalverteilung hat, definieren Sie y = x, wenn x < 0, und y = 0 andernfalls. Eine einfache Berechnung ergibt corr(x, y) = sqrt(2/Pi) = 0.797…, was ein hohes Maß an Korrelation impliziert

>>> y = np.where(x < 0, x, 0)
>>> stats.pearsonr(x, y)
PearsonRResult(statistic=0.861985781588, pvalue=4.813432002751103e-149)

Dies ist unintuitiv, da es keine Abhängigkeit von x und y gibt, wenn x größer als Null ist, was in etwa der Hälfte der Fälle passiert, wenn wir x und y abtasten.

Ein detaillierteres Beispiel finden Sie unter Pearson’s Correlation.