El atletismo necesita una nueva generación de entrenadores y cazatalentos

El atletismo data de las primeras Olimpiadas. Desde entonces, poco ha cambiado. Los atletas compiten individualmente, buscando lanzar lo más lejos, saltar lo más lejos (o alto) y correr lo más rápido. Pero a los aficionados les gusta ser aficionados de equipos, ondeando pancartas y gritar como locos durante los partidos, vistiendo la camisa favorita de su jugador y permaneciendo leales a su equipo en las buenas y en las malas.

¿Qué pasaría si el atletismo se convirtiera en un deporte en equipo? Podría potencialmente ser más interesante y darnos una nueva visión de “sport analytics” para estudiar. Se podría incluso reducir el incentivo de hacer cosas desagradables en busca del “altius, fortius and citius”.

Esta base de datos contiene resultados de atletas americanos en saltos horizontales (salto triple y salto largo), y lanzamientos (lanzamiento de peso, disco, javalina, martillo). ¡Importémosla!

# Cargamos el paquete tidyverse
library(tidyverse)

# Importamos la base de datos completa
data <- read_csv("athletics.csv")
glimpse(data)
## Observations: 2,098
## Variables: 10
## $ Event       <chr> "Shot Put", "Shot Put", "Shot Put", "Shot Put", "S...
## $ Male_Female <chr> "Male", "Male", "Male", "Male", "Male", "Male", "M...
## $ EventID     <int> 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3,...
## $ Athlete     <chr> "Ryan Whiting", "Cory Martin", "Kurt Roberts", "De...
## $ Flight1     <dbl> 21.29, 20.85, 20.89, 19.36, 18.35, 18.49, 0.00, 17...
## $ Flight2     <dbl> 21.00, 0.00, 19.63, 0.00, 18.92, 18.34, 18.72, 18....
## $ Flight3     <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 18.62, 17.97, 0.00, ...
## $ Flight4     <dbl> 0.00, 0.00, 0.00, 0.00, 19.10, 18.40, 18.68, 0.00,...
## $ Flight5     <dbl> 21.80, 20.61, 0.00, 19.19, 0.00, 19.20, 18.57, 18....
## $ Flight6     <dbl> 21.53, 20.93, 20.55, 19.83, 19.52, 18.72, 18.58, 0...
# Filtramos para dividir mujeres y hombres
#MUJERES
javelin_m <- data %>%
    filter(Event == "Javelin" & Male_Female == "Female") %>%
    select(-Event, -Male_Female)
#HOMBRES
javelin_h <- data %>%
    filter(Event == "Javelin" & Male_Female == "Male") %>%
    select(-Event, -Male_Female)

