El objetivo de éste trabajo es crear un mapa animado de series de tiempo que muestre cómo el Covid19 se extiende en las comunas de las regiones de Chile.

Los datos estudiados provienen de DataIntelligence Chile.

Comenzaremos por la región de TarapacÔ:

#Filtrar datos
#pd <- import("pandas")
#datos <- pd$read_excel("data_1_mayo.xlsx")
#head(datos, 10)
#Siendo que solo queremos ver cómo se ha extendido el covid19 en TarapacÔ, filtraremos el data frame para mostrar solo los casos ede TarapacÔ. Esto se puede hacer con el paquete dplyr. 
library(tibble)
library(readr) 
# read_csv2 () lee archivos separados por punto y coma (comĆŗn en paĆ­ses donde, se usa como el decimal)
covid19_data <- read_csv2("data_1_mayo.csv")
## Using ',' as decimal and '.' as grouping mark. Use read_delim() for more control.
## Parsed with column specification:
## cols(
##   Region = col_character(),
##   Comuna = col_character(),
##   Codigo_comuna = col_double(),
##   Fecha = col_character(),
##   Clave = col_double(),
##   Casos_Diarios = col_double(),
##   Casos_Acumulados = col_double(),
##   Muertes = col_double(),
##   Casos_Activos = col_double(),
##   Recuperados = col_double(),
##   Recuperados_Diarios = col_double(),
##   Dia = col_double(),
##   Fallecidos_Diarios = col_double(),
##   `on-off` = col_character(),
##   Max_Dia = col_double()
## )
#str(covid19_data)
#as_tibble(covid19_data)
#str(covid19_data)
covid19_data
## # A tibble: 67,936 x 15
##    Region Comuna Codigo_comuna Fecha  Clave Casos_Diarios Casos_Acumulados
##    <chr>  <chr>          <dbl> <chr>  <dbl>         <dbl>            <dbl>
##  1 Antof~ Antof~          2101 03-0~ 2.10e8             0                0
##  2 Antof~ Antof~          2101 04-0~ 2.10e8             0                0
##  3 Antof~ Antof~          2101 05-0~ 2.10e8             0                0
##  4 Antof~ Antof~          2101 06-0~ 2.10e8             0                0
##  5 Antof~ Antof~          2101 07-0~ 2.10e8             0                0
##  6 Antof~ Antof~          2101 08-0~ 2.10e8             0                0
##  7 Antof~ Antof~          2101 09-0~ 2.10e8             0                0
##  8 Antof~ Antof~          2101 10-0~ 2.10e8             0                0
##  9 Antof~ Antof~          2101 11-0~ 2.10e8             0                0
## 10 Antof~ Antof~          2101 12-0~ 2.10e8             0                0
## # ... with 67,926 more rows, and 8 more variables: Muertes <dbl>,
## #   Casos_Activos <dbl>, Recuperados <dbl>, Recuperados_Diarios <dbl>,
## #   Dia <dbl>, Fallecidos_Diarios <dbl>, `on-off` <chr>, Max_Dia <dbl>

Vemos que la fecha no tiene el formato correcto. Se lo damos:

covid19_data$Fecha %<>% as.Date(format="%d-%m-%y")
# covid19_data
head(covid19_data, 10)
## # A tibble: 10 x 15
##    Region Comuna Codigo_comuna Fecha       Clave Casos_Diarios Casos_Acumulados
##    <chr>  <chr>          <dbl> <date>      <dbl>         <dbl>            <dbl>
##  1 Antof~ Antof~          2101 2020-03-03 2.10e8             0                0
##  2 Antof~ Antof~          2101 2020-03-04 2.10e8             0                0
##  3 Antof~ Antof~          2101 2020-03-05 2.10e8             0                0
##  4 Antof~ Antof~          2101 2020-03-06 2.10e8             0                0
##  5 Antof~ Antof~          2101 2020-03-07 2.10e8             0                0
##  6 Antof~ Antof~          2101 2020-03-08 2.10e8             0                0
##  7 Antof~ Antof~          2101 2020-03-09 2.10e8             0                0
##  8 Antof~ Antof~          2101 2020-03-10 2.10e8             0                0
##  9 Antof~ Antof~          2101 2020-03-11 2.10e8             0                0
## 10 Antof~ Antof~          2101 2020-03-12 2.10e8             0                0
## # ... with 8 more variables: Muertes <dbl>, Casos_Activos <dbl>,
## #   Recuperados <dbl>, Recuperados_Diarios <dbl>, Dia <dbl>,
## #   Fallecidos_Diarios <dbl>, `on-off` <chr>, Max_Dia <dbl>
#Todas las columnas parecen tener la estructura correcta.

