scipy.stats.

mannwhitneyu#

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

Выполнить ранговый критерий Манна-Уитни для двух независимых выборок.

Тест Манна-Уитни — это непараметрический тест нулевой гипотезы о том, что распределение, лежащее в основе выборки x совпадает с распределением, лежащим в основе выборки y. Часто используется как тест различия в расположении между распределениями.

Параметры:
x, yarray-like

N-мерные массивы выборок. Массивы должны быть совместимы для трансляции, кроме измерения, заданного ось.

use_continuitybool, необязательно

Следует ли применять поправку на непрерывность (1/2). По умолчанию True, когда метод является 'asymptotic'; не имеет эффекта в противном случае.

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

Определяет альтернативную гипотезу. По умолчанию ‘two-sided’. Пусть SX(u) и SY(u) являются функциями выживания распределений, лежащих в основе x и y, соответственно. Затем доступны следующие альтернативные гипотезы:

  • ‘двусторонний’: распределения не равны, т.е. SX(u) ≠ SY(u) для по крайней мере одного u.

  • ‘less’: распределение, лежащее в основе x стохастически меньше распределения, лежащего в основе y, т.е. SX(u) < SY(u) для всех u.

  • ‘greater’: распределение, лежащее в основе x стохастически больше чем распределение, лежащее в основе y, т.е. SX(u) > SY(u) для всех u.

При более ограничительном наборе предположений альтернативные гипотезы могут быть выражены через местоположения распределений; см. [5] раздел 5.1.

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

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

метод{‘auto’, ‘asymptotic’, ‘exact’} или PermutationMethod instance, optional

Выбирает метод, используемый для расчета p-значение. По умолчанию 'auto'. Доступны следующие опции.

  • 'asymptotic': сравнивает стандартизированную тестовую статистику с нормальным распределением, корректируя связи.

  • 'exact': вычисляет точное p-значение путём сравнения наблюдаемого \(U\) статистика против точного распределения \(U\) статистика при нулевой гипотезе. Коррекция для связей не производится.

  • 'auto': выбирает 'exact' когда размер одной из выборок меньше или равен 8 и нет совпадений; выбирает 'asymptotic' в противном случае.

  • PermutationMethod экземпляра. В этом случае p-значение вычисляется с использованием permutation_test с предоставленными параметрами конфигурации и другими соответствующими настройками.

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

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

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

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

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

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

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

Возвращает:
resMannwhitneyuResult

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

статистикаfloat

Статистика Манна-Уитни U, соответствующая выборке x. См. Примечания для статистики критерия, соответствующей выборке y.

p-значениеfloat

Связанный p-значение для выбранного альтернатива.

Примечания

Если U1 является статистикой, соответствующей выборке x, тогда статистика, соответствующая выборке y является U2 = x.shape[axis] * y.shape[axis] - U1.

mannwhitneyu предназначен для независимых выборок. Для связанных / парных выборок рассмотрите scipy.stats.wilcoxon.

метод 'exact' рекомендуется, когда нет связей и когда либо размер выборки меньше 8 [1]. Реализация следует алгоритму, описанному в [3]. Обратите внимание, что точный метод не скорректировано для связей, но mannwhitneyu не будет вызывать ошибки или предупреждения при наличии связей в данных. Если есть связи и хотя бы одна выборка мала (менее ~10 наблюдений), рассмотрите передачу экземпляра PermutationMethod как метод для выполнения перестановочного теста.

Тест Манна-Уитни U — это непараметрическая версия t-критерия для независимых выборок. Когда средние значения выборок из популяций распределены нормально, рассмотрите scipy.stats.ttest_ind.

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

Ссылки

[1]

H.B. Mann и D.R. Whitney, «On a test of whether one of two random variables is stochastically larger than the other», The Annals of Mathematical Statistics, Vol. 18, pp. 50-60, 1947.

[2]

Критерий Манна-Уитни, Википедия, http://en.wikipedia.org/wiki/Mann-Whitney_U_test

[3]

Andreas Löffler, “Über eine Partition der nat. Zahlen und ihr Anwendung beim U-Test”, Wiss. Z. Univ. Halle, XXXII’83 pp. 87-89.

[4] (1,2,3,4,5,6,7)

Рози Шир, «Статистика: 2.3 Тест Манна-Уитни», Центр поддержки обучения математике, 2004.

[5]

Michael P. Fay и Michael A. Proschan. “Wilcoxon-Mann-Whitney или t-критерий? О предположениях для проверки гипотез и множественных интерпретациях правил принятия решений.” Statistics surveys, Том. 4, стр. 1-39, 2010. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2857732/

Примеры

Мы следуем примеру из [4]: девять случайно выбранных молодых взрослых были диагностированы с диабетом II типа в указанных ниже возрастах.

>>> males = [19, 22, 16, 29, 24]
>>> females = [20, 11, 17, 12]

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

>>> from scipy.stats import mannwhitneyu
>>> U1, p = mannwhitneyu(males, females, method="exact")
>>> print(U1)
17.0

mannwhitneyu всегда сообщает статистику, связанную с первой выборкой, которая в данном случае является мужской. Это согласуется с \(U_M = 17\) сообщено в [4]. Статистика, связанная со второй статистикой может быть рассчитана:

>>> nx, ny = len(males), len(females)
>>> U2 = nx*ny - U1
>>> print(U2)
3.0

Это согласуется с \(U_F = 3\) сообщено в [4]. Двусторонний p-значение может быть вычислено из любой статистики, и значение, полученное с помощью mannwhitneyu совпадает с \(p = 0.11\) сообщено в [4].

>>> print(p)
0.1111111111111111

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

>>> _, pnorm = mannwhitneyu(males, females, method="asymptotic")
>>> print(pnorm)
0.11134688653314041

Здесь mannwhitneyuсообщённый p-значение, по-видимому, конфликтует со значением \(p = 0.09\) приведено в [4]. Причина в том, что [4] не применяет поправку на непрерывность, выполняемую mannwhitneyu; mannwhitneyu уменьшает расстояние между тестовой статистикой и средним значением \(\mu = n_x n_y / 2\) на 0.5 для коррекции того факта, что дискретная статистика сравнивается с непрерывным распределением. Здесь, \(U\) используемая статистика меньше среднего, поэтому мы уменьшаем расстояние, добавляя 0.5 в числителе.

>>> import numpy as np
>>> from scipy.stats import norm
>>> U = min(U1, U2)
>>> N = nx + ny
>>> z = (U - nx*ny/2 + 0.5) / np.sqrt(nx*ny * (N + 1)/ 12)
>>> p = 2 * norm.cdf(z)  # use CDF to get p-value from smaller statistic
>>> print(p)
0.11134688653314041

При желании мы можем отключить поправку на непрерывность, чтобы получить результат, который согласуется с тем, что указано в [4].

>>> _, pnorm = mannwhitneyu(males, females, use_continuity=False,
...                         method="asymptotic")
>>> print(pnorm)
0.0864107329737

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

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

>>> res = mannwhitneyu(females, males, alternative="less", method="exact")
>>> print(res)
MannwhitneyuResult(statistic=3.0, pvalue=0.05555555555555555)

Опять же, вероятность получить достаточно низкое значение тестовой статистики случайно при нулевой гипотезе превышает 5%, поэтому мы не отвергаем нулевую гипотезу в пользу альтернативной.

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

>>> from scipy.stats import ttest_ind
>>> res = ttest_ind(females, males, alternative="less")
>>> print(res)
TtestResult(statistic=-2.239334696520584,
            pvalue=0.030068441095757924,
            df=7.0)

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