Ga naar hoofdinhoud

SARIMA-modellen: een complete gids voor seizoensgebonden tijdreeksvoorspelling

Leer hoe SARIMA ARIMA uitbreidt om seizoensinvloeden aan te pakken, begrijp de zeven parameters en bouw een werkend model in Python van dataverzameling tot voorspelling.
Bijgewerkt 31 jul 2026  · 15 min lezen

Verkennen met AI

Openen in ChatGPTOpenen in ClaudeOpenen in Perplexity

Elke december slaan retailers feestdagenvoorraad in. Elke zomer bereiden elektriciteitsnetten zich voor op pieken door airconditioning. Deze patronen herhalen zich jaar na jaar, en als je een tijdreeksvoorspelling bouwt die ze negeert, laat je nauwkeurigheid liggen.

Seasonal AutoRegressive Integrated Moving Average-modellen (kortweg SARIMA) breiden het veelgebruikte ARIMA-raamwerk uit om terugkerende seizoenspatronen naast reguliere trends vast te leggen. In dit artikel leer je wat SARIMA is, hoe de componenten werken, wanneer je het verkiest boven ARIMA en hoe je er stap voor stap een bouwt in Python.

Wat is SARIMA?

SARIMA is een tijdreeksvoorspellingsmodel dat zowel niet-seizoensgebonden als seizoensgebonden patronen in data aankan. Het bouwt direct voort op ARIMA, dus als je al met ARIMA hebt gewerkt, zul je de meeste mechanismen herkennen. Het belangrijkste verschil is dat SARIMA een tweede laag parameters toevoegt die specifiek zijn ontworpen om gedrag te modelleren dat zich op vaste intervallen herhaalt, zoals maandelijkse, kwartaal- of wekelijkse cycli.

Formeel wordt een SARIMA-model geschreven als SARIMA(p, d, q)(P, D, Q)[S]. De eerste set parameters, (p, d, q), behandelt de niet-seizoensgebonden structuur, identiek aan standaard ARIMA. De tweede set, (P, D, Q)[S], verklaart seizoenspatronen, waarbij S de lengte van de seizoenscyclus is. Voor maandelijkse data met jaarlijkse seizoensinvloeden geldt S = 12. Voor kwartaaldata is S = 4.

Belangrijke componenten van SARIMA

SARIMA’s zeven parameters kunnen in het begin veel lijken. Het helpt om ze in twee groepen te zien: het vertrouwde ARIMA-trio (p, d, q) en de seizoens-tegenhangers (P, D, Q, S) die ze spiegelen op seizoensschaal. Elke seizoensparameter doet precies wat zijn niet-seizoensgebonden tweeling doet, maar dan toegepast over seizoenssprongen in plaats van aangrenzende tijdstappen.

AutoRegressief (AR)-gedeelte

De AR-component gebruikt eerdere waarden van de reeks om toekomstige te voorspellen. De parameter p specificeert hoeveel vertragingswaarden worden meegenomen. Als p = 2, gebruikt het model de twee voorgaande tijdstappen als voorspellers voor de huidige waarde.

Aan de seizoenskant doet P hetzelfde, maar dan op seizoensvertragingen. Als P = 1 en S = 12, kijkt het model naar de waarde van 12 perioden geleden, dezelfde maand, vorig jaar, als voorspeller. Dit legt jaar-op-jaarpatronen direct vast.

Geïntegreerd (I)-gedeelte

De parameter d bepaalt hoe vaak de reeks wordt gedifferentieerd om trends te verwijderen en deze stationair te maken. Differentiëren betekent dat je de vorige observatie van elke observatie aftrekt, wat een lineaire trend verwijdert. Als d = 1, neem je eerste verschillen; als d = 2, differentieer je de al gedifferentieerde reeks.

Seizoensdifferentiatie werkt op dezelfde manier maar bij seizoensvertragingen. De parameter D geeft aan hoeveel seizoensverschillen je toepast. Met D = 1 en S = 12 trek je van elke observatie de waarde van 12 perioden eerder af. d = 1 en D = 1 samen gebruiken is gebruikelijk wanneer een reeks zowel een algemene opwaartse trend als een terugkerend seizoenspatroon heeft.

Moving Average (MA)-gedeelte

In tegenstelling tot de AR-component, die naar eerdere waarden kijkt, modelleert de MA-component de relatie tussen de huidige observatie en residuele fouten van eerdere voorspellingen. De parameter q bepaalt hoeveel vertragingsfouttermen worden meegenomen. Als q = 1, gebruikt het model de voorspellingsfout van de vorige stap om de huidige voorspelling bij te stellen.