# Echando un vistazo a la nueva data que creamos
head(javelin_m)
## # A tibble: 6 x 8
##   EventID Athlete          Flight1 Flight2 Flight3 Flight4 Flight5 Flight6
##     <int> <chr>              <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
## 1       8 Brittany Borman     54.0    51.2    57.3    52.6    57.0    60.9
## 2       8 Ariana Ince         49.0    54.8    53.6    55.1    55.3    56.7
## 3       8 Kara Patterson      50.1    52.1     0      50.8    55.9    54.6
## 4       8 Kimberley Hamil~    48.0     0      50.9    54.1    55.2    53.3
## 5       8 Laura Loht          44.4    53.8    50.6    54.2     0      49.0
## 6       8 Brianna Bain        49.3     0      51.3     0      48.6    53.0
summary(javelin_m)
##     EventID         Athlete             Flight1         Flight2     
##  Min.   :   8.0   Length:178         Min.   : 0.00   Min.   : 0.00  
##  1st Qu.: 178.0   Class :character   1st Qu.:41.53   1st Qu.:40.23  
##  Median : 511.0   Mode  :character   Median :48.85   Median :48.85  
##  Mean   : 796.8                      Mean   :40.80   Mean   :39.87  
##  3rd Qu.:1703.0                      3rd Qu.:53.20   3rd Qu.:53.07  
##  Max.   :1859.0                      Max.   :64.94   Max.   :61.38  
##     Flight3         Flight4         Flight5         Flight6     
##  Min.   : 0.00   Min.   : 0.00   Min.   : 0.00   Min.   : 0.00  
##  1st Qu.: 0.00   1st Qu.:40.57   1st Qu.: 0.00   1st Qu.: 0.00  
##  Median :47.34   Median :49.30   Median :48.01   Median :46.80  
##  Mean   :34.22   Mean   :39.37   Mean   :32.97   Mean   :34.82  
##  3rd Qu.:52.08   3rd Qu.:52.10   3rd Qu.:51.44   3rd Qu.:52.44  
##  Max.   :62.42   Max.   :61.56   Max.   :60.84   Max.   :64.45
head(javelin_h)
## # A tibble: 6 x 8
##   EventID Athlete       Flight1 Flight2 Flight3 Flight4 Flight5 Flight6
##     <int> <chr>           <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
## 1       7 Riley Dolezal    74.9    76.1    76.9    83.5     0       0  
## 2       7 Sam Humphreys    81.8     0      72.0    83.1    79.2    78.6
## 3       7 Sean Furey       74.3    75.0    75.4    72.2    75.3    77.4
## 4       7 Barry Krammes    77.4    71.6    72.3    69.3    69      70.0
## 5       7 Tim Glover       76.0    72.5    76.0    72.9     0       0  
## 6       7 Matthew Byers    73.7    69.6    68.9    68.4    68.6    67.2
summary(javelin_h)
##     EventID         Athlete             Flight1         Flight2     
##  Min.   :   7.0   Length:207         Min.   : 0.00   Min.   : 0.00  
##  1st Qu.: 179.0   Class :character   1st Qu.:62.55   1st Qu.:57.84  
##  Median : 711.0   Mode  :character   Median :69.98   Median :69.37  
##  Mean   : 867.8                      Mean   :60.80   Mean   :54.82  
##  3rd Qu.:1639.0                      3rd Qu.:74.12   3rd Qu.:73.44  
##  Max.   :1863.0                      Max.   :82.88   Max.   :81.86  
##     Flight3         Flight4         Flight5         Flight6     
##  Min.   : 0.00   Min.   : 0.00   Min.   : 0.00   Min.   : 0.00  
##  1st Qu.:42.34   1st Qu.:43.37   1st Qu.: 0.00   1st Qu.: 0.00  
##  Median :69.04   Median :67.61   Median :69.00   Median :68.48  
##  Mean   :52.89   Mean   :52.48   Mean   :52.15   Mean   :52.06  
##  3rd Qu.:74.56   3rd Qu.:73.67   3rd Qu.:73.89   3rd Qu.:74.30  
##  Max.   :81.09   Max.   :83.50   Max.   :83.24   Max.   :83.08

Los entrenadores (y gerentes de equipo) aman los datos ordenados (tidy data)

Lo que acabamos de hacer muestra el resultado de cada atleta en cada pista. Los atletas tienen 6 lanzamientos, pero realidad solamente uno importa -el que más lejos llegó-. Si tan solo quisieramos hablar de atletismo, tendríamos una tarea fácil: crear una nueva columna tomando el máximo de cada fila, ordenamos dicha columna de mayor a menor y nuestro trabajo estaría listo.

Pero los entrenadores necesitan hacer y saber mucho más que eso, el lanzamiento de javalina es un deporte de estrategia, donde cada lanzamiento importa. Los entrenadores necesitan un análisis más profundo para escoger a sus equipos, estructurar sus planes y tomar decisiones.

Lo primero que debemos hacer, es convertir esta data de “ancha” a “larga”, para ordenarla. Aún no hemos terminado con la vista ancha, pero hacer esto nos permitirá realizar algunos cálculos.

# Convertimos de ancho a largo
#MUJERES
javelin_long_m <- javelin_m %>%
    gather(Flight, Distance, 3:8) 
# Convertimos la columna "Flight" a números
javelin_long_m$Flight <- as.numeric(gsub("Flight", "", javelin_long_m$Flight, fixed = TRUE))
# Observamos las primeras 6 filas
head(javelin_long_m)
## # A tibble: 6 x 4
##   EventID Athlete            Flight Distance
##     <int> <chr>               <dbl>    <dbl>
## 1       8 Brittany Borman         1     54.0
## 2       8 Ariana Ince             1     49.0
## 3       8 Kara Patterson          1     50.1
## 4       8 Kimberley Hamilton      1     48.0
## 5       8 Laura Loht              1     44.4
## 6       8 Brianna Bain            1     49.3
#HOMBRES
javelin_long_h <- javelin_h %>%
    gather(Flight, Distance, 3:8) 
