scipy.stats.

ks_1samp#

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

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

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

Параметры:
xarray_like

одномерный массив наблюдений iid случайных величин.

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

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

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

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

альтернатива{‘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

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

statistic_signint

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

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

ks_2samp, kstest

Примечания

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

  • двусторонний: Нулевая гипотеза состоит в том, что два распределения идентичны, 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.ks_1samp(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.ks_1samp(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.ks_1samp(x, stats.norm.cdf, alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

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