Ga naar hoofdinhoud
Machine Learning
Data Science

Sportanalytics: zo voorspelde ik de finale van EURO 2024

Dit artikel verkent hoe sportanalytics en machine learning kunnen worden toegepast om uitslagen van EURO 2024 te voorspellen, en gaat in op de uitdagingen en methodologieën.
Tom Farnschläder's photo
Tom Farnschläder
Bijgewerkt · 15 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.

Toen ik 14 was, plaatste ik mijn eerste voetbalweddenschap op de winnaar van het WK 2010. Puur op intuïtie voorspelde ik per wedstrijd en zette ik in op de twee finalisten uit mijn toernooischema: Nederland en Spanje. Uiteindelijk haalden die twee teams de finale—ik was door het dolle heen dat mijn voorspellingen uitkwamen.

Veertien jaar later zocht ik een project om mijn Python- en machinelearningskills te verdiepen, wat leidde tot een voorspelproject voor EURO 2024. Mijn hoofddoel was om wedstrijduitslagen (winst, gelijkspel of verlies) en het aantal doelpunten per team te voorspellen.

In dit artikel geef ik een overzicht van mijn EURO 2024-voorspelproject, met de belangrijkste stappen die ik nam, de uitdagingen die ik tegenkwam en de inzichten die ik opdeed. Voor de technische details, inclusief de code, verwijs ik naar het bijbehorende notebookproject—je hebt een DataLab-account nodig om alle bestanden te bekijken.

Uitdagingen bij het voorspellen van voetbaluitslagen

Voetbaluitslagen voorspellen is berucht lastig door meerdere factoren. In het voetbal is de statistische verdeling van doelpunten behoorlijk variabel. Tegelijkertijd zijn er relatief weinig scoringskansen per wedstrijd vergeleken met andere teamsporten met een bal, wat tot onvoorspelbare uitkomsten leidt.

Neem handbal: de vele scoringskansen zorgen daar voor voorspelbaardere resultaten, omdat het aantal doelpunten de creatie en het voorkomen van kansen beter weerspiegelt naarmate het aantal pogingen over de wedstrijd gemiddeld wordt. In voetbal kan het echter genoeg zijn om het “bus parkeren” voor je goal te combineren met één gedreven counter om de wedstrijd op zijn kop te zetten.

Daarnaast zijn voetbalwedstrijden gekenmerkt door sterke padenafhankelijkheid: het spelbeeld en de uitkomst hangen vaak sterk af van het eerste doelpunt. Kleine maar bepalende acties kunnen tot een goal of rode kaart leiden en daarmee het verloop van de wedstrijd drastisch veranderen, wat voorspellen nog lastiger maakt.

De introductie van VAR (Video Assistant Referee) in de afgelopen jaren heeft de onvoorspelbaarheid verder vergroot, omdat hiermee cruciale beslissingen op het veld teruggedraaid kunnen worden. En dan is er nog de ongrijpbare “vorm van de dag”, een factor waar ik als fan van het berucht onvoorspelbare Eintracht Frankfurt (veelzeggend bijgenaamd de “Launische Diva”) een boek over zou kunnen schrijven.

Sport Analytics for EURO 2024

Strategieën om datalimieten te tackelen

Naast de genoemde factoren kampt mijn voorspelmodel ook met extra datalimieten die ik moest aanpakken.

  • Gebrek aan spelerspecifieke data: Zonder gedetailleerde spelerdata, zoals de aanwezigheid van sleutelspelers, individuele prestatiestatistieken of blessures, kan het model kritieke factoren missen die de uitslag beïnvloeden. Hoewel nationale teams niet zo blootstaan aan de volatiliteit van de transfermarkt als clubs, verandert de samenstelling van selecties door de jaren heen flink, dus het zou nuttig zijn als de data dat weerspiegelt.
  • Gebrek aan in-game data: Het ontbreken van live statistieken, zoals balbezitpercentages of passnauwkeurigheid tijdens de wedstrijd, verkleint de precisie van het model. Gegevenspunten zoals de minuut en het team van het eerste doelpunt zouden ook helpen om patronen in de genoemde padenafhankelijkheid te traceren en zo de vermoedelijke richting van de wedstrijd beter te voorspellen. 

