Критерий Стьюдента: как выбрать и рассчитать t-тест
Критерий Стьюдента на условных медицинских данных: независимые и парные группы, вариант Уэлча, доверительный интервал и воспроизводимый расчёт в Python.
Содержание статьи
В двух группах средний показатель различается на шесть единиц. В одной группе десять участников, в другой двенадцать, и результаты заметно разбросаны. Достаточно ли этого, чтобы говорить о различии? Критерий Стьюдента, или t-тест, сопоставляет разницу средних с её неопределённостью. Но прежде чем запускать функцию, нужно выбрать правильную версию: независимые группы, парные измерения или сравнение с заданным значением. Разберём расчёт, доверительный интервал и ограничения на собственных условных медицинских данных, затем перенесём логику в продуктовый эксперимент.
Какую версию выбрать
Выбор версии начинается не с числа столбцов. Две колонки могут содержать два визита одного человека или независимые группы, выгруженные рядом ради удобства. Одинаковая длина колонок не создаёт пары. Разная длина не разрешает отбрасывать лишние строки, чтобы парный тест запустился. Спросите, откуда взялось соответствие наблюдений и на каком уровне назначалось воздействие. Если ответа нет, сначала восстановите структуру данных. Статистическая функция не обнаружит эту ошибку за вас: она примет переданные массивы в том смысле, который вы ей указали.
- Разные независимые участники в двух группах: рассмотрите вариант Уэлча, который не требует равенства дисперсий популяций.
- Те же участники до и после: анализируйте разности парным критерием; связь измерений должна сохраняться по идентификатору.
- Одна выборка относительно заранее заданного уровня: используйте одновыборочный критерий, если этот уровень действительно фиксирован, а не оценён по другой выборке.
- Во всех случаях указывайте направление вычитания, эффект, интервал и дизайн. Значение p само по себе не сообщает, насколько изменение полезно.
Что проверяет критерий Стьюдента
Для независимых групп нулевая гипотеза обычно утверждает равенство математических ожиданий двух популяций. Статистика t показывает, на сколько оценённых стандартных ошибок наблюдаемая разность средних удалена от нулевого значения. Большой модуль t означает, что разница велика относительно оценённого шума. Это не мера практической полезности: одна и та же разность при разном объёме и разбросе даёт разный t. Для решения нужны и величина эффекта в исходных единицах, и её неопределённость.
В варианте Уэлча стандартная ошибка разности равна корню из суммы s²A/nA и s²B/nB. Дисперсии оцениваются отдельно, а число степеней свободы вычисляется приближённо и может быть дробным. У классического независимого критерия Стьюдента используется объединённая оценка дисперсии при предположении её равенства в популяциях. Эти версии могут давать близкие результаты при похожих дисперсиях и сбалансированных группах, но совпадение в удобном примере не делает их взаимозаменяемыми в любом наборе.
Парный критерий — это одновыборочный анализ разностей. Сначала для каждого участника вычисляется изменение d, затем среднее этих изменений делится на его стандартную ошибку sd/√n. Здесь n — число полных пар, а sd — стандартное отклонение разностей. Разброс исходного показателя между людьми может быть большим, но не мешать точному измерению изменений, если каждый человек изменился примерно одинаково. Напротив, сильная неоднородность самих изменений увеличивает неопределённость, даже если исходные уровни были очень похожи.
SE(B − A) = √(s²B/nB + s²A/nA)Дисперсии групп оцениваются отдельно; направление эффекта B − A.
Независимые группы: исходные данные без скрытого файла
Представим условное сравнение систолического давления на фиксированном визите в двух независимых группах. Группа A: 131, 135, 139, 140, 142, 145, 147, 149, 153, 155. Группа B: 128, 130, 132, 133, 135, 136, 137, 139, 141, 144, 146, 150. Значения придуманы для обучения и не описывают действие конкретного препарата. Сам факт наличия двух групп ещё не означает случайного назначения; причинная интерпретация будет зависеть от того, как люди в них попали.
В A десять наблюдений, среднее 143,60, стандартное отклонение 7,677. В B двенадцать наблюдений, среднее 137,583, стандартное отклонение 6,680. Для направления B − A разность равна −6,017 мм рт. ст. Знак выбран до расчёта и сохранён во всём примере. Если поменять массивы местами, знак t и границы интервала изменятся, а двустороннее p останется тем же. Это не противоречие: направление эффекта и сила свидетельств против равенства отвечают на разные вопросы.
Вариант Уэлча даёт t ≈ −1,9406, число степеней свободы ≈ 18,0591 и двустороннее p ≈ 0,06808. 95%-й доверительный интервал разности B − A: от −12,529 до +0,495. Интервал допускает как заметное снижение, так и небольшое увеличение среднего. При заранее выбранном уровне 0,05 нулевая гипотеза не отвергается. Формулировка «разницы нет» была бы сильнее результата: данные ещё недостаточно точно определяют её величину. Клиническую полезность этой разницы учебный расчёт не устанавливает.
| Группа | n | Среднее | Выборочное SD |
|---|---|---|---|
| A | 10 | 143,600 | 7,677 |
| B | 12 | 137,583 | 6,680 |
Исполняемый расчёт в Python
В коде явно указаны equal_var=False и alternative="two-sided". Первая настройка выбирает Уэлча, вторая — двустороннюю альтернативу. По умолчанию ttest_ind в SciPy использует равные дисперсии, поэтому название функции недостаточно для воспроизведения анализа. Метод confidence_interval возвращает интервал разности в том же направлении, что и порядок массивов. Укажите настройки в отчёте или сохраните сам код; иначе два аналитика могут получить разные ответы, хотя оба скажут, что применяли критерий Стьюдента.
Обратите внимание на описательную часть до теста. Размеры групп, средние и стандартные отклонения помогают увидеть, соответствует ли результат ожидаемым единицам. Если вместо давления выгрузили категорию прибора или перемешали два визита, тест всё равно вернёт число. Простой вывод промежуточных величин иногда обнаруживает ошибку раньше любой сложной диагностики. В производственном анализе добавьте проверку уникальных идентификаторов, допустимых диапазонов и происхождения исключённых строк. Не используйте nan_policy="omit" как замену объяснения пропусков.
import numpy as np
from scipy import stats
# Две независимые синтетические группы.
a = np.array([131,135,139,140,142,145,147,149,153,155.])
b = np.array([128,130,132,133,135,136,137,139,141,144,146,150.])
for name, x in [("A", a), ("B", b)]:
print(name, "n, mean, sd:", len(x), x.mean(), x.std(ddof=1))
r = stats.ttest_ind(b, a, equal_var=False, alternative="two-sided")
se = np.sqrt(a.var(ddof=1)/len(a) + b.var(ddof=1)/len(b))
print("B-A, SE:", b.mean()-a.mean(), se)
print("t, p, df:", r.statistic, r.pvalue, r.df)
print("95% CI:", r.confidence_interval(confidence_level=0.95))Почему интервал полезнее одной отметки значимости
Наш интервал не говорит, что 95% отдельных участников отличаются между группами на величину от −12,529 до +0,495. В нём оценивается разность средних популяций. Чтобы описать индивидуальную неоднородность, покажите сами распределения, стандартные отклонения или подходящие квантили. Также интервал не исправляет систематическое смещение отбора: если в B попали люди с меньшим исходным риском, точность разности не делает её причинным эффектом. Интервал показывает неопределённость в рамках принятой статистической модели, а не все возможные ошибки исследования.
Для продуктового решения добавьте заранее согласованный порог пользы. Допустим, команда рассматривает сокращение времени задачи минимум на несколько секунд, потому что меньшая экономия не покрывает стоимость поддержки. Тогда интервал оценивается относительно этого порога, а не только нуля. Возможны разные ситуации: убедительное улучшение, слишком маленький эффект, неопределённость между полезным и бесполезным результатом. Порог должен опираться на задачу и появляться до просмотра результатов. Медицинские пороги в реальном исследовании определяют профильные специалисты, а не универсальная статистическая формула.
Парные данные: те же средние, другая информация
Теперь отдельный учебный пример: у двенадцати участников есть измерения до и после. Среднее до равно 142,667, после — 137,667; среднее изменение −5,00. В блоке приведены обе последовательности, причём позиции относятся к тем же людям. Стандартное отклонение разностей равно 2,523, поэтому парный анализ даёт t ≈ −6,8661 и p ≈ 0,0000271. 95%-й интервал изменения — от −6,603 до −3,397. Точность связана с согласованностью изменений внутри участников, а не с большим размером набора.
Если ошибочно применить к этим двум колонкам независимый вариант Уэлча, получится p ≈ 0,04265. На этой таблице игнорирование положительной связи теряет информацию и даёт менее точный анализ. Это демонстрация ошибки дизайна, а не способ выбирать тот тест, у которого p меньше. В других данных структура зависимости может влиять иначе. Правильная процедура определяется происхождением наблюдений. Нельзя запустить обе версии и затем объявить корректной ту, которая подтвердила ожидаемый вывод.
Парность тоже требует проверки. Соединяйте визиты по идентификатору, а не по текущему порядку строк после сортировки. Если на втором визите нет одного человека, удаление соответствующей пары должно быть явным. Покажите, сколько участников было включено и сколько вошло в парный анализ, почему остальные отсутствуют. Если вероятность второго визита связана с исходом, результат по полным парам может не переноситься на всех участников. Парный t-тест учитывает связь двух измерений, но не моделирует автоматически механизм пропуска.
import numpy as np
from scipy import stats
# Синтетические данные: позиции соответствуют одним и тем же людям.
before = np.array([138,145,132,150,142,135,148,140,155,137,144,146.])
after = np.array([134,139,130,143,137,134,140,135,146,135,140,139.])
d = after - before
result = stats.ttest_rel(after, before, alternative="two-sided")
print("n, mean before, mean after:", len(d), before.mean(), after.mean())
print("mean change, sd change:", d.mean(), d.std(ddof=1))
print("t, p, df:", result.statistic, result.pvalue, result.df)
print("95% CI:", result.confidence_interval(confidence_level=0.95))
wrong = stats.ttest_ind(after, before, equal_var=False)
print("WRONG design, p:", wrong.pvalue)Предпосылки: что действительно нужно проверить
Независимость между участниками следует из дизайна, а не из теста нормальности. Если значения собраны в нескольких клиниках, семьях или компаниях, общие условия могут создавать кластеры. Обычный t-тест по людям не учитывает такую структуру. Если каждую минуту записывали давление одного участника, минуты не становятся независимыми пациентами. В продукте аналогична подмена пользователя событиями: человек с большим числом действий получает непропорциональный вес. Сначала выберите нужный уровень агрегации или модель зависимости, затем обсуждайте форму распределения.
Для точного классического малого-выборочного вывода нормальная модель имеет значение: у независимых групп это распределения внутри групп, у парного теста — распределение разностей. На больших выборках вывод о среднем может быть устойчив к умеренным отклонениям, но универсального разрешения «n больше тридцати» нет. Сильная асимметрия, редкие огромные значения, разные размеры групп и зависимость требуют отдельного разбора. Уэлч снимает предположение равных дисперсий, а не делает анализ нечувствительным ко всем этим проблемам.
Выброс сначала исследуйте, а не удаляйте. Ошибка единицы измерения, повтор записи и реальное редкое наблюдение требуют разных действий. Если значение корректно и относится к целевой популяции, удаление меняет оцениваемое среднее. При тяжёлых хвостах можно рассмотреть устойчивые оценки, усечённое среднее или другие методы, но тогда нужно прямо назвать новый эффект. Анализ чувствительности с полным набором и заранее обоснованным альтернативным подходом помогает увидеть, насколько решение зависит от крайних наблюдений. Скрытая чистка до желаемого p не помогает.
Исходный уровень и изменение: это разные оцениваемые эффекты
В случайном исследовании с измерением до воздействия и после него можно поставить несколько вопросов: сравнить конечные значения, сравнить изменения или оценить различие с учётом исходного уровня в регрессионной модели. Эти подходы используют информацию по-разному. Нельзя выбирать один после просмотра того, какой дал меньший p. Предварительный план должен назвать основной исход и способ учёта исходного измерения. Для сложной задачи полезно обсудить модель до сбора данных: это влияет и на необходимые поля, и на точность будущего результата.
Не используйте схему «в тестовой группе изменение значимо, в контрольной незначимо, значит группы различаются». Два отдельных результата проверки относительно нуля не являются прямой проверкой различия эффектов. Нужно оценить само межгрупповое различие соответствующей величины и его неопределённость. Одна группа могла иметь больше наблюдений или меньший разброс, поэтому пороги пересеклись по-разному даже при похожих оценках. В отчёте показывайте прямое сравнение, которое соответствует вопросу, а не сопоставление двух слов «значимо» и «незначимо».
Точно так же нельзя сравнивать p между платформами и называть меньший результат более сильным эффектом интерфейса. Значение зависит от точности, а не только от масштаба. Для утверждения о различии эффектов между сегментами нужен соответствующий анализ взаимодействия или прямого контраста, предусмотренный планом. Это уже выходит за простейший t-тест, но распознать границу полезно до того, как таблица сегментов превратится в набор необоснованных продуктовых рекомендаций.
Когда не стоит заменять t-тест Манном — Уитни
Представьте доход, где большинство пользователей ничего не платит, а несколько крупных покупок определяют выручку. Ранги могут показать, что пользователь одного варианта чаще имеет большее значение, но это не тот же вопрос, что разница средней выручки на назначенного пользователя. Если решение связано с бюджетом, замена среднего ранговым эффектом может убрать именно существенную часть распределения. Ненормальность исходных денег не отменяет экономического смысла арифметического среднего. Она требует подходящего способа оценить его неопределённость и устойчивость.
Логарифм тоже меняет интерпретацию. Разность средних логарифмов после обратного преобразования связана с отношением геометрических средних. Она не равна разности средних денег или минут. При нулевых значениях логарифм вообще не определён, а добавление единицы — отдельное моделирующее решение с зависимостью от единиц измерения. Используйте преобразование, когда мультипликативный вопрос соответствует задаче, и объясняйте его читателю. Не прячьте эту смену величины под фразой «привели данные к нормальному виду».
Односторонняя гипотеза и множество сравнений
Односторонний тест уместен, когда направленная альтернатива задана заранее и процедура анализа согласована с таким вопросом. После просмотра отрицательной разности нельзя просто заменить двустороннюю альтернативу на less, чтобы пересечь порог. Это выбор направления по данным. Если ухудшение тоже существенно для решения, двусторонняя постановка часто лучше соответствует задаче. В любом случае укажите альтернативу и порядок групп в отчёте: знак t без этих деталей легко прочитать наоборот, особенно после переименования контрольного и тестового вариантов.
Если вы сравниваете несколько групп, исходов или сегментов, отдельное p не описывает всю процедуру поиска. Нужен план, который различает основной вывод и дополнительные проверки. Для трёх и более групп могут понадобиться общая модель и согласованные сравнения с поправкой на множественность. Не превращайте набор попарных t-тестов в перечень независимых открытий. Для исследовательского анализа можно показать все оценки и интервалы, но интерпретация должна отражать, что гипотезы возникли после просмотра данных и требуют подтверждения.
Перенос в A/B-тест продукта
Возьмём условную проверку нового рабочего экрана. Если пользователя случайно назначили в A или B, а показатель — суммарное время выполнения заранее определённого набора задач за полную неделю, одна строка должна соответствовать назначенному пользователю. Сравнение отдельных кликов или сессий меняет веса: более активные люди начинают сильнее определять результат. Для корпоративного сервиса единицей назначения может быть компания, и тогда независимый пользовательский t-тест не соответствует дизайну даже после аккуратной агрегации событий.
Определите, что происходит с незавершёнными задачами. Среднее время среди завершивших не описывает весь назначенный поток, если новый экран влияет на завершение. Можно заранее выбрать бинарный исход «завершил за окно» и анализировать долю, а время сделать дополнительной характеристикой. Для выручки на пользователя включайте нули неплательщиков, если вопрос именно об ARPU. Для retention анализируйте зрелые когорты: отсутствующее будущее событие нельзя заранее записать как неуспех. Выбор знаменателя предшествует выбору критерия.
Проверка среднего после окончания согласованного окна отличается от ежедневного просмотра результата с остановкой при первом удачном p. Последовательное наблюдение требует отдельного плана. Не переносите формулу фиксированного теста на правило «смотрим до победы». Если команда уже остановила эксперимент таким образом, это ограничение нужно назвать, а не компенсировать большим количеством знаков после запятой. Для следующего запуска договоритесь о горизонте или корректной последовательной процедуре до старта, вместе с основным исходом и критериями качества данных.
Шесть ошибок с конкретным исправлением
Первая: применить парный тест к разным людям, потому что массивы одинаковой длины. Вы создадите искусственную связь и неверную стандартную ошибку. Исправление — восстановить реальные идентификаторы и независимый дизайн. Вторая: считать десять визитов одного человека десятью участниками. Получится псевдорепликация и чрезмерная точность. Исправление — анализировать независимые единицы или явно моделировать повторения. Третья: включить только успешно завершивших после воздействия и назвать результат эффектом на всех. Исправление начинается с заранее определённой популяции и анализа потерь.
Четвёртая: оставить настройку равных дисперсий по умолчанию и не заметить разные размеры и разброс групп. В отчёте окажется другой метод, чем предполагал автор. Явно задайте equal_var и объясните выбор. Пятая: объявить равенство при p больше 0,05. Исправление — показать интервал и отличить отсутствие свидетельств от доказательства эквивалентности. Шестая: удалить неудобный хвост или сменить альтернативу после просмотра результата. Исправление — сохранить основной анализ и открыто описать обоснованную чувствительность, не выбирать настройку по желаемому исходу.
Как оформить результат и что почитать
Для независимого учебного примера достаточно такой записи: «Сравнивались две независимые группы, nA = 10 и nB = 12. Разность средних B − A равна −6,017; 95%-й интервал Уэлча от −12,529 до +0,495; двустороннее p = 0,0681. Способ формирования групп требует отдельного описания, причинный эффект по одной этой таблице не установлен». Добавьте единицы измерения и правила включения. Такая запись позволяет проверить направление, объём и неопределённость, чего не позволяет фраза «t-тест незначим».
Перед отправкой попросите коллегу ответить по отчёту на три вопроса: кто сравнивался, что именно оценено и какое решение допускает интервал. Если приходится открывать ваш ноутбук, чтобы узнать направление эффекта или число участников, отчёт недописан. Код нужен для воспроизводимости, но базовая интерпретация должна быть видна в тексте. Для самостоятельной практики поменяйте дизайн задачи, сохранив числовые колонки, и объясните, почему это меняет допустимый анализ. Это полезнее механического запоминания имени функции.
В обзоре «Медико-биологической статистики» Гланца есть самостоятельные упражнения на связь дизайна и проверки гипотез. Отдельные материалы про доверительные интервалы и мощность помогут перейти от значения p к планированию точности. Когда понадобится сравнить ранги, сначала прочитайте, на какой вопрос отвечает Манн — Уитни. Он может быть хорошим выбором для другой задачи, но не универсальной запасной кнопкой для любого неудобного распределения.
Все медицинские примеры синтетические и служат обучению статистике. Текст не является медицинской рекомендацией и не определяет показания, диагнозы или выбор лечения.
Материалы по теме

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

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

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