Ga naar hoofdinhoud
Data Science

ARIMAX: Zo voorspel je tijdreeksen met externe variabelen

Leer hoe ARIMAX ARIMA uitbreidt met externe voorspellers, begrijp de parameters en aannames, en bouw een voorspellingsmodel in Python met statsmodels.
Vinod Chugani's photo
Vinod Chugani
Bijgewerkt · 9 min lezen

Verken met AI

ChatGPTClaudePerplexity

Maak je gratis account aan

Oefen en volg je voortgang.

Ga Verder Met Google
Door verder te gaan accepteer je onze Gebruiksvoorwaarden, ons Privacybeleid en dat je gegevens worden opgeslagen in de VS.

Stel, je voorspelt de maandelijkse elektriciteitsvraag. Je hebt een solide ARIMA-model dat de autocorrelatie en trend van de reeks opvangt. Dan komt er een hittegolf en je voorspelling zit er 15% naast. De reeks veranderde niet; het weer wel. Precies voor zulke situaties is ARIMAX gemaakt: tijdreeksvoorspellingen waarbij externe factoren net zo veel variatie veroorzaken als de eigen geschiedenis van de reeks.

We behandelen wat ARIMAX is, hoe het verschilt van ARIMA en SARIMAX, en wanneer het zinvol is de ene boven de andere te gebruiken. We lopen ook een volledige Python-implementatie door met data‑voorbereiding, model‑fit, diagnostiek en evaluatie van voorspellingen, zodat je het geleerde direct kunt toepassen.

Wat is ARIMAX?

ARIMAX staat voor AutoRegressive Integrated Moving Average met eXogene variabelen. Het is een ARIMA-model dat ook externe inputs accepteert, oftewel voorspellers van buiten de doelsch reeks zelf. Voorbeelden die te binnen schieten: advertentiebudget, temperatuur, promotievlaggen, rentevoeten.

De algemene notatie is ARIMAX(p, d, q) met een of meer exogene regressoren. De p-, d- en q-parameters betekenen hetzelfde als bij ARIMA: de autoregressieve orde, de mate van differencing en de moving‑average‑orde. De "X" betekent dat je extra kolommen kunt meegeven waarvan je gelooft dat ze de target beïnvloeden. Één punt om nu te benadrukken: sommige softwarepakketten implementeren ARIMAX als een regressiemodel met ARIMA‑fouten in plaats van externe variabelen als directe AR‑inputs te behandelen. Het onderscheid is wiskundig subtiel, maar het is belangrijk voor hoe je coëfficiënten interpreteert. We komen hierop terug wanneer we naar de statsmodels‑output kijken.

Hoe ARIMAX werkt

ARIMAX combineert twee dingen: het geheugen van de reeks zelf en de verklarende kracht van externe variabelen.

De AR-, I- en MA‑componenten

De AR‑ (autoregressieve) component gebruikt vertragingswaarden van de doelreeks om de huidige waarde te voorspellen. Als de verkoop vorige maand hoog was, telt dat mee.

De I‑ (geïntegreerde) component differenteert de reeks om trends of unit roots te verwijderen en deze stationair te maken.

De MA‑ (moving average) component gebruikt eerdere voorspellingsfouten om te corrigeren voor systematische missers die het model maakt.

Samen pakken deze drie elementen veel van wat een typische tijdreeks drijft: trends, cycli en autocorrelatie in de residuen.

Waar exogene variabelen binnenkomen

Exogene variabelen leveren informatie die de eigen geschiedenis van de reeks niet kan geven. Als je verkoop voorspelt, vertellen eerdere verkopen je over typische patronen. Maar een prijsverlaging of een nieuwe concurrent is nieuwe informatie. Het model schat een coëfficiënt voor elke externe voorspeller, terwijl het tegelijk rekening houdt met autocorrelatie in de fouten.