# Convertimos la columna "Flight" a números
javelin_long_h$Flight <- as.numeric(gsub("Flight", "", javelin_long_h$Flight, fixed = TRUE))
# Observamos las primeras 6 filas
head(javelin_long_h)
## # A tibble: 6 x 4
##   EventID Athlete       Flight Distance
##     <int> <chr>          <dbl>    <dbl>
## 1       7 Riley Dolezal      1     74.9
## 2       7 Sam Humphreys      1     81.8
## 3       7 Sean Furey         1     74.3
## 4       7 Barry Krammes      1     77.4
## 5       7 Tim Glover         1     76.0
## 6       7 Matthew Byers      1     73.7

Cada lanzamiento importa

Un lanzamiento es un “foul” si el atleta comete una violación técnica durante el lanzamiento. En el lanzamiento de javalina, el “foul” más común es sobrepasar la línea de lanzamiento. Normalmente el lanzamiento es anotado como “F” y no tiene más significancia. Los atletas también pueden escoger omitir un lanzamiento -anotado como “P”- si están satisfechos con sus lanzamientos anteriores y quieren permanecer “seguros”.

La meta acá no es que cada jugador tenga un lanzamiento muy bueno, todos sus lanzamientos en cada evento son sumados, y el equipo con la mayor distancia total gana el punto. Los fouls contarán 0 puntos, y si se omite un lanzamiento, pues el entrenador y compañeros de equipos no estarán muy felices.

Acá, examinaremos qué atletas cubren la mayor distancia en cada uno de sus partidos y su consistencia.

#MUJERES
javelin_totals_m <- javelin_long_m %>%
filter(Distance > 0) %>%
group_by(Athlete, EventID) %>%
summarise(TotalDistance = sum(Distance), StandardDev = round(sd(Distance), 3), Success = n()) 

# Observamos las primeras 10 filas
head(javelin_totals_m, 10)
## # A tibble: 10 x 5
## # Groups:   Athlete [4]
##    Athlete                 EventID TotalDistance StandardDev Success
##    <chr>                     <int>         <dbl>       <dbl>   <int>
##  1 Abigail Gomez               238          152.       1.23        3
##  2 Abigail Gomez               498          244.       1.63        5
##  3 Abigail Gomez               511          207.       2.97        4
##  4 Abigail Gomez              1566          222.       1.30        4
##  5 Abigail Gomez              1575          155.       1.03        3
##  6 Abigail Gomez Hernandez    1727          135.       0.718       3
##  7 Alicia DeShasier            178          270.       2.15        5
##  8 Alicia DeShasier            247          320.       2.26        6
##  9 Alicia DeShasier            938          275.       1.53        5
## 10 Allison Updike              681          147.       3.84        3
#HOMBRES
javelin_totals_h <- javelin_long_h %>%
filter(Distance > 0) %>%
group_by(Athlete, EventID) %>%
summarise(TotalDistance = sum(Distance, na.rm = TRUE), StandardDev = round(sd(Distance, na.rm = T), 3), Success = n()) 

# Observamos las primeras 10 filas
head(javelin_totals_h, 10)
## # A tibble: 10 x 5
## # Groups:   Athlete [4]
##    Athlete          EventID TotalDistance StandardDev Success
##    <chr>              <int>         <dbl>       <dbl>   <int>
##  1 Aaron True          1863          421.       0.659       6
##  2 Adam Burke           179          342.       2.90        5
##  3 Andrew Fahringer    1747          418.       1.65        6
##  4 Barry Krammes          7          429.       3.11        6
##  5 Barry Krammes         19          366.       1.62        5
##  6 Barry Krammes        175          287.       2.73        4
##  7 Barry Krammes        179          352.       4.35        5
##  8 Barry Krammes        507          346.       2.04        5
##  9 Barry Krammes       1568          335.       2.71        5
## 10 Barry Krammes       1577          335.       1.26        5

Encontrando el mejor rendimiento

