Skip to content

AB_TEST — насколько покрыт репертуар статистических тестов (2026-06-29)

AB_TEST — насколько покрыт репертуар статистических тестов (2026-06-29)

Section titled “AB_TEST — насколько покрыт репертуар статистических тестов (2026-06-29)”

Ответ на вопрос Юли: «насколько покрыты все возможные варианты тестов?» Это инвентаризация ПО КОДУ (не по памяти): app/backend/app/stats/* + диспетчеры services/results_service.py (post-hoc) и services/calculations_service.py (планирование). Верифицировано на main 7db2fc9e.

1. Что реально есть (по коду)

Section titled “1. Что реально есть (по коду)”

Post-hoc анализ /results — диспетчер analyze_results (8 маршрутов)

Section titled “Post-hoc анализ /results — диспетчер analyze_results (8 маршрутов)”
metric_typeТестМодульЭффект+CI
binaryTwo-proportion z-тестbinary.pyabs. diff + Wald CI
fisher_exactFisher’s exact 2×2 (точный условный, гипергеом.)fisher_exact.pyodds ratio
continuousWelch t-тест (неравные дисперсии, Welch df)continuous.py/student_t.pymean diff + t-CI
mann_whitneyMann–Whitney U — exact (N≤30, tie-free) иначе asymptotic zmann_whitney.pyrank-based
bootstrapPermutation + percentile-bootstrap CI разницы среднихbootstrap_permutation.pymean diff + Cohen’s d
quantileQuantile treatment effect (permutation по выбранному квантилю)quantile_te.pyquantile diff
countPoisson rate (two-sample, сведён к усл. биномиальному)poisson_rate.pyrate ratio
ratio*Delta-method для R=E[Y]/E[X]ratio.pyratio diff

* ratio доступен на live/MVP-пути (live_stats_service), не в основном analyze_results-диспетчере.

Планирование/сайзинг — calculations_service.calculate (метрики: binary, continuous, ratio)

Section titled “Планирование/сайзинг — calculations_service.calculate (метрики: binary, continuous, ratio)”
  • calculate_binary_sample_size, calculate_continuous_sample_size, calculate_detectable_mde_*
  • bayesian_sample_size_binary/continuous (precision-based)
  • sequential_sample_size_inflation (поправка на последовательный дизайн)
  • estimate_experiment_duration_days

Семейства за рамками одного теста

Section titled “Семейства за рамками одного теста”
  • Sequential / always-valid: O’Brien–Fleming (sequential.py), mSPRT always-valid (always_valid.py)
  • Множественные сравнения: Benjamini–Hochberg + Holm (multiple_testing.py)
  • Снижение дисперсии: CUPED (multi-covariate, cuped.py), пост-стратификация (stratification.py)
  • Bayesian: Monte-Carlo постериор + precision sizing (bayesian.py)
  • Диагностика: SRM через chi² (srm.py), guardrail — направленная регрессия / односторонний non-inferiority margin (guardrail.py)

2. Универсум методов A/B-тестирования → покрытие

Section titled “2. Универсум методов A/B-тестирования → покрытие”
Класс метрики / задачаКанонический тестСтатус
Доля/конверсия (2 группы)z-тест двух долей
Доля, малые выборкиFisher’s exact 2×2
Доля, точный безусловныйBarnard’s exact⬜ ниша
Среднее непрерывнойWelch / Student t✅ (Welch)
Непрерывная, непараметрикаMann–Whitney U (+exact)
Непрерывная, без допущенийBootstrap / permutation
Хвосты/медиана распределенияQuantile treatment effect
Робастная к выбросамTrimmed-mean / Yuen⬜ ниша
Ratio-метрики (на пользователя)Delta-method✅ (live-путь)
Счётчики/интенсивностьPoisson rate
Категориальная r×c (>2 исхода)Chi² независимости + Cramér’s V❌ ГЭП
Эквивалентность/не-хужеTOST (two one-sided)❌ ГЭП
Время до событияLog-rank / survival⬜ ниша для web-A/B
Кластерные данныеCluster-robust / GEE🟡 частично (ratio delta)
Последовательный дизайнOBF + always-valid mSPRT
МножественностьBH + Holm
Снижение дисперсииCUPED + стратификация
BayesianMC-постериор
SRM-диагностикаchi² goodness-of-fit
Sizing непараметрики/квантилейARE-инфляция t-сайзинга🟡 нет (только парам.)

Mainstream-репертуар A/B-тестирования покрыт на ~85–90%. Закрыты все три массовых типа метрик (доля / среднее / ratio / счётчик), параметрика и непараметрика, точные малые выборки, последовательный дизайн, множественность, снижение дисперсии, Bayesian и ключевая диагностика (SRM, guardrail). Это широкий, не учебный набор.

Реальные (не нишевые) гэпы — ранжированы:

  1. Эквивалентность/не-инфериорность (TOST) — массово ожидаемое решение «доказать, что разницы НЕТ в пределах ±margin» (бэкенд-миграции, рефакторинг без регресса). Сейчас guardrail ловит односторонний вред, но симметричного теста эквивалентности нет. Ложится в scalar effect+CI, переиспользует continuous-вход → дёшево и безопасно.
  2. Chi² независимости r×c + Cramér’s V — единственная целая форма метрики (мультиномиальный исход, >2 категории), которую инструмент не считает. Дорого: не-scalar ответ + новый UI с динамическими строками категорий (флаг в handoff).
  3. Sizing для непараметрики/квантилей — паритет планирования (ARE-инфляция t-сайзинга). Мелко, но без UI-дома (визард планирует только параметрику).

Нишевые (низкий приоритет для web-A/B): Barnard’s exact, G-test, Yuen trimmed-mean, log-rank/survival, явный cluster-robust.

4. Решение на эту сессию (/auto «продолжи»)

Section titled “4. Решение на эту сессию (/auto «продолжи»)”

Беру гэп #1 — TOST equivalence на continuous-пути: highest-value, ложится в существующую scalar-схему ResultsResponse, переиспользует ObservedResultsContinuous + поле margin, повторяет проверенный паттерн тоггла (fisher/bootstrap/quantile) → Windows-verifiable, низкий архитектурный риск, завершаемо+верифицируемо за сессию.

Гэп #2 (chi² r×c) оставлен как следующий крупный срез (новый UI + не-scalar ответ) — под отдельную сессию, не бить в одном автономном проходе. Гэп #3 (непарам. sizing) — мелкий follow-up после того как у непараметрики появится планировочный дом.