Praktisch gezien: als je doelreeks goed wordt verklaard door zijn eigen verleden en je geen betrouwbare externe voorspellers hebt, is plain ARIMA waarschijnlijk genoeg. Maar wanneer je weet dat externe factoren meespelen, en je straks ook daadwerkelijk toekomstige waarden van die voorspellers hebt, levert ARIMAX meestal nauwkeurigere voorspellingen op.

ARIMA vs. ARIMAX vs. SARIMAX

SARIMAX bouwt verder op SARIMA door exogene variabelen toe te voegen. In de praktijk lopen de meeste Python‑implementaties van ARIMAX via SARIMAX() uit statsmodels, met de seizoensorde op nul gezet.

Dat is geen workaround. Het is de standaardaanpak. SARIMAX is een goede eerste keuze wanneer je reeks een duidelijk seizoenspatroon heeft of wanneer je externe regressoren nodig hebt; het handelt beide netjes af. Één kanttekening: "ARIMAX" en "SARIMAX" zijn niet in elk pakket uitwisselbaar. In sommige libraries zijn SARIMAX zonder seizoenscomponenten en ARIMAX functioneel identiek. In andere verschillen ze in hoe de exogene variabelen de likelihood binnenkomen. Check de documentatie van de tool die je gebruikt.

Wanneer gebruik je ARIMAX

Het komt meestal neer op één vraag: heb je externe voorspellers die het doel plausibel beïnvloeden, en heb je hun toekomstige waarden wanneer je gaat voorspellen?

Situaties waarin ARIMAX waarde toevoegt

Goede kandidaten zijn onder meer verkoopvoorspellingen met promotievlaggen of prijswijzigingen, energievraag met temperatuurinputs, websiteverkeer met campagnedruk, en economische indicatoren naast rentestanden. In elk geval biedt de externe variabele informatie die de reeks zelf niet kan genereren.

Plain ARIMA kan volstaan wanneer externe voorspellers niet beschikbaar of onbetrouwbaar zijn, of simpelweg de nauwkeurigheid buiten de steekproef niet verbeteren. Voorspellers toevoegen die meer ruis dan signaal brengen, helpt niet. Meer inputs garanderen geen betere voorspellingen. Evalueer elke voorgestelde voorspeller op een aparte hold‑outset voordat je je erop vastlegt.

Een woord over causaliteit

Een relatie tussen een voorspeller en het doel bewijst geen causaliteit. ARIMAX is een voorspellingskader; het schat associaties. Als advertentie-uitgaven correleren met verkoop omdat beide in december stijgen, kan het model dat oppikken, maar het zal je niet vertellen dat advertenties de stijging veroorzaakten. Dat onderscheid is belangrijk als je voorspellingen gebruikt om beslissingen te informeren in plaats van alleen uitkomsten te voorspellen. Het is de moeite waard dit expliciet te maken wanneer je resultaten presenteert.

Hoe bouw je een ARIMAX‑model in Python

Nu naar de implementatie.

We gebruiken een reproduceerbaar voorbeeld: maandelijkse ijsverkoop (stuks) met temperatuur (°C) en een promotievlag als exogene voorspellers. De dataset beslaat 48 maanden, opgesplitst in 36 maanden training en 12 maanden evaluatie.

Bereid de data voor

Begin met het laden of opbouwen van een DataFrame met een consistente maandelijkse datumindex. Bepaal je doelvariabele en je exogene kolommen en lijn alles op datum uit. Los missende waarden op vóór je splitst. Imputeer niet over de grens tussen train en test heen, want dat veroorzaakt leakage.

De regel die je vroeg moet internaliseren: welke exogene waarden je tijdens training meegeeft, heb je in equivalente vorm nodig op het moment van voorspellen. Als je geen toekomstige temperatuurvoorspellingen kunt krijgen, kun je temperatuur niet als voorspeller gebruiken. Dat is geen voetnoot; het sluit veel kandidaten uit.

import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller
from sklearn.metrics import mean_absolute_error

