Короткий ответ
Нужно посчитать кумулятивное число пользователей и конверсий по каждой группе на каждый день теста с помощью оконной функции с накоплением (running total), а затем вычислить кумулятивную конверсию на каждую дату.
Как это работает подробнее
Как это работает: оконная функция SUM(...) OVER (PARTITION BY group ORDER BY event_date) накапливает значения по датам внутри группы, что позволяет на каждый день теста видеть, как менялась бы итоговая конверсия, если бы тест остановили именно на этот день.
Ожидаемый результат: по строке на группу и дату с растущими cum_users и плавно меняющейся cum_cr; sanity check — cum_users должен монотонно не убывать по датам внутри группы.
Пример кода
query.sql
SELECT
group_name,
event_date,
SUM(users) OVER (PARTITION BY group_name ORDER BY event_date) AS cum_users,
SUM(conversions) OVER (PARTITION BY group_name ORDER BY event_date) AS cum_conversions,
SAFE_DIVIDE(
SUM(conversions) OVER (PARTITION BY group_name ORDER BY event_date),
SUM(users) OVER (PARTITION BY group_name ORDER BY event_date)
) AS cum_cr
FROM `project.dataset.ab_daily_agg`
ORDER BY group_name, event_date;Что использовать на практике
- На практике: такой график полезен для диагностики (например, видно ли затухание эффекта или нестабильность в начале теста), но не должен использоваться для принятия финального решения на промежуточной точке — это тот же риск peeking, если не контролировать его отдельно.
Подводные камни
- Частые ошибки: использование кумулятивного графика для досрочной остановки теста при первом пересечении значимости — визуализация динамики полезна для мониторинга, но не заменяет заранее зафиксированный план по длительности.