scipy.stats.

mannwhitneyu#

scipy.stats.mannwhitneyu(x, y, use_continuity=True, alternative='two-sided', axis=0, method='auto', *, nan_policy='propagate', keepdims=False)[Quelle]#

Führt den Mann-Whitney-U-Rangtest für zwei unabhängige Stichproben durch.

Der Mann-Whitney-U-Test ist ein nichtparametrischer Test der Nullhypothese, dass die zugrundeliegende Verteilung der Stichprobe x dieselbe ist wie die zugrundeliegende Verteilung der Stichprobe y. Er wird oft als Test auf einen Unterschied in der Lage zwischen Verteilungen verwendet.

Parameter:
x, yarray-ähnlich

N-dimensionale Arrays von Stichproben. Die Arrays müssen bis auf die entlang der durch axis gegebenen Dimension broadcastbar sein.

use_continuitybool, optional

Ob eine Stetigkeitskorrektur (1/2) angewendet werden soll. Standardmäßig True, wenn method 'asymptotic' ist; hat sonst keine Auswirkung.

alternative{‘zweiseitig’, ‘kleiner’, ‘größer’}, optional

Definiert die alternative Hypothese. Standard ist 'two-sided'. Seien SX(u) und SY(u) die Überlebensfunktionen der zugrundeliegenden Verteilungen von x und y. Dann sind die folgenden alternativen Hypothesen verfügbar

  • ‘two-sided’: Die Verteilungen sind nicht gleich, d.h. SX(u) ≠ SY(u) für mindestens ein u.

  • ‘less’: Die zugrundeliegende Verteilung von x ist stochastisch kleiner als die zugrundeliegende Verteilung von y, d.h. SX(u) < SY(u) für alle u.

  • ‘greater’: Die zugrundeliegende Verteilung von x ist stochastisch größer als die zugrundeliegende Verteilung von y, d.h. SX(u) > SY(u) für alle u.

Unter einer restriktiveren Annahmenmenge können die alternativen Hypothesen in Bezug auf die Lagen der Verteilungen ausgedrückt werden; siehe [5] Abschnitt 5.1.

axisint oder None, Standard: 0

Wenn es sich um eine ganze Zahl handelt, ist dies die Achse des Eingabearrays, entlang der die Statistik berechnet wird. Die Statistik jedes Achsen-Slices (z. B. Zeile) der Eingabe erscheint dann in einem entsprechenden Element der Ausgabe. Wenn None, wird die Eingabe vor der Berechnung der Statistik geglättet.

method{‘auto’, ‘asymptotic’, ‘exact’} oder PermutationMethod Instanz, optional

Wählt die Methode zur Berechnung des p-Wertes aus. Standard ist 'auto'. Die folgenden Optionen sind verfügbar.

  • 'asymptotic': vergleicht die standardisierte Teststatistik mit der Normalverteilung, korrigiert für Gleichstände.

  • 'exact': berechnet den exakten p-Wert, indem die beobachtete \(U\)-Statistik mit der exakten Verteilung der \(U\)-Statistik unter der Nullhypothese verglichen wird. Für Gleichstände wird keine Korrektur vorgenommen.

  • 'auto': wählt 'exact', wenn die Größe einer der Stichproben kleiner oder gleich 8 ist und keine Gleichstände vorhanden sind; wählt andernfalls 'asymptotic'.

  • PermutationMethod Instanz. In diesem Fall wird der p-Wert mittels permutation_test mit den bereitgestellten Konfigurationsoptionen und anderen geeigneten Einstellungen berechnet.

nan_policy{‘propagate’, ‘omit’, ‘raise’}

Definiert, wie Eingabe-NaNs behandelt werden.

  • propagate: Wenn ein NaN in der Achsen-Slice (z. B. Zeile) vorhanden ist, entlang der die Statistik berechnet wird, wird der entsprechende Eintrag der Ausgabe NaN sein.

  • omit: NaNs werden bei der Berechnung weggelassen. Wenn im Achsen-Slice, entlang dem die Statistik berechnet wird, nicht genügend Daten verbleiben, wird der entsprechende Eintrag der Ausgabe NaN sein.

  • raise: Wenn ein NaN vorhanden ist, wird ein ValueError ausgelöst.

keepdimsbool, Standard: False

Wenn dies auf True gesetzt ist, bleiben die reduzierten Achsen im Ergebnis als Dimensionen mit der Größe eins erhalten. Mit dieser Option wird das Ergebnis korrekt gegen das Eingabearray gestreut (broadcasted).

