ks_2samp#
- scipy.stats.ks_2samp(data1, data2, alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[Quelle]#
Führt den zweistichprobigen Kolmogorov-Smirnov-Test auf Anpassungsgüte durch.
Dieser Test vergleicht die zugrundeliegenden kontinuierlichen Verteilungen F(x) und G(x) von zwei unabhängigen Stichproben. Siehe Hinweise für eine Beschreibung der verfügbaren Null- und Alternativhypothesen.
- Parameter:
- data1, data2array_like, 1-dimensional
Zwei Arrays von Stichprobenbeobachtungen, die angenommen werden, aus einer kontinuierlichen Verteilung gezogen worden zu sein, Stichprobengrößen können unterschiedlich sein.
- alternative{‘zweiseitig’, ‘kleiner’, ‘größer’}, optional
Definiert die Null- und Alternativhypothesen. Standard ist 'two-sided'. Bitte siehe Erläuterungen in den Hinweisen unten.
- method{‘auto’, ‘exact’, ‘asymp’}, optional
Definiert die Methode zur Berechnung des p-Wertes. Die folgenden Optionen sind verfügbar (Standard ist 'auto')
‘auto’ : verwende ‘exact’ für kleine Stichprobengrößen, ‘asymp’ für große
‘exact’ : verwende exakte Verteilung der Teststatistik
‘asymp’ : verwende asymptotische Verteilung der Teststatistik
- 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.- 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 einValueErrorausgelö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:
- res: KstestResult
Ein Objekt, das Attribute enthält
- statisticfloat
KS-Teststatistik.
- pvaluefloat
Einseitiger oder zweiseitiger p-Wert.
- statistic_locationfloat
Wert aus data1 oder data2, der der KS-Statistik entspricht; d.h. der Abstand zwischen den empirischen Verteilungsfunktionen wird bei dieser Beobachtung gemessen.
- statistic_signint
+1, wenn die empirische Verteilungsfunktion von data1 die empirische Verteilungsfunktion von data2 an der Position statistic_location übersteigt, andernfalls -1.
Siehe auch
Hinweise
Es gibt drei Optionen für die Null- und die entsprechenden Alternativhypothesen, die mit dem Parameter alternative ausgewählt werden können.
less: Die Nullhypothese ist, dass F(x) >= G(x) für alle x gilt; die Alternative ist, dass F(x) < G(x) für mindestens ein x gilt. Die Statistik ist die Größe der minimalen (stärksten negativen) Differenz zwischen den empirischen Verteilungsfunktionen der Stichproben.
greater: Die Nullhypothese ist, dass F(x) <= G(x) für alle x gilt; die Alternative ist, dass F(x) > G(x) für mindestens ein x gilt. Die Statistik ist die maximale (stärkste positive) Differenz zwischen den empirischen Verteilungsfunktionen der Stichproben.
two-sided: Die Nullhypothese ist, dass die beiden Verteilungen identisch sind, F(x)=G(x) für alle x; die Alternative ist, dass sie nicht identisch sind. Die Statistik ist die maximale absolute Differenz zwischen den empirischen Verteilungsfunktionen der Stichproben.
Beachten Sie, dass die Alternativhypothesen die *CDFs* der zugrundeliegenden Verteilungen beschreiben, nicht die beobachteten Werte der Daten. Zum Beispiel, nehmen wir an x1 ~ F und x2 ~ G. Wenn F(x) > G(x) für alle x, tendieren die Werte in x1 dazu, kleiner zu sein als die in x2.
Wenn die KS-Statistik groß ist, dann ist der p-Wert klein, und dies kann als Beweis gegen die Nullhypothese zugunsten der Alternative genommen werden.
Wenn
method='exact', versuchtks_2samp, einen exakten p-Wert zu berechnen, d.h. die Wahrscheinlichkeit unter der Nullhypothese, einen Teststatistik-Wert zu erhalten, der so extrem ist wie der aus den Daten berechnete Wert. Wennmethod='asymp', wird die asymptotische Kolmogorov-Smirnov-Verteilung verwendet, um einen ungefähren p-Wert zu berechnen. Wennmethod='auto', wird eine exakte p-Wert-Berechnung versucht, wenn beide Stichprobengrößen kleiner als 10000 sind; andernfalls wird die asymptotische Methode verwendet. In jedem Fall, wenn eine exakte p-Wert-Berechnung versucht und fehlschlägt, wird eine Warnung ausgegeben und der asymptotische p-Wert zurückgegeben.Die 'two-sided' 'exact' Berechnung berechnet die komplementäre Wahrscheinlichkeit und subtrahiert diese dann von 1. Daher ist die minimale Wahrscheinlichkeit, die sie zurückgeben kann, etwa 1e-16. Obwohl der Algorithmus selbst exakt ist, können numerische Fehler bei großen Stichprobengrößen auftreten. Er ist am besten geeignet für Situationen, in denen eine der Stichprobengrößen nur wenige Tausend beträgt.
Wir folgen im Allgemeinen Hodges' Behandlung von Drion/Gnedenko/Korolyuk [1].
Seit SciPy 1.9 werden
np.matrix-Eingaben (für neuen Code nicht empfohlen) vor der Berechnung innp.ndarraykonvertiert. In diesem Fall ist die Ausgabe eine Skalar- odernp.ndarraymit geeigneter Form anstelle eines 2D-np.matrix. Ebenso werden, während maskierte Elemente von Masked Arrays ignoriert werden, die Ausgabe eine Skalar- odernp.ndarrayanstelle eines Masked Arrays mitmask=Falsesein.Referenzen
[1]Hodges, J.L. Jr., „The Significance Probability of the Smirnov Two-Sample Test,“ Arkiv fiur Matematik, 3, Nr. 43 (1958), 469-486.
Beispiele
Angenommen, wir möchten die Nullhypothese testen, dass zwei Stichproben aus derselben Verteilung stammen. Wir wählen ein Konfidenzniveau von 95%; das heißt, wir verwerfen die Nullhypothese zugunsten der Alternative, wenn der p-Wert kleiner als 0,05 ist.
Wenn die erste Stichprobe aus einer Gleichverteilung und die zweite aus der Standardnormalverteilung gezogen worden wäre, würden wir erwarten, dass die Nullhypothese verworfen wird.
>>> import numpy as np >>> from scipy import stats >>> rng = np.random.default_rng() >>> sample1 = stats.uniform.rvs(size=100, random_state=rng) >>> sample2 = stats.norm.rvs(size=110, random_state=rng) >>> stats.ks_2samp(sample1, sample2) KstestResult(statistic=0.5454545454545454, pvalue=7.37417839555191e-15, statistic_location=-0.014071496412861274, statistic_sign=-1)
Tatsächlich ist der p-Wert niedriger als unser Schwellenwert von 0,05, sodass wir die Nullhypothese zugunsten der Standardalternative "two-sided" verwerfen: die Daten wurden *nicht* aus derselben Verteilung gezogen.
Wenn beide Stichproben aus derselben Verteilung stammen, erwarten wir, dass die Daten die meiste Zeit mit der Nullhypothese übereinstimmen.
>>> sample1 = stats.norm.rvs(size=105, random_state=rng) >>> sample2 = stats.norm.rvs(size=95, random_state=rng) >>> stats.ks_2samp(sample1, sample2) KstestResult(statistic=0.10927318295739348, pvalue=0.5438289009927495, statistic_location=-0.1670157701848795, statistic_sign=-1)
Wie erwartet, liegt der p-Wert von 0,54 nicht unter unserem Schwellenwert von 0,05, sodass wir die Nullhypothese nicht verwerfen können.
Angenommen, jedoch, dass die erste Stichprobe aus einer Normalverteilung gezogen wurde, die zu größeren Werten verschoben ist. In diesem Fall neigt die kumulative Verteilungsfunktion (CDF) der zugrundeliegenden Verteilung dazu, *kleiner* zu sein als die CDF, die der zweiten Stichprobe zugrunde liegt. Daher würden wir erwarten, dass die Nullhypothese bei
alternative='less'verworfen wird.>>> sample1 = stats.norm.rvs(size=105, loc=0.5, random_state=rng) >>> stats.ks_2samp(sample1, sample2, alternative='less') KstestResult(statistic=0.4055137844611529, pvalue=3.5474563068855554e-08, statistic_location=-0.13249370614972575, statistic_sign=-1)
Und tatsächlich verwerfen wir mit einem p-Wert, der kleiner als unser Schwellenwert ist, die Nullhypothese zugunsten der Alternative.