Om met deze dataproblemen om te gaan, heb ik verschillende strategieën toegepast:

Imputeren van ontbrekende data

Ik heb waar mogelijk ontbrekende datapunten aangevuld om het dataset compleet te houden—bijvoorbeeld door tactische formaties toe te voegen voor de te voorspellen wedstrijden.

Omdat de meeste teams vasthouden aan dezelfde formatie zodra die is ingeslepen en getest, nam ik aan dat elk team in de formatie speelt die het het vaakst gebruikte in de laatste vijf wedstrijden. Zo kunnen we voorspellen vóórdat de opstellingen bekend worden, wat pas een uur voor de aftrap gebeurt.

Features uitsluiten of vervangen

Als imputeren of verwijderen niet praktisch was, sloot ik bepaalde features uit of verving ik ze om de nauwkeurigheid van het model niet te ondermijnen.

Oorspronkelijk wilde ik bijvoorbeeld een tweelagige voorspelling doen waarbij primaire features worden gebruikt om secundaire features zoals balbezit en expected goals te voorspellen, en de uitslag mede daarop te baseren. Omwille van de eenvoud heb ik hier toch van afgezien, en in plaats daarvan elk team twee features gegeven op basis van gemiddelde wedstrijdstatistieken om hun speelstijl te representeren.

Ontbrekende data verwijderen

Waar imputeren niet haalbaar was, heb ik de ontbrekende data verwijderd om de integriteit van het dataset te behouden. Gelukkig ging het maar om een klein verlies aan observaties, waardoor er nog steeds meer dan 3.000 wedstrijden overbleven voor modelbouw. 

Datapijplijn: van verzameling tot voorspelling

Nu de moeilijkheden en beperkingen zijn behandeld, bekijken we het proces om ruwe data om te zetten in bruikbare voorspellingen. De datapijplijn, de ruggengraat van het project, omvatte het verzamelen, voorbewerken en voorbereiden van data voor modellering, met gebruik van diverse tactische, psychologische en historische features.

Datascraping

De eerste stap was het scrapen van historische wedstrijddata uit verschillende bronnen, waaronder Transfermarkt, om uitgebreide informatie over eerdere wedstrijden te verzamelen.

Eén rij in de resulterende DataFrame komt overeen met één wedstrijd vanuit het perspectief van een van de betrokken teams. Deze data is gecombineerd met FootyStats-data om speelstijlfeatures toe te voegen, zoals gemiddeld balbezit en efficiëntiemetingen.

Voor meer details, bekijk de datascraping-notebook hier.

Feature engineering

Vervolgens is ruwe data omgezet in betekenisvolle features die de machinelearningmodellen kunnen gebruiken. Dit omvatte het extraheren van waarden, het transformeren van variabelen en het berekenen van gemiddelden.

A diagram of different colored dots

Clusters van efficiëntie versus kwetsbaarheid van alle teams in het dataset

Verschillende kernfeatures zijn geïdentificeerd en gebruikt in de modellen om de nauwkeurigheid te vergroten. Deze features omvatten:

  • Tactische formaties: De formatie van beide teams en hun aantal spitsen en verdedigers. Het doel was patronen in uitkomsten te vinden tussen populaire formaties en de aanvallende en verdedigende kwaliteiten van teams.
  • Favoriet/underdog-status: Om dit eenvoudig en objectief te meten, heb ik deze feature afgeleid van de UEFA Nations League-niveaus (en overeenkomstige FIFA-wereldranglijstreeksen voor niet-Europese teams) om aan te geven welk team naar verwachting beter presteert.
  • Teamvorm: Het gemiddelde aantal gescoorde en geïncasseerde doelpunten in de laatste vijf wedstrijden gaf inzicht in het huidige aanvallende en verdedigende niveau van elk team.
  • Speelstijl: Gemiddeld balbezit en clusters van metrics voor efficiëntie versus kwetsbaarheid (zie grafiek hierboven) zijn gebruikt om de speelstijl van een team te vangen. Efficiëntie is berekend als de verhouding tussen doelpunten en expected goals (xG), zowel voor eigen gemaakte als geïncasseerde doelpunten. De clusters zijn alleen op de gekwalificeerde teams gefit, omdat die de focus zijn, en daarna toegepast op alle andere teams met minstens één wedstrijd in het dataset. Let op: voor niet-Europese teams kan de waarde flink afwijken door het beperkte aantal wedstrijden in de data.
  • Fase: De toernooifase (groepsfase of knock-outfase) is meegenomen om de verschillende drukniveaus voor teams te modelleren. Het idee was om prestatiepatronen te ontdekken afhankelijk van de inzet.
  • Teamessentie en langetermijntrends: Deze feature gaat uit van een onverklaarbare rest die te vangen is als de essentie van elk team. Gecombineerd met een tijdsvariabele representeert deze feature elementen die niet door andere features worden gedekt en zo een completer beeld geven van de algehele prestaties en trends.

