Vijf jaar kassabonnen van tien winkels en vijftig producten, omgezet naar een dagelijkse voorspelling van wat er straks verkoopt. Plus een eerlijk beeld van hoe dichtbij die voorspelling komt.
Elke winkelier kent het gevoel. Een pallet van iets dat niet wegloopt, pal naast een gat in het schap waar de hardloper had moeten staan. Allebei kosten ze geld. Het eerste zet werkkapitaal vast dat je ergens anders had kunnen gebruiken. Het tweede is een klant die zonder aankoop naar buiten liep.
Deze keten heeft tien winkels en vijftig producten, met vijf jaar dagelijkse verkoop erachter. Dat zijn vijfhonderd losse vragen die elke dag beantwoord moeten worden: hoeveel verkoopt déze winkel van dít product? Dat houdt niemand in zijn hoofd. Onderbuikgevoel schaalt niet naar vijfhonderd antwoorden per dag.
Dus bouwden we iets dat die vijfhonderd vragen in één keer beantwoordt, drie maanden vooruit. Daarna hebben we gecontroleerd hoe dicht het erbij zat.
De methode is dezelfde of je nu winkelverkoop, cashflow of je zaterdagbezetting voorspelt. Hier staat hij in gewone taal.
Vijf jaar dagelijkse verkoop van elke winkel en elk product, opgeschoond en samengebracht in één consistente tabel. Er wordt niets weggegooid en niets verzonnen.
Verkoop is niet willekeurig. Het loopt op richting het weekend, zakt in januari en groeit jaar op jaar. Die patronen meten we, in plaats van ernaar te gissen.
Die patronen worden doorgetrokken naar de toekomst. Eerst voor elke winkel en elk product apart, daarna opgeteld tot de totalen die je hieronder kunt verkennen.
We hielden een heel jaar echte verkoop achter, lieten het model dat jaar blind voorspellen, en pas daarna legden we ze naast elkaar. Die vergelijking is het cijfer dat we rapporteren.
Het gekozen model is een SARIMAX (seasonal ARIMA) op log-verkoop. Een wekelijkse seizoensorde dekt het dag-van-de-week-patroon, Fourier-termen dekken het jaarpatroon. De benchmarks zijn een seasonal-naive regel, een multiplicatieve decompositie (niveau × weekdag × maand × jaargroei), en Prophet op standaardinstellingen.
De validatie is tijdgebaseerd. Elk model traint alleen op eerdere datums en voorspelt een later venster dat het nooit zag, over drie foldjaren (2015 tot en met 2017). Willekeurig shufflen is vermeden, omdat dat de toekomst in het verleden zou lekken. De scores zijn SMAPE (symmetric mean absolute percentage error). De voorspellingen per reeks worden opgeteld tot de geaggregeerde beelden op deze pagina.
Eén model bouwen en roepen dat het goed is, kan iedereen. Wij bouwden er vier, van een vuistregel van één regel tot een volwaardig statistisch model. Alle vier kregen exact dezelfde test.
Gemiddelde afwijking, lager is beter
Een statistisch model dat het week- en jaarritme van de verkoop leert en doortrekt. Degene die we gekozen hebben.
Neemt een basisniveau en vermenigvuldigt dat met de weekdag, de maand en de jaargroei. Simpel rekenwerk, en verrassend lastig te verslaan.
Een open-source voorspeltool, gedraaid op de standaardinstellingen.
Gaat ervan uit dat deze dinsdag precies verkoopt wat dezelfde dinsdag een jaar geleden verkocht. Het leert niets. Elke echte methode moet hier overheen.
Elke balk laat zien hoe ver die methode er gemiddeld naast zat, als percentage van wat er werkelijk verkocht is. Korter is beter. Een balk op 15% betekent: voorspelde de methode 100 stuks, dan lag de werkelijkheid meestal rond de 85 tot 115.
De drie echte modellen eindigen dicht bij elkaar, en ze verslaan alle drie ruim het simpelweg herhalen van vorig jaar. De eenvoudigste wint zelfs in een bepaald testjaar. Toch kozen we SARIMAX, omdat die het in álle geteste jaren het best volhield. Voor dagelijks gebruik telt stabiliteit zwaarder dan één keer winnen.
Alles hieronder is de echte uitkomst van het model. Geen mock-ups, geen screenshots. Verander de instellingen en de grafieken rekenen mee.
Elk product in elke winkel, bij elkaar opgeteld. De doorgetrokken lijn is wat er werkelijk verkocht is; de stippellijn is wat het model verwacht.
SARIMAX verwacht 2.164.645 stuks over de komende 90 dagen (1 januari 2018 tot en met 31 maart 2018). Tegen die stippellijn valt niets af te zetten, want de echte verkoop van die maanden is nooit openbaar gemaakt. Alleen complete weken en maanden worden getekend, zodat een halve periode aan het begin of eind niet op een instorting lijkt.
Een andere methode kiezen tekent alleen de stippellijn opnieuw. De doorgetrokken historie verandert nooit, want dat deel is geen voorspelling. Let op hoe de drie echte methodes dicht bij elkaar blijven terwijl vorig jaar herhalen ervandaan drijft.
Kies de producten die je wilt zien. Vergelijken tekent één lijn per product; Optellen voegt je hele selectie samen tot één lijn.
5 producten geselecteerd. 7.763.986 stuks verkocht in vijf jaar.
Weektotalen over alle tien de winkels, alleen complete weken van maandag tot en met zondag. Het gestippelde deel is de voorspelling van de methode die we gekozen hebben.
Elk cijfer hieronder komt uit verkoopdata die het model nog nooit gezien had toen het zijn voorspelling deed.
Dit is wat een voorspelling onderscheidt van een gok. We namen een periode echte verkoop en hielden die verborgen voor het model. Het model voorspelde die periode blind. Pas daarna legden we de twee naast elkaar.
Hoe lees je deze grafiek
De donkere lijn is wat er elke dag werkelijk verkocht is. Elke gekleurde lijn is één methode die diezelfde periode voorspelde zonder hem ooit gezien te hebben. Hoe dichter een gekleurde lijn tegen de donkere aan kruipt, hoe beter die methode het deed. Met de knoppen boven de grafiek zet je methodes aan of uit.
Elk cijfer op deze pagina komt uit een periode die we tijdens het trainen hebben achtergehouden. Het model voorspelde die blind. Dat zijn dezelfde omstandigheden als in de praktijk, dus het cijfer wordt niet mooier van data die het model al kende.
Vier methodes draaiden naast elkaar, van een vuistregel van één regel tot een gefit statistisch model, en werden identiek beoordeeld over drie losse jaren. De winnaar moest het verdienen.
De eenvoudigste methode kwam dicht in de buurt van de meest geavanceerde, en dat zeggen we liever dan dat we het verzwijgen. We kozen de methode die het in elk getest jaar volhield, in plaats van degene die toevallig één gelukkig venster won.
Een voorspelling is een goed onderbouwde schatting, geen belofte. Ze pikt op wat de data kan laten zien: de trend, het weekritme, het seizoen. Ze ziet geen concurrent aankomen die aan de overkant opengaat. Goed gebruikt verandert ze giswerk in iets dat je kunt meten en verbeteren.
Deze case gebruikt de publieke Kaggle-dataset "Store Item Demand Forecasting Challenge" uit 2018. We kozen bewust een openbare benchmark, zodat we de methode kunnen laten zien zonder de privécijfers van een klant bloot te geven.
Het was een "Knowledge"-competitie zonder ranking, medailles of plaatsingen, dus niets hier is een klassementspositie. De nauwkeurigheidscijfers zijn validatiescores op achtergehouden periodes, en Kaggle houdt de officiële testantwoorden privé. We tonen alleen geaggregeerde beelden, en publiceren de dataset zelf niet opnieuw.
Vraag, cashflow, capaciteit, personeelsbezetting. Als het een historie heeft, valt het waarschijnlijk te voorspellen. Vertel ons wat je wilt voorspellen en we zeggen eerlijk wat realistisch is.