Introducción
En esta serie de posts vamos a aprender a calcular desde la matriz de expectativa de carrera hasta el wOBA. Para llevar estos cálculos, aplicaremos un enfoque parecido al que utilizo por Tom Tango en su libro The Book y usaremos ademas distintos conjuntos de datos que he creado para la diferentes ligas de beisbol invernales. Así mismo, debo recalcar que en esta serie de posts nos enfocaremos en aprender los conceptos por medio de programación y no por medio de la teoría.
Play by play dataset
He creado un conjunto de datos que contiene información jugada a jugada para cada partido llevado a cabo en distintas temporadas de distintas ligas invernales. El dataset es en su gran mayoría preciso, sin embargo, no descarto que existan jugadas atípicas para las cuales guarde información incorrecta. No obstante, tales jugadas no deberían afectar nuestros cálculos en gran medida.
El conjunto de datos tiene múltiples variables que explican el entorno en el que se llevó a cabo una jugada. Entre tales variables estas podemos destacar:
- El numero de outs registrados antes de la jugada.
- El numero de outs efectuados durante la jugada.
- El numero de outs efectuados después de la jugada.
- Los corredores en base al iniciar la jugada.
- Los corredores en base al terminar la jugada.
- Las carreras anotadas antes de la jugada.
- Las carreras anotadas durante la jugada.
- Las carreras anotadas después de la jugada.
- Las carreras anotadas durante la mitad inning.
Matriz de Expectativa de Carrera en Python
En esta ocasión vamos a calcular la Matriz Expectativa de Carrera para la temporada 2018-2019 de la LIDOM. Para calcular dicha matriz vamos a utilizar pandas, un paquete de Python que facilita la manipulación y análisis de datos, así que si no lo has descargado, por favor hazlo antes de correr el siguiente código.
import pandas as pd | |
df = pd.read_csv( filepath_or_buffer = 'data.csv' | |
, sep = ',' | |
, names = [ 'Liga', 'Inning', 'Mitad Del Inning', 'Evento' | |
, 'Outs Antes De Jugada', 'Corredores Inicio De Jugada' | |
, 'Carreras Antes De Jugada', 'Carreras Anotadas En Jugada' | |
, 'Outs En Juego', 'Outs Despues De Jugada', 'Corredores Despues De Jugada' | |
, 'Carreras Despues De Jugada', 'Carreras Final Inning' | |
] | |
, header=0 | |
) | |
rem = ( | |
df.assign( Carreras = lambda x: x['Carreras Final Inning'] - x['Carreras Antes De Jugada']) | |
.groupby( by = ['Outs Antes De Jugada', 'Corredores Inicio De Jugada'])['Carreras'] | |
.agg( func_or_funcs = { 'Carreras': 'sum' | |
, 'N' : 'count' | |
} | |
) | |
.assign( Expectativa = lambda x: x['Carreras'] / x['N'] ) | |
.reset_index() | |
.rename( columns = { 'Outs Antes De Jugada' : 'Outs' | |
, 'Corredores Inicio De Jugada' : 'Corredores' | |
} | |
) | |
) |
Ahora bien, si ya descargaste el código y no entiendes mucho de programación, no te preocupes acá te explico linea por línea lo que hace esta lógica: en la línea 1 importamos pandas y en la línea 3 leemos el dataset que creé; en las líneas 14 a 27 hacemos el procesamiento para obtener la expectativa de carrera; en la 15 obtenemos las carreras al final del inning para cada registro del conjunto de datos; en la 16 agrupamos el dataset por cada situación base-out; en la 17 contamos el numero de veces que ocurrió cada situación y el numero de carreras que entraron después de ocurridas y hasta el final del inning; en la línea 21 simplemente dividimos la suma total de carreras de cada base-out entre sus ocurrencias; las 22 a 26 no tienen importancia por ahora; por último la linea 29 imprime la expectativa de carrera:
Outs Corredores Carreras N Expectativa | |
0 0 --- 1411 3488 0.404530 | |
1 0 --3 86 63 1.365079 | |
2 0 -2- 234 241 0.970954 | |
3 0 -23 80 41 1.951220 | |
4 0 1-- 660 890 0.741573 | |
5 0 1-3 123 75 1.640000 | |
6 0 12- 288 212 1.358491 | |
7 0 123 142 64 2.218750 | |
8 1 --- 535 2500 0.214000 | |
9 1 --3 142 168 0.845238 | |
10 1 -2- 328 492 0.666667 | |
11 1 -23 159 131 1.213740 | |
12 1 1-- 464 1000 0.464000 | |
13 1 1-3 191 164 1.164634 | |
14 1 12- 318 390 0.815385 | |
15 1 123 215 165 1.303030 | |
16 2 --- 126 1989 0.063348 | |
17 2 --3 91 278 0.327338 | |
18 2 -2- 155 599 0.258765 | |
19 2 -23 92 159 0.578616 | |
20 2 1-- 192 1074 0.178771 | |
21 2 1-3 136 250 0.544000 | |
22 2 12- 161 464 0.346983 | |
23 2 123 134 199 0.673367 |
Tal y como puedes notar, la matriz de expectativa de carrera no se encuentra en el formato y orden en el que la mayoría de autores acostumbran a presentarla. Sin embargo la dejaré así ya que desde el punto de vista computacional es más fácil calcular el wOBA si la dejamos así.
2 comentarios en “Expectativa de Carrera I: Calculando la Matriz de Expectativa de Carrera.”