Análisis Descenso del Sella

Análisis de resultados históricos del Descenso Internacional del Sella.

Índice

1.Obtención de la información.

1.1 Listado de vencedores y tiempos histórico (wikipedia).

1.2 Extracción resultados última década de todos los participantes (pdfs).

1.3 Extracción resultados 1970-2000 (pdfs imágenes).

1.4 Confección tabla única con toda la información obtenida.

2.Exploración de datos inicial.

1.Obtención de la información.

1.1 Listado de vencedores y tiempos histórico (wikipedia).

Cargo los paquetes que voy a necesitar para el análisis:

library(tidyverse)
library(rvest)
library(lubridate)
library(tabulizer)

En la wikipedia hay una tabla con los vencedores en categoría K2 de la prueba: https://es.wikipedia.org/wiki/Descenso_Internacional_del_Sella

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")
# load(file = "descenso_wiki.Rdata")

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_0’:

vencedores_0 <- html_nodes(descenso_wiki, "table") %>% .[[3]] %>% html_table(header = TRUE)

Echo un vistazo al formato de la tabla:

head(vencedores_0)
##              EXCURSIONES            EXCURSIONES
## 1                Edición                    Año
## 2                      I                   1930
## 3                     II                   1931
## 4 DESCENSOS PROVINCIALES DESCENSOS PROVINCIALES
## 5                Edición                    Año
## 6                    III                   1932
##                                       EXCURSIONES            EXCURSIONES
## 1                                       Ganadores              Municipio
## 2 Manés Fdez.- Alfonso Argüelles- Dionisio Huerta               Infiesto
## 3 Manés Fdez.- Alfonso Argüelles- Dionisio Huerta               Infiesto
## 4                          DESCENSOS PROVINCIALES DESCENSOS PROVINCIALES
## 5                                       Ganadores              Municipio
## 6                 César Sánchez Llano-Antón Durán            Ribadesella
##              EXCURSIONES
## 1                 Tiempo
## 2                   7 h.
## 3                  12 h.
## 4 DESCENSOS PROVINCIALES
## 5                 Tiempo
## 6                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, cambio el nombre de las variables, eliminando tildes, la ‘ñ’ y las minúsculas:

colnames(vencedores_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_0$ano <- as.numeric(vencedores_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’ presentan un número.

vencedores_0 <- vencedores_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_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_0’

tipo <- as.data.frame(tipo)

vencedores_1 <- bind_cols(vencedores_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_1$municipio))
##    Alemania   Australia     Bélgica   Cantabria   Dinamarca      España 
##           1           1           3           1           6          47 
##       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_1 <- vencedores_1 %>% mutate(pais = ifelse(ano < 1951, "España", municipio))
vencedores_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_1$tiempo <- str_replace(vencedores_1$tiempo, "®", "" )

Los tiempos de los dos primeros años están en otro formato. Sustituimos sus valores por los correspondientes en h:mm:ss

vencedores_1$tiempo[[1]] <- "7:00:00"
vencedores_1$tiempo[[2]] <- "12:00:00"

Y falta el tiempo final de 2017. Lo añadimos

vencedores_1$tiempo[[80]] <- "1:07:13"

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_1$tiempo <- str_replace(vencedores_1$tiempo, "-", ":" )
vencedores_1$tiempo <- str_replace(vencedores_1$tiempo, "\\.", ":" )
vencedores_2 <- vencedores_1

Finalmente convertimos la variable de “character” formato “hora” con la función “hms” del paquete “lubridate”

vencedores_2$tiempo <- hms(vencedores_2$tiempo)

Probamos a hacer un primer gráfico donde represento la evolución de los tiempos de los ganadores de la competición de la categoría K2 masculina. Excluyo los dos primeros años, que corresponden a las excursiones que fueron el germen de la competición posterior, ya que sus tiempos, 7 y 12 horas, quedan lejísimos del resto y desvirtúan la representación. Incluyo la variable ¨tipo¨ con color para diferenciar los distintos ámbitos históricos de la competición (Provincial, Nacional e Internacional).

# Antes de ejecutar el gráfico tengo que realizar alguna modificación en las variables
vencedores_2$tiempo <- as.duration(vencedores_2$tiempo) # tengo un problema con el formato de los tiempos. Opto 
# por convertirlos a duraciones en segundos. Me queda pendiente arreglar este tema para poder representarlo en el gráfico en hh:mm:ss.
vencedores_3 <- vencedores_2 %>% filter(tipo != "Excursión")
vencedores_4 <- vencedores_3 %>% mutate(fecha = paste(ano, "-", "08", "-", "01")) # creo una variable "fecha", con 
# formato YYYY-MM-DD para que sea tratable por ggplot2 como fecha
vencedores_4$fecha <- ymd(vencedores_4$fecha) # convierto con lubridate la nueva variable creada a formato fecha 

# Ejecuto el gráfico
ggplot(data = vencedores_4, aes(x = ano, y = as.numeric(tiempo), color = tipo)) + geom_line() +
  labs(title = "Evolución tiempos vencedores K2", y = "Tiempos vencedores K2 (segundos)",  x = "Año") +
  theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5, size = 7)) +
  scale_x_continuous(breaks = vencedores_4$ano) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
  theme(legend.position = c(0.9, 0.8))

 # Otra posibilidad: facet_wrap(~tipo, ncol = 1, scales = "free_x")
1.2 Extracción resultados última década de todos los participantes (pdfs).

Utilizamos la función ‘extract_tables’ de ‘tabulizer’ para extraer el contenido de un pdf con los resultados de 2016

pdf_2016 <- extract_tables("data/resultados_sella_2016.pdf")

El objeto resultante es una lista en los que cada uno de sus elementos es una página del pdf original