Voordat de machinelearningmodellen worden gebouwd, wordt het dataset opgesplitst in niet-gespeelde en gespeelde wedstrijden om gelabelde en ongelabelde data te onderscheiden. Verder nemen we de logaritme van de sterk rechts-scheve vormfeatures en passen we normalisatie en one-hot encoding toe om de data in het juiste formaat te krijgen.

De teamvariabelen, inclusief de langetermijntrend, moeten geschaald worden met MinMaxScaler om te voorkomen dat de nullen (wedstrijden zonder het betreffende team) de schaal beïnvloeden. Alle overige numerieke features worden genormaliseerd met StandardScaler.

Modelselectie en workflow-implementatie

Om de effectiefste modellen voor voetbalvoorspellingen te vinden, begon ik met een brede selectie van machinelearningmodellen. Met een “black box”-benadering verkende ik diverse modellen om hun sterke en zwakke punten in het omgaan met de data te begrijpen. Voor elk model gebruikte ik de classificatievariant om wedstrijduitslagen te voorspellen en de regressievariant om het aantal doelpunten van beide teams te voorspellen. De geteste modellen waren onder meer:

  • Random Forest
  • Gradient Boosting
  • Extreme Gradient Boosting (XGBoost)
  • Support Vector Machine (SVM)
  • K-Nearest Neighbors
  • Extra Trees
  • Adaptive Boosting (AdaBoost)
  • Light Gradient Boosting Machine (LightGBM)
  • Categorical Boosting (CatBoost)
  • Lineaire regressie

Eerst zette ik een seed (mijn oude rugnummer, negen) voor reproduceerbaarheid. Het definiëren van labels en targets en de modelbouw bestonden uit verschillende stappen, die allemaal modelprestaties vergeleken met cross-validatie:

  1. Basismodellen evalueren: Alle genoemde modellen zijn geïnstantieerd, getraind en geëvalueerd met cross-validatie.
  2. Hyperparameter-tuning: In deze stap zijn de parameters van elk model geoptimaliseerd om de prestaties te verbeteren. Door fijn af te stellen konden de modellen zich beter aanpassen aan de data en nauwkeuriger voorspellen.
  3. Recursieve featureselectie: Recursieve featureselectie is gebruikt om de meest relevante features te identificeren. Deze techniek hielp om te focussen op de kenmerken met de grootste impact op de voorspellingen, wat de efficiëntie en nauwkeurigheid verbeterde. Sommige labelvoorspellingen waren echter beter met alle features; in dat geval gebruikte ik de versie met alle features.

Uiteindelijk selecteerde ik de best presterende modellen op basis van hun precisie bij het voorspellen van wedstrijduitslagen (winst/verlies) en de Root Mean Squared Error (RMSE) bij het voorspellen van het aantal doelpunten.

Ik koos twee modellen voor wedstrijduitslagen: één voor het voorspellen van winst en verlies, en een ander specifiek voor gelijkspellen. Dat onderscheid was nodig omdat de patronen en factoren achter gelijkspellen sterk verschillen van die achter winst en verlies. Om ervoor te zorgen dat de eindkansen voor alle drie de uitkomsten (winst, gelijkspel, verlies) optellen tot 100%, zijn de resultaten later genormaliseerd.

Modeltoepassing