En muchas pistas tradicionales, después de los primeros tres lanzamientos, los líderes de la pista son reducidos al top 8 de atletas(a veces más, a veces menos). Esto se basa solamente en el mejor lanzamiento de esos 3.

Le daremos la decisión a los entrenadores. De los tres atletas que empiezan en cada evento, el entrenador escoge a los dos que van a continuar para los últimos tres lanzamientos. El entrenador deberá conocer qué jugadores tienden a mantener su forma en las últimas etapas de un partido. También deberán conocer si los tres primeros lanzamientos de un jugador son consistentes con su historial de lanzamientos, de lo contrario pueden cometer una decisión errada basada solamente en lo que vieron en un solo partido.

Por ahora, examinemos la distancia total cubierta, para hacer diferencias entre la primera etapa y la última etapa de los partidos.

#MUJERES
javelin_m <- javelin_m %>%
mutate(early = Flight1 + Flight2 + Flight3, late = Flight4 + Flight5 + Flight6, diff = late - early)

# Examinamos las últimas 10 filas
tail(javelin_m, 10)
## # A tibble: 10 x 11
##    EventID Athlete Flight1 Flight2 Flight3 Flight4 Flight5 Flight6 early
##      <int> <chr>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl> <dbl>
##  1    1773 Meliss~    47.6    48.7    47.5     0       0      45.6 144. 
##  2    1773 Kaelyn~    43.4    44.9    40      43.2    40.3    40.6 128. 
##  3    1859 Kara W~    56.9    52.9    55.5    54.4    57.6    62.9 165. 
##  4    1859 Avione~    56.5     0      54.4    51.6    54.3     0   111. 
##  5    1859 Ariana~    51.9    53.5    52.4    56.0    55.2     0   158. 
##  6    1859 Bethan~    49.9    51.0    54.2     0      50.6     0   155. 
##  7    1859 Alyssa~     0      53.7    52.1    51.5     0      52.8 106. 
##  8    1859 Domini~    49.6    44.2    50.6    51.3    49.2    53.2 144. 
##  9    1859 Kriste~    47.2    50.9     0      48.2    49.3    49.6  98.1
## 10    1859 Rebeka~    48.8     0      50.4    48.2     0      46.6  99.2
## # ... with 2 more variables: late <dbl>, diff <dbl>
#HOMBRES
javelin_h <- javelin_h %>%
mutate(early = Flight1 + Flight2 + Flight3, late = Flight4 + Flight5 + Flight6, diff = late - early)

# Examinamos las últimas 10 filas
tail(javelin_h, 10)
## # A tibble: 10 x 11
##    EventID Athlete Flight1 Flight2 Flight3 Flight4 Flight5 Flight6 early
##      <int> <chr>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl> <dbl>
##  1    1775 Kyle N~    63.8    66.6     0      69.9    68.6    65.9  130.
##  2    1775 Jaime ~    61.6    59.3    61.8    60.2    62.6    64.2  183.
##  3    1863 Curtis~    74.6    75.8    72.0    76.0    71.1    70.7  222.
##  4    1863 Capers~    71.1    72.0    75.7    71.5    70.2     0    219.
##  5    1863 Riley ~    74.1    69.9    69.1    75.1     0       0    213.
##  6    1863 Michae~    70.9    70.8    59.1     0      72.9    68.3  201.
##  7    1863 Tim Va~    70.7    71.8    69.0     0      67.9    72.0  212.
##  8    1863 Aaron ~    70.8    69.5    69.3    70.9    70.5    70.2  210.
##  9    1863 Michae~    65.9    67.0    70.3    66.0     0       0    203.
## 10    1863 Michae~    69.0    70.2    67.2     0       0      69.1  206.
## # ... with 2 more variables: late <dbl>, diff <dbl>

Juntando las piezas

Las estadísticas globales están en dos subconjuntos de datos distintos, uniéndolos, podemos tener una primera impresión de como se comparan los atletas.

