Applicazioni pratiche di machine learning/Previsioni su scommesse sportive

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search

Caricamento librerie[modifica]

 library(dplyr)
 library(caret)

Parte 1: Dati[modifica]

Dal seguente link: https://www.football-data.co.uk/italym.php è possibile scaricare le probabilità di vincita, pareggio o vittoria in trasferta di vari bookmakers per le partite di calcio di serie A in Italia . In particolare si utilizzano per la previsione nelle scommesse sportive gli anni 2017,2018,2019,2020 .

Caricamento dati:

 I1_17_18 <- read.csv("I1_17_18.csv")
 I1_18_19 <- read.csv("I1_18_19.csv")
 I1_19_20 <- read.csv("I1_19_20.csv")

Creazione colonna "risultato", contenente gli 1,X,2 risultati della corrispondente partita, da aggiungere al dataframe degli anni 2017 e 2018:

 risultato <- rep(NA,nrow(I1_17_18))
 risultato[which(I1_17_18$FTR=="A")]="2"
 risultato[which(I1_17_18$FTR=="D")]="X"
 risultato[which(I1_17_18$FTR=="H")]="1"

 df1<-I1_17_18[,which(colnames(I1_17_18) %in% colnames(I1_19_20))]
 df1 <- cbind(df1,risultato)


Creazione colonna "risultato", contenente gli 1,X,2 risultati della corrispondente partita, da aggiungere al dataframe degli anni 2018 e 2019:

 risultato <- rep(NA,nrow(I1_18_19))
 risultato[which(I1_18_19$FTR=="A")]="2"
 risultato[which(I1_18_19$FTR=="D")]="X"
 risultato[which(I1_18_19$FTR=="H")]="1"

 df2<-I1_18_19[,which(colnames(I1_18_19) %in% colnames(I1_19_20))]
 df2 <- cbind(df2,risultato)


Creazione colonna "risultato", contenente gli 1,X,2 risultati della corrispondente partita, da aggiungere al dataframe degli anni 2019 e 2020:

 risultato <- rep(NA,nrow(I1_19_20))
 risultato[which(I1_19_20$FTR=="A")]="2"
 risultato[which(I1_19_20$FTR=="D")]="X"
 risultato[which(I1_19_20$FTR=="H")]="1"

 df3<-I1_19_20[,which(colnames(I1_19_20) %in% colnames(I1_18_19))]
 df3 <- cbind(df3,risultato)

Si scelgono per la previsione le seguenti variabili contenenti le probabilità di scommessa 1,X,2 sulle partite fatte dai bookmakers:

  • B365H = Bet365 probabilità di vittoria in casa
  • B365D = Bet365 probabilità di pareggio
  • B365A = Bet365 probabilità di vittoria in trasferta
  • BSH = probabilità di vittoria in casa Blue Square
  • BSD = probabilità di pareggio Blue Square
  • BSA = probabilità di vittoria in trasferta Blue Square
  • BWH = Bet&Win vittoria in casa
  • BWD = Bet&Win pareggio
  • BWA = Bet&Win probabilità di vincere in trasferta
  • GBH = probabilità di vittoria in casa di Gamebookers
  • GBD = Gamebookers probabilità di pareggio
  • GBA = Le probabilità di vincere in trasferta di Gamebookers
  • IWH = probabilità di vittoria in casa Interwetten
  • IWD = probabilità di pareggio Interwetten
  • IWA = Interwetten in trasferta
  • LBH = Probabilità di vittoria in casa di Ladbrokes
  • LBD = Ladbrokes probabilità di pareggio
  • LBA = Ladbrokes probabilità di vittoria in trasferta
  • PSH e PH = probabilità di vittoria in casa Pinnacle
  • PSD e PD = probabilità di pareggio di Pinnacle
  • PSA e PA = Pinnacle probabilità di vittoria in trasferta
  • SOH = probabilità di vittoria in casa Sporting Odds
  • SOD = probabilità di pareggio Sporting Odds
  • SOA = probabilità di vittoria in trasferta Sporting Odds
  • SBH = probabilità di vittoria in casa di Sportingbet
  • SBD = probabilità di pareggio di Sportingbet
  • SBA = probabilità di vittoria in trasferta Sportingbet
  • SJH = probabilità di vittoria in casa di Stan James
  • SJD = probabilità di pareggio di Stan James
  • SJA = probabilità di vittoria in trasferta di Stan James
  • SYH = probabilità di vittoria in casa di Stanleybet
  • SYD = probabilità di pareggio di Stanleybet
  • SYA = Probabilità di vittoria in trasferta di Stanleybet
  • VCH = VC probabilità di vincita in casa
  • VCD = VC probabilità di pareggio
  • VCA = VC probabilità di vittoria in trasferta
  • WHH = probabilità di vittoria in casa di William Hill
  • WHD = probabilità di pareggio di William Hill
  • WHA = Probabilità di vittoria in trasferta di William Hill


