Seasonal Decomposition: A Method Guide
Updated October 2026
Executive Summary
Seasonal decomposition splits a time series into a trend, a seasonal component and a remainder. This paper is an explanation of the method, not a study. It reports no measurements, surveys or benchmark results of our own. It describes how classical, STL and X-13 decomposition work, how additive and multiplicative models differ, which parameters matter, what each method assumes, and where each tends to go wrong.
To see whether your own metric has a real seasonal pattern and how big it is, try the free seasonality tool.
Key Points
- Model form: use an additive model when seasonal swings stay about the same size, and a multiplicative model (or a log transform) when they grow with the level of the series.
- Classical decomposition is simple and easy to reproduce, but it assumes a fixed seasonal pattern, leaves the series ends without a trend estimate, and reacts strongly to outliers.
- STL uses loess smoothing, allows the seasonal pattern to drift, can be made robust to outliers, and gives estimates at the series ends. Its cost is that you choose smoothing windows.
- X-13ARIMA-SEATS adds calendar-effect and outlier regression and is the standard choice for official seasonal adjustment.
- Always inspect the remainder. Leftover structure in it means the trend or seasonal component is missing something.
How to use this paper: read it as a reference for choosing and configuring a decomposition. The recommendations are general guidance drawn from the published literature listed at the end, not conclusions from our own experiments.
1. Introduction
Business series such as sales, traffic or demand mix several signals: a slowly moving trend, a recurring seasonal pattern tied to the calendar, and irregular variation. Decomposition separates these so each can be examined on its own. It helps answer questions that raw plots make hard: is growth speeding up once the seasonal effect is removed, is the seasonal pattern stable, and is an unusual value an anomaly or just a normal seasonal peak?
Scope
This paper is a method guide. It covers:
- The decomposition model and its additive and multiplicative forms
- Classical moving-average decomposition, STL and X-13ARIMA-SEATS
- STL parameters and how to think about them
- Checking a decomposition and common pitfalls
- A small worked example with made-up numbers
It does not present original research, survey data, benchmarks or customer results, and it does not rank the methods by measured accuracy.
2. The Decomposition Model
An observed series Y is represented as a combination of a trend T, a seasonal component S and a remainder R. The seasonal period m is the number of observations in one cycle, for example 12 for monthly data with a yearly pattern or 7 for daily data with a weekly pattern.
Additive versus multiplicative
The additive form is Yt = Tt + St + Rt. It fits series where the size of the seasonal swing does not depend on the level. The multiplicative form is Yt = Tt × St × Rt. It fits series where seasonal swings grow as the level grows. Taking logs gives log Y = log T + log S + log R, so a multiplicative model can be fitted by any additive method applied to the logged series. A plot of the series is usually enough to choose: if the seasonal peaks and troughs widen as the series rises, use the multiplicative form or logs.
Classical decomposition
Classical decomposition estimates the trend with a centered moving average whose window equals the seasonal period, subtracts (or divides out) that trend, averages the detrended values for each position in the cycle to get the seasonal indices, and takes what is left as the remainder. Its properties follow from that recipe:
- It gives no trend estimate for roughly the first and last m/2 observations, because the centered window does not fit there.
- The seasonal pattern is the same in every cycle by construction.
- One extreme value moves the moving average across a whole window and the seasonal average for its position.
- It has no built-in treatment of missing values and supports a single seasonal period.
STL decomposition
STL (Seasonal and Trend decomposition using Loess) was introduced by Cleveland, Cleveland, McRae and Terpenning in 1990. It alternates between smoothing the seasonal subseries and smoothing the trend, using locally weighted regression (loess). Optional robustness iterations down-weight observations with large remainders so outliers affect the trend and seasonal components less. STL is additive; for a multiplicative pattern, apply it to the logged series. The main settings are:
- Seasonal window (s.window in R,
seasonalin statsmodels): an odd integer controlling how quickly the seasonal pattern may change. Small values let it change fast; very large values approach a fixed pattern. - Trend window (t.window,
trend): an odd integer controlling trend smoothness. A larger window gives a smoother trend and a smaller one follows short-term movement. - Low-pass window (l.window,
low_pass): part of the filter that keeps trend out of the seasonal component. The defaults are normally fine. - Robust: switches on the robustness iterations. Turn it on when outliers are present.
The implementations differ here: R's stl requires you to choose the seasonal window, while the statsmodels version supplies a default. Treat any default as a starting point, then look at the result.
X-13ARIMA-SEATS
X-13ARIMA-SEATS is the seasonal adjustment program of the US Census Bureau, descended from the X-11 and X-12 family. It fits a regression-ARIMA model to handle outliers, trading-day and holiday effects, extends the series with forecasts to improve estimates near the end, and then applies either X-11 filtering or SEATS signal extraction. It is the usual choice when calendar effects matter and when adjusted figures will be published, at the price of more setup and more diagnostics to read.
Comparison
| Property | Classical | STL | X-13ARIMA-SEATS |
|---|---|---|---|
| Seasonal pattern | Fixed | Can change slowly | Can change slowly |
| Trend at series ends | Not estimated | Estimated | Estimated (uses forecast extension) |
| Outlier handling | None | Optional robust fitting | Regression-based outlier detection |
| Calendar effects | No | No | Yes (trading day, holidays) |
| Multiplicative form | Built in | Via log transform | Built in |
| Setup effort | Low | Moderate | Higher |
3. How to Apply the Method
This section describes a practical order of work. It is a description of the technique, not a record of an experiment.
Step 1: Look at the series
Plot it. Note the level, any breaks, gaps, and whether seasonal swings widen with the level. Confirm the observation frequency and which seasonal period you expect. Decomposition needs at least two full cycles of data to separate a seasonal pattern from noise, and more is better.
Step 2: Choose the seasonal period
Usually the period follows from the calendar and the sampling frequency. If it is uncertain, an autocorrelation plot or a periodogram can show peaks at candidate periods. Treat these as evidence to weigh against what you know about the business, not as a final answer. Daily data can carry both weekly and yearly patterns; classical decomposition and plain STL handle one period at a time, and multi-seasonal variants such as MSTL exist for more.
Step 3: Choose the model form
Pick additive or multiplicative from the plot, or take logs and use an additive method. If values can be zero or negative, a plain log is not available, and an additive model or a different transform is needed.
Step 4: Choose the method and parameters
Start from the comparison table. For STL, begin with the implementation's defaults where it has them (and a starting seasonal window of your choice where it does not), then adjust the seasonal window: widen it if the seasonal component looks jagged or absorbs noise, narrow it if the seasonal pattern clearly changes over time and the remainder shows it left behind. Adjust the trend window until the trend is smooth enough to read without erasing real turning points. Enable robust fitting if outliers are present.
Step 5: Check the result
Plot all four panels (data, trend, seasonal, remainder). Then check:
- The remainder should look like noise: no visible seasonal cycle, no long drifts. An ACF plot of the remainder, or a Ljung-Box test, can flag leftover autocorrelation. Treat a test as one input; with a long series, small and unimportant structure can still be flagged.
- Seasonal and trend strength, as described by Hyndman and Athanasopoulos: strength of seasonality = max(0, 1 - Var(R) / Var(S + R)), and strength of trend = max(0, 1 - Var(R) / Var(T + R)). Values near 1 mean the component dominates the remainder; values near 0 mean it is weak or absent.
- The seasonal component should be plausible to someone who knows the business, and should not change shape suddenly without a reason.
- Large remainder values should line up with events you can name, or deserve investigation.
Step 6: Use the components
The seasonally adjusted series (Y minus S, or Y divided by S) shows the underlying movement. Remainders can be scanned for anomalies. Components can also feed a forecast: forecast the seasonally adjusted series and put the seasonal pattern back, by adding it for an additive model or multiplying by it for a multiplicative one.
4. Key Points and Pitfalls
These points come from the method's mechanics and the cited literature. They are statements about how the method behaves, not measurements.
Point 1: Choose the model form deliberately
Fitting an additive model to a series with growing seasonal swings leaves a remainder whose variance grows with the level, which is visible as a funnel shape in the remainder plot. If you see that, switch to a multiplicative model or take logs.
Point 2: The seasonal window trades flexibility for stability
A very small seasonal window lets the seasonal component absorb noise and even trend movement. A very large one forces a fixed pattern and pushes real changes in seasonality into the remainder. There is no universal best value, so look at the remainder under two or three settings.
Point 3: Outliers and level shifts need explicit attention
An outlier is best handled by robust fitting or by modelling it. A level shift (a permanent step) is different: a smooth trend will blur it across the trend window. If a break is known, such as a pricing change or a tracking change, consider decomposing the segments separately or modelling the break.
Point 4: Short series cannot support a seasonal estimate
With fewer than two full cycles, seasonality is hard to separate from noise, and many methods require at least two cycles. With few cycles, estimated seasonal indices are themselves noisy.
Point 5: Calendar effects are not the same as seasonality
Holidays that move (such as Easter) and the number of trading days in a month shift values in ways a fixed seasonal index cannot capture. If these matter, use a method that models them, such as X-13ARIMA-SEATS, or add calendar regressors.
Point 6: Beware of end-of-series revisions
Trend and seasonal estimates near the end of the series rest on one-sided information and usually change when new data arrives. Do not read a turn in the latest few points of a trend as settled.
5. Worked Example (Illustrative)
Illustrative example with made-up numbers. Nothing in this example comes from real data. It shows the arithmetic of an additive decomposition with a seasonal period of four (quarterly data).
Suppose that after estimating the trend with a centered moving average and subtracting it, the detrended values for the first quarter in three successive years are -9, -11 and -10. Suppose the averages of the detrended values for the other positions are +6 (quarter 2), +12 (quarter 3) and -8 (quarter 4).
| Quarter | Average detrended value (seasonal index) |
|---|---|
| Q1 | (-9 - 11 - 10) / 3 = -10 |
| Q2 | +6 |
| Q3 | +12 |
| Q4 | -8 |
The four indices sum to -10 + 6 + 12 - 8 = 0, as an additive seasonal component should over one cycle. If they did not sum to zero, you would subtract their mean from each.
Now suppose an observed first-quarter value of 104 and a trend estimate of 108 at that point. The remainder is R = Y - T - S = 104 - 108 - (-10) = 6. A multiplicative version works the same way with ratios: suppose an observed value of 120, a trend of 100 and a seasonal index of 1.10; then R = 120 / (100 × 1.10) = 1.0909, a remainder about 9 percent above what trend and season predict.
The point of the example is the mechanics: detrend, average by position, make the indices sum to zero, and read the remainder as what is left.
6. General Guidance
The following is general guidance on applying the method. It is not drawn from our own findings.
Guidance 1: Pick the method for the series you have
Use classical decomposition for a clean series with a stable seasonal pattern when simplicity matters. Use STL when the pattern drifts, outliers are present, or you need estimates at the ends. Use X-13ARIMA-SEATS when calendar effects matter or the adjusted series will be published.
Guidance 2: Fix the period from the calendar first
Use the known sampling frequency and business cycle to set the period. Use autocorrelation or spectral plots to confirm it or to find a second period, not to replace what you know.
Guidance 3: Read the remainder before trusting the components
Plot the remainder and its autocorrelation after every fit. Change one setting at a time and compare.
Guidance 4: When decomposing many series, keep a review path
If you apply one configuration to many series, it will suit some better than others. Record the settings used for each, run the same diagnostics on each, and send the ones whose remainders look wrong to a person for review.
Guidance 5: Refit as data arrives, and expect end revisions
Refit on a schedule that suits how often the series changes, compare new and old components, and treat recent trend movement as provisional.
7. Conclusion
Seasonal decomposition is a well-established way to separate trend, seasonality and remainder. This paper explained the method: the additive and multiplicative models, how classical decomposition, STL and X-13ARIMA-SEATS work, which choices matter, how to check a result, and where it tends to go wrong. It is not a study and reports no measured results. For depth, use the primary sources listed below.
Working on this for your business? See the time series forecasting tool.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai
Frequently Asked Questions
What is the difference between additive and multiplicative decomposition?
Additive decomposition assumes that seasonal variations stay roughly constant in size over time, expressed as Y = T + S + R where Y is the observed series, T is trend, S is seasonal, and R is the remainder. Multiplicative decomposition assumes seasonal variations scale with the level of the series, expressed as Y = T × S × R. Use the multiplicative form when seasonal peaks and troughs grow as the series rises, which is common in sales-type data. Taking logs turns a multiplicative model into an additive one, so any additive method can be used on the logged series.
What are the limitations of classical seasonal decomposition?
Classical moving-average decomposition gives no trend estimate for roughly the first and last half-period of the series. It assumes the seasonal pattern is identical in every cycle, it is sensitive to outliers because they enter the moving average and the seasonal averages, it has no built-in handling of missing values, and it supports a single seasonal period. STL relaxes several of these through loess smoothing and optional robust fitting, but it requires you to choose smoothing windows.
How do you check the quality of a seasonal decomposition?
Start with plots of the four panels. The remainder should look like noise with no visible seasonal cycle. Check its autocorrelation with an ACF plot or a Ljung-Box test, keeping in mind that a test on a long series can flag small, unimportant structure. Compute seasonal and trend strength from the component variances, confirm the seasonal component is plausible for the business, and look at whether large remainders match known events. No single statistic is conclusive.
When should you use STL versus classical decomposition?
STL (Seasonal and Trend decomposition using Loess) suits series whose seasonal pattern changes slowly, that contain outliers, or where you want trend estimates at the series ends. Classical decomposition is adequate for a clean series with a stable seasonal pattern and is easy to reproduce by hand. X-13ARIMA-SEATS is the usual choice when calendar effects such as trading days and moving holidays matter, or when adjusted figures will be published.
References and Further Reading
Internal Resources
- Holt-Winters Exponential Smoothing - A forecasting method that models level, trend and seasonality directly
- ARIMA - Autoregressive models for time series, related to the remainder checks above
- Time series forecasting tool - Run a time series analysis on your own data
Academic and Technical References
- Cleveland, R. B., Cleveland, W. S., McRae, J. E., & Terpenning, I. (1990). STL: A seasonal-trend decomposition procedure based on loess. Journal of Official Statistics, 6(1), 3-73.
- Hyndman, R. J., & Athanasopoulos, G. (2021). Forecasting: Principles and Practice (3rd ed.). OTexts. Chapter 3: Time Series Decomposition.
- Dagum, E. B., & Bianconcini, S. (2016). Seasonal Adjustment Methods and Real Time Trend-Cycle Estimation. Springer International Publishing.
- Cleveland, W. S., & Devlin, S. J. (1988). Locally weighted regression: An approach to regression analysis by local fitting. Journal of the American Statistical Association, 83(403), 596-610.
- Theodosiou, M. (2011). Forecasting monthly and quarterly time series using STL decomposition. International Journal of Forecasting, 27(4), 1178-1195.
- Dokumentov, A., & Hyndman, R. J. (2022). STR: Seasonal-Trend decomposition using Regression. INFORMS Journal on Data Science, 1(1), 50-62.
- Alexandrov, T., Bianconcini, S., Dagum, E. B., Maass, P., & McElroy, T. S. (2012). A review of some modern approaches to the problem of trend extraction. Econometric Reviews, 31(6), 593-624.
Software and Implementation Resources
- Python statsmodels library:
statsmodels.tsa.seasonal.STLandseasonal_decompose - R stats package:
stl()anddecompose()functions - seasonal package (R): an interface to X-13ARIMA-SEATS