Что такое statistical power evaluation и как определять размер выборки для A/B теста?

Краткий тезис

Statistical power (power|статистическая мощность) — это вероятность обнаружить реальный эффект в A/B тесте, если он существует. Оценка мощности и расчёт размера выборки критичны для планирования экспериментов: недостаточная выборка ведёт к ложноотрицательным результатам (Type II error), а избыточная — к лишним затратам. Для A/B тестов в LLM/RAG системах, где метрики часто имеют высокую дисперсию, требуется тщательный подбор размера выборки, обычно 500–2000 примеров на группу для обнаружения эффекта в 5% при мощности 80%.

1. Термин: Statistical Power (статистическая мощность)

Statistical power (мощность теста]]) — это вероятность отвергнуть нулевую гипотезу, когда она ложна (т.е. когда реальный эффект существует). Формально: Power = 1 - β, где β — вероятность ошибки II рода (ложноотрицательного результата). Чем выше мощность, тем меньше шанс пропустить реальное улучшение.

В контексте A/B тестирования: если новая версия (B) действительно лучше старой (A) на некоторую величину, мощность — это вероятность того, что тест покажет статистически значимое различие.

Обычно целевая мощность — 0.8 (80%), что соответствует β = 0.2. Это означает, что мы готовы мириться с 20% вероятностью пропустить реальный эффект.

2. Компоненты Power Analysis

Для расчёта мощности и размера выборки нужно задать четыре параметра (три известных, один вычисляется):

ПараметрОбозначениеОписание
Уровень значимостиα (alpha)Вероятность ошибки I рода (ложноположительный результат). Обычно 0.05.
Мощность1 - βВероятность обнаружить эффект. Обычно 0.8.
Размер эффектаδ (effect size)Минимальный практически значимый эффект, который мы хотим обнаружить. Например, улучшение метрики на 5%.
Дисперсияσ² (variance)Разброс метрики в популяции. Оценивается по историческим данным или пилотному эксперименту.
Размер выборкиnКоличество наблюдений в каждой группе (для двухвыборочного теста).

Формула для двухвыборочного t-теста (приближённо):

n = 2 * (Z_{α/2} + Z_β)² * σ² / δ²

где Z_{α/2} и Z_β — квантили стандартного нормального распределения для заданных α и β.

Для α=0.05 (двусторонний) Z_{0.025} ≈ 1.96, для β=0.2 (мощность 0.8) Z_{0.2} ≈ 0.84. Тогда (1.96+0.84)² ≈ 7.84, и формула упрощается до:

n ≈ 15.7 * σ² / δ²

3. Как определить размер выборки на практике

Шаги:

  1. Выберите метрику (например, conversion rate, CTR, score в RAG).
  2. Определите минимальный эффект (δ), который вы считаете практически значимым. Обычно 1–10% относительного изменения.
  3. Оцените дисперсию (σ²) метрики. Для бинарных метрик (конверсия) дисперсия = p*(1-p), где p — базовая конверсия. Для непрерывных метрик (время ответа, оценка качества) — по историческим данным.
  4. Задайте α и β (обычно 0.05 и 0.2).
  5. Рассчитайте n по формуле или используйте готовые библиотеки (statsmodels, scipy).
  6. Учтите множественное тестирование (поправка Бонферрони) и возможные потери (например, 10% пользователей отваливаются).

Пример для бинарной метрики: базовая конверсия 10%, хотим обнаружить относительное улучшение на 20% (т.е. с 10% до 12%, δ = 0.02). Дисперсия σ² = p*(1-p) = 0.1*0.9 = 0.09. Тогда n ≈ 15.7 * 0.09 / (0.02)² = 15.7 * 0.09 / 0.0004 = 15.7 * 225 = 3532.5. То есть нужно около 3500 наблюдений на группу.

4. Особенности для LLM/RAG A/B тестов

В контексте LLM и RAG систем A/B тесты часто проводятся на ограниченном наборе запросов (например, 1000–10000). Метрики могут быть:

Дисперсия субъективных метрик может быть высокой из-за вариативности LLM и разной сложности запросов. Поэтому для обнаружения небольших эффектов (δ=5%) требуется больше примеров. Эмпирическое правило: для power 80% и δ=5% нужно 500–2000 примеров на ветку, но точное число зависит от дисперсии.

Также важно учитывать multiple comparisons при тестировании нескольких метрик одновременно.

5. Пример расчёта в Python

import scipy.stats as stats
import statsmodels.stats.power as smp

# Параметры
alpha = 0.05
power = 0.8
effect_size = 0.05  # Cohen's d для непрерывной метрики
# Или для пропорций:
prop_A = 0.5
prop_B = 0.55
effect_size_prop = prop_B - prop_A  # 0.05

# Для t-теста (непрерывная метрика)
n = smp.TTestIndPower().solve_power(effect_size=effect_size, alpha=alpha, power=power, alternative='two-sided')
print(f"Необходимый размер выборки на группу (t-test): {n:.0f}")

# Для z-теста пропорций (бинарная метрика)
from statsmodels.stats.proportion import proportion_effectsize
es = proportion_effectsize(prop_A, prop_B)
n_prop = smp.NormalIndPower().solve_power(effect_size=es, alpha=alpha, power=power, alternative='two-sided')
print(f"Необходимый размер выборки на группу (пропорции): {n_prop:.0f}")

6. Ошибки и подводные камни

  • Игнорирование дисперсии: если дисперсия оценена неправильно, расчёт размера выборки будет неверен. Используйте пилотные данные или бутстреп.
  • Множественное тестирование: если проверяете много метрик, увеличивайте α или используйте поправки (Bonferroni, FDR).
  • Неучёт сезонности и когортных эффектов: данные могут быть нестационарны.
  • Peeking (подглядывание): не останавливайте тест раньше времени, если результат стал значимым. Используйте sequential testing.
  • Неравные группы: если группы разного размера, мощность падает.

7. Пет-проект для закрепления

Задача: Разработать скрипт для расчёта размера выборки для A/B теста метрики "faithfulness" в RAG системе. Faithfulness оценивается LLM-as-judge по шкале 0–1 (непрерывная метрика). Базовая средняя faithfulness = 0.7, стандартное отклонение = 0.2. Хотим обнаружить улучшение на 0.05 (до 0.75) с мощностью 80% и α=0.05.

Инструменты: Python, scipy, statsmodels, pandas.

Шаги:

  1. Собрать исторические данные faithfulness на контрольной группе (пилот).
  2. Оценить среднее и стандартное отклонение.
  3. Рассчитать Cohen's d = (0.75 - 0.7) / 0.2 = 0.25.
  4. Использовать TTestIndPower().solve_power(effect_size=0.25, alpha=0.05, power=0.8).
  5. Вывести необходимый размер выборки.
  6. Добавить симуляцию: сгенерировать синтетические данные для контрольной и тестовой групп с заданным эффектом, провести t-тест, проверить, что доля значимых результатов близка к 80%.

Ожидаемый результат: Скрипт выводит n ≈ 253 на группу (для Cohen's d=0.25). Симуляция подтверждает мощность около 80%.

8. Связь с другими вопросами

ВопросТема
490Как проводить A/B тестирование в RAG системах
492Метрики для оценки RAG (faithfulness, relevance)
493Bootstrap и доверительные интервалы
494Множественное тестирование и поправки
495Sequential testing и stopping rules
496Power analysis для непараметрических тестов

9. Навигация


Навигация