Data Science
Hoe data-analyse voorspelt wie een voetbalwedstrijd wint
FC Utrecht is kampioen van de Eredivisie. Ja, je leest het goed—dit zou zomaar de krantenkop kunnen zijn in mei 2025. FC Utrecht maakt namelijk kans om voor het eerst in de geschiedenis de titel te pakken. Kunnen we de datum voor de Utrechtse optocht over de Oudegracht alvast vastleggen? Misschien nog niet, maar de data laat zien dat de mogelijkheid bestaat dat FC Utrecht kampioen wordt. Hoe we die kans precies berekenen, lees je in de volgende blogpost.
Voetbal draait niet alleen om techniek en tactiek; het gaat steeds meer om data. Van het aantrekken van nieuwe spelers tot het managen van vermoeidheid, data is essentieel geworden voor succes. In deze blogpost laten we zien hoe je van voetbal een statistisch spelletje kan maken. We nemen je mee in het gebruik van slimme algoritmes waarmee je voetbalwedstrijden steeds nauwkeuriger kunt voorspellen.
Belangrijkste factoren voor het voorspellen van een voetbalwedstrijd
Om een voetbalwedstrijd te voorspellen is het essentieel om de sterkte van beide teams op een of andere manier meetbaar te maken. Een sterker team heeft doorgaans een hogere kans om te winnen. Maar hoe meet je die sterkte? Er zijn verschillende factoren die je kunt gebruiken om dit te bepalen.
Ten eerste is er de stand op de ranglijst: teams die hoog op de ranglijst staan, presteren over het algemeen beter dan teams die lager staan. Dit geeft echter niet het volledige beeld. Het kan bijvoorbeeld voorkomen dat een team in het begin van de competitie slecht presteerde, maar onlangs een sterke opmars heeft gemaakt.
Dit brengt ons bij het tweede punt: de vorm van beide teams. Teams die recent goede resultaten hebben geboekt, hebben doorgaans een grotere kans om hun volgende wedstrijd te winnen.
Daarnaast zijn er externe factoren die van invloed kunnen zijn op een wedstrijd. Denk bijvoorbeeld aan blessures van belangrijke spelers, een recente trainerswissel of een druk speelschema dat leidt tot vermoeidheid bij spelers. Het is lastig om deze factoren nauwkeurig te meten, omdat er veel afhankelijkheden spelen en de beschikbare data vaak beperkt is. Toch is er één externe factor die uitgebreid is onderzocht: het thuisvoordeel. Uit verschillende studies blijkt dat teams die thuis spelen, een duidelijk grotere kans hebben om te winnen dan wanneer ze uit spelen. Dit effect nemen we daarom mee in ons model.
Expected Goals(xG)
Een van de belangrijkste statistieken die wij gebruiken om voetbalwedstrijden te voorspellen is Expected Goals (xG). Veel voetbalfans zullen deze term inmiddels kennen, maar wat betekent het precies en hoe wordt het berekend?
Zoals de naam al aangeeft is de Expected Goals-statistiek een waarde voor het aantal doelpunten dat een team verwacht te maken tijdens een wedstrijd. De statistiek is gebaseerd op de kwaliteit van de kansen die een team creëert. Voor elk schot van een team wordt een xG-waarde toegewezen. Deze waarde wordt berekend door historische data te analyseren en te kijken hoe vaak er gescoord werd vanuit vergelijkbare situaties. De xG-waarde van een schot kan daarom gezien worden als de kans dat een schot een doelpunt wordt. Een penalty heeft bijvoorbeeld een xG-waarde van 0.8, wat betekent dat er 80% kans is op een doelpunt.
Door de xG-waarden van alle schoten tijdens een wedstrijd op te tellen krijg je de totale xG-waarde van een team in een wedstrijd.
Een team met een totale xG-waarde van 2 heeft dus geen garantie op precies 2 doelpunten, maar op basis van historische data zouden we verwachten dat het team ongeveer 2 doelpunten zou hebben gescoord. Het geeft een goed beeld van de kwaliteit van hun aanvallen en de kansverdeling voor het aantal verwachte doelpunten. Binnen ons model is de xG een cruciale statistiek en zal verder in deze blog nog meer aan bod komen.
Data
Voor nauwkeurige voorspellingen maken we gebruik van gegevens van Eredivisiewedstrijden uit de afgelopen vijf seizoenen. Voor elk team beschikken we over de xG-waarde van iedere wedstrijd die ze in deze periode hebben gespeeld.
Bij sommige teams is de dataset echter beperkter, omdat ze niet al die seizoenen in de Eredivisie speelden. Teams die een of meerdere seizoenen op een lager niveau actief waren, hebben daar tegen zwakkere tegenstanders gespeeld. Omdat de kwaliteit van de competitie op dat niveau niet vergelijkbaar is met die van de Eredivisie, beschouwen we de xG-waarden uit die wedstrijden als niet relevant. Daarom zijn deze wedstrijden niet meegenomen in onze analyse.
Analyse
Voor het voorspellen van een voetbalwedstrijd hanteren we drie stappen:
- Simuleer het aantal doelpunten voor beide teams.
- Noteer de winnaar (of gelijkspel).
- Herhaal dit 10.000 keer en bepaal welk resultaat het vaakst voorkomt.
Bij het simuleren van het aantal doelpunten maken we gebruik van de Expected Goals (xG)-statistiek. We berekenen de gemiddelde xG-waarde van elk team over de afgelopen vijf seizoenen, en gebruiken deze als parameter in een Poisson-verdeling om het aantal doelpunten van een team te simuleren. Dit proces wordt voor beide teams herhaald, wat een gesimuleerd resultaat van de wedstrijd oplevert. Door deze simulatie duizenden keren uit te voeren, schatten we de kans op verschillende uitkomsten van de wedstrijd.
Waarom de Poisson-verdeling?
De Poisson-verdeling is geschikt omdat het een discrete verdeling is. Dit betekent dat het aantal gesimuleerde doelpunten een geheel getal is, zoals 0, 1 of 2. Zou je een continue verdeling gebruiken, zoals een normale verdeling, zou je uitkomsten kunnen krijgen zoals 2,21 doelpunten, wat niet overeenkomt met de werkelijkheid. Bovendien zou de kans op een gelijkspel nagenoeg nihil zijn, omdat de kans dat twee continue variabelen exact gelijk zijn praktisch nul is voor een continue verdeling. De simulaties werken beter als je iets simuleert dat dicht bij de werkelijkheid staat, vandaar dat de Poission verdeling geschikter is.
Daarnaast is de Poisson-verdeling rechtsscheef (right-skewed), wat betekent dat de kans op lage aantallen doelpunten (zoals 0 of 1) van een team veel groter is dan de kans op hogere aantallen. Dit komt wederom overeen met de werkelijkheid, waarin teams vaker 0, 1 of 2 doelpunten maken dan 4 of 5.
Om te beoordelen of de Poisson-verdeling een geschikte benadering is voor het aantal gescoorde doelpunten, bekijken we de doelpuntenverdeling van twee teams: RKC en Feyenoord. In de onderstaande afbeelding toont de linkerzijde de werkelijke verdeling van gescoorde doelpunten door beide teams over de afgelopen vijf jaar. Rechts is een gesimuleerde verdeling te zien, gebaseerd op een Poisson-verdeling met een parameter die is afgeleid van de gemiddelde xG van beide teams gedurende diezelfde periode.
De histogrammen laten een vergelijkbare trend zien, wat bevestigt dat de Poisson-verdeling een passende benadering biedt voor de verdeling van gescoorde doelpunten door een team.
Aanpassingen aan het model om alle factoren mee te nemen
Zoals eerder besproken, zijn er verschillende factoren die we in ons model moeten verwerken. De stand op de ranglijst wordt redelijk goed weerspiegeld door de Expected Goals statistiek: teams die hoger op de ranglijst staan, hebben doorgaans een hogere gemiddelde xG-waarde. Dit is ook te zien in het voorbeeld van de verdelingen hierboven.
Om de vorm van teams mee te nemen, is het beter om het gemiddelde van de xG-waarde te vervangen door een gewogen gemiddelde xG-waarde. Hierbij krijgen recentere resultaten een hoger gewicht, zodat ze meer invloed hebben op de gemiddelde xG-waarde. Dit zorgt ervoor dat recente prestaties zwaarder meetellen in het model en daarmee ook de voorspellingen beïnvloeden. Er zijn verschillende methodes om de exacte gewichten te bepalen, maar dat laten we voor nu buiten beschouwing.
Om het thuisvoordeel mee te nemen, verhogen we de xG-waarde van een team wanneer ze thuis spelen. Dit vergroot de kans op meer doelpunten en daarmee ook de kans op winst. In ons model stijgt de xG-waarde van een team dat thuis speelt met 0,2.
Mocht je geïnteresseerd zijn in de methode voor het bepalen van de gewichten of de reden achter de keuze voor een stijging van 0,2 bij het thuisvoordeel, neem dan gerust contact op!
Voorbeeldanalyse
Laten we een voorbeeld bekijken om te zien hoe ons model precies werkt. We richten ons hierbij op de wedstrijd NAC – FC Utrecht van zaterdagavond 24 augustus 2024. Op basis van het gewogen gemiddelde xG van de afgelopen vijf seizoenen heeft NAC een xG van 1,12, terwijl FC Utrecht een hogere gewogen gemiddelde xG van 1,52 heeft. Omdat NAC echter thuis speelt en het op een 'Avondje NAC' flink kan spoken, verhogen we de xG-waarde van NAC met 0,2, wat resulteert in een xG van 1,32.
Vervolgens simuleren we deze wedstrijd 10.000 keer. De resultaten zijn te zien in de afbeeldingen hieronder. In de eerste afbeelding worden de uitkomsten van de gesimuleerde wedstrijden weergegeven. Hieruit blijkt dat het resultaat 1-1 het meest voorkomt, gevolgd door 1-0 voor FC Utrecht, 1-0 voor NAC, en een 2-1 overwinning voor Utrecht. De rechterafbeelding toont de percentages van deze uitkomsten; hieruit blijkt dat FC Utrecht in 42% van de simulaties wint, waaruit we kunnen concluderen dat ons model voorspelt dat FC Utrecht de winst mee naar huis zal nemen.
De uiteindelijke wedstrijd eindigde in een 2-1 overwinning voor FC Utrecht, wat in lijn is met ons model.
Resultaten van het model
Het vorige voorbeeld ging over één wedstrijd, maar het model wordt gebruikt voor elke wedstrijd in de Eredivisie. Je bent vast benieuwd naar de resultaten van het model. Op het moment van schrijven zijn er acht speelrondes in de Eredivisie geweest, wat neerkomt op 70 gespeelde wedstrijden (Feyenoord-Ajax en Ajax-Utrecht moeten nog worden ingehaald). Van die 70 wedstrijden heeft het model er 42 correct voorspeld, wat een nauwkeurigheid van 60% geeft.
Een andere manier om de prestaties van ons model te beoordelen, is door het te vergelijken met de wedkantoren. We zijn begonnen met een budget van 100 euro, dat we gelijkmatig verdeelden over alle wedstrijden. We zetten telkens in op de uitkomst die ons model voorspelt. Na elke speelronde berekenen we een nieuw budget op basis van onze inzet en de odds van de correcte voorspellingen. Vervolgens gebruikten we dat nieuwe budget voor de volgende speelronde. Nu, na acht speelrondes, hebben we een budget van 107 euro – een rendement van 7% in slechts een paar maanden!
Seizoenssimulatie
Om terug te komen op het statement aan het begin van deze blog en de droom van de krantenkop, kunnen we naast het simuleren van individuele wedstrijden ook het hele Eredivisieseizoen simuleren. Door dit proces herhaaldelijk uit te voeren, kunnen we schattingen maken van de eindklassering voor elke club. Naarmate het seizoen vordert en er meer data beschikbaar komt, worden deze schattingen steeds nauwkeuriger.
In de afbeelding hieronder zie je de geschatte kans dat FC Utrecht aan het eind van het seizoen kampioen wordt. Hoewel de kans momenteel nog steeds erg klein is (minder dan één procent), toont de trend van de afgelopen speelrondes dat de kansen langzaam toenemen. Wanneer we deze trend doortrekken naar het einde van het seizoen, zien we dat de kans zelfs bijna 50% wordt dat Utrecht kampioen eindigt.
Kortom, er gloort hoop voor de supporters van FC Utrecht!
Conclusie
Data-analyse biedt een krachtige manier om de uitkomsten van voetbalwedstrijden te voorspellen. Door historische data, Expected Goals en geavanceerde statistische methoden te combineren, kunnen we nauwkeurige voorspellingen doen die zowel AI-enthousiastelingen als voetbalfans aanspreken.
Benieuwd hoe deze data-analyse jouw kijk op voetbal kan veranderen? Of heb je ideeën voor het optimaliseren van het model? Boek een gesprek met een van onze data-analisten en ontdek de mogelijkheden
Of je nu een data-analist, voetbalfan of AI-engineer bent, we hopen dat deze blogpost je inspireert om verder te kijken naar de kracht van data in de sportwereld.