# Construct a sample monthly dataset
np.random.seed(42)
dates = pd.date_range(start="2020-01", periods=48, freq="MS")
temperature = 15 + 10 * np.sin(np.linspace(0, 4 * np.pi, 48)) + np.random.normal(0, 1, 48)
promotion = np.where((np.arange(48) % 6 == 0), 1, 0)
sales = (
    500
    + 8 * temperature
    + 150 * promotion
    + np.cumsum(np.random.normal(0, 10, 48))
)

df = pd.DataFrame({"sales": sales, "temperature": temperature, "promotion": promotion}, index=dates)

# Train/test split
train = df.iloc[:36]
test = df.iloc[36:]

Schalen is voor statsmodels‑schattingen meestal niet nodig, maar het helpt bij numerieke stabiliteit wanneer voorspellers op heel verschillende schalen staan. Of je schaalt, is een afweging.

Check de reeks en de voorspellers

Voordat je modelparameters kiest, inspecteer je de doelreeks visueel en voer je een stationariteitstest uit. De Augmented Dickey‑Fuller (ADF)‑test is standaard. Een p‑waarde onder 0,05 suggereert dat de reeks stationair is en waarschijnlijk geen differencing nodig heeft (d=0). Als de reeks een duidelijke trend heeft, zet je doorgaans d=1. Tests zijn één input; domeinkennis en visuele inspectie tellen ook.

Check ook je voorspellers: zijn ze uitgelijnd met de target? Is er een kans dat een voorspeller ná de voorspellingsdatum wordt gemeten? Een promotievlag die vóór de maandstart is gezet, is prima. Omzet van die maand niet.

Kies kandidaatparameters en fit het model

ACF‑ en PACF‑plots helpen bij het suggereren van kandidaatwaarden voor p en q. Een significante piek op lag 1 in de PACF met een afnemende ACF duidt vaak op AR(1); het omgekeerde duidt op MA(1). Vergelijk een kleine set kandidaten met AIC of BIC op de trainingsdata, en bewaar de testset uitsluitend voor de uiteindelijke evaluatie.

# Fit ARIMAX(1,1,1) via SARIMAX with no seasonal order
exog_train = train[["temperature", "promotion"]]
exog_test = test[["temperature", "promotion"]]

model = SARIMAX(
    train["sales"],
    exog=exog_train,
    order=(1, 1, 1),
    seasonal_order=(0, 0, 0, 0),
    trend="n"
)
result = model.fit(disp=False)
print(result.summary())

De summary()-output toont de ARIMA‑coëfficiënten naast de coëfficiënten van de exogene variabelen. Die temperatuurcoëfficiënt vertelt je hoeveel een stijging van één graad in temperatuur samenhangt met een verandering in het niveau van de verkoop, nadat de autoregressieve structuur het eigen momentum van de reeks heeft meegerekend. Iets om te weten: statsmodels gebruikt een regressie‑met‑ARIMA‑fouten‑formulering, wat betekent dat het differencen (d=1) wordt toegepast op het foutproces, niet op de regressievergelijking zelf. De coëfficiënt representeert het effect op het niveau van de verkoop, ongeacht d. In een transfer‑functie‑ARIMAX‑formulering (gebruikt door sommige andere pakketten) zou d=1 betekenen dat coëfficiënten effecten op veranderingen in plaats van niveaus weergeven. Dat onderscheid zorgt vaak voor verwarring, dus het is de moeite waard de documentatie van je tool te checken.

Check residuen en evalueer voorspellingen

Residuen zouden als white noise moeten ogen. Check de residu‑ACF‑plot op resterende autocorrelatie. Significante pieken betekenen dat het model structuur mist. Zie je systematische patronen op seizoenslags, schakel dan over naar SARIMAX met een seizoensorde.

# Generate out-of-sample predictions
predictions = result.forecast(steps=12, exog=exog_test)

# Evaluate
mae = mean_absolute_error(test["sales"], predictions)

