scipy.stats.

kstest#

scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[Quelle]#

Führt den (ein- oder zweiseitigen) Kolmogorov-Smirnov-Test auf Anpassungsgüte durch.

Der einseitige Test vergleicht die zugrundeliegende Verteilung F(x) einer Stichprobe gegen eine gegebene Verteilung G(x). Der zweiseitige Test vergleicht die zugrundeliegenden Verteilungen zweier unabhängiger Stichproben. Beide Tests sind nur für kontinuierliche Verteilungen gültig.

Parameter:
rvsstr, array_like oder callable

Wenn es sich um ein Array handelt, sollte es ein 1D-Array von Beobachtungen von Zufallsvariablen sein. Wenn es sich um einen Callable handelt, sollte es eine Funktion zur Erzeugung von Zufallsvariablen sein; es muss ein Schlüsselwortargument size haben. Wenn es sich um eine Zeichenkette handelt, sollte es der Name einer Verteilung in scipy.stats sein, die zur Erzeugung von Zufallsvariablen verwendet wird.

cdfstr, array_like oder callable

Wenn array_like, sollte es ein 1D-Array von Beobachtungen von Zufallsvariablen sein und der zweiseitige Test wird durchgeführt (und rvs muss array_like sein). Wenn es sich um einen Callable handelt, wird dieser Callable zur Berechnung der CDF verwendet. Wenn es sich um eine Zeichenkette handelt, sollte es der Name einer Verteilung in scipy.stats sein, die als CDF-Funktion verwendet wird.

argstuple, Sequenz, optional

Verteilungsparameter, verwendet, wenn rvs oder cdf Zeichenketten oder Callables sind.

Nint, optional

Stichprobengröße, wenn rvs eine Zeichenkette oder ein Callable ist. Standard ist 20.

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’, ‘approx’, ‘asymp’}, optional

Definiert die zur Berechnung des p-Wertes verwendete Verteilung. Folgende Optionen stehen zur Verfügung (Standard ist ‘auto’)

  • ‘auto’ : wählt eine der anderen Optionen aus.

  • ‘exact’ : verwendet die exakte Verteilung der Teststatistik.

  • ‘approx’ : approximiert die zweiseitige Wahrscheinlichkeit mit der doppelten einseitigen Wahrscheinlichkeit

  • ‘asymp’: verwendet die 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 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:
res: KstestResult

Ein Objekt, das Attribute enthält

statisticfloat

KS-Teststatistik, entweder D+, D- oder D (das Maximum der beiden)

pvaluefloat

Einseitiger oder zweiseitiger p-Wert.

statistic_locationfloat

Bei einem einseitigen Test ist dies der Wert von rvs, der der KS-Statistik entspricht; d. h. die Distanz zwischen der empirischen Verteilungsfunktion und der hypothetischen kumulativen Verteilungsfunktion wird an dieser Beobachtung gemessen.

Bei einem zweiseitigen Test ist dies der Wert aus rvs oder cdf, der der KS-Statistik entspricht; d. h. die Distanz zwischen den empirischen Verteilungsfunktionen wird an dieser Beobachtung gemessen.

statistic_signint

Bei einem einseitigen Test ist dies +1, wenn die KS-Statistik die größte positive Differenz zwischen der empirischen Verteilungsfunktion und der hypothetischen kumulativen Verteilungsfunktion (D+) ist; sie ist -1, wenn die KS-Statistik die größte negative Differenz (D-) ist.

Bei einem zweiseitigen Test ist dies +1, wenn die empirische Verteilungsfunktion von rvs die empirische Verteilungsfunktion von cdf an statistic_location überschreitet, andernfalls -1.

Siehe auch

ks_1samp, ks_2samp

Hinweise

Es gibt drei Optionen für die Null- und die entsprechenden Alternativhypothesen, die mit dem Parameter alternative ausgewählt werden können.

  • two-sided: Die Nullhypothese besagt, dass die beiden Verteilungen identisch sind, F(x)=G(x) für alle x; die Alternative ist, dass sie nicht identisch sind.

  • less: Die Nullhypothese besagt, dass F(x) >= G(x) für alle x; die Alternative ist, dass F(x) < G(x) für mindestens ein x.

  • greater: Die Nullhypothese besagt, dass F(x) <= G(x) für alle x; die Alternative ist, dass F(x) > G(x) für mindestens ein x.

