Revisitando el +/-

Con datos históricos de la Copa del Rey
readxl
kable
attach
knitr
dplyr
filter
arrange
plot
lm
head
arrange
memisc
mtable
Author

Román Salmerón Gómez

Published

February 12, 2025

Hace poco escuché a un comentarista de la tele decir que tal jugador tenía un +/- (estadística que mide para cada jugador el resultado obtenido por el equipo cuando él ha estado en pista) acumulado bastante alto, elogiando de esta forma su rendimiento. Claro, pensé yo, cuando se está en un equipo que gana (y mucho) es fácil tener un +/- positivo. El mérito está en otro lado.

Para hurgar en ese otro lado, voy a usar datos de la Copa del Rey desde la temporada 2011/2012 ya que, tal y como se explica aquí, el +/- no está disponible en las temporadas anteriores.

Inicialmente se cuentan con 2.441 observaciones (no confundir con jugadores, ya que hay jugadores que han jugado más de un partido) y 86 variables. Ahora bien, para que la extensión de este post no se alargue de forma innecesaria, previamente he filtrado la base de datos inicial de forma que se han considerado jugadores que han disputado un mínimo de 10 minutos en el partido (esto supone pasar a 1658 observaciones) y aquellas variables que tienen una correlación lineal simple con el +/- superior (en valor absoluto) a 0.2 y significativamente distinta de cero (lo que supone quedarse con 10 variables).

En definitiva, aquí tienes los datos con los que vamos a trabajar. Los cargamos y visualizamos:

library(readxl)
datos <- read_excel("jugadores.xlsx", sheet = "datos")
vistazo = head(datos, 10)
library(knitr)
kable(vistazo, align = "c", caption = "Visualización de los datos: unas pocas observaciones")
Visualización de los datos: unas pocas observaciones
Temporada Apodo Fase Resultado Nombre MasMenos TCC TCP RD GeneraPTOS Eficacia PosFJE PorcPosFJE AsisBP TS eFG diferencia MJ opcion opcionA opcionB opcionC opcionD
2012 PP5 Cuartos 1 P. Prigioni 18 5 55.56 6 27 57.69231 15 78.94737 NA 69.70260 66.66667 7 30.10000 1 1 0 0 0
2012 MB11 Cuartos 1 M. Bjelica 7 8 61.54 3 22 61.11111 14 66.66667 0.00 68.40796 65.38462 7 31.15000 1 1 0 0 0
2012 FS19 Cuartos 1 F. San Emeterio -12 0 0.00 3 2 0.00000 2 18.18182 1.00 0.00000 0.00000 7 23.10000 3 0 0 1 0
2012 BO24 Cuartos 1 B. Oleson 16 4 44.44 1 13 42.85714 9 64.28571 NA 50.00000 50.00000 7 31.75000 1 1 0 0 0
2012 MT33 Cuartos 1 M. Teletovic 19 7 53.85 6 23 47.22222 15 68.18182 3.00 55.92105 61.53846 7 30.33333 1 1 0 0 0
2012 MP5 Cuartos 0 M. Papamakarios -1 0 0.00 3 4 0.00000 3 60.00000 NA 0.00000 0.00000 -7 19.23333 4 0 0 0 1
2012 AP7 Cuartos 0 A. Panko III -18 6 37.50 3 14 36.84211 8 40.00000 0.00 43.75000 43.75000 -7 24.51667 4 0 0 0 1
2012 RN8 Cuartos 0 R. Neto 7 4 66.67 0 10 57.14286 7 53.84615 0.25 62.11180 66.66667 -7 23.71667 2 0 1 0 0
2012 SV9 Cuartos 0 S. Vidal -12 3 37.50 4 15 42.85714 9 47.36842 0.60 53.31754 50.00000 -7 33.53333 4 0 0 0 1
2012 DD13 Cuartos 0 D. Doblas 5 0 0.00 7 8 25.00000 7 77.77778 3.00 27.47253 0.00000 -7 24.51667 2 0 1 0 0