# Naive baseline: forecast each period using the previous period's actual value
naive_forecast = np.concatenate([[train["sales"].iloc[-1]], test["sales"].values[:-1]])
naive_mae = mean_absolute_error(test["sales"], naive_forecast)

print(f"ARIMAX MAE: {mae:.1f}")
print(f"Naive MAE:  {naive_mae:.1f}")

Vergelijk de ARIMAX‑MAE met een naïeve baseline (de vorige periode als voorspelling gebruiken). Als ARIMAX het naïeve model op je testset niet verslaat, is dat een betekenisvol resultaat. De extra complexiteit is niet gerechtvaardigd. Ik heb dit vaker gezien dan je zou verwachten, vooral wanneer de exogene voorspellers rumoeriger zijn dan ze in‑sample lijken.

Voorspel toekomstige waarden

Voorspellen voorbij de trainingsperiode werkt hetzelfde als out‑of‑sample evaluatie: geef toekomstige exogene waarden mee aan de forecast()‑aanroep. Voor promotievlaggen is dit meestal eenvoudig, omdat je de promotiekalender vooraf kent. Voor temperatuur gebruik je doorgaans een weervoorspelling of historische seizoensgemiddelden.

Onthoud dit: de betrouwbaarheidsintervallen die statsmodels teruggeeft, zijn voorwaardelijk op de voorspellerwaarden die je aanlevert. Ze houden geen rekening met onzekerheid in die voorspellers. Als je temperatuurvoorspelling onzeker is, is de werkelijke voorspellingsonzekerheid groter dan de intervallen suggereren. Het is de moeite waard dat te communiceren als je resultaten presenteert aan mensen die erop handelen.

Veelvoorkomende uitdagingen en beperkingen

De implementatie hierboven is het ideale pad. Hier gaat het vaak mis.

  • Toekomstige voorspellers zijn mogelijk onbekend: Dit is de meest voorkomende praktische barrière. Als je toekomstige waarden van je exogene variabelen niet betrouwbaar kunt verkrijgen, kun je ze niet gebruiken. Energievraag voorspellen met de temperatuur van morgen vereist een temperatuurvoorspelling, niet die van gisteren.
  • Voorspellers kunnen informatie lekken: Een variabele die ná de voorspellingsdatum wordt gemeten, kan je in‑sample evaluatie veel beter doen lijken dan ze is. Wees zorgvuldig met de tijdstempels waar je voorspellers werkelijk op slaan.
  • Relaties kunnen veranderen: Coëfficiënten die op historische data zijn geschat, hoeven niet te blijven gelden. Een prijselasticiteit die twee jaar stabiel was, kan verschuiven na een marktschok, en 2024 en 2025 leverden er genoeg om dit minder theoretisch te laten voelen dan vroeger. Het model periodiek herinschatten is goed gebruik.
  • Gecorreleerde voorspellers bemoeilijken interpretatie: Sterk collineaire inputs kunnen individuele coëfficiëntschattingen instabiel maken. Dat schaadt niet altijd de voorspellingsnauwkeurigheid, maar maakt het wel lastiger te zeggen welke voorspeller het werk doet.
  • Meer inputs garanderen geen betere voorspellingen: Evalueer elke voorgestelde voorspeller ten opzichte van een baseline op hold‑outdata. Sommige features die in‑sample informatief lijken, voegen out‑of‑sample ruis toe.
  • Seizoenspatronen vragen om seizoenscomponenten: Als je reeks een consistent seizoenspatroon heeft, zoals maandelijkse verkoop met een piek in december, is SARIMAX met een seizoensorde de juiste keuze. ARIMAX alleen vangt dat niet.
  • Causaliteit staat niet vast: Nogmaals: ARIMAX is een voorspellingskader, geen methode voor causale inferentie. Gebruik coëfficiënttekens niet om causale claims te maken zonder aanvullende analyse.

Conclusie