Met de gekozen modellen en hun geselecteerde hyperparameters en features voorspel ik alle labels voor elke rij. Omdat er voor elke te voorspellen wedstrijd twee rijen zijn, krijgen we twee kansen per wedstrijduitslag en twee kommagetallen als voorspelde goals voor elk team.

Deze waarden zouden niet al te veel van elkaar mogen verschillen, en meestal doen ze dat ook niet—als dat wel zo is, markeren we de wedstrijd om aan te geven dat de voorspelling met een korreltje zout moet worden genomen. Om tot één waarde per label te komen, neem ik het gemiddelde van beide voorspellingen.

Voor wedstrijduitslagen heb ik de kansen op winst, gelijkspel en verlies genormaliseerd zodat ze samen 100% vormen. Ik heb ook extra kolommen gemaakt voor populaire opties zoals "dubbele kans". Op basis van het kommagetal aan voorspelde goals per team installeer ik een Poissonverdeling en leid ik kansen af voor elk mogelijk doelpuntentotaal per team en voor of de som van alle wedstrijdgoals over of onder 1,5, 2,5, 3,5, 4,5 en 5,5 ligt, waar vaak op gewed wordt.

Voor mijn tipvoorspellingen koos ik de uitkomst met de hoogste kans. Als de winstkansen van beide teams binnen 0,05 van elkaar lagen, interpreteerde ik dat als een gelijkspel. Voor doelpunten koos ik het meest waarschijnlijke aantal per team, met eventuele aanpassingen zodat het klopt met de voorspelde uitslag.

Om toekomstige EURO-wedstrijden te voorspellen heb ik de ruwe wedstrijddata aangevuld met de aanvankelijke voorspelde uitslagen. Door deze voorspellingen in het dataset op te nemen en de feature engineering opnieuw toe te passen, kon ik vervolgens de volgende ronde voorspellen op basis van het zich ontwikkelende toernooiverloop.

Modelprestaties meten: accuratesse vs. precisie

Het verschil tussen accuratesse en precisie begrijpen is cruciaal bij voetbalvoorspellingen, zeker met het oog op de toepassing ervan. Het contrast tussen wedden en tippcompetities illustreert het belang van deze statistieken:

Bij sportweddenschappen

Het doel is weddenschappen te vinden met een positieve verwachte opbrengst. Je moet dus waarschijnlijke uitkomsten identificeren en de odds van bookmakers meewegen om value bets te vinden.

Precisie is hier doorslaggevend, omdat het de juistheid van positieve voorspellingen (bijv. winst voorspellen) benadrukt. Hoge precisie helpt consequent ondergewaardeerde weddenschappen door bookmakers te vinden, wat direct je winstgevendheid beïnvloedt.

Houd er rekening mee dat wedkantoren hele teams hebben om zeer geavanceerde voorspelmodellen te bouwen en te onderhouden, die een eenvoudiger model als het mijne in de meeste gevallen waarschijnlijk zullen verslaan.

In een tippcompetitie

Het doel is om de uitslag van elke wedstrijd zo accuraat mogelijk te raden. Deelnemers verdienen punten voor elke juiste voorspelling en proberen over meerdere wedstrijden de meeste punten te verzamelen. De algemene accuratesse is hier belangrijker, omdat die meet hoe vaak je voorspellingen kloppen en dus je totaalscore beïnvloedt.

Het voorspellen van gelijkspellen is een perfect voorbeeld van het mogelijke verschil tussen beide maten. Slechts zo'n 20% van de wedstrijden in de trainingsdata eindigde in een gelijkspel, waardoor de meeste modellen de kans op een gelijkspel onderschatten en soms zelfs nooit een gelijkspel voorspellen.

Dat leidt tot een hoge accuratesse van zo'n 80%, omdat alle niet-gelijkspellen correct gelabeld zijn, maar tot een precisie van 0 voor gelijkspellen, omdat geen enkel gelijkspel als zodanig werd voorspeld.

Resultaten van de modelprestaties

