Используется ли в a/b тестах скалирование
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Скалирование в A/B тестах
Скалирование (нормализация) в классическом смысле НЕ требуется в A/B тестах для статистических проверок. Однако контекст и вид анализа определяют, когда оно может быть полезно.
1. Почему скалирование НЕ требуется в A/B тестах
A/B тестирование основано на статистических гипотезах, которые работают с сырыми метриками без трансформации:
from scipy import stats
import numpy as np
# Пример: сравнение конверсий
group_a = [1, 1, 0, 1, 0, 1, 1, 0, 1, 0] # Конверсия (1) или нет (0)
group_b = [1, 1, 1, 0, 1, 1, 0, 1, 1, 1]
# t-test работает со сырыми данными
t_stat, p_value = stats.ttest_ind(group_a, group_b)
print(f"t-stat: {t_stat:.3f}, p-value: {p_value:.3f}")
# Скалирование сюда не нужно — результат будет тот же!
Почему?
- Статистические тесты (t-test, chi-square, Mann-Whitney U) работают с относительными разностями между группами
- Масштаб данных не влияет на статистическую значимость
- Скалирование не изменяет p-value
2. Когда скалирование может быть полезно в A/B тестах
2.1 Анализ множественных метрик
Если вы сравниваете разные метрики с разными шкалами, скалирование помогает визуализировать:
import pandas as pd
# Метрики с разными шкалами
metrics = pd.DataFrame({
"Конверсия (%)": [2.5, 3.1],
"Среднее время (сек)": [45, 42],
"Лайки на пользователя": [0.8, 1.2]
}, index=["Группа A", "Группа B"])
# Для красивой визуализации нормализуем
metrics_scaled = (metrics - metrics.min()) / (metrics.max() - metrics.min())
print(metrics_scaled) # Теперь все в диапазоне [0, 1]
2.2 Машинное обучение поверх A/B результатов
Если вы используете ML модели для анализа A/B эффектов, то скалирование может помочь:
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
# Данные A/B теста с коварианами
X = np.array([
[1, 100, 25],
[0, 150, 30],
[1, 120, 28],
[0, 200, 35]
])
y = np.array([1, 0, 1, 0])
# Скалирование для ML моделей (рекомендуется)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
model = LogisticRegression()
model.fit(X_scaled, y)
3. Статистические тесты без скалирования
Для A/B тестирования используют:
from scipy.stats import ttest_ind, chi2_contingency, mannwhitneyu
# 1. T-test для непрерывных метрик
group_a_revenue = [100, 120, 95, 150, 110]
group_b_revenue = [140, 160, 130, 190, 120]
t_stat, p_val = ttest_ind(group_a_revenue, group_b_revenue)
print(f"T-test p-value: {p_val:.4f}")
# 2. Chi-square test для категориальных данных
contingency_table = np.array([
[50, 200],
[60, 190]
])
chi2, p_val, dof, expected = chi2_contingency(contingency_table)
print(f"Chi-square p-value: {p_val:.4f}")
# 3. Mann-Whitney U для ненормальных данных
group_a = [10, 20, 15, 25, 18]
group_b = [22, 28, 25, 35, 30]
u_stat, p_val = mannwhitneyu(group_a, group_b)
print(f"Mann-Whitney U p-value: {p_val:.4f}")
4. Эффект размера (Effect Size)
Эффект размера часто вычисляется без скалирования для интерпретируемости:
# Cohens d — относительная разница между группами
mean_a = np.mean(group_a)
mean_b = np.mean(group_b)
pooled_std = np.sqrt(((len(group_a)-1)*np.std(group_a, ddof=1)**2 +
(len(group_b)-1)*np.std(group_b, ddof=1)**2) /
(len(group_a) + len(group_b) - 2))
cohens_d = (mean_b - mean_a) / pooled_std
print(f"Cohens d: {cohens_d:.3f}")
5. Относительный лифт
# Прямое сравнение конверсий
conv_a = 0.03 # 3%
conv_b = 0.035 # 3.5%
uplift = (conv_b - conv_a) / conv_a * 100
print(f"Относительный лифт: {uplift:.1f}%") # 16.7%
Заключение
В классическом A/B тестировании скалирование НЕ требуется для:
- Проверки статистической значимости (t-test, chi-square)
- Вычисления p-value
- Оценки эффекта размера (Cohens d)
Скалирование полезно для:
- Визуализации результатов с разными шкалами
- ML моделей, построенных поверх A/B результатов
- Комбинирования нескольких метрик в один индекс
Правило: Если вы делаете статистический тест — скалирование не нужно. Если вы делаете ML анализ — скалирование рекомендуется. Если вы делаете визуализацию — скалирование помогает.