статистикадоверительный интервалA/B-тестыаналитик данныхPythonсобеседование

Доверительный интервал простыми словами

2026-07-06 14 мин

Главное за минуту. Доверительный интервал (ДИ) — это диапазон, в котором с заданной надёжностью (обычно 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}}$$

Разберём по частям:

Пример с числами. Средний чек по выборке из $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$:

Каждое учетверение выборки режет ширину пополам. Это объясняет, почему на маленьком трафике 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-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. Продакт может считать деньги по нижней границе, чтобы не переоценить.

Три сценария, которые нужно уметь читать с ходу:

Прогнать такие расчёты на реальных сценариях можно в кейсах по 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 под желаемый результат.

Практикуйся на реальных задачах
545 SQL + 538 Python задач с автопроверкой, 618 кейсов. Первые — без регистрации.
Разобрать статистику на практике →