Какие знаешь сезонности?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Сезонности: типы, анализ и применение
Определение
Сезонность — это регулярные, предсказуемые колебания метрик в зависимости от времени. Это может быть день недели, время года, праздники или даже часы дня. Для Product Analyst понимание сезонностей критично для:
- Прогнозирования на будущее
- Планирования инфраструктуры
- Выявления настоящих тредов vs. шума
- Справедливого сравнения периодов
Типы сезонностей
1. Дневная сезонность (Intraday Seasonality)
Определение: Колебания метрик в течение дня.
Примеры:
- Telegram: Пик активности 19:00-22:00 (после работы), спад 2:00-6:00 (ночь)
- LinkedIn: Пик 9:00-11:00 (утро в офисе), пик 18:00-20:00 (конец рабочего дня)
- Instagram: Пик 12:00-13:00 (обед), пик 20:00-23:00 (вечер дома)
Паттерн:
АКТИВНОСТЬ
|
| ╱╲ ╱╲
| ╱ ╲ ╱ ╲
| ╱ ╲ ╱ ╲
|___╱ ╲__╱ ╲___
0:00 12:00 18:00 24:00
Минимум: 2:00-6:00
Максимум: 19:00-22:00
Как использовал: При планировании maintenance. Никогда не проводим деплойменты в 19:00-22:00 — будет лагать для большинства пользователей.
2. Еженедельная сезонность (Weekly Seasonality)
Определение: Различия в активности по дням недели.
Типичный паттерн для мессенджеров:
АКТИВНОСТЬ
Пт ████████████ (максимум — выходные начинаются)
Сб ███████████ (высокая)
Вс ███████████ (высокая, но немного ниже Сб)
Пн ██████████ (средняя — начало рабочей недели)
Вт ██████████ (средняя)
Ср ██████████ (средняя)
Чт ██████████ (средняя, немного выше)
Почему так:
- Выходные: люди дома, больше времени на соцсети
- Будни: люди на работе, общение через мессенджер, но меньше открывают приложение (пишут коллегам)
Аномалия — праздники:
Пт (в день Рождества) █████░░░░░░░░
(СПАД, все пьют)
Пн (День независимости) █████░░░░░░░░
(СПАД, выходной)
Как использовал: При анализе A/B теста заметил, что воскресенье имеет на 10% выше конверсию. Сначала подумал, это баг. Потом понял — это паттерн. Разделил тест на выходные и будни, чтобы результаты были чистыми.
3. Месячная сезонность (Monthly Seasonality)
Определение: Колебания в зависимости от дня месяца.
Паттерны:
Начало месяца (1-7 дни):
- Зарплата → люди имеют деньги → выше конверсия Premium
- DAU обычно на пике
Середина месяца (8-21 дни):
- Нормальная активность
- Деньги с зарплаты тратятся
Конец месяца (22-30 дни):
- Спад активности (заканчиваются деньги)
- Меньше покупок
- Но может быть пик за день-два до конца месяца (последний шанс потратить)
КОНВЕРСИЯ PREMIUM
|
3% | ╱╲ ╱╲
| ╱ ╲_ ╱ ╲
2% |╱ ╲╲ ╱ ╲_
| ╲╲___╱ ╲╲
1% | ╱╱╲ ╲╲
|_____|___|____|____|__| (месяц)
1 10 20 30
начало конец
Как использовал: Планировал запуск Premium фичи на начало месяца (5-7 число), когда у людей есть деньги.
4. Квартальная и годовая сезонность (Seasonal Patterns)
Определение: Большие сдвиги в течение года.
Примеры:
Q1 (Январь-Март):
- New Year's Resolution — люди начинают использовать приложения для саморазвития
- Back-to-school (в конце февраля/марте в разных странах)
- Зима в северном полушарии → больше времени дома
Q2 (Апрель-Июнь):
- Весна → люди выходят на улицу → меньше активности в приложении
- Летние каникулы начинаются → туризм
Q3 (Июль-Сентябрь):
- Лето → отпуска, путешествия → спад
- Back-to-school (август/сентябрь) → пик для образовательных приложений
Q4 (Октябрь-Декабрь):
- Чёрная пятница (ноябрь) → всплеск
- Рождество (декабрь) → люди покупают подарки → online активность
- Новый год → пиковая активность (Декабрь 28-31)
DAU ПО КВАРТАЛАМ
|
| ╱╲ ╱╲ ╱╲
|╱ ╲ ╱ ╲ ╱ ╲ ╱╲
| ╲_╱ ╲____╱ ╲___╱ ╲___
|────────────────────────────────────
Q1 Q2 Q3 Q4
Боль моего опыта: Запустили большую фичу в августе. DAU упал на 15% в сентябре. Сначала думал, это баг. Потом понял — это сезонность back-to-school. Все в школе, нет времени. Правильнее было бы запустить в январе.
5. Событийная сезонность (Event-based Seasonality)
Определение: Скачки активности в связи с конкретными событиями.
Примеры:
Глобальные события:
- Чёрная пятница → +300% трафика, +200% конверсии
- Киберпонедельник → +250% трафика
- Рождество → +180% трафика (декабрь 20-26)
- Новый год → +150% трафика (декабрь 28 - январь 3)
Локальные праздники:
- День независимости США (4 июля) → спад (выходной, люди на природе)
- День благодарения (Thanksgiving) → спад
- Пасха → спад в христианских странах
- Рамадан → спад (в мусульманских странах, люди постятся, меньше активности)
Региональные спорт события:
- Чемпионат мира по футболу (июнь-июль) → спад активности, люди смотрят матчи
- Олимпиада → спад
- Суперкубок (февраль) → спад в США
Технологические события:
- Apple WWDC (июнь) → всплеск интереса к iOS
- Google I/O (май) → всплеск интереса к Android
- Release день нового iOS/Android → спад (люди обновляют, приложение может сломаться)
Как использовал: Перед Black Friday подготовил инфраструктуру на 3х обычную нагрузку. В день события всё работало smoothly, конкуренты упали. Результат: +50% нового трафика.
6. Корпоративные события
Определение: События внутри компании, которые влияют на метрики.
Примеры:
- Деплойменты новой фичи → может быть скачок или спад DAU
- Ценовые изменения → сразу видна реакция (конверсия вверх/вниз)
- Реклама и маркетинг → всплеск новых пользователей
- Bug fixes → улучшение метрик (retention, DAU)
- Breaking changes → спад (пользователи уходят из-за баги)
Как использовал: После деплоя новой версии DAU упал на 8%. Это не сезонность, это баг. Откатили версию, DAU вернулись в норму. Вывод: всегда смотрю timeline деплойментов при анализе аномалий.
Как анализировать сезонности
Метод 1: Visual Inspection (глазом)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('daily_metrics.csv', parse_dates=['date'])
plt.figure(figsize=(15, 4))
plt.plot(df['date'], df['dau'], linewidth=2)
plt.title('DAU Trend')
plt.xlabel('Date')
plt.ylabel('Daily Active Users')
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
Преимущество: Быстро видишь паттерны.
Метод 2: Seasonal Decomposition
from statsmodels.tsa.seasonal import seasonal_decompose
df.set_index('date', inplace=True)
# Разложить на компоненты: Trend + Seasonality + Residuals
decomposition = seasonal_decompose(df['dau'], model='additive', period=7) # 7 дней
fig, axes = plt.subplots(4, 1, figsize=(15, 8))
df['dau'].plot(ax=axes[0], title='Original')
decomposition.trend.plot(ax=axes[1], title='Trend')
decomposition.seasonal.plot(ax=axes[2], title='Seasonal (7-day)')
decomposition.resid.plot(ax=axes[3], title='Residual (noise)')
plt.tight_layout()
plt.show()
Результат:
Original: ╱╲╱╲╱╲╱╲ (волны)
Trend: ╱╱╱╱╱╱╱╱ (долгосрочный тренд)
Seasonal: ╱╲╱╲╱╲╱╲ (еженедельная волна)
Residual: ╱ ╲ ╱ ╲ ╱ (шум)
Метод 3: Year-over-Year (YoY) Comparison
# Сравнить неделю 1 этого года с неделей 1 прошлого года
this_year = df[df['date'].dt.year == 2024]
last_year = df[df['date'].dt.year == 2023]
# Выровнять по дню недели
this_year['day_of_week'] = this_year['date'].dt.dayofweek
last_year['day_of_week'] = last_year['date'].dt.dayofweek
comparison = this_year.merge(
last_year[['day_of_week', 'dau']],
on='day_of_week',
suffixes=('_2024', '_2023')
)
comparison['yoy_growth'] = (comparison['dau_2024'] - comparison['dau_2023']) / comparison['dau_2023'] * 100
print("YoY comparison by day of week:")
print(comparison[['day_of_week', 'dau_2023', 'dau_2024', 'yoy_growth']])
Преимущество: Видишь истинный рост, убрав шум сезонности.
Метод 4: Индексация (Indexing)
# Нормализовать все значения к базовому периоду (среднее)
baseline = df['dau'].mean()
df['dau_index'] = df['dau'] / baseline * 100
# Теперь видишь "+10%" или "-5%" вместо абсолютных чисел
Как использовать сезонности в работе
Прогнозирование
# ARIMA с сезонностью
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(df['dau'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 7))
fitted = model.fit()
forecast = fitted.get_forecast(steps=14) # На 2 недели
print("Прогноз DAU на следующие 14 дней:")
print(forecast.predicted_mean.round(0))
Справедливое сравнение
# Не сравнивай среду в неделю 1 с вторником в неделю 2!
# Вместо этого:
week1_wednesday = df[(df['date'] > '2024-04-01') & (df['date'] < '2024-04-08') & (df['date'].dt.day_name() == 'Wednesday')]['dau'].mean()
week2_wednesday = df[(df['date'] > '2024-04-08') & (df['date'] < '2024-04-15') & (df['date'].dt.day_name() == 'Wednesday')]['dau'].mean()
print(f"Сравнение сред: {week2_wednesday / week1_wednesday - 1:.1%} рост")
Планирование
# Когда запускать новую фичу?
# ✓ Запуск в начало месяца (люди имеют деньги) + в будни (дневная активность выше)
# ✗ Не запускать в август (спад), Рождество (шум), при Рамадане в мусульманских странах
# Когда проводить maintenance?
# ✓ 3:00-5:00 утра (минимум активности) + вторник (меньше всего трафика среди будней)
Сезонности в разных индустриях
| Индустрия | Главная сезонность | Пик | Спад |
|---|---|---|---|
| E-commerce | Квартальная + события | Black Friday, Рождество | Август, Май |
| Мессенджеры | Еженедельная + дневная | Вечер, выходные | Ночь, будни |
| Образование | Квартальная | Август-сентябрь (back-to-school) | Июль (каникулы) |
| Финансы | Ежемесячная | Начало месяца (зарплата) | Конец месяца |
| Видео-сервисы | Еженедельная | Вечер, выходные, зима | День, лето |
| Фитнес | Квартальная | Январь (New Year) | Август (отпуска) |
Итоговый чеклист
Когда вижу изменение в метриках:
- Проверить дневную сезонность (какое время дня?)
- Проверить еженедельную сезонность (какой день недели?)
- Проверить месячную сезонность (день месяца?)
- Проверить квартальную/годовую (какой месяц/квартал?)
- Есть ли глобальные события? (праздники, события)
- Есть ли корпоративные события? (деплойменты, маркетинг)
- Это сезонность или тренд?
- Сравнить YoY для чистого результата
Главное: Не путай сезонность с багом. Всегда проверяй исторические данные перед паникой!