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.
Примечания
Есть три варианта для нулевой и соответствующей альтернативной гипотезы, которые можно выбрать с помощью альтернатива параметр.
двусторонний: Нулевая гипотеза состоит в том, что два распределения идентичны, 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подходящей формы вместо 2Dnp.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, поэтому мы не можем отвергнуть нулевую гипотезу.