Если объяснять в одном предложении: центральная предельная теорема (ЦПТ) говорит, что если брать много выборок из почти любых данных и у каждой считать среднее, то эти средние сложатся в нормальное распределение — колокол — даже если сами данные на колокол не похожи ни разу. Нормальными становятся не данные, а средние выборок. Звучит как абстракция из учебника, но на ней стоит половина того, чем аналитик занимается каждый день: доверительные интервалы, A/B-тесты, оценки в духе «средний чек 1500 ₽ плюс-минус столько-то». Ниже разберу, почему так выходит, сколько для этого нужно наблюдений и где популярное «30 хватит» подводит.
Что такое центральная предельная теорема простыми словами?
Возьми выручку интернет-магазина по отдельным заказам. Распределение будет уродливым: куча мелких покупок на 300–800 ₽, длинный хвост вправо и редкие заказы на 50 тысяч, которые тянут всё за собой. Это правостороннее (скошенное) распределение, и оно совершенно не похоже на аккуратный колокол.
Теперь сделай другое. Возьми случайные 50 заказов, посчитай их среднее. Потом ещё 50 — снова среднее. И так тысячу раз. У тебя получится тысяча средних. Если построить их гистограмму, она будет симметричной и колоколообразной — почти идеальная нормальная кривая. При этом сами данные как были кривыми, так и остались.
Вот это и есть ЦПТ: распределение выборочных средних стремится к нормальному по мере роста размера выборки, независимо от формы исходных данных. Есть оговорки (нужно, чтобы у распределения существовала конечная дисперсия — то есть хвост не должен быть совсем уж диким, как у распределения Коши), но для 99% реальных данных аналитика — чеки, длительности сессий, время до конверсии, клики — они выполняются.
Ключевая мысль, которую стоит закрепить: ЦПТ — это утверждение не про твои данные, а про поведение статистики (среднего), которую ты из этих данных считаешь.
Почему средние выборок складываются в колокол, а данные — нет?
Интуиция такая. Когда ты усредняешь 50 значений, случайные отклонения гасят друг друга. Один аномально большой заказ в выборке подтягивает среднее вверх, но рядом почти всегда окажется несколько мелких, которые тянут вниз. Чем больше значений в выборке, тем сильнее эти толчки в разные стороны компенсируются, и тем ближе среднее выборки жмётся к настоящему среднему всей популяции.
Разброс этих средних описывается стандартной ошибкой. Формула простая, и её стоит держать в голове словами: стандартная ошибка = стандартное отклонение данных / корень из размера выборки. То есть если увеличить выборку в 4 раза, разброс средних упадёт вдвое (корень из 4 — это 2). Хочешь уменьшить неопределённость ещё вдвое — готовь выборку уже в 16 раз больше. Отсюда, кстати, растёт ощущение, что «точность стоит дорого»: чтобы вдвое сузить доверительный интервал, данных нужно вчетверо больше.
А симметрия и колокол берутся из того, что сумма многих независимых случайных вкладов всегда стягивается к нормальной форме — это математический факт, и именно его формализует теорема. Неважно, из какого распределения пришли слагаемые: как только их много и они складываются, результат нормализуется.
Почему ЦПТ — это фундамент A/B-тестов и доверительных интервалов?
Потому что и доверительный интервал, и t-тест, и z-тест построены на одном допущении: выборочное среднее распределено нормально. Без ЦПТ это допущение висело бы в воздухе — ведь конверсия или выручка сами по себе не нормальные. ЦПТ даёт право сказать: «неважно, какие у меня данные, среднее по достаточно большой выборке ведёт себя нормально, значит формулы работают».
Разберём на A/B-тесте. Ты сравниваешь конверсию в контроле и в тесте. Конверсия отдельного пользователя — это ноль или единица (купил / не купил), распределение Бернулли, никакого колокола. Но тебе и не нужна нормальность отдельного пользователя. Тебе нужна нормальность разницы средних конверсий между группами — а вот она, благодаря ЦПТ, при нормальных размерах трафика приходит к колоколу. Именно поэтому ты можешь посчитать p-value и доверительный интервал для разницы, хотя исходные данные — просто нули и единицы.
То же с доверительным интервалом для среднего чека. Ты говоришь «средний чек 1500 ₽, 95% доверительный интервал от 1440 до 1560». Эта фраза имеет смысл только потому, что выборочное среднее нормально: интервал строится как среднее ± примерно 2 стандартные ошибки. Кривизна самих чеков на это не влияет — влияет размер выборки и разброс.
Если хочется потрогать это на живых задачах, а не на словах, полезно разобрать несколько кейсов с A/B и продуктовыми метриками в разделе кейсов и посмотреть, как считаются базовые показатели вроде DAU и производных от него — там ЦПТ работает под капотом всех интервалов.
Сколько нужно наблюдений и правда ли работает «правило 30»?
Правило 30 — это народная эвристика: «если в выборке 30+ наблюдений, среднее уже можно считать нормальным». Оно удобное и часто честное, но у него нет никакого священного смысла. Число 30 не вылито в граните — это компромисс, который прижился в учебниках, потому что для умеренно кривых данных 30 значений действительно достаточно, чтобы колокол сложился прилично.
Правильнее думать так: сколько нужно наблюдений — зависит от того, насколько кривые исходные данные. Логика прямая:
- Данные почти симметричны (рост пользователей, время отклика без длинных зависаний) — хватает и 10–15 наблюдений, среднее нормализуется мгновенно.
- Данные умеренно скошены (длительность сессий, средний чек в обычном ритейле) — 30–50 обычно достаточно.
- Данные сильно скошены с тяжёлым хвостом (выручка с редкими «китами», доход на пользователя в играх, где 1% платящих делает всю кассу) — тут и 100, и несколько сотен может не хватить.
Отдельная история — редкие бинарные события. Для конверсии есть более честный ориентир, чем 30: нужно, чтобы и число «успехов», и число «неуспехов» было хотя бы порядка 10 в каждой группе. Если конверсия 0,5%, то на 30 пользователях у тебя в среднем 0 покупок — никакая ЦПТ тут ещё не включилась, сколько ни усредняй. Нужны тысячи наблюдений, чтобы набрать достаточно успехов.
Когда правило 30 врёт?
Врёт оно ровно в тех случаях, где длинный хвост доминирует. Классический пример из практики — выручка на пользователя. Представь, что 98% людей приносят 0–2 тысячи, а 2% — по 100 тысяч. Среднее по выборке из 30 человек будет диким скачком: попадёт в выборку «кит» — среднее улетело в космос, не попадёт — среднее заниженное. Распределение таких средних останется скошенным и на 30, и на 100 значениях. Колокол приходит, но медленно.
Второй частый провал — асимметричные бинарные метрики с низкой базой: клики по редкой кнопке, отказы платежей, жалобы. Мало успехов — мало информации, ЦПТ буксует.
Что с этим делают на практике:
- Логарифмируют выручку перед усреднением —
log(1 + revenue)делает распределение симметричнее, и колокол складывается на меньших выборках. Правда, тогда ты оцениваешь среднее логарифмов, а не логарифм среднего, и интерпретацию надо аккуратно возвращать назад. - Переходят на бутстрап — вместо доверия к нормальности пересемплируют данные тысячи раз и строят интервал эмпирически. Бутстрап не боится скошенности.
- Обрезают или винзоризуют экстремальные значения, если это оправдано бизнес-логикой (например, убирают явные ошибки или B2B-заказы из B2C-анализа).
- Просто набирают больше данных, потому что скорость сходимости к нормали падает, но не пропадает.
Мой рабочий принцип: чем толще хвост, тем меньше я доверяю магии числа 30 и тем охотнее беру бутстрап или лог-преобразование.
Как увидеть ЦПТ своими глазами: симуляция на Python
Лучший способ поверить в ЦПТ — не читать про неё, а один раз прогнать симуляцию. Возьмём заведомо кривые данные (экспоненциальное распределение, похожее на суммы заказов) и посмотрим, как ведут себя средние выборок разного размера.
import numpy as np
rng = np.random.default_rng(42)
# «Кривые» данные: суммы заказов, сильно скошены вправо
population = rng.exponential(scale=1500, size=1_000_000)
print(round(population.mean(), 1)) # ~1500, средний чек
print(round(population.std(), 1)) # ~1500, разброс огромный — это не колокол
def sample_means(n, n_samples=10_000):
# берём n_samples выборок по n заказов и считаем среднее каждой
idx = rng.integers(0, len(population), size=(n_samples, n))
return population[idx].mean(axis=1)
for n in (2, 5, 30, 100):
m = sample_means(n)
print(f"n={n:<3} среднее средних={m.mean():.1f} ст.ошибка={m.std():.1f}")
На выходе увидишь две вещи. Первая: «среднее средних» при любом n держится около 1500 — то есть выборочное среднее не смещено, оно честно целится в настоящее среднее. Вторая: стандартная ошибка падает ровно по закону 1500 / корень из n. Для n = 100 она примерно в 10 раз меньше, чем для n = 1 — потому что корень из 100 равен 10.
Теперь самое наглядное — форма. Добавь построение гистограммы и сравни:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(12, 3))
for ax, n in zip(axes, (2, 30, 100)):
ax.hist(sample_means(n), bins=60)
ax.set_title(f"средние выборок по n={n}")
plt.tight_layout()
plt.show()
При n = 2 гистограмма средних ещё заметно скошена — наследует форму исходных данных. При n = 30 она уже почти симметрична. При n = 100 это чистый колокол. Ты буквально видишь, как ЦПТ включается по мере роста выборки. Поиграй с параметром scale и подставь распределение потяжелее (например, rng.pareto) — увидишь, как для тяжёлого хвоста тот же колокол складывается заметно медленнее, и правило 30 перестаёт спасать.
Этот код можно прогнать прямо в браузере, ничего не устанавливая, — в Python-тренажёре есть numpy и matplotlib. А если подзабыл синтаксис агрегаций и работы с массивами, держи под рукой справочник по Python.
Что центральная предельная теорема не гарантирует?
Тут копится больше всего ошибок на собеседованиях и в реальных отчётах, так что пройдусь по границам.
ЦПТ не делает нормальными сами данные. После неё чеки как были скошенными, так и остались. Нормально ведёт себя только их среднее. Если тебе нужно предсказать конкретный заказ, а не средний, ЦПТ ничем не помогает.
ЦПТ не отменяет требования к размеру выборки. На маленьких и очень кривых данных она ещё не успела сработать, и доверительный интервал будет врать — окажется у́же, чем должен, и ты переоценишь свою уверенность.
ЦПТ не чинит смещение выборки. Если данные собраны криво (только активные пользователи, только один регион, выжившие после оттока), то среднее сойдётся к нормали — но к нормали вокруг неправильного центра. Теорема про случайный шум, а не про систематическую ошибку отбора.
ЦПТ не требует независимости бесплатно. Формула стандартной ошибки предполагает, что наблюдения независимы. Если у тебя по несколько заказов на одного пользователя, а ты считаешь их как отдельные независимые точки, стандартная ошибка занизится, а p-value в A/B получится оптимистично-ложным. В таких случаях агрегируют до уровня пользователя или применяют поправки на кластеры.
Как применять ЦПТ в ежедневной работе аналитика
Когда я строю доверительный интервал для метрики, я держу в голове три вопроса: насколько скошены данные, сколько у меня наблюдений и независимы ли они. Если данные умеренные и выборка в сотни-тысячи строк — спокойно доверяю нормальным формулам. Если хвост тяжёлый или выборка маленькая — беру бутстрап или логарифмирую. Если наблюдения повторяются на одном юзере — сначала агрегирую.
В A/B-тестах ЦПТ — это молчаливое оправдание того, что ты вообще можешь считать p-value для конверсии. Но она не освобождает от расчёта размера выборки заранее: именно скорость сходимости к нормали и целевой размер эффекта диктуют, сколько трафика набрать до старта.
И главное — это одна из тех тем, которую любят на собеседованиях, потому что она отделяет тех, кто заучил формулы, от тех, кто понимает, почему они работают. Если хочешь потренироваться формулировать это вслух и разобрать смежные вопросы по статистике, загляни в банк вопросов с интервью и порешай практические задания на доверительные интервалы и A/B.
Хочешь идти дальше по статистике для аналитика системно — с интерактивными конспектами, симуляциями и разбором реальных кейсов до автоматизма — это открывается в Pro. Без давления: базовую практику по Python и A/B можно пощупать и на бесплатном доступе, а Pro просто снимает лимиты.