Вероятность и статистика
Play ITЗагрузка интерактивного демо…
В IT данные шумные, нагрузка непредсказуема, пользователи ведут себя по-разному. Теория вероятностей даёт язык для описания такой неопределённости; статистика — инструменты выводов по выборкам.
События и вероятность
Событие — исход, который может произойти или нет. Вероятность P(A) ∈ [0, 1]:
- 0 — невозможно;
- 1 — достоверно.
Аксиомы Колмогорова задают строгую основу (пространство исходов, σ-алгебра, аддитивность).
| Тип события | Пример |
|---|---|
| Элементарное | "на кубике выпало 4" |
| Сложное | "выпало чётное" |
| Достоверное | результат — одно из чисел 1…6 на кубике |
Две интерпретации
| Подход | Смысл | В IT |
|---|---|---|
| Частотный | предел доли успехов при многих повторах | доля ошибок в логах, success rate API |
| Байесовский | степень уверенности с учётом опыта | диагностика инцидентов, обновление гипотез по новым данным |
Оба допустимы; выбор зависит от задачи: повторяемый эксперимент vs уникальное событие.
Числовой пример — ложноположительный тест
Пусть P(баг) = 0.01, тест ловит баг с P(тест+|баг) = 0.99, но даёт ложную тревогу P(тест+|нет бага) = 0.05. По формуле Байеса доля реальных багов среди сработавших тестов:
P(баг | тест+) = P(тест+|баг)·P(баг) / P(тест+)
При малой базовой частоте большинство алертов могут быть шумом — отсюда precision/recall, а не одна accuracy.
Условная вероятность и независимость
Условная: P(A | B) — вероятность A при условии, что B уже произошло. Цепное правило связывает совместные события.
Независимость: P(A | B) = P(A) — знание B не меняет вероятность A. В коде часто предполагают независимость запросов или хешей — это нужно проверять — скрытые корреляции дают трудные баги (кэш, пулы соединений, DDOS-подобные всплески).
Закон больших чисел
При росте числа наблюдений среднее результатов стремится к математическому ожиданию. Обоснование:
- доверять метрикам SLA только на достаточной выборке;
- не делать выводы по одному-двум инцидентам;
- строить доверительные интервалы в A/B-тестах.
import random
def mean_of_flips(trials: int) -> float:
return sum(random.random() < 0.5 for _ in range(trials)) / trials
for n in (10, 100, 10_000):
print(n, "бросков → среднее ≈", round(mean_of_flips(n), 3))
На малых n разброс велик — не делайте вывод об SLA по пяти запросах.
Статистика в практике
- Описательная: среднее, медиана, перцентили (p95, p99 латентности).
- Проверка гипотез: отличима ли новая версия от старой не случайно?
- Регрессия и ML: оценка параметров, переобучение, кросс-валидация — надстройка над вероятностными моделями.
Связь с моделированием (Монте-Карло) и теорией информации (энтропия).