#MUJERES
javelin_totals_m <- javelin_totals_m %>%
left_join(javelin_m, by = c("EventID", "Athlete")) %>%
select(Athlete, TotalDistance, StandardDev, Success, diff)
# Primeras 10 filas
head(javelin_totals_m, 10)
## # A tibble: 10 x 5
## # Groups:   Athlete [4]
##    Athlete                 TotalDistance StandardDev Success    diff
##    <chr>                           <dbl>       <dbl>   <int>   <dbl>
##  1 Abigail Gomez                    152.       1.23        3  -52.9 
##  2 Abigail Gomez                    244.       1.63        5  -48   
##  3 Abigail Gomez                    207.       2.97        4 -110.  
##  4 Abigail Gomez                    222.       1.30        4   -3.11
##  5 Abigail Gomez                    155.       1.03        3   53.4 
##  6 Abigail Gomez Hernandez          135.       0.718       3   45.6 
##  7 Alicia DeShasier                 270.       2.15        5   60.0 
##  8 Alicia DeShasier                 320.       2.26        6    0.74
##  9 Alicia DeShasier                 275.       1.53        5   53.5 
## 10 Allison Updike                   147.       3.84        3  -46.6
#HOMBRES
javelin_totals_h <- javelin_totals_h %>%
left_join(javelin_h, by = c("EventID", "Athlete")) %>%
select(Athlete, TotalDistance, StandardDev, Success, diff)
# Primeras 10 filas
head(javelin_totals_h, 10)
## # A tibble: 10 x 5
## # Groups:   Athlete [4]
##    Athlete          TotalDistance StandardDev Success   diff
##    <chr>                    <dbl>       <dbl>   <int>  <dbl>
##  1 Aaron True                421.       0.659       6   2.03
##  2 Adam Burke                342.       2.90        5  76.0 
##  3 Andrew Fahringer          418.       1.65        6  -6.61
##  4 Barry Krammes             429.       3.11        6 -13.0 
##  5 Barry Krammes             366.       1.62        5 -78.9 
##  6 Barry Krammes             287.       2.73        4  -7.68
##  7 Barry Krammes             352.       4.35        5 -79.7 
##  8 Barry Krammes             346.       2.04        5  61.5 
##  9 Barry Krammes             335.       2.71        5 -73.2 
## 10 Barry Krammes             335.       1.26        5 -68.2

Normalizando la data para comparar las estadísticas

Las 4 estadísticas que calculamos -distancia total, desviación estándar, número de lanzamientos exitosos y nuestra medida de primera etapa vs etapa final- están en escalas diferentes y miden cosas muy distintas. Los entrenadores necesitan ser capaces de comparar unas con otras y después medirlas en base a que es más importante para su visión y estrategia para el equipo. Una normalización simple nos servirá para estas comparaciones.

#Creamos la función para normalizar
norm <- function(result) {
    (result - min(result, na.rm = T)) / (max(result, na.rm = T) - min(result, na.rm = T))
}
#Estadísticas globales que queremos normalizar
aggstats <- c("TotalDistance", "StandardDev", "Success", "diff")

#Aplicando la función de normalización

#MUJERES
javelin_norm_m <- javelin_totals_m %>%
 ungroup() %>%
 mutate_at(aggstats, norm) %>%
 group_by(Athlete) %>% 
 summarize_all(mean)

head(javelin_norm_m, 10)
## # A tibble: 10 x 5
##    Athlete                 TotalDistance StandardDev Success  diff
##    <chr>                           <dbl>       <dbl>   <dbl> <dbl>
##  1 Abigail Gomez                   0.446       0.268   0.45  0.383
##  2 Abigail Gomez Hernandez         0.244       0.115   0.25  0.720
##  3 Alicia DeShasier                0.753       0.327   0.833 0.687
##  4 Allison Updike                  0.283       0.639   0.25  0.320
##  5 Alyssa Olin                     0.469       0.250   0.5   0.309
##  6 Ariana Ince                     0.660       0.342   0.692 0.446
##  7 Asha Bramwell                   0.212       0.548   0.5   0.765
##  8 Asia Easley                     0.418       0.796   0.625 0.800
##  9 Avione Allgood                  0.516       0.333   0.5   0.501
## 10 Bethany Drake                   0.453       0.247   0.5   0.512
#HOMBRES
javelin_norm_h <- javelin_totals_h %>%
 ungroup() %>%
 mutate_at(aggstats, norm) %>%
 group_by(Athlete) %>% 
 summarize_all(mean)

