2025, Nov 07 00:02

Почему z‑тест в statsmodels не просит std и как управлять дисперсией

Разбираем z‑тест в statsmodels: почему не нужен std_dev, как считаются дисперсии, чем отличаются режимы pooled и unequal, и когда применять usevar на практике.

Почему statsmodels.ztest не запрашивает стандартное отклонение генеральной совокупности — и что он делает вместо этого

В Python часто встречаются z‑тесты без явного указания стандартного отклонения для генеральной совокупности. На первый взгляд это настораживает, особенно если вы привыкли к учебниковым формулам с известным std_dev. Разберемся, как популярная реализация из statsmodels работает внутри и как управлять ее поведением в случае двух выборок.

Минимальный пример

from statsmodels.stats.weightstats import ztest as run_ztest

# Показатели IQ 20 пациентов после приема препарата
iq_after_drug = [88, 92, 94, 94, 96, 97, 97, 97, 99, 99,
                 105, 109, 109, 109, 110, 112, 112, 113, 114, 115]

# Сравнение со средним 100
run_ztest(iq_after_drug, value=100)

Что происходит под капотом

Библиотеке не требуется стандартное отклонение совокупности, потому что она вычисляет дисперсию из переданных данных. Иными словами, выборочная дисперсия — а значит и стандартное отклонение — определяется внутри функции. Детали реализации видны в исходном коде statsmodels по адресу https://www.statsmodels.org/dev/_modules/statsmodels/stats/weightstats.html#ztest.

При двухвыборочном z‑тесте способ обращения со стандартными отклонениями по умолчанию — «pooled». Это означает, что метод исходит из того, что у обеих выборок одинаковая дисперсия. Если это предположение не подходит, передайте аргумент usevar со значением «unequal», и функция будет вычислять стандартные отклонения отдельно для каждой выборки.

Если под «std» вы имеете в виду «std_dev», речь идет об одной и той же величине. В учебных материалах это различие иногда подчеркивают, и такой способ записи встречается и в пошаговых руководствах.

Решение и управление обработкой дисперсии

В одновыборочном вызове ничего не «упущено»: функция оценивает вариативность по самой выборке. В сценариях с двумя выборками можно оставить режим по умолчанию (pooled) или задать раздельную обработку дисперсий. Переключение выполняется параметром usevar — «pooled» или «unequal». Дальше вычисление стандартного отклонения происходит внутри в соответствии с выбранным режимом.

# Одновыборочный z-тест: дисперсия вычисляется по выборке
run_ztest(iq_after_drug, value=100)

# В двухвыборочной форме (иллюстрация сигнатуры):
# run_ztest(sample_a, sample_b, usevar="unequal")

Почему это важно

Осознание того, что функция оценивает вариативность по вашим данным, объясняет, почему она не просит population std_dev. Это также делает явным поведение по умолчанию для двух выборок: «pooled» предполагает равенство дисперсий, а «unequal» сохраняет их раздельно. Понимая, в каком режиме вы работаете, легче правильно интерпретировать результаты и избежать тихих расхождений с исследовательским замыслом.

Выводы

Если вы проводите одновыборочный z‑тест в statsmodels, передавать стандартное отклонение генеральной совокупности не нужно — метод вычисляет выборочную дисперсию сам. В двухвыборочных z‑тестах по умолчанию используется «pooled»; когда требуется считать стандартные отклонения раздельно, укажите usevar="unequal". При сомнениях загляните в исходники, чтобы увидеть, как именно выполняются расчеты.

Статья основана на вопросе с StackOverflow от Rushank Savant и ответе от paisanco.