Beachten Sie, dass die alternativen Hypothesen die *CDFs* der zugrundeliegenden Verteilungen beschreiben, nicht die beobachteten Werte. Wenn beispielsweise x1 ~ F und x2 ~ G. Wenn F(x) > G(x) für alle x, tendieren die Werte in x1 dazu, kleiner als die in x2 zu sein.

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.

Beispiele

Angenommen, wir möchten die Nullhypothese testen, dass eine Stichprobe nach der Standardnormalverteilung verteilt ist. Wir wählen ein Konfidenzniveau von 95 %; das heißt, wir werden die Nullhypothese zugunsten der Alternative verwerfen, wenn der p-Wert kleiner als 0,05 ist.

Beim Testen von gleichverteilten Daten erwarten wir, dass die Nullhypothese verworfen wird.

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> stats.kstest(stats.uniform.rvs(size=100, random_state=rng),
...              stats.norm.cdf)
KstestResult(statistic=0.5001899973268688,
             pvalue=1.1616392184763533e-23,
             statistic_location=0.00047625268963724654,
             statistic_sign=-1)

Tatsächlich ist der p-Wert niedriger als unsere Schwelle von 0,05, sodass wir die Nullhypothese zugunsten der Standardabweichung „zweiseitig“ verwerfen: Die Daten sind *nicht* nach der Standardnormalverteilung verteilt.

Beim Testen von Zufallsvariaten aus der Standardnormalverteilung erwarten wir, dass die Daten die meiste Zeit mit der Nullhypothese übereinstimmen.

>>> x = stats.norm.rvs(size=100, random_state=rng)
>>> stats.kstest(x, stats.norm.cdf)
KstestResult(statistic=0.05345882212970396,
             pvalue=0.9227159037744717,
             statistic_location=-1.2451343873745018,
             statistic_sign=1)

Wie erwartet, liegt der p-Wert von 0,92 nicht unter unserer Schwelle von 0,05, sodass wir die Nullhypothese nicht verwerfen können.

Angenommen, die Zufallsvariaten sind jedoch nach einer Normalverteilung verteilt, die zu größeren Werten verschoben ist. In diesem Fall tendiert die kumulative Dichtefunktion (CDF) der zugrundeliegenden Verteilung dazu, *kleiner* als die CDF der Standardnormalverteilung zu sein. Daher erwarten wir, dass die Nullhypothese mit alternative='less' verworfen wird.

>>> x = stats.norm.rvs(size=100, loc=0.5, random_state=rng)
>>> stats.kstest(x, stats.norm.cdf, alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

Und tatsächlich verwerfen wir mit einem p-Wert, der kleiner als unser Schwellenwert ist, die Nullhypothese zugunsten der Alternative.

Zur Vereinfachung kann der vorherige Test mit dem Namen der Verteilung als zweitem Argument durchgeführt werden.

>>> stats.kstest(x, "norm", alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

Die obigen Beispiele waren allesamt einseitige Tests, die mit denen von ks_1samp identisch sind. Beachten Sie, dass kstest auch zweiseitige Tests durchführen kann, die mit denen von ks_2samp identisch sind. Wenn beispielsweise zwei Stichproben aus derselben Verteilung gezogen werden, erwarten wir, dass die Daten die meiste Zeit mit der Nullhypothese übereinstimmen.

>>> sample1 = stats.laplace.rvs(size=105, random_state=rng)
>>> sample2 = stats.laplace.rvs(size=95, random_state=rng)
>>> stats.kstest(sample1, sample2)
KstestResult(statistic=0.11779448621553884,
             pvalue=0.4494256912629795,
             statistic_location=0.6138814275424155,
             statistic_sign=1)

Wie erwartet, liegt der p-Wert von 0,45 nicht unter unserer Schwelle von 0,05, sodass wir die Nullhypothese nicht verwerfen können.