Все материалы
Продуктовая аналитикаматериалсредний

Распределение Пуассона: формула, примеры и проверка на данных

Распределение Пуассона простыми словами: формула Пуассона, пример расчёта вручную, почему λ — это и среднее, и дисперсия, проверка платежей по дням в SQL и Python, сверхдисперсия и пороги алертов.

КейсПрактика25 сентября 2026 г.12 мин

Продакт просит настроить алерт: «Если за день пришло мало платежей, пишите в канал». Вчера было 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 обращений в час, перегрузка ждёт его примерно в одном часе из двадцати.

Пуассон(4): вероятность k обращений за час
k обращенийP(X = k)Накопленная P(X ≤ k)
01,83%1,83%
17,33%9,16%
214,65%23,81%
319,54%43,35%
419,54%62,88%
515,63%78,51%
610,42%88,93%
75,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-го)2516726,6818,312,74
Июль31442014,2628,662,01
Август30642021,4022,391,05
Весь период861 251214,5557,733,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.

Платежи в день за 6 июня — 30 августа: фактическое число дней и ожидание по Пуассону(14,55)

Учебная база 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 днях отклонения на два-три дня в группе — нормальный шум; делать выводы о форме по месяцу данных можно только грубо.

Август: фактическое число дней и ожидание по Пуассону(21,4)
Платежей за деньФактически днейОжидание по Пуассону
15 и меньше42,9
16–1835,3
19–21107,5
22–2477,0
25 и больше67,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 недель и отдельно для каждого дня недели.

pythonλ, тест на сверхдисперсию и пороги алерта по августовским данным
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 событий при λ = n · p = 2
kBin(1 000; 0,002)Пуассон(2)Bin(20; 0,1)
013,51%13,53%12,16%
127,07%27,07%27,02%
227,09%27,07%28,52%
318,06%18,04%19,01%
49,02%9,02%8,98%
53,60%3,61%3,19%
61,20%1,20%0,89%

Типичные ошибки

Формула Пуассона простая, поэтому её применяют к любому счётчику. Проблемы начинаются с данных, которые в неё подают.

  • Брать одну λ для ряда с трендом или сезонностью. На учебной базе это превращает отношение дисперсии к среднему из 1,05 в 3,97.
  • Терять нулевые интервалы при group by. Без календаря дни без событий исчезают, среднее завышается, а алерт на «тихий день» никогда не сработает на истории.
  • Считать события, которые зависят друг от друга: повторные попытки оплаты, каскад ошибок после одного сбоя, всплеск после рассылки.
  • Не проверять модель. Сравнение среднего и дисперсии занимает одну строку SQL и сразу показывает, можно ли верить квантилям.
  • Брать Пуассона там, где есть фиксированное n и доля: конверсия из известного числа пользователей описывается биномиальным распределением.
  • Ставить порог по правилу «среднее минус два σ» при малых λ: распределение скошено, и нормальный порог уходит в ноль или ниже.
  • Не пересчитывать λ после роста продукта и оставлять порог, который был разумным три месяца назад.

Что читать дальше

Распределение Пуассона закрывает счётчики событий за интервал. Для долей и конверсий нужен его соседний закон — биномиальный, а для средних по большим выборкам — центральная предельная теорема.

Продолжить чтение
Вся библиотека
Продуктовая аналитика16 июля 2026 г.20 мин

Статистика для аналитика с нуля: разброс, перцентили, форма данных и выборка

Что из статистики нужно в рабочий день: как читать разброс и стандартное отклонение, зачем p90 и p99, почему продуктовые данные почти никогда не нормальные и чем выборочная ошибка отличается от смещения.

Читать материал
Продуктовая аналитика25 сентября 2026 г.12 мин
Ломаная линия, которая сильно скачет слева и постепенно ложится на горизонтальную прямую справа

Закон больших чисел простыми словами: формулировка и примеры

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

Читать материал
Продуктовая аналитика25 сентября 2026 г.12 мин
Скошенная гистограмма с длинным правым хвостом, над ней — узкий симметричный колокол

Центральная предельная теорема простыми словами: зачем она аналитику

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

Читать материал