Fecha

Esta mañana me he puesto a ver cómo de complicado era a) obtener los datos temporales de la campaña de vacunación en España; y b) hacer algo medianamente razonable con R sin mucho esfuerzo.

Los datos

No he encontrado en ninguna parte un único archivo con los datos temporales. Sin embargo, aquí se puede descargar el archivo más reciente en este enlace. Intenté cambiar la fecha del archivo para ver si así me podía hacer con el histórico y tengo algo que, si bien es cutre, funciona:

for i in $(seq 1 180); do url="https://www.mscbs.gob.es/profesionales/saludPublica/ccayes/alertasActual/nCov/documentos/Informe_Comunicacion_$(date -d "2021-01-01 + $i days" +%Y%m%d).ods"; wget $url; done

Podía estar mejor hecho y hacer que sólo llegase hasta hoy, etc, pero para lo que quiero bien vale.

R

La parte de R no tiene mucho misterio. Los datos están más o menos bien formateados, así que no hay que hacer demasiada limpieza. Para leer todo del tirón y generar algunas variables adicionales:

library(tidyverse)
library(readODS)
library(lubridate)
library(scales)
theme_set(theme_bw(12))

read_file <- function(filepath) {
    # Read and clean data.

    dd <- read_ods(filepath)
    dd <- dd[!dd[, 1] %in% c("Totales", "Fuerzas Armadas",
                             "Sanidad Exterior", "C. Valenciana*"), ]

    cas <- dd[, 1]

    # Total doses
    delivered_doses <- find_delivered_doses(dd)

    # This is always the same header
    injected_doses <- dd$`Dosis administradas (2)`

    # The date is always the last column
    date_index <- ncol(dd)
    dates <- parse_date(dd[, date_index], "%d/%m/%Y")

    res <- data.frame(ca = cas,
        delivered = delivered_doses,
        injected = injected_doses,
        date = dates)
    return(res)
}

find_delivered_doses <- function(dd) {
    n <- names(dd)
    doses_idx <- which(grepl(".*Dosis entregadas \\(1\\)$", n))
    return(dd[, doses_idx])
}

#### MAIN ####

filelist <- dir('/tmp', '*.ods', full.names = TRUE)
data <- bind_rows(lapply(filelist, read_file))
data <- data[complete.cases(data), ]
# Remove erroneous dates
data <- data[data$date < Sys.Date(), ]

# Add extra variables
data$percentage_injected <- data$injected / data$delivered

Y ya, sin más dilación, las dos gráficas habituales: porcentaje de vacunas inyectadas en cada comunidad autónoma y las líneas temporales de las entregadas y las inyectadas.

plt1 <- ggplot(data, aes(x = date, y = percentage_injected)) + 
    geom_line() + 
    facet_wrap(~ ca) +
    scale_x_date(date_breaks = "1 month", date_labels = "%b") +
    scale_y_continuous(labels = percent) + 
    theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) + 
    ylab("Porcentaje inyectado\n") + xlab("\nFecha") +
    ggtitle("Porcentaje de vacunas usadas por comunidad autónoma")
plot(plt1)

Gráfica 
1

plt2 <- ggplot(pivot_longer(data, c(injected, delivered)),
               aes(x = date, y = value, color = name)) + 
    geom_line() + 
    facet_wrap(~ ca, scale = "free_y") +
    scale_x_date(date_breaks = "1 month", date_labels = "%b") +
    scale_color_brewer(palette = "Set1", name = NULL, labels = c("Entregadas", "Inyectadas")) +
    scale_y_continuous(labels = label_number(suffix = " M", scale = 1e-6)) +
    theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) + 
    ylab("Porcentaje inyectado\n") + xlab("\nFecha") +
    ggtitle("Porcentaje de vacunas usadas por comunidad autónoma")
plot(plt2)

Gráfica 
2