...e si uniscono i 3 dataframes contenenti le probabilità di vincita in casa, pareggio o trasferta negli anni 2017,2018,2019,2020 :

 df1<-rbind(df1,df2)
 df1<-rbind(df1,df3)

 df1 <- df1[,which(colnames(df1) %in%  c("Date","HomeTeam","AwayTeam","B365H","B365D","B365A","BWH","BWD","BWA","IWH","IWD","IWA","PSH","PSD","PSA","WHH","WHD","WHA","VCH","VCD","VCA","risultato" ))]

 head(df1)

Si eliminano dal dataframe df1 le righe contenenti gli eventuali valori mancanti nelle probabilità...

 df1 <- df1[-which(rowSums(is.na(df1))>0),]


Parte 2 : Domanda di ricerca[modifica]

Di prescelte partite future di serie A in Italia il risultato sarà 1,X o 2 ?


Parte 3 : Modellizzazione e Previsione[modifica]

Si suddivide il dataset df1 in un training set costituito dal 90% delle partite e in un testing set costituito dal rimanente 10% di partite e come predictors si scelgono le probabilità indicate dai vari bookmakers escludendo data della partita e nomi delle squadre in casa e trasferta. La variabile da predire è "risultato" .

 n <-nrow(df1)
 training <- df1[1:round(n*0.9),c(4:22)]
 testing <- df1[round(n*0.9):n,c(4:22)]
    
 model <-  train( risultato ~ .,data=training, method="rf", verbose=FALSE )

 p1 <- predict(model,newdata = training)
 print(confusionMatrix(p1,training$risultato)) 

 p1 <- predict(model,newdata = testing)
 print(confusionMatrix(p1,testing$risultato))
Confusion Matrix and Statistics of training set:
         Reference
Prediction   1   2   X
        1  370   0   0
        2    0 272   0
        X    0   0 211
Overall Statistics
                                    
              Accuracy : 1          
                95% CI : (0.9957, 1)
   No Information Rate : 0.4338     
   P-Value [Acc > NIR] : < 2.2e-16  
                                    
                 Kappa : 1          
                                    
Mcnemar's Test P-Value : NA         
Statistics by Class:
                        Class: 1 Class: 2 Class: X
Sensitivity            1.0000   1.0000   1.0000
Specificity            1.0000   1.0000   1.0000
Pos Pred Value         1.0000   1.0000   1.0000
Neg Pred Value         1.0000   1.0000   1.0000
Prevalence             0.4338   0.3189   0.2474
Detection Rate         0.4338   0.3189   0.2474
Detection Prevalence   0.4338   0.3189   0.2474
Balanced Accuracy      1.0000   1.0000   1.0000


Confusion Matrix and Statistics of the testing set:
         Reference
Prediction  1  2  X
        1  27 12  9
        2   5 18  6
        X   5  7  7
Overall Statistics
                                         
              Accuracy : 0.5417          
                95% CI : (0.4369, 0.6438)
   No Information Rate : 0.3854          
   P-Value [Acc > NIR] : 0.001359        
                                         
                 Kappa : 0.29            
                                         
Mcnemar's Test P-Value : 0.250645        
Statistics by Class:
                    Class: 1 Class: 2 Class: X
Sensitivity            0.7297   0.4865  0.31818
Specificity            0.6441   0.8136  0.83784
Pos Pred Value         0.5625   0.6207  0.36842
Neg Pred Value         0.7917   0.7164  0.80519
Prevalence             0.3854   0.3854  0.22917
Detection Rate         0.2812   0.1875  0.07292
Detection Prevalence   0.5000   0.3021  0.19792
Balanced Accuracy      0.6869   0.6500  0.57801

Parte 4: Conclusioni[modifica]

Utilizzando quindi l'algoritmo Random Forest l'accuratezza della previsione sul training set è del 100%, mentre sul testing set è solo del 54,17% e quindi in pratica partecipare alle scommesse sportive utilizzando il machine learning è approssimativamente come giocare sul rosso e il nero alla Roulette...