En el año 2016 escribí un artículo (junto a mi compañero/amigo Samuel Gómez Haro) titulado Ampliando horizontes sobre medición del rendimiento y regularidad en el baloncesto profesional. El objetivo de dicho trabajo era el de proponer una medida que además de medir el rendimiento de un jugador, cuantificara también su regularidad.
Para ilustrar las bondades de la medida propuesta, se usaba la siguiente transformación de la valoración usada en la Liga ACB:
ValPtos = Valoración ACB - Puntos Anotados.
Teniendo en cuenta que:
Valoración ACB = Puntos anotados + Rebotes + Asistencias + Recuperaciones + Faltas personales recibidas + Tapones realizados – Tiros fallados – Pérdidas – Tapones recibidos – Faltas cometidas.
es inmediato que:
ValPtos = Rebotes + Asistencias + Recuperaciones + Faltas personales recibidas + Tapones realizados - Tiros fallados - Pérdidas - Tapones recibidos - Faltas cometidas.
De esta forma, por un lado se elimina la dependencia de la valoración ACB de los puntos anotados y, por otro, queda una media muy fácil de interpretar:
- Si ValPtos > 0, entonces el resto de acciones positivas que hace un jugador (Rebotes + Asistencias + Recuperaciones + Faltas personales recibidas + Tapones realizados) superan a las negativas (Tiros fallados + Pérdidas + Tapones recibidos + Faltas cometidas).
- Si ValPtos < 0, entonces el resto de acciones positivas que hace un jugador no superan a las negativas.
Por tanto, obviando el perfil anotador (el cual puede obtenerse de forma inmediata a partir de los puntos anotados), ValPtos podría usarse para detectar qué jugadores son más completos.
Para ilustrar los conceptos anteriores, voy a usar los datos de todos los jugadores de la Liga Endesa en su Temporada 2022-23 que han jugado en las 18 primeras jornadas:
library(readxl)
<- read_excel("datos.xlsx", sheet = "datos")
datos attach(datos)
= head(datos)
vistazo library(knitr)
kable(vistazo, align = "c", caption = "Visualización de los datos que tenemos: unas pocas observaciones")
Apodo | Nombre | Equipo | Ptos | Val |
---|---|---|---|---|
MF2 | M. Fjellerup | Girona | 8 | 3 |
EV4 | E. Vila | Girona | 6 | 6 |
KT5 | K. Taylor | Girona | 22 | 26 |
PF7 | P. Figueras | Girona | 6 | 4 |
RP8 | R. Prkacin | Girona | 0 | -1 |
QC10 | Q. Colom | Girona | 7 | 10 |
Como se observa, se tiene una leyenda a modo de apodo del jugador (iniciales más número), su nombre, equipo, puntos anotados y valoración.
En primer lugar, vamos a eliminar los datos pérdidos del conjunto de datos disponible y a confirmar la afirmación de que la valoración y la anotación están muy relacionadas:
sum(!is.na(Val) == !is.na(Ptos)) # primero compruebo que los datos perdidos en 'Ptos' son los mismos que en 'Val'
[1] 3860
nrow(datos) # si la suma anterior coincide con el número de filas del conjunto de datos, la afirmación realizada es cierta
[1] 3860
= datos[!is.na(Ptos),] # quitos los datos perdidos en Ptos
datos_filtrados detach(datos)
attach(datos_filtrados)
cor.test(Ptos, Val)
Pearson's product-moment correlation
data: Ptos and Val
t = 96.42, df = 3608, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.8393914 0.8576472
sample estimates:
cor
0.848772
En este caso, se obtiene un coeficiente de correlación lineal simple igual a 0.848772 (significativamente distinto de cero). Por tanto, cuando una aumenta/disminuye la otra también lo hace tal y como se observa en la siguiente representación gráfica:
plot(Ptos, Val, xlab="Puntos Anotados", ylab="Valoración", col="blue", lwd=3)
abline(h=mean(Val), col="red", lwd=2)
abline(v=mean(Ptos), col="red", lwd=2)
grid(nx = NULL, ny = NULL, lty = 2, col = "gray", lwd = 2)
A continuación, vamos a considerar un equipo concreto (por ejemplo, el Covirán Granada) y vamos a calcular ValPtos para cada uno de sus jugadores y vamos a representar sus valores frente a los puntos anotados:
library(dplyr)
= filter(datos_filtrados, Equipo == "Granada")
jugadores = as.matrix(jugadores[,1]) # si no pongo as.matrix no funciona tapply
ApodoBIS = as.matrix(jugadores[,2])
NombreBIS = as.matrix(jugadores[,4])
PtosBIS = as.matrix(jugadores[,5])
ValBIS = ValBIS - PtosBIS
ValPtosBIS = tapply(PtosBIS, NombreBIS, mean)
Puntos = tapply(ValPtosBIS, NombreBIS, mean)
ValPtos data.frame(Puntos, ValPtos)
Puntos ValPtos
Á. Corpas 0.000000 -1.00000000
A. Renfroe 10.444444 3.50000000
C. Díaz 6.000000 -1.61111111
C. Felicio 12.818182 0.09090909
D. Iriarte 1.200000 -1.40000000
D. Todorovic 5.333333 -3.66666667
J. Diaz 3.500000 -0.72222222
L. Costa 7.777778 -1.38888889
L. Maye 11.444444 -0.66666667
M. Caicedo 5.333333 -0.66666667
M. Moore 5.000000 -0.33333333
P. Ali 8.384615 -1.53846154
P. Niang 7.944444 5.11111111
P. Tomàs 4.444444 -0.27777778
R. Martín 0.000000 0.00000000
R. Vilà 2.400000 -1.60000000
T. Bropleh 12.222222 -3.38888889
Y. Ndoye 4.500000 -3.00000000
plot(Puntos, ValPtos, xlab="Puntos Anotados", ylab="Valoración - Puntos", lwd=3, col="blue", main="Granada", xlim=c(min(Puntos)-1, max(Puntos)+1), ylim=c(min(ValPtos)-1, max(ValPtos)+1))
text(Puntos, ValPtos, labels = levels(factor(ApodoBIS)), col="red", pos=3)
abline(v=0, col="black", lwd=3)
abline(h=0, col="black", lwd=3)
grid(nx = NULL, ny = NULL, lty = 2, col = "gray", lwd = 2)
¿Qué se puede observar en esta representación gráfica?
Aquellos jugadores que están por encima del eje horizontal, se tiene que el número de acciones positivas superan a las negativas; mientras que las que están por debajo es al revés.
Así, se tiene que si bien Thomas Bropleh es el segundo máximo anotador por partido (sólo superado por Cristiano Felicio), es el segundo peor en cuanto a ValPtos (sólo superado por Dejan Todorovic). Es decir, una vez eliminada la anotación de Bropleh, sus acciones son fundamentalmente negativas.
Por otro lado, se tiene que Alex Renfroe es el cuarto máximo anotador del equipo y el segundo con mejor ValPtos (sólo superado por Petit Niang). Es decir, una vez eliminada su anotación, es un jugador en el que sus acciones positivas superan a las negativas.
Adviértase que sólo tres jugadores, Niang, Renfroe y Felicio (por los pelos), tienen un valor de ValPtos positivo.
El código anterior se puede generalizar para obtener la misma gráfica de antes para los jugadores de cada uno de los equipos de la Liga ACB:
= levels(factor(Equipo))
equipos for (equipo in equipos){
= filter(datos_filtrados, Equipo == equipo)
jugadores = as.matrix(jugadores[,1])
ApodoBIS = as.matrix(jugadores[,2])
NombreBIS = as.matrix(jugadores[,4])
PtosBIS = as.matrix(jugadores[,5])
ValBIS = ValBIS - PtosBIS
ValPtosBIS = tapply(PtosBIS, NombreBIS, mean)
Puntos = tapply(ValPtosBIS, NombreBIS, mean)
ValPtos plot(Puntos, ValPtos, xlab="Puntos Anotados", ylab="Valoración - Puntos", lwd=3, col="blue", main=equipo, xlim=c(min(Puntos)-1, max(Puntos)+1), ylim=c(min(ValPtos)-1, max(ValPtos)+1))
text(Puntos, ValPtos, labels = levels(factor(NombreBIS)), col="red", pos=3)
abline(v=0, col="black", lwd=3)
abline(h=0, col="black", lwd=3)
grid(nx = NULL, ny = NULL, lty = 2, col = "gray", lwd = 2)
}
Finalmente, el código para calcular las representaciones anteriores para todos los jugadores de forma conjunta podría ser el siguiente:
detach(datos_filtrados)
<- read_excel("datos.xlsx", sheet = "datos")
datos = datos[,4]
ptos = datos[!is.na(ptos),]
datos_filtrados attach(datos_filtrados)
= tapply(Ptos, Apodo, mean)
Puntos = Val - Ptos
ValPtos = tapply(ValPtos, Apodo, mean)
ValPuntos plot(Puntos, ValPuntos, xlab="Puntos Anotados", ylab="Valoración - Puntos", lwd=3, col="blue", main="Todos los jugadores", xlim=c(min(Puntos)-1, max(Puntos)+1), ylim=c(min(ValPuntos)-1, max(ValPuntos)+1))
text(Puntos, ValPuntos, labels = levels(factor(Apodo)), col="red", pos=2)
abline(v=0, col="black", lwd=3)
abline(h=0, col="black", lwd=3)
grid(nx = NULL, ny = NULL, lty = 2, col = "gray", lwd = 2)
detach(datos_filtrados)
Se observa que:
- Son dos pivots, Walter Tavares y Marc Gasol, los que tienen un mayor ValPtos.
- Centrándonos en dos jugadores de moda en la liga como son S. Evans (SE11, ex Betis) y M. Howard (MH0, Baskonia); se tiene que el primero tiene un ValPtos ligeramente positivo, mientras que el segundo es el tercer peor valor de ValPtos.
De cara a un futuro, se podría mejorar este análisis considerando que se ha jugado un número mínimo de partidos (así no se colaría por ejemplo T. Perez, TP1, como el segundo mejor anotador) o ponderando por el número de minutos jugados.