← Назад к вопросам

Как будешь выбирать статистические критерии для непрерывных метрик?

2.2 Middle🔥 211 комментариев
#A/B тестирование#Статистика и математика

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Выбор статистических критериев для непрерывных метрик

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

Факторы влияющие на выбор критерия

1. Распределение данных

Первый и самый важный вопрос: нормально ли распределены данные?

Способы проверки:

  • Визуально: построить гистограмму и Q-Q plot
  • Статистически: тест Шапиро-Уилка (Shapiro-Wilk)
  • Практически: проверить коэффициент асимметрии (skewness < 2) и эксцесса (kurtosis < 3)
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

# Загрузите данные
data_a = []  # значения из группы A
data_b = []  # значения из группы B

# Тест Шапиро-Уилка
stat_a, p_value_a = stats.shapiro(data_a)
stat_b, p_value_b = stats.shapiro(data_b)

if p_value_a > 0.05 and p_value_b > 0.05:
    print("Данные распределены нормально")
else:
    print("Данные распределены ненормально")

2. Размер выборки

Малые выборки (n < 30):

  • Требуется нормальность распределения
  • Используйте параметрические критерии с осторожностью
  • Рассмотрите увеличение размера выборки

Большие выборки (n > 30-100):

  • По Центральной предельной теореме можно использовать параметрические критерии
  • Даже ненормальные распределения приближаются к нормальному
  • Различия в распределениях становятся менее критичными

3. Гомогенность дисперсий

Для многих критериев важно, равны ли дисперсии между группами.

# Тест Левена на равенство дисперсий
stat, p_value = stats.levene(data_a, data_b)

if p_value > 0.05:
    print("Дисперсии равны (гомогенные)")
    equal_var = True
else:
    print("Дисперсии различаются (гетерогенные)")
    equal_var = False

Дерево решений для выбора критерия

Две независимые группы, непрерывная метрика:

  • Нормальное распределение и большая выборка?
    • ДА: t-тест (Student t-test или Welch t-test)
    • НЕТ: Mann-Whitney U тест
  • Три и более групп?
    • Нормальное распределение: ANOVA
    • Ненормальное: Kruskal-Wallis

Практические сценарии

Сценарий 1: Среднее время в приложении (ARPU)

Характеристика: непрерывная метрика, часто имеет асимметричное распределение

Решение:

from scipy import stats

# Размер выборок
n_a = len(data_a)
n_b = len(data_b)

# Проверка нормальности
shapiro_a = stats.shapiro(data_a)
shapiro_b = stats.shapiro(data_b)

if n_a > 100 and n_b > 100:
    # Большие выборки
    stat, p_value = stats.ttest_ind(data_a, data_b, equal_var=False)
    print(f"Welch t-test: p-value={p_value:.4f}")
else:
    # Малые выборки
    stat, p_value = stats.mannwhitneyu(data_a, data_b, alternative='two-sided')
    print(f"Mann-Whitney U: p-value={p_value:.4f}")

Интерпретация:

  • Если p-value < 0.05: статистически значимое различие
  • Если p-value >= 0.05: недостаточно доказательств

Сценарий 2: A/B/C тест (три варианта)

# Проверка дисперсий
levene_stat, levene_p = stats.levene(data_a, data_b, data_c)

if levene_p > 0.05:
    # ANOVA тест
    f_stat, p_value = stats.f_oneway(data_a, data_b, data_c)
    print(f"ANOVA: F={f_stat:.4f}, p-value={p_value:.4f}")
else:
    # Kruskal-Wallis
    h_stat, p_value = stats.kruskal(data_a, data_b, data_c)
    print(f"Kruskal-Wallis: H={h_stat:.4f}, p-value={p_value:.4f}")

Основные параметрические критерии

КритерийРаспределениеДисперсииПримечание
Student t-testНормальноеРавныеКлассический
Welch t-testНормальноеРазныеБолее устойчив
Mann-Whitney UЛюбоеНепараметрический
ANOVAНормальноеРавныеДля 3+ групп
Kruskal-WallisЛюбоеНепараметрический ANOVA

Best practices

1. Проверяйте предположения:

  • Визуализируйте данные перед анализом
  • Не полагайтесь только на p-value
  • Рассчитайте effect size (Cohen's d)

2. Используйте эффект размер (Cohen's d):

def cohens_d(group1, group2):
    n1, n2 = len(group1), len(group2)
    var1 = np.var(group1, ddof=1)
    var2 = np.var(group2, ddof=1)
    pooled_std = np.sqrt(((n1-1)*var1 + (n2-1)*var2) / (n1+n2-2))
    return (np.mean(group1) - np.mean(group2)) / pooled_std

Интерпретация:

  • < 0.2: малый эффект
  • 0.2-0.5: средний эффект
  • 0.8: большой эффект

3. Рекомендации:

  • Большие выборки (n > 100): параметрические критерии
  • Сомневаетесь: непараметрические (Mann-Whitney, Kruskal-Wallis)
  • Всегда вычисляйте доверительный интервал
  • Учитывайте практическую значимость результатов