Распределение Пуассона: формула, примеры и проверка на данных
Распределение Пуассона простыми словами: формула Пуассона, пример расчёта вручную, почему λ — это и среднее, и дисперсия, проверка платежей по дням в SQL и Python, сверхдисперсия и пороги алертов.
Содержание статьи
Продакт просит настроить алерт: «Если за день пришло мало платежей, пишите в канал». Вчера было 13 платежей, в среднем за месяц — 21. Это уже «мало» или обычный разброс? Порог на глаз даст либо ежедневный шум в канале, либо пропущенную поломку оплаты. Для счётчиков событий за интервал есть готовая модель — распределение Пуассона. Разберём формулу, посчитаем пример вручную, проверим модель на платежах из учебной базы SQL-курса и выведем порог алерта в Python.
Коротко
- Распределение Пуассона описывает число событий за фиксированный интервал, когда события независимы и приходят с постоянной средней интенсивностью λ.
- Формула Пуассона: P(X = k) = λᵏ · e^(−λ) / k!. Параметр один — λ.
- У Пуассона среднее равно дисперсии. Если дисперсия счётчика заметно больше среднего, модель не подходит — это сверхдисперсия.
- На учебной базе за весь период дисперсия платежей в день в 3,97 раза больше среднего из-за роста продукта. Внутри августа отношение 1,05, и Пуассон описывает данные хорошо.
- Порог алерта берут из квантилей: при λ = 21,4 день с 13 платежами и меньше выпадает с вероятностью 3,6%, с 10 и меньше — 0,5%.
Что такое распределение Пуассона
Распределение Пуассона — это распределение числа событий за фиксированный интервал времени или объёма, если события происходят независимо друг от друга и с постоянной средней интенсивностью λ. Оно описывает, сколько платежей придёт за день, сколько обращений в поддержку — за час, сколько ошибок — на тысячу запросов.
Главное отличие от биномиального распределения: здесь нет фиксированного числа попыток. Вы не знаете, сколько людей «могли бы» заплатить сегодня, но знаете, сколько платежей приходит в среднем. Число событий ничем не ограничено сверху, хотя большие значения становятся очень маловероятными.
Распределение названо по имени Симеона Дени Пуассона, который вывел его в 1837 году как предельный случай биномиального. Хрестоматийный пример — данные Ладислава Борткевича (1898) о числе кавалеристов прусской армии, погибших за год от удара копытом лошади: такие редкие независимые события хорошо описываются этим законом.
- События считаются в интервале фиксированной длины: день, час, тысяча запросов.
- Средняя интенсивность λ постоянна внутри интервала и от интервала к интервалу.
- События независимы: один платёж не делает следующий более или менее вероятным.
- Два события не происходят в один и тот же момент — они приходят по одному.
Формула Пуассона и её параметр λ
λ — среднее число событий за интервал. Если в среднем приходит 4 обращения в час, λ = 4 для часа и λ = 96 для суток. При смене длины интервала λ масштабируется пропорционально, форма распределения при этом меняется: при малых λ оно скошено вправо, при больших становится почти симметричным.
e ≈ 2,718 — основание натурального логарифма, k! — факториал: 3! = 1 · 2 · 3 = 6, а 0! по определению равен 1.
У распределения Пуассона необычное свойство: и математическое ожидание, и дисперсия равны λ. Стандартное отклонение — √λ. При λ = 4 типичный разброс — ±2 события, при λ = 100 — ±10. Абсолютный шум растёт с λ, а относительный падает: 50% при λ = 4 и 10% при λ = 100.
P(X = k) = λᵏ · e^(−λ) / k!; E(X) = D(X) = λ; σ = √λk = 0, 1, 2, … — число событий за интервал, λ > 0 — среднее число событий за тот же интервал.
Пример расчёта вручную: 4 обращения в поддержку за час
Поддержка получает в среднем 4 обращения в час. Какова вероятность, что за час не придёт ни одного? Подставляем k = 0: 4⁰ · e⁻⁴ / 0! = e⁻⁴ ≈ 0,0183. Тихий час выпадает примерно в 1,8% часов — в среднем раз в 55 рабочих часов.
Ровно два обращения: 4² · e⁻⁴ / 2! = 16 · 0,0183 / 2 ≈ 0,1465, то есть 14,7%. Самые вероятные значения — 3 и 4, по 19,5% каждое: при целом λ вероятности λ − 1 и λ всегда равны.
Теперь вопрос для планирования смены: как часто будет 8 обращений и больше? Складываем вероятности от 0 до 7 и вычитаем из единицы: 5,1%. Если один сотрудник спокойно закрывает 7 обращений в час, перегрузка ждёт его примерно в одном часе из двадцати.
| k обращений | P(X = k) | Накопленная P(X ≤ k) |
|---|---|---|
| 0 | 1,83% | 1,83% |
| 1 | 7,33% | 9,16% |
| 2 | 14,65% | 23,81% |
| 3 | 19,54% | 43,35% |
| 4 | 19,54% | 62,88% |
| 5 | 15,63% | 78,51% |
| 6 | 10,42% | 88,93% |
| 7 | 5,95% | 94,89% |
| 8 и больше | 5,11% | 100% |
Как посчитать число событий по дням в SQL, не потеряв нулевые дни
В учебной базе SQL-курса таблица payments хранит 1 251 оплату с 6 июня по 30 августа 2026 года. Первая мысль — group by paid_at. Но группировка вернёт только дни, в которые платежи были: 84 строки из 86 календарных дней. Два дня без платежей в июне исчезнут.
Для Пуассона нули — такие же наблюдения, как любые другие. Без них среднее за весь период вырастет с 14,55 до 14,89, а доля «тихих» дней, ради которых часто и строят алерт, станет нулевой. Поэтому сначала строим календарь через generate_series, а платежи присоединяем к нему left join и считаем count(p.payment_id): для пустого дня он вернёт 0, а count(*) вернул бы 1.
| Период | Дней | Платежей | Нулевых дней | Среднее | Дисперсия | Дисперсия / среднее |
|---|---|---|---|---|---|---|
| Июнь (с 6-го) | 25 | 167 | 2 | 6,68 | 18,31 | 2,74 |
| Июль | 31 | 442 | 0 | 14,26 | 28,66 | 2,01 |
| Август | 30 | 642 | 0 | 21,40 | 22,39 | 1,05 |
| Весь период | 86 | 1 251 | 2 | 14,55 | 57,73 | 3,97 |
with days as (
select cast(d as date) as day
from generate_series(date '2026-06-06', date '2026-08-30', interval '1 day') as t(d)
),
daily as (
select days.day, count(p.payment_id) as payments
from days
left join payments p on p.paid_at = days.day
group by days.day
)
select
date_trunc('month', day) as month,
count(*) as n_days,
sum(payments) as total,
count(*) filter (where payments = 0) as zero_days,
round(avg(payments), 2) as mean_per_day,
round(var_samp(payments), 2) as var_per_day,
round(var_samp(payments) / avg(payments), 2) as var_to_mean
from daily
group by rollup (date_trunc('month', day))
order by month nulls last;Похоже ли число платежей на распределение Пуассона
Первая проверка — сравнить среднее и дисперсию. У Пуассона они равны. За весь период среднее 14,55 платежа в день, а дисперсия 57,73 — почти вчетверо больше. Модель с одной λ здесь не работает.
Причина видна в таблице по месяцам: продукт растёт. В июне в среднем 6,68 платежа в день, в июле 14,26, в августе 21,40. Когда интенсивность меняется, разброс по всему периоду складывается из случайного шума и разницы между месяцами. Дисперсия измеряет рост, а не случайность.
На графике — сколько дней с каждым числом платежей было на самом деле и сколько ожидал бы Пуассон с λ = 14,55. Хвосты расходятся радикально: дней с 0–5 платежами было 12 против 0,3 ожидаемых, дней с 26 и больше — 7 против 0,4. Середина, наоборот, недобрана: 23 дня с 11–15 платежами против 40,6.
Учебная база SQL-курса, 86 дней с учётом нулевых. Ожидание — 86 · P(X в интервале), scipy.stats.poisson.
Проверка на стабильном окне: август
Сузим окно до августа, где рост внутри месяца небольшой. Среднее 21,40, дисперсия 22,39, отношение 1,05. Для Пуассона это почти идеальная картина.
Формально равенство среднего и дисперсии проверяют тестом дисперсии: статистика (n − 1) · s² / x̄ при верной модели распределена как χ² с n − 1 степенями свободы. Для августа она равна 30,34 при 29 степенях свободы, p = 0,397 — оснований отвергать Пуассона нет. Для всего периода статистика 337,35 при 85 степенях свободы, p меньше 10⁻³⁰.
Распределение по группам тоже близко к ожидаемому. На 30 днях отклонения на два-три дня в группе — нормальный шум; делать выводы о форме по месяцу данных можно только грубо.
| Платежей за день | Фактически дней | Ожидание по Пуассону |
|---|---|---|
| 15 и меньше | 4 | 2,9 |
| 16–18 | 3 | 5,3 |
| 19–21 | 10 | 7,5 |
| 22–24 | 7 | 7,0 |
| 25 и больше | 6 | 7,4 |
Сверхдисперсия: что делать, если дисперсия больше среднего
Ситуацию, когда дисперсия счётчика заметно больше среднего, называют сверхдисперсией. В продуктовых данных она встречается чаще, чем чистый Пуассон. Каждая причина нарушает одно из условий модели.
Если интенсивность непостоянна, моделируйте её явно: считайте λ отдельно для каждого дня недели, по скользящему окну или через тренд. Тогда Пуассон описывает отклонения от ожидания конкретного дня, а не весь ряд. Если события приходят пачками, считайте единицы, которые независимы: не платежи, а платящих клиентов, не ошибки, а затронутые сессии.
Когда разброс остаётся больше среднего и после этого, берут отрицательное биномиальное распределение: у него есть второй параметр, который отвечает за избыточную дисперсию.
- Тренд и рост продукта: λ за июнь и за август отличаются втрое.
- Недельная сезонность: в августе понедельники в среднем дают 18,0 платежа, воскресенья — 23,4. По четыре-пять дней на день недели этого мало для вывода, но на длинной истории разницу нужно проверять.
- Маркетинговые кампании и рассылки: всплеск в один день и провал после.
- Пачки событий: повторные попытки оплаты, один клиент оплачивает десять мест, падение сервиса порождает сотни ошибок сразу.
- Смесь сегментов с разной интенсивностью: крупные и мелкие клиенты, страны в разных часовых поясах.
Порог алерта: сколько платежей в день — уже аномально мало
Вернёмся к задаче из начала. Возьмём λ = 21,4 — среднее за август, где модель проверена. Нижний порог алерта — квантиль распределения Пуассона: такое число платежей, меньше которого при нормальной работе бывает редко.
Результат кода ниже: 13 платежей и меньше при λ = 21,4 случается с вероятностью 3,64%, 10 и меньше — 0,50%. Самый слабый день августа — 10 августа, ровно 13 платежей. Мягкий алерт на «13 и меньше» сработал бы в августе один раз, и это совпадает с ожиданием: 30 · 0,0364 ≈ 1,1 ложного срабатывания в месяц.
Отсюда практическая схема из двух уровней. Мягкий сигнал на 5%-квантиле — посмотреть глазами, без паники. Жёсткий на 1%-квантиле или ниже — будить дежурного. Уровень выбирают по цене ошибки: за год порог «10 и меньше» даст около двух ложных тревог, а «13 и меньше» — около тринадцати.
Верхний хвост работает так же. В августе было два дня по 30 платежей; вероятность 30 и больше — 4,56% в день, то есть около 1,4 таких дня за месяц. Выбросом их не назовёшь.
Для сравнения: нормальное приближение даёт 5%-порог 21,4 − 1,645 · √21,4 ≈ 13,8, почти то же самое. При λ около 20 Пуассон уже близок к нормальному. При малых λ разница важна: для 4 обращений в час правило «среднее минус два σ» даёт порог 0, хотя ноль обращений случается в 1,8% часов.
Порог нужно пересчитывать вместе с λ. Продукт, который растёт втрое за квартал, с июньским порогом будет молчать при реальной поломке. Удобно хранить λ по скользящему окну из 4–8 недель и отдельно для каждого дня недели.
import numpy as np
from scipy import stats
# Платежи по дням, 1–30 августа (результат SQL-запроса выше)
aug = np.array([20, 16, 15, 23, 20, 20, 21, 18, 30, 13, 20, 20, 22, 14, 19,
20, 23, 14, 22, 18, 29, 29, 22, 21, 30, 21, 26, 24, 23, 29])
lam = aug.mean()
var = aug.var(ddof=1)
print("λ:", lam, "дисперсия:", round(var, 2), "отношение:", round(var / lam, 3))
# Тест на сверхдисперсию: (n − 1)·s² / x̄ ~ χ² с n − 1 степенями свободы
d = (len(aug) - 1) * var / lam
print("статистика:", round(d, 2), "p-value:", round(stats.chi2.sf(d, len(aug) - 1), 3))
# Пороги алерта «слишком мало платежей за день»
for k in (13, 10):
print(f"P(X <= {k}):", round(stats.poisson.cdf(k, lam), 4))
print("квантили 5% и 1%:", stats.poisson.ppf([0.05, 0.01], lam))
# λ: 21.4 дисперсия: 22.39 отношение: 1.046
# статистика: 30.34 p-value: 0.397
# P(X <= 13): 0.0364
# P(X <= 10): 0.005
# квантили 5% и 1%: [14. 11.]Пуассон как предел биномиального распределения
Биномиальное распределение считает успехи из n попыток с вероятностью p. Если попыток очень много, а успех редок, считать через биномиальные коэффициенты неудобно, и результат почти не отличается от Пуассона с λ = n · p. Так Пуассон и был получен.
Пример: сервис обработал 1 000 запросов, каждый падает с вероятностью 0,2%. Число ошибок — Bin(1 000; 0,002), λ = 2. В таблице видно, что вероятности совпадают до третьего знака. Для 20 попыток с p = 0,1 λ та же, но совпадение хуже: попыток мало, а успех не такой уж редкий.
Практическое правило: заменять биномиальное пуассоновским можно при n от сотен и p в пределах нескольких процентов. Конверсию 20% из 25 пользователей так считать нельзя — это чистая биномиальная задача.
| k | Bin(1 000; 0,002) | Пуассон(2) | Bin(20; 0,1) |
|---|---|---|---|
| 0 | 13,51% | 13,53% | 12,16% |
| 1 | 27,07% | 27,07% | 27,02% |
| 2 | 27,09% | 27,07% | 28,52% |
| 3 | 18,06% | 18,04% | 19,01% |
| 4 | 9,02% | 9,02% | 8,98% |
| 5 | 3,60% | 3,61% | 3,19% |
| 6 | 1,20% | 1,20% | 0,89% |
Типичные ошибки
Формула Пуассона простая, поэтому её применяют к любому счётчику. Проблемы начинаются с данных, которые в неё подают.
- Брать одну λ для ряда с трендом или сезонностью. На учебной базе это превращает отношение дисперсии к среднему из 1,05 в 3,97.
- Терять нулевые интервалы при
group by. Без календаря дни без событий исчезают, среднее завышается, а алерт на «тихий день» никогда не сработает на истории. - Считать события, которые зависят друг от друга: повторные попытки оплаты, каскад ошибок после одного сбоя, всплеск после рассылки.
- Не проверять модель. Сравнение среднего и дисперсии занимает одну строку SQL и сразу показывает, можно ли верить квантилям.
- Брать Пуассона там, где есть фиксированное n и доля: конверсия из известного числа пользователей описывается биномиальным распределением.
- Ставить порог по правилу «среднее минус два σ» при малых λ: распределение скошено, и нормальный порог уходит в ноль или ниже.
- Не пересчитывать λ после роста продукта и оставлять порог, который был разумным три месяца назад.
Что читать дальше
Распределение Пуассона закрывает счётчики событий за интервал. Для долей и конверсий нужен его соседний закон — биномиальный, а для средних по большим выборкам — центральная предельная теорема.
Материалы по теме
Статистика для аналитика с нуля: разброс, перцентили, форма данных и выборка
Что из статистики нужно в рабочий день: как читать разброс и стандартное отклонение, зачем p90 и p99, почему продуктовые данные почти никогда не нормальные и чем выборочная ошибка отличается от смещения.

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

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