En este trabajo realizaremos un anÔlisis de los datos correspondientes a las determinaciones de laboratorio para la detección del virus Sars-Cov-2 en el territorio argentino desde el comienzo de la pandemia hasta la actualidad. Para ello utilizaremos un dataset de datos espaciales y temporales del portal de datos abiertos del Ministerio de Salud.
Comenzamos como siempre, activando los paquetes que utilizaremos para explorar, transformar y visualizar estos datos. En este caso, estaremos utilizando ātidyverseā, āsfā, āggmapā y ālubridateā :
library(tidyverse)
## āā Attaching packages āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā tidyverse 1.3.0 āā
## ā ggplot2 3.3.3 ā purrr 0.3.4
## ā tibble 3.1.0 ā dplyr 1.0.5
## ā tidyr 1.1.3 ā stringr 1.4.0
## ā readr 1.4.0 ā forcats 0.5.1
## āā Conflicts āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā tidyverse_conflicts() āā
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(sf)
## Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1
library(ggmap)
## Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
## Please cite ggmap if you use it! See citation("ggmap") for details.
Una vez activadas las librerĆas que utilizaremos importamos nuestros datos:
Covid19_Testeos <- read.csv("data/Covid19Determinaciones.csv", stringsAsFactors=TRUE)
Covid19_Casos <- read.csv(ādata/Covid19Casos.csvā, stringsAsFactors = TRUE)
str(Covid19_Testeos)
## 'data.frame': 112574 obs. of 12 variables:
## $ fecha : Factor w/ 520 levels "2008-08-13","2012-09-21",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ provincia : Factor w/ 25 levels "Buenos Aires",..: 10 6 2 6 13 13 2 20 7 22 ...
## $ codigo_indec_provincia : int 38 14 2 14 50 50 2 78 18 86 ...
## $ departamento : Factor w/ 382 levels "12 de Octubre",..: 108 45 75 45 45 45 79 105 45 45 ...
## $ codigo_indec_departamento: int 21 14 2 14 7 7 6 14 21 49 ...
## $ localidad : Factor w/ 1138 levels "11A. SECCION",..: 908 251 797 251 11 7 125 546 263 936 ...
## $ codigo_indec_localidad : int 60 10 10 10 10 10 10 60 20 110 ...
## $ origen_financiamiento : Factor w/ 2 levels "Privado","PĆŗblico": 2 2 2 2 2 2 1 1 2 2 ...
## $ tipo : Factor w/ 13 levels "FFAA/Seguridad",..: 9 9 13 9 9 9 8 8 9 9 ...
## $ ultima_actualizacion : Factor w/ 1 level "2021-06-30": 1 1 1 1 1 1 1 1 1 1 ...
## $ total : int 1 1 1 1 1 1 1 1 1 1 ...
## $ positivos : int NA 1 NA 1 1 NA NA NA NA 1 ...
Como puede verse, se trata de un dataframe de que contiene el registro de los testeos totales y positivos realizados por fecha, desagregado a nivel de localidad y por tipo de efector que realizó el test. Para poder realizar un anĆ”lisis espacial de la distribución territorial de estas observaciones mĆ”s adelante lo convertiremos en un dataframe de datos espaciales uniĆ©ndolo con las geometrĆas de las provincias y de los partidos y comunas del AMBA. Pero antes de ello, comenzaremos por el anĆ”lisis temporal.
Para poder realizar operaciones temporales con los datos importados comenzamos por transformar los valores de la variable que contiene las marcas temporales de los registros en datos de tipo fecha. Asimimo, filtraremos los registros correspondientes a los aƱos 2020 y 2021, atento a que las observaciones de aƱos anteriores constituyen errores de carga. Finalmente agruparemos los efectores en las categorĆas que consideramos relevantes para nuestro anĆ”lisis.
Covid19_Testeos <- Covid19_Testeos %>%
mutate(fecha=ymd(fecha)) %>%
mutate(mes=month(fecha, label=TRUE), anio=year(fecha)) %>%
mutate(positivos = ifelse(is.na(positivos), 0, positivos)) %>%
filter(anio==2020 | anio==2021, !provincia=="SIN ESPECIFICAR") %>%
mutate(tipo=as.character(tipo)) %>%
mutate(tipo=(case_when(tipo %in% c("Nacional", "Provincial", "Municipal", "Privado",
"Obra social")~tipo, TRUE~"otro"))) %>%
mutate(tipo=as.factor(tipo)) %>%
mutate(tipo=factor(tipo, levels=c("Nacional", "Provincial", "Municipal", "Privado",
"Obra social", "otro")))
ggplot(data=(Covid19_Testeos %>%
group_by(fecha) %>%
summarise(tests_positivos=sum(positivos))))+
aes(x=fecha, y=tests_positivos/1000)+
geom_area(fill="seagreen2")+
theme_minimal()+
theme(plot.title = element_text(face="bold", size=15))+
theme(axis.title.x = element_text(face="bold", vjust=-0.5, colour="darkgray", size=12))+
theme(axis.title.y = element_text(face="bold", vjust=-0.5, colour="darkgray", size=12))+
labs(title="Testeos Positivos de Covid19",
subtitle="Evolución de la cantidad de testeos positivos por fecha",
y="cantidad de tests positivos (en miles)",
caption="Fuente: Datos Abiertos del Ministerio de Salud")
ggplot(data=(Covid19_Testeos %>%
group_by(anio, mes) %>%
summarise(tests_totales=sum(total), tests_positivos=sum(positivos)) %>%
pivot_longer(3:4, names_to="test", values_to="cantidad")),
aes(x=mes, y=cantidad/1000, fill=test))+
geom_bar(stat="identity")+
scale_fill_manual(values = c("darkmagenta", "gray75"))+
facet_wrap(~anio)+
theme_minimal()+
theme(plot.title = element_text(face="bold", size=15))+
theme(axis.title.x = element_text(face="bold", vjust=-0.5, colour="darkgray", size=12))+
theme(axis.title.y = element_text(face="bold", vjust=-0.5, colour="darkgray", size=12))+
labs(title="Testeos positivos y totales",
subtitle="Evolución de la cantidad de testeos positivos y totales, años 2020 y 2021",
y="cantidad de tests realizados (en miles)",
fill=NULL,
caption="Fuente: Datos Abiertos del Ministerio de Salud")
## `summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
ggplot(data=(Covid19_Testeos %>%
group_by(anio, mes, tipo) %>%
summarise(tests_totales=sum(total))), aes(x=mes, y=tests_totales/1000))+
geom_bar(stat="identity", fill="gray90")+
geom_line(aes(color=tipo, group=tipo))+
geom_point(aes(color=tipo))+
scale_color_viridis_d()+
geom_text(data=(Covid19_Testeos %>%
group_by(anio, mes) %>%
summarise(tests_totales=sum(total))),
aes(x=mes, y=tests_totales/1000+75, label=round(tests_totales/1000, 0)))+
facet_wrap(~anio)+
theme_minimal()+
theme(plot.title = element_text(face="bold", size=15))+
labs(title="Testeos de Covid19",
subtitle="Evolución de la cantidad de testeos totales por mes, años 2020 y 2021",
caption="Fuente: Datos Abiertos del Ministerio de Salud")
## `summarise()` has grouped output by 'anio', 'mes'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
ggplot(data=(Covid19_Testeos %>%
group_by(tipo) %>%
summarise(tests_totales=sum(total))))+
aes(x=tests_totales/1000, y=fct_reorder(tipo, tests_totales), fill=tipo)+
geom_bar(stat="identity")+
geom_label(aes(x=tests_totales/1000+250, label=round(tests_totales/1000, 0)), fill=NA)+
scale_fill_viridis_d()+
theme_minimal()+
theme(plot.title = element_text(face="bold", size=15))+
theme(axis.title.x = element_text(face="bold", vjust=-0.5, colour="darkgray", size=12))+
theme(axis.title.y = element_text(face="bold", vjust=-0.5, colour="darkgray", size=12))+
labs(title="Testeos de Covid19 segĆŗn efector",
subtitle="Evolución de la cantidad de testeos según tipo de efector por el cual fue realizado",
x="cantidad de tests totales (en miles)",
y="Tipo",
caption="Fuente: Datos Abiertos del Ministerio de Salud")
* Finalmente, en el grĆ”fico que sigue podemos ver la evolución de la tasa de positividad por mes. Como habĆamos adelantado, durante la segunda ola se registró un incremento significativo de los testeos totales realizados en relación al aumento de los testeos positivos registrados, resultando en un descenso de la tasa de positividad. En este sentido, puede observarse que, mientras durante la segunda ola la tasa de positividad se ubica apenas por encima del promedio para los dos aƱos de la pandemia (24,8%), durante la primera Ć©sta se encuentra muy por encima de el mismo.
ggplot(data=(Covid19_Testeos %>%
group_by(anio, mes) %>%
summarise(tasa_positividad=sum(positivos)/sum(total))),
aes(x=mes, y=tasa_positividad*100))+
geom_abline(aes(intercept=sum(Covid19_Testeos$positivos)/sum(Covid19_Testeos$total)*100,
slope=0), color="darkmagenta", size=2, alpha=0.75)+
geom_bar(stat="identity", fill="seagreen2")+
geom_label(aes(y=tasa_positividad*100+2, label=round(tasa_positividad*100, 0)))+
facet_wrap(~anio)+
geom_text(aes(x="feb", y=sum(Covid19_Testeos$positivos)/sum(Covid19_Testeos$total)*100+2),
label="promedio", color="darkgray")+
theme_minimal()+
theme(plot.title = element_text(face="bold", size=15))+
theme(axis.title.x = element_text(face="bold", vjust=-5, colour="darkgray", size=12))+
theme(axis.title.y = element_text(face="bold", vjust=1, colour="darkgray", size=12))+
labs(title="Tasa de Positividad",
subtitle="Evolución de la tasa de positividad en determinaciones de laboratorio, años 2020 y 2021",
y="tasa de positividad (%)",
caption="Fuente: Datos Abiertos del Ministerio de Salud")
## `summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
tasa de positividad promedio:
sum(Covid19_Testeos$positivos)/sum(Covid19_Testeos$total)
## [1] 0.2478319
Como habĆamos anticipado, para poder realizar un anĆ”lisis de la distribución territorial de nuestros datos, debemos agregarle al dataframe de testeos una columna de geometrĆas. Para ello utilizamos s dos dataframes de datos espaciales que contienen, respectivamente, las geometrĆas de las provincias (Instituto GeogrĆ”fico Nacional) y de los partidos y comunas del AMBA (GCBA).
departamentos <-st_read("data/departamentos/pxdptodatosok.shp")
## Reading layer `pxdptodatosok' from data source `/Users/nahuel/Desktop/DI TELLA/Ciencia de Datos para Ciudades II/TAREAS/hospitales/data/departamentos/pxdptodatosok.shp' using driver `ESRI Shapefile'
## Simple feature collection with 527 features and 10 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -74.02985 ymin: -90 xmax: -25.02314 ymax: -21.74506
## Geodetic CRS: WGS 84
departamentos <- departamentos %>%
filter(!departamen %in% c('Islas del AtlƔntico Sur', "AntƔrtida Argentina"))
provincias <- departamentos %>%
group_by(provincia) %>%
summarise()
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
ggplot() +
geom_sf(data = provincias, fill="white") +
theme_void()
testeosporprovincia <- Covid19_Testeos %>%
group_by(anio, provincia) %>%
summarise(total_positivos=sum(positivos), total_testeos=sum(total))
## `summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
testeosporprovincia <- testeosporprovincia %>%
left_join(provincias, by="provincia") %>%
st_as_sf(crs=4326)
ggplot()+
geom_sf(data=testeosporprovincia, aes(fill=total_testeos/1000), color="gray")+
scale_fill_viridis_c()+
theme_void()+
theme(plot.title = element_text(face="bold", size=15))+
labs(title="Testeos por provincia",
subtitle="Cantidad de testeos realizados por provincia, aƱos 2020 y 2021",
fill="cantidad (en miles)",
caption="Fuente: Datos Abiertos del Ministerio de Salud")+
facet_wrap(~anio)
amba <- read_sf("data/partidos_amba.geojson")
testeospordepartamento <- Covid19_Testeos %>%
group_by(anio, provincia, departamento) %>%
summarise(total_positivos=sum(positivos), total_testeos=sum(total)) %>%
mutate(departamento=(as.character(departamento))) %>%
mutate(departamento=(case_when(departamento=="COMUNA 01"~"Comuna 1", departamento=="COMUNA 02"~ "Comuna 2", departamento=="COMUNA 03"~"Comuna 3", departamento=="COMUNA 04"~"Comuna 4", departamento=="COMUNA 05"~"Comuna 5", departamento=="COMUNA 06"~"Comuna 6", departamento=="COMUNA 07"~"Comuna 7", departamento=="COMUNA 08"~"Comuna 8", departamento=="COMUNA 09"~"Comuna 9", departamento=="COMUNA 10"~"Comuna 10", departamento=="COMUNA 11"~"Comuna 11", departamento=="COMUNA 12"~"Comuna 12", departamento=="COMUNA 13"~"Comuna 13", departamento=="COMUNA 14"~"Comuna 14", departamento=="COMUNA 15"~"Comuna 15", TRUE~departamento)))
## `summarise()` has grouped output by 'anio', 'provincia'. You can override using the `.groups` argument.
testeosamba <- testeospordepartamento %>%
left_join(amba, by=c("departamento"="nombre")) %>%
filter(provincia.x=="CABA" | provincia.y=="GBA") %>%
st_as_sf(crs=4326)
ggplot()+
geom_sf(data=testeosamba, aes(fill=total_testeos/1000), color="gray")+
scale_fill_viridis_c()+
theme_void()+
theme(plot.title = element_text(face="bold", size=15))+
labs(title="Testeos AMBA",
subtitle="Cantidad de testeos realizados por partido, aƱos 2020 y 2021",
fill="cantidad (en miles)",
caption="Fuente: Datos Abiertos del Ministerio de Salud")+
facet_wrap(~anio)
ggplot()+
geom_sf(data=filter(testeosamba, provincia.x=="CABA"), aes(fill=total_testeos/1000), color="gray")+
scale_fill_viridis_c()+
theme_void()+
theme(plot.title = element_text(face="bold", size=15))+
labs(title="Testeos CABA",
subtitle="Cantidad de testeos realizados por comuna, aƱos 2020 y 2021",
fill="cantidad (en miles)",
caption="Fuente: Datos Abiertos del Ministerio de Salud")+
facet_wrap(~anio)