De prestaties van de modellen verschilden per soort voorspelling:

  • Uitslagvoorspellingen
    • CatBoost en AdaBoost: Deze modellen waren het best in het voorspellen van winst/verlies, met een maximale accuratesse van 72% en een precisie van 70%.
    • SVC voor gelijkspellen: Dit model behaalde een accuratesse van 79% en een precisie van 47%—niet ideaal, maar een flinke verbetering ten opzichte van nul.
  • Doelpuntvoorspellingen
    • CatBoost en Gradient Boosting: Deze modellen presteerden het best voor het voorspellen van doelpunten, met een minimale RMSE van 1,19 goals en een maximale R2-score van 0,23. Hoewel deze scores laten zien dat er nog veel ruimte voor verbetering is, boden ze een solide basis.

Omdat verschillende modellen worden gebruikt, zijn er gevallen waarin uitslag- en doelpuntvoorspellingen niet matchen. Hoewel het lastig is om categorische en numerieke scores te vergelijken, denk ik dat je kunt stellen dat uitslagvoorspellingen over het algemeen beter werken dan doelpuntvoorspellingen; daarom worden die laatste waar nodig aangepast aan de eerste.

Distribution of Goals in All Played Matches

Verdeling van doelpunten in alle gespeelde wedstrijden

Opvallend is dat het model uitsluitend uitkomt op nul, één of twee als meest waarschijnlijke doelpuntentotaal voor een team in een wedstrijd. Gezien de algemene doelpuntenverdeling in de testdata is dat geen verrassing, maar het betekent wel dat het model nooit zal verwachten dat een doelpuntrijke wedstrijd de meest waarschijnlijke uitkomst is.

Voorspellingen in de praktijk: EURO 2024

De toepassing van de modellen op de eerste EURO-wedstrijden leverde interessante resultaten op!

Groepsfase

In driekwart van de gevallen voorspelde het model dat de favoriet zou winnen; in het overige kwart weerspiegelde de voorspelde uitslag de favoriet van de bookmakers niet.

Op het eerste gezicht leek die verhouding een aardige gok, want je mag aannemen dat er altijd verrassingen zijn. Maar dan komt het lastige deel, dat je bij voetbalvoorspellingen altijd hebt, of je nu op je gevoel of een model afgaat: wanneer heeft het zin om op de underdog te wedden?

Een strategie is om alleen en altijd op de favoriet te wedden. Dan heb je een deel van de verrassingen mis, maar je accuratesse is per saldo goed. Ook de onverwachte uitslagen proberen te raden is de enige manier om je nauwkeurigheid verder te optimaliseren, maar dat is duidelijk de lastigere en riskantere strategie.

Als je ervan uitgaat dat het aandeel verrassingen ruwweg constant is, telt elke fout dubbel—voor elke misgegokte verrassing mis je er ook één doordat je niet op de favoriet hebt ingezet.

Ik koos de riskantere aanpak, maar die heeft nog geen grote vruchten afgeworpen. Mijn model had pech met mogelijke verrassingen, wat leidde tot een teleurstellende accuratesse van 50% op de eerste speeldag.

Zo voorspelde het model dat Servië en Georgië, de underdogs, respectievelijk gelijk zouden spelen tegen Engeland en winnen van Turkije. In beide gevallen wonnen de favorieten. Andersom voorspelde het model geen echte verrassingen zoals de zege van Slowakije tegen België, de verbluffende 3-0 van Roemenië tegen Oekraïne en het gelijkspel van Denemarken met Slovenië.

De volgende voorspellingen zijn gedaan na de tweede speeldag, met nog één groepsduel te gaan voor elk team. Het meest verrassende resultaat komt uit de interessantste groep, namelijk groep E, waar alle teams met één wedstrijd te gaan hetzelfde puntenaantal (3) hebben.

Volgens het model wint Slowakije de groep na een 1-0 zege op Roemenië, omdat ze van België wonnen. Zo zou Slowakije de grote groepsfavoriet naar plek twee verwijzen. Het model voorspelt zelfs dat Slowakije dé verrassing van het toernooi wordt en van Oostenrijk wint om de kwartfinale te halen.

Knock-outfase

De voorspelling voor het volledige toernooiverloop was extra lastig door het format, waarbij ook de beste nummers drie zich plaatsen voor de knock-outfase. Dat levert verschillende mogelijke affiches op, afhankelijk van uit welke groepen de vier beste nummers drie komen. Neem de volgende voorspellingen dus met een korreltje zout—de affiches kunnen compleet veranderen als bijvoorbeeld het doelsaldo van één team met slechts één goal verschuift.

