Utilizando la información brindada por la Secretaria de Salud Federal sobre los casos de COVID-19 detectados en la República Mexicana, y considerando solamente los casos positivos (verificar que la información que se obtenga de la base de datos sea igual a la reportada diariamente por dicha secretaría), obtener lo siguiente.
Eligiendo un estado de la República de residencia del paciente que tenga más de 20 municipios, obtener (tablas):
El estado seleccionado es Morelos
En primer lugar, prepararemos la base de datos que necesitamos para el análisis.
## Porcentaje de defunciones por municipio en Veracruz
covid<-read.csv("/Users/mac/Downloads/211215COVID19MEXICO.csv")
Para verificar que la información de la base de datos es la misma que se reporta diariamente por la Secretaría, filtramos la columna “CLASIFICACION_FINAL” y encontramos que la cifra de casos confirmados a nivel nacional corresponde al acumulado de tres categorías: 1) caso de covid-19 confirmado por asociación clínica epidemiológica, 2) caso de covid-19 confirmado por comité de dictaminación y 3) caso de sars-cov-2 confirmado con muestra de laboratoio o prueba antigénica.
covid_nac<- which(covid$CLASIFICACION_FINAL<4)
covid_nac_1<- covid[covid_nac,]
dim(covid_nac_1)
## [1] 3924638 40
Ahora, necesitamos identificar en la base solo los casos del estado de Morelos. De acuerdo con los catálogos, el código asignado a este estado es “30”.
mor<- which(covid_nac_1$ENTIDAD_RES==17 )
morelos_posit<- covid_nac_1[mor,]
Para obtener el porcentaje de defunciones necesitamos contar con el número de casos y el número de defunciones por municipio.También resulta útil agregar el nombre de los municipios a la base. Para el número de casos podemos agregar una columna de unos para poder contabilizar y usar la columna “MUNICIPIO_RES” de la forma siguiente:
library(readxl)
nombres<-read_xlsx("/Users/mac/Downloads/201128 Catalogos.xlsx",sheet = "Catálogo MUNICIPIOS")
nom_filter<- which(nombres$CLAVE_ENTIDAD== 17)
nom_morelos<-nombres[nom_filter,-3]
nom_morelos$CLAVE_MUNICIPIO<-rep(1:36)
conjunto<- merge (morelos_posit, nom_morelos, by.x = "MUNICIPIO_RES", by.y = "CLAVE_MUNICIPIO")
conjunto$ones<-rep(1,length(conjunto$ENTIDAD_RES))
casos_municipal<-aggregate(ones~ MUNICIPIO,data = conjunto,FUN = sum)
#casos_municipal tiene 35 filas
Para el número de defunciones, ocuparemos la columna “FECHA_DEF” para identificar el número de fallecimientos por municipio.
conjunto$FECHA_DEF<-as.Date(conjunto$FECHA_DEF,format="%Y-%m-%d")
municipio_f<-which(is.na(conjunto$FECHA_DEF)!=TRUE)
def_municipal<-aggregate(ones ~ MUNICIPIO,data =conjunto[municipio_f,],FUN=sum)
Ahora reunimos la información de casos positivos y defunciones por municipio para obtener el porcentaje de estas últimas. Tomaremos como base el data frame que ya cuenta con los municipios identificados, así como la cifra de defunciones.
library(kableExtra)
conj_defunciones <- data.frame (def_municipal$MUNICIPIO,((def_municipal$ones/casos_municipal$ones)*100), def_municipal$ones)
conj_defunciones %>%
kbl(col.names = c("Municipio", "Porcentaje", "Defunciones")) %>%
kable_material_dark(c("striped", "hover", "responsive"))
| Municipio | Porcentaje | Defunciones |
|---|---|---|
| AMACUZAC | 12.738853 | 40 |
| ATLATLAHUCAN | 10.268949 | 42 |
| AXOCHIAPAN | 27.157360 | 107 |
| AYALA | 15.359043 | 231 |
| COATETELCO | 18.181818 | 6 |
| COATLÁN DEL RÍO | 9.045226 | 18 |
| CUAUTLA | 10.411502 | 630 |
| CUERNAVACA | 7.880013 | 1169 |
| EMILIANO ZAPATA | 9.005236 | 172 |
| HUITZILAC | 9.292035 | 42 |
| JANTETELCO | 12.448133 | 30 |
| JIUTEPEC | 7.433683 | 482 |
| JOJUTLA | 9.750297 | 164 |
| JONACATEPEC DE LEANDRO VALLE | 18.120805 | 54 |
| MAZATEPEC | 8.333333 | 16 |
| MIACATLÁN | 12.937063 | 37 |
| OCUITUCO | 16.309013 | 38 |
| PUENTE DE IXTLA | 16.586307 | 172 |
| TEMIXCO | 8.592386 | 246 |
| TEMOAC | 16.875000 | 27 |
| TEPALCINGO | 21.533923 | 73 |
| TEPOZTLÁN | 8.026316 | 61 |
| TETECALA | 7.272727 | 16 |
| TETELA DEL VOLCÁN | 12.549020 | 32 |
| TLALNEPANTLA | 10.447761 | 14 |
| TLALTIZAPÁN DE ZAPATA | 10.500000 | 126 |
| TLAQUILTENANGO | 10.991957 | 82 |
| TLAYACAPAN | 17.692308 | 69 |
| TOTOLAPAN | 17.733990 | 36 |
| XOCHITEPEC | 10.547667 | 156 |
| XOXOCOTLA | 14.634146 | 18 |
| YAUTEPEC | 9.759876 | 252 |
| YECAPIXTLA | 12.837109 | 119 |
| ZACATEPEC | 9.993552 | 155 |
| ZACUALPAN DE AMILPAS | 3.543307 | 9 |
Generamos un objeto que nos permita identificar a los casos con comorbilidades mediante el operador “OR”.
comor<-which(conjunto$TABAQUISMO==1 |conjunto$RENAL_CRONICA==1 |conjunto$OBESIDAD==1 | conjunto$CARDIOVASCULAR==1 |conjunto$HIPERTENSION==1 | conjunto$INMUSUPR==1 | conjunto$ASMA==1 | conjunto$EPOC==1 | conjunto$DIABETES==1 | conjunto$OTRA_COM==1 )
comor_municipal<-aggregate(ones ~ MUNICIPIO,data =conjunto[comor,],FUN=sum)
Ahora reunimos la información de casos positivos y casos de comorbilidad por municipio para obtener el porcentaje de estas últimas. Nuevamente tomaremos como base el data frame que ya cuenta con los municipios identificados, así como la cifra de casos de comorbilidades.
conj_comor<- data.frame (comor_municipal$MUNICIPIO,((comor_municipal$ones/casos_municipal$ones)*100))
conj_comor %>%
kbl(col.names = c("Municipio", "Porcentaje")) %>%
kable_material_dark(c("striped", "hover"))
| Municipio | Porcentaje |
|---|---|
| AMACUZAC | 37.26115 |
| ATLATLAHUCAN | 39.11980 |
| AXOCHIAPAN | 58.88325 |
| AYALA | 43.88298 |
| COATETELCO | 33.33333 |
| COATLÁN DEL RÍO | 37.68844 |
| CUAUTLA | 39.26624 |
| CUERNAVACA | 33.48163 |
| EMILIANO ZAPATA | 35.07853 |
| HUITZILAC | 28.76106 |
| JANTETELCO | 41.49378 |
| JIUTEPEC | 32.37199 |
| JOJUTLA | 36.38526 |
| JONACATEPEC DE LEANDRO VALLE | 40.60403 |
| MAZATEPEC | 33.33333 |
| MIACATLÁN | 39.16084 |
| OCUITUCO | 42.06009 |
| PUENTE DE IXTLA | 39.15140 |
| TEMIXCO | 30.35278 |
| TEMOAC | 36.87500 |
| TEPALCINGO | 43.95280 |
| TEPOZTLÁN | 34.34211 |
| TETECALA | 32.72727 |
| TETELA DEL VOLCÁN | 29.41176 |
| TLALNEPANTLA | 20.89552 |
| TLALTIZAPÁN DE ZAPATA | 36.08333 |
| TLAQUILTENANGO | 31.63539 |
| TLAYACAPAN | 46.92308 |
| TOTOLAPAN | 39.40887 |
| XOCHITEPEC | 38.81001 |
| XOXOCOTLA | 40.65041 |
| YAUTEPEC | 33.46243 |
| YECAPIXTLA | 38.94283 |
| ZACATEPEC | 36.42811 |
| ZACUALPAN DE AMILPAS | 21.25984 |
Para el número de casos por dia, ocuparemos la columna “FECHA_INGRESO”.
conjunto$FECHA_INGRESO<-as.Date(conjunto$FECHA_INGRESO,format="%Y-%m-%d")
casos_dia <-aggregate(ones ~ FECHA_INGRESO,data =conjunto,FUN=sum)
casos_dia$Acumulados<- cumsum(casos_dia$ones)
casos_dia1<- casos_dia[625:635,]
casos_dia1 %>%
kbl(col.names = c("Fecha", "Diarios", "Acumulados")) %>%
kable_material_dark(c("striped", "hover"))%>%
kable_styling(full_width = F)
| Fecha | Diarios | Acumulados | |
|---|---|---|---|
| 625 | 2021-12-02 | 23 | 50582 |
| 626 | 2021-12-03 | 25 | 50607 |
| 627 | 2021-12-04 | 2 | 50609 |
| 628 | 2021-12-05 | 6 | 50615 |
| 629 | 2021-12-06 | 25 | 50640 |
| 630 | 2021-12-07 | 21 | 50661 |
| 631 | 2021-12-08 | 9 | 50670 |
| 632 | 2021-12-09 | 17 | 50687 |
| 633 | 2021-12-10 | 17 | 50704 |
| 634 | 2021-12-11 | 2 | 50706 |
| 635 | 2021-12-12 | 5 | 50711 |
Para el número de casos por dia, ocuparemos la columna “FECHA_INGRESO”.
defun_diarias <-aggregate(ones ~ FECHA_DEF,data =conjunto,FUN=sum)
defun_diarias$Acumulados<- cumsum(defun_diarias$ones)
tail_def <-tail(defun_diarias)
tail_def %>%
kbl(col.names = c("Fecha", "Diarios", "Acumulados")) %>%
kable_material_dark(c("striped", "hover"))
| Fecha | Diarios | Acumulados | |
|---|---|---|---|
| 571 | 2021-11-27 | 2 | 4935 |
| 572 | 2021-11-28 | 1 | 4936 |
| 573 | 2021-12-01 | 1 | 4937 |
| 574 | 2021-12-05 | 1 | 4938 |
| 575 | 2021-12-11 | 2 | 4940 |
| 576 | 2021-12-13 | 1 | 4941 |
mujeres <-which(conjunto$SEXO==1 )
mujeres_municipal<-aggregate(ones ~ MUNICIPIO,data =conjunto[mujeres,],FUN=sum)
#Para comprobar
#conj_mujeres_prueba<- data.frame(mujeres_municipal$MUNICIPIO,mujeres_municipal$ones,casos_municipal$ones,((mujeres_municipal$ones/casos_municipal$ones)*100))
conj_mujeres<- data.frame (mujeres_municipal$MUNICIPIO,((mujeres_municipal$ones/casos_municipal$ones)*100))
conj_mujeres %>%
kbl(col.names = c("Municipio", "Porcentaje")) %>%
kable_material_dark()
| Municipio | Porcentaje |
|---|---|
| AMACUZAC | 44.90446 |
| ATLATLAHUCAN | 50.36675 |
| AXOCHIAPAN | 41.37056 |
| AYALA | 46.94149 |
| COATETELCO | 54.54545 |
| COATLÁN DEL RÍO | 58.79397 |
| CUAUTLA | 50.66931 |
| CUERNAVACA | 50.05730 |
| EMILIANO ZAPATA | 48.37696 |
| HUITZILAC | 45.13274 |
| JANTETELCO | 51.86722 |
| JIUTEPEC | 49.93831 |
| JOJUTLA | 50.35672 |
| JONACATEPEC DE LEANDRO VALLE | 42.61745 |
| MAZATEPEC | 51.04167 |
| MIACATLÁN | 50.69930 |
| OCUITUCO | 46.35193 |
| PUENTE DE IXTLA | 46.48023 |
| TEMIXCO | 49.84282 |
| TEMOAC | 47.50000 |
| TEPALCINGO | 47.19764 |
| TEPOZTLÁN | 51.05263 |
| TETECALA | 47.27273 |
| TETELA DEL VOLCÁN | 47.84314 |
| TLALNEPANTLA | 50.74627 |
| TLALTIZAPÁN DE ZAPATA | 51.58333 |
| TLAQUILTENANGO | 54.82574 |
| TLAYACAPAN | 47.69231 |
| TOTOLAPAN | 50.73892 |
| XOCHITEPEC | 49.62813 |
| XOXOCOTLA | 47.96748 |
| YAUTEPEC | 48.91557 |
| YECAPIXTLA | 48.54369 |
| ZACATEPEC | 49.96776 |
| ZACUALPAN DE AMILPAS | 53.54331 |
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
top_def<-conj_defunciones%>%
top_n(n=10,X..def_municipal.ones.casos_municipal.ones....100.)%>%
arrange(desc(X..def_municipal.ones.casos_municipal.ones....100.))
library(plotly)
## Loading required package: ggplot2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
fig_def<- plot_ly(top_def , x= top_def$def_municipal.MUNICIPIO, y=top_def$X..def_municipal.ones.casos_municipal.ones....100., type = "bar", color = I("gray")) %>%
layout(title = "Municipios con mayor porcentaje de defunciones")
fig_def
Necesitamos conocer de qué municipios se trata.
top_posit_mun<-casos_municipal%>%
top_n(n=10,ones)%>%
arrange(desc(ones))
top_posit_mun
## MUNICIPIO ones
## 1 CUERNAVACA 14835
## 2 JIUTEPEC 6484
## 3 CUAUTLA 6051
## 4 TEMIXCO 2863
## 5 YAUTEPEC 2582
## 6 EMILIANO ZAPATA 1910
## 7 JOJUTLA 1682
## 8 ZACATEPEC 1551
## 9 AYALA 1504
## 10 XOCHITEPEC 1479
sex_catal<-read_xlsx("/Users/mac/Downloads/201128 Catalogos.xlsx",sheet = "Catálogo SEXO")
conj_sex<- merge(conjunto,sex_catal, by.x="SEXO" , by.y="CLAVE", sort=FALSE)
sex_morelos<- aggregate(ones ~ MUNICIPIO_RES+ MUNICIPIO + DESCRIPCIÓN, data= conj_sex, FUN = sum)
sex_morelos1<- sex_morelos %>% arrange(desc(ones)) %>% group_by(DESCRIPCIÓN) %>% top_n(10)
## Selecting by ones
sex_morelos1
## # A tibble: 20 × 4
## # Groups: DESCRIPCIÓN [2]
## MUNICIPIO_RES MUNICIPIO DESCRIPCIÓN ones
## <int> <chr> <chr> <dbl>
## 1 7 CUERNAVACA MUJER 7426
## 2 7 CUERNAVACA HOMBRE 7409
## 3 11 JIUTEPEC HOMBRE 3246
## 4 11 JIUTEPEC MUJER 3238
## 5 6 CUAUTLA MUJER 3066
## 6 6 CUAUTLA HOMBRE 2985
## 7 18 TEMIXCO HOMBRE 1436
## 8 18 TEMIXCO MUJER 1427
## 9 29 YAUTEPEC HOMBRE 1319
## 10 29 YAUTEPEC MUJER 1263
## 11 8 EMILIANO ZAPATA HOMBRE 986
## 12 8 EMILIANO ZAPATA MUJER 924
## 13 12 JOJUTLA MUJER 847
## 14 12 JOJUTLA HOMBRE 835
## 15 4 AYALA HOMBRE 798
## 16 31 ZACATEPEC HOMBRE 776
## 17 31 ZACATEPEC MUJER 775
## 18 28 XOCHITEPEC HOMBRE 745
## 19 28 XOCHITEPEC MUJER 734
## 20 4 AYALA MUJER 706
lab_plotsex<- paste(
"Municipio : ", sex_morelos1$MUNICIPIO,
"Casos: ", sex_morelos1$ones, "Descripción:" , sex_morelos1$DESCRIPCIÓN) %>% lapply(htmltools::HTML)
plot_sex<- ggplot(sex_morelos1)+
aes(x=MUNICIPIO, y=ones, fill=DESCRIPCIÓN, text=lab_plotsex)+
geom_bar(stat = "identity", width = .8,
lwd=0.1, position = "dodge")+
scale_fill_manual(values = c("#dce1f3","#454b9a"))+
labs(x="Municipio", y="Número de casos")+
theme_dark(base_size = 7)
ggplotly(plot_sex, tooltip = c("lab_plotsex"))
Comunmente, para representar series de tiempo y gráficos de lineas suele usarse la paquetería " dygraph", sin embargo, en casos como este, en el que no es posible instalar correctamente esta herramienta ni correr sus funciones principales, puede usarse una alternativa de ggplot que, aunque no tiene la misma apariencia, si proporciona información similar
library(ggplot2)
lab_def<- paste(
"Defunción fecha : ", defun_diarias$FECHA_DEF,
"Acumulados: ", defun_diarias$Acumulados %>% lapply(htmltools::HTML))
q<-ggplot(defun_diarias)+ aes(FECHA_DEF,Acumulados, text=lab_def)+ geom_line ( color="white") +
geom_point() +
labs(title = "Defunciones: casos diarios") +
xlab("") +
theme_dark(base_size = 11) +
theme(axis.text.x=element_text(angle=60, hjust=1)) +
scale_x_date(limit=c(as.Date("2020-04-01"),as.Date("2021-12-14")))
ggplotly(q, dynamicTicks = TRUE, tooltip = c("lab_def")) %>%
rangeslider()
Llamamos a la paquetería y archivos necesarios.
## usamos el data frame que creamos previamente
conj_defunciones$mun<- c("001", "002", "003", "004", "034", "005", "006", "007", "008", "009", "010", "011", "012", "013", "014", "015", "016", "017","018","033","019","020","021","022","023","024","025","026","027","028","035","029", "030", "031", "032")
mapa_morelos@data$CVE_MUN<- as.character(mapa_morelos@data$CVE_MUN)
joint_morelos<-merge(x=mapa_morelos@data, y= conj_defunciones, by.x ="CVE_MUN", by.y= "mun", sort=FALSE)
mapa_morelos@data$DEF <- as.numeric(joint_morelos$X..def_municipal.ones.casos_municipal.ones....100.)
mapa_morelos@data$DEF_casos <- as.numeric(joint_morelos$def_municipal.ones)
library(leaflet)
levels(cut(mapa_morelos@data$DEF,4))
## [1] "(3.52,9.45]" "(9.45,15.4]" "(15.4,21.3]" "(21.3,27.2]"
cortess <- c(0,9.45,15.4,21.3,28)
## generamos la paleta
colores <- colorBin( palette="Blues", domain=mapa_morelos$DEF, na.color="transparent", bins=cortess)
library(htmltools)
#### le indicamos lo que queremos que nos despliegue
textos_morelos <- paste(
"Municipio : ", mapa_morelos$NOMGEO,"<br/>",
"% Porcentaje de defunciones: ", round(mapa_morelos@data$DEF,3),"<br/>",
"Casos:", mapa_morelos$DEF_casos,"<br/>" ) %>% lapply(htmltools::HTML)
leaflet(data=mapa_morelos) %>% addTiles() %>% addPolygons(label= textos_morelos, fillColor = colores(mapa_morelos$DEF), color="white",fillOpacity = .7) %>%
addLegend(mapa_morelos, position = "topright", pal = colores, labels = c("(3.52,9.45]", "(9.45,15.4]", "(15.4,21.3]" ,"(21.3,27.2]"),title="Porcentaje de Defunciones")
## Warning in is.na(values): is.na() applied to non-(list or vector) of type 'S4'
```