Как выполнить тест Колмогорова-Смирнова в Python


Тест Колмогорова-Смирнова используется для проверки того, происходит ли выборка из определенного распределения.

Чтобы выполнить тест Колмогорова-Смирнова в Python, мы можем использовать scipy.stats.kstest() для теста с одной выборкой или scipy.stats.ks_2samp() для теста с двумя выборками.

В этом руководстве показан пример использования каждой функции на практике.

Пример 1: Одновыборочный критерий Колмогорова-Смирнова

Предположим, у нас есть следующие образцы данных:

from numpy.random import seed
from numpy.random import poisson

#set seed (e.g. make this example reproducible)
seed(0)

#generate dataset of 100 values that follow a Poisson distribution with mean=5
data = poisson(5, 100)

В следующем коде показано, как выполнить тест Колмогорова-Смирнова для этой выборки из 100 значений данных, чтобы определить, является ли она результатом нормального распределения:

from scipy.stats import kstest

#perform Kolmogorov-Smirnov test
kstest(data, 'norm')

KstestResult(statistic=0.9072498680518208, pvalue=1.0908062873170218e-103)

Из вывода мы видим, что статистика теста равна 0,9072 , а соответствующее значение p равно 1,0908e-103.Поскольку p-значение меньше 0,05, мы отвергаем нулевую гипотезу. У нас есть достаточно доказательств, чтобы сказать, что данные выборки не имеют нормального распределения.

Этот результат также не должен вызывать удивления, поскольку мы сгенерировали выборочные данные с помощью функции poisson() , которая генерирует случайные значения, соответствующиераспределению Пуассона .

Пример 2. Двухвыборочный критерий Колмогорова-Смирнова

Предположим, у нас есть следующие два примера набора данных:

from numpy.random import seed
from numpy.random import randn
from numpy.random import lognormal

#set seed (e.g. make this example reproducible)
seed(0)

#generate two datasets
data1 = randn(100)
data2 = lognormal(3, 1, 100)

В следующем коде показано, как выполнить тест Колмогорова-Смирнова для этих двух образцов, чтобы определить, получены ли они из одного и того же дистрибутива:

from scipy.stats import ks_2samp

#perform Kolmogorov-Smirnov test
ks_2samp(data1, data2)

KstestResult(statistic=0.99, pvalue=4.417521386399011e-57)

Из вывода мы видим, что статистика теста равна 0,99 , а соответствующее значение p равно 4,4175e-57.Поскольку p-значение меньше 0,05, мы отвергаем нулевую гипотезу. У нас есть достаточно доказательств, чтобы сказать, что два выборочных набора данных не происходят из одного и того же распределения.

Этот результат также не должен удивлять, поскольку мы сгенерировали значения для первой выборки, используя стандартное нормальное распределение, а значения для второй выборки, используя логарифмически нормальное распределение.

Дополнительные ресурсы

Как выполнить тест Шапиро-Уилка в Python
Как выполнить тест Андерсона-Дарлинга в Python