Filtrando los datos

Siendo que solo queremos ver cómo se extendió covid19 en TarapacĆ”, filtraremos el dataframe para mostrar solo Ć©sos casos. Ɖsto lo haremos con el paquete dplyr.

Tarapaca_covid19<-covid19_data%>%
  dplyr::filter(Region == "Tarapaca")

Tarapaca_covid19
## # A tibble: 1,351 x 15
##    Region Comuna Codigo_comuna Fecha       Clave Casos_Diarios Casos_Acumulados
##    <chr>  <chr>          <dbl> <date>      <dbl>         <dbl>            <dbl>
##  1 Tarap~ Alto ~          1107 2020-03-03 1.11e8             0                0
##  2 Tarap~ Alto ~          1107 2020-03-04 1.11e8             0                0
##  3 Tarap~ Alto ~          1107 2020-03-05 1.11e8             0                0
##  4 Tarap~ Alto ~          1107 2020-03-06 1.11e8             0                0
##  5 Tarap~ Alto ~          1107 2020-03-07 1.11e8             0                0
##  6 Tarap~ Alto ~          1107 2020-03-08 1.11e8             0                0
##  7 Tarap~ Alto ~          1107 2020-03-09 1.11e8             0                0
##  8 Tarap~ Alto ~          1107 2020-03-10 1.11e8             0                0
##  9 Tarap~ Alto ~          1107 2020-03-11 1.11e8             0                0
## 10 Tarap~ Alto ~          1107 2020-03-12 1.11e8             0                0
## # ... with 1,341 more rows, and 8 more variables: Muertes <dbl>,
## #   Casos_Activos <dbl>, Recuperados <dbl>, Recuperados_Diarios <dbl>,
## #   Dia <dbl>, Fallecidos_Diarios <dbl>, `on-off` <chr>, Max_Dia <dbl>

Ahora desplegaremos el mapa sólo de la región de TarapacÔ:

Obtener el archivo shape de la región.

Como el dataframe no tiene shapes, tengo que descargar una carpeta shape con las regiones y municipios de Chile para unirlos al dataframe Tarapaca_covid19.

La siguiente dirección es un excelente sitio web para descargar datasets espaciales de todos los países del mundo:

http://www.diva-gis.org/datadown

# Para leer los datos, usarƩ el paquete sf.
library(sf)
CL_comunas=st_read("C:/Users/usuario/Documents/GitHub/covid19/unidades_vecinales_2019/unidades_vecinales_2019.shp") 
## Reading layer `unidades_vecinales_2019' from data source `C:\Users\usuario\Documents\GitHub\covid19\unidades_vecinales_2019\unidades_vecinales_2019.shp' using driver `ESRI Shapefile'
## Simple feature collection with 6871 features and 10 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -109.4549 ymin: -55.98 xmax: -66.41821 ymax: -17.49846
## CRS:            4326
# Como podemos ver, el archivo shape se leyó en R.

#CL_comunas
# plot(st_geometry(CL_comunas))

Filtremos por unidad geogrƔfica:

Tarapaca_municipios = CL_comunas %>% filter(T_REG_NOM == "TARAPACA")
plot(st_geometry(Tarapaca_municipios))

Uniendo el shapefile al dataframe

Esto se puede hacer utilizando la función left_join() del paquete dplyr. La unión se basarÔ en la columna común compartida por ambos conjuntos de datos, que sería la columna Región.

Primero, necesito poner en minĆŗscula el encabezado de la columna ā€˜Region’ en el dataset Tarapaca_covid19 y reemplazar el nombre T_REG_NOM por ā€˜region’ en el dataset de los shp. Esto, para que puedan coincidir las columnas ā€˜Región’ de ambos datasets.

Luego, hay que llevar a minĆŗsculas la columna ā€˜Región’ en ambos datasets.