Rückgabe:
resMannwhitneyuResult

Ein Objekt, das Attribute enthält

statisticfloat

Die Mann-Whitney-U-Statistik, die der Stichprobe x entspricht. Siehe Hinweise für die Teststatistik, die der Stichprobe y entspricht.

pvaluefloat

Der zugehörige p-Wert für die gewählte alternative.

Hinweise

Wenn U1 die Statistik ist, die der Stichprobe x entspricht, dann ist die Statistik, die der Stichprobe y entspricht, U2 = x.shape[axis] * y.shape[axis] - U1.

mannwhitneyu ist für unabhängige Stichproben. Für abhängige / gepaarte Stichproben ziehen Sie scipy.stats.wilcoxon in Betracht.

Die Methode method 'exact' wird empfohlen, wenn keine Gleichstände vorhanden sind und wenn die Stichprobengröße kleiner als 8 ist [1]. Die Implementierung folgt dem Algorithmus, der in [3] berichtet wird. Beachten Sie, dass die exakte Methode *nicht* für Gleichstände korrigiert wird, aber mannwhitneyu keine Fehler oder Warnungen ausgibt, wenn Gleichstände in den Daten vorhanden sind. Wenn Gleichstände vorhanden sind und eine der Stichproben klein ist (weniger als ca. 10 Beobachtungen), sollten Sie eine Instanz von PermutationMethod als method übergeben, um einen Permutationstest durchzuführen.

Der Mann-Whitney-U-Test ist eine nichtparametrische Version des t-Tests für unabhängige Stichproben. Wenn die Mittelwerte von Stichproben aus den Populationen normalverteilt sind, ziehen Sie scipy.stats.ttest_ind in Betracht.

Seit SciPy 1.9 werden np.matrix-Eingaben (für neuen Code nicht empfohlen) vor der Berechnung in np.ndarray konvertiert. In diesem Fall ist die Ausgabe eine Skalar- oder np.ndarray mit geeigneter Form anstelle eines 2D-np.matrix. Ebenso werden, während maskierte Elemente von Masked Arrays ignoriert werden, die Ausgabe eine Skalar- oder np.ndarray anstelle eines Masked Arrays mit mask=False sein.

Referenzen

[1]

H.B. Mann und D.R. Whitney, „On a test of whether one of two random variables is stochastically larger than the other“, The Annals of Mathematical Statistics, Bd. 18, S. 50-60, 1947.

[2]

Mann-Whitney U Test, Wikipedia, http://en.wikipedia.org/wiki/Mann-Whitney_U_test

[3]

Andreas Löffler, „Über eine Partition der nat. Zahlen und ihr Anwendung beim U-Test“, Wiss. Z. Univ. Halle, XXXII’83 S. 87-89.

[4] (1,2,3,4,5,6,7)

Rosie Shier, „Statistics: 2.3 The Mann-Whitney U Test“, Mathematics Learning Support Centre, 2004.

[5]

Michael P. Fay und Michael A. Proschan. „Wilcoxon-Mann-Whitney or t-test? On assumptions for hypothesis tests and multiple interpretations of decision rules.“ Statistics surveys, Bd. 4, S. 1-39, 2010. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2857732/

Beispiele

Wir folgen dem Beispiel aus [4]: neun zufällig ausgewählte junge Erwachsene wurden im Folgenden mit Typ-II-Diabetes diagnostiziert.

>>> males = [19, 22, 16, 29, 24]
>>> females = [20, 11, 17, 12]

Wir verwenden den Mann-Whitney-U-Test, um zu prüfen, ob ein statistisch signifikanter Unterschied im Diagnosealter von Männern und Frauen besteht. Die Nullhypothese ist, dass die Verteilung des Diagnosealters von Männern dieselbe ist wie die Verteilung des Diagnosealters von Frauen. Wir entscheiden, dass ein Konfidenzniveau von 95% erforderlich ist, um die Nullhypothese zugunsten der Alternative, dass die Verteilungen unterschiedlich sind, zu verwerfen. Da die Anzahl der Stichproben sehr klein ist und keine Gleichstände in den Daten vorliegen, können wir die beobachtete Teststatistik mit der *exakten* Verteilung der Teststatistik unter der Nullhypothese vergleichen.

