Forecast in R

Tutorial Forecast in R
Forecast in R

Hoewel er steeds meer informatie op internet te vinden is over Forecasten, is dit nog weinig te vinden in het Nederlands. Ik heb een Nederlandse Tutorial gemaakt zodat ik mijn kennis kan delen.

Voor een grote media uitgeverij heb ik in R een sales forecast / omzetvoorspelling gemaakt voor de periode 2016/2017. In deze (Nederlandse) Forecast tutorial leg ik stap-voor-stap forecasten in R uit met behulp van een voorbeeld dataset en reproduceerbare R codes. Ook wordt uitleg gegeven over het gebruik van (auto)ARIMA.

Forecast package

Forecasten is het voorspellen/ schatten van een toekomstige (financiële) trend of gebeurtenissen. In dit geval gaat het om het voorspellen van toekomstige omzet op basis van beschikbare omzetdata uit het verleden en heden.

In deze blog wordt gebruik gemaakt van de R package forecast. Rob J. Hyndman, maker van deze package, is Professor of Statistics en schrijver van het online textboek Forecasting: principles and practice. Ik heb veel geleerd over forecasting dankzij hem. Ook heb ik het genoegen gehad hem te ontmoeten tijdens een conference in Eindhoven. Meer informatie over professor Hyndman is te vinden op zijn website.

Data

Gebruikte dataset is beschikbaar gesteld op datamarket.com, door Rob J. Hyndman en is te downloaden via deze link. Ga naar ‘Export‘, download het csv(,) bestand en zet de dataset in de juiste working directory.

In deze blog voorspellen we de sales op basis van Monthly car sales in Quebec 1960-1968.
Aangeraden wordt om de dataset te downloaden en iedere stap te volgen, voor het beter begrijpen van de procedure.

Alleen de eerste zeven jaar (96 rijen) van de dataset worden gebruikt, het laatste jaar (rij 97 tot en met 108) wordt bewaard zodat de forecast resultaten vergeleken kunnen worden met de echte waarden.

In het voorbeeld wordt gebruik gemaakt van een geschikte dataset waarvan de distributie al te zien was op de website. Met real-life data wordt aangeraden om eerst de data te controleren. Dat kan door het uitvoeren van exploratieve analyses en het plotten van de data zodat afwijkingen, missende waarden en vreemde patronen in de data ontdekt kunnen worden.

Timeseries

Voordat we de salesdata kunnen gebruiken maken we er eerst een timeseries object van. Controleer en order indien nodig datum in eigen dataset van hoog naar laag. Specificeer het begin en einde en geef een frequentie aan. In dit geval is er 12 keer per jaar een meting gedaan.
Let erop dat de timeserie hetzelfde begin- en eindpunt heeft als de dataframe.

Door het aangeven van de frequentie weet R dat het gaat om een maandelijkse meting. Door het start,- en eindpunt te geven weet R om welke maanden/jaren het gaat.

Voorbeeld tijdreeks

voorbeeld-ts-1

Onderliggende patronen

Met de functie decompose is het mogelijk om de timeserie op te breken in 3 verschillende timeseries, namelijk de trend , seizoen effecten en als laatste de overgebleven random effecten.

Additive timeserie

In dit geval is er sprake van een ‘additive’ decompositie, een timeserie waarbij seasonality gelijkmatig blijft naarmate de trend toeneemt. Indien de seasonality versterkt wordt bij een sterk toenemende trend, spreken we van een ‘multiplicative’ decomposition.

fc-dcmp-1

Arima

Met de juiste achtergrond is het makkelijker om het model te perfectioneren en de uitkomsten beter te begrijpen. In het voorbeeld wordt gebruik gemaakt van de functie auto.arima.

auto.arima

De R functie auto.arima, ontwikkeld door Hyndman and Khandakar is het automatische algoritme dat verschillende aspecten van modelselectie uitvoert. Dit model kan als basismodel gebruikt worden, hoewel dit niet altijd het beste model is en de meest nauwkeurige voorspellingen zal geven. Het uiteindelijke forecastmodel wordt over het algemeen beter indien er meer aan ‘gesleuteld’ wordt. In deze blog leg ik het basismodel uit.

Waar staat ARIMA voor?

ARiMA staat voor AutoRegressive integrated Moving Average.

AR ‘AutoRegressive'(p) is het procesgedeelte waar met behulp van een gewogen som van waarden geschat wordt wat de toekomstige waarden zullen zijn. Met andere woorden, dit gedeelte van het model geeft aan in welke mate vorige waarden een effect hebben op de huidige waarden.