De seizoens-tegenhanger Q past dezelfde logica toe bij seizoensvertragingen. Met Q = 1 en S = 12 neemt het model de voorspellingsfout van 12 perioden geleden mee. Dit is van belang wanneer seizoensschokken, zoals een uitzonderlijk hete zomer die de energievraag opdrijft, de neiging hebben door te werken in dezelfde periode het jaar erop.

Seizoenscomponent (S)

De parameter S definieert de lengte van de seizoenscyclus en verbindt de drie seizoensparameters (P, D, Q) met elkaar. S goed kiezen is belangrijk: als je data maandelijks is met een jaarlijks patroon, dan is S = 12. Wekelijkse data met een jaarlijkse cyclus geeft S ruwweg 52.

Hier wordt seizoensinvloed soms lastig. Een jaar is niet precies 52 weken; het is dichter bij 52,18. Voor de meeste praktische doeleinden werkt afronden naar S = 52 prima. Maar sommige datasets hebben meerdere seizoensperioden: dagelijkse elektriciteitsvraag vertoont vaak zowel een wekelijkse cyclus (S = 7) als een jaarlijkse cyclus (S = 365). Standaard SARIMA kan één seizoensperiode aan, dus meerdere seizoensinvloeden vereisen geavanceerdere methoden zoals TBATS of Facebook Prophet.

Als S niet voor de hand ligt, helpt tijdreeksdecompositie. Door de reeks te ontleden in trend-, seizoens- en residucomponenten komt de dominante herhalende periode visueel naar voren. Je kunt ook autocorrelatieplots inspecteren op pieken bij regelmatige vertragingen.

ARIMA vs. SARIMA: wat is het verschil?

Dit is waarschijnlijk wat je al denkt: wanneer gebruik je nu eigenlijk SARIMA in plaats van het eenvoudigere ARIMA?

Het korte antwoord: gebruik ARIMA wanneer je data geen betekenisvol seizoenspatroon heeft, en SARIMA wanneer dat wel zo is.

ARIMA modelleert drie dingen: autocorrelatie in de reeks zelf (AR), het aantal verschillen dat nodig is voor stationariteit (I), en de na-ijlen­de invloed van eerdere voorspellingsfouten op de huidige waarde (MA). Het gaat goed om met trends, cycli en onregelmatige ruis. Wat het niet kan, is patronen modelleren die zich met een vaste seizoensfrequentie herhalen. Die glippen erdoor als onverklaarde variantie.

SARIMA voegt precies die mogelijkheid toe. Wanneer duidelijke seizoenspiekken en -dalingen in je data verschijnen, dwingt een eenvoudig ARIMA-model die patronen in de residuen te stoppen, wat resulteert in slechtere voorspellingen en residuen die geen witte ruis zijn. Een SARIMA-model vangt ze direct.

Een praktische vuistregel: plot je data en zoek naar terugkerende patronen op een vast interval. Als je die ziet, kerstsale-pieken, winterse energiestijgingen, kwartaalwinstpatronen, kies dan voor SARIMA. Als de reeks grillig of trend-gedreven is zonder regelmatige cyclus, is ARIMA eenvoudiger en toereikend.

Onze ARIMA Models in Python-cursus behandelt beide raamwerken met hands-on oefeningen om je intuïtie te scherpen voor wanneer elk van toepassing is.

Hoe bouw je een SARIMA-model in Python

Een SARIMA-model bouwen volgt een logische volgorde: data verzamelen, stationariteit controleren, parameters identificeren, het model fitten, diagnostiek uitvoeren en voorspellen. Zo werkt elke stap in de praktijk, met Python’s statsmodels-bibliotheek.

Dataverzameling

Voor een model dat seizoensinvloeden vastlegt, heb je genoeg historie nodig om het patroon minstens twee keer te observeren, idealiter meerdere cycli. Maandelijkse retailverkopen, temperatuurrijen, energieverbruik en passagiersaantallen zijn klassieke voorbeelden. Publieke bronnen zoals Federal Reserve Economic Data (FRED), de US Census Bureau of Kaggle zijn goede startpunten.

De standaard lesdataset voor deze workflow is het aantal luchtvaartpassagiers: maandelijkse data van 1949 tot 1960 met een duidelijke opwaartse trend en sterke jaarlijkse seizoensinvloed. Deze is beschikbaar via statsmodels met get_rdataset(), dat de data uit de Rdatasets-collectie haalt. Leer de workflow op deze dataset voordat je hem op je eigen data toepast.

Datapreprocessing