>>> from scipy.stats import mannwhitneyu
>>> U1, p = mannwhitneyu(males, females, method="exact")
>>> print(U1)
17.0

mannwhitneyu berichtet immer die Statistik, die der ersten Stichprobe entspricht, d.h. in diesem Fall den Männern. Dies stimmt mit \(U_M = 17\) überein, das in [4] berichtet wird. Die Statistik, die der zweiten Statistik entspricht, kann berechnet werden

>>> nx, ny = len(males), len(females)
>>> U2 = nx*ny - U1
>>> print(U2)
3.0

Dies stimmt mit \(U_F = 3\) überein, das in [4] berichtet wird. Der zweiseitige p-Wert kann aus beiden Statistiken berechnet werden, und der von mannwhitneyu erzeugte Wert stimmt mit \(p = 0.11\) überein, der in [4] berichtet wird.

>>> print(p)
0.1111111111111111

Die exakte Verteilung der Teststatistik ist asymptotisch normal, daher fährt das Beispiel fort, indem der exakte p-Wert mit dem p-Wert verglichen wird, der mithilfe der Normalen-Approximation ermittelt wird.

>>> _, pnorm = mannwhitneyu(males, females, method="asymptotic")
>>> print(pnorm)
0.11134688653314041

Hier scheint der von mannwhitneyu berichtete p-Wert mit dem Wert \(p = 0.09\) zu kollidieren, der in [4] angegeben ist. Der Grund dafür ist, dass [4] die von mannwhitneyu durchgeführte Stetigkeitskorrektur nicht anwendet; mannwhitneyu reduziert die Distanz zwischen der Teststatistik und dem Mittelwert \(\mu = n_x n_y / 2\) um 0.5, um die Tatsache zu korrigieren, dass die diskrete Statistik mit einer kontinuierlichen Verteilung verglichen wird. Hier ist die verwendete \(U\)-Statistik kleiner als der Mittelwert, daher reduzieren wir die Distanz, indem wir im Zähler 0.5 addieren.

>>> import numpy as np
>>> from scipy.stats import norm
>>> U = min(U1, U2)
>>> N = nx + ny
>>> z = (U - nx*ny/2 + 0.5) / np.sqrt(nx*ny * (N + 1)/ 12)
>>> p = 2 * norm.cdf(z)  # use CDF to get p-value from smaller statistic
>>> print(p)
0.11134688653314041

Wenn gewünscht, können wir die Stetigkeitskorrektur deaktivieren, um ein Ergebnis zu erhalten, das mit dem in [4] berichteten übereinstimmt.

>>> _, pnorm = mannwhitneyu(males, females, use_continuity=False,
...                         method="asymptotic")
>>> print(pnorm)
0.0864107329737

Unabhängig davon, ob wir einen exakten oder asymptotischen Test durchführen, übersteigt die Wahrscheinlichkeit, dass die Teststatistik zufällig so extrem ist oder extremer, 5 %, daher betrachten wir die Ergebnisse nicht als statistisch signifikant.

Angenommen, wir hätten vor dem Sehen der Daten hypothetisiert, dass Frauen tendenziell in einem jüngeren Alter als Männer diagnostiziert werden. In diesem Fall wäre es natürlich, die weiblichen Alter als ersten Input anzugeben, und wir hätten einen einseitigen Test mit alternative = 'less' durchgeführt: Frauen werden in einem Alter diagnostiziert, das stochastisch geringer ist als das der Männer.

>>> res = mannwhitneyu(females, males, alternative="less", method="exact")
>>> print(res)
MannwhitneyuResult(statistic=3.0, pvalue=0.05555555555555555)

Auch hier ist die Wahrscheinlichkeit, unter der Nullhypothese einen ausreichend niedrigen Wert der Teststatistik zu erhalten, größer als 5 %, daher verwerfen wir die Nullhypothese zugunsten unserer Alternative nicht.

Wenn es vertretbar ist, davon auszugehen, dass die Mittelwerte von Stichproben aus den Populationen normalverteilt sind, hätten wir für die Analyse einen t-Test verwenden können.

>>> from scipy.stats import ttest_ind
>>> res = ttest_ind(females, males, alternative="less")
>>> print(res)
TtestResult(statistic=-2.239334696520584,
            pvalue=0.030068441095757924,
            df=7.0)

Unter dieser Annahme wäre der p-Wert niedrig genug, um die Nullhypothese zugunsten der Alternative zu verwerfen.