Как подобрать уровень значимости α и мощность для A/B теста

6dad8b8d7f0be4568021bdc22448500d.jpg

Привет, Хабр!

Когда то я думал, выбор правильного уровня значимости α и мощности для A/B теста — это простое дело, пока не столкнулся с этой проблемой на практике. Сидишь, анализируешь результаты, думаешь, что все идет по плану, а потом вдруг выясняется, что твои выводы сомнительны из-за неправильно выбранных параметров тестирования.

Цель A/B теста — не просто узнать, какой вариант лучше, а получить достоверные результаты, на основе которых можно принимать обоснованные решения.

В этой статье рассмотрим как подобрать уровень значимости α.

Уровень значимости α

Уровень значимости α указывает на вероятность отклонения нулевой гипотезы, когда она на самом деле верна. Обычно α выбирается заранее и представляет собой уровень риска ошибки первого рода.

Роль уровня значимости α в статистической проверке гипотез заключается в контроле ошибки первого рода, то есть вероятности ошибочно отвергнуть верную нулевую гипотезу. Чем ниже уровень значимости α, тем меньше вероятность совершить ошибку первого рода, но тем больше вероятность допустить ошибку второго рода.

Ошибка первого рода, также известная как »ложноположительный» результат, происходит, когда нулевая гипотеза H0 ошибочно отвергается, несмотря на то, что она верна. Например, если мы проводим A/B тестирование для оценки эффективности новой рекламной кампании и приходим к выводу, что новая кампания эффективнее старой, когда на самом деле разницы нет, мы совершаем ошибку первого рода.

Уровень значимости α — это пороговое значение, которое мы устанавливаем перед началом теста, и которое определяет, насколько необычными должны быть данные, чтобы отвергнуть H0. Если вероятность получить наблюдаемые данные, предполагая, что H0 верна, меньше α, то мы отвергаем H0. По дефолту α устанавливается на уровне 0.05.

Мощность статистического теста — это вероятность правильно отвергнуть нулевую гипотезу, когда альтернативная гипотеза верна, т.е. вероятность не совершить ошибку второго рода. Высокая мощность означает большую вероятность обнаружения реального эффекта, если он существует. Мощность зависит от нескольких факторов, включая выбранный уровень значимости α, размер эффекта и размер выборки.

Ошибка второго рода, или »ложноотрицательный» результат, происходит, когда нулевая гипотеза принимается как верная, хотя на самом деле верна альтернативная гипотеза H1. В контексте пример с рекл.компанией выше с A/B тестированием это означало бы, что мы не обнаружили реального улучшения от новой рекламной кампании, хотя на самом деле оно есть.

Вероятность ошибки второго рода обозначается как β, и в идеальных условиях мы стремимся минимизировать и α, и β. Однако на практике между этими двумя типами ошибок существует компромисс: уменьшением α — увеличиваем β и наоборот. Поэтому выбор уровня значимости часто сводится к балансу между риском совершения этих двух типов ошибок, к примеру в ситуациях, где последствия ошибки первого рода считаются критическими, например в клинических исследованиях, может быть оправдан выбор более низкого уровня α (например, 0.01). Однако это также означает, что тест будет иметь меньшую мощность для обнаружения реального эффекта

Примеры типичных значений α:

  1. Значение α = 0.05:

    • Этот уровень значимости довольно распространен и часто юзается.

    • При α = 0.05, критическую область устанавливается так, что вероятность ошибки первого рода составляет 5%.

    • При таком значении α мы имеем более жесткие критерии для отклонения нулевой гипотезы. Это означает, что для того чтобы признать различия между группами статистически значимыми, p-value должно быть меньше 0.05. Такой уровень значимости обычно считается довольно надежным.

  2. Значение α = 0.01:

    • Этот уровень значимости используется в более консервативных случаях, когда необходимо минимизировать вероятность ошибки первого рода.

    • При α = 0.01, устанавливаются более строгие критерии для отклонения нулевой гипотезы, что означает, что вероятность ошибки первого рода составляет всего 1%.

    • При таком уровне значимости, чтобы отклонить нулевую гипотезу, p-value должно быть меньше 0.01.

  3. Значение α = 0.10:

    • Этот уровень значимости используется в менее строгих случаях, когда можно допустить большую вероятность ошибки первого рода.

    • При α = 0.10, более щедро определяется критическую область, что означает, что вероятность ошибки первого рода составляет 10%.

    • При таком уровне значимости нам потребуется p-value меньше 0.10 для отклонения нулевой гипотезы. Это может привести к тому, что нулевая гипотеза будет чаще отклоняться, даже если различия между группами не очень выражены.

Итак, если установить слишком высокий уровень значимости, например, α = 0.10, это может привести к чрезмерному отклонению нулевой гипотезы и ошибочному признанию незначимых различий между группами. В результате бизнес-решения могут быть приняты на основе данных, которые на самом деле не являются статистически значимыми, а вот если выбрать слишком низкий уровень значимости, например, α = 0.01, это может привести к тому, что тест станет менее чувствительным к обнаружению реальных различий между группами.

