Почему будешь использовать Т-тест для нахождения статистической значимости конверсии между группами A и B?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
T-тест для анализа конверсии в A/B тестах
Вопрос о применении t-теста для анализа конверсии требует внимательного рассмотрения. На первый взгляд может показаться странным, что мы используем t-тест для бинарных данных (конверсия или нет), но на самом деле это один из распространённых подходов. Давайте разберёмся, почему, когда это применимо, и какие есть альтернативы.
Почему t-тест можно использовать для конверсии
1. Конверсия как непрерывная переменная
Когда мы говорим о конверсии между группами, мы имеем в виду долю/процент пользователей, совершивших действие:
- Группа A: конверсия = 12.5% (125 из 1000)
- Группа B: конверсия = 15.3% (153 из 1000)
Это уже непрерывная переменная (число между 0 и 100%), а не бинарная. И для сравнения двух средних значений непрерывных переменных как раз и предназначен t-тест.
# Конверсии как средние значения
group_a_conversions = [1, 0, 1, 0, 1, ...] # 1000 значений
group_b_conversions = [1, 1, 0, 1, 1, ...] # 1000 значений
# Среднее = доля конвертов
mean_a = np.mean(group_a_conversions) # 0.125 = 12.5%
mean_b = np.mean(group_b_conversions) # 0.153 = 15.3%
# T-тест для проверки различия средних
from scipy import stats
t_stat, p_value = stats.ttest_ind(group_a_conversions, group_b_conversions)
print(f"t-statistic: {t_stat:.4f}, p-value: {p_value:.4f}")
2. Центральная предельная теорема (ЦПТ)
Даже хотя конверсия по определению — бинарная величина (конвертилась или нет), при достаточно большом размере выборки распределение средней доли приближается к нормальному.
ЦПТ гласит: При n → ∞, распределение средних любой переменной
приближается к нормальному, независимо от исходного распределения
Практический порог:
- При n > 30-50 в каждой группе можно применять t-тест
- При n > 100-200 t-тест становится очень надёжным
- Особенно для конверсий, близких к 50%
3. T-тест как Z-тест для больших выборок
Для больших выборок t-тест эквивалентен Z-тесту, который часто используется в маркетинге специально для пропорций:
# T-тест (для больших n)
t_stat, p_value_t = stats.ttest_ind(data_a, data_b)
# Z-тест для пропорций (классический способ для конверсий)
from statsmodels.stats.proportion import proportions_ztest
count_a, count_b = 125, 153
n_a, n_b = 1000, 1000
z_stat, p_value_z = proportions_ztest([count_a, count_b], [n_a, n_b])
print(f"T-test p-value: {p_value_t:.4f}")
print(f"Z-test p-value: {p_value_z:.4f}")
# Результаты будут примерно одинаковы при больших n
Когда t-тест уместен для конверсии
✅ Используй t-тест:
- Размер выборки > 100 в каждой группе
- Конверсия не близка к крайностям (не 1% и не 99%)
- Нужен быстрый анализ с использованием стандартных инструментов
❌ НЕ используй t-тест:
- Малые выборки (n < 30)
- Очень низкая или очень высокая конверсия (< 5% или > 95%)
- Нужна высокая точность для критичного решения
Лучшие практики для анализа конверсии
Вариант 1: Стандартный Z-тест для пропорций (рекомендуется)
from statsmodels.stats.proportion import proportions_ztest
# Данные A/B теста
conversions_a = 125 # количество конвертов в A
conversions_b = 153 # количество конвертов в B
n_a = 1000 # размер группы A
n_b = 1000 # размер группы B
# Z-тест для двух пропорций
count = np.array([conversions_a, conversions_b])
nobs = np.array([n_a, n_b])
z_stat, p_value = proportions_ztest(count, nobs)
print(f"Z-statistic: {z_stat:.4f}")
print(f"P-value: {p_value:.4f}")
print(f"Статистически значимо: {'Да' if p_value < 0.05 else 'Нет'}")
Вариант 2: T-тест (простой, но менее точный)
# Создаём бинарные массивы
group_a = np.array([1]*125 + [0]*(1000-125))
group_b = np.array([1]*153 + [0]*(1000-153))
# T-тест Велча (устойчив к неравным дисперсиям)
t_stat, p_value = stats.ttest_ind(group_a, group_b, equal_var=False)
print(f"T-statistic: {t_stat:.4f}, P-value: {p_value:.4f}")
Вариант 3: Chi-square тест (для категориальных данных)
from scipy.stats import chi2_contingency
# Таблица сопряжённости
contingency_table = np.array([
[125, 153], # конверсии
[875, 847] # неконверсии
])
chi2, p_value, dof, expected = chi2_contingency(contingency_table)
print(f"Chi-square: {chi2:.4f}, P-value: {p_value:.4f}")
Сравнение методов
| Метод | Применение | Точность | Требования |
|---|---|---|---|
| Z-тест | Для пропорций | Высокая | n > 30 |
| T-тест | Для средних | Средняя | n > 30-50 |
| Chi-square | Категориальные | Высокая | n > 5 везде |
| Fisher | Малые n | Точная | n < 30 |
Практический пример
import numpy as np
from scipy import stats
from statsmodels.stats.proportion import proportions_ztest
# A/B тест результаты
group_a = {'conversions': 125, 'users': 1000}
group_b = {'conversions': 153, 'users': 1000}
# Вычисляем конверсии
conv_rate_a = group_a['conversions'] / group_a['users']
conv_rate_b = group_b['conversions'] / group_b['users']
print(f"Конверсия A: {conv_rate_a:.2%}")
print(f"Конверсия B: {conv_rate_b:.2%}")
print(f"Разница: {(conv_rate_b - conv_rate_a):.2%}")
# Z-тест (РЕКОМЕНДУЕТСЯ)
count = [group_a['conversions'], group_b['conversions']]
nobs = [group_a['users'], group_b['users']]
z_stat, p_value = proportions_ztest(count, nobs)
print(f"\nZ-test результат:")
print(f"Z-statistic: {z_stat:.4f}")
print(f"P-value (two-tailed): {p_value:.4f}")
if p_value < 0.05:
print(f"✓ Результат статистически значим (p < 0.05)")
lift = ((conv_rate_b - conv_rate_a) / conv_rate_a) * 100
print(f"Lift: {lift:+.1f}%")
else:
print(f"✗ Недостаточно доказательств различия (p >= 0.05)")
Выводы
T-тест используется для конверсии потому что:
- Конверсия становится непрерывной когда мы смотрим на долю в группе
- ЦПТ гарантирует нормальность при больших n
- Он работает и дает близкие результаты к Z-тесту
Однако в практике:
- Для пропорций лучше использовать Z-тест или Chi-square
- T-тест подходит, но менее специализирован
- Для малых выборок используйте Fisher's exact test
- Всегда проверяйте размер эффекта, а не только p-value