head(javelin_norm_h, 10)
## # A tibble: 10 x 5
##    Athlete                 TotalDistance StandardDev Success  diff
##    <chr>                           <dbl>       <dbl>   <dbl> <dbl>
##  1 Aaron True                      0.862      0.0778   1     0.503
##  2 Adam Burke                      0.667      0.422    0.8   0.735
##  3 Andrew Fahringer                0.855      0.230    1     0.476
##  4 Barry Krammes                   0.687      0.367    0.8   0.381
##  5 Benjamin Woodruff               0.491      0.321    0.560 0.281
##  6 Brent Lagace                    0.642      0.183    0.8   0.494
##  7 Capers Williamson               0.732      0.414    0.85  0.446
##  8 Carlos A Armenta Castro         0.517      0.197    0.6   0.724
##  9 Carlos Armenta                  0.670      0.346    0.75  0.330
## 10 Chris Kirkwood                  0.620      0.229    0.8   0.296

Lo mas importante a la hora de armar un equipo

Los entrenadores necesitan decidir que clase de jugadores quieren en su equipo -que compartan su visión, que tengan las habilidades para jugar el estilo que quiere el entrenador y finalmente, el que le dará las victorias al equipo-. Un entrenador adverso al riesgo querrá jugadores que raramente hacen foul. Un entrenador más “frío” querrá a los jugadores que puedan ganar con sus lanzamientos finales.

Como cualquier deporte (o profesión), un jugador raramente será fuerte en todas las áreas. Los entrenadores deben balancear sus equipos. Por esto es que los entrenadores ganan mucho dinero o los despiden cuando el equipo no funciona.

#Seleccionamos unos "pesos" al azar (que sumen 10) para multiplicarlos por nuestras estadísticas globales
weights <- c(3,2,3,2)

#Formemos al equipo ideal de hombres y mujeres
#MUJERES
javelin_team_m <- javelin_norm_m %>%
mutate(TotalScore = TotalDistance * weights[1] +StandardDev * weights[2] + Success * weights[3] + diff * weights[4]) %>%
arrange(desc(TotalScore)) %>%
slice(1:5) %>%
select(Athlete, TotalScore)

javelin_team_m
## # A tibble: 5 x 2
##   Athlete               TotalScore
##   <chr>                      <dbl>
## 1 Madalaine Stulce            7.60
## 2 Dominique Ouellette         7.40
## 3 Heather Bergmann            7.03
## 4 Diana Sammai Martinez       6.93
## 5 Maggie Malone               6.79
#HOMBRES
javelin_team_h <- javelin_norm_h %>%
mutate(TotalScore = TotalDistance * weights[1] +StandardDev * weights[2] + Success * weights[3] + diff * weights[4]) %>%
arrange(desc(TotalScore)) %>%
slice(1:5) %>%
select(Athlete, TotalScore)

javelin_team_h
## # A tibble: 5 x 2
##   Athlete          TotalScore
##   <chr>                 <dbl>
## 1 Christopher Hill       7.89
## 2 Corey White            7.34
## 3 Josue Menendez         7.24
## 4 David Carreon          7.01
## 5 Curtis Moss            7.00

Conociendo a nuestros jugadores

¡La data ha hablado! Ahora tenemos dos equipos de lanzamiento de javalinas, pero aún no los conocemos. Los subconjuntos de datos javelin_totals_m y javelin_totals_h tiene los datos que formaron parte del proceso de decisión, así que extraeremos dicha data. Esto nos dará una idea de qué aportará cada uno al equipo.

También podemos compararlos con los demás atletas tomando la media y el máximo de cada estadística que calculamos.

#MUJERES
team_stats_m <- javelin_totals_m %>% 
filter(Athlete %in% c("Madalaine Stulce", "Dominique Ouellette", "Heather Bergmann", "Diana Sammai Martinez", "Maggie Malone")) %>%
summarize_all(mean)

pool_stats <- data.frame(do.call('cbind', sapply(javelin_totals_m, function(x) if(is.numeric(x)) c(max(x), mean(x)))))
pool_stats$MaxAve <- c("Maximum", "Average")
pool_stats <- pool_stats %>%
    gather(key="Statistic", value="Aggregate", -MaxAve)
                                                 