Las 10 variables relacionadas con el +/- son:

Además, se puede observar que hay otras variables auxiliares que permiten identificar al jugador o el año en el que se disputa el partido, el resultado del mismo (1 en caso de victoria y 0 en el de derrota) y la diferencia por la que se gana o pierde.

Finalmente, se tienen unas variables que reflejan las cuatros situaciones siguientes:

De las cuatro situaciones descritas, las dos intermedias parecen ser (bajo mi punto de vista) las más interesantes.

El resto de variables tipo opción son variables binarias creadas a partir de la anterior.

¿Qué factores influyen en el +/-?

Para responder a la pregunta planteada vamos a plantear un modelo de regresión lineal múltiple donde se consideran las variables anteriores como independientes y el +/- como independientes.

Además, en el siguiente código también se construyen seis subconjutos de datos que diferencian si el partido se ha ganado/perdido o se está en algunas de las cuatro opciones anteriores.

library(dplyr)
attach(datos)
  reg = lm(MasMenos~TCC+TCP+RD+GeneraPTOS+Eficacia+PosFJE+PorcPosFJE+AsisBP+TS+eFG)
  jugadores_victoria = filter(datos, Resultado==1) # las victorias
  jugadores_derrota = filter(datos, Resultado==0) # las derrotas
  jugadores_opcion1 = filter(datos, opcion==1) # +/- positivo en partido ganado
  jugadores_opcion2 = filter(datos, opcion==2) # +/- positivo o cero en partido perdido (interesante)
  jugadores_opcion3 = filter(datos, opcion==3) # +/- negativo en partido ganado (interesante)
  jugadores_opcion4 = filter(datos, opcion==4) # +/- negativo en partido perdido
detach(datos)  

Observando los resultados de la estimación del modelo de regresión planteado por Mínimos Cuadrados Ordinarios:

summary(reg)  

Call:
lm(formula = MasMenos ~ TCC + TCP + RD + GeneraPTOS + Eficacia + 
    PosFJE + PorcPosFJE + AsisBP + TS + eFG)

Residuals:
    Min      1Q  Median      3Q     Max 
-35.567  -5.844   0.040   6.271  32.269 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -9.245672   1.217763  -7.592 6.86e-14 ***
TCC         -0.270237   0.331174  -0.816 0.414685    
TCP          0.055385   0.091202   0.607 0.543794    
RD           1.080895   0.162790   6.640 5.00e-11 ***
GeneraPTOS   0.500901   0.172152   2.910 0.003694 ** 
Eficacia     0.090094   0.106916   0.843 0.399606    
PosFJE      -0.630737   0.258410  -2.441 0.014816 *  
PorcPosFJE   0.009631   0.041810   0.230 0.817869    
AsisBP       1.114987   0.316323   3.525 0.000442 ***
TS          -0.086818   0.104399  -0.832 0.405825    
eFG          0.037989   0.086686   0.438 0.661301    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 9.837 on 1063 degrees of freedom
  (584 observations deleted due to missingness)
Multiple R-squared:  0.1557,    Adjusted R-squared:  0.1478 
F-statistic: 19.61 on 10 and 1063 DF,  p-value: < 2.2e-16

Se tiene (además de que el modelo es válido conjuntamente aunque tenga un coeficiente de determinación bajo) que:

  • Cuando se captura un rebote defensivo, el +/- aumento en 1.08 unidades.
  • Cuando se genera un punto, el +/- aumenta en 0.5 unidades.
  • Cuando se finaliza una jugada con éxito, el +/- disminuye en 0.63 unidades (¿comor!).
  • Cuando el número de asistencias por cada balón perido aumenta una unidad, el +/- también aumenta en 1.11 unidades.

En principio, todos los resultados son esperables exceptuando el referente al de número de posesiones finalizadas con éxito. Si un jugador toma decisiones correctas, ¿no debería verse esto reflejado en un mayor +/-?

