Kolmogorov-Smirnov-Test mit zwei Stichproben in Python Scipy


81

Ich kann nicht herausfinden, wie ein KS-Test mit zwei Stichproben in Scipy durchgeführt wird.

Nach dem Lesen der Dokumentation scipy kstest

Ich kann sehen, wie man testet, wo eine Verteilung mit der Standardnormalverteilung identisch ist

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
test_stat = kstest(x, 'norm')
#>>> test_stat
#(0.021080234718821145, 0.76584491300591395)

Dies bedeutet, dass wir bei einem p-Wert von 0,76 die Nullhypothese, dass die beiden Verteilungen identisch sind, nicht ablehnen können.

Ich möchte jedoch zwei Verteilungen vergleichen und sehen, ob ich die Nullhypothese, dass sie identisch sind, ablehnen kann, etwa:

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
z = np.random.normal(1.1,0.9, 1000)

und testen Sie, ob x und z identisch sind

Ich habe das Naive versucht:

test_stat = kstest(x, z)

und bekam den folgenden Fehler:

TypeError: 'numpy.ndarray' object is not callable

Gibt es eine Möglichkeit, einen KS-Test mit zwei Stichproben in Python durchzuführen? Wenn ja, wie soll ich das machen?

Danke im Voraus


Könnten Sie die Zeile und Traceback posten?
Cval

Antworten:


122

Sie verwenden den KS-Test mit einer Stichprobe. Sie möchten wahrscheinlich den Test mit zwei Stichproben ks_2samp:

>>> from scipy.stats import ks_2samp
>>> import numpy as np
>>> 
>>> np.random.seed(12345678)
>>> x = np.random.normal(0, 1, 1000)
>>> y = np.random.normal(0, 1, 1000)
>>> z = np.random.normal(1.1, 0.9, 1000)
>>> 
>>> ks_2samp(x, y)
Ks_2sampResult(statistic=0.022999999999999909, pvalue=0.95189016804849647)
>>> ks_2samp(x, z)
Ks_2sampResult(statistic=0.41800000000000004, pvalue=3.7081494119242173e-77)

Die Ergebnisse können wie folgt interpretiert werden:

  1. Sie können entweder den statisticvon Python angegebenen Wert mit der kritischen Wertetabelle des KS-Tests entsprechend Ihrer Stichprobengröße vergleichen. Wenn der statisticWert höher als der kritische Wert ist, unterscheiden sich die beiden Verteilungen.

  2. Oder Sie können das p-valuemit einem Signifikanzniveau a vergleichen , normalerweise a = 0,05 oder 0,01 (Sie entscheiden, je niedriger a ist, desto signifikanter). Wenn der p-Wert niedriger als a ist , ist es sehr wahrscheinlich, dass die beiden Verteilungen unterschiedlich sind.


1
Genau das habe ich gesucht. Vielen Dank!
Akavall

2
Wie interpretieren Sie diese Ergebnisse? Können Sie sagen, dass die Proben aus derselben Verteilung stammen, wenn Sie sich nur statisticund p-valueansehen?
FaCoffee

4
@FaCoffee Dies ist, was die Scipy-Dokumente sagen: " Wenn die KS-Statistik klein oder der p-Wert hoch ist, können wir die Hypothese, dass die Verteilungen der beiden Stichproben gleich sind, nicht zurückweisen. "
user2738815

5

Dies ist, was die scipy Dokumente sagen:

Wenn die KS-Statistik klein oder der p-Wert hoch ist, können wir die Hypothese, dass die Verteilungen der beiden Stichproben gleich sind, nicht zurückweisen.

Kann nicht ablehnen bedeutet nicht, dass wir bestätigen.


Können Sie Ihre Antwort näher erläutern? Danke im Voraus!
King Reload

@KingReload Wenn der p- Wert sehr klein ist, ist die Wahrscheinlichkeit, dass diese beiden Stichproben nicht aus derselben Verteilung stammen, sehr gering. Mit anderen Worten, die Wahrscheinlichkeit, dass diese beiden Stichproben aus derselben Verteilung stammen, ist sehr hoch. Sie können sich jedoch nicht 100% sicher sein, daher sind p- Werte niemals Null. (Manchmal werden sie als 0 angezeigt, aber tatsächlich ist es nie Null). Deshalb heißt es, dass wir die Nullhypothese nicht abgelehnt haben, anstatt die Nullhypothese zu akzeptieren . Akzeptieren der Nullhypothese = Verteilungen der beiden Proben sind gleich
MD Abid Hasan

3
p-Wert hoch sehr wahrscheinlich kommen sie aus der gleichen Verteilung, p-Wert klein wahrscheinlich nicht. @MDAbidHasan hat es rückwärts. In der Tat, das Beispiel in der Dokumentation geben sie ein Beispiel: For an identical distribution, we cannot reject the null hypothesis since the p-value is high, 41%: >>> >>> rvs4 = stats.norm.rvs(size=n2, loc=0.0, scale=1.0) >>> stats.ks_2samp(rvs1, rvs4) (0.07999999999999996, 0.41126949729859719)
Superheld
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.