# Examinamos las estadísticas del equipo de mujeres
str(team_stats_m)
## Classes 'tbl_df', 'tbl' and 'data.frame':    5 obs. of  5 variables:
##  $ Athlete      : chr  "Diana Sammai Martinez" "Dominique Ouellette" "Heather Bergmann" "Madalaine Stulce" ...
##  $ TotalDistance: num  262 299 283 275 293
##  $ StandardDev  : num  2.38 2.91 2.28 4.47 2
##  $ Success      : num  6 6 6 6 5
##  $ diff         : num  11.88 2.88 2.41 -6.42 61.12
summary(team_stats_m)
##    Athlete          TotalDistance    StandardDev       Success   
##  Length:5           Min.   :262.0   Min.   :1.996   Min.   :5.0  
##  Class :character   1st Qu.:274.8   1st Qu.:2.278   1st Qu.:6.0  
##  Mode  :character   Median :283.4   Median :2.375   Median :6.0  
##                     Mean   :282.5   Mean   :2.806   Mean   :5.8  
##                     3rd Qu.:293.5   3rd Qu.:2.910   3rd Qu.:6.0  
##                     Max.   :298.7   Max.   :4.472   Max.   :6.0  
##       diff       
##  Min.   :-6.420  
##  1st Qu.: 2.410  
##  Median : 2.875  
##  Mean   :14.373  
##  3rd Qu.:11.880  
##  Max.   :61.120
team_stats_m
## # A tibble: 5 x 5
##   Athlete               TotalDistance StandardDev Success   diff
##   <chr>                         <dbl>       <dbl>   <dbl>  <dbl>
## 1 Diana Sammai Martinez          262         2.38       6  11.9 
## 2 Dominique Ouellette            299.        2.91       6   2.88
## 3 Heather Bergmann               283.        2.28       6   2.41
## 4 Madalaine Stulce               275.        4.47       6  -6.42
## 5 Maggie Malone                  293.        2.00       5  61.1
#HOMBRES
team_stats_h <- javelin_totals_h %>% 
filter(Athlete %in% c("Christopher Hill", "Corey White", "Josue Menendez", "David Carreon", "Curtis Moss")) %>%
summarize_all(mean, na.rm = TRUE)

pool_stats <- data.frame(do.call('cbind', sapply(javelin_totals_h, function(x) if(is.numeric(x)) c(max(x), mean(x)))))
pool_stats$MaxAve <- c("Maximum", "Average")
pool_stats <- pool_stats %>%
    gather(key="Statistic", value="Aggregate", -MaxAve)
                                                 
# Examinamos las estadísticas del equipo de hombres
str(team_stats_h)
## Classes 'tbl_df', 'tbl' and 'data.frame':    5 obs. of  5 variables:
##  $ Athlete      : chr  "Christopher Hill" "Corey White" "Curtis Moss" "David Carreon" ...
##  $ TotalDistance: num  444 416 435 412 426
##  $ StandardDev  : num  3.72 2.83 1.13 2.75 1.98
##  $ Success      : num  6 5.67 6 5.5 6
##  $ diff         : num  7.45 27.437 3.35 -0.225 9.67
summary(team_stats_h)
##    Athlete          TotalDistance    StandardDev       Success     
##  Length:5           Min.   :411.9   Min.   :1.132   Min.   :5.500  
##  Class :character   1st Qu.:416.0   1st Qu.:1.981   1st Qu.:5.667  
##  Mode  :character   Median :426.3   Median :2.750   Median :6.000  
##                     Mean   :426.7   Mean   :2.483   Mean   :5.833  
##                     3rd Qu.:435.0   3rd Qu.:2.827   3rd Qu.:6.000  
##                     Max.   :444.1   Max.   :3.723   Max.   :6.000  
##       diff       
##  Min.   :-0.225  
##  1st Qu.: 3.350  
##  Median : 7.450  
##  Mean   : 9.536  
##  3rd Qu.: 9.670  
##  Max.   :27.437
team_stats_h
## # A tibble: 5 x 5
##   Athlete          TotalDistance StandardDev Success    diff
##   <chr>                    <dbl>       <dbl>   <dbl>   <dbl>
## 1 Christopher Hill          444.        3.72    6      7.45 
## 2 Corey White               416.        2.83    5.67  27.4  
## 3 Curtis Moss               435.        1.13    6      3.35 
## 4 David Carreon             412.        2.75    5.5   -0.225
## 5 Josue Menendez            426.        1.98    6      9.67

