Вопрос или проблема
def get_pvalue(con_conv, test_conv, con_size, test_size,):
lift = - abs(test_conv - con_conv)
scale_one = con_conv * (1 - con_conv) * (1 / con_size)
scale_two = test_conv * (1 - test_conv) * (1 / test_size)
scale_val = (scale_one + scale_two)**0.5
p_value = 2 * stats.norm.cdf(lift, loc = 0, scale = scale_val )
return p_value
У меня есть эта функция, и я хотел бы понять, что она на самом деле делает и как она рассчитывает значение p.
Это необходимо для определения разницы между коэффициентами конверсии контрольной и тестовой групп в A/B тесте.
con_conv --> Коэффициент конверсии контрольной группы
test_conv --> Коэффициент конверсии тестовой группы
con_size --> Объем выборки контрольной группы
test_size --> Объем выборки тестовой группы
Я понимаю, что scale_one
и scale_two
рассчитывают дисперсию для каждой группы, но я не понимаю, почему они складываются для расчета стандартного отклонения и почему cdf умножается на 2 для получения p_value
.
p_value = 2 * stats.norm.cdf(lift, loc = 0, scale = scale_val )
Это ключ к вашему вопросу: Значение p — это вероятность того, что нулевая гипотеза истинна.
Если нулевая гипотеза истинна: Ваша модель не находит никаких различий между группами.
Если ложна: Ваша модель находит различия между группами.
Учитывая, что вы используете модель, предположением которой является нормальность (среди прочего), гипотезный тест должен быть проверен, сравнивая вероятность в контексте нормального распределения.
Функция stats.norm.cdf возвращает вероятность того, что “lift близок к нулю”, если lift предполагается “нормальным”. Если lift равен нулю, то между группами нет различий, поэтому значение p <0.01 говорит нам, что вероятность того, что группы равны, почти 0, что означает, что ваши группы разные.
Двойка связана с концепцией “двустороннего распределения”: Разница между группами может быть A больше B или B больше A, поэтому вы измеряете разницу в любом из двух направлений.
Сложение между стандартными отклонениями подчиняется концепции:
$Var(X+Y) = Var(X) + Var(Y)$ если $X$ и $Y$ независимы.
Я должен привлечь внимание людей к другому (принятому) ответу, который содержит крайне грубую, хотя и очень распространенную, ошибку:
Значение p — это вероятность того, что нулевая гипотеза истинна.
Это совершенно неверно. Если бы автор вопроса использовал байесовский подход, такое утверждение могло бы быть сделано, но в частной статистике значение p:
Вероятность получения статистики теста по крайней мере такой же большой, как действительно полученная, если, и только если, нулевая гипотеза истинна:
$$\mathcal{P}(\mathcal{D} \mid \mathcal{H_0})$$
где $\mathcal{H_0}$ — это нулевая гипотеза, а $\mathcal{D}$ — это статистика теста (рассчитанная на основе данных).
Вероятность, упомянутая в комментарии: “вероятность того, что нулевая гипотеза истинна,” на самом деле это:
$$\mathcal{P}(\mathcal{H_0} \mid \mathcal{D})$$
…и, естественно, это то, что многие люди хотели бы, чтобы значение p означало, но, к сожалению, (если не принимать, как уже упоминалось, байесовский подход).
Ответ или решение
Понимание P-значения в A/B тестировании
Когда вы проводите A/B тест на сравнение конверсии между контрольной (con_conv) и тестовой группой (test_conv), вы хотите выяснить, есть ли статистически значимые различия между двумя группами. Для этого используется p-значение. В приведённом ниже коде вычисляется p-значение с использованием нормального распределения:
def get_pvalue(con_conv, test_conv, con_size, test_size):
lift = - abs(test_conv - con_conv)
scale_one = con_conv * (1 - con_conv) * (1 / con_size)
scale_two = test_conv * (1 - test_conv) * (1 / test_size)
scale_val = (scale_one + scale_two) ** 0.5
p_value = 2 * stats.norm.cdf(lift, loc=0, scale=scale_val)
return p_value
Разбиение на компоненты
-
Расчёт лифта (lift):
lift = - abs(test_conv - con_conv)
:
Этот параметр показывает величину различия между конверсиями тестовой и контрольной групп. Отрицательный знак указывает на то, что мы рассчитываем отклонение в одну из сторон.
-
Расчёт вариации (scale_one и scale_two):
scale_one = con_conv * (1 - con_conv) * (1 / con_size)
:- Это оценка дисперсии для контрольной группы на основе её конверсии и размера выборки. Формула
p(1-p)/n
используется для оценки вероятности в Bernoulli trial.
- Это оценка дисперсии для контрольной группы на основе её конверсии и размера выборки. Формула
scale_two = test_conv * (1 - test_conv) * (1 / test_size)
:- Аналогично первой, эта формула даёт оценку дисперсии для тестовой группы.
-
Калькуляция стандартного отклонения:
scale_val = (scale_one + scale_two) ** 0.5
:- Мы суммируем вариации обеих групп, так как они независимы, и из результата извлекаем квадратный корень, чтобы получить общую стандартную ошибку (standard error). Это критически важно: для статистических тестов комбинированная вариация обычно складывается.
-
Вычисление p-значения:
p_value = 2 * stats.norm.cdf(lift, loc=0, scale=scale_val)
:- Здесь мы используем кумулятивную функцию распределения (CDF) нормального распределения для расчёта вероятности того, что бы наблюдаемый лифт был так же мал, если бы гипотеза нулевого различия была истинной. Умножение на 2 необходимо для учёта двустороннего теста: различие может быть как положительным, так и отрицательным.
Статистическая интерпретация
-
Гипотеза:
- Нулевая гипотеза (H0) предполагает отсутствие различий между группами:
con_conv = test_conv
. - Альтернативная гипотеза (H1) предполагает, что различия существуют:
con_conv ≠ test_conv
.
- Нулевая гипотеза (H0) предполагает отсутствие различий между группами:
-
P-значение:
- Это уровень значимости, который показывает вероятность того, что наблюдаемый результат мог бы произойти случайно, при условии, что H0 верна.
- Низкое p-значение (обычно меньше 0.05 или 0.01) указывает на то, что есть достаточные доказательства для отклонения нулевой гипотезы.
Заключение
P-значение — это мощный инструмент для принятия решений на основе данных в A/B тестировании. Оно предоставляет количественную метрику для оценки различий между группами, формируя таким образом основание для последующих маркетинговых или продуктовых стратегий. Убедитесь, что вы правильно интерпретируете результаты, понимая, что p-значение не является вероятностью истинености нулевой гипотезы, а скорее вероятностью получения таких или больших различий, если H0 истинна.