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/MonteCarloMethodist, wird der p-Wert mithilfe vonscipy.stats.permutation_test/scipy.stats.monte_carlo_testmit 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:
- result
PearsonRResult 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
namedtuplemit 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 vonBootstrapMethodist, wird das Konfidenzintervall mithilfe vonscipy.stats.bootstrapmit 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.
- result
- Löst aus:
- ValueError
Wenn x und y keine Länge von mindestens 2 haben.
- Warnungen:
ConstantInputWarningAusgelöst, wenn ein Input ein konstantes Array ist. Der Korrelationskoeffizient ist in diesem Fall nicht definiert, daher wird
np.nanzurückgegeben.NearConstantInputWarningAusgelöst, wenn eine Eingabe „nahezu“ konstant ist. Das Array
xwird als nahezu konstant betrachtet, wennnorm(x - mean(x)) < 1e-13 * abs(mean(x)). Numerische Fehler bei der Berechnungx - mean(x)können in diesem Fall zu einer ungenauen Berechnung von r führen.
Siehe auch
spearmanrSpearman-Rangkorrelationskoeffizient.
kendalltauKendalls 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
pearsonrverwendet 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 rdist = scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2)
Der Standard-p-Wert, der von
pearsonrzurü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 Objektdistkann der p-Wert für ein gegebenes r und eine Länge n berechnet werden alsp = 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.
pearsonrhat 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 UmgebungsvariableSCIPY_ARRAY_API=1setzen 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.