Prueba de Kolmogorov-Smirnov de dos muestras en Python Scipy

81

No sé cómo hacer una prueba de KS de dos muestras en Scipy.

Después de leer la documentación scipy kstest

Puedo ver cómo probar dónde una distribución es idéntica a la distribución normal estándar

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)

Lo que significa que con un valor p de 0,76 no podemos rechazar la hipótesis nula de que las dos distribuciones son idénticas.

Sin embargo, quiero comparar dos distribuciones y ver si puedo rechazar la hipótesis nula de que son idénticas, algo como:

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)

y prueba si x y z son idénticos

Probé el ingenuo:

test_stat = kstest(x, z)

y obtuve el siguiente error:

TypeError: 'numpy.ndarray' object is not callable

¿Hay alguna forma de hacer una prueba de KS de dos muestras en Python? Si es así, ¿cómo debo hacerlo?

Gracias de antemano

Akavall
fuente
¿Podrías publicar la línea y rastrear?
cval

Respuestas:

122

Está utilizando la prueba KS de una muestra. Probablemente desee la prueba de dos muestras 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)

Los resultados se pueden interpretar de la siguiente manera:

  1. Puede comparar el statisticvalor dado por Python con la tabla de valores críticos de la prueba KS de acuerdo con el tamaño de su muestra. Cuando el statisticvalor es mayor que el valor crítico, las dos distribuciones son diferentes.

  2. O puede comparar el p-valuecon un nivel de significancia a , generalmente a = 0.05 o 0.01 (usted decide, cuanto menor sea a, más significativo). Si el valor p es menor que a , entonces es muy probable que las dos distribuciones sean diferentes.

DSM
fuente
1
Eso es exactamente lo que estaba buscando. ¡Muchas gracias!
Akavall
2
¿Cómo interpretas estos resultados? ¿Puede decir que las muestras provienen de la misma distribución con solo mirar statisticy p-value?
FaCoffee
4
@FaCoffee Esto es lo que dicen los documentos de scipy: " Si la estadística KS es pequeña o el valor p es alto, entonces no podemos rechazar la hipótesis de que las distribuciones de las dos muestras son iguales " .
user2738815
5

Esto es lo que dicen los scipy docs:

Si el estadístico KS es pequeño o el valor p es alto, entonces no podemos rechazar la hipótesis de que las distribuciones de las dos muestras son iguales.

No poder rechazar no significa que confirmemos.

jun 小嘴 兔
fuente
¿Podría explicar su respuesta con más detalle? ¡gracias por adelantado!
King Reload
@KingReload Significa que cuando el valor p es muy pequeño, eso dice que la probabilidad de que estas dos muestras no provengan de la misma distribución es muy baja. En otras palabras, la probabilidad de que estas dos muestras provengan de la misma distribución es muy alta. Pero no puede estar 100% seguro de eso, por lo tanto, los valores p nunca son cero. (A veces se muestran como 0, pero en realidad nunca es cero). Por eso se dice que no rechazamos la hipótesis nula en lugar de aceptar la hipótesis nula . Aceptando hipótesis nula = las distribuciones de las dos muestras son iguales
MD Abid Hasan
3
valor p alto es muy probable que provengan de la misma distribución, valor p pequeño probablemente no. @MDAbidHasan lo tiene al revés. De hecho, el ejemplo en la documentación dan un ejemplo: 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)
superhéroe