Тренд, сезонность, цикл и шум

Раскладываем любой ряд на четыре кирпичика: устойчивое направление, повторяющийся паттерн, длинные волны и случайность.

Декомпозиция — представление ряда как суммы (или произведения) тренда, сезонности и шума: x_t = trend + season + noise.

Зачем разбирать ряд на части

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

Возьмём практический пример — прогноз спроса в продуктовом магазине. Менеджер видит, что выручка в декабре подскочила. Но это рост бизнеса или просто новогодний всплеск, который схлынет в январе? Без декомпозиции эти два объяснения неразличимы, и закупка товара на основе «декабрьского» уровня обернётся затаренными складами в феврале. Разложив ряд, мы отделяем устойчивый тренд (на него опираемся при стратегических решениях) от сезонного пика (его учитываем только в краткосрочном плане закупок).

Тот же подход выручает при анализе веб-трафика. Резкое падение посещаемости в выходные пугает новичка, но если это стабильный недельный паттерн, паниковать не о чем — а вот плавное снижение тренда из недели в неделю уже сигнал к действию. Декомпозиция превращает «ряд скачет, ничего не понятно» в набор отдельных, понятных историй: куда движется бизнес в целом, как дышит неделя или год, и сколько в данных просто случайного дребезга.

Четыре компоненты

Тренд — медленное устойчивое направление: рост выручки год за годом. Сезонность — паттерн с фиксированным периодом: пик продаж каждую субботу, спад каждый январь. Цикл — длинные волны без жёсткого периода: экономические подъёмы и спады. Шум — необъяснимая случайность, остаток после вычитания всего предсказуемого.

Полезная аналогия — звук. Тренд это как медленное нарастание громкости в зале, сезонность — ровный ритм басовой партии, цикл — длинные нарастания и затухания целых музыкальных фраз, а шум — фоновое шипение, в котором нет мелодии. Ухо умеет раскладывать всё это автоматически; в анализе рядов мы учим тому же компьютер. Важно, что границы между компонентами условны: то, что в коротком ряду выглядит трендом, на длинной истории может оказаться частью медленного цикла. Поэтому горизонт наблюдения всегда влияет на интерпретацию.

Складываем ряд из компонент

Лучший способ почувствовать декомпозицию — собрать ряд самому из тренда, сезонности и шума, а потом посмотреть на сумму.

import math

# фиксированный «шум», чтобы пример всегда давал один результат
noise = [2, -3, 1, 4, -2, 3, -1, 2, -4, 1, 3, -2]

series = []
for t in range(12):
    trend = 100 + 3 * t                    # линейный рост
    season = 20 * math.sin(2*math.pi*t/4)  # период 4
    series.append(round(trend + season + noise[t], 1))

print(series)
print("Первое:", series[0], " Последнее:", series[-1])

Вывод:

[102.0, 120.0, 107.0, 93.0, 110.0, 138.0, 117.0, 103.0, 120.0, 148.0, 133.0, 111.0]
Первое: 102.0  Последнее: 111.0

Видно и общий рост (тренд), и волну с периодом 4 (сезонность), и дрожание (шум). Реальные данные приходят к нам уже сложенными — наша работа разложить их обратно.

Обратите внимание на устройство кода: каждая строка цикла буквально повторяет формулу x_t = trend + season + noise. Тренд задан как 100 + 3·t — стартовый уровень 100 и прибавка 3 за каждый шаг. Сезонность — синусоида с периодом 4, то есть полный цикл укладывается ровно в четыре точки. Шум взят из заранее заданного списка, чтобы пример был воспроизводимым: на реальных данных эту роль играет настоящая случайность. Когда вы разбираете чужой ряд, вы делаете обратную операцию — по готовой сумме угадываете, какими были слагаемые. Именно поэтому полезно один раз собрать ряд вручную: вы запоминаете, как выглядит «чистый» вклад каждой компоненты, и потом узнаёте их в живых данных.

Аддитивная и мультипликативная модель

Если амплитуда сезонности постоянна, ряд аддитивный: компоненты складываются. Если же колебания растут вместе с уровнем (чем выше продажи, тем сильнее качает) — ряд мультипликативный: x_t = trend × season × noise. Мультипликативный часто превращают в аддитивный логарифмированием.

Как выбрать модель на практике? Посмотрите на «талию» сезонных волн вдоль ряда. Если предновогодние пики из года в год примерно одинаковой высоты в абсолютных рублях — модель аддитивная. Если же по мере роста бизнеса каждый пик становится всё выше, а провалы всё глубже, и волна как бы расширяется веером — модель мультипликативная. Розничные продажи почти всегда мультипликативны: магазин, торгующий на миллион в месяц, и магазин на десять миллионов дают сезонный всплеск в +15%, а не на одну и ту же фиксированную сумму. Логарифмирование тут — удобный трюк: после взятия логарифма произведение превращается в сумму, и к ряду снова применимы простые аддитивные методы.

Как работает под капотом

Алгоритмы декомпозиции сначала оценивают тренд сглаживанием (скользящим средним), вычитают его, затем усредняют остаток по позициям внутри периода — получают сезонную компоненту. То, что осталось после вычитания тренда и сезонности, объявляется шумом. Если в шуме всё ещё видна структура — модель компонент выбрана плохо.

Разберём подробнее шаг с сезонностью. Допустим, период равен 12 (месяцы). После вычитания тренда у нас остаётся ряд, в котором, если модель верна, январи похожи на январи, июли на июли и так далее. Алгоритм собирает все январские остатки в одну корзину и усредняет их, все февральские — в другую, и так двенадцать корзин. Усреднение гасит случайный шум (он в среднем около нуля) и оставляет чистый сезонный профиль. Этот профиль затем повторяют по всему ряду. Логика проста: то, что стабильно повторяется на одной и той же позиции периода, — сезонность; то, что не повторяется, — шум. Современные методы (например STL) делают то же, но аккуратнее: позволяют сезонному профилю медленно меняться со временем и устойчивы к выбросам, потому что используют робастное сглаживание вместо обычного среднего.

Частые ошибки

  • Путать сезонность (фиксированный период) и цикл (плавающие длинные волны).
  • Применять аддитивную модель к ряду с растущей амплитудой — остаток будет «дышать».
  • Считать любой остаток чистым шумом, не проверив его на остаточную структуру.
  • Подбирать период сезонности «на глаз» вместо проверки по календарю предметной области (неделя, месяц, год).
  • Забывать, что на коротком ряде тренд и медленный цикл неотличимы, и переносить выводы на длинный горизонт.

Итоги

  • Ряд = тренд + сезонность + цикл + шум (или их произведение).
  • Сезонность имеет фиксированный период; цикл — длинные волны без жёсткого периода.
  • Аддитивная модель — постоянная амплитуда, мультипликативная — растущая.
  • Декомпозиция нужна не ради красоты, а чтобы моделировать и прогнозировать каждую компоненту отдельно.
  • Хорошая декомпозиция оставляет в шуме структуру не больше, чем в чистой случайности — это и есть критерий качества.
Проверьте себя
1. Чем сезонность отличается от цикла?
AНичем, это синонимы
BСезонность имеет фиксированный период, цикл — плавающие длинные волны
CЦикл короче сезонности
DСезонность всегда случайна
2. Когда ряд лучше описывается мультипликативной моделью?
AКогда амплитуда сезонности постоянна
BКогда колебания растут вместе с уровнем ряда
CКогда нет тренда
DКогда данных мало