Independientemente de que habría que cotejar que no hay problemas de multicolinealidad o heterocedasticidad (o, incluso, explorar la posibilidad de plantear un modelo de panel), a continuación valos a replicar el modelo lineal considerando sólo partidos en los que se ha ganado y perdido:

attach(jugadores_victoria)
  reg_victoria = lm(MasMenos~TCC+TCP+RD+GeneraPTOS+Eficacia+PosFJE+PorcPosFJE+AsisBP+TS+eFG) 
detach(jugadores_victoria)
  
attach(jugadores_derrota)
  reg_derrota = lm(MasMenos~TCC+TCP+RD+GeneraPTOS+Eficacia+PosFJE+PorcPosFJE+AsisBP+TS+eFG) 
detach(jugadores_derrota)

Comparando los tres modelos considerados hasta el momento:

library(memisc) 
mtable("Todo" = reg, "Victoria" = reg_victoria, "Derrota" = reg_derrota, summary.stats=c("sigma","R-squared","F","p","N"))  

Calls:
Todo: lm(formula = MasMenos ~ TCC + TCP + RD + GeneraPTOS + Eficacia + 
    PosFJE + PorcPosFJE + AsisBP + TS + eFG)
Victoria: lm(formula = MasMenos ~ TCC + TCP + RD + GeneraPTOS + Eficacia + 
    PosFJE + PorcPosFJE + AsisBP + TS + eFG)
Derrota: lm(formula = MasMenos ~ TCC + TCP + RD + GeneraPTOS + Eficacia + 
    PosFJE + PorcPosFJE + AsisBP + TS + eFG)

====================================================
                  Todo       Victoria    Derrota    
----------------------------------------------------
  (Intercept)    -9.246***   -2.842     -10.499***  
                 (1.218)     (1.563)     (1.497)    
  TCC            -0.270      -0.086      -0.508     
                 (0.331)     (0.393)     (0.440)    
  TCP             0.055      -0.000       0.098     
                 (0.091)     (0.108)     (0.120)    
  RD              1.081***    0.857***    0.713***  
                 (0.163)     (0.195)     (0.214)    
  GeneraPTOS      0.501**     0.341       0.691**   
                 (0.172)     (0.213)     (0.219)    
  Eficacia        0.090       0.074       0.061     
                 (0.107)     (0.124)     (0.144)    
  PosFJE         -0.631*     -0.364      -0.737*    
                 (0.258)     (0.324)     (0.323)    
  PorcPosFJE      0.010       0.028       0.023     
                 (0.042)     (0.055)     (0.051)    
  AsisBP          1.115***    0.826*     -0.011     
                 (0.316)     (0.359)     (0.482)    
  TS             -0.087      -0.175      -0.076     
                 (0.104)     (0.122)     (0.141)    
  eFG             0.038       0.152      -0.042     
                 (0.087)     (0.102)     (0.116)    
----------------------------------------------------
  sigma           9.837       8.494       8.799     
  R-squared       0.156       0.166       0.078     
  F              19.609      10.478       4.438     
  p               0.000       0.000       0.000     
  N            1074         538         536         
====================================================
  Significance: *** = p < 0.001; ** = p < 0.01;   
                * = p < 0.05  

Tenemos que todos los modelos son globalmente válidos y:

  • La captura de rebotes defensivos influye positivamente en los tres casos.
  • La generación de puntos no inluye en el +/- cuando se gana el partido.
  • El número de posesiones finalizadas con éxito inluye (también) negativamente cuando el resultado final es la derrota. Lo cual podría explicar el signo negativo estimado con anterioridad no esperado: cuando se pierde, lo normal es que los jugadores tengan un +/- negativo. Si estos jugadores tienen un número de posesiones finalizadas con éxito alto, el signo estimado resulta ser negativo.
  • El número de asistencias por balón perdido influye en el +/- aumentándolo sólo cuando se gana.

En definitiva, aquellos jugadores que aseguran el rebote defensivo y cuidan el balón siendo generosos con los compañeros sin perder el balón son los que tienen un mayor +/- en, al menos, la Copa del Rey (seguramente en la Liga Endesa pase algo parecido).