glimpse(pdf_2016)
## List of 12
##  $ : chr [1:58, 1:8] "" "" "Pos" "1" ...
##  $ : chr [1:40, 1:8] "" "" "Pos" "56" ...
##  $ : chr [1:58, 1:8] "" "" "Pos" "1" ...
##  $ : chr [1:35, 1:8] "" "" "Pos" "56" ...
##  $ : chr [1:55, 1:8] "" "" "Pos" "1" ...
##  $ : chr [1:23, 1:8] "" "" "Pos" "1" ...
##  $ : chr [1:43, 1:8] "" "" "Pos" "1" ...
##  $ : chr [1:44, 1:7] "Female K2MS" "" "Pos No Name" "1 360 OLATZ ZABALA AURORA FIGUERAS" ...
##  $ : chr [1:42, 1:6] "Female K1MS23" "" "Pos No Name Time" "1 419 CAROLINA MASSAGUES JULIAN 01:31:07" ...
##  $ : chr [1:39, 1:8] "" "" "Pos" "1" ...
##  $ : chr [1:24, 1:7] "" "" "Pos" "1" ...
##  $ : chr [1:44, 1:7] "" "" "Pos" "1" ...

En principio me voy a centrar en los resultados de la categoría masculina de K2. Los resultados de esta categoría están en las dos primeras páginas del pdf, es decir, en los dos primeros elementos de la lista ‘pdf_2016’. Extraigo el primer elemento y lo convierto en un data frame para ver cómo ha quedado

k2_2016_1 <- pdf_2016[[1]]
k2_2016_1 <- as.data.frame(k2_2016_1)

Echo un vistazo al data frame resultante

glimpse(k2_2016_1)
## Observations: 58
## Variables: 8
## $ V1 <fct> , , Pos, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,...
## $ V2 <fct> Male K2S, , No Name, 1 WALTER BOUZÁN ÁLVARO FERNÁNDEZ FI...
## $ V3 <fct> , , Time, 01:07:43, 01:08:09, , , , 01:09:38, 01:10:23, , ,...
## $ V4 <fct> , , C.Pos, , , , , , , , , , , , , , , , , , , , , , 
## $ V5 <fct> , , , 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16...
## $ V6 <fct> , , O.Pos, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1...
## $ V7 <fct> , Time Behind, Categ, 00:00:00, 00:00:26, 00:00:26, 00:01:5...
## $ V8 <fct> , Time Behind, Winner, 00:00:00, 00:00:26, 00:00:26, 00:01:...
head(k2_2016_1, 10)
##     V1                                                         V2       V3
## 1                                                        Male K2S         
## 2                                                                         
## 3  Pos                                                    No Name     Time
## 4    1                  1 WALTER BOUZÃ\201N Ã\201LVARO FERNÃ\201NDEZ FIUZA 01:07:43
## 5    2              2 JULIO MARTÃ\215NEZ GÓMEZ JOSE JULIÃ\201N BECERRO 01:08:09
## 6    3     5 BRAIS SÃ\201NCHEZ NOVELLE ANTONIO PALMA REGUERA01:08:09         
## 7    4  14 EMILIO MERCHÃ\201N ALONSO ALEJANDRO SANCHEZ COB0O1:S09:37         
## 8    5 11 RAFAEL CARRIL FERNÃ\201NDEZ ASLEY RODRIGUEZ NARE01D:O09:38         
## 9    6             6 JUAN BUSTO GUTIERREZ EMILIO LLAMEDO IGLESIAS 01:09:38
## 10   7                                  15 JAKUB ADAM KEITH MOULE 01:10:23
##       V4 V5    V6          V7          V8
## 1                                        
## 2                 Time Behind Time Behind
## 3  C.Pos    O.Pos       Categ      Winner
## 4         1     1    00:00:00    00:00:00
## 5         2     2    00:00:26    00:00:26
## 6         3     3    00:00:26    00:00:26
## 7         4     4    00:01:54    00:01:54
## 8         5     5    00:01:55    00:01:55
## 9         6     6    00:01:55    00:01:55
## 10        7     7    00:02:40    00:02:40

Las columnas ‘No’ y ‘Name’ (número de dorsal de la pareja de participantes y nombres y apellidos de éstos) aparecen unidas en una única variable. Además en algunos de los casos el tiempo recogido en ‘Time’ también aparece concatenado a los nombres de los participantes. Opto por quedarme únicamente de esta columna con el número del dorsal y los tiempos los compondré con el tiempo del ganador y la diferencia en meta con cada participante (variables ‘Time Behind…’).

La categoría aparece en el primer registro de la segunda variable. Creo una nueva variable ‘cat’ con este registro.

k2_2016_1$cat <- k2_2016_1$V2[[1]]
names <- c("pos", "no name", "time", "", "c.pos", "o.pos", "time behind categ.", "time behind winner", "cat")
colnames(k2_2016_1) <- names

head(k2_2016_1) k2_2016_1[[1]] <- NULL View(k2_2016_1)

Nota: Dejo la obtención de datos temporalmente para avanzar un poco con el análisis exploratorio de la tabla de ganadores de K2.

2.Exploración de datos inicial.

Comenzamos esta exploración inicial de los datos echando un vistazo a los tiempos de los ganadores desde el comienzo de la prueba.

Ejecutamos de nuevo el gráfico con el que finalizamos la parte de obtención de estos datos.

# Ejecuto de nuevo el gráfico
ggplot(data = vencedores_4, aes(x = ano, y = as.numeric(tiempo), color = tipo)) + geom_line() +
  labs(title = "Evolución tiempos vencedores K2", y = "Tiempos vencedores K2 (segundos)",  x = "Año") +
  theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5, size = 7)) +
  scale_x_continuous(breaks = vencedores_4$ano) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
  theme(legend.position = c(0.9, 0.8))