Перейти к основному содержимому

Вероятность и статистика

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: оценка параметров, переобучение, кросс-валидация — надстройка над вероятностными моделями.

Связь с моделированием (Монте-Карло) и теорией информации (энтропия).