Nota: dejo al lector el plantear el modelo de regresión cuando la muestra se limita a las cuatro opciones planteadas en jugadores_opcion1 a jugadores_opcion4. ¿Me contarás lo que sale?

Vamos a darle una vuelta al +/-

Retornemos al origen de este post. ¿Es un mérito tener un +/- positivo cuando se gana o un desmérito tenerlo positivo cuando se pierde? ¿Tener un +/- acumulado cercano a cero es bueno o malo? Pues en un equipo donde se gana mucho será malo y en otro en el que se pierde mucho será bueno, creo yo.

Empezemos por un sencillo diagrama de dispersión (se representa la recta de regresión lineal simple):

plot(datos$diferencia, datos$MasMenos, col="yellow", lwd=2, ylab = "+/-", xlab="Resultado partido") 
abline(v=0, col="black", lwd=2)
abline(h=0, col="black", lwd=2)
reg_simple = lm(datos$MasMenos~datos$diferencia)
abline(reg_simple, col="blue", lwd=2)
text(30, 30, labels="opcion = 1", col="black", cex=1.25) # O1: +/- positivo en partido ganado
text(-30, 30, labels="opcion = 2", col="black", cex=1.25) # O2: +/- positivo en partido perdido
text(30, -30, labels="opcion = 3", col="black", cex=1.25) # O3: +/- negativo en partido ganado
text(-30, -30, labels="opcion = 4", col="black", cex=1.25) # O4: +/- negativo en partido perdido
grid(nx = NULL, ny = NULL, lty = 2, col = "gray", lwd = 1)

Vemos que se confirma que cuando se gana lo normal es tener un +/- positivo (opcion = 1, primer cuadrante) y cuando se pierde lo normal es tenerlo negativo (opcion = 4, tercer cuadrante).

Lo menos habitual y, quizás lo más interesante, son las restantes opciones, tener un +/- positivo en un partido perdido (opcion = 2, segundo cuadrante) y tener un +/- negativo en un partido ganado (opcion = 3, cuarto cuadrante).

Un jugador en el segundo cuadrante será algo deseable, al contrario de un jugador del cuarto.

¿Pasamos a la acción? A continuación calculo, para cada jugador, cuántas veces está en cada una de las opciones anteriores (tanto en valor abosulo como relativo) así como el +/- acumulado y el número de partidos disputados:

attach(datos)
  sum1 = tapply(opcionA, factor(Nombre), sum) # O1
  sum2 = tapply(opcionB, factor(Nombre), sum) # O2
  sum3 = tapply(opcionC, factor(Nombre), sum) # O3
  sum4 = tapply(opcionD, factor(Nombre), sum) # O4
  MN = tapply(MasMenos, factor(Nombre), sum)
detach(datos)  
PJ = sum1 + sum2 + sum3 + sum4 # partidos jugados
porc1 = sum1/PJ # %O1
porc2 = sum2/PJ # %O2
porc3 = sum3/PJ # %O3
porc4 = sum4/PJ # %O4

output = round(data.frame(MN, PJ, sum1, porc1, sum2, porc2, sum3, porc3, sum4, porc4), digits=2)
names(output) = c("+/-", "PJ", "O1", "% O1", "O2", "% O2", "O3", "% O3", "O4", "% O4")

Vamos a ver qué tenemos en distintas situaciones.

Empezamos por presentar los resultados (para los 20 primeros jugadores) ordenando por el +/- acumulado de mayor a menor:

output1 = arrange(output, desc(MN), desc(PJ)) # https://rsanchezs.gitbooks.io/rprogramming/content/chapter9/dplyr.html
output1[1:20,]
                +/- PJ O1 % O1 O2 % O2 O3 % O3 O4 % O4
