Tags: analytics statistics concept

Seasonality

Date: 2026-08-17


The recurring pattern underneath a trend. Almost every “something’s wrong” alarm in commerce analytics is a period being compared against a period that isn’t like it — and the fix is nearly always comparing like with like rather than adjacent.


Seasonality is variation in a metric that repeats on a fixed calendar cycle — daily, weekly, monthly or annually — independent of any underlying trend.

The four cycles, stacked

Commerce data usually carries all of these at once:

INTRADAY     lunchtime and evening peaks; mobile skews evening
WEEKLY       the strongest cycle in most commerce. Sunday evening peaks,
             Saturday troughs, B2B inverts it entirely
MONTHLY      payday effects — end of month, and the 25th–28th in the UK
             where most salaries land
ANNUAL       Black Friday, Christmas, January sales, summer trough,
             back-to-school, plus category-specific peaks

Weekly is the one that causes daily reporting to be useless. A Tuesday-versus-Monday comparison is measuring the day of the week.

The comparison that fixes most of it

✗  yesterday vs the day before        measures day-of-week
✗  this month vs last month           measures month length and paydays
                                        (February vs March is −10% of days)
✗  this week vs last week             better, but a bank holiday ruins it

✓  same day, previous week            controls day-of-week
✓  same period, previous year         controls annual season
✓  trailing 7-day vs prior 7-day      smooths the weekly cycle entirely
✓  year-on-year, aligned by WEEKDAY   the one that handles Easter
     rather than by date

The last one matters more in the UK than people expect. Easter moves by up to five weeks, Black Friday’s date shifts, and bank holidays fall on different dates each year. Comparing 24 December to 24 December compares a Wednesday to a Sunday.

Decomposition

Splitting a series into its parts makes both the pattern and the anomaly legible.

observed  =  trend  ×  seasonal  ×  residual        (multiplicative)
observed  =  trend  +  seasonal  +  residual        (additive)

Use multiplicative for commerce. Seasonal effects scale with volume — Black Friday is “3× normal”, not “+40,000 orders” — so an additive model will under-fit peaks in a growing business and over-fit them in a shrinking one.

Sunday orders, observed          2,840
trend (centred moving average)   2,200
seasonal index for Sunday         1.24
                                 ──────
expected  =  2,200 × 1.24     =  2,728
residual  =  2,840 − 2,728    =   +112   ← +4%, ordinary variation

In plain terms: the seasonal index says “Sundays run 24% above the underlying level”. Once you divide that out, what’s left is the part worth investigating. A raw figure 24% above Wednesday isn’t news; a figure 4% above what Sunday normally does isn’t either.

Seasonally adjusted figures are the observed value divided by the seasonal index — the number with the predictable pattern removed, so trend changes become visible. Worth computing once and reusing everywhere rather than eyeballing it per report.

Building the indices

You need enough history, and this is the constraint people hit:

cycle      minimum history      comfortable
weekly     ~8 weeks             6 months
monthly    ~2 years             3 years
annual     2 years              3–5 years

Two years is the practical minimum for annual seasonality, and one of those years may have been abnormal. Businesses under two years old should not attempt annual adjustment — use category benchmarks as a sanity check and accept the uncertainty — Benchmarking.

Exclude known anomalies before fitting. An outage, a site migration or a one-off campaign inside the training window gets baked into the index and then distorts every future comparison against that period — Annotation and Change Logs.

Where it bites in practice

  • Test duration. Running fewer than full weeks reweights the sample towards whichever days were included — Test Duration, Seasonality in Tests
  • Alerting. A fixed threshold fires every Sunday night and never fires on a broken Tuesday. Alert against the same hour last week — Alerting on Metrics, Anomaly Detection
  • Forecasting and stock. Seasonal index times trend is the entire basis of most demand forecasts — Stockouts and Availability
  • Cohort comparison. A January cohort and a November cohort are different populations, not the same population at different times — the November one is full of gift-buyers who never return — Cohort Analysis, Retention Curves
  • Attribution windows. A 30-day window spanning Black Friday captures a different mix from one that doesn’t — Attribution Windows

Seasonality versus a real change

The diagnostic order when a number looks wrong:

1  is this the same day-of-week as the comparison?
2  is this period the same LENGTH?
3  did a bank holiday, payday or campaign fall in one and not the other?
4  what does the same period last year look like?
5  is the residual — after adjustment — actually outside normal variance?
6  only now: is something broken?

Steps 1–4 explain the large majority of alarms, and they’re free. The interesting explanations are reached far too early — the symptom list.

Where it interacts

  • Anomaly Detection — seasonality is the thing that has to be removed before anomaly means anything
  • Metric Drift — a slow definitional change looks like a seasonal shift and is diagnosed by whether it repeats
  • Promotional Cadence — much apparent seasonality is self-inflicted: your own campaign calendar, repeated annually until it looks like customer behaviour
  • Benchmarking — industry seasonal curves are one of the few benchmark comparisons that’s usually valid