ARIMAX bewijst zijn waarde wanneer je externe factoren hebt die het doel echt beïnvloeden, en je hun toekomstige waarden op het moment van voorspellen kunt aanleveren. Het is een logische uitbreiding op ARIMA, geen vervanging. Als je reeks zich netjes gedraagt en je geen betrouwbare voorspellers hebt, is plain ARIMA meestal het betere startpunt. Variabelen toevoegen voelt als vooruitgang. Soms is het dat niet.

De workflow draait om vier dingen die je goed doet:

  1. lijn je voorspellers correct uit,
  2. check op leakage vóór je evalueert,
  3. valideer op echt apart gehouden data, en
  4. vergelijk altijd met een simpele baseline.

Een ARIMAX‑model dat een naïeve voorspelling maar nipt verslaat, is niet beter dan die naïeve voorspelling. Het is alleen duurder.

Wil je dieper in de basis van tijdreeksen duiken, bekijk dan onze cursus Time Series Analysis in Python, met uitgebreide aandacht voor ARIMA, stationariteit en diagnostiek. Voor de statsmodels‑kant bouwt onze cursus Introduction to Regression with statsmodels in Python de statistische intuïtie op die je wilt hebben bij het interpreteren van model‑samenvattingen en het checken van residuen.


Vinod Chugani's photo
Author
Vinod Chugani
LinkedIn

Vinod Chugani begon zijn carrière in Tokio als JPMorgans jongste Head van de Hedge Fund Sales Desk en vestigde later een individueel verkooprecord bij Lehman Brothers, bouwde daarna een elektronicadistributiebedrijf in 30 landen uit tot voorbij SG$100 miljoen omzet en maakte vervolgens de overstap naar data. Als afgestudeerde Economie aan Duke en alumnus van de NYC Data Science Academy was hij een van de drie beursontvangers uit meer dan 100 aanmeldingen voor Hugo Bowne-Andersons Building AI Applications-cursus op Maven. Tegenwoordig schrijft hij voor DataCamp, KDnuggets, Machine Learning Mastery en Statology over onderwerpen van statistiek tot agentische AI, en coacht hij dataprofessionals bij de NYC Data Science Academy met meer dan 1.000 één-op-één-sessies op zijn naam.

 

FAQs

Wat is het verschil tussen ARIMAX en ARIMA?

ARIMA voorspelt een doelreeks uitsluitend met zijn eigen vroegere waarden en eerdere voorspellingsfouten. ARIMAX breidt dit uit door exogene variabelen op te nemen—externe inputs zoals temperatuur, promoties of rentevoeten—waarvan wordt aangenomen dat ze de target beïnvloeden. Als die externe factoren werkelijk variatie in je reeks aandrijven en je hun toekomstige waarden kunt aanleveren, levert ARIMAX doorgaans betere voorspellingen op dan alleen ARIMA.

Hoe verschilt ARIMAX van SARIMAX?

ARIMAX kan overweg met externe variabelen maar niet met seizoenspatronen. SARIMAX voegt seizoens‑AR, differencing en MA‑termen toe boven op ARIMAX, waardoor het de juiste keuze is wanneer je reeks een terugkerende seizoensstructuur heeft. In Python’s statsmodels wordt ARIMAX doorgaans geïmplementeerd via SARIMAX() met de seizoensorde op (0, 0, 0, 0) gezet. In die configuratie zijn ze functioneel hetzelfde model.

Moet ik toekomstige waarden van exogene variabelen aanleveren om met ARIMAX te voorspellen?

Ja—dit is een van de belangrijkste praktische beperkingen. Bij het genereren van voorspellingen voorbij de trainingsperiode moet je voor elke exogene variabele waarden aanleveren op elk toekomstig tijdstip. Voor promotievlaggen of feestdagindicatoren is dit meestal eenvoudig. Voor variabelen zoals temperatuur of grondstoffprijzen heb je voorspelde waarden of redelijke aannames nodig, wat extra onzekerheid introduceert.