J. Carroll      200 25 17 0.68  1 0.04  3 0.12  4 0.16
F. Campazzo     163 12  9 0.75  2 0.17  1 0.08  0 0.00
W. Tavares      137 22 11 0.50  4 0.18  4 0.18  3 0.14
R. Fernández    134 22 13 0.59  3 0.14  3 0.14  3 0.14
F. Reyes        124 21 14 0.67  0 0.00  2 0.10  5 0.24
S. Llull        122 29 18 0.62  1 0.03  6 0.21  4 0.14
N. Mirotic      122 15 10 0.67  2 0.13  2 0.13  1 0.07
B. Oleson       114 12  7 0.58  2 0.17  1 0.08  2 0.17
G. Ayón         104 12  9 0.75  1 0.08  1 0.08  1 0.08
G. Deck          99 16 10 0.62  1 0.06  2 0.12  3 0.19
A. Tomic         78 26 11 0.42  5 0.19  4 0.15  6 0.23
A. Randolph      76 12  6 0.50  2 0.17  2 0.17  2 0.17
N. Laprovittola  73 12  6 0.50  1 0.08  2 0.17  3 0.25
R. Jokubaitis    64  7  5 0.71  2 0.29  0 0.00  0 0.00
N. Calathes      56  6  5 0.83  0 0.00  1 0.17  0 0.00
T. Heurtel       53 11  6 0.55  1 0.09  2 0.18  2 0.18
J.C. Navarro     51 14  7 0.50  2 0.14  3 0.21  2 0.14
S. Rodríguez     50 19  8 0.42  3 0.16  5 0.26  3 0.16
V. Claver        50 10  4 0.40  2 0.20  1 0.10  3 0.30
V. Sada          48  7  4 0.57  0 0.00  2 0.29  1 0.14

Se observa que estos jugadores se caracterizan por ganar un alto porcentaje de los partidos disputados. Llama especialmente la atención que Jokubaitis ha tenido siempre un +/- positivo aún habiendo perdido en 2 de los 7 partidos disputados en Copa del Rey.

De forma análoga, si se ordena de menor a mayor +/-, se observa que los jugadores con menor +/- se caracterizan por perder un alto porcentaje de los partidos disputados.

output2 = arrange(output, MN, desc(PJ)) 
output2[1:20,]
                +/- PJ O1 % O1 O2 % O2 O3 % O3 O4 % O4
P. Llompart     -57  5  0 0.00  0 0.00  1 0.20  4 0.80
E. Báez         -50 10  2 0.20  2 0.20  1 0.10  5 0.50
D. Seeley       -47  6  0 0.00  1 0.17  2 0.33  3 0.50
T. Kirksay      -43  4  0 0.00  0 0.00  1 0.25  3 0.75
P. Aguilar      -40  5  0 0.00  1 0.20  0 0.00  4 0.80
S. Van Rossom   -39 10  2 0.20  1 0.10  0 0.00  7 0.70
W. Thomas       -39 10  1 0.10  0 0.00  4 0.40  5 0.50
O. Cook         -39  4  1 0.25  0 0.00  0 0.00  3 0.75
J. Sastre       -38 11  2 0.18  2 0.18  2 0.18  5 0.45
C. Hannah       -38  6  2 0.33  0 0.00  1 0.17  3 0.50
J. Jones        -38  4  0 0.00  1 0.25  1 0.25  2 0.50
G. Shermadini   -36 15  5 0.33  3 0.20  1 0.07  6 0.40
López-Arostegui -35  7  1 0.14  1 0.14  1 0.14  4 0.57
D. Thompson     -35  5  1 0.20  0 0.00  1 0.20  3 0.60
L. Barnes       -35  2  0 0.00  0 0.00  0 0.00  2 1.00
D. Todorovic    -34  6  1 0.17  0 0.00  1 0.17  4 0.67
J. Shurna       -33  3  0 0.00  0 0.00  0 0.00  3 1.00
F. San Emeterio -32 13  2 0.15  2 0.15  2 0.15  7 0.54
M. Roll         -32  3  1 0.33  0 0.00  0 0.00  2 0.67
A. Doornekamp   -31 14  4 0.29  3 0.21  2 0.14  5 0.36

