Главное за минуту. Доверительный интервал (ДИ) — это диапазон, в котором с заданной надёжностью (обычно 95%) лежит истинное значение метрики по всей генеральной совокупности, а не по твоей выборке. Если ты померил конверсию на 4000 пользователей и получил 12%, честный ответ звучит не «конверсия 12%», а «конверсия где-то в диапазоне 11,0–13,0% с надёжностью 95%». ДИ говорит о точности твоей оценки. Чем шире интервал — тем меньше данных или тем больше разброс, и тем осторожнее нужно подавать вывод продакту. Главная ошибка новичка: думать, что «95% данных лежат внутри интервала». Это неправда, и ниже разберём почему.
Что такое ДИ на пальцах
Ты никогда не знаешь истинную конверсию продукта, среднюю выручку на юзера или реальную долю оттока — потому что для этого пришлось бы опросить всех пользователей за всё время, включая будущих. У тебя есть только выборка: срез данных за период. По выборке ты считаешь оценку — например, средний чек 1450 ₽. Но если бы ты взял другой месяц или другую случайную половину юзеров, число было бы чуть другим: 1420, 1490, 1435. Оценка «прыгает» от выборки к выборке.
Доверительный интервал отвечает на вопрос: насколько сильно моя оценка может отличаться от истины из-за случайности выборки? Он строит вокруг точечной оценки «коридор», внутри которого с высокой вероятностью прячется настоящее значение.
Формально: если бы ты повторил эксперимент 100 раз и каждый раз строил 95%-й ДИ, то примерно в 95 случаях из 100 интервал накрыл бы истинное значение. Именно так — надёжность 95% относится к процедуре построения интервала, а не к конкретным числам, которые ты получил сегодня.
Чего ДИ НЕ значит: главное заблуждение
Разберём три формулировки. Правильная — только одна.
Неправильно №1: «95% данных лежат внутри интервала». Нет. ДИ для среднего описывает неопределённость самого среднего, а не разброс отдельных наблюдений. Если средний чек 1450 ₽ с ДИ [1420; 1480], это не значит, что 95% чеков попадают в 1420–1480. Отдельные чеки могут быть и 300, и 9000 ₽. Диапазон, куда попадают сами наблюдения, — это перцентили или интервал предсказания, совсем другая вещь.
Неправильно №2: «с вероятностью 95% истинное среднее лежит в [1420; 1480]». Это тонкий момент. В классической (частотной) статистике истинное среднее — фиксированное число, оно либо в интервале, либо нет, вероятности тут нет. Вероятность 95% относится к методу: 95% таких интервалов накрывают истину. На практике продакту можно говорить «с надёжностью 95%» — но сам понимай разницу, на собеседовании это любят спрашивать.
Правильно: «если повторить измерение много раз, 95% построенных интервалов накроют истинное среднее». Громоздко, зато корректно. В отчёте достаточно: «средний чек 1450 ₽, 95% ДИ [1420; 1480]».
Практический вывод для работы: ДИ — это про точность твоего знания о метрике, а не про разброс пользователей.
Формула ДИ для среднего
Для среднего значения непрерывной метрики (выручка, время на сайте, длина сессии) интервал строится так:
$$\bar{x} \pm t_{\alpha/2,\ df} \cdot \frac{s}{\sqrt{n}}$$
Разберём по частям:
- $\bar{x}$ — выборочное среднее (твоя точечная оценка).
- $s$ — выборочное стандартное отклонение (разброс данных).
- $n$ — размер выборки.
- $\frac{s}{\sqrt{n}}$ — стандартная ошибка среднего (standard error, SE). Это ключевая величина: она показывает, насколько «дрожит» среднее.
- $t_{\alpha/2,\ df}$ — критическое значение t-распределения. Для 95% и большой выборки ≈ 1,96. Для малых выборок берут точное значение по числу степеней свободы $df = n-1$.
Пример с числами. Средний чек по выборке из $n = 400$ заказов: $\bar{x} = 1450$ ₽, стандартное отклонение $s = 600$ ₽.
Стандартная ошибка: $SE = \frac{600}{\sqrt{400}} = \frac{600}{20} = 30$ ₽.
Полуширина интервала: $1{,}96 \cdot 30 = 58{,}8$ ₽.
Итог: ДИ = $1450 \pm 58{,}8$ = [1391; 1509] ₽.
Читается так: истинный средний чек по всем клиентам, скорее всего, лежит между 1391 и 1509 ₽. Точность нашей оценки — примерно ±59 ₽.
Формула ДИ для доли
Для конверсий, retention, доли оттока — то есть для метрик вида «сколько из N сделали действие» — формула другая (интервал Вальда):
$$\hat{p} \pm z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}$$
где $\hat{p}$ — выборочная доля (например, конверсия), $n$ — размер выборки, $z_{\alpha/2} = 1{,}96$ для 95%.
Пример. На лендинг зашли $n = 4000$ человек, купили 480. Конверсия $\hat{p} = 480/4000 = 0{,}12$ (12%).
Стандартная ошибка: $SE = \sqrt{\frac{0{,}12 \cdot 0{,}88}{4000}} = \sqrt{\frac{0{,}1056}{4000}} = \sqrt{0{,}0000264} \approx 0{,}00514$.
Полуширина: $1{,}96 \cdot 0{,}00514 \approx 0{,}0101$ (примерно 1 процентный пункт).
Итог: ДИ = $0{,}12 \pm 0{,}0101$ = [0,110; 0,130] = [11,0%; 13,0%].
Важный нюанс: формула Вальда врёт при маленьких выборках и при $\hat{p}$ близких к 0 или 1 (например, конверсия 0,3% на 200 юзеров). Там интервал может уползти ниже нуля, что абсурдно для доли. В таких случаях используют интервал Уилсона — в Python он есть из коробки, покажу ниже. Правило по-простому: если у тебя меньше ~30 «успехов» или меньше ~30 «неуспехов», бери Уилсона.
Как ширина зависит от размера выборки
В обеих формулах в знаменателе стоит $\sqrt{n}$. Отсюда главное практическое следствие: чтобы сузить интервал в 2 раза, нужно увеличить выборку в 4 раза. Не в 2, а в 4 — из-за квадратного корня.
Посмотрим на конверсию 12% при разных $n$:
- $n = 250$ → SE ≈ 0,0206 → ДИ ≈ [8,0%; 16,0%] (ширина 8 п.п.)
- $n = 1000$ → SE ≈ 0,0103 → ДИ ≈ [10,0%; 14,0%] (ширина 4 п.п.)
- $n = 4000$ → SE ≈ 0,0051 → ДИ ≈ [11,0%; 13,0%] (ширина 2 п.п.)
- $n = 16000$ → SE ≈ 0,0026 → ДИ ≈ [11,5%; 12,5%] (ширина 1 п.п.)
Каждое учетверение выборки режет ширину пополам. Это объясняет, почему на маленьком трафике A/B-тесты «ничего не показывают»: интервалы такие широкие, что перекрывают любую разумную разницу. И почему гнаться за микроэффектами дорого — уменьшение интервала стоит квадратично.
Когда продакт спрашивает «а сколько данных надо, чтобы поймать эффект в 1 п.п.», ты уже знаешь, откуда растёт ответ. Расчёт размера выборки — это по сути обратная задача к формуле ДИ. Прокачать эту интуицию удобно на реальных задачах по SQL, собирая метрики из сырых логов, и на Python-тренажёре, где считаешь SE руками.
ДИ vs p-value: почему интервал информативнее
p-value отвечает на один узкий вопрос: «если разницы нет, насколько удивительны мои данные?» Он выдаёт число вроде 0,03 — и всё. Из p-value = 0,03 ты не узнаешь насколько велик эффект. Он может быть огромным и полезным, а может быть мизерным и бессмысленным для бизнеса — p-value их не различает. При большой выборке даже разница в 0,1 п.п. даст «значимый» p < 0,05, хотя внедрять ради неё ничего не стоит.
Доверительный интервал даёт и значимость, и величину эффекта сразу. Сравни два отчёта:
- «Разница конверсий значима, p = 0,04». Продакт: «Ок, и что дальше? Сколько мы заработаем?»
- «Тестовая группа даёт +2,3 п.п. конверсии, 95% ДИ [+0,4; +4,2 п.п.]». Продакт сразу видит: эффект положительный, минимум +0,4 п.п. (пессимистичный сценарий), в лучшем случае +4,2. Можно прикинуть деньги.
ДИ показывает диапазон правдоподобных значений эффекта — а это ровно то, что нужно для решения. p-value годится как быстрый флаг «шум/не шум», но для бизнес-разговора всегда доноси интервал. На собеседовании фраза «я предпочитаю доверительные интервалы, потому что они несут информацию о размере эффекта, а не только о его наличии» звучит очень зрело — такие вопросы по статистике любят на собесах в продуктовых командах.
ДИ разницы в A/B-тесте: не пересекает ноль = значимо
Самое частое применение ДИ в работе аналитика. В A/B-тесте нас интересует не конверсия каждой группы по отдельности, а разница между ними. Строим доверительный интервал для этой разницы.
Правило чтения простое: если 95% ДИ разницы не пересекает ноль — эффект статистически значим на уровне 5%. Если пересекает — данных не хватает, чтобы отличить эффект от нуля.
Формула стандартной ошибки разницы двух долей:
$$SE_{diff} = \sqrt{\frac{\hat{p}_A(1-\hat{p}_A)}{n_A} + \frac{\hat{p}_B(1-\hat{p}_B)}{n_B}}$$
Пример. Контроль: $n_A = 5000$, конверсия $\hat{p}_A = 0{,}100$. Тест: $n_B = 5000$, конверсия $\hat{p}_B = 0{,}123$. Разница $= 0{,}123 - 0{,}100 = 0{,}023$ (+2,3 п.п.).
$$SE_{diff} = \sqrt{\frac{0{,}1 \cdot 0{,}9}{5000} + \frac{0{,}123 \cdot 0{,}877}{5000}} = \sqrt{0{,}000018 + 0{,}0000216} \approx 0{,}0063$$
Полуширина: $1{,}96 \cdot 0{,}0063 \approx 0{,}0123$.
ДИ разницы = $0{,}023 \pm 0{,}0123$ = [+0,011; +0,035] = [+1,1 п.п.; +3,5 п.п.].
Интервал полностью выше нуля → эффект значим, тест выиграл. И бонусом: минимальный правдоподобный выигрыш +1,1 п.п., максимальный +3,5. Продакт может считать деньги по нижней границе, чтобы не переоценить.
Три сценария, которые нужно уметь читать с ходу:
- [+1,1; +3,5] — весь интервал положительный. Тест победил, эффект есть.
- [−0,8; +2,4] — интервал накрывает ноль. Значимости нет, возможно, тесту не хватило мощности. Нельзя говорить «эффекта нет» — можно только «не поймали».
- [+0,05; +0,15] — значимо, но эффект крошечный (доли пункта). Статзначимо ≠ практически ценно. Стоит ли внедрять ради +0,1 п.п. — вопрос экономики, а не статистики.
Прогнать такие расчёты на реальных сценариях можно в кейсах по A/B-тестам, а систематически подготовиться к вопросам про эксперименты — на странице подготовки к собеседованию аналитика.
Код на Python: scipy и statsmodels
Считать интервалы руками полезно для понимания, но в работе используй библиотеки — они закрывают краевые случаи (малые выборки, доли близкие к 0/1).
ДИ для среднего через scipy:
import numpy as np
from scipy import stats
data = np.array([1200, 980, 1750, 1430, 2100, 890, 1560, 1340, 1680, 1120])
mean = data.mean()
sem = stats.sem(data) # стандартная ошибка среднего
ci = stats.t.interval(0.95, df=len(data) - 1, loc=mean, scale=sem)
print(f"Среднее: {mean:.0f} ₽, 95% ДИ: [{ci[0]:.0f}; {ci[1]:.0f}]")
# Среднее: 1405 ₽, 95% ДИ: [1129; 1681]
stats.t.interval сам берёт t-распределение — корректно и для малых выборок. Для больших выборок t почти совпадает с нормальным, так что метод универсален.
ДИ для доли через statsmodels (интервал Уилсона — надёжнее Вальда):
from statsmodels.stats.proportion import proportion_confint
successes, n = 480, 4000
low, high = proportion_confint(successes, n, alpha=0.05, method='wilson')
print(f"Конверсия: {successes/n:.1%}, 95% ДИ: [{low:.1%}; {high:.1%}]")
# Конверсия: 12.0%, 95% ДИ: [11.0%; 13.0%]
Замени method='wilson' на method='normal', если хочешь классический Вальд. Для маленьких выборок разница будет заметной, и Уилсон честнее.
ДИ разницы двух долей в A/B — руками через numpy, потому что это ровно та формула, что нужна аналитику каждый день:
import numpy as np
from scipy import stats
nA, cA = 5000, 500 # контроль: 5000 юзеров, 500 конверсий
nB, cB = 5000, 615 # тест: 5000 юзеров, 615 конверсий
pA, pB = cA / nA, cB / nB
diff = pB - pA
se = np.sqrt(pA * (1 - pA) / nA + pB * (1 - pB) / nB)
z = stats.norm.ppf(0.975) # 1.96 для 95%
low, high = diff - z * se, diff + z * se
print(f"Разница: {diff:+.1%}, 95% ДИ: [{low:+.1%}; {high:+.1%}]")
significant = low > 0 or high < 0
print("Значимо" if significant else "Не значимо (ноль внутри)")
# Разница: +2.3%, 95% ДИ: [+1.1%; +3.5%]
# Значимо
Расчёт руками для проверки (тот же пример с чеком, чтобы видеть каждый шаг):
import numpy as np
data = np.array([1200, 980, 1750, 1430, 2100, 890, 1560, 1340, 1680, 1120])
n = len(data)
mean = data.mean()
s = data.std(ddof=1) # ddof=1 — выборочное СКО (несмещённое)
se = s / np.sqrt(n)
t_crit = 2.262 # t для df=9, 95%
low, high = mean - t_crit * se, mean + t_crit * se
print(f"[{low:.0f}; {high:.0f}]") # [1129; 1681]
Обрати внимание на ddof=1 в std — без него numpy делит на $n$ вместо $n-1$ и занижает разброс. Это классическая ошибка, из-за которой ручной расчёт не сходится с scipy.
Как читать и подавать ДИ продакту
Технически посчитать интервал — половина работы. Вторая половина — донести его так, чтобы продакт принял правильное решение.
Всегда показывай нижнюю границу. Продакты любят среднее («выиграли +2,3 п.п.!»), но планировать нужно по пессимистичному сценарию. Формулируй: «в худшем правдоподобном случае +1,1 п.п., в лучшем +3,5». Так ты страхуешь команду от переоценки эффекта.
Переводи в деньги по границам. Не «+2,3 п.п. конверсии», а «это примерно +N заказов в месяц по нижней границе и +M по верхней». Диапазон в рублях убеждает сильнее, чем проценты.
Не говори «эффекта нет», если ноль внутри интервала. Правильная формулировка: «мы не нашли значимого эффекта — возможно, его нет, а возможно, не хватило данных, чтобы его увидеть». Разница принципиальная: во втором случае имеет смысл добрать трафик.
Широкий интервал — это честный сигнал «данных мало». Если ДИ [−5%; +12%], не притворяйся, что что-то знаешь. Скажи прямо: выборка маленькая, вывод делать рано, нужно ещё X дней теста.
Держи один уровень надёжности. Обычно 95%. Не переключайся на 90%, чтобы интервал стал уже и «результат заиграл» — это натягивание совы на глобус, и на ревью такое ловят.
Умение говорить не «метрика равна X», а «метрика в диапазоне [X; Y] с надёжностью 95%» — это то, что отличает аналитика от человека, который просто считает средние. Отработать этот навык на реальных тестовых заданиях и разобрать конкретные метрики с формулами стоит до собеседования, а не на нём.
Частые вопросы
Почему для среднего берут t-распределение, а для доли — z?
Для доли дисперсия однозначно определяется самой долей ($p(1-p)$), поэтому используют нормальное распределение и $z = 1{,}96$. Для среднего дисперсию приходится оценивать по выборке через $s$, и эта оценка сама содержит неопределённость — особенно на малых выборках. t-распределение это учитывает: у него «толще хвосты», интервал получается чуть шире и честнее. При $n > 100$ разница между t и z исчезает, но привычка брать t для средних спасает на маленьких данных.
Что делать, если ДИ доли уходит ниже нуля?
Это признак, что формула Вальда неприменима: у тебя маленькая выборка или доля близка к 0 либо к 1. Доля не может быть отрицательной, значит метод сломался. Переходи на интервал Уилсона (method='wilson' в statsmodels) или Клоппера–Пирсона (method='beta') — они всегда дают границы внутри [0; 1] и корректны на малых числах. Общее правило: меньше ~30 успехов или ~30 неуспехов — не бери Вальд.
Можно ли по пересечению интервалов двух групп судить о значимости разницы?
Нет, это распространённая ловушка. Даже если 95% ДИ группы A и группы B слегка перекрываются, разница между ними всё равно может быть значимой. Правильно строить отдельный интервал для разницы и смотреть, пересекает ли он ноль. Пересечение самих интервалов групп — более консервативный и неточный тест, он «прячет» реальные эффекты. Всегда считай ДИ разницы напрямую, как в примере с A/B выше.
95% или 99% — какой уровень надёжности выбрать?
По умолчанию 95% — это отраслевой стандарт, баланс между строгостью и шириной интервала. 99% берут, когда цена ошибки высока (медицина, финансовые решения, необратимые продуктовые изменения) — но интервал станет заметно шире, и понадобится больше данных. 90% иногда используют на ранних, разведочных этапах, когда нужен быстрый ориентир. Главное правило: выбери уровень до эксперимента и не меняй его post-hoc под желаемый результат.