Как построить метрику, учитывающую сезонность и рост?

Построение метрики, учитывающей одновременно сезонность и рост, требует аккуратной декомпозиции временных рядов, нормализации показателей и понимания того, какие колебания в данных являются нормальными (сезонными), а какие — свидетельствуют о настоящем росте или падении. Такая метрика особенно важна для бизнеса с выраженными сезонными циклами: e-commerce, финансы, туризм, образование, агросектор, фудтех и другие.

Что такое сезонность и рост

  • Сезонность — это повторяющиеся паттерны в данных, связанные с календарём: дни недели, месяцы, кварталы, праздники, климатические циклы. Примеры:

    • Пики заказов в пятницу и падение в понедельник

    • Рост в декабре (подарки), падение в январе (отрезвление рынка)

    • Снижение активности летом (отпуска)

  • Рост (trend) — это устойчивое долгосрочное изменение уровня показателя. Например:

    • Рост DAU (daily active users) из-за маркетинга

    • Постепенное увеличение заказов после редизайна

    • Падение удержания из-за выхода конкурента

Чтобы корректно оценить изменения метрик, нужно отделить рост от сезонных колебаний.

Пример бизнес-проблемы

Допустим, у вас метрика заказов по неделям:

Неделя Заказы
2024-W01 980
--- ---
2024-W02 1 200
--- ---
2024-W03 1 180
--- ---
2024-W04 970
--- ---
2025-W01 1 400
--- ---

В январе 2025 заказов больше, чем в январе 2024. Но это потому что вырос бизнес, или потому что каждый январь идёт сезонный всплеск? Как понять, был ли "реальный рост", а не просто повторение сезонного паттерна?

Подход к построению метрики, учитывающей сезонность и рост

1. Сравнение с прошлогодними (или прошлосезонными) значениями

Простейший метод — сравнивать метрику с её значением в аналогичный период прошлого года или цикла:

Seasonal Adjusted Growth (%) =
((Metric\[2025-W01\] - Metric\[2024-W01\]) / Metric\[2024-W01\]) × 100

Такой подход устраняет сезонный эффект, поскольку сравниваются одинаковые недели.

Плюсы:

  • Простая интерпретация

  • Подходит для годовой сезонности

Минусы:

  • Требуется достаточно длинная история данных

  • Не учитывает изменения внутри года

2. Скользящее окно + нормализация

Другой способ — использование скользящего окна и деление текущего значения на среднее значение за последние N аналогичных периодов:

Normalized Metric =
Current_Value / Rolling_Mean_Last_12_Weeks

Или:

Seasonally Adjusted Value =
Actual_Value / Seasonality_Index\[период\]

Пример: если известно, что в июле заказы на 20% ниже среднего по году, то индекс сезонности для июля = 0.8. Делим фактическое значение на 0.8 и получаем "скорректированный" результат.

3. Декомпозиция временного ряда: тренд + сезонность + шум

Можно разложить метрику во времени на три компонента:

Y(t) = T(t) + S(t) + R(t)

где:

  • Y(t) — наблюдаемое значение

  • T(t) — тренд (рост)

  • S(t) — сезонность (повторяющаяся структура)

  • R(t) — остаток/шум

Эта процедура называется декомпозицией временных рядов, и может быть реализована:

  • STL (Seasonal-Trend decomposition using Loess)

  • X11, X13 (для экономических данных)

  • Prophet (библиотека от Meta)

  • Facebook Kats, tsfresh, statsmodels

После этого можно анализировать T(t) как чистую компоненту роста, отдельно от сезонности. Пример:

from statsmodels.tsa.seasonal import seasonal_decompose
decompose_result = seasonal_decompose(series, model='additive', period=52)
trend = decompose_result.trend
seasonal = decompose_result.seasonal  

Это позволяет построить метрику "роста", которая не зависит от сезонных всплесков и падений.

4. Построение сезонно-скорректированной метрики

После извлечения сезонной компоненты можно пересчитать метрику:

Seasonally Adjusted Metric = Original - Seasonal_Component

Или (если модель мультипликативная):

Adjusted = Original / Seasonal_Component

Пример:

Месяц Заказы Сезонность Adjusted
Янв 1 200 0.9 1 333
--- --- --- ---
Фев 950 1.1 864
--- --- --- ---

Теперь можно сравнивать Adjusted-метрику между месяцами, не опасаясь искажения из-за сезонных пиков.

5. Индексы сезонности

Если исторических данных мало, можно построить эмпирический индекс сезонности, вычисляя относительное отклонение показателя от среднего за год:

Index\[Month\] = Avg_Metric\[Month\] / Avg_Metric\[Year\]

Эти индексы можно использовать для корректировки данных или визуализации отклонений.

6. Сглаживание: EMA, Holt-Winters, Prophet

Для оценки роста сквозь сезонность можно применять сглаживающие модели, которые учитывают:

  • Базовый уровень

  • Тренд

  • Сезонность

Пример — Holt-Winters triple exponential smoothing:

from statsmodels.tsa.holtwinters import ExponentialSmoothing
model = ExponentialSmoothing(data, trend="add", seasonal="add", seasonal_periods=12)
fit = model.fit()
forecast = fit.forecast(steps=12)

Эта модель не только прогнозирует, но и позволяет получить сглаженную трендовую компоненту — на её основе можно построить "индекс роста, очищенный от сезонности".

7. Построение композитной метрики: рост × сезонность

Можно явно построить метрику, которая сочетает:

  • Seasonal Index — индекс времени, в котором ожидается сезонный рост

  • Growth Delta — изменение метрики относительно предыдущих аналогичных периодов

Composite Score = (Current - Seasonally Expected) / Seasonally Expected

Пример: если в августе обычно 10 000 заказов, а сейчас — 12 000, то:

(12 000 - 10 000) / 10 000 = +20%

Это и есть "избыточный рост", сверх нормального сезонного уровня.

8. Календарные факторы: праздники, акции, выходные

Чтобы учесть не только сезонность, но и эффекты типа:

  • Black Friday, Новый год

  • Промо и скидки

  • Спецмероприятия

Можно включать бинарные регрессоры в модель:

Y = β0 + β1 × Trend + β2 × Season + β3 × Holiday + β4 × Promo + ε

Это позволяет объяснить "скачки" в метрике не как тренд или сезон, а как разовые эффекты.

9. Визуализация и отслеживание

Для построения метрики, понятной бизнесу, рекомендуется:

  • Отображать сырые и скорректированные значения на одном графике

  • Добавлять сезонные ленты (ожидаемые значения) на фоне

  • Отдельно показывать **тренд-компоненту
    **

Это помогает бизнесу интерпретировать данные правильно: например, не паниковать из-за снижения в июле, если оно повторяется каждый год.

Метрика, учитывающая сезонность и рост, должна быть построена с учётом цикла бизнеса, частоты данных и доступного объёма истории. Такие метрики позволяют увидеть реальные изменения в эффективности и отделить маркетинговые или продуктовые эффекты от флуктуаций, обусловленных временем года или повторяющимися событиями.