final_internados <- read.csv("datos/final_internados.csv")
internacion <- read.csv("datos/internados_si_no.csv")
sobrevida <- read.csv("datos/fallecidos.csv")
En este trabajo se van a analizar datos de personas internadas por COVID-19. Se toman unicamente las personas que no fallecieron, dado que el propósito es tener insumos para poder hacer un seguimiento posterior a la internación.
A partir del dataset que se encuentra disponible en la página de datos abiertos del Ministerio de Salud de la Nación, hice una selección conservando unicamente: - casos que computan un diagnóstico diferente a “Descartado”. - personas que estuvieron internadas - personas que no fallecieron
A ese dataset además, le incorporé la variable “región”.
Al mes de mayo los pacientes que fueron internados por covid representan casi el 4% del total de personas diagnosticadas COVID positivo.
internacion<- internacion %>%
rename(Internados= Var1) %>%
mutate(pct_int= Freq/sum(Freq)*100)
ggplot(internacion, aes(x=1, y=pct_int, fill = Internados))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(pct_int,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("FantasticFox1", n =2))+
ggtitle(" Tasa de internación sobre total de casos")
Por otra parte, la tasa de sobrevida total fue del 98%.
sobrevida <- sobrevida %>%
rename(Fallecido= Var1) %>%
mutate(pct_fallecidos= Freq/sum(Freq)*100)
ggplot(sobrevida, aes(x=1, y=pct_fallecidos, fill = Fallecido))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(pct_fallecidos,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("GrandBudapest1", n =2))+
ggtitle(" Tasa de sobrevida sobre total de casos")
Así, el análisis se realiza sobre un total de 112.309 casos.
casos_totales <- final_internados %>%
count(id_evento_caso) %>%
summarise(n = n())
theme <- bslib::bs_theme(version = 4)
totn_chart <- fluidPage(theme = theme, br(),
fluidRow(summaryBox("Total de casos incluidos en el análisis", casos_totales, width = 0.5, icon = "fas fa-clipboard-list", style = "primary", border = "left")))
totn_chart
final_internados <- final_internados %>%
mutate(fecha_diagnostico_ok = ymd(fecha_diagnostico)) %>%
mutate(fecha_internacion_ok = ymd(fecha_internacion)) %>%
mutate (fecha_cui_intensivo_ok = ymd(fecha_cui_intensivo))
final_internados <- final_internados %>%
mutate(intervalo_internacion = difftime(fecha_internacion_ok, fecha_diagnostico_ok, units = "days")) %>%
mutate (intervalo_uti = difftime(fecha_cui_intensivo_ok, fecha_internacion_ok, units = "days"))
A continuación se muestra la distribución de los casos según sexo, edad,provincia de residencia, origen del financiamiento con el que se cubrió la internación y distribución según internación en cuidados críticos e intubación
distribucion_sexo <- final_internados %>%
group_by(sexo) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(distribucion_sexo, aes(x=1, y=percentage, fill = sexo))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("Darjeeling1", n =3))+
ggtitle(" Distribución total internados según sexo")
media_edad <- final_internados %>%
summarise(promedio= mean(edad, na.rm = TRUE)) %>%
as.integer()
edad_chart <- fluidPage(theme = theme, br(),
fluidRow(summaryBox("Promedio de edad personas que estuvieron internadas", media_edad, width = 0.5, icon = "fas fa-clipboard-list", style = "primary", border = "left")))
edad_chart
pal <- wes_palette("Darjeeling1", 100, type = "continuous")
final_internados%>%
filter(edad<100) %>%
group_by(edad) %>%
summarise (cantidad_observaciones = n()) %>%
ggplot (aes (edad, cantidad_observaciones))+
geom_col(fill = pal)+
ggtitle(" Distribución internados por edad")+
scale_fill_gradientn(colours = pal)+
scale_x_continuous()
distribucion_financiamiento <- final_internados %>%
group_by(origen_financiamiento) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(distribucion_financiamiento, aes(x=1, y=percentage, fill = origen_financiamiento))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("Royal1", n =2))+
ggtitle(" Distribución total de internados según origen del financiamiento")
final_internados <- final_internados %>%
mutate(provincia = case_when(residencia_provincia_nombre== "Santiago del Estero" ~ "S.delE.",
residencia_provincia_nombre== "Tierra del Fuego" ~ "T.delF.",
residencia_provincia_nombre== "La Pampa" ~ "L.P.",
residencia_provincia_nombre== "Río Negro" ~ "R.N.",
residencia_provincia_nombre== "Santa Cruz" ~ "S.C.",
residencia_provincia_nombre== "Neuquén" ~ "NQN",
TRUE ~ residencia_provincia_nombre))
paleta_mia<- c(wes_palette("BottleRocket2"), "#CC79A7")
final_internados%>%
group_by(region, provincia) %>%
summarise (cantidad_observaciones = n()) %>%
filter(region !="NA") %>%
ggplot (aes (provincia, cantidad_observaciones))+
geom_col(aes(fill = region))+
scale_fill_manual(values = paleta_mia ) +
ggtitle("Cantidad total de internados por provincia, según región ")+
facet_wrap( ~ region, scales = "free", nrow = 5)
distribucion_UTI <- final_internados %>%
group_by(cuidado_intensivo) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(distribucion_UTI, aes(x=1, y=percentage, fill = cuidado_intensivo))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("BottleRocket2", n =2))+
ggtitle("Distribución pacientes según internacion en cuidados críticos")
promedio_internacion <- final_internados %>%
summarise(promedio_internacion = mean(intervalo_internacion [intervalo_internacion >= 0], na.rm = TRUE))
promedio_internacion <- as.numeric(promedio_internacion) %>%
round()
promedio_uti <- final_internados %>%
summarise(promedio_uti= mean(intervalo_uti [intervalo_uti >= 0], na.rm = TRUE))
promedio_uti <- as.numeric(promedio_uti) %>%
round()
theme <- bslib::bs_theme(version = 4)
tiempo <- fluidPage(theme = theme, br(),
fluidRow(summaryBox("Promedio de dias desde el diagnóstico hasta la internación en sala general", promedio_internacion, width = 1, icon = "fas fa-calendar", style = "danger", border = "bottom"),
summaryBox("Promedio de dias transcurridos desde la internación general hasta traslado a cuidados críticos", promedio_uti, width = 1, icon = "fas fa-calendar", style = "danger", border = "bottom")))
tiempo
distribucion_ARM <- final_internados %>%
group_by(asistencia_respiratoria_mecanica) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(distribucion_ARM, aes(x=1, y=percentage, fill = asistencia_respiratoria_mecanica))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("BottleRocket2", n =2))+
ggtitle("Utilización de asistencia respiratoria mecánica sobre total internados")
distribucion_ARM_UTI <- final_internados %>%
filter(cuidado_intensivo == "SI") %>%
group_by(asistencia_respiratoria_mecanica) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(distribucion_ARM_UTI, aes(x=1, y=percentage, fill = asistencia_respiratoria_mecanica))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("BottleRocket2", n =2))+
ggtitle("Utilización de asistencia respiratoria mecánica sobre internados en cuidados críticos")
¿Por qué es tan baja la proporción de pacientes que requirieron cuidados intensivos? La hipótesis que se exploró está asociada a la mortalidad de los casos. Dado que para el análisis original se habían excluido las personas que fallecieron, vamos a analizar qué sucede con el requerimiento de cuidados intensivos considerando tanto a los que sobrevivieron como aquellos que no.
Como se puede ver en el gráfico a continuación, al incluir los casos fallecidos la utilización de cuidados intensivos aumenta al 17,6%.
todos_internados <- read.csv("datos/todos_internados.csv")
UCI_todos <- todos_internados %>%
group_by(cuidado_intensivo) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(UCI_todos, aes(x=1, y=percentage, fill = cuidado_intensivo))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("Darjeeling2", n =2))+
ggtitle("Distribución pacientes según internacion en cuidados críticos
(incluye pacientes que fallecieron)")
Para darle mayor especificidad al análisis se exploró cuál fue el requerimiento de cuidados intensivos sólo en pacientes fallecidos, hayando que este aumenta a más del 40%.
UTI_fallecidos <- todos_internados %>%
filter(fallecido=="SI") %>%
group_by(cuidado_intensivo) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(UTI_fallecidos, aes(x=1, y=percentage, fill = cuidado_intensivo))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("Darjeeling2"))+
ggtitle("Distribución pacientes fallecidos según internación en cuidados críticos")
Por otra parte se exploró si existía diferencia en la utilización de cuidados críticos según el tipo de financiamiento, encontrando que es mayor cuando el financiamiento es privado: 10% vs 8,8%.
distribucion_UTI_privado <- final_internados %>%
filter(origen_financiamiento == "Privado") %>%
group_by(cuidado_intensivo) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(distribucion_UTI_privado, aes(x=1, y=percentage, fill = cuidado_intensivo))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("BottleRocket2", n =2))+
ggtitle("Distribución pacientes según internacion en cuidados críticos
financiamiento privado")
distribucion_UTI_publico <- final_internados %>%
filter(origen_financiamiento == "Público") %>%
group_by(cuidado_intensivo) %>%
count() %>%
ungroup() %>%
mutate(percentage = n/sum(n) * 100)
ggplot(distribucion_UTI_publico, aes(x=1, y=percentage, fill = cuidado_intensivo))+
geom_bar(stat="identity") +
geom_text(aes(label = paste0(round(percentage,1),"%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
theme_void() + scale_fill_manual(values= wes_palette("BottleRocket2", n =2))+
ggtitle("Distribución pacientes según internacion en cuidados críticos
financiamiento público")
En principio esto podría explicarse por una mayor edad de los internados en el sector privado, lo cual se asocia a una mayor gravedad de la enfermedad.
media_edad_financ <- final_internados %>%
group_by(origen_financiamiento) %>%
summarise(promedio_edad= round(mean(edad, na.rm = TRUE),0)) %>%
kbl(caption= " Promedio de edad de los internados según origen del financiamiento", col.names = c("Origen del financiamiento", "Promedio de edad")) %>%
kable_minimal(full_width = F)
media_edad_financ
| Origen del financiamiento | Promedio de edad |
|---|---|
| Privado | 55 |
| Público | 48 |
Dada la concentración de casos en la edad de 1 año y el comportamiento de la pendiente en la distribución de los menores de 12 se amplió el análisis en esos grupos etarios. Cabe destacar que la condición de internado se estimó a partir de la presencia del dato “fecha de internación”: en todos los casos donde este campo contara con información, se consideró como internado. Por este motivo no puede atribuirse directamente la presencia de gran cantidad de casos con valor igual a 1 a un error de carga.
Hipótesis vinculada con la segunda ola de COVID-19
Se exploró la hipótesis de que los casos pediátricos tuvieran que ver con la segunda ola de la pandemia, que ocurrió en el año 2021.
Para ello se analizó la evolución de la cantidad de casos a lo largo del tiempo, tanto para los menores de 12 años como para los pacientes de 1 año y luego se los comparó con los casos mayores de 11 años.
En los menores de 12 años se observa un salto en la cantidad de casos en el mes de mayo, que pasa de 70 a 330. Luego en junio vuelve a escalar a 571, alcanzando el pico en julio y comenzar a descender.
Con todo esto la hipótesis vinculada con la segunda ola de covid se descartó.
final_internados%>%
filter(edad<12 & edad >1 & fecha_internacion_ok > "2020-02-29" & fecha_internacion_ok <"2021-05-01" ) %>%
group_by(mes = floor_date(fecha_internacion_ok, "month")) %>%
summarize(cantidad_internados = n()) %>%
ggplot (aes (mes, cantidad_internados))+
geom_line(size= 2, col= "#2c4251")+
ggtitle(" Evolución cantidad de internados mensuales, mayores de 1 año y
menores de 12 años. (marzo 2020-abril 2021)")
Los casos de 1 año muestran la misma tendencia que el grupo de entre 2 y 11: en el mes de mayo se da un incremento exponencial de los casos, que pasa de 19 a 115, en junio vuelven a escalar duplicándose (244) y se alcanza el pico en julio (253) para comenzar a descender en agosto.
final_internados%>%
filter(edad==1 & fecha_internacion_ok > "2020-02-29"& fecha_internacion_ok <"2021-05-01" ) %>%
group_by(mes = floor_date(fecha_internacion_ok, "month")) %>%
summarize(cantidad_internados = n()) %>%
ggplot (aes (mes, cantidad_internados))+
geom_line(size= 2, col= "#d16666")+
ggtitle(" Evolución cantidad de internados mensuales de 1 año de edad.
(marzo 2020-abril 2021)")
En los mayores de 11 años, se parte de un piso mas alto de casos para el mes de marzo (797) y una curva con una pendiente menos pronunciada que en grupos pediátricos. Esto se explica por el hecho de que los casos se van duplicando mes a mes hasta junio, para luego continuar un ascenso menos pronunciado hasta llegar al pico que se produce en septiembre. Recordemos que tanto en los casos de 1 año como en los de 1 a 11, el pico se da antes, en el mes de julio.
final_internados%>%
filter(fecha_internacion_ok > "2020-02-29"& fecha_internacion_ok <"2021-05-01" & edad >11) %>%
group_by(mes = floor_date(fecha_internacion_ok, "month")) %>%
summarize(cantidad_internados = n()) %>%
ggplot (aes (mes, cantidad_internados))+
geom_line(size= 2, col= "#b6c649")+
ggtitle(" Evolución cantidad de internados mensuales, mayores de 11 años.
(marzo 2020-abril 2021)")
Hipótesis de severidad de la enfermedad en casos pediátricos
Se evaluó la hipótesis de que los casos pediátricos tengan un mayor peso sobre los casos totales cuando se realiza el recorte de los casos internados. Es decir, la pregunta fue: si bien hay menos casos de COVID en niños, la tasa de internación es mayor que en la población general.
Para eso en primer lugar se exploró la cantidad de casos pediátricos sobre el total de casos (internados y no internados).
Como se puede observar no se da la concentración de casos en la edad de un año que se veía en los internados.Sin embargo, cuando se explora la tasa de internación en esa edad, se observa que representa 2,5 veces más que la correspondiente a la población total (3,8 vs 9,6)
limpio_todos_casos<- read.csv("datos/limpio_todos_casos_corto.csv")
pal2 <- wes_palette("Darjeeling1", 99, type = "continuous")
limpio_todos_casos%>%
filter(edad<100 & edad>0) %>%
group_by(edad) %>%
summarise (cantidad_observaciones = n()) %>%
ggplot (aes (edad, cantidad_observaciones))+
geom_col(fill = pal2)+
ggtitle(" Distribución total de casos por edad: incluye internados y
no internados+ fallecidos")+
scale_fill_gradientn(colours = pal2)+
scale_x_continuous()
limpio_todos_casos<- limpio_todos_casos %>%
mutate(fecha_internacion_ok = ymd(fecha_internacion))
limpio_todos_casos<- limpio_todos_casos %>%
mutate(internados_ok = case_when(is.na(fecha_internacion_ok)~ "NO",
!is.na(fecha_internacion_ok)~ "SI"))
un_año_internados <- limpio_todos_casos %>%
filter(edad==1 ) %>%
group_by(internados_ok) %>%
count() %>%
ungroup() %>%
mutate (percentage = round (n/sum(n)*100 ,1)) %>%
kable(head = " Internación en casos de 1 año de edad",col.names = c("Internación", "Cantidad de casos", "%")) %>%
kable_minimal(full_width = F)
un_año_internados
| Internación | Cantidad de casos | % |
|---|---|---|
| NO | 13144 | 90.4 |
| SI | 1400 | 9.6 |