scipy.stats.

ks_2samp#

scipy.stats.ks_2samp(data1, data2, альтернатива='two-sided', метод='auto', *, ось=0, nan_policy='propagate', keepdims=False)[источник]#

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

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

Параметры:
data1, data2array_like, одномерный

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

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

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

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

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

  • 'auto' : использовать 'exact' для малых массивов, 'asymp' для больших

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

  • '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

Статистика критерия Колмогорова-Смирнова.

p-значениеfloat

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

statistic_locationfloat

Значение из data1 или data2 соответствующий статистике KS; т.е. расстояние между эмпирическими функциями распределения измеряется на этом наблюдении.

statistic_signint

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

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

kstest, ks_1samp, epps_singleton_2samp, anderson_ksamp

Примечания

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

  • меньше: Нулевая гипотеза состоит в том, что 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.

Если статистика KS велика, то p-значение будет малым, и это может рассматриваться как свидетельство против нулевой гипотезы в пользу альтернативной.

Если method='exact', ks_2samp пытается вычислить точное p-значение, то есть вероятность при нулевой гипотезе получения значения тестовой статистики, столь же экстремального, как значение, вычисленное по данным. Если method='asymp', асимптотическое распределение Колмогорова-Смирнова используется для вычисления приближенного p-значения. Если method='auto', точное вычисление p-значения предпринимается, если оба размера выборок меньше 10000; в противном случае используется асимптотический метод. В любом случае, если попытка точного вычисления p-значения не удаётся, будет выдано предупреждение и возвращено асимптотическое p-значение.

Двусторонний точный вычисляет дополнительную вероятность и затем вычитает из 1. Таким образом, минимальная вероятность, которую он может вернуть, составляет около 1e-16. Хотя сам алгоритм точен, численные ошибки могут накапливаться для больших размеров выборок. Он наиболее подходит для ситуаций, в которых один из размеров выборки составляет всего несколько тысяч.

Мы в целом следуем подходу Ходжеса к Drion/Gnedenko/Korolyuk [1].

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

Ссылки

[1]

Ходжес, Дж.Л. мл., «Значимая вероятность критерия Смирнова для двух выборок», Arkiv für Matematik, 3, № 43 (1958), 469-486.

Примеры

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

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

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> sample1 = stats.uniform.rvs(size=100, random_state=rng)
>>> sample2 = stats.norm.rvs(size=110, random_state=rng)
>>> stats.ks_2samp(sample1, sample2)
KstestResult(statistic=0.5454545454545454,
             pvalue=7.37417839555191e-15,
             statistic_location=-0.014071496412861274,
             statistic_sign=-1)

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

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

>>> sample1 = stats.norm.rvs(size=105, random_state=rng)
>>> sample2 = stats.norm.rvs(size=95, random_state=rng)
>>> stats.ks_2samp(sample1, sample2)
KstestResult(statistic=0.10927318295739348,
             pvalue=0.5438289009927495,
             statistic_location=-0.1670157701848795,
             statistic_sign=-1)

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

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

>>> sample1 = stats.norm.rvs(size=105, loc=0.5, random_state=rng)
>>> stats.ks_2samp(sample1, sample2, alternative='less')
KstestResult(statistic=0.4055137844611529,
             pvalue=3.5474563068855554e-08,
             statistic_location=-0.13249370614972575,
             statistic_sign=-1)

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