Критерий Манна — Уитни: что сравнивает и когда применять
Критерий Манна — Уитни: ранги, совпадения, размер эффекта и ошибки трактовки медиан. Условные медицинские данные, расчёт в Python и продуктовый пример.
Содержание статьи
В двух небольших группах измерили время ожидания. Распределение скошено, и коллега предлагает: «Средние сравнивать нельзя, возьмём критерий Манна — Уитни, он сравнит медианы». В этой фразе сразу две ловушки. Ненормальность не отменяет вопрос о среднем, а ранговый критерий не всегда проверяет равенство медиан. Ниже разберём, какой вопрос он задаёт, как получается U и что сообщать вместе с p. Все примеры — собственные синтетические данные, включая условную медицинскую очередь.
Когда применять критерий Манна — Уитни
Ранговая процедура полезна, когда порядок имеет смысл, а расстояния между значениями ненадёжны или не являются основной целью. Например, категории выраженности симптома можно упорядочить, но переход между соседними категориями не обязательно означает одинаковое изменение. Времена ожидания имеют полноценную числовую шкалу, однако исследователь может отдельно интересоваться тем, насколько часто случайный участник одной группы ждёт дольше другого. Это другой эффект, чем средняя нагрузка очереди. Метод выбирают под этот вопрос, а не как наказание данным за асимметрию.
- У вас две независимые группы и величина, значения которой можно содержательно упорядочить: количественная или порядковая.
- Вас интересует сравнение через порядок наблюдений, а не обязательно разность арифметических средних.
- Вы проверили независимость участников и понимаете, есть ли повторяющиеся значения и различия формы распределений.
- Для интерпретации результата как сдвига положения, включая медиану, нужны дополнительные предпосылки о форме и масштабе распределений.
Нулевая гипотеза и размер эффекта — разные утверждения
Стандартная проверка Манна — Уитни калибруется под нулевой гипотезой одинаковых распределений в двух независимых группах. Статистика строится на рангах объединённой выборки. Её можно связать с долей попарных сравнений, в которых значение первой группы больше значения второй, учитывая равенства половинным весом. Такая величина удобна как описательный размер эффекта. Но обычное p нельзя без оговорок переименовать в универсальный тест гипотезы «вероятность превосходства равна половине» при произвольно разных формах распределений.
Различие существенно. Два распределения могут иметь одинаковые медианы и отличаться формой; равенство медиан не означает равенства распределений. Обратная крайность тоже неверна: Манн — Уитни не обязан обнаружить любое отличие дисперсии или формы. Это не универсальный детектор различия всех свойств. Если научный вопрос касается именно вероятности превосходства при неодинаковых распределениях, нужна процедура, соответствующая такой постановке, например обсуждение критерия Бруннера — Мунцеля и его предпосылок. Вводный ранговый тест не заменяет формулировку оцениваемой величины.
Интерпретация как проверка сдвига становится естественной в модели, где формы распределений одинаковы и одно получается из другого перемещением по числовой оси. Тогда различие положения относится и к медианам. Если же одна группа имеет узкую середину и длинный хвост, а другая широкую симметричную форму, фраза «тест медиан» скрывает структуру данных. Покажите распределения и назовите ограничение. Одно p не расскажет, какой именно участок шкалы отвечает за различие и что следует менять в процессе.
Учебный пример: шесть человек в каждой очереди
Пусть в условной очереди A ожидали 4, 6, 8, 10, 12 и 14 минут, а в очереди B — 7, 9, 11, 13, 15 и 17 минут. Каждое число относится к отдельному человеку; повторных визитов нет. Значения придуманы для ручной проверки. Нельзя делать вывод о реальной медицинской организации по этой таблице. Мы также пока не предполагаем случайное распределение людей между очередями: даже обнаруженное различие не объяснило бы его причину без описания организации наблюдения.
Объединяем двенадцать значений и присваиваем ранги от меньшего к большему. Ранги A равны 1, 2, 4, 6, 8 и 10, их сумма 31. Для шести наблюдений базовая сумма первых шести рангов равна 21. Разность 31 − 21 даёт UA = 10. Всего есть 6 × 6 = 36 межгрупповых пар, поэтому UB = 36 − 10 = 26. Эти две статистики описывают противоположные направления сравнения, а не два независимых результата исследования.
Можно проверить U без рангов: для каждого времени A посчитать, сколько значений B оно превышает. Для 4 и 6 таких значений нет; для 8 — одно; для 10 — два; для 12 — три; для 14 — четыре. Сумма снова 10. Доля превосходства A над B равна 10/36 ≈ 0,278. Поскольку меньшее ожидание здесь предпочтительнее, полезное направление противоположно: в 26 из 36 пар A меньше B, то есть примерно в 72,2% попарных сравнений.
| Группа | Минуты | Ранги | Сумма рангов |
|---|---|---|---|
| A | 4, 6, 8, 10, 12, 14 | 1, 2, 4, 6, 8, 10 | 31 |
| B | 7, 9, 11, 13, 15, 17 | 3, 5, 7, 9, 11, 12 | 47 |
Расчёт Python: эффект заметен, уверенность ограничена
На этих данных точный двусторонний тест даёт U = 10 и p ≈ 0,24026. В выборке ожидание A чаще меньше B, но двенадцать участников дают ограниченную информацию о популяциях. Описательный эффект 72,2% и большое p не противоречат друг другу. Первый характеризует наблюдаемые пары, второй — статистику проверки при нулевой гипотезе. Фраза «группы одинаковы» была бы неверной; корректнее сказать, что выбранная процедура на таком объёме не дала убедительных свидетельств против равенства распределений.
В коде явно указаны method="exact" и alternative="two-sided". Малые размеры и отсутствие совпадений позволяют использовать точное распределение статистики. Не переносите эту настройку автоматически на любую маленькую таблицу: повторы требуют отдельного внимания. После результата теста код независимо перебирает пары и восстанавливает долю превосходства. Такая двойная проверка помогает не перепутать направление U, особенно когда первая группа обозначает новый вариант, а меньшее значение метрики означает улучшение.
import numpy as np
from scipy import stats
a = np.array([4,6,8,10,12,14.])
b = np.array([7,9,11,13,15,17.])
r = stats.mannwhitneyu(a, b, alternative="two-sided", method="exact")
u_from_pairs = sum(float(x > y) + .5*float(x == y) for x in a for y in b)
ranks = stats.rankdata(np.r_[a,b])
u_from_ranks = ranks[:len(a)].sum() - len(a)*(len(a)+1)/2
assert r.statistic == u_from_pairs == u_from_ranks == 10
print("ranks:", ranks)
print("U, p:", r.statistic, r.pvalue)
print("P(A>B) + half ties:", r.statistic/(len(a)*len(b)))
print("P(A<B), no ties:", 1-r.statistic/(len(a)*len(b)))Повторы значений: почему важна настройка метода
При совпадении значений ранги усредняются. Например, несколько одинаковых оценок получают общий средний ранг занимаемых позиций. В попарной интерпретации равенство даёт половину выигрыша каждой группе. Это позволяет сохранить связь U с долей превосходства, но меняет распределение статистики. На короткой порядковой шкале совпадения — нормальное свойство данных, а не дефект, который надо исправить добавлением случайного шума. Шум создаст искусственный порядок там, где измерение его не различает.
В реализации SciPy асимптотический метод учитывает поправку дисперсии на совпадения; настройка точного метода не выполняет такую коррекцию. Для маленьких выборок с повторами документация рекомендует рассмотреть перестановочный подход. В статье второй пример использует асимптотический вариант только как иллюстрацию выбранной настройки и размера эффекта, а не как образец точного вывода для крайне малого набора. Если вывод зависит от дискретности шкалы и малого n, запланируйте подходящий точный или перестановочный расчёт и сохраните его параметры.
Перестановки тоже требуют предпосылок. Перемешивать метки групп можно не потому, что компьютер умеет делать это быстро, а потому, что схема соответствует нулевой гипотезе и дизайну. Для пар нельзя произвольно перемешивать все наблюдения; для кластерного назначения нельзя переставлять отдельных людей вместо кластеров. Число случайных перестановок, генератор и способ вычисления p должны быть воспроизводимы. Слово «непараметрический» снимает определённые предположения о форме, но не независимость, качество данных и осмысленность схемы сравнения.
Контрпример: ранги улучшаются, среднее растёт
Возьмём отдельные условные времена A = 1, 1, 1, 1, 30 и B = 2, 2, 2, 2, 2. У четырёх из пяти участников A ожидание меньше каждого значения B, но один ждал 30 минут. Среднее A равно 6,8, среднее B — 2,0; медианы равны 1 и 2. Доля превосходства A над B составляет 0,2, то есть A меньше B в 80% межгрупповых пар. Ранговая картина благоприятна для большинства, а среднее время A выше из-за хвоста.
Какой вывод нужен руководителю? Для обычного опыта большинство в A ждёт меньше. Для суммарных человеко-минут A дороже. Для контроля максимального ожидания A тоже выглядит иначе. Нельзя выбрать одну из этих характеристик по тому, какая подтверждает желаемое изменение. Зафиксируйте основную величину до сравнения и покажите дополнительные, если они описывают существенный риск. Критерий не разрешает ценностный выбор между скоростью большинства и тяжёлым хвостом; он лишь помогает оценить конкретно поставленный вопрос.
Этот контрпример также показывает, почему Манн — Уитни не является тестом арифметических средних. Сильное изменение одного очень большого значения может почти не менять ранговый порядок, но сильно менять среднее. Устойчивость рангов к масштабу хвоста бывает достоинством для одной задачи и потерей существенной информации для другой. В продукте аналогична выручка: большинство небольших покупок и несколько крупных клиентов могут вести к противоположным выводам о типичном поведении и общем бюджете.
import numpy as np
from scipy import stats
b = np.array([2,2,2,2,2.])
for tail in (30, 300):
a = np.array([1,1,1,1,float(tail)])
r = stats.mannwhitneyu(a, b, method="asymptotic", alternative="two-sided")
print("tail, means, medians:", tail, a.mean(), b.mean(), np.median(a), np.median(b))
print("U, asymptotic p, theta:", r.statistic, r.pvalue, r.statistic/(len(a)*len(b)))
# Малое n с совпадениями: это иллюстрация, не точная калибровка вывода.Что сообщить помимо p-value
Покажите размеры групп, направление сравнения, медианы и межквартильные диапазоны как описание, U, способ расчёта p и выбранный размер эффекта. Если у распределений разные формы, отметьте это отдельно. Для вероятностной интерпретации напишите словами, что означает «превосходство»: больше доход, меньше ожидание, выше оценка. Иначе число 0,72 легко принять за 72% пользователей, которым помогло вмешательство. Это доля сравнений между независимыми наблюдениями двух групп, а не доля индивидуальных причинных улучшений.
Оценке эффекта полезен интервал, но его процедура должна соответствовать независимым единицам и выбранной величине. Бутстрэп по людям внутри каждой группы — возможный инструмент для изучения устойчивости, однако на очень маленьких выборках его точность ограничена. Он не превращает шесть наблюдений в большую популяцию и не восстанавливает невидимый хвост. Если данных недостаточно для точного решения, так и напишите. Отказ от ложной точности — содержательный результат, особенно когда цена внедрения велика.
Перенос на продукт: не путайте пользователя с сессией
Представим A/B-тест первого запуска рабочего инструмента. Каждому пользователю назначен один вариант интерфейса, а затем записано время выполнения первой задачи. Если задача и окно заданы заранее, строки можно сравнивать по пользователям. Если же в файл попали все сессии, активные участники получат больший вес, а внутри человека появится зависимость. Манн — Уитни не исправит это автоматически. Сначала определите показатель на единицу назначения и правило работы с теми, кто задачу не закончил.
Для оценки удобства по шкале из нескольких категорий ранговый подход может соответствовать вопросу лучше среднего балла, но нужно показать состав ответивших. Пользователи, которые ушли сразу, могли не увидеть опрос. Тогда распределение оценок описывает ответивших, а не всю назначенную аудиторию. Проверка различия рангов не устраняет этот отбор. Зафиксируйте долю ответивших по вариантам и не превращайте красивую диаграмму оценок в утверждение об общем эффекте продукта без анализа пути до ответа.
Для retention и конверсии обычно удобнее сравнивать доли в полном окне, чем применять ранги к нулям и единицам. Для выручки на пользователя выбирайте метод, который отвечает на вопрос о среднем, если бюджет зависит от него. Один набор событий может поддерживать несколько корректных показателей, но каждый имеет своё решение и ограничение. Разделяйте основной анализ, описательные разрезы и новые гипотезы. Это защищает от ситуации, когда после неудачного теста команда перебирает показатели, пока хотя бы один не станет «значимым».
Ошибки, которые стоит проверить перед отправкой
Первая ошибка — подписать результат как различие медиан без предпосылки одинаковой формы. Последствие: читатель приписывает тесту более узкий и понятный смысл, чем тот имеет. Исправление — показать форму и назвать ранговую постановку. Вторая — применить независимый критерий к измерениям до и после одних людей. Последствие: нарушена структура зависимости. Нужен метод для парной задачи, например подходящий анализ разностей; выбор между парным t-тестом и ранговой процедурой зависит от оцениваемого эффекта и предпосылок.
Третья ошибка — трактовать U первой группы в неправильном направлении. Последствие: более долгое ожидание объявляется улучшением. Проверьте несколько пар руками. Четвёртая — выбрать exact при большом числе совпадений и считать результат автоматически точным для своей шкалы. Исправление — проверить документацию реализации и обосновать схему расчёта. Пятая — использовать маленькое p как доказательство большого эффекта. На большом объёме небольшое ранговое отличие может быть статистически заметным, но не менять продуктового решения.
Шестая ошибка — назвать метод «без предпосылок» и перестать проверять источник строк. Последствие: дубли, повторные визиты и кластеры создают искусственный объём. Ни ранги, ни точное распределение U не исправляют неправильную единицу анализа. Перед расчётом восстановите число участников, правила включения и независимость групп. Если именно эти сведения неизвестны, честный результат работы — список недостающих условий, а не уверенный вывод из функции, которая технически завершилась без ошибки.
Что почитать и какое упражнение сделать
Возьмите контрпример с одним длинным ожиданием и увеличьте 30 до 300. До запуска кода предскажите, что изменится: среднее A вырастет, а межгрупповой порядок останется тем же. Затем замените четыре единицы на тройки: теперь изменятся ранги и направление большинства попарных сравнений. Такое упражнение помогает отделить величину от порядка лучше, чем запоминание формулы U. Сформулируйте два отчёта: один для владельца общей нагрузки, второй для владельца опыта большинства пользователей. Они должны обсуждать разные показатели.
Наш обзор Петри и Сэбина помогает встроить ранговые методы в общую карту анализа. Материалы о нормальном распределении и критерии Стьюдента объясняют, почему выбор метода не сводится к одному тесту нормальности. Если после этого вы можете своими словами назвать популяции, эффект и предпосылки, вы готовы запускать расчёт. Если остаётся только фраза «этот критерий подходит для ненормальных данных», вернитесь к вопросу, ради которого собирали таблицу.
Материал учебный. Все медицинские примеры условные и не являются медицинскими рекомендациями, диагностическими правилами или основанием для лечения.
Материалы по теме

Корреляция Спирмена и Пирсона: выбор, расчёт и ошибки
Корреляция Спирмена и Пирсона на условных медицинских данных: линейная и монотонная связь, выбросы, перестановочный тест в Python и перенос в продукт.

Относительный риск и отношение шансов: разница на примерах
Чем относительный риск отличается от отношения шансов: таблица 2×2, абсолютный эффект, доверительные интервалы, случай — контроль и A/B-тест в Python.

Чувствительность и специфичность теста: расчёт на примере
Чувствительность и специфичность теста, PPV и NPV на синтетических данных. Распространённость, пороги, интервалы и перенос в антифрод с кодом Python.