Si nos quedamos con los 20 jugadores que más partidos han disputado en la Copa del Rey (desde la temporada 2011/2012), por ejemplo, se tiene que en un 21% de los partidos LLull ha tenido un +/- negativo en un partido perdido o que Dubljevic lo ha tenido positivo en un partido perdido en un 31% de los partidos que ha jugado.

output3 = arrange(output, desc(PJ), desc(MN)) 
output3[1:20,]
              +/- PJ O1 % O1 O2 % O2 O3 % O3 O4 % O4
S. Llull      122 29 18 0.62  1 0.03  6 0.21  4 0.14
A. Tomic       78 26 11 0.42  5 0.19  4 0.15  6 0.23
J. Carroll    200 25 17 0.68  1 0.04  3 0.12  4 0.16
M. Huertas     45 23  9 0.39  4 0.17  5 0.22  5 0.22
W. Tavares    137 22 11 0.50  4 0.18  4 0.18  3 0.14
R. Fernández  134 22 13 0.59  3 0.14  3 0.14  3 0.14
F. Reyes      124 21 14 0.67  0 0.00  2 0.10  5 0.24
A. Hanga       25 20  8 0.40  1 0.05  3 0.15  8 0.40
S. Rodríguez   50 19  8 0.42  3 0.16  5 0.26  3 0.16
P. Ribas      -26 18  5 0.28  2 0.11  4 0.22  7 0.39
F. Causeur     36 17  7 0.41  3 0.18  3 0.18  4 0.24
G. Deck        99 16 10 0.62  1 0.06  2 0.12  3 0.19
S. Salin       15 16  6 0.38  3 0.19  0 0.00  7 0.44
B. Dubljevic  -10 16  2 0.12  5 0.31  2 0.12  7 0.44
N. Mirotic    122 15 10 0.67  2 0.13  2 0.13  1 0.07
G. Shermadini -36 15  5 0.33  3 0.20  1 0.07  6 0.40
J.C. Navarro   51 14  7 0.50  2 0.14  3 0.21  2 0.14
C. Suárez      23 14  5 0.36  3 0.21  1 0.07  5 0.36
J. Taylor       6 14  7 0.50  1 0.07  3 0.21  3 0.21
A. Doornekamp -31 14  4 0.29  3 0.21  2 0.14  5 0.36

Por último, veamos cuántos jugadores tienen un +/- próximo a cero y ha jugado al menos 10 partidos:

filter(output, (MN>-5)&(MN<5), PJ>9)
            +/- PJ O1 % O1 O2 % O2 O3 % O3 O4 % O4
D. Brizuela  -1 11  5 0.45  1 0.09  2 0.18  3 0.27
P. Oriola     2 12  5 0.42  0 0.00  2 0.17  5 0.42

Tenemos sólo dos jugadores en estas circunstancias, el primero ha ganado 7 partidos (O1 + O3) y perdido 4 (O2 + O4), mientras que el segundo 7 y 5, respectivamente.

Oriola parece responder al patrón de tener un +/- positivo cuando su equipo gana y negativo cuando pierde. En cambio, Brizuela presenta algún partido de +/- negativo cuando su equipo ha ganado.

Comentario final: en el ansia (que caracteriza a muchos los analistas de datos) de querer resumir todo en un número, consideré la opción de crear una medida que intentara resumir los datos de las tablas anteriores. Pensé en sumar el +/- del jugador (variable MasMenos) con el resultado final del partido (variable diferencia).

Pero, aparte de que potenciaría mucho a la opción 1 (dando valores muy altos) y perjudicaría a la 4 (dando valores muy bajos), en aquellos casos en los que se compensaría el +/- del jugador y el resultado final de partido (dando valores, próximos a cero) no se tendría claro si el jugador se encuadra en la opción 2 ó 3.

También pensé en el cociente, por ejemplo, dividir el +/- del jugador entre el resultado final del partido, pero surge el problema de que el signo se compensa en la opción 4.

¿Se te ocurre algo?