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

1. Porcentaje de defunciones por municipio (total de defunciones / total de casos positivos).

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

2. Porcentaje de casos positivos con al menos una comorbilidad a nivel municipal.

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

3. Total de casos positivos acumulados por día a nivel estatal.

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

4. Total acumulado de defunciones por día a nivel estatal.

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

5. Porcentaje de mujeres, a nivel municipal, que representan un caso positivo (Número de mujeres positivas en el municipio / Número de casos positivos en ese municipio).

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

2. Gráfico de barras de los 10 municipios con mayor % de defunciones.

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

3. Gráfico de barras de los 10 municipios con mayor número de casos positivos detectados divido por hombres y por mujeres.

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"))

4. Gráfico de líneas que representa el número acumulado de defunciones a nivel estatal por día. Al desplazar el cursor sobre la línea, se debe de mostrar la cantidad representada en la línea.

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() 

5.Mapa que muestre la distribución espacial, por municipio, del % de defunciones. Utilizar el corte por cuantiles. Al situar el cursor sobre el municipio, se debe de desplegar el % de defunciones y el total de casos de defunciones del correspondiente.

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'

```