scipy.stats.

kstest#

scipy.stats.kstest(rvs, функция распределения, args=(), N=20, альтернатива='two-sided', метод='auto', *, ось=0, nan_policy='propagate', keepdims=False)[источник]#

Выполняет (одновыборочный или двухвыборочный) критерий Колмогорова-Смирнова для проверки согласия.

Одновыборочный тест сравнивает базовое распределение F(x) выборки с заданным распределением G(x). Двухвыборочный тест сравнивает базовые распределения двух независимых выборок. Оба теста корректны только для непрерывных распределений.

Параметры:
rvsstr, array_like или callable

Если это массив, он должен быть одномерным массивом наблюдений случайных величин. Если это вызываемый объект, он должен быть функцией для генерации случайных величин; требуется наличие ключевого аргумента размер. Если строка, это должно быть имя распределения в scipy.stats, которая будет использоваться для генерации случайных величин.

функция распределенияstr, array_like или callable

Если array_like, это должен быть одномерный массив наблюдений случайных величин, и выполняется двухвыборочный тест (и rvs должен быть array_like). Если вызываемый объект, то он используется для вычисления cdf. Если строка, это должно быть название распределения в scipy.stats, который будет использоваться как функция распределения.

argstuple, sequence, опционально

Параметры распределения, используемые если rvs или функция распределения являются строками или вызываемыми объектами.

Nint, необязательный

Размер выборки, если rvs является строкой или вызываемым объектом. По умолчанию 20.

альтернатива{‘two-sided’, ‘less’, ‘greater’}, необязательный

Определяет нулевую и альтернативную гипотезы. По умолчанию 'two-sided'. Подробные объяснения см. в примечаниях ниже.

метод{‘auto’, ‘exact’, ‘approx’, ‘asymp’}, опционально

Определяет распределение, используемое для вычисления p-значения. Доступны следующие опции (по умолчанию 'auto'):

  • 'auto' : выбирает один из других вариантов.

  • 'exact' : использует точное распределение тестовой статистики.

  • ‘approx’ : аппроксимирует двустороннюю вероятность удвоенной односторонней вероятностью

  • ‘asymp’: использует асимптотическое распределение тестовой статистики

осьint или None, по умолчанию: 0

Если это целое число, ось входных данных, по которой вычисляется статистика. Статистика каждого среза по оси (например, строки) входных данных появится в соответствующем элементе вывода. Если None, вход будет сведён в одномерный массив перед вычислением статистики.

nan_policy{‘propagate’, ‘omit’, ‘raise’}

Определяет, как обрабатывать входные значения NaN.

  • propagate: если NaN присутствует в срезе оси (например, строке), вдоль которой вычисляется статистика, соответствующая запись вывода будет NaN.

  • omit: NaN будут пропущены при выполнении расчета. Если в срезе оси, вдоль которого вычисляется статистика, остается недостаточно данных, соответствующая запись вывода будет NaN.

  • raise: если присутствует NaN, то ValueError будет вызвано исключение.

keepdimsbool, по умолчанию: False

Если установлено значение True, оси, которые были сокращены, остаются в результате как размерности с размером один. С этой опцией результат будет корректно транслироваться относительно входного массива.

Возвращает:
res: KstestResult

Объект, содержащий атрибуты:

статистикаfloat

Статистика критерия Колмогорова-Смирнова, либо D+, D-, или D (максимум из двух)

p-значениеfloat

Одностороннее или двустороннее p-значение.

statistic_locationfloat

В однократном тесте это значение rvs соответствующее статистике Колмогорова-Смирнова; т.е. расстояние между эмпирической функцией распределения и гипотетической кумулятивной функцией распределения измеряется на этом наблюдении.

В двухвыборочном тесте это значение из rvs или функция распределения соответствующий статистике KS; т.е., расстояние между эмпирическими функциями распределения измеряется в этом наблюдении.

statistic_signint

В одновыборочном тесте это +1, если статистика Колмогорова-Смирнова является максимальной положительной разностью между эмпирической функцией распределения и гипотетической кумулятивной функцией распределения (D+); это -1, если статистика Колмогорова-Смирнова является максимальной отрицательной разностью (D-).

