Двовибірковий тест Колмогорова-Смірнова в Python Scipy


82

Я не можу зрозуміти, як зробити тест із двома зразками KS у Scipy.

Після прочитання документації scipy kstest

Я бачу, як перевірити, де розподіл ідентичний стандартному звичайному розподілу

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)

Це означає, що при р-значенні 0,76 ми не можемо відкинути нульову гіпотезу про те, що два розподіли ідентичні.

Однак я хочу порівняти два розподіли і подивитися, чи можу я відкинути нульову гіпотезу про те, що вони ідентичні, приблизно так:

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)

та перевірити, чи ідентичні x та z

Я спробував наївних:

test_stat = kstest(x, z)

та отримав таку помилку:

TypeError: 'numpy.ndarray' object is not callable

Чи є спосіб зробити тест на два зразки KS у Python? Якщо так, то як мені це зробити?

Наперед дякую


Не могли б ви опублікувати рядок і зворотний зв'язок?
cval

Відповіді:


123

Ви використовуєте одноразовий тест КС. Ймовірно, вам потрібен тест із двома зразками 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)

Результати можна інтерпретувати так:

  1. Ви можете порівняти statisticзначення, задане python, з таблицею критичних значень тесту KS відповідно до обсягу вибірки. Коли statisticзначення вище критичного значення, два розподіли відрізняються.

  2. Або ви можете порівняти p-valuea до рівня значущості a , як правило, a = 0,05 або 0,01 (ви вирішуєте, чим нижче a, тим більше значення). Якщо значення p нижче за a , то дуже ймовірно, що два розподіли різні.


1
Це саме те, що я шукав. Дуже тобі дякую!
Акавалл

2
Як ви трактуєте ці результати? Чи можете ви сказати, що зразки походять з того самого розподілу, просто подивившись statisticі p-value?
FaCoffee

4
@FaCoffee Ось що говорять у документах scipy: " Якщо статистика KS мала або значення p високе, тоді ми не можемо відкинути гіпотезу про те, що розподіли двох зразків однакові. "
user2738815

5

Це те, що кажуть документи в scipy:

Якщо статистика KS мала або р-значення високе, тоді ми не можемо відкинути гіпотезу про те, що розподіли двох вибірок однакові.

Неможливо відхилити не означає, що ми підтверджуємо.


Ви могли б пояснити свою відповідь детальніше? Спасибі заздалегідь!
King Reload

@KingReload Це означає, що коли значення p дуже мало, це означає , що ймовірність того, що ці дві вибірки не надходять з одного розподілу, є дуже низькою. Іншими словами, ймовірність того, що ці дві вибірки надходять з однакового розподілу, дуже велика. Але ви не можете бути на 100% впевнені в тому, що p- значення ніколи не дорівнюють нулю. (Іноді вони відображаються як 0, але насправді це ніколи не дорівнює нулю). Ось чому кажуть, що ми не змогли відхилити нульову гіпотезу замість того , щоб прийняти нульову гіпотезу . Прийняття нульової гіпотези = розподіли двох зразків однакові
доктор медичних наук Абід Хасан

3
p-значення високе, дуже ймовірно, вони походять з одного розподілу, p-значення мало, ймовірно, ні. @MDAbidHasan має це назад. Дійсно, приклад у документації вони наводять приклад: 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)
супергерой
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.