Биномиальное распределение: формула, пример и где оно в аналитике
Биномиальное распределение простыми словами: формула Бернулли, пример расчёта вручную, математическое ожидание и дисперсия, конверсия как биномиальная величина, биномиальный тест в Python и типичные ошибки.
Содержание статьи
Утром в рабочем чате сообщение: «Вчера в контрольную группу онбординга попали 25 новых пользователей, а сконвертировался один. Обычно каждый пятый. Что-то сломалось?» Чтобы ответить без гадания, нужно знать, как сильно может гулять число конверсий, когда пользователей мало. На этот вопрос отвечает биномиальное распределение. Ниже — формула, расчёт вручную, пример на учебной базе SQL-курса и проверка «подозрительного» дня в Python.
Коротко
- Биномиальное распределение описывает число успехов X из n независимых попыток с одинаковой вероятностью успеха p.
- Вероятность ровно k успехов считают по формуле Бернулли: P(X = k) = C(n, k) · pᵏ · (1 − p)ⁿ⁻ᵏ.
- Математическое ожидание равно n · p, дисперсия — n · p · (1 − p). Из 50 пользователей при конверсии 20% ждут 10 конверсий с разбросом около ±2,8.
- Конверсия пользователей — классическая биномиальная величина, если считать пользователей, а не сессии или события.
- Проверить, что конверсий за день «подозрительно мало», можно биномиальным тестом:
scipy.stats.binomtestилиbinom.cdf.
Что такое биномиальное распределение
Биномиальное распределение — это распределение числа успехов в серии из n независимых испытаний, у каждого из которых два исхода и одинаковая вероятность успеха p. Оно отвечает на вопрос «сколько раз из n случится событие»: сколько пользователей из 50 оплатят, сколько писем из 1 000 откроют, сколько заявок из 200 одобрят.
Кирпичик, из которого оно собрано, — испытание Бернулли: одна попытка с двумя исходами. Пользователь либо сконвертировался, либо нет; письмо либо открыли, либо нет. Успех кодируют единицей, неудачу — нулём. Биномиальная величина — просто сумма n таких нулей и единиц.
У распределения два параметра: n и p. Записывают его как Bin(n, p). Значения X — целые числа от 0 до n, и это первое отличие от нормального распределения: отрицательных конверсий и конверсий больше, чем пользователей, не бывает.
- Число попыток n известно заранее: 25 пользователей, попавших в группу за день.
- У каждой попытки два исхода: сконвертировался или нет.
- Вероятность успеха p одинакова для всех попыток.
- Попытки независимы: исход одного пользователя не влияет на исход другого.
Формула Бернулли: как посчитать вероятность ровно k успехов
Возьмём одну конкретную последовательность, где первые k пользователей сконвертировались, а остальные нет. Её вероятность — pᵏ · (1 − p)ⁿ⁻ᵏ: попытки независимы, вероятности перемножаются. Но успехи могут стоять на любых местах, и все такие последовательности равновероятны.
Число способов выбрать k мест из n — биномиальный коэффициент C(n, k) = n! / (k! · (n − k)!). Отсюда и название распределения: те же коэффициенты стоят в разложении бинома (a + b)ⁿ. Умножаем вероятность одной последовательности на их количество и получаем формулу Бернулли.
P(X = k) = C(n, k) · pᵏ · (1 − p)ⁿ⁻ᵏ, C(n, k) = n! / (k! · (n − k)!)n — число попыток, k — число успехов, p — вероятность успеха в одной попытке.
Пример расчёта вручную: 10 пользователей, конверсия 20%
Пусть на пробный период пришли 10 пользователей, и каждый оплачивает с вероятностью 0,2. Какова вероятность, что оплатят ровно двое?
C(10, 2) = 10 · 9 / 2 = 45 способов выбрать двух плательщиков. Вероятность одной такой последовательности — 0,2² · 0,8⁸ = 0,04 · 0,1678 = 0,00671. Умножаем на 45 и получаем 0,302. Ровно две оплаты случатся примерно в 30% случаев — это самый вероятный исход, но далеко не гарантированный.
Вероятность «хотя бы одна оплата» удобнее считать через противоположное событие. Ноль оплат — это 0,8¹⁰ = 0,107. Значит, хотя бы одна оплата будет с вероятностью 1 − 0,107 = 0,893. Иначе говоря, примерно в каждой десятой группе из десяти человек при нормальной конверсии 20% не заплатит никто. Если вы смотрите на такие маленькие группы каждый день, пустые дни будут случаться регулярно, и это не поломка.
| k оплат | P(X = k) | Накопленная P(X ≤ k) |
|---|---|---|
| 0 | 10,74% | 10,74% |
| 1 | 26,84% | 37,58% |
| 2 | 30,20% | 67,78% |
| 3 | 20,13% | 87,91% |
| 4 | 8,81% | 96,72% |
| 5 | 2,64% | 99,36% |
| 6 | 0,55% | 99,91% |
| 7 и больше | 0,09% | 100% |
Математическое ожидание и дисперсия биномиального распределения
Математическое ожидание биномиального распределения равно n · p. Логика простая: каждая попытка в среднем приносит p успехов, попыток n. Для десяти пользователей при p = 0,2 ждём 2 оплаты.
Дисперсия равна n · p · (1 − p). Дисперсия одной попытки Бернулли — p · (1 − p), а дисперсии независимых слагаемых складываются. В примере это 10 · 0,2 · 0,8 = 1,6, стандартное отклонение — √1,6 ≈ 1,26 оплаты.
У формулы дисперсии есть полезное следствие. Множитель p · (1 − p) максимален при p = 0,5 и уменьшается к краям. Конверсия 50% шумит сильнее всего, а редкие события вроде 1% ошибок дают маленькую дисперсию в абсолютных числах, но большую относительно среднего.
Если делить число успехов на n, получается доля p̂ = X / n — привычная конверсия. Её дисперсия равна p · (1 − p) / n, а корень из неё — стандартная ошибка конверсии. Из этой формулы растут доверительные интервалы для конверсии и расчёт размера выборки A/B-теста.
E(X) = n · p; D(X) = n · p · (1 − p); σ = √(n · p · (1 − p))Для доли p̂ = X / n: E(p̂) = p, стандартная ошибка SE = √(p · (1 − p) / n).
Конверсия как биномиальная величина: пример на учебной базе
В учебной базе SQL-курса есть таблица experiment_exposures: кто попал в эксперимент onboarding_checklist, в какую группу и сконвертировался ли. Одна строка — один пользователь, это важно: каждый пользователь даёт ровно одну попытку Бернулли.
В контрольной группе 1 527 пользователей и 306 конверсий, конверсия 20,04%. Эту долю и возьмём как p: для контроля она описывает «обычную жизнь» продукта без изменений из эксперимента.
select
variant,
count(*) as users,
count(*) filter (where converted) as conversions,
round(avg(case when converted then 1.0 else 0 end), 4) as conversion
from experiment_exposures
group by variant
order by variant;Сколько конверсий ждать из 50 пользователей и насколько это может гулять
Допустим, завтра в контроль попадут 50 новых пользователей. Число конверсий подчиняется Bin(50; 0,2004). Ожидание — 50 · 0,2004 = 10,02 конверсии, стандартное отклонение — √(50 · 0,2004 · 0,7996) ≈ 2,83.
Распределение на графике ниже показывает, как широко это «около десяти». С вероятностью 95,05% конверсий будет от 5 до 15. С вероятностью 89,1% — от 6 до 14. Семь конверсий из пятидесяти (14%) выглядят как провал конверсии почти на треть, но семь и меньше при обычной конверсии выпадает в 18,9% дней — примерно раз в пять дней.
Отсюда рабочее правило для дашборда: на маленьком дневном трафике показывайте рядом с конверсией её коридор, а не одну точку. Без коридора каждое колебание между 10% и 30% превращается в повод для расследования.
Bin(50; 0,2004), scipy.stats.binom.pmf. Значения k < 2 и k > 18 вместе дают меньше 0,5% и не показаны.
Биномиальный тест: когда конверсий за день подозрительно мало
Вернёмся к сообщению из чата. Найдём в контрольной группе дни с худшей конверсией, оставив только дни, где пользователей не меньше двадцати. На первом месте 5 августа: 25 пользователей и одна конверсия.
select
cast(exposed_at as date) as day,
count(*) as users,
count(*) filter (where converted) as conversions
from experiment_exposures
where variant = 'control'
group by 1
having count(*) >= 20
order by count(*) filter (where converted) * 1.0 / count(*)
limit 5;Как проверить день биномиальным тестом в Python
Нулевая гипотеза: 5 августа конверсия была обычной, p = 306 / 1 527. Тогда число конверсий — Bin(25; 0,2004), ожидаем около 5. Вопрос теста: насколько вероятно при такой конверсии получить одну конверсию или меньше? Это и есть односторонний p-value, и его можно посчитать двумя способами: накопленной вероятностью binom.cdf(1, 25, p) или готовой функцией binomtest.
Оба способа дают 0,0271. При обычной конверсии такой плохой день выпадает примерно в 2,7% случаев. Интервал Клоппера — Пирсона для конверсии этого дня — от 0,1% до 20,4%: по 25 пользователям конверсия известна очень грубо, и обычные 20% лежат на самой границе.
Теперь главное. В контрольной группе 90 дней, и если проверять каждый, редкие события начнут находиться сами собой. Прогон того же теста по всем 90 дням находит два дня с p < 0,05: 5 августа и 30 июля (2 конверсии из 30, p = 0,044). При полном отсутствии проблем таких дней ожидалось около 1,3. Два найденных дня — ровно то, что даёт случайность, а не инцидент.
Поэтому биномиальный тест по одному дню — повод посмотреть на детали, а не вывод. Проверьте, откуда пришёл трафик 5 августа, не было ли сбоя в событии конверсии, не изменилась ли доля мобильных. Если причин нет и следующие дни в норме, это был шум. Если плохие дни идут подряд, объединяйте их в один период и тестируйте заново: на большем n тест станет чувствительнее.
from scipy import stats
p = 306 / 1527 # конверсия контрольной группы за весь эксперимент
n, k = 25, 1 # 5 августа: 25 новых пользователей, 1 конверсия
print("ожидали конверсий:", round(n * p, 2))
print("P(X <= 1):", round(stats.binom.cdf(k, n, p), 4))
res = stats.binomtest(k, n, p, alternative="less")
print("binomtest, p-value:", round(res.pvalue, 4))
ci = stats.binomtest(k, n).proportion_ci(confidence_level=0.95)
print("95% интервал для конверсии дня:", round(ci.low, 4), round(ci.high, 4))
# Сколько конверсий ждать из 50 пользователей
p_5_15 = stats.binom.cdf(15, 50, p) - stats.binom.cdf(4, 50, p)
print("P(5 <= X <= 15) из 50:", round(p_5_15, 4))
# ожидали конверсий: 5.01
# P(X <= 1): 0.0271
# binomtest, p-value: 0.0271
# 95% интервал для конверсии дня: 0.001 0.2035
# P(5 <= X <= 15) из 50: 0.9505Когда биномиальное распределение можно заменить нормальным
При большом n биномиальное распределение становится похожим на нормальное со средним n · p и стандартным отклонением √(n · p · (1 − p)). Это следствие центральной предельной теоремы: X — сумма n независимых нулей и единиц. На нормальном приближении построены z-тест для конверсий и большинство калькуляторов значимости A/B-тестов.
Ломается приближение, когда успехов ожидается мало. Для 10 пользователей с p = 0,2 интервал «среднее ± 1,96σ» — это 2 ± 2,48, то есть от −0,48 до 4,48 оплаты. Нижняя граница отрицательная: нормальная кривая не знает, что число оплат не бывает меньше нуля.
На 5 августа ошибка тоже заметна. Точная вероятность одной конверсии или меньше — 0,0271. Нормальное приближение с поправкой на непрерывность даёт 0,0397, в полтора раза больше, без поправки — 0,0226. Для 50 пользователей расхождение меньше: 4,74% точно против 5,52% по нормальному приближению.
Обычное правило: нормальное приближение приемлемо, когда и n · p, и n · (1 − p) не меньше 10; в мягких учебниках пишут 5. У дня с 25 пользователями n · p = 5,01 — на границе, и точный биномиальный тест здесь надёжнее. Он считается за миллисекунды, поэтому на малых выборках нет причин от него отказываться.
| Ситуация | n · p | Точно, Bin | Нормальное с поправкой |
|---|---|---|---|
| 0 оплат из 10, p = 0,2 | 2,0 | 10,74% | 11,78% |
| ≤ 1 конверсии из 25, p = 0,2004 | 5,0 | 2,71% | 3,97% |
| ≤ 5 конверсий из 50, p = 0,2004 | 10,0 | 4,74% | 5,52% |
Чем биномиальное распределение отличается от распределения Пуассона
Оба распределения считают события, и их часто путают. Биномиальное нужно, когда есть фиксированное число попыток n и вопрос «сколько из них удались»: конверсий из 50 пользователей, одобренных заявок из 200. Результат ограничен сверху числом n.
Распределение Пуассона нужно, когда попыток как таковых нет, а есть интервал: платежей за день, обращений в поддержку за час. Сверху число событий ничем не ограничено, а параметр один — средняя интенсивность λ.
Между ними есть мост. Если n велико, а p мало, биномиальное распределение почти совпадает с пуассоновским при λ = n · p. Поэтому число ошибок на миллион запросов можно считать и так и так, а конверсию 20% из 25 пользователей — только биномиально.
Типичные ошибки
Формулу обычно применяют правильно. Ошибаются в том, выполнены ли её условия.
- Считать сессии или события вместо пользователей. В учебной базе 28 693 события
app_openот 4 613 пользователей, в среднем 6,22 открытия на человека. Если объявить попыткой каждое открытие, n вырастет в 6,22 раза, а интервал для конверсии сузится примерно в 2,5 раза без всякого основания: открытия одного человека не независимы. - Игнорировать зависимость между пользователями. Коллеги из одной компании приглашают друг друга и конвертируются вместе; один корпоративный клиент заводит десять аккаунтов. Такие кластеры увеличивают разброс сверх биномиального.
- Считать p постоянной на длинном периоде. Конверсия контроля по месяцам — 18,2%, 21,8% и 19,4%. Проверка χ² даёт p = 0,38, эти колебания совместимы с шумом. Но при сезонности, смене источников трафика или релизе посреди периода одна p на весь период описывает несуществующего «среднего» пользователя.
- Смешивать сегменты с разной конверсией. Если в выборке мобильные с 10% и десктоп с 30%, общая доля ведёт себя шумнее, чем Bin(n; 0,2): часть разброса идёт от состава, а не от случайности.
- Применять нормальное приближение при малом n · p и получать отрицательные границы интервала.
- Проверять десятки дней или сегментов по одному и объявлять находкой каждый p < 0,05.
- Брать биномиальное распределение для счётчиков без фиксированного n — платежей за день, тикетов за час. Для них есть распределение Пуассона.
Что читать дальше
Биномиальное распределение — основа всего, что аналитик делает с долями: доверительных интервалов для конверсии, размера выборки и значимости A/B-тестов. Следующий шаг — посмотреть, как те же идеи работают для счётчиков и средних.
Материалы по теме

Закон больших чисел простыми словами: формулировка и примеры
Закон больших чисел: почему среднее и доля стабилизируются с ростом выборки. Пример с монетой, накопленная конверсия A/B-теста в SQL, слабая и сильная форма, ошибка игрока и когда закон работает медленно.

Центральная предельная теорема простыми словами: зачем она аналитику
Центральная предельная теорема (ЦПТ): почему среднее скошенной метрики распределено почти нормально, как считать стандартную ошибку среднего σ/√n и почему правило «n ≥ 30» не закон. Симуляция на выручке из учебной базы.

Доверительный интервал: как показать, насколько точна ваша цифра
Что означает 95% доверительный интервал для конверсии и разницы конверсий, как его посчитать, почему он важнее p-value и какая формулировка про него неверна.