Факторы, влияющие на выбор уровня значимости

Первое и, возможно, самое очевидное — это цели и специфика проекта. От того, насколько критичными могут быть последствия ошибки, зависит, насколько консервативным или агрессивным вы можете быть в выборе α.

Статистическая мощность. Выбор слишком низкого α может привести к снижению мощности теста, что увеличивает риск ошибки второго рода — не обнаружить реальное различие, когда оно существует.

Размер выборки напрямую влияет на статистические выводы. С большей выборкой больше шансов обнаружить реальное различие, если оно существует. Это может позволить выбрать более строгий уровень значимости без ущерба для статистической мощности.

Адаптивные подходы к выбору α

Последовательный анализ позволяет проводить промежуточный анализ данных на различных этапах исследования. Основная фича состоит в том, чтобы принимать решение о продолжении теста на каждом этапе, исходя из накопленных данных, не увеличивая общий риск ошибок.

Предоставлю общую идею того, как это может быть реализовано:

# симулируем сбор данных в пяти этапах и на каждом этапе проверяем
# наличие статистически значимых различий между контрольной и тестовой группами.
import numpy as np
import statsmodels.stats.api as sms

# предположим, это истинные эффекты лекарств
true_effect_control = 0.5
true_effect_treatment = 0.6

# размеры выборок на каждом этапе
sample_sizes = [100, 200, 300, 400, 500]

# смулируем данные
np.random.seed(42)
control_group = np.random.normal(true_effect_control, 0.1, sample_sizes[-1])
treatment_group = np.random.normal(true_effect_treatment, 0.1, sample_sizes[-1])

# функция последовательного анализа
def sequential_analysis(sample_sizes, control_group, treatment_group, alpha=0.05):
    for size in sample_sizes:
        current_control = control_group[:size]
        current_treatment = treatment_group[:size]
        
        # выполним двухвыборочный t-тест
        t_stat, p_value = sms.ttest_ind(current_treatment, current_control)
        
        print(f"Sample size: {size}, P-value: {p_value:.4f}")
        
        if p_value < alpha:
            print(f"Significant result detected at sample size {size} (P-value: {p_value:.4f})")
            break
    else:
        print("No significant result detected.")

# выполнение последовательного анализа
sequential_analysis(sample_sizes, control_group, treatment_group)

Адаптивная коррекция Бонферрони позволяет корректировать уровень значимости в зависимости от количества проведенных тестов:

from statsmodels.stats.multitest import multipletests

def adaptive_bonferroni_correction(p_values, initial_alpha=0.05):
    number_of_tests = len(p_values)
    adjusted_alpha = initial_alpha / number_of_tests
    corrected = multipletests(p_values, alpha=adjusted_alpha, method='bonferroni')
    return corrected[1]  # возвращаем скорректированные p-значения

# пример использования
p_values = [0.01, 0.02, 0.03, 0.04]  # Примерный список p-значений
corrected_p_values = adaptive_bonferroni_correction(p_values)
print(corrected_p_values)

Байесовские адаптивные методы позволяют интегрировать предварительную информацию и постоянно обновлять вероятности гипотез на основе накопленных данных:

import pymc3 as pm
import arviz as az

# cимулируем данные
np.random.seed(42)
observed_control = np.random.binomial(n=1, p=0.5, size=500)
observed_treatment = np.random.binomial(n=1, p=0.55, size=500)

with pm.Model() as model:
    # априорные вероятности для двух групп
    p_control = pm.Beta('p_control', alpha=2, beta=2)
    p_treatment = pm.Beta('p_treatment', alpha=2, beta=2)
    
    # ликвидность наблюдений
    obs_control = pm.Bernoulli('obs_control', p=p_control, observed=observed_control)
    obs_treatment = pm.Bernoulli('obs_treatment', p=p_treatment, observed=observed_treatment)
    
    # разница в пропорциях
    delta = pm.Deterministic('delta', p_treatment - p_control)
    
    # выполняем MCMC
    trace = pm.sample(4000, return_inferencedata=True)

Итак, самое важное: оценка потенциальных рисков, связанных с ошибками первого и второго рода. Необходимо спросить себя: «Каковы последствия ошибочного отклонения нулевой гипотезы?» и «Каковы последствия неспособности обнаружить реальное различие?».

Так же вы ожидаете большой эффект от внедряемого изменения, вы можно позволить себе выбрать более низкий уровень значимости, тем самым уменьшая вероятность ошибки первого рода, не рискуя при этом пропустить значимый эффект из-за недостаточной мощности теста. С малыми ожиданиями — абсолютно противоположные действия

Анализ прошлых экспериментов, если они, конечно есть поможет лучше понять, какие уровни значимости были эффективны в прошлом, и какие уроки можно извлечь из предыдущих ошибок или успехов.

Статья подготовлена в рамках запуска курса Системный аналитик. Advanced. Узнать о курсе подробнее можно по ссылке.

© Habrahabr.ru