Voordat je een SARIMA-model fit, heb je een stationaire reeks nodig, eentje waarvan het gemiddelde en de variantie in de tijd niet veranderen. De Augmented Dickey-Fuller (ADF)-test controleert dit formeel: een p-waarde onder 0,05 suggereert dat de reeks stationair is.

Zo niet, dan lost differentiëren het op. Pas reguliere differentiatie toe (d = 1) voor trend, seizoensdifferentiatie (D = 1 bij vertraging S) voor seizoensgebonden niet-stationariteit, of beide indien nodig. Handel ontbrekende waarden vóór deze stap af. Forward fill of interpolatie zijn standaardbenaderingen voor tijdreeksdata, omdat rijen verwijderen de temporele structuur doorbreekt.

Modelidentificatie

Met een stationaire reeks bij de hand gebruik je de Autocorrelation Function (ACF) en Partial Autocorrelation Function (PACF)-plots om de modelparameters te identificeren. Hier let je op:

  • ACF toont de correlatie tussen de reeks en zijn vertragingen. Een scherpe afkap na vertraging q suggereert de MA-orde. Pieken bij seizoensvertragingen (12, 24, 36 voor maanddata) informeren Q.
  • PACF toont partiële correlaties met tussentijdse vertragings­effecten verwijderd. Een scherpe afkap na vertraging p suggereert de AR-orde. Seizoenspiekken informeren P.

In de praktijk geven de plots je kandidaatwaarden, en vergelijk je een handvol modellen met informatiecriteria (meer hierover bij diagnostiek). Wil je de zoektocht automatiseren, dan doet auto_arima() uit het pmdarima-pakket een gridsearch over parametercombinaties en selecteert het best passende model.

Parameterinschatting

Zodra je kandidaatparameters hebt, schat statsmodels ze met Maximum Likelihood Estimation (MLE), waarbij de coëfficiënten worden gevonden die de geobserveerde data het meest waarschijnlijk maken onder het model. SARIMA-schatting is rekenintensiever dan plain ARIMA omdat de optimizer zowel de niet-seizoensgebonden als de seizoenscomponenten tegelijk moet fitten.

Het fitproces kan soms convergeren naar een lokaal optimum in plaats van het globale, dus het loont de moeite om een paar verschillende startwaarden of parametercombinaties te proberen als resultaten vreemd lijken.

Model fitten

Zo fit je een SARIMA-model in Python met de dataset van luchtvaartpassagiers:

import pandas as pd
import statsmodels.api as sm

# Load the classic airline dataset
airline_data = sm.datasets.get_rdataset("AirPassengers", "datasets").data
airline_data.index = pd.date_range(start="1949-01", periods=len(airline_data), freq="MS")
passengers = airline_data["value"]

# Fit SARIMA(1,1,1)(1,1,1)[12]
sarima_model = sm.tsa.statespace.SARIMAX(
    passengers,
    order=(1, 1, 1),
    seasonal_order=(1, 1, 1, 12),
    enforce_stationarity=False,
    enforce_invertibility=False
)

sarima_result = sarima_model.fit(disp=False)
print(sarima_result.summary())	

Het order-argument neemt (p, d, q) voor het niet-seizoensgedeelte; seasonal_order neemt (P, D, Q, S). enforce_stationarity=False en enforce_invertibility=False geven de optimizer meer flexibiliteit, wat vaak helpt bij convergentie op data uit de praktijk.

Modelstatistieken en diagnostiek

Na het fitten voer je de ingebouwde diagnostische plots uit met sarima_result.plot_diagnostics(). Je let op vier dingen:

  • Gestandaardiseerde residuen: Zouden eruit moeten zien als witte ruis zonder duidelijke patronen.
  • Histogram van residuen: Zou ruwweg normaal moeten zijn.
  • Normale Q-Q-plot: Punten zouden dicht bij de diagonaal moeten vallen.
  • Correlogram (ACF van residuen): Geen significante pieken, wat op onverklaarde autocorrelatie zou duiden.

Besteed bijzondere aandacht aan seizoensvertragingen in het correlogram. Pieken bij vertragingen 12, 24, enzovoort suggereren dat de seizoenscomponent niet volledig is vastgelegd. Vergelijk alternatieve specificaties met AIC (Akaike Information Criterion) en BIC (Bayesian Information Criterion): lagere waarden geven een betere fit aan, waarbij BIC complexiteit zwaarder bestraft.

Voorspellen

Met een gevalideerd model is het genereren van voorspellingen eenvoudig. Splits je data in train- en testsets om een eerlijk beeld van de voorspellingsnauwkeurigheid te krijgen:

# Train on first 11 years, test on final year
train = passengers[:"1959"]
test = passengers["1960":]

# Refit on training data and forecast
sarima_train = sm.tsa.statespace.SARIMAX(
    train,
    order=(1, 1, 1),
    seasonal_order=(1, 1, 1, 12),
    enforce_stationarity=False,   # add this
    enforce_invertibility=False   # add this
).fit(disp=False)

forecast = sarima_train.get_forecast(steps=12)
forecast_mean = forecast.predicted_mean
conf_int = forecast.conf_int()

De methode get_forecast() retourneert puntvoorspellingen samen met betrouwbaarheidsintervallen die breder worden naarmate je verder vooruit voorspelt. Dat wijder worden is geen gebrek; het model is eerlijk over de onzekerheid. Beoordeel nauwkeurigheid met RMSE (Root Mean Squared Error) of MAPE (Mean Absolute Percentage Error) op de achtergehouden testset.

Praktische toepassingen van SARIMA

Zoveel signalen in de echte wereld zijn seizoensgebonden dat SARIMA een vaste plek verdient in elke tijdreeks-toolkit. Enkele voorbeelden per sector:

  • Retail: Maandelijkse verkoopvolumes voorspellen voor voorraadplanning, vooral rond feestdagen waarbij vraagpieken voorspelbaar zijn maar in omvang per jaar variëren.
  • Energieverbruik: Elektriciteits- en gasvraag voorspellen, die zowel dagelijkse als jaarlijkse seizoenscycli volgt, gedreven door temperatuur en activiteitenpatronen.
  • Financiën: Kwartaalwinsten of handelsvolumepatronen modelleren die zich herhalen volgens fiscale kalenders.
  • Weersvoorspelling: Temperatuur, neerslag en andere klimaatvariabelen projecteren die sterke jaarlijkse cycli volgen.

In elk geval is de terugkerende structuur het signaal, en SARIMA is erop gebouwd om die vast te leggen.

Beperkingen van SARIMA

Weten waar een tool goed werkt is maar de helft van het verhaal. SARIMA is een solide basis voor seizoensgebonden tijdreeksen, maar zijn grenzen kennen onderscheidt mensen die modellen goed gebruiken van mensen die ze blind gebruiken.

Het kan precies één seizoensperiode aan. Als je data meerdere seizoensinvloeden heeft, dagelijks, wekelijks en jaarlijks over elkaar heen, zal SARIMA ze niet allemaal tegelijk modelleren. Methoden zoals TBATS, Prophet of LSTM-netwerken gaan van nature beter om met meerdere seizoensfrequenties.

SARIMA veronderstelt ook lineariteit. Het modelleert lineaire relaties tussen eerdere waarden, eerdere fouten en toekomstige observaties. Niet-lineaire dynamiek, gangbaar in financiële tijdreeksen of chaotische systemen, vereist andere tools. En net als ARIMA vertrouwt SARIMA uitsluitend op de geschiedenis van de reeks zelf. Als je externe drijvers hebt die je voorspellingen beïnvloeden, promoties, weersomstandigheden, economische indicatoren, kijk dan naar SARIMAX, dat exogene variabelen aan het SARIMA-raamwerk toevoegt.

Ten slotte kan parameterselectie echt lastig zijn. Met zeven te tunen parameters is de zoekruimte groot, en fitten kan traag zijn op lange reeksen. auto_arima() uit pmdarima helpt dit te automatiseren. Maar er is geen snelkoppeling om te begrijpen wat de parameters daadwerkelijk betekenen, en daarom hebben we de componenten behandeld vóórdat we code aanraakten.

Conclusie

Ik heb altijd gevonden dat SARIMA onderbelicht wordt in inleidende forecastingcursussen. Het wordt onderwezen als "ARIMA, maar met seizoensgedoe", wat het laat klinken als een kleine uitbreiding. Dat is het niet. De seizoensparameters zijn er niet bij geplakt; ze doen echt structureel werk en leggen een laag in het gedrag van je data vast waar ARIMA simpelweg niet bij kan.

Wat SARIMA in de praktijk doet klikken, is inzien dat de niet-seizoens- en seizoenscomponenten geen aparte modellen zijn die parallel draaien. Ze interacteren. De AR- en MA-termen werken samen met hun seizoens-tweelingen, elk op een andere tijdschaal van autocorrelatie. Als dat eenmaal klikt, voelt ACF- en PACF-plots lezen minder als patroonherkenning en meer als je data echt begrijpen.

