Dwupróbkowy test Kołmogorowa-Smirnowa w Python Scipy

82

Nie mogę wymyślić, jak wykonać test KS z dwiema próbami w Scipy.

Po przeczytaniu dokumentacji scipy kstest

Potrafię sprawdzić, gdzie rozkład jest identyczny ze standardowym rozkładem normalnym

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)

Co oznacza, że ​​przy wartości p wynoszącej 0,76 nie możemy odrzucić hipotezy zerowej, że te dwa rozkłady są identyczne.

Chcę jednak porównać dwie dystrybucje i zobaczyć, czy mogę odrzucić hipotezę zerową, że są identyczne, coś takiego:

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)

i sprawdź, czy x i z są identyczne

Spróbowałem naiwnego:

test_stat = kstest(x, z)

i otrzymałem następujący błąd:

TypeError: 'numpy.ndarray' object is not callable

Czy istnieje sposób na wykonanie testu KS z dwiema próbami w Pythonie? Jeśli tak, jak mam to zrobić?

Z góry dziękuję

Akavall
źródło
Czy możesz opublikować linię i ślad zwrotny?
cval

Odpowiedzi:

123

Używasz jednopróbkowego testu KS. Prawdopodobnie chcesz wykonać test z dwiema próbami 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)

Wyniki można interpretować w następujący sposób:

  1. Możesz porównać statisticwartość podaną przez Pythona z tabelą wartości krytycznych testu KS zgodnie z rozmiarem próbki. Gdy statisticwartość jest wyższa niż wartość krytyczna, te dwa rozkłady są różne.

  2. Lub możesz porównać p-valuepoziom istotności a , zwykle a = 0,05 lub 0,01 (Ty decydujesz, im niższe jest a, tym bardziej istotne). Jeśli wartość p jest niższa niż a , to jest bardzo prawdopodobne, że te dwa rozkłady są różne.

DSM
źródło
1
Dokładnie tego szukałem. Dziękuję Ci bardzo!
Akavall
2
Jak interpretujesz te wyniki? Czy możesz powiedzieć, że próbki pochodzą z tej samej dystrybucji, patrząc na statistici p-value?
FaCoffee
4
@FaCoffee Tak mówią doktorzy scipy: „ Jeśli statystyka KS jest mała lub wartość p jest wysoka, to nie możemy odrzucić hipotezy, że rozkłady dwóch próbek są takie same.
user2738815
5

Oto, co mówią Scipy Docs:

Jeśli statystyka KS jest mała lub wartość p jest wysoka, nie możemy odrzucić hipotezy, że rozkłady obu próbek są takie same.

Nie można odrzucić nie oznacza, że ​​potwierdzamy.

cze 小嘴 兔
źródło
czy mógłbyś bardziej szczegółowo wyjaśnić swoją odpowiedź? z góry dziękuję!
King Reload
@KingReload Oznacza to, że gdy wartość p jest bardzo mała, oznacza to, że prawdopodobieństwo, że te dwie próbki nie pochodzą z tego samego rozkładu, jest bardzo niskie. Innymi słowy, prawdopodobieństwo, że te dwie próbki pochodzą z tego samego rozkładu, jest bardzo wysokie. Ale nie możesz być tego w 100% pewien, stąd wartości p nigdy nie są zerowe. (Czasami są wyświetlane jako 0, ale w rzeczywistości nigdy nie jest to zero). Dlatego mówi się, że nie odrzuciliśmy hipotezy zerowej zamiast akceptujemy hipotezę zerową . Zaakceptowanie hipotezy zerowej = rozkłady dwóch próbek są takie same
MD Abid Hasan,
3
Wartość p wysoka, bardzo prawdopodobne, że pochodzą z tego samego rozkładu, wartość p mała prawdopodobnie nie. @MDAbidHasan ma to wstecz. Rzeczywiście, przykład w dokumentacji podają przykład: 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)
superbohater