Что делаешь после раскатки A/B теста?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что я делаю после раскатки A/B теста (post-launch analysis)
Пост-запуск теста — это не конец, а начало. Вот мой процесс.
День 1: Immediate Monitoring
Что я проверяю:
- Technical correctness
- Рандомизация работает? (50/50 split?)
- Tracking работает? (events пишутся?)
- Нет ли технических проблем?
SELECT
variant,
COUNT(DISTINCT user_id) as users,
COUNT(*) as total_events
FROM test_tracking
WHERE test_id = 'checkout_button_color'
GROUP BY variant;
Если Control и Treatment не 50/50 → проблема с рандомизацией.
-
Data quality
- Нет ли null values?
- Нет ли impossible values?
- Распределение выглядит нормально?
-
Early signals
- Первые данные показывают что-то интересное?
- Есть ли anomalies?
- Нужен ли rollback?
Пример dashboard:
Test: Checkout Button (Green vs Red)
Status: RUNNING (1 day in)
Sample: Control 1K, Treatment 1K
Conversion Rate:
- Control: 10% (100 conversions)
- Treatment: 12% (120 conversions)
- Difference: +2%
- P-value: 0.25 (NOT significant yet)
Note: Too early to conclude, sample too small
Неделя 1-2: Stabilization Check
Что я проверяю:
-
Stability of effect
- В первый день +2%, в третий день -1%?
- Есть ли флуктуации?
- Или стабильно растёт/падает?
-
Secondary metrics
- Первичная метрика растёт, но не broke ли secondary?
SELECT
variant,
DATE(timestamp) as day,
COUNT(DISTINCT CASE WHEN converted = 1 THEN user_id END) / COUNT(DISTINCT user_id) as conversion_rate,
AVG(revenue) as avg_revenue,
AVG(CASE WHEN bounced = 1 THEN 1 ELSE 0 END) as bounce_rate
FROM test_tracking
WHERE test_id = 'checkout_button_color'
GROUP BY variant, DATE(timestamp)
ORDER BY day, variant;
Пример хорошего результата:
Control: Conv 10%, Revenue $50, Bounce 20%
Treatment: Conv 12%, Revenue $48, Bounce 22%
Plus: +2% conversion
Minus: -$2 revenue, +2% bounce
Conclusion: Mixed, but primary metric up
- Segment analysis
- Эффект одинаков для всех?
- Может быть effect только для mobile, но не desktop?
SELECT
variant,
device,
COUNT(DISTINCT user_id) as users,
ROUND(100.0 * SUM(converted) / COUNT(*), 2) as conversion_rate
FROM test_tracking
GROUP BY variant, device;
Пример:
Control Desktop: 11%
Treatment Desktop: 11% (no effect)
Control Mobile: 8%
Treatment Mobile: 15% (+7% effect)
Conclusion: Effect only on mobile!
Action: Decide if to launch only on mobile
Неделя 2-4: Statistical Significance
В конце теста, я провожу полный анализ.
Chi-square test:
from scipy.stats import chi2_contingency
control_conversions = 1000
control_total = 10000
treatment_conversions = 1200
treatment_total = 10000
chi2, pval, dof, expected = chi2_contingency([
[control_conversions, control_total - control_conversions],
[treatment_conversions, treatment_total - treatment_conversions]
])
print(f"P-value: {pval}")
print(f"Significant at 0.05: {pval < 0.05}")
print(f"Effect size: +{(treatment_conversions/treatment_total - control_conversions/control_total)*100:.1f}%")
Пример results:
P-value: 0.012 (< 0.05, SIGNIFICANT)
Effect size: +2%
Confidence: 95% confident effect is between 1% and 3%
Decision: LAUNCH (statistically significant and practically meaningful)
День запуска результата: Decision Meeting
Что я готовлю:
-
Summary slide:
- Гипотеза: "Зелёная кнопка повысит конверсию"
- Результат: "Да, +2% конверсия, p=0.012"
- Recommendation: "Запустить для всех"
-
Detailed analysis:
- Performance by segment (mobile, desktop, geo, etc)
- Effect size and confidence interval
- Secondary metrics impact
- Revenue impact (если applicable)
-
Risk assessment:
- Есть ли negative effects?
- Есть ли долгосрочные concerns?
- Есть ли rollback plan если что-то пойдёт не так?
Post-Launch (После запуска)
Если тест прошёл и мы запускаем для всех:
День 1-7: Санитарное проверение
-- Проверка что запуск работает правильно
SELECT
'Before test' as period,
COUNT(DISTINCT user_id) as users,
ROUND(100.0 * SUM(converted) / COUNT(*), 2) as conversion_rate
FROM all_data
WHERE timestamp < '2024-01-01'
UNION ALL
SELECT
'After launch' as period,
COUNT(DISTINCT user_id) as users,
ROUND(100.0 * SUM(converted) / COUNT(*), 2) as conversion_rate
FROM all_data
WHERE timestamp >= '2024-01-01';
Ожидаемый результат:
Before test: 10% (control baseline)
After launch: 12% (treatment effect applies to all)
If not matching: investigate why
День 7-30: Longer-term tracking
Часто effect diminishes со временем (novelty wear-off):
- День 1-3: +3% конверсия
- День 4-7: +2.5% конверсия
- День 8-14: +1.5% конверсия
- День 15+: +0.5% конверсия
Это нормально. Даже +0.5% долгосрочно ценен.
Документация результата
Я создаю post-mortem документ:
# A/B Test: Checkout Button Color
## Summary
- Гипотеза: Зелёная кнопка улучшит конверсию
- Результат: ✅ SUCCESSFUL
- Effect: +2% конверсия (10% → 12%)
- P-value: 0.012 (статистически значим)
- Revenue impact: +$100K/год
## Execution
- Duration: 2 weeks
- Sample size: 20K users per variant
- Segments: Desktop (+1%), Mobile (+3%)
## Learning
- Зелёный цвет more actionable чем красный
- Effect stronger on mobile (users tap quicker)
- No negative impact on other metrics
## Next steps
1. Запустили для всех
2. Monitor 30 days for long-term effect
3. A/B test next button element (copy, size)
Этот документ живёт в Confluence и становится knowledge base.
Как я использую результаты для следующих экспериментов
Learnings применяю:
-
Color psychology:
- Green лучше red для CTAs
- Буду использовать для других button tests
-
Mobile vs Desktop:
- Mobile users respond faster (меньше thinking)
- Desktop users need more convincing
- Буду тестировать по-отдельности
-
Sample size estimation:
- Зная что effect size +2%
- Могу дальше рассчитать нужный sample для новых тестов
- Экономит время в запуске
Типичные ошибки которые я вижу
Ошибка 1: Запуск без post-analysis
"Тест показал +2%, давайте запустим"
НО НЕ проверяли:
- Есть ли segment где效果 negative?
- Есть ли secondary metric problems?
- Статистически ли это значимо?
**Ошибка 2: Дальше запуска
"Запустили тест 2 месяца назад, не знаю результат"
Тест не работает если его забыть. Нужно monitor.
Ошибка 3: Не документировать
"Мы знаем что green кнопка работает"
НО в новом году, новый PM, новый engineer. Откуда они знают?
Документация = knowledge база.
Мой process в одном файле
Итерация A/B теста:
├─ Планирование: определить гипотезу, sample size
├─ Запуск: рандомизация, tracking
├─ Мониторинг неделя 1-2: техдолги, ранние сигналы
├─ Анализ неделя 2-4: статистический тест, segmentation
├─ Decision: запустить или kill?
├─ Launch: для всех юзеров
├─ Post-launch неделя 1-4: санитарная check, долгосрочный effect
└─ Документация: learnings и next steps
Главный совет
Тест не заканчивается когда у тебя есть p-value. Тест заканчивается когда ты понял почему тест сработал, применил lessons, и запустил следующий тест.
Это цикл. Improvement это process, не event.