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