Voetbalgokken
-
Hey @angad
Wat een ontzettend tof PWS onderwerp hebben jullie uitgezocht. Echt heel cool.
Inderdaad het model dat voorgesteld wordt op de website heeft zijn zwakke kanten en die kun je denk ik wel oplossen als je genoeg data hebt. Op dezelfde manier dat dit model kijkt naar de hoeveelheid goals voor en tegen uit of thuis, kun je natuurlijk ook opsplitsen in hoeveelheid goals gemaakt door die ene speler (die nu misschien geblesseerd is) of hoeveelheid goals gemaakt met goed weer.
Het komt erop neer dat je hetzelfde model toe kan passen zoals kijken naar hoeveelheid goals uit of thuis, maar dan niet per se alle wedstrijden pakt maar alleen degene die de zwakke punten oplossen. Dus dan reken je die gemiddeldes uit maar dan alleen wedstrijden rekenend waar het niet heeft geregend bijvoorbeeld. Als je dat heb gedaan heb je dus 2 verschillende verwachtingen, en dan kun je daarvan het gemiddelde nemen bijvoorbeeld. Ik hoop dat dit verhaal wat te volgen is.
Een wedstrijdgokker vinden om te interviewen lijkt me lastig. Ik denk niet dat we iemand hebben die zich hierin specialiseert op de TU en als die niet via het internet te vinden is wordt het lastig ja, ik ben bang dat ik je niet daarmee kan helpen.
Ik hoop dat je zo goed verder heb geholpen met je PWS.
Groetjes,
Jip -
Beste Jip,
Heel erg bedankt voor je hulp! Het is zeker te volgen, ik snap wat je bedoelt. We zullen jouw tips gebruiken om het model te verbeteren.
Met Vriendelijke Groet,
Kiran Singh en Angad Singh
-
Goed om te horen!
Laat maar weten hoe het gaat.
Jip
-
Dit bericht is verwijderd! -
De no account casino's zoals ze heten zijn opgericht zodat mensen direct lid kunnen worden en kunnen spelen zonder een account hoeven te maken. Normaliter moet je een account aanmaken en daar bijvoorbeeld je bank aankoppelen en ook een vorm van legitimatie uploaden. Er zijn sites zoals noaccountscasino.nl waar je kunt zien welke casino's dat zijn. Het is een interessant onderwerp en er is vast een hoop informatie over te vinden, zoals met alles eigenlijk tegenwoordig. Het voordeel van het internet!
-
Hey PeterBarber
Is dit een vraag over een PWS? Zo ja, hebben jullie al een onderzoeksvraag. Het bestaan van gok websites is niet zozeer een technisch probleem als een maatschappelijke kwestie maar ik kan wel kijken of mijn TU Delft expertise je kunnen helpen.
Groetjes,
Jip -
Onderwerp: Hulp nodig bij PWS over voetbal gokken met Python en de Poisson-formule
Beste Studenten
Wij zijn momenteel bezig met ons Profielwerkstuk (PWS) en hebben jullie hulp en advies nodig bij ons onderzoek over voetbal gokken. Onze onderzoeksvraag luidt als volgt: "Hoe kunnen we met behulp van Python een voorspellingsmodel maken voor voetbalwedstrijden, met gebruik van gegevens van historische wedstrijden?
Als achtergrondinformatie willen we vermelden dat we Wiskunde D in ons curriculum hebben en daarom eerder met de Poisson-formule hebben gewerkt. We geloven dat de Poisson-formule een nuttig instrument kan zijn bij het voorspellen van voetbalwedstrijden (gegeven in de site van het vorige bericht) op basis van historische gegevens en statistieken.
We zouden graag jullie inzichten willen verzamelen over hoe we Python kunnen gebruiken om een dergelijk voorspellingsmodel te ontwikkelen, Als jullie ervaring hebben met vergelijkbare projecten of als jullie tips hebben over de implementatie van de Poisson-formule voor dit doel in Python zouden we dat zeer op prijs stellen.
Alle suggesties, bronnen, of verwijzingen naar relevante literatuur zijn welkom. We willen ons PWS graag zo goed mogelijk uitvoeren en elke hulp van jullie kant zou ons enorm helpen.
Bedankt voor jullie tijd en overweging. We kijken uit naar jullie reacties en eventuele aanbevelingen.
Met vriendelijke groet,
Vincent van der Velden
-
Beste @Vincentvdfield,
Leuk onderwerp! Ik heb zelf ervaring met zowel de Poisson formule als Python, maar geen ervaring met die twee combineren om voorspellingen te maken (in bijvoorbeeld voetbal). Maar dat is niet erg, ik denk dat ik jullie wel een stuk op weg kan helpen.
Voor Python gebruik is Spyder een veelgebruikt platform, maar de 'gewone' versie van Python werkt ook prima.
Om voorspellingen te kunnen maken heb je (zoals jullie zeiden) historische data nodig. Op deze site kan je de uitslagen terug tot 1994 vinden. Ze staan wel los per jaar vermeld, misschien dat het jullie lukt om ergens anders de jaren in één bestand te vinden, dat kan makkelijker werken.
Wanneer je die hebt, moet je die importeren in Python, handig om daarvoor te gebruiken is Pandas. Dit is een Python extension die handig is voor grote dataframes. Ik raad aan deze introductie te lezen, en eventueel filmpjes te kijken over het gebruik van Pandas, en het werken met dataframes. Kijk ook vooral bij het stukje over het importeren van CSV (Comma Saved Values) files, aangezien de data die je online vindt vaak in dit format is.
De Poisson formule laat ik voor nu even voor wat het is, daar kunnen we meer naar kijken tegen de tijd dat het implementeren komt.
Ik hoop dat jullie zo kunnen opstarten. Als jullie hier nog vragen over hebben hoor ik het graag. Ook als jullie verder in het project zijn help ik graag met vragen. Laat me weten hoe het gaat!
Groetjes, Cian
-
Hallo beste studenten,
Heel erg bedankt voor jullie reacties. We zijn al heel ver gekomen en zijn goed op weg.Dit is de code die we zover hebben: We hebben de gegevens verzamelt van deze dataset: https://www.football-data.co.uk/mmz4281/2223/N1.csv
import numpy as np
import matplotlib.pyplot as plt
import math
import pandas as pd
"1"
df = pd.read_csv (r'c:\Users\vozdy\Desktop\Voetbal gokken PWS 2023-2024\N1.csv')
dataset = df[1:307]
data = dataset[['HomeTeam', 'AwayTeam','FTHG', 'FTAG']]"2"
home_total = data[['FTHG']].sum()
home_average = data[['FTHG']].mean()away_total = data[['FTAG']].sum()
away_average = data[['FTAG']].mean()"3"
gs_home_df = data[data['HomeTeam']=="Heerenveen"]
gs_home_total = gs_home_df[['FTHG']].sum()
gs_home_average = gs_home_df[['FTHG']].mean()
gs_conceed_total = gs_home_df[['FTAG']].sum()
gs_conceed_average = gs_home_df[['FTAG']].mean()"4"
fb_away_df = data[data['AwayTeam']=="Sparta Rotterdam"]
fb_score_total = fb_away_df[['FTAG']].sum()
fb_score_average = fb_away_df[['FTAG']].mean()
fb_conceed_total = fb_away_df[['FTHG']].sum()
fb_conceed_average = fb_away_df[['FTHG']].mean()"5"
d = {'Goals scored at home by all': [529, 306, 1.729],
'Away goals scored by all': [406, 306, 1.327],
'Home goals scored by Heerenveen': [21, 17, 1.235],
'Home goals conceed by Heerenveen': [26, 17, 1.529],
'Away goals scored by Sparta Rotterdam': [28, 17, 1.647],
'Home goals conceed by Sparta Rotterdam': [19, 17, 1.118]
}final = pd.DataFrame(d, index=['goals','matches','average'])
"6"
gs_attack_str = gs_home_average / home_average
fb_attack_str = fb_score_average / away_averagegs_defence_str = gs_conceed_average / away_average
fb_defence_str = fb_conceed_average / home_average"7"
gs_expect = gs_attack_str * fb_defence_str * home_average
fb_expect = fb_attack_str * gs_defence_str * away_average"8"
def poisson_probability(l, x):
probability = ((l**x) * math.exp(-l)) / math.factorial(x)
return probability*100gs_goals_prob = []
for i in range(6):
expect = poisson_probability(gs_expect, i)
gs_goals_prob.append(expect)X = [0,1,2,3,4,5]
gs_goals_probs = np.round(gs_goals_prob,2)fig, ax = plt.subplots(1, 1, figsize=(8, 6))
ax.plot(X, gs_goals_probs, 'bo', ms=8)
plt.ylabel("Probability", fontsize="16")
plt.xlabel("X - No. of Goals", fontsize="16")
plt.title("Heerenveen_goal_score", fontsize="18")
ax.vlines(X, 0, gs_goals_probs, colors='b', lw=5, alpha=0.5)
for i, v in enumerate(gs_goals_probs):
ax.text(i, v, str(v), color='red', fontweight='bold')
plt.show()"9"
fb_goals_prob = []
for i in range(6):
expect = poisson_probability(fb_expect, i)
fb_goals_prob.append(expect)fb_goals_probs = np.round(fb_goals_prob,2)
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
ax.plot(X, fb_goals_probs, 'bo', ms=8)
plt.ylabel("Probability", fontsize="16")
plt.xlabel("X - No. of Goals", fontsize="16")
plt.title("Sparta Rotterdam goal score", fontsize="18")
ax.vlines(X, 0, fb_goals_probs, colors='b', lw=5, alpha=0.5)
for i, v in enumerate(fb_goals_probs):
ax.text(i, v, str(v), color='red', fontweight='bold')
plt.show()Als deze code word gerunt zal het een uitslag geven. De code werkt dus. Van deze code heb ik twee vragen.
- Hoe kan ik deze code aanpassen door in plaats van met de hand de club naam in de code te zetten (bijvoorbeeld Heerenveen Thuis en Sparta uit) pas de club naam hoef in te typen als ik de code ga runnen. Hiervoor zou ik meer informatie van de andere club moeten importeren wat ik al heb gedaan. Alleen weet ik nog niet hoe ik dit in de code zou kunnen verwerken. Dit zou een goede vraag kunnen zijn voor de studenten die computer Science studeren.
- Stel dat de code afwijkt van de uiteindelijke uitslag. Welke factoren beïnvloed dan deze afwijking en welke stappen kunnen we nemen zodat uiteindelijk als we een tweede proto type code gaan schrijven de uitslag dan minder zal afwijken?
Heel erg bedankt nog voor de reactie op de vorige vraag. We hebben veel kunnen oppikken en leren!
Groetjes!
-Vincent van der Velden
-
Beste @Vincentvdfield,
Om een input te krijgen in Python kan je de functie input() gebruiken. Je kan dan een variabele de waarde van de input geven. Zie hier ook meer informatie: https://www.w3schools.com/python/ref_func_input.asp
In jullie geval zou je dus bij "3" het volgende kunnen toevoegen:
print("Wat is het home team? ")
HomeTeam_Input = input()
gs_home_df = data[data['HomeTeam']==HomeTeam_Input]
...Met het uitteam kan je hetzelfde doen bij "4".
Bij "5" moeten jullie dan nog de dictionary d aanpassen. Gelukkig is alle data die jullie daar (handmatig) inzetten eerder in de code al berekend. Deze is dus makkelijk aan te passen dat het werkt voor alle uit en thuis teams. Ik doe het voorbeeld voor het thuis team voor:
Deze regel code:
'Home goals scored by Heerenveen': [21, 17, 1.235],Wordt dit:
'Home goals scored by Home team': [gs_home_total, gs_conceed_total, gs_home_total / gs_conceed_total],De andere regels in d moeten jullie zelf aanpassen! Maar zoals ik zei, alle data die er in staat is eerder al berekend. Dat is dus een kwestie van de goede variabelen op de goede plek zetten.
Edit: ik zie nu dat de dictionary d omgezet wordt in de dataframe 'Final', maar die wordt verder nergens gebruikt. Is dit deel van de code nog nodig?
Wat betreft vraag 2, de uiteindelijke uitslag kan natuurlijk altijd afwijken van de voorspelling. Dit komt doordat dit Python model precies dat is, een model. Modellen zijn altijd versimpelingen van de werkelijkheid, omdat je nooit alle factoren die er in de werkelijkheid bestaan kunt modelleren. Je kunt wel je model blijven uitbreiden en verbeteren.
Jullie zouden kunnen kijken of jullie kunnen displayen welke uitslagen de meeste kans hebben van gebeuren. Jullie laten nu in 2 losse plots de kansen van aantal goals per team zien, maar deze data kan je ook combineren om zo te laten zien wat de meest waarschijnlijke uitslag wordt. Je zou in een grid van 5x5 alle mogelijke uitslagen kunnen laten zien, met hun respectievelijke kansen.Hopelijk heb ik jullie zo verder geholpen, als jullie nog vragen hebben laat het maar weten!
Groetjes, Cian