Короткий ответ
Для корректного YoY-сравнения нужно сопоставлять эквивалентные по сезонности периоды (например, тот же календарный месяц или ту же неделю относительно праздников), а не просто одинаковые по номеру даты периоды, так как расположение праздников и рабочих дней может сдвигаться между годами.
Как это работает подробнее
сезонные паттерны (праздники, распродажи, начало учебного года) влияют на метрики систематически и предсказуемо; если не учитывать это, рост или падение метрики легко спутать с реальным трендом, хотя оно объясняется календарным сдвигом.
Пример кода
Пример на Python
import pandas as pd
import statsmodels.api as sm
ts = pd.read_csv('daily_sales.csv', index_col='date', parse_dates=True)['sales']
decomposition = sm.tsa.seasonal_decompose(ts, model='additive', period=365)
trend = decomposition.trendЧто использовать на практике
- На практике. подходы к учёту сезонности включают сравнение «тот же месяц прошлого года» вместо скользящего окна, декомпозицию ряда на тренд/сезонность/остаток (например, STL-декомпозиция) для выделения «чистого» тренда, и сравнение показателя с учётом выравнивания по дням недели, если важны будни/выходные. Для компаний с нерегулярными акциями (распродажи, которые не привязаны к фиксированной дате) сезонная компонента может быть ещё сложнее и требовать ручной разметки периодов. Также полезно при анализе сезонных эффектов учитывать, что в компаниях с международной аудиторией праздники в разных странах наступают в разное время, и агрегированный по всем странам ряд может усреднять несколько разных сезонных пиков.
- Пример. Sanity check: сравнить YoY-изменение по сырым продажам и по trend-компоненте после декомпозиции — если выводы о направлении тренда различаются, значит сезонность существенно искажала первоначальное сравнение.
Подводные камни
- Частые ошибки. сравнивать выручку в декабре с выручкой в январе и делать вывод о «падении» бизнеса, игнорируя предновогодний пик; сравнивать текущий квартал с прошлым годом без поправки на разное количество рабочих дней или смещение дат праздников (например, Пасха в разные годы выпадает на разные месяцы); использовать простое YoY без визуализации полного ряда за несколько лет, что скрывает повторяющийся паттерн. Ещё одна ошибка — применять декомпозицию с фиксированным периодом сезонности (например, 365 дней) к рядам, где сезонность на самом деле привязана к переменным датам (например, религиозные праздники по лунному календарю).