1 Histórico de vencedores absolutos
Buscando información sobre el Descenso Internacional del Sella me encontré con que no está accesible de forma fácil en ningún sitio. La mayor parte de la información está incluida en pdfs que publica la organización cada año. Así que para empezar he ido a una fuente mucho más sencilla de utilizar. Y es que en la página de la Wikipedia dedicada al Descenso Internacional del Sella existe una tabla con todos los vencedores absolutos de la prueba (K2 - Categoría masculina).
Así que si te preguntabas por qué precisamente he empezado por la categoría masculina de K2 la respuesta es muy sencilla y directa: Era lo más fácil.
Y es que en cualquier proyecto de datos, independientemente de su tamaño, dificultad o tipo de problema a solucionar, creo que para empezar lo mejor es empezar por algo sencillo y rápido. Algo que tengas claro que va a tener un resultado concreto y práctico y que tenga asociadas altas probabilidades de éxito. ¡Muerte a la incertidumbre!
Vayamos a ello.
1.1 Obtención de la información
Configuro las opciones de los bloques de código por defecto del documento rmarkdown.
Cargo los paquetes que voy a necesitar para el análisis:
library(tidyverse)
library(rvest)
library(lubridate)
library(kableExtra)
#library(tabulizer)
Utilizo las funciones del paquete rvest para importar la información de la wikipedia. Importo toda la entrada de la wikipedia:
#descenso_wiki <- read_html('https://es.wikipedia.org/wiki/Descenso_Internacional_del_Sella')
#save(descenso_wiki, file = "descenso_wiki.Rdata")
#descenso_wiki <- load(file = "descenso_wiki.Rdata") %>%
# as()
Localizo las tablas y selecciono la tercera, que es donde están registrados todos los vencedores con sus respectivos tiempos. Asigno el data frame resultante a ‘vencedores_k2_0’ y lo exporto en formato csv para no tener que repetir la tarea de “escrapeo” a la Wikipedia:
#vencedores_k2_0 <- html_nodes(descenso_wiki, "table") %>% .[[3]] %>% html_table(header = #TRUE)
# write_csv(vencedores_k2_0, "final_csvs/vencedores_k2_0.csv")
vencedores_k2_0 <- read_csv("final_csvs/vencedores_k2_0.csv")
1.2 Tratamiento de los datos
Echo un vistazo al formato de la tabla:
head(vencedores_k2_0)
## # A tibble: 6 x 5
## EXCURSIONES EXCURSIONES_1 EXCURSIONES_2 EXCURSIONES_3 EXCURSIONES_4
## <chr> <chr> <chr> <chr> <chr>
## 1 Edición Año Ganadores Municipio Tiempo
## 2 I 1930 Manés Fdez.- Al~ Infiesto 7 h.
## 3 II 1931 Manés Fdez.- Al~ Infiesto 12 h.
## 4 DESCENSOS P~ DESCENSOS PRO~ DESCENSOS PROVI~ DESCENSOS PRO~ DESCENSOS PR~
## 5 Edición Año Ganadores Municipio Tiempo
## 6 III 1932 César Sánchez L~ Ribadesella 1:53:00
Tenemos que arreglar algún detalle de la tabla. Para empezar el nombre de las variables se encuentra en la primera fila de datos, apareciendo como nombres de las columnas el tipo de competición del inicio de la prueba: ‘EXCURSIONES’. Esto último ocurre varias veces a lo largo de la tabla. Cuando cambia el tipo de competición aparece antes una fila con el tipo repetido en cada columna y a continuación otra vez el nombre de las columnas.
Primero modifico los nombres de las columnas (no incluyo ni tildes ni la ñ para evitar problemas).
colnames(vencedores_k2_0) <- c("Edicion", "Ano", "Ganadores", "Municipio", "Tiempo")
Y segundo, elimino todas las filas que no recojan los resultados de la prueba. Para ello primero cambio el formato de la variable ‘Año’ a ‘numeric’.
vencedores_k2_0$Ano <- as.numeric(vencedores_k2_0$Ano)
Al convertir a formato numérico la variable ‘ano’ R convierte a NA todo lo que no puede convertir en un número. Esto nos puede servir para identificar todas las filas que no nos interesan, quedándonos únicamente con las filas que en la variable ‘Año’ presenta un número.
vencedores_k2_0 <- vencedores_k2_0 %>% filter(!is.na(Ano))
Para recuperar la información del tipo de competición a lo largo de la historia del Descenso creo una nueva variable que la recoja. Utilizo la función ‘cut’ para crear un vector llamado ‘Tipo’ con los tipos de competición para cada rango de años:
Tipo <- cut(vencedores_k2_0$"Ano", breaks = c(1929, 1931, 1934, 1950, Inf), labels = c("Excursión", "Provincial", "Nacional", "Internacional"))
Convierto el objeto creado en un data frame y lo uno a la tabla ‘vencedores_k2_0’
Tipo <- as.data.frame(Tipo)
vencedores_k2_1 <- bind_cols(vencedores_k2_0, Tipo)
La variable ‘Municipio’ a partir de que la competición se convierte en internacional no recoge el municipio origen de los participantes sino el país.
summary(as.factor(vencedores_k2_1$Municipio))
## Alemania Australia Bélgica Cantabria Dinamarca España
## 1 1 3 1 6 48
## Gijón Infiesto Inglaterra Italia Portugal Ribadesella
## 5 2 2 1 1 5
## Sudáfrica Suecia Suiza
## 2 2 1
Arreglo esto creando una nueva variable ‘Pais’ donde sólo quede registrado el país y elimino la variable ‘Municipio’
vencedores_k2_1 <- vencedores_k2_1 %>% mutate(Pais = if_else(Ano < 1951, "España", Municipio))
vencedores_k2_1$Municipio <- NULL
La variable “Tiempo” recoge el tiempo empleado por cada ganador en horas, minutos y segundos. Pero antes de poder utilizar esta información hay que realizar alguna modificación a su formato.
Primero, en la tabla de la wikipedia el autor ha incluido un símbolo “®” a la derecha de los tiempos que supusieron un récord en su momento. Eliminamos este símbolo.
vencedores_k2_1$Tiempo <- str_replace(vencedores_k2_1$Tiempo, "®", "" )
Los tiempos de los dos primeros años están en otro formato. Sustituimos sus valores por los correspondientes en hh:mm:ss
vencedores_k2_1$Tiempo[[1]] <- "7:00:00"
vencedores_k2_1$Tiempo[[2]] <- "12:00:00"
# Añado el tiempo de la edición de 1943.
vencedores_k2_1$Tiempo[[6]] <- "2:01:10"
# Suprimo el registro con la edición de 1944 ya que en la wikipedia viene sin el tiempo y no he logrado encontrarlo en otros sitios.
vencedores_k2_1 <- vencedores_k2_1 %>%
filter(Ano != "1944")
Además hay algún error en el formato del resto de tiempos, en alguna ocasión los “:” son sustituidos por “-” o “.”. Lo solucionamos sustituyendo en esta columna todos los “-” y “.” por “:”.
vencedores_k2_1$Tiempo <- str_replace(vencedores_k2_1$Tiempo, "-", ":" )
vencedores_k2_1$Tiempo <- str_replace(vencedores_k2_1$Tiempo, "\\.", ":" )
vencedores_k2_2 <- vencedores_k2_1
Dejamos preparado el código para incluir los datos de los ganadores de 2019.
vencedores_k2_2 <- vencedores_k2_2 %>%
add_row(Edicion = "LXXXIII", Ano = "2019", Ganadores = "Miguel F. Castañón-José Julián Becerro", Tiempo = "1:07:47", Tipo = "Internacional", Pais = "España")
Finalmente convertimos la variable de formato “caracter” a formato “hora” con la función “hms” del paquete lubridate. Posteriormente lo convertimos de formato hora a formato “duración”.
vencedores_k2_2$Tiempo <- hms(vencedores_k2_2$Tiempo) %>%
as.duration()
Añadimos una columna que identifique como record o no el tiempo de cada edición.
vencedores_k2_2 <- vencedores_k2_2 %>%
mutate(row = row_number(),
minimo = as.duration(cummin(Tiempo)),
Record = if_else(Tiempo == minimo, "1", "0")) %>%
select(-row, -minimo)
#Record = if_else(Tiempo < as.duration(min(Tiempo[1:row_number], na.rm = TRUE)), "1", "0"))
# Vuelvo a añadir el registro de la edición de 1944 que al no tener tiempo registrado daba problemas con la función cummin, que no tiene argumento tipo na.rm.
vencedores_k2_2 <- vencedores_k2_2 %>%
add_row(Edicion = "VII", Ano = "1944", Ganadores = "Armando Menéndez-Melchor Palacios", Tiempo = as.duration(""), Tipo = "Nacional", Pais = "España") %>%
arrange(Ano)
vencedores_k2_2$Ano <- as.numeric(vencedores_k2_2$Ano)
vencedores_k2_2$Pais <- as.factor(vencedores_k2_2$Pais)
1.3 Exploración de los datos y visualizaciones
Probamos a hacer un primer gráfico.
#vencedores_k2_3 <- vencedores_k2_2 %>% filter(tipo != "Excursión")
#vencedores_k2_4 <- vencedores_k2_3 %>% mutate(fecha = paste(ano, "-", "08", "-", "01"))
#vencedores_k2_4$fecha <- ymd(vencedores_k2_4$fecha)
breaks <- c(3600, 7200, 10800, 14400, 18000, 21600, 25200, 28800, 32400, 36000, 39600, 43200)
labels <- c( "1h 00m", "2h 00m", "3h 00m", "4h 00m", "5h 00m", "6h 00m", "7h 00m", "8h 00m", "9h 00m", "10h 00m", "11h 00m", "12h 00m")
evolucion_tiempos_0 <- ggplot(data = vencedores_k2_2, aes(x = Ano, y = as.numeric(Tiempo), color = Tipo)) + geom_line() +
labs(title = "Evolución tiempos vencedores K2", y = "Tiempos vencedores K2", x = "Año") +
theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5, size = 7)) +
scale_x_continuous(breaks = vencedores_k2_2$Ano) +
scale_y_continuous(
limits = c(3600, 43200),
breaks = breaks,
labels = labels) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
theme(legend.position = c(0.9, 0.8))
evolucion_tiempos_0
ggsave("plots/evolucion_tiempos_0.png")
En este primer gráfico, al incluir los tiempos de las dos primeras ediciones (7 y 12 horas), lejísimos del resto de marcas, es muy difícil observar la evolución de los tiempos históricos. Así, que con perdón del fundador de la prueba, Dionisio Huerta, participante junto a otros dos amigos de estas dos primeras ediciones, eliminamos estos dos primeros años del gráfico.
breaks <- c(3600, 4200, 4800, 5400, 6000, 6600, 7200, 7800, 8400)
labels <- c( "1h 00m", "1h 10m", "1h 20m", "1h 30m","1h 40m", "1h 50m", "2h 00m", "2h 10m", "2h 20m" )
evolucion_tiempos_1 <- ggplot(data = vencedores_k2_2 %>% filter(Tipo != "Excursión"), aes(x = Ano, y = as.numeric(Tiempo), color = Tipo)) + geom_line() +
labs(title = "Evolución tiempos vencedores K2", y = "tiempos vencedores K2", x = "Año") +
theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5, size = 7)) +
scale_x_continuous(breaks = vencedores_k2_2$Ano) +
scale_y_continuous(
limits = c(3600, 8400),
breaks = breaks,
labels = labels) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
theme(legend.position = c(0.9, 0.8))
evolucion_tiempos_1
ggsave("plots/evolucion_tiempos_1.png")
Al excluir estas dos primeras ediciones ya podemos ver mucho mejor la evolución de los tiempos históricos.
Quizás lo primero que llama la atención es como los tiempos de las ediciones nacionales (línea verde), celebradas después de años de interrupción por la Guerra Civil y comienzo de la dictadura, son peores que los conseguidos por las ediciones iniciales de la prueba, de categoría provincial (línea roja).
Y a partir de convertirse en una competición internacional los tiempos, con sus altibajos, han ido reduciéndose de forma constante año a año. Aunque también aquí se puede observar a simple vista distintos periodos donde esta mejora se ha producido a diferentes ritmos, de forma extremadamente rápida al principio, década de los 50, y reduciéndose ese ritmo de mejora de forma bastante constante hasta aparentemente estancarse en la última década, después del récord absoluto de la prueba de 1 hora, un minuto y 14 segundos, conseguido en 2009 por la pareja conformada por Julio Martínez y Miguel Fernández.
Para observar con más detalle esta evolución generamos otro gráfico, pero esta vez sólo con las ediciones internacionales.
breaks <- c(3600, 3900, 4200, 4500, 4800, 5100, 5400, 6000, 6600)
labels <- c( "1h 00m", "1h 05m", "1h 10m", "1h 15m", "1h 20m", "1h 25m", "1h 30m","1h 40m", "1h 50m")
evolucion_tiempos_2 <- ggplot(data = vencedores_k2_2 %>% filter(Tipo == "Internacional"), aes(x = Ano, y = as.numeric(Tiempo))) + geom_line() +
labs(title = "Evolución tiempos vencedores K2", y = "Tiempos vencedores K2", x = "Año") +
theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5, size = 7)) +
scale_x_continuous(breaks = vencedores_k2_2$Ano) +
scale_y_continuous(
limits = c(3600, 6600),
breaks = breaks,
labels = labels) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
theme(legend.position = c(0.9, 0.8))
evolucion_tiempos_2
ggsave("plots/evolucion_tiempos_2.png")
Pendiente:
- Señalar las distintas pendientes de reducción de tiempos durante las ediciones internacionales:
- 1948-1959: Un primer periodo con una pendiente muy pronunciada en el que poco más de una década se rebaja la marca en unos 22 minutos.
- 1960-2009: Un segundo periodo donde con altibajos se produce una reducción de tiempos que muestra una pendiente más reducida que la anterior. Dentro de estos altibajos destacar los records de 1977, 1988 y 2009, que dentro de su época y contexto destacan de forma muy especial. Sobre todo el último, que parece que va a permanecer por más tiempo incluso que el anterior de 1988, que fue sólo posible por el estado del Sella el día de la prueba, una auténtica riada.
- 2010-2018: Un último periodo donde los tiempos son en general ligeramente mejores que la década anterior, pero parecen haberse estabilizado después del récord absoluto de 2009, que cierra la era de triunfos de Julio Martínez y cia (11 victorias en el periodo 1998-2005) para comenzar la de Walter Bouza y Álvaro Fernández (8 victorias seguidas del 2010 al 2017).
Añadimos una nueva variable para marcar estas dos eras de ganadores.
vencedores_k2_3 <- vencedores_k2_2 %>%
mutate(Eras = if_else(str_detect(vencedores_k2_2$Ganadores, "Walter Bouzán") == TRUE,
"Era Walter Bouzán",
if_else(str_detect(vencedores_k2_2$Ganadores, "Martínez G.,") == TRUE,
"Era Julio Martínez",
if_else(str_detect(vencedores_k2_2$Ganadores, "Hansen") == TRUE,
"Era Stend L. Hansen", "Resto"))))
# Fijo el orden de los niveles
vencedores_k2_3$Eras <- factor(vencedores_k2_3$Eras, levels = c("Era Stend L. Hansen", "Era Julio Martínez", "Era Walter Bouzán", "Resto"))
breaks <- c(3600, 3900, 4200, 4500, 4800, 5100, 5400, 6000, 6600)
labels <- c( "1h 00m", "1h 05m", "1h 10m", "1h 15m", "1h 20m", "1h 25m", "1h 30m","1h 40m", "1h 50m")
evolucion_tiempos_2 <- ggplot(data = vencedores_k2_3 %>% filter(Tipo == "Internacional"), aes(x = Ano, y = as.numeric(Tiempo), color = Eras)) + geom_line(aes(group=1)) +
labs(title = "Evolución tiempos vencedores K2", y = "Tiempos vencedores K2", x = "Año") +
theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5, size = 7)) +
scale_x_continuous(breaks = vencedores_k2_3$Ano) +
scale_y_continuous(
limits = c(3600, 6600),
breaks = breaks,
labels = labels) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
theme(legend.position = c(0.9, 0.8)) +
geom_point() +
scale_color_manual(values=c("#0000FF", "#CC6666", "#088A29", "#D8D8D8"))
evolucion_tiempos_2
ggsave("plots/evolucion_tiempos_3.png")
vencedores_k2_red <- vencedores_k2_1 %>%
select(-Edicion, -Tipo, -Pais) %>%
rename(`Año` = Ano)
era_martinez <- vencedores_k2_red %>%
filter(`Año` >= 1998,
`Año` < 2010)
era_bouzan <- vencedores_k2_red %>%
filter(`Año` > 2009,
`Año` < 2018)
kable(era_martinez) %>% kable_styling(position = "float_left")
Año | Ganadores | Tiempo |
---|---|---|
1998 | Martínez G., Julio-Quevedo T., R. | 1:13:14 |
1999 | Martínez G., Julio-Quevedo T., R. | 1:08:38 |
2000 | Martínez G., Julio-Quevedo T., R. | 1:08:38 |
2001 | Martínez G., Julio-Quevedo T., R. | 1:10:16 |
2002 | Martínez G., Julio-Busto Fdez., M. | 1:09:04 |
2003 | Martínez G., Julio-Merchán A., E. | 1:09:47 |
2004 | Martínez G., Julio-Merchán A., E. | 1:08:23 |
2005 | Martínez G., Julio-Merchán A., E. | 1:08:27 |
2006 | Martínez G., Julio-Merchán A., E. | 1:08:10 |
2007 | Alonso, Jorge-Guerrero, Santi | 1:09:46 |
2008 | Martínez G., Julio-Hernanz, J. | 1:06:15 |
2009 | Martínez G., Julio-Fernández, M. | 1:01:14 |
kable(era_bouzan) %>% kable_styling(position = "float_right")
Año | Ganadores | Tiempo |
---|---|---|
2010 | Walter Bouzán-Álvaro Fernández | 1:07:08 |
2011 | Walter Bouzán-Álvaro Fernández | 1:05:08 |
2012 | Walter Bouzán-Álvaro Fernández | 1:09:12 |
2013 | Walter Bouzán-Álvaro Fernández | 1:06:26 |
2014 | Walter Bouzán-Álvaro Fernández | 1:06:43 |
2015 | Walter Bouzán-Álvaro Fernández | 1:07:20 |
2016 | Walter Bouzán-Álvaro Fernández | 1:07:43 |
2017 | Walter Bouzán-Álvaro Fernández | 1:07:13 |