I ‘Integrated’ (d) Voordat er een arima model wordt gemaakt, is het belangrijk dat de data stationary is. Met stationary wordt bedoeld dat de eigenschappen van de data op een bepaald moment onafhankelijk zijn van de tijd. Met andere woorden: er bevindt zich geen trend en seasonality in de tijd.
Het ‘integrated’ gedeelte van een ARiMA model zorgt ervoor dat de data stationary wordt, door te differentiëren. Bij differentiëren neem je het verschil van achtereenvolgende waarden. Hierdoor worden trends en seasonality verwijderd uit data. Indien de data nog steeds niet stationair zijn, kan dit nog een keer worden gedaan.

MA ‘Moving Average'(q) . Een moving average, in het Nederlands voortschrijdend gemiddelde, heeft over het algemeen als belangrijkste eigenschap een onderliggende trend te herkennen. In dit geval wordt de moving average gebruikt voor het voorspellen van toekomstige waarden. Dit gedeelte neemt de errors/residuals uit het model mee om een forecast te kunnen maken voor de toekomst.

Het arima model zal er als volgt uit komen te zien ARIMA(p,d,q)

Het automatische algoritme auto.arima geeft een goede indicatie van het model dat het beste gekozen kan worden, waardoor we niet meer handmatig alle verschillende modelopties hoeven te proberen. Aangeraden wordt wel om ‘omliggende’ modellen te bekijken voor de beste resultaten. Uiteindelijk wijst een zo laag mogelijke AIC/ BIC op een beter model.

Hoe werkt het auto.arima model?

Indien de data non-stationary zijn, dient er ‘gedifferentieerd’ ‘ te worden totdat de data stationary zijn.
Verschillende testen zijn er aanwezig om te controleren of een tijdreeks stationary is. Voorbeelden zijn de Augmented Dickey–Fuller test (ADF) of de Kwiatkowski-Phillips-Schmidt-Shin (KPSS) test. Het automatische algoritme van een auto.arima model combineert de twee verschillende testen en differentieert indien nodig, zodat de gebruiker zelf niet van te voren de data hoeft te differentiëren.

Na het vaststellen van het aantal keer dat er gedifferentieerd zal worden (meestal niet meer dan 2 keer) worden de waarden voor AR(p) en MA(q) stapsgewijs bepaald door het algoritme. Het algoritme zoekt op deze manier het beste model.

Het is ook mogelijk om zelf een arima model te maken.

Hoe kan ik forecasten met auto.arima?

Installeer en / of laad de forecast package

Maak een auto.arima model aan en bekijk het model:

Seizoenseffecten

Zoals hierboven is te zien, bestaat er ook een seasonal arima model. In sommige gevallen is het nodig om ‘seasonal differencing’ toe te passen, door het verschil te nemen van de huidige waarde en die van bijvoorbeeld een jaar geleden. Een Arima seasonal model ziet er als volgt uit

ARIMA(p,d,q)(P,D,Q)m de M staat voor het aantal perioden in een seizoen, in dit geval 12.

Forecast

Bovenstaande model gebruiken we voor het forecasten.
Met h kan de forecastperiode aangegeven worden. In dit voorbeeld gebruiken we 12 maanden.

fc-12m-1

Uitkomst Forecast

De donkerblauwe lijn laat de voorspelling voor de komende maanden zien, met daaromheen een 80- en 95% Confidence Interval (CI, betrouwbaarheidsinterval).
Over het algemeen worden de CI breder naarmate de tijdshorizon breder is. Echter stationary modellen (waar d=0) hebben een gelijkmatige CI.

Plot forecast met echte waarden

Het laatste jaar van de gebruikte data is apart gehouden zodat de voorspelling vergeleken kan worden met echte uitkomsten.

fc-validate-1

Model verkennen

Vaak loont het om de omliggende modellen van het ,door auto.arima gegeven, model te verkennen.
Aangeraden wordt om de omliggende parameters p en q (AR en MA) te veranderen door + of – 1 . Hiervoor kan Arima gebruikt worden. Het aantal maal dat er gedifferentieerd wordt blijft hetzelfde. Daarnaast kan een drift toegevoegd worden. Een drift zorgt ervoor dat de veranderingen in de tijd van de voorspelling vergelijkbaar zijn met de veranderingen in het verleden (bijvoorbeeld een opwaartse trend).

In sommige gevallen wordt er in auto.arima een model gemaakt met een lagere AIC waarden als ‘stepwise’ uit wordt gezet. Het nadeel hiervan is dat de berekening een stuk trager is.

In dit geval loont het om stepwise uit te zetten.

fc-final-1

Conclusie

In deze blog heb ik de basis van arima uitgelegd met een voorbeelddataset. Het basis model is nog niet perfect maar komt al wel in de buurt van een nauwkeurige forecast. In de blogs die volgen ga ik verder in op het handmatig bouwen van een forecastmodel, het toevoegen van extra voorspellers en het effect van de gekozen tijdreeksfrequentie.

Voor vragen en opmerkingen ben ik bereikbaar via email. Ook voor extra hulp bij het forecasten kan informatie worden gevraagd.