Cap 4 Es
Cap 4 Es
4
Datos de partidos y tablas de clasificación
rm(list= ls()) # Esto borra todas las variables del espacio de trabajo
Ahora que tenemos una pizarra en blanco, los datos pueden ser importados a R en
formato CSV y mostrados usando el código de abajo.
Este ejemplo utiliza datos históricos de: [Link]
[Link] para la temporada EPL 2020-2021. Sin embargo, no utilizaremos todas
las variables del conjunto de datos. Aquí sólo utilizaremos las 16 primeras variables,
que son:
Los datos pueden cargarse en R utilizando el siguiente código, que selecciona sólo las
16 primeras variables.
##
[1] "Div" "Fecha" "Hora" "HomeTeam" "EquipoAlejad "FTHG"
o"
[7] "FTAG" "FTR "HTHG" "HTAG "HTR" "Árbitro"
[13] "HS" "AS" "HST" "AST
A partir de esto, podemos ver que hemos incluido algunas variables que son irrelevantes.
Así que, para facilitar el uso, eliminaremos las variables "Div", "HTHG", "HTAG",
"HTR" y "Referee", que no nos interesan aquí.
dat< - EPL2020_data[,c("Date", "HomeTeam", "AwayTeam", "FTHG", "FTAG", "FTR", "HS", "AS", "HST",
"AST")] # Esto crea un marco de datos de trabajo
Lo que produce:
##
Fecha Equipo local Equipo visitante FTHG FTAG FTR HS AS HST AST
1 12/09/2020 Fulham Arsenal 0 3 A 5 13 2 6
2 12/09/2020 Crystal Palace Southampton 1 0 H 5 9 3 5
3 12/09/2020 Liverpool Leeds 4 3 H 22 6 6 3
4 12/09/2020 West Ham Newcastle 0 2 A 15 15 3 2
5 13/09/2020 West Brom Leicester 0 3 A 7 13 1 7
6 13/09/2020 Tottenham Everton 0 1 A 9 15 5 4
Ahora podemos aumentar los datos añadiendo nuevas variables derivadas. Para ello,
primero necesitamos crear algunas nuevas variables 'vacías' pobladas con NAs y
ceros en las que almacenar las estadísticas derivadas.
dat["GD"]< - NA # Crea una nueva columna para la diferencia de goles poblada con NAs
dat["TG"]< - NA # Crea una nueva columna para el total de goles marcados poblada con
NAs dat["HTSR"]< - NA # Crea una variable de ratio de tiros del equipo local poblada con
NAs dat["ATSR"]< - NA # Crea una variable de ratio de tiros del equipo visitante poblada
con NAs dat["HPts"]< - 0 # Crea una variable de puntos del equipo local poblada con ceros
dat["APts"]< - 0 # Crea una variable de puntos del equipo visitante poblada con ceros
Una vez creadas las variables vacías, podemos calcular las estadísticas derivadas y
rellenar las variables de la siguiente manera:
Calcular los puntos obtenidos en casa y fuera es un poco más complicado. Pero
esto se puede hacer con bastante facilidad utilizando un bucle for y cuatro sentencias
if, como se indica a continuación.
106 Análisis del fútbol
for(i en 1:nrow(dat)){
if(dat$FTR[i]== "H"){dat$HPts[i]< - 3}
if(dat$FTR[i]== "A"){dat$APts[i]< - 3}
if(dat$FTR[i]== "D") {dat$HPts[i]< - 1}
if(dat$FTR[i]== "D") {dat$APts[i]< - 1}
}
También podemos cambiar el nombre de algunas de las columnas del marco de datos.
head(dat) # Muestra sólo las seis primeras filas del marco de datos.
##
Fecha Equipo local Equipo visitante HG AG Resultado HS AS HST AST GD TG
1 12/09/2020 Fulham Arsenal 0 3 A 5 13 2 6 -3 3
2 12/09/2020 Crystal Palace Southampton 1 0 H 5 9 3 5 1 1
3 12/09/2020 Liverpool Leeds 4 3 H 22 6 6 3 1 7
4 12/09/2020 West Ham Newcastle 0 2 A 15 15 3 2 -2 2
5 13/09/2020 West Brom Leicester 0 3 A 7 13 1 7 -3 3
6 13/09/2020 Tottenham Everton 0 1 A 9 15 5 4 -1 1
HTSR ATSR HPts APts
1 0.278 0.722 0 3
2 0.357 0.643 3 0
3 0.786 0.214 3 0
4 0.500 0.500 0 3
5 0.350 0.650 0 3
6 0.375 0.625 0 3
Una vez descargados y ampliados los datos de los partidos tal y como se muestra
en el Ejemplo 4.1, es frecuente que queramos analizar el rendimiento de los distintos
equipos de la liga. Esto puede ser complicado porque los equipos de la liga juegan
tanto en casa como fuera, lo que significa que, al evaluar el rendimiento, tenemos
que distinguir entre los dos. Por lo tanto, al evaluar el rendimiento de los equipos
individuales, es útil convertir los datos en "a favor" y " en contra" en lugar de "en
casa" y "fuera", como se ilustra en el Ejemplo 4.2, que considera el rendimiento del
Liverpool durante la temporada 2020-2021.
Datos de los partidos y tablas de 107
clasificación
Ahora, necesitamos añadir una variable 'status' para indicar si un partido es en casa o
fuera.
[Link]["Status"]< - "Home" # Crea la nueva columna para indicar los partidos jugados en casa.
[Link]["Status"]< - "Away" # Crea la nueva columna para indicar los partidos jugados fuera.
A continuación, tenemos que cambiar los nombres de las variables para que sean
específicos de cada club (es decir, a favor y en contra en lugar de local y visitante).
home< - [Link] # Hacer copia duplicada del marco de datos sobre el que hacer cambios
away< - [Link] # Hacer copia duplicada del marco de datos sobre el que hacer cambios
En este punto, es una buena idea inspeccionar los marcos de datos, sólo para
comprobar que lo hemos hecho todo bien.
head(inicio)
##
Fecha Equipo local EquipoAlejado HG AG Resultado HS AS HST AST GD
3 12/09/2020 Liverpool Leeds 4 3 H 22 6 6 3 1
28 28/09/2020 Liverpool Arsenal 3 1 H 21 4 8 3 2
53 24/10/2020 Liverpool Sheffield United 2 1 H 17 13 5 2 1
62 31/10/2020 Liverpool West Ham 2 1 H 9 4 5 3 1
86 22/11/2020 Liverpool Leicester 3 0 H 24 11 13 4 3
106 06/12/2020 Liverpool Lobos 4 0 H 11 9 6 3 4
TG HTSR ATSR HPts APts Estado
3 7 0.786 0.214 3 0 Inici
o
28 4 0.840 0.160 3 0 Inici
o
53 3 0.567 0.433 3 0 Inici
o
62 3 0.692 0.308 3 0 Inici
o
86 3 0.686 0.314 3 0 Inici
o
106 4 0.550 0.450 3 0 Inici
o
cabeza(fuera)
108 Análisis del fútbol
##
Fecha Equipo local Equipo visitante HG AG Resultado HS AS HST AST GD TG
15 20/09/2020 Chelsea Liverpool 0 2 A 5 18 3 6 -2 2
38 04/10/2020 Aston Villa Liverpool 7 2 H 18 14 11 8 5 9
39 17/10/2020 Everton Liverpool 2 2 D 11 22 5 8 0 4
77 08/11/2020 Man City Liverpool 1 1 D 7 10 2 3 0 2
90 28/11/2020 Brighton Liverpool 1 1 D 11 6 3 2 0 2
115 13/12/2020 Fulham Liverpool 1 1 D 10 12 5 6 0 2
HTSR ATSR HPts APts Estado
15 0.217 0.783 0 3 Fuera
de
casa
38 0.562 0.438 3 0 Fuera
de
casa
39 0.333 0.667 1 1 Fuera
de
casa
77 0.412 0.588 1 1 Fuera
90 0.647 0.353 1 1 Fuera
115 0.455 0.545 1 1 Fuera
Podemos usar el paquete 'dplyr' para renombrar múltiples variables, como sigue:
También tenemos que sustituir los elementos "H", "A" y "D" del vector Resultados
por "W", "L" y "D", lo que puede hacerse utilizando la función "recode" de "dplyr",
como se indica a continuación:
"D") head(home)
Datos de los partidos y tablas de 109
clasificación
##
Fecha HomeTeam AwayTeam GF GA Result SF SA STF STA GD
3 12/09/2020 Liverpool Leeds 4 3 W 22 6 6 3 1
28 28/09/2020 Liverpool Arsenal 3 1 W 21 4 8 3 2
53 24/10/2020 Liverpool Sheffield United 2 1 W 17 13 5 2 1
62 31/10/2020 Liverpool West Ham 2 1 W 9 4 5 3 1
86 22/11/2020 Liverpool Leicester 3 0 W 24 11 13 4 3
106 06/12/2020 Liverpool Lobos 4 0 W 11 9 6 3 4
TG TSRF TSRA PF PA Estado
3 7 0.786 0.214 3 0 Inicio
28 4 0.840 0.160 3 0 Inicio
53 3 0.567 0.433 3 0 Inicio
62 3 0.692 0.308 3 0 Inicio
86 3 0.686 0.314 3 0 Inicio
106 4 0.550 0.450 3 0 En casa
Ahora repetimos el proceso para el marco de datos "visitante", con la única diferencia
de que tenemos que cambiar el signo de las diferencias de goles de los partidos.
away< - rename(away, c("GA"= "HG", "GF"= "AG", "SA"= "HS", "SF"= "AS",
"STA"= "HST", "STF"= "AST", "TSRA"= "HTSR", "TSRF"= "ATSR", "PA"= "HPts",
"PF"= "APts"))
away$GD< - -1*away$GD # Cambiar el signo de la diferencia de goles para reflejar el uso de "a favor"
y "en contra".
# Sustituir los elementos del vector Resultados por "W", "L", "D".
away$Result< - recode(away$Result, "H"= "L", "A"= "W", "D"= "D")
head(lejos)
##
Fecha HomeTeam AwayTeam GA GF Result SA SF STAF GD TG
15 20/09/2020 Chelsea Liverpool 0 2 W 5 18 3 6 2 2
38 04/10/2020 Aston Villa Liverpool 7 2 L 18 14 11 8 -5 9
39 17/10/2020 Everton Liverpool 2 2 D 11 22 5 8 0 4
77 08/11/2020 Man City Liverpool 1 1 D 7 10 2 3 0 2
90 28/11/2020 Brighton Liverpool 1 1 D 11 6 3 2 0 2
115 13/12/2020 Fulham Liverpool 1 1 D 10 12 5 6 0 2
TSRA TSRF PA PF Estado
15 0.217 0.783 0 3 Fuera
de
casa
38 0.562 0.438 3 0 Fuera
de
casa
39 0.333 0.667 1 1 Fuera
de
casa
77 0.412 0.588 1 1 Fuera
90 0.647 0.353 1 1 Fuera
115 0.455 0.545 1 1 Fuera
de
casa
Ahora que tenemos los datos en el formato correcto, podemos producir algunas
estadísticas descriptivas para el Liverpool usando el código del Ejemplo 4.3, que
muestra la media, la mediana y la desviación estándar para las distintas métricas de
rendimiento.
110 Análisis del fútbol
nombres(casa)
##
[1] "Fecha" "HomeTeam" "AwayTeam" "GF" "GA" "Resultad
o
[7] "SF" "SA" "STF" "STA" "GD" "TG
[13] "TSRF" "TSRA "PF" "PA" "Estado"
library(psych)
Esto produce las siguientes estadísticas descriptivas para los partidos en casa del
Liverpool:
##
Pld Media Mediana DE Total
GF 19 1.526 2.00 1.349 29.000
GA 19 1.053 1.00 1.026 20.000
SF 19 16.684 17.00 5.697 317.000
SA 19 8.316 8.00 2.868 158.000
STF 19 5.737 6.00 3.314 109.000
STA 19 3.842 4.00 1.167 73.000
GD 19 0.474 1.00 1.744 9.000
TG 19 2.579 2.00 1.644 49.000
TSRF 19 0.656 0.68 0.129 12.467
TSRA 19 0.344 0.32 0.129 6.533
PF 19 1.737 3.00 1.408 33.000
PA 19 1.105 0.00 1.370 21.000
Datos de los partidos y tablas de 111
clasificación
Esto produce las siguientes estadísticas descriptivas para los partidos del Liverpool fuera
de casa.
##
Pld Media Mediana DE Total
GA 19 1.158 1.000 1.642 22.00
GF 19 2.053 2.000 1.615 39.00
SA 19 9.211 10.000 4.090 175.00
SF 19 15.316 15.000 4.473 291.00
STA 19 3.737 3.000 2.182 71.00
STF 19 5.526 6.000 2.245 105.00
GD 19 0.895 1.000 2.401 17.00
TG 19 3.211 3.000 2.200 61.00
TSRA 19 0.371 0.364 0.128 7.05
TSRF 19 0.629 0.636 0.128 11.95
PA 19 0.789 0.000 1.084 15.00
FP 19 1.895 3.000 1.243 36.00
Para producir estadísticas descriptivas de todos los partidos (combinados de ida y vuelta)
de la temporada, basta con escribir
Lo que produce:
##
Pld Media Mediana SD Total
GF 38 1.789 2.000 1.492 68.000
GA 38 1.105 1.000 1.351 42.000
SF 38 16.000 16.000 5.099 608.000
SA 38 8.763 8.500 3.514 333.000
STF 38 5.632 6.000 2.794 214.000
STA 38 3.789 3.000 1.727 144.000
GD 38 0.684 1.000 2.081 26.000
112 Análisis del fútbol
Esto produce el diagrama de caja de la Figura 4.1, que muestra que tanto en los
partidos en casa como fuera, el Liverpool hizo muchos más SoT de los que encajó.
FIGURA 4.1
Gráfico de cajas de los disparos a puerta, tanto a favor como en contra del Liverpool, durante sus
partidos en casa y fuera en la temporada 2020-2021. (HSTF= tiros a puerta en casa a favor; HSTA=
tiros a puerta en casa en contra; ASTF= tiros a puerta fuera a favor; ASTA= tiros a puerta fuera en
contra).
Datos de los partidos y tablas de 113
clasificación
A partir de los ejemplos 4.1-4.3, podemos ver que es relativamente fácil producir
en R estadísticas de rendimiento detalladas para cualquier club en cualquier
temporada directamente a partir de los datos históricos de los partidos. El código
presentado en estos ejemplos puede utilizarse y adaptarse para obtener información
más detallada sobre el rendimiento de los equipos. Por ejemplo, a partir de los
resultados del ejemplo 4.3, es interesante observar que, aunque el Liverpool recibió
más puntos por partido fuera de casa (1,895 puntos) que en casa (1,737 puntos), en
términos de TSRF y TSRA por partido, en realidad rindió mejor en casa que fuera.
rm(list= ls())
Una vez especificadas las direcciones URL, utilizamos un bucle for para cargar los datos
en R y seleccionar sólo algunas variables relevantes para el análisis.
download_data= NULL
for(i en 1:longitud(urls)){
temp= [Link](urls[i])
temp= temp[,c("Div", "Date", "HomeTeam", "AwayTeam", "FTHG", "FTAG",
"FTR","HS","AS","HST","AST")]
datos_descarga= rbind(datos_descarga, temp)
}
Para comprobar que los datos se han descargado correctamente, suele ser útil
inspeccionar el marco de datos. Esto se puede hacer fácilmente utilizando las
funciones 'head' y 'tail' de R, que visualizan las filas superior e inferior del marco de
datos 'download_data'.
##
Div Fecha Equipo local Equipo visitante FTHG FTAG FTR HS AS
1895 E0 23/05/2021 Leicester Tottenham 2 4 A 10 11
1896 E0 23/05/2021 Liverpool Crystal Palace 2 0 H 19 5
1897 E0 23/05/2021 Man City Everton 5 0 H 21 8
1898 E0 23/05/2021 Sheffield United Burnley 1 0 H 12 10
1899 E0 23/05/2021 West Ham Southampton 3 0 H 14 17
1900 E0 23/05/2021 Wolves Man United 1 2 A 14 9
HST AST
1895 6 4
1896 5 4
1897 11 3
1898 3 3
1899 7 5
1900 4 4
Los partidos del Arsenal contra el Chelsea se pueden extraer del marco de datos de
varias formas, pero aquí utilizaremos una variable indicadora para hacer el trabajo.
Crear una variable indicadora es un truco útil que puede ser útil en muchas
aplicaciones. En este caso, primero creamos un nuevo vector indicador, que
inicialmente se rellena completamente con ceros.
Ahora rellenamos la variable indicadora utilizando un bucle for y una sentencia if.
Aquí también introduciremos el operador AND '&' que toma dos valores lógicos y
devuelve TRUE sólo si ambos valores son TRUE.
for (i en 1:n){
if(ndat$HomeTeam[i]== teamH & ndat$AwayTeam[i]== teamA){ndat$ind[i]< - 1}
}
H2H["HTSR"]< - NA # Esto crea la nueva columna para almacenar el ratio de tiros del
equipo local. H2H["ATSR"]< - NA # Esto crea la nueva columna para almacenar el ratio de
tiros del equipo visitante. H2H$HTSR< - round(H2H$HS/(H2H$HS+ H2H$AS),3) # Aquí
redondeamos a 3 dp H2H$ATSR< - round(H2H$AS/(H2H$AS+ H2H$HS),3) # Aquí
redondeamos a 3 dp
print(H2H)
116 Análisis del fútbol
##
Div Fecha Equipo local Equipo visitante FTHG FTAG FTR HS AS HST AST ind
51 E0 24/09/16 Arsenal Chelsea 3 0 H 14 9 5 2 1
599 E0 03/01/2018 Arsenal Chelsea 2 2 D 14 19 6 6 1
981 E0 19/01/2019 Arsenal Chelsea 2 0 H 13 13 5 1 1
1337 E0 29/12/2019 Arsenal Chelsea 1 2 A 7 13 2 4 1
1661 E0 26/12/2020 Arsenal Chelsea 3 1 H 15 19 7 3 1
HTSR ATSR
51 0.609 0.391
599 0.424 0.576
981 0.500 0.500
1337 0.350 0.650
1661 0.441 0.559
A partir de esto, podemos ver que el Arsenal ganó tres de los partidos H2H anteriores,
y que el Chelsea sólo ganó uno. También hubo un empate.
PiT_dat< - head([Link]('[Link]
NOTA. '98 partidos' incluye los partidos del 30 de noviembre de 2020 y equivale
aproximadamente a 10 rondas de competición.
Inspeccionemos los datos descargados.
names(PiT_dat)
##
[1] "Div" "Fecha" "Hora" "HomeTeam" "AwayTeam" "FTHG" "HomeTeam"
"AwayTeam" "FTHG" "FTAG
Para utilizar las funciones definidas por el usuario que se describen a continuación, es
necesario crear primero cuatro vectores, "HomeTeam", "AwayTeam", "HomeGoals" y
"AwayGoals", que se cargarán en la función "[Link]".
# Define las cuatro variables que se cargarán en la función definida por el usuario.
HomeTeam< - PiT_dat$HomeTeam
AwayTeam< - PiT_dat$AwayTeam
HomeGoals< - PiT_dat$FTHG
AwayGoals< - PiT_dat$FTAG
Para producir una tabla de clasificación PiT, es necesario crear dos funciones
definidas por el usuario: 'resultado' y '[Link]'. La primera de estas funciones
determina el resultado del partido (es decir, H, D o A) basándose en los goles
marcados por los equipos local y visitante, mientras que la segunda produce una tabla
de clasificación PiT basada en los resultados de los partidos. Es importante destacar
que la función "[Link]" utiliza la función "resultado", por lo que sólo es
necesario aplicar la función "[Link]" cuando se construye una tabla de
clasificación PiT.
# Función 2. (Crea una tabla de clasificación actual a partir de los datos de resultados
# Crear un vector que contenga los resultados de los partidos (es decir, H,
A o D) resultados< - outcome(hGoals, aGoals)
# Rellenar vectores
for (i in 1:nEquipos) {
hResultados< - resultados[hEquipo== equipos[i]]
aResultados< - resultados[aEquipo== equipos[i]]
[Link][i]< - length(hResults)+ length(aResults) goals.H< -
sum(hGoals[hEquipo== equipos[i]])
goals.A< - sum(aGoals[aEquipo== equipos[i]])
[Link][i]< - goals.H+ goals.A
concedido.H< - suma(aGoles[hEquipo==
equipos[i]]) concedido.A< - suma(hGoles[aEquipo==
equipos[i]]) [Link] contra[i]< - concedido.H+
concedido.A [Link][i]< - goles.a favor[i] - [Link]
contra[i] hGanancias[i]< - suma(hResultados== "H")
hRemates[i]< - suma(hResultados== "D")
hPérdidas[i]< - suma(hResultados== "A")
aGanancias[i]< - suma(aResultados==
"A") aRemates[i]< - suma(aResultados==
"D") aPérdidas[i]< - suma(aResultados==
"H")
# Calcula el total de puntos a partir del número de victorias y empates de los respectivos equipos.
names(tabla)< - c("PLD", "HW", "HD", "HL", "AW", "AD", "AL", "GF", "GA", "GD", "PTS")
ord< - order(-table$PTS, -table$GD, -table$GF)
table< - table[ord, ]
return(tabla)
}
Datos de los partidos y tablas de 119
clasificación
Esto produce:
##
PLD HW HD HL AW AD AL GF GA GD PTS
Tottenham 10 2 2 1 4 1 0 21 9 12 21
Liverpool 10 5 0 0 1 3 1 22 17 5 21
Chelsea 10 2 2 1 3 2 0 22 10 12 19
Leicester 10 2 0 3 4 0 1 19 14 5 18
West Ham 10 3 1 1 2 1 2 17 11 6 17
Southampton 10 3 0 2 2 2 1 19 16 3 17
Lobos 10 2 2 1 3 0 2 11 11 0 17
Everton 10 2 1 2 3 0 2 19 17 2 16
Man United 9 1 1 3 4 0 0 16 16 0 16
Aston Villa 9 2 0 3 3 0 1 20 13 7 15
Manchester City 9 2 1 1 2 2 1 15 11 4 15
Leeds 10 1 2 2 3 0 2 15 17 -2 14
Newcastle 10 2 0 3 2 2 1 12 15 -3 14
Arsenal 10 2 0 3 2 1 2 10 12 -2 13
Palacio de 10 2 1 2 2 0 3 12 15 -3 13
Cristal
Brighton 10 0 3 2 2 1 2 14 16 -2 10
Fulham 10 1 0 4 1 1 3 11 19 -8 7
West Brom 10 1 2 2 0 1 4 7 18 -11 6
Burnley 9 1 0 3 0 2 3 4 17 -13 5
Sheffield United 10 0 1 4 0 0 5 4 16 -12 1
# Especifique los
valores de entrada
longitud <- 5
anchura <- 3
# Aplicar la función
calc_rectangle_area(longitud,anchur
a)
## [1] 15
Datos de los partidos y tablas de 121
clasificación
Por supuesto, las funciones definidas por el usuario suelen ser mucho más
complejas que el sencillo ejemplo que mostramos aquí, pero el principio
general sigue siendo el mismo. Escribimos un algoritmo para realizar una
tarea específica, y luego lo llamamos cada vez que deseamos utilizarlo. Como
resultado, las funciones definidas por el usuario son particularmente populares
cuando se realizan tareas complejas que deben repetirse varias veces.
fb_data< - head([Link]('[Link]
122 Análisis del fútbol
NB. Se trata de los mismos datos que hemos utilizado en los ejemplos anteriores, pero
aquí incluimos las siguientes variables adicionales:
soc_dat["HPts"]< - 0 # Esto crea la nueva columna para almacenar los puntos del equipo local por partido
soc_dat["APts"]< - 0 # Esto crea la nueva columna para almacenar los puntos del equipo visitante por
partido
for(i en 1:nrow(soc_dat)){
if(soc_dat$FTR[i]== "H"){soc_dat$HPts[i]< - 3}
if(soc_dat$FTR[i]== "A"){soc_dat$APts[i]< - 3}
if(soc_dat$FTR[i]== "D") {soc_dat$HPts[i]< - 1}
if(soc_dat$FTR[i]== "D") {soc_dat$APts[i]< - 1}
}
head(soc_dat)
##
Fecha Equipo local Equipo visitante HG AG Resultado HS AS HST AST HC AC
1 12/09/2020 Fulham Arsenal 0 3 A 5 13 2 6 2 3
2 12/09/2020 Crystal Palace Southampton 1 0 H 5 9 3 5 7 3
3 12/09/2020 Liverpool Leeds 4 3 H 22 6 6 3 9 0
4 12/09/2020 West Ham Newcastle 0 2 A 15 15 3 2 8 7
5 13/09/2020 West Brom Leicester 0 3 A 7 13 1 7 2 5
6 13/09/2020 Tottenham Everton 0 1 A 9 15 5 4 5 3
HPts APts
1 0 3
Datos de los partidos y tablas de 123
clasificación
2 3 0
3 3 0
4 0 3
5 0 3
6 0 3
# '[Link]' function
[Link]< - function(df, team){
Hmatches< - df[df$HomeTeam== team,] # Selecciona los partidos en casa del equipo objetivo.
Amatches< - df[df$AwayTeam== team,] # Selecciona los partidos fuera de casa del equipo
objetivo. all< - [Link](Hmatches,Amatches)
n< - nrow(all) # Número de partidos
# Crear vectores vacíos para almacenar
los resultados. x< - numeric(n)
GF< - x; GA< - x; SF< - x; SA< - x; STF< - x; STA< - x; CF< -
x; CA< - x; Pts< - x;
feats< - [Link](Pld,GF,GA,GD,TG,SF,SA,STF,STA,TSRF,TSRA,CF,CA,Pts)
featsSums< - colSums(feats)
featsRes< - featsSums
nOb< - nrow(feats)
featsRes[10]< - featsSums[10]/nOb # Esto calcula el TSRF medio. featsRes[11]< -
featsSums[11]/nOb # Esto calcula el TSRA medio. return(round(featsRes,2))
}
##
Pld GF GA GD TG SF SA STF STA TSRF
10.00 21.00 9.00 12.00 30.00 120.00 119.00 51.00 34.00 0.49
TSRA CF CA Pts
0.51 42.00 50.00 21.00
##
Pld GF GA GD TG SF SA STF STA TSRF
9.00 15.00 11.00 4.00 26.00 144.00 74.00 49.00 27.00 0.65
TSRA CF CA Pts
0.35 57.00 31.00 15.00
Datos de los partidos y tablas de 125
clasificación
NB. A excepción de TSRF y TSRA, que son valores medios, las puntuaciones de las
características que se indican aquí son las sumas de las distintas métricas adquiridas en
cada partido.
Los resultados del Tottenham, líder de la liga en aquel momento, son muy
interesantes. Aunque muestran que el Tottenham exhibía una saludable diferencia
positiva de goles de 12 después de 10 partidos, los resultados TSR sugieren que el
equipo podría no haber estado jugando tan bien. A diferencia del Manchester City y
de muchos de sus competidores (véase más adelante), la puntuación media TSRA
del Tottenham, de 0,51, fue en realidad mayor que su puntuación media TSRF, que
fue de 0,49, lo que implica que en la mayoría de los partidos recibió más disparos de
los que realizó. Esto sugiere que posiblemente tuvieron suerte de liderar la liga tras
la 10ª jornada. En comparación, el Manchester City, después de nueve partidos, tenía
una puntuación TSRF media (0,65) mucho mayor que su puntuación TSRA (0,35), lo
que implica que quizá debería haber sumado más puntos en esa fase de la
competición. Por lo tanto, no es de extrañar que el rendimiento del Tottenham
decayera a medida que avanzaba la temporada, terminando finalmente en séptimo
lugar, mientras que el Manchester City mejoró constantemente y terminó en lo más
alto de la EPL en la temporada 2020-2021.
El siguiente código muestra cómo se puede aplicar la función '[Link]' a todos
los equipos de la EPL.
En primer lugar, identificamos los nombres de los equipos de la liga y los
cotejamos en un vector.
Equipos< - unique(soc_dat$HomeTeam)
Equipos< - sort(Equipos) # Ordenarlos alfabéticamente
nEquipos< - length(Equipos) # Número de equipos
print(Equipos)
##
[1] "Arsenal" "Aston Villa" "Brighton"
[4] "Burnley" "Chelsea" "Crystal Palace"
[7] "Everton" "Fulham" "Leeds"
[10] "Leicester" "Liverpool" "Man City"
[13] "Man United "Newcastle" "Sheffield United"
[16] "Southampton" "Tottenham" "West Brom"
[19] "West Ham" "Wolves"
featureRes< - matrix(NA,nEquipos,14)
for(i in 1:nEquipos){
featureRes[i,]< - [Link](soc_dat, Equipos[i])
}
Esto produce:
##
Equipo Pld GF GA GD TG SF SA STF STA TSRF TSRA CF CA Pts
1 Arsenal 10 10 12 -2 22 95 124 32 39 0.46 0.54 47 50 13
2 Aston Villa 9 20 13 7 33 135 107 52 37 0.58 0.42 66 33 15
3 Brighton 10 14 16 -2 30 123 78 34 28 0.60 0.40 50 40 10
4 Burnley 9 4 17 -13 21 83 118 24 44 0.42 0.58 36 55 5
5 Chelsea 10 22 10 12 32 132 95 54 27 0.58 0.42 50 54 19
6 Palacio de Cristal 10 12 15 -3 27 94 133 36 45 0.40 0.60 51 55 13
7 Everton 10 19 17 2 36 116 129 49 49 0.48 0.52 48 43 16
8 Fulham 10 11 19 -8 30 126 124 42 57 0.50 0.50 38 45 7
9 Leeds 10 15 17 -2 32 153 136 55 49 0.52 0.48 55 49 14
10 Leicester 10 19 14 5 33 102 127 45 49 0.45 0.55 53 57 18
11 Liverpool 10 22 17 5 39 163 90 64 39 0.64 0.36 62 21 21
12 Ciudad 9 15 11 4 26 144 74 49 27 0.65 0.35 57 31 15
13 Manchester United 9 16 16 0 32 120 98 47 33 0.55 0.45 53 35 16
14 Newcastle 10 12 15 -3 27 86 158 28 59 0.36 0.64 42 55 14
15 Sheffield United 10 4 16 -12 20 97 152 31 57 0.38 0.62 50 67 1
16 Southampton 10 19 16 3 35 107 104 51 47 0.53 0.47 37 59 17
17 Tottenham 10 21 9 12 30 120 119 51 34 0.49 0.51 42 50 21
18 West Brom 10 7 18 -11 25 95 149 30 61 0.40 0.60 44 66 6
19 West Ham 10 17 11 6 28 118 109 40 39 0.51 0.49 47 51 17
20 Lobos 10 11 11 0 22 122 107 39 33 0.53 0.47 44 56 17
En el ejemplo 4.6, hemos visto cómo se puede utilizar R para producir una serie de
puntuaciones de las características de los equipos en las ligas. Pero, ¿cómo se
pueden utilizar para evaluar el rendimiento de los equipos? Bien, un método sencillo
es producir un gráfico de dispersión de los puntos ganados y las características
seleccionadas, como se ilustra en el ejemplo 4.7. Esto nos permite visualizar el
rendimiento de los equipos. Esto nos permite visualizar el rendimiento de los
respectivos equipos con respecto a un atributo. Una métrica utilizada con frecuencia
para evaluar el rendimiento de un equipo es el TSR (es decir, TSRF), que combina
las cualidades ofensivas y defensivas en una única puntuación [4]. Como tal, capta
uno de los atributos clave (es decir, la proporción de tiros realizados frente a los
recibidos) que puede influir en gran medida en el resultado de los partidos (para más
detalles, véase el capítulo 5). El Ejemplo 4.7, que utiliza el marco de datos
'featureTab' para los 98 partidos producidos en el Ejemplo 4.6, ilustra cómo puede
hacerse esto.
Datos de los partidos y tablas de 127
clasificación
Esto produce la siguiente salida, de la que podemos ver que r= 0.513 y que la relación
es significativa, con p= 0.021.
datos: x e y
t= 2.5353, df= 18, p-valor= 0.02073
hipótesis alternativa: la correlación verdadera no es igual a 0
intervalo de confianza del 95 por ciento:
0,09113012 0,77871828
estimaciones muestrales:
cor
0.5129646
# Gráfico de dispersión
plot(x,y, pch= 20, xlim= c(0.2,0.8), ylim= c(0,25), xlab= "Average TSRF score", ylab= "Points earned") text(y~x,
labels= Teams, cex= 0.8, font= 1, pos= 4) # Esto pone los nombres de los equipos en los puntos de datos.
abline(lm(y~x), lty= 2) # Esto dibuja una línea de mínimos cuadrados de mejor ajuste a través de los puntos
de datos.
FIGURA 4.2
Gráfico de dispersión de la puntuación media del ratio total de disparos a puerta (TSRF) y los puntos
obtenidos por los equipos de la EPL (temporada 2020-2021) tras 98 partidos (es decir,
aproximadamente 10 rondas de competición).
En la figura 4.2 se puede observar que, tras 98 partidos, existe una correlación
razonable (r= 0.513) entre el TSRF y los puntos ganados, con la mayoría de los equipos
agrupados cerca de la línea de mejor ajuste, a pesar de que algunos sólo habían
jugado 9 partidos en lugar de 10. Sin embargo, cinco equipos (tres de los cuales,
Sheffield United, West Bromwich y Fulham, descendieron posteriormente) se sitúan
muy por debajo de la línea de mejor ajuste, lo que indica que por alguna razón estos
equipos no conseguían convertir su TSRF en puntos de liga. Por ejemplo,
consideremos al Tottenham, que terminó la temporada en 7ª posición con 62 puntos,
y al Fulham, que quedó 18º y descendió con un total de sólo 28 puntos. Después de
10 partidos, el Tottenham tenía una puntuación TSRF de 0,49 y un total de 21
puntos, mientras que el Fulham tenía una puntuación TSRF ligeramente mejor, de
0,50, pero sólo había acumulado 7 puntos. Esto sugiere que la calidad de los disparos
del Tottenham (SoT= 51) fue en general mejor que la del Fulham (SoT= 42).
Además, el Tottenham encajó muchos menos SoT (34) que el Fulham (57). Así pues,
aunque las puntuaciones TSRF del Tottenham y el Fulham fueron similares, es
probable que los dos equipos difirieran mucho en la calidad de su juego, de ahí la
diferencia de 14 puntos entre los dos equipos después de 10 partidos. A pesar de
ello, en la figura 4.2 se aprecia que el Tottenham se sitúa a cierta distancia por
encima de la línea de mejor ajuste, lo que quizá sugiere que la buena suerte pudo
influir en algunas de sus actuaciones en los primeros partidos de la temporada, ya
que no fueron capaces de mantener el mismo ímpetu a medida que avanzaba la
temporada.
Si comparamos la Figura 4.2 con la Figura 4.3, que representa la posición de la
EoS, se puede observar que la correlación entre TSRF y puntos ganados se ha
reforzado (r= 0.731) y que todos menos Brighton y Fulham se sitúan relativamente
cerca de la línea de mejor ajuste. Esto sugiere que mientras estos dos equipos
Datos de los partidos y tablas de 129
clasificación
FIGURA 4.3
Gráfico de dispersión de la puntuación media del ratio total de disparos a puerta (TSRF) y los puntos
obtenidos por los equipos de la EPL (temporada 2020-2021) después de 380 partidos (es decir, al final
de la temporada).
Referencias
1. Chamberlain M: Predicciones de fútbol basadas en datos: Construyendo la
estrategia perfecta de apuestas de más de 2,5 goles para la Premier League inglesa.
Publicación independiente; [Link]; 2019.
2. [Link]: Funciones en R para tablas de liga de fútbol y matriz de
resultados. En: opis- thokontanet. vol. [Link] 18; 2012.
3. Tropiano A: Codifica un modelo de apuestas de fútbol en un fin de semana.
Publicación independiente; 2020.
4. Joslyn LR, Joslyn NJ, Joslyn MR: ¿Qué proporciona una temporada mejorada en el
fútbol universitario masculino? The relative effects of shots, attacking and
defending scoring efficiency on year-to-year change in season win percentage. The
Sport Journal 29 de junio de 2017:1-11.