Convenciendo a los dueños del equipo

El entrenador sabe a quiénes quiere y a quiénes no quiere en el equipo y la data es el soporte de su decisión, pero aún tiene que defender sus decisiones con los dueños del equipo. Al final del día, son ellos los que tienen la última palabra.

Los dueños de equipos son gente ocupada. Muchos de ellos tienen otros trabajos y poseen otras compañías. Confían en sus entrenadores, así que mientras el entrenador pueda darles una presentación amigable y visual del porqué deberían contratar a estos 5 atletas entre tantos, lo aprobarán.

Una serie de gráficos mostrando cómo cada atleta se compara con el máximo y el promedio de cada estadístico que calculamos sería suficiente para ellos.

#MUJERES
p_m <- team_stats_m %>%
gather(Statistic, Aggregate, -Athlete) %>%
ggplot(aes(Athlete, Aggregate, fill = Athlete)) +
geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~Statistic, scales="free_y") +
  geom_hline(data=pool_stats, aes(yintercept=Aggregate, group=Statistic, color=MaxAve), size=1) +
  labs(title="Wizani Javelin Female Team", color="Atletas máximo / promedio") +
  scale_fill_hue(l=70) +
  scale_color_hue(l=20) +
  theme_minimal() +
  theme(axis.text.x=element_blank(), axis.title.x=element_blank(), axis.title.y=element_blank())
  
p_m

#HOMBRES
p_h <- team_stats_h %>%
gather(Statistic, Aggregate, -Athlete) %>%
ggplot(aes(Athlete, Aggregate, fill = Athlete)) +
geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~Statistic, scales="free_y") +
  geom_hline(data=pool_stats, aes(yintercept=Aggregate, group=Statistic, color=MaxAve), size=1) +
  labs(title="Wizani Javelin Male Team", color="Atletas máximo / promedio") +
  scale_fill_hue(l=70) +
  scale_color_hue(l=20) +
  theme_minimal() +
  theme(axis.text.x=element_blank(), axis.title.x=element_blank(), axis.title.y=element_blank())
  
p_h

Probando a nuestros jugadores

Antes de que la temporada empiece, el entrenador hará análisis similares para otros lanzamientos, saltos y eventos de atletismo. Por ahora, como es lo que conocemos mejor, simulemos un partido simple de lanzamiento de javalina.

El ganador es el equipo que lance la combinación de la distancia más alta: 6 lanzamientos de cada uno de los 3 jugadores contra 6 lanzamientos de cada uno de los jugadores del oponente.

#ELEGIMOS A NUESTROS 3 JUGADORES
#MUJERES
home_m <- c(1,3,5)
away_m <- sample(1:nrow(javelin_totals_m), 3, replace=FALSE)

HomeTeam_m <- round(sum(team_stats_m$TotalDistance[home_m]),2)
AwayTeam <- round(sum(javelin_totals_m$TotalDistance[away_m]),2)

print(paste0("Partido de lanzamiento de javalina, Puntaje final : ", HomeTeam_m, " - ", AwayTeam))
## [1] "Partido de lanzamiento de javalina, Puntaje final : 838.91 - 615.9"
ifelse(HomeTeam_m > AwayTeam, print("Victoria!"), print("Elige un mejor equipo"))
## [1] "Victoria!"
## [1] "Victoria!"
#HOMBRES
home_h <- c(1,2,3)
away_h <- sample(1:nrow(javelin_totals_h), 3, replace=FALSE)
HomeTeam_h <- round(sum(team_stats_h$TotalDistance[home_h]),2)
AwayTeam <- round(sum(javelin_totals_h$TotalDistance[away_h]),2)

print(paste0("Partido de lanzamiento de javalina, Puntaje final : ", HomeTeam_h, " - ", AwayTeam))
## [1] "Partido de lanzamiento de javalina, Puntaje final : 1295.12 - 1083.19"
ifelse(HomeTeam_h > AwayTeam, print("Victoria!"), print("Elige un mejor equipo"))
## [1] "Victoria!"
## [1] "Victoria!"