Как будешь выбирать статистические критерии для непрерывных метрик?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Выбор статистических критериев для непрерывных метрик
Выбор правильного статистического критерия — ключевой момент в анализе 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)
- Всегда вычисляйте доверительный интервал
- Учитывайте практическую значимость результатов