colnames(Tarapaca_covid19)
##  [1] "Region"              "Comuna"              "Codigo_comuna"      
##  [4] "Fecha"               "Clave"               "Casos_Diarios"      
##  [7] "Casos_Acumulados"    "Muertes"             "Casos_Activos"      
## [10] "Recuperados"         "Recuperados_Diarios" "Dia"                
## [13] "Fallecidos_Diarios"  "on-off"              "Max_Dia"
colnames(Tarapaca_municipios)
##  [1] "T_REG_CA"   "T_REG_NOM"  "T_PROV_CA"  "T_PROV_NOM" "T_COM"     
##  [6] "COMUNA"     "T_COM_NOM"  "T_UV_COD"   "ID_UV"      "T_UV_NOM"  
## [11] "geometry"
names(Tarapaca_covid19)[names(Tarapaca_covid19) == 'Region'] <- 'region' 
names(Tarapaca_municipios)[names(Tarapaca_municipios) == 'T_REG_NOM'] <- 'region'
Tarapaca_covid19$region<-tolower(Tarapaca_covid19$region)#Makes all rows in the county column lowercase
Tarapaca_municipios$region<-tolower(Tarapaca_municipios$region)

#Ahora puedo unir los dos datasets basado en la columna 'region' de ambos.

Tarapaca_covid19_shapes<-left_join(Tarapaca_covid19,Tarapaca_municipios,by="region",all.x = TRUE)%>%
dplyr::select(Fecha,Comuna,region,Casos_Acumulados,geometry)#selects only the columns of interest

#head(Tarapaca_covid19_shapes)
head(Tarapaca_covid19_shapes)
## # A tibble: 6 x 5
##   Fecha      Comuna   region Casos_Acumulados                           geometry
##   <date>     <chr>    <chr>             <dbl>                 <MULTIPOLYGON [°]>
## 1 2020-03-03 Alto Ho~ tarap~                0 (((-69.25363 -20.12262, -69.25361~
## 2 2020-03-03 Alto Ho~ tarap~                0 (((-69.2535 -20.12259, -69.2418 -~
## 3 2020-03-03 Alto Ho~ tarap~                0 (((-69.01007 -20.67646, -69.00497~
## 4 2020-03-03 Alto Ho~ tarap~                0 (((-68.97833 -19.93333, -68.97658~
## 5 2020-03-03 Alto Ho~ tarap~                0 (((-69.47563 -20.40196, -69.47574~
## 6 2020-03-03 Alto Ho~ tarap~                0 (((-69.74089 -20.26079, -69.70897~
#Hacer un mapa con ggplot2 y gganimate

#Toda la parte de manipulación de datos estÔ hecha, ahora puedo comenzar a construir el mapa real. Usaré el paquete ggplot2 junto con el paquete gganimate para crear el mapa final de la serie animada que muestra cómo se extendió el covid19 en la región de TarapacÔ.

# Used to make new data frame an sf object
# Must use st_as_sf in order to use geom_sf() to plot polygons

library(ggplot2) #Used for plotting
library(gganimate) #Used for animations
library(RColorBrewer)

Tarapaca_covid19_shapes<-st_as_sf(Tarapaca_covid19_shapes)
# Makes plot with ggplot2 and gganimate to animate through the days 
covid_map<-ggplot()+
  geom_sf(data = Tarapaca_municipios,fill = "white")+
  geom_sf(data = Tarapaca_covid19_shapes,aes(fill=Casos_Acumulados))+
  ggtitle("Expansión del COVID-19 en la región de TarapacÔ")+
  xlab("")+
  ylab("")+
  labs(subtitle = "Date: {current_frame}",
       caption = "Fuente de datos: DataIntelligence\nAutor: Christian Castro")+
  cowplot::background_grid(major = "none", minor = "none") +
  theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(),
        axis.text.y = element_blank(), axis.ticks.y = element_blank(),
        axis.line = element_blank(),
        legend.background = element_blank(),
        legend.position=c(-0.3,0.8),
        plot.background = element_blank(),
        panel.background = element_blank(),
        legend.text = element_text(size=12),
        legend.title = element_text(colour="black", size=12, face="bold"),
        plot.title=element_text(size=20, face="bold",hjust =0.5),
        plot.subtitle = element_text(hjust = 0.5,size=12),
        plot.caption = element_text(size = 11,
                                    hjust = .5,
                                    color = "black",
                                    face = "bold"))+
  scale_fill_distiller("Casos_Acumulados",
                       palette ="Reds",type = "div",
                       direction = 1)+transition_manual(Fecha)
animate(covid_map, nframe=27,fps = 2, end_pause = 15,height = 500, width =500)