Как распределять данные по батчам для оценки статистик с учетом сезонности и нагрузки
Что проверяют
Понимаете ли вы, что способ нарезки данных влияет на саму оценку, а не только на скорость расчёта. Нужно показать, как сезонность искажает батчевые оценки и как объединять результаты батчей без ошибок. Следом часто спрашивают про квантили: их тоже можно усреднить по батчам?
Как отвечать
Разделите вопрос на две части: статистическая корректность и нагрузка.
- сезонность: если батч это случайный день или неделя, его среднее отражает сезон, а не всю совокупность. Варианты: батч из полных сезонных циклов (целые недели при недельной сезонности), стратификация по сезонному признаку (день недели, час, месяц) с весами страт, либо снятие сезонности через STL-декомпозицию и работа с остатками;
- зависимость наблюдений: соседние точки временного ряда коррелированы. Для доверительных интервалов вместо обычного бутстрэпа берут блочный, где блок не рвёт сезонный цикл;
- объединение: средние батчей разного размера нельзя просто усреднять, нужны веса или суммы со счётчиками. Дисперсию собирают из частичных сумм по формулам Чана или алгоритмом Уэлфорда, квантили через скетчи вроде t-digest, число уникальных через HyperLogLog. Такие статистики считаются по батчам и корректно сливаются;
- нагрузка: данные партиционируют по дате, но пики (распродажи, праздники) дают перекошенные партиции. Их дробят по числу строк или хэшу ключа, размер батча подбирают под память воркера. Параллелят через Spark или Dask, тяжёлые пересчёты переносят на часы низкой нагрузки источника;
- проверка: сравнить оценку по батчам с полным расчётом на небольшой выборке.
Для A/B-тестов то же правило: длительность кратна полному недельному циклу.
Где спотыкаются
Перемешивают временной ряд случайно и считают дисперсию как для независимых данных. Интервалы получаются слишком узкими.
Усредняют средние или медианы батчей. При разных размерах это смещённая оценка, а медиана медиан вообще не медиана.
Режут по дням, не глядя на объём. День распродажи бывает в разы тяжелее обычного, и один воркер держит весь расчёт.