Временной ряд простыми словами

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Зачем это знать

Временные ряды — половина работы аналитика. Daily DAU, monthly revenue, hourly request rate — всё это time series. Без понимания тренда, сезонности и стационарности вы не поймёте, упал ли metric реально или это обычный weekly dip.

На собесе часто задачи по time series: «как учесть сезонность», «что такое moving average», «как прогнозировать». Middle-аналитик обязан знать основы.

В статье:

  • Что такое time series
  • Компоненты: trend, seasonality, cyclicality, noise
  • Стационарность
  • Visualization time series
  • Базовые методы: moving average, differencing

Короткое объяснение

Time series (временной ряд) — последовательность значений метрики во времени через равные интервалы.

Примеры:

  • DAU по дням
  • Revenue по месяцам
  • Кол-во обращений в саппорт по часам

Компоненты

Time series обычно разлагается на 4 компонента:

1. Trend (тренд)

Долгосрочное направление. Revenue растёт год к году — positive trend.

2. Seasonality (сезонность)

Регулярные повторения. Заказы еды в 19:00 каждый день. Продажи выше в декабре.

Периоды:

  • Daily (рассветные spikes)
  • Weekly (weekend vs weekdays)
  • Monthly (начало месяца vs конец)
  • Yearly (декабрь sales)

3. Cyclicality

Нерегулярные долгие циклы (экономические). Crisis → recovery → growth → peak → contraction.

Отличается от seasonality отсутствием fixed period.

4. Noise (шум)

Случайная составляющая. «Шумит» всегда.

Decomposition

Additive: y = trend + seasonality + noise.

Multiplicative: y = trend × seasonality × noise (когда амплитуда растёт с trend).

В Python:

from statsmodels.tsa.seasonal import seasonal_decompose

result = seasonal_decompose(df['revenue'], model='additive', period=7)
result.plot()

Получаете 4 subplots: original, trend, seasonal, residual.

Стационарность

Стационарный ряд — его статистики (mean, variance) не зависят от времени.

Non-stationary:

  • Растущий trend (mean растёт)
  • Growing variance

Многие модели (ARIMA) требуют стационарности. Если ряд non-stationary, делают differencing — разница между соседними значениями.

Тест стационарности

Augmented Dickey-Fuller test:

from statsmodels.tsa.stattools import adfuller

result = adfuller(df['revenue'])
print('p-value:', result[1])
# p < 0.05 → stationary

Базовые методы

Moving average

Сглаживание для визуализации trend:

df['ma_7'] = df['revenue'].rolling(7).mean()
df['ma_30'] = df['revenue'].rolling(30).mean()

Differencing

Убрать trend:

df['diff'] = df['revenue'].diff()

Seasonal differencing

Убрать seasonality:

df['seasonal_diff'] = df['revenue'].diff(7)  # разница с неделей назад

Forecasting методы

Simple

  • Naive: y_t+1 = y_t
  • Mean: y_t+1 = mean(all y)
  • Seasonal naive: y_t+1 = y_{t+1-season}

Statistical

  • Exponential smoothing (Holt-Winters) — учитывает trend + seasonality
  • ARIMA — классика
  • SARIMA — ARIMA + seasonal

ML

  • Prophet (Facebook) — простой, хороший default
  • XGBoost / LightGBM — на feature-engineered time series
  • LSTM, Transformer — deep learning

Типовые задачи для аналитика

1. Trend анализ

«Растёт ли DAU в долгую?» — moving average, decomposition.

2. Anomaly detection

«Сегодня metric необычно?» — Z-score на residual после decomposition.

3. Forecasting

«Сколько заказов будет в следующем месяце?» — ARIMA, Prophet.

4. Causal (A/B c time-aware)

«Вырос ли metric после релиза?» — interrupted time series analysis, difference-in-differences.

В продуктовой аналитике

Особенности:

Weekly seasonality — всегда

Пользователи по-разному ведут себя в будни и выходные. В анализе учитывайте.

Holiday effects

Новый год, 8 марта, летние каникулы — все влияют.

Marketing calendar

Campaigns / launches создают «шипы». Нормально, но нужно различать от органических spikes.

На собесе

«Что такое time series?» Данные во времени через равные интервалы.

«Компоненты?» Trend, seasonality, cyclicality, noise.

«Стационарность?» Статистики не меняются во времени.

«Как прогнозировать?» ARIMA, Prophet, ML на features.

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

1. Игнорировать seasonality

«DAU упал на 30% в субботу» — возможно, weekend эффект, не реальное падение.

2. Mean across time

Mean по всему ряду часто бессмысленен. Используйте moving average.

3. Train/test split random

Для time series нужен time-aware split (обучаетесь на прошлом).

4. Игнорировать autocorrelation

В time series соседние значения correlated. Это ломает многие assumptions.

Связанные темы

FAQ

Stationary обязательно?

Для ARIMA — да. Для Prophet / ML — нет.

Prophet или ARIMA?

Prophet проще для аналитика (меньше параметров). ARIMA точнее на регулярных рядах.

Как детектировать anomaly?

Z-score на residual после decomposition. Или специальные методы (Twitter's ADVec).

Daily vs weekly aggregation?

Daily — больше данных, шумнее. Weekly — стабильнее, меньше точек.


Тренируйте time series — откройте тренажёр с 1500+ вопросами для собесов.