Как построить метрику, учитывающую сезонность и рост?
Построение метрики, учитывающей одновременно сезонность и рост, требует аккуратной декомпозиции временных рядов, нормализации показателей и понимания того, какие колебания в данных являются нормальными (сезонными), а какие — свидетельствуют о настоящем росте или падении. Такая метрика особенно важна для бизнеса с выраженными сезонными циклами: 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. Визуализация и отслеживание
Для построения метрики, понятной бизнесу, рекомендуется:
-
Отображать сырые и скорректированные значения на одном графике
-
Добавлять сезонные ленты (ожидаемые значения) на фоне
-
Отдельно показывать **тренд-компоненту
**
Это помогает бизнесу интерпретировать данные правильно: например, не паниковать из-за снижения в июле, если оно повторяется каждый год.
Метрика, учитывающая сезонность и рост, должна быть построена с учётом цикла бизнеса, частоты данных и доступного объёма истории. Такие метрики позволяют увидеть реальные изменения в эффективности и отделить маркетинговые или продуктовые эффекты от флуктуаций, обусловленных временем года или повторяющимися событиями.