В двухвыборочном тесте это +1, если эмпирическая функция распределения rvs превышает эмпирическую функцию распределения функция распределения в statistic_location, иначе -1.

Смотрите также

ks_1samp, ks_2samp

Примечания

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

  • двусторонний: Нулевая гипотеза состоит в том, что два распределения идентичны, F(x)=G(x) для всех x; альтернатива — что они не идентичны.

  • меньше: Нулевая гипотеза состоит в том, что F(x) >= G(x) для всех x; альтернативная гипотеза - что F(x) < G(x) хотя бы для одного x.

  • больше: Нулевая гипотеза состоит в том, что F(x) <= G(x) для всех x; альтернативная — что F(x) > G(x) хотя бы для одного x.

Обратите внимание, что альтернативные гипотезы описывают CDF базовых распределений, а не наблюдаемых значений. Например, предположим x1 ~ F и x2 ~ G. Если F(x) > G(x) для всех x, значения в x1 имеют тенденцию быть меньше, чем в x2.

Начиная с SciPy 1.9, np.matrix входные данные (не рекомендуется для нового кода) преобразуются в np.ndarray перед выполнением вычисления. В этом случае результатом будет скаляр или np.ndarray подходящей формы вместо 2D np.matrix. Аналогично, хотя маскированные элементы маскированных массивов игнорируются, результатом будет скаляр или np.ndarray вместо маскированного массива с mask=False.

Примеры

Предположим, мы хотим проверить нулевую гипотезу о том, что выборка распределена согласно стандартному нормальному распределению. Мы выбираем уровень доверия 95%; то есть мы отклоним нулевую гипотезу в пользу альтернативной, если p-значение меньше 0.05.

При тестировании равномерно распределенных данных мы ожидаем, что нулевая гипотеза будет отвергнута.

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> stats.kstest(stats.uniform.rvs(size=100, random_state=rng),
...              stats.norm.cdf)
KstestResult(statistic=0.5001899973268688,
             pvalue=1.1616392184763533e-23,
             statistic_location=0.00047625268963724654,
             statistic_sign=-1)

Действительно, p-значение ниже нашего порога 0.05, поэтому мы отвергаем нулевую гипотезу в пользу альтернативы «двусторонняя» по умолчанию: данные не распределены согласно стандартному нормальному распределению.

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

>>> x = stats.norm.rvs(size=100, random_state=rng)
>>> stats.kstest(x, stats.norm.cdf)
KstestResult(statistic=0.05345882212970396,
             pvalue=0.9227159037744717,
             statistic_location=-1.2451343873745018,
             statistic_sign=1)

Как и ожидалось, p-значение 0.92 не ниже нашего порога 0.05, поэтому мы не можем отвергнуть нулевую гипотезу.

Предположим, однако, что случайные величины распределены согласно нормальному распределению, смещенному в сторону больших значений. В этом случае функция кумулятивного распределения (CDF) базового распределения стремится быть меньше чем CDF стандартного нормального распределения. Поэтому мы бы ожидали, что нулевая гипотеза будет отклонена с alternative='less':

>>> x = stats.norm.rvs(size=100, loc=0.5, random_state=rng)
>>> stats.kstest(x, stats.norm.cdf, alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

и действительно, при p-значении меньше нашего порога мы отвергаем нулевую гипотезу в пользу альтернативной.

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

>>> stats.kstest(x, "norm", alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

Все приведённые выше примеры были одно-выборочными тестами, идентичными тем, которые выполняются ks_1samp. Обратите внимание, что kstest также может выполнять двухвыборочные тесты, идентичные тем, которые выполняются ks_2samp. Например, когда две выборки взяты из одного распределения, мы ожидаем, что данные будут согласованы с нулевой гипотезой в большинстве случаев.

>>> sample1 = stats.laplace.rvs(size=105, random_state=rng)
>>> sample2 = stats.laplace.rvs(size=95, random_state=rng)
>>> stats.kstest(sample1, sample2)
KstestResult(statistic=0.11779448621553884,
             pvalue=0.4494256912629795,
             statistic_location=0.6138814275424155,
             statistic_sign=1)

Как и ожидалось, p-значение 0.45 не ниже нашего порога 0.05, поэтому мы не можем отвергнуть нулевую гипотезу.