Forecasting — methods, metrics, and model choice
Task 3 carries 35 of 100 marks. This skill covers the arithmetic and, more importantly, the judgement the marks actually reward.
Run the engine, do not hand-calculate
py .claude/skills/forecasting-methods/scripts/forecast.py --markdown
Every method, every error metric, the 2026 forecast, the long-run projection and the associative regression come out of one command. Useful variants:
| Command | Purpose |
|---|---|
--series passengers |
One series only |
--from 2013 --to 2019 |
Pre-COVID fitting basis |
--from 2022 |
Post-COVID fitting basis |
--long-to 2036 |
Projection horizon (default 2036) |
--associative |
Only the passengers-on-movements regression |
--at 500000,550000,600000 |
Movement levels for the associative forecast |
--alpha 0.1,0.2,0.3,0.5 |
Smoothing constants to compare |
--plain |
Console-friendly output instead of markdown tables |
Numbers typed by hand into prose drift from the workbook and get caught. Generate, then quote.
The methods
Naive
F(t+1) = A(t). Zero parameters. Its only role is as a benchmark — a sophisticated model that cannot beat naive is not earning its complexity. Reporting that comparison is a mark of a careful analyst.
Simple moving average
F(t+1) = mean of the last n actuals. Smooths noise; lags a trend, and the lag grows with n. On a rising series it under-forecasts systematically, which shows up as a positive CFE and a rising tracking signal.
Weighted moving average
Same, with declining weights on older periods — e.g. 0.5 / 0.3 / 0.2 with the largest weight on the most recent year. Weights must sum to 1 (the script normalises). Responds faster than a simple MA, still lags a trend. Justify the weights; arbitrary weights invite the question "why those?".
Single exponential smoothing
F(t+1) = F(t) + α(A(t) − F(t)), with 0 < α < 1.
α is the responsiveness dial: high α tracks recent movement and reacts to noise; low α is stable and slow. Compare at least two or three values. Single exponential smoothing has no trend term — on a series with a persistent trend it lags permanently, which is exactly what the DXB data shows.
Trend-adjusted (Holt's) exponential smoothing
Smooths level and trend separately:
L(t) = α·A(t) + (1−α)·(L(t−1) + T(t−1))
T(t) = β·(L(t) − L(t−1)) + (1−β)·T(t−1)
F(t+1) = L(t) + T(t)
Appropriate where a trend is present and the analyst wants recent trend weighted more heavily than a straight line does. On the short post-COVID window it extrapolates recovery momentum aggressively — note that rather than quoting it flat.
Least-squares linear trend
y = a + b·x fitted on the year index. Uses the whole window, gives an interpretable slope ("about b additional passengers per year"), and reports r² — the share of variation explained. It is also the only method here that is straightforwardly extendable to 2036.
Associative (causal) regression — task 3(c)
Passengers regressed on flight movements, not on time:
passengers = a + b · movements
This is a different kind of model from everything above, and the report must say so. Time-series methods project the past forward; an associative model predicts one variable from another. The brief asks for expected passenger traffic at 500,000, 550,000 and 600,000 movements — that is this model, not the trend line.
The slope has a physical meaning: passengers per aircraft movement, a function of average aircraft size and load factor. Interpreting it that way, and asking whether it can hold at higher movement volumes, is the analysis the marks are for.
The error metrics — what each one actually detects
Let e(t) = A(t) − F(t), over the n periods where a forecast exists.
| Metric | Formula | Detects | Watch for |
|---|---|---|---|
| CFE | Σ e(t) | Cumulative bias | Large positive = persistent under-forecasting. On a capacity decision, that is the dangerous direction |
| MAD | Σ|e(t)| / n | Average error size, in original units | Same units as the data, so it is the one to quote to a COO |
| MSE | Σ e(t)² / n | Average squared error | Penalises large misses heavily — the right lens when one bad year is costlier than several small ones |
| MAPE | (Σ |e(t)/A(t)| / n) × 100 | Average error as a percentage | Unit-free, so it compares across the two series. Distorted by small denominators — the 2020 collapse inflates it |
| TS | CFE / MAD | Bias relative to typical error | Outside ±4 = the model is out of control. MAPE will not tell you this |
Compare models on more than one metric. The classic error is ranking by MAPE alone and recommending a model with a tracking signal of 3.5 — accurate on average, but wrong in the same direction nearly every year. Say which metric drove the recommendation and why.
The metrics must be computed over a common comparison window where possible. A 3-year moving average produces fewer forecasts than a naive model, so their metrics are not computed over identical periods; the script reports n for each so the report can acknowledge it. Acknowledging it is worth more than hiding it.
The COVID structural break — the analytical crux
DXB fell from 86.4m passengers in 2019 to 25.8m in 2020, and recovered past 2019 by 2023. This is not noise. It is a structural break, and how it is handled separates a competent report from a distinction.
Fitting a least-squares trend across the whole 2013–2025 series gives r² ≈ 0.006 — the line explains essentially none of the variation, and projects 2035 below the 2025 actual. Quoting that number as a forecast would be indefensible. Run it, show it, and explain why it is rejected. Demonstrating that a model fails is evidence of judgement.
Three defensible bases, each with a different answer:
| Basis | Fitting window | r² | Character |
|---|---|---|---|
| Full series | 2013–2025 | ~0.006 | Break dominates; unusable for projection |
| Pre-COVID | 2013–2019 | ~0.85 | Mature-growth trajectory, ignores the recovery |
| Post-COVID | 2022–2025 | ~0.82 | Steep, but part of that slope is recovery, not growth |
Run all three (--from / --to), report them, and argue for one — or for a blended
view with a stated range. A capacity decision on a 20-year asset should not rest on a
four-observation recovery trend, and saying so is the argument.
Other legitimate treatments worth naming: excluding 2020–2021 as outliers; using a dummy variable for the break; forecasting from 2023 onward once recovery completed. Each has a cost. Name it.
Choosing and defending a model — the marks are here
The brief says "recommend the most suitable model". A recommendation needs four things:
- The metric comparison, laid out honestly
- The metric that decided it, and why that metric fits this decision — MAD for operational staffing, MSE where a single large miss is costly, TS where sustained bias would compound into an infrastructure error
- The behaviour of the series — trend present? break present? seasonality? (annual data hides seasonality, which is itself worth a sentence, since airport operations are acutely seasonal and the annual series conceals it)
- The decision the forecast serves — a 2026 staffing plan and a 2036 capacity decision do not need the same model, and saying so explicitly is exactly the kind of judgement task 2 asks for
It is entirely defensible to recommend different models for different horizons: a responsive short-term method for 2026, a trend model on a stated basis for 2036. That reads as an analyst thinking, not a student ticking a box.
Sanity checks before any number reaches the report
- Does the 2026 forecast sit in a plausible band against 95.2m in 2025?
- Does the 2035/2036 figure imply a growth rate you would defend out loud?
- Is the associative forecast an extrapolation beyond the observed movement range (max 454,800 in 2025)? Say so — all three of the brief's levels are.
- Does passengers ÷ movements stay plausible at the forecast levels (roughly 209 in 2025)?
- Do the two series stay consistent with each other?
- Are the units right — passengers in millions vs absolute; movements in thousands?
Reporting conventions
- Round in prose, keep full precision in the workbook: "approximately 112.3 million", not "112,292,354"
- State the fitting window every time a forecast is quoted
- Give the regression equation, r and r² whenever a regression is used
- Number every table and figure and refer to each in the text
- Put full method-by-method workings in the appendices; the main text carries the comparison summary and the interpretation
Citing the theory
Forecasting method claims should carry a textbook or journal citation. Standard operations management texts covering exactly this material:
- Heizer, Render and Munson — Operations Management
- Slack, Brandon-Jones and Burgess — Operations Management
- Krajewski, Malhotra and Ritzman — Operations Management: Processes and Supply Chains
- Stevenson — Operations Management
For the five journal articles the brief requires, air transport demand forecasting is a
well-served literature — see aviation-data-sources for the journals to search. Verify
every reference; never invent a DOI.