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
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
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
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>
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
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
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
¡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
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
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!"