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

Возьми любое распределение — даже самое страшное и кривое:

  • Доход людей в КЗ — экспоненциально скошен (большинство мало, единицы много)
  • Время отклика API — лог-нормальное (длинный хвост)
  • Количество детей в семье — Пуассон

Если ты будешь много раз случайно выбирать выборки из этого распределения и усреднять их — распределение этих средних будет нормальным. Колоколом. Симметричным.

Это и есть Центральная предельная теорема (CLT).

Точная формулировка

Пусть X1, X2, ..., Xn — независимые одинаково распределённые случайные величины с конечными математическим ожиданием μ и дисперсией σ².

Тогда среднее выборки:

$$\bar{X}n = \frac{1}{n}\sum{i=1}^n X_i$$

при n → ∞ распределено как:

$$\bar{X}_n \sim \mathcal{N}\left(\mu,\ \frac{\sigma^2}{n}\right)$$

То есть — нормальное распределение, с:

  • средним = μ (как и у исходного)
  • стандартным отклонением = σ / √n (становится уже по мере роста n)

Что это значит на практике

1. A/B-тесты работают

Когда ты сравниваешь две группы по средней конверсии (или среднему чеку), ты сравниваешь средние двух выборок. По CLT эти средние ≈ нормальны (при достаточном размере), и можно применять стандартные t-test / z-test.

Без CLT — пришлось бы для каждого распределения подбирать свой статистический тест. С CLT — универсальный подход.

2. Стандартная ошибка среднего

σ / √n — это стандартная ошибка среднего (SEM). Чем больше выборка — тем точнее знаешь среднее.

Квадратный корень — важный нюанс. Чтобы уменьшить погрешность в 2 раза, нужна выборка в 4 раза больше. Поэтому A/B-тесты так дорого ловить мелкие эффекты — sample size растёт квадратично.

3. Доверительные интервалы

95% ДИ для среднего:

$$\bar{x} \pm 1.96 \cdot \frac{s}{\sqrt{n}}$$

где s — выборочное стандартное отклонение. Эта формула работает благодаря CLT — мы предполагаем что распределение среднего нормальное.

Симуляция в Python

Посмотрим на это в живую. Берём экспоненциальное распределение (далёкое от нормального) и усредняем выборки.

import numpy as np
import matplotlib.pyplot as plt

# Исходное распределение: экспоненциальное (скошенное)
population = np.random.exponential(scale=2, size=100_000)

# Гистограмма исходного
plt.hist(population, bins=80)
# → видим скошенное распределение

# Теперь возьмём 1000 выборок по 30 штук и посчитаем их средние
sample_means = []
for _ in range(1000):
    sample = np.random.choice(population, size=30)
    sample_means.append(sample.mean())

plt.hist(sample_means, bins=40)
# → видим почти идеальный колокол!

Уже при размере выборки 30 распределение средних практически нормально. Это эмпирическое правило: n ≥ 30 — CLT работает для большинства распределений.

Когда CLT НЕ работает

CLT — мощная теорема, но есть оговорки.

1. Бесконечная дисперсия

Если у исходного распределения бесконечная дисперсия (Коши, Парето с тяжёлым хвостом α < 2) — CLT не применим. Средние не сходятся к нормальному.

В аналитике встречается редко, но в финансах и страховании — постоянно (величины с экстремальными выбросами).

2. Зависимые наблюдения

CLT требует независимость. Если у тебя в выборке один человек залогинился 10 раз — это не 10 независимых наблюдений.

Поэтому в A/B-тестах ВСЕГДА дедуплицируй на уровне юзера или сессии, перед тем как считать среднее.

3. Маленькая выборка из очень кривого распределения

Если исходное распределение крайне skewed (например, миллиардеры в выборке зарплат), при малых n (< 100) распределение средних всё ещё может быть не нормальным.

В таких случаях:

  • Увеличь выборку
  • Используй bootstrap или permutation tests (не требуют нормальности)
  • Применяй Mann-Whitney вместо t-test

Связь с другими концепциями

  • Закон больших чисел ≠ CLT. ЗБЧ говорит что среднее сходится к μ. CLT говорит как оно вокруг μ распределено.
  • Распределение Стьюдента (t) — поправка к нормальному для малых выборок (n < 30), когда σ неизвестно и оценивается как s.

TL;DR

  • Среднее выборки любого распределения при росте n стремится к нормальному
  • При n ≥ 30 уже почти нормально для большинства реальных метрик
  • Standard error = σ / √n — квадратичная цена точности
  • Не работает: бесконечная дисперсия, зависимые наблюдения, экстремальный skew + малый n
  • Это фундамент всех A/B-тестов на средних