De K.O.-wedstrijden worden in het algemeen heel nipt voorspeld, met een Spaanse 2-0 zege in een mogelijke 1/8 finale tegen Roemenië als enige met een verwachte doelsaldo groter dan één.

De Italiaanse wedstrijden drijven de spanning tot het uiterste, met gelijkspellen als voorspelde uitslag voor hun eerste twee K.O.-duels. Omdat strafschoppen zeldzaam zijn en er niet genoeg data is om de winnaars daarvan te voorspellen, greep ik terug op mijn herinneringen aan de goede Italiaanse strafschoppenhistorie en verwachtte ik dat Italië beide series zou winnen, tegen Zwitserland en Engeland.

Uiteindelijk voorspelt het model dat Spanje, Portugal, Nederland en Italië de halve finales halen.

Nederland en Spanje vormen mijn voorspelde finale, net als in 2010—zou de geschiedenis zich herhalen?

Belangrijkste inzichten

Dit project leverde meerdere belangrijke inzichten op:

  • Voetbalvoorspellen is lastig maar leuk: De sterke padenafhankelijkheid van wedstrijden, gecombineerd met de grote impact van kleine gebeurtenissen, maakt voorspellen moeilijk maar boeiend.
  • Workflow is cruciaal: Het is essentieel om vanaf het begin een goede workflow te hebben. Het plannen van de dataflow en de notebookstructuur bespaart tijd en leidt tot schonere, beter leesbare code. Deze aanpak vereenvoudigt ook het troubleshooten en verhoogt de algehele kwaliteit.

Om de voorspellingen te verbeteren en de reikwijdte van het project uit te breiden, kun je verschillende stappen nemen:

  1. Meer data: Meer wedstrijden meenemen kan helpen om patronen tussen verschillende features te herkennen en zo de nauwkeurigheid te verhogen. Een groter dataset biedt een steviger basis voor de modellen.
  2. Extra features: Nieuwe features kunnen extra inzichten geven:
    • Ervaring: Het gemiddelde aantal interlands per selectiespeler opnemen kan het ervaringsniveau van het team aangeven.
    • Pre-match odds: Door data van bookmakerwebsites te scrapen kun je de favorietenstatus vóór de wedstrijd meenemen en zo context toevoegen. Er zijn beperkingen, want quoteringen veranderen vaak. Voor een eenvoudige analyse van favoriet versus underdog is het echter voldoende.
  3. Uitgebreide aanpak:
    • In-game data: Het opnemen van realtime wedstrijdstatistieken kan de precisie verbeteren. Metrics als balbezit, passnauwkeurigheid en spelersbewegingen geven tijdens de wedstrijd diepere inzichten.
    • Spelersdata: Gedetailleerde informatie per speler, inclusief individuele prestatiemetrics en fitheid, kan meer inzicht geven in wedstrijduitkomsten.

Voor meer details en code, ga naar de projectnotebook.

Conclusie

Deze blogpost geeft een overzicht van de uitdagingen en methodes bij het voorspellen van voetbaluitslagen, en belicht de reis en lessen uit het EURO 2024-voorspelproject.

De combinatie van data science en sportanalytics biedt mooie kansen voor liefhebbers en professionals. Terwijl het project zich blijft ontwikkelen, is het doel om de modellen te verfijnen en ze uit te breiden naar andere toernooien, als bijdrage aan het groeiende veld van sportanalytics.

Wil je meer leren over sportanalytics? Bekijk dan deze resources:


Tom Farnschläder's photo
Author
Tom Farnschläder
LinkedIn

Tom is data scientist en technisch docent. Hij schrijft en beheert de data science-tutorials en blogposts van DataCamp. Eerder werkte Tom in data science bij Deutsche Telekom.

Onderwerpen
Machine Learning
Data Science

Leer machine learning met deze cursussen!

Cursus

Inzicht in Machine Learning

2 uur
313.7K
Een introductie tot machine learning zonder coderen.
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