Pronóstico en partidos de fútbol: Rating System (1/3)

El Rating System es un modelo sencillo para pronosticar las probabilidades de victoria, empate o derrota en un determinado encuentro en base a los resultados de los anteriores 6 partidos jugados por cada uno de los dos contendientes.
Primero se calcula el rating de cada equipo (goles a favor menos goles en contra en las 6 jornadas anteriores) para después obtener el rating de un partido (rating del equipo de casa menos rating del equipo de fuera). Se hace esto para cada jornada (a partir de la 7ª) de varias temporadas de la liga española (aquí lo hacemos para la temporada 2017-18). Después, a partir de la relación entre rating de partido y resultado del partido, se evalúan las probabilidades de cada uno de los tres posibles resultados. Finalmente se utilizan esas probabilidades para pronosticar los resultados de los encuentros de la temporada siguiente.
En esta primera parte se calcula el rating de cada partido.

NOTA: El siguiente script se debe ejecutar paso a paso.

#INICIO -------------------------
rm(list=ls(all=TRUE))

#Eliminamos la posibilidad de que aparezcan anteriores warnings
assign("last.warning", NULL, envir = baseenv())

#Nos situamos en el directorio D:/RR del disco D
getwd()

#Este script se debe ejecutar desde la jornada 7 hasta la 38
#De este modo obtendremos los archivos FINAL7,FINAL8,...FINAL38

#-----INTRODUCCIÓN DE DATOS------------------
#Los archivos Datos2017-18.txt, etc., se obtienen a partir de los datos de la página
#http://www.laliga.es/estadisticas-historicas/calendario.
#Se debe hacer lo siguiente:
#Copiar todo lo que aparece y pegarlo en Excel.
#A continuación, guardar el archivo como Texto (delimitado por tabulaciones) (*.txt).
#Posteriormente volver a leer en Excel en texto delimitado por ":" y
#finalmente guardarlo como Texto (delimitado por tabulaciones) (*.txt).
#De este modo obtenemos el archivo Datos2017-18.txt y lo guardamos en D:/RR

#JJ es el número de jornada de la liga española 2017-18
#-----¡¡¡MUY MUY MUY IMPORTANTE!!!-----:
#ESTE SCRIPT DEBE EJECUTARSE DESDE JJ=7 HASTA JJ=38

#IMPORTANTE: PRONOSTICAMOS LA JORNADA JJ
#Introducir el valor de JJ
JJ<-7 #<------OJO AQUÍ-----------------------
#--------------------------------------------

#INTRODUCIR DATOS DE LA TEMPORADA
u<-read.delim('D:/RR/Datos2017-18.txt',header=F);attach(u)

elim<-seq(1,length(V1),21);w<-u[-elim,]
equipos<-as.character(w$V1)
goles<-as.numeric(as.character(w$V2))

#----------RENOMBRAMOS LOS EQUIPOS PARA MAYOR COMODIDAD------------
#¡¡¡OJO!!! De una temporada a la siguiente siempre cambian 3 equipos

equipos<-replace(equipos,equipos=='Athletic Club','ATH')
equipos<-replace(equipos,equipos=='Atlético de Madrid','ATM')
equipos<-replace(equipos,equipos=='CD Leganés','LEG')
equipos<-replace(equipos,equipos=='D. Alavés','ALA')
equipos<-replace(equipos,equipos=='FC Barcelona','BAR')
equipos<-replace(equipos,equipos=='Getafe CF','GET')
equipos<-replace(equipos,equipos=='Girona FC','GIR')
equipos<-replace(equipos,equipos=='Levante UD','LEV')
equipos<-replace(equipos,equipos=='Málaga CF','MAL')
equipos<-replace(equipos,equipos=='RC Celta','CEL')
equipos<-replace(equipos,equipos=='RC Deportivo','DEP')
equipos<-replace(equipos,equipos=='RCD Espanyol','ESP')
equipos<-replace(equipos,equipos=='Real Betis','BET')
equipos<-replace(equipos,equipos=='Real Madrid','RMA')
equipos<-replace(equipos,equipos=='Real Sociedad','RSO')
equipos<-replace(equipos,equipos=='SD Eibar','EIB')
equipos<-replace(equipos,equipos=='Sevilla FC','SEV')
equipos<-replace(equipos,equipos=='UD Las Palmas','LAS')
equipos<-replace(equipos,equipos=='Valencia CF','VAL')
equipos<-replace(equipos,equipos=='Villarreal CF','VIL')

D<-data.frame(equipos,goles)

obs<-length(equipos)
indequip1<-seq(1,obs,2)
indequip2<-seq(2,obs,2)
g1<-goles[indequip1]
g2<-goles[indequip2]
team1<-equipos[indequip1]
team2<-equipos[indequip2]
jor<-rep(1:38,each=10)

fff<-function(x) if (x>0) '1' else (if (x<0) '2' else 'X')
g<-g1-g2
res<-numeric(380)
for (w in 1:380) res[w]<-fff(g[w])
res
datos1<-data.frame(jor,g1,g2,team1,team2,res)

#----------COMPROBAR datos1 PARA LA PRIMERA JORNADA INTRODUCIDA----------
datos1;attach(datos1);names(datos1)
write.table(datos1, file="datos1")
datos1

#Equipos participantes esta temporada: x
x<-levels(datos1[,4]);x

M<-datos1[1:(10*(JJ-1)),]
colnames(M)<-c('jorn','gc','gf','ec','ef','resultado');attach(M)

#El rating de los equipos rE se calcula con goles a favor menos goles en contra
#en los 6 partidos anteriores

ratingEQUIPOS<-matrix(rep(0,20),1,20)
for(i in 1:20)
ratingEQUIPOS[1,i]<-sum(tail(gc[ec==x[i]],3))+sum(tail(gf[ef==x[i]],3))-sum(tail(gf[ec==x[i]],3))-sum(tail(gc[ef==x[i]],3))
rE<-as.data.frame(ratingEQUIPOS)
colnames(rE)<-x

#El rating de partidos rP para la jornada JJ se calcula restando el rating del equipo de casa
#menos el rating del equipo de fuera

N<-datos1[jor==JJ,2:6]
rP<-numeric(10)
for (i in 1:10) {rP[i]<-rE[N[i,3]]-rE[N[i,4]]}
rP<-as.numeric(rP)
FINAL<-data.frame(rP,N$res)

#Guardamos el objeto obtenido
write.table(FINAL, file=paste("FINAL",JJ,sep=""))

#Obtenemos el archivo
paste("FINAL",JJ)

#Y así sucesivamente hasta obtener FINAL38

#El rating de cada equipo en las 6 anteriores jornadas a la JJ es
rE

#El rating de cada partido para la jornada JJ es
rP

#Por ejemplo, se ha obtenido que en el primer partido de la jornada 7,
#Celta-Girona, el rating del partido es 7
#porque la diferencia de goles a favor menos goles en contra en las 6 jornadas
#anteriores era 2 para el Celta y -5 para el Girona,
#siendo el resultado empate
#FIN -------------------------


No hay comentarios:

Publicar un comentario