Hoe kies ik p, d en q voor een ARIMAX‑model?

Begin met de ACF‑ en PACF‑plots van de (gedifferentieerde) doelreeks. Een significante piek op lag 1 in de PACF en een afnemende ACF duiden vaak op AR(1); het omgekeerde patroon duidt op MA(1). Gebruik domeinkennis en de ADF‑test om d te bepalen. Vergelijk vervolgens een kleine set kandidaatcombinaties (p, d, q) met AIC of BIC op de trainingsdata. Vermijd het gebruik van de testset tijdens deze selectiestap—die is alleen voor de uiteindelijke evaluatie.

Wat betekent de coëfficiënt op een exogene variabele in een ARIMAX‑model?

De coëfficiënt representeert de geschatte verandering in het niveau van de doelreeks die samenhangt met een toename van één eenheid in die voorspeller, na rekening te hebben gehouden met de autoregressieve structuur. In statsmodels geldt dit zelfs wanneer d=1, omdat het differencen wordt toegepast op het foutproces en niet op de regressievergelijking (dit is de regressie‑met‑ARIMA‑fouten‑formulering). Sommige andere pakketten gebruiken een transfer‑functieformulering waarbij d=1 betekent dat coëfficiënten effecten op veranderingen in plaats van niveaus weerspiegelen, dus check de documentatie van je tool. Interpretatie kan ook lastig zijn wanneer voorspellers op verschillende schalen staan of onderling gecorreleerd zijn; standaardiseren is zinvol als je coëfficiënten wilt vergelijken.

Hoe detecteer en behandel ik multicollineariteit in exogene voorspellers?

Bereken de Variance Inflation Factor (VIF) voor elke voorspeller vóór het fitten. Waarden boven 10 suggereren problematische collineariteit. Als je die vindt, probeer dan de minst theoretisch onderbouwde voorspeller te verwijderen, of combineer gecorreleerde variabelen tot één composiet. Hoge collineariteit schaadt niet per se de voorspellingsnauwkeurigheid, maar maakt individuele coëfficiënten onbetrouwbaar en lastig te interpreteren.

Hoe beoordeel ik of ARIMAX echt waarde toevoegt?

Vergelijk altijd met een eenvoudige baseline—een naïeve voorspelling (de waarde van de vorige periode gebruiken) is een goed startpunt. Als ARIMAX die niet verslaat op apart gehouden testdata, verdient het model zijn complexiteit niet. MAE en RMSE zijn allebei redelijke metrics; MAE is makkelijker uit te leggen aan stakeholders. Voer de vergelijking uit op een echte testset die nooit voor parameterselectie is gebruikt.

Wanneer moet ik SARIMAX gebruiken in plaats van ARIMAX?

Gebruik SARIMAX wanneer je reeks een consistent seizoenspatroon vertoont—maandelijkse verkoop met een piek in december, wekelijks webverkeer met een maandagpiek, enzovoort. SARIMAX voegt seizoens‑AR, differencing en MA‑componenten toe die ARIMAX mist. Aangezien Python’s statsmodels ARIMAX toch via SARIMAX() implementeert, is de praktische vraag alleen of je een niet‑nul seizoensorde instelt. Als je residuen na het fitten van ARIMAX significante autocorrelatie op seizoenslags tonen, is dat een signaal om seizoenscomponenten toe te voegen.

Onderwerpen
Data Science

Leren met DataCamp

Cursus

Voorspellen in R

5 uur
52.8K
Leer de toekomst voorspellen met tijdreeksprognoses in R, met ARIMA-modellen en exponentiële smoothingmethoden.
Bekijk detailsStart Cursus

Maak je gratis account aan

Oefen en volg je voortgang.

Ga Verder Met Google
Door verder te gaan accepteer je onze Gebruiksvoorwaarden, ons Privacybeleid en dat je gegevens worden opgeslagen in de VS.
Meer bekijken
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 bekijken