Всем привет! На связи Александр Грудинин, ментор профессии «Аналитик данных» 👋🏻
Представьте: мы проводим A/B-тест страницы оплаты — контроль 5.00%, тест 5.45%, по 20 000 юзеров, p = 0.043. Значимо, катим. Продакт: «Сколько денег принесёт?»
p-value на это не отвечает: он умеет только сказать, похожа ли разница на случайный шум. Размера эффекта и точности в этом числе нет. Отвечает доверительный интервал — диапазон эффекта, совместимый с данными. Считаем на Python:
import numpy as np
from scipy import stats
n_a, conv_a = 20_000, 1000 # контроль: 5.00%
n_b, conv_b = 20_000, 1090 # тест: 5.45%
p_a, p_b = conv_a / n_a, conv_b / n_b
diff = p_b - p_a # точечная оценка: 0.45 п.п.
# стандартная ошибка разницы двух долей
se = np.sqrt(p_a*(1-p_a)/n_a + p_b*(1-p_b)/n_b)
# p-value двустороннего z-теста
z = diff / se
p_value = 2 * stats.norm.sf(abs(z))
print(f"p-value: {p_value:.3f}") # 0.043
# 95% доверительный интервал
lo, hi = diff - 1.96*se, diff + 1.96*se
print(f"ДИ: [{lo*100:.2f}; {hi*100:.2f}] п.п.") # [0.01; 0.89] п.п.
# то же самое в деньгах
users, value = 500_000, 3_000 # юзеров/мес, ₽ с конверсии
print(f"от {lo*users*value/1e6:.1f} до {hi*users*value/1e6:.1f} млн ₽/мес")
# от 0.2 до 13.3 млн ₽/мес
То же p = 0.043 разворачивается в +0.01…+0.89 п.п., или от 0.2 до 13.3 млн ₽/мес при точечной оценке 6.75 млн. Обещать продакту 6.75, когда данные допускают 0.2, — легкомысленно.
Обратная ошибка не лучше: «не значимо» ≠ «эффекта нет». Если интервал накрывает и ноль, и ценный эффект — не хватило выборки, а не эффекта.
Что делать: в каждом отчёте держите интервал рядом с p-value — в процентных пунктах и в деньгах. p-value говорит только, случайна ли разница; интервал показывает, на сколько она тянет. Результат значим — планируй по нижней границе: 0.2 млн получишь почти наверняка, а 6.75 — это верхний край везения, а не обещание.
Ставьте 🔥, если было полезно!
📈 Симулейтив | 📱 ВК | 📱 YouTube | 📱 Канал о DS