Werk je met maandelijkse, kwartaal- of andere regelmatig gecyclede data, dan is SARIMA het juiste startpunt, niet omdat het altijd het eindantwoord is, maar omdat het je dwingt helder na te denken over de structuur van je reeks. Van daaruit voegt SARIMAX externe voorspellers toe, en methoden zoals TBATS of Prophet pakken de rommeligere multi-seizoensgevallen aan. Onze Time Series Forecasting Tutorial en ARIMA Models in Python-cursus zijn allebei goede vervolgstappen.

SARIMA FAQ's

Waar staat SARIMA voor?

SARIMA staat voor Seasonal AutoRegressive Integrated Moving Average. Het breidt het standaard ARIMA-model uit door seizoensparameters toe te voegen—(P, D, Q) en de seizoensperiode S—die terugkerende patronen in tijdreeksdata vastleggen, zoals maandelijkse of kwartaalcycli.

Wat is het verschil tussen ARIMA en SARIMA?

ARIMA modelleert niet-seizoensgebonden patronen: trend, autocorrelatie en moving-average-effecten. SARIMA voegt een tweede laag parameters toe (P, D, Q, S) die dezelfde effecten modelleren bij seizoensvertragingen. Als je data terugkerende patronen op een vast interval laat zien—zoals hogere verkoop elke december—legt SARIMA die direct vast, terwijl ARIMA ze als onverklaarde residuvariantie laat liggen.

Hoe kies ik de juiste SARIMA-parameters?

Begin met controleren of je reeks stationair is met de Augmented Dickey-Fuller-test. Inspecteer vervolgens ACF- en PACF-plots: de niet-seizoens AR- (p) en MA- (q) ordes komen uit het patroon van afkappingen bij niet-seizoensvertragingen, terwijl de seizoensordes P en Q komen uit pieken bij seizoensvertragingen. Je kunt ook auto_arima() uit het pmdarima-pakket gebruiken om automatisch over parametercombinaties te zoeken, met AIC of BIC om het beste model te selecteren.

Hoe bepaal ik de seizoensperiode S voor mijn SARIMA-model?

De seizoensperiode S weerspiegelt hoe vaak het patroon zich herhaalt. Voor maanddata met jaarlijkse seizoensinvloed is S = 12. Voor kwartaaldata is S = 4. Voor weekdata is S = 52 (of afgerond van 52,18). Als de periode niet duidelijk is, gebruik dan tijdreeksdecompositie of inspecteer de ACF-plot op regelmatig verdeelde pieken—die pieken onthullen de dominante seizoensfrequentie.

Kan SARIMA meerdere seizoensperioden aan?

Standaard SARIMA kan één seizoensperiode tegelijk aan. Als je data meerdere gelaagde seizoensinvloeden heeft—zoals dagelijkse elektriciteitsvraag met zowel wekelijkse als jaarlijkse cycli—heb je alternatieven nodig zoals TBATS, Facebook Prophet of LSTM-netwerken, die zijn ontworpen om meerdere overlappende seizoensstructuren tegelijk te modelleren.

Welke Python-bibliotheek is het beste voor het fitten van SARIMA-modellen?

Python’s statsmodels-bibliotheek is de standaardkeuze en biedt SARIMAX() (dat flexibel genoeg is om SARIMA-modellen zonder exogene variabelen te fitten). Voor geautomatiseerde parameterselectie voert de functie auto_arima() uit de pmdarima-bibliotheek een gridsearch uit en is het de moeite waard om aan je workflow toe te voegen wanneer je niet zeker weet waar je moet beginnen met parameterwaarden.

Hoe beoordeel ik of mijn SARIMA-model goed past?

Na het fitten voer je plot_diagnostics() uit op het resultaatobject en controleer je of de residuen op witte ruis lijken zonder structuur—met name geen pieken bij seizoensvertragingen in de ACF. Vergelijk concurrerende modelspecificaties met AIC of BIC (lager is beter). Voor voorspellingsnauwkeurigheid op achtergehouden data zijn RMSE en MAPE de meest gangbare maatstaven.

Wat is SARIMAX en wanneer gebruik ik het in plaats van SARIMA?

SARIMAX voegt exogene variabelen—externe voorspellers—toe aan het SARIMA-raamwerk. Gebruik het wanneer je meetbare factoren hebt die je reeks beïnvloeden naast zijn eigen geschiedenis: promotie-uitgaven die retailverkopen beïnvloeden, temperatuur die energievraag beïnvloedt of macro-economische indicatoren die kwartaalomzet beïnvloeden. Als je enige data de reeks zelf is, volstaat SARIMA; zodra je relevante externe drijvers hebt, kun je die met SARIMAX direct opnemen.

Onderwerpen
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer ZienMeer Zien