# pacotes

pacman::p_load(
  flexdashboard,
  tidyverse,
  dygraphs,
  xts,
  rio,
  lubridate,
  here,
  stringr,
  Matrix,
  thematic,
  foreign,
  fs, 
  sf,
  epikit,
  shiny,
  plotly,
  geobr,
  DT,
  viridis) 



# importar dados 
dengue_2012 <- import("dengue-2012.dbf", 
                      encoding = "UTF-8")
dengue_2013 <- import("dengue-2013.dbf", 
                      encoding = "UTF-8")
dengue_2014 <- import("dengue-2014.dbf", 
                      encoding = "UTF-8")
dengue_2015 <- import("dengue-2015.dbf", 
                      encoding = "UTF-8")
dengue_2016 <- import("dengue-2016.dbf", 
                      encoding = "UTF-8")
dengue_2017 <- import("dengue-2017.dbf", 
                      encoding = "UTF-8")
dengue_2018 <- import("dengue-2018.dbf", 
                      encoding = "UTF-8")
dengue_2019 <- import("dengue-2019.dbf", 
                      encoding = "UTF-8")
dengue_2020 <- import("dengue-2020.dbf", 
                      encoding = "UTF-8")
dengue_2021 <- import("dengue-2021.dbf", 
                      encoding = "UTF-8")
dengue_2022 <- import("dengue-2022.dbf", 
                      encoding = "UTF-8")
populacao <- import("populacao.xlsx")

# unindo os bancos --------------------------------------------------------
# com o comando rbind unimos as bases de todos os anos.

dengue <- rbind(dengue_2012,dengue_2013,dengue_2014,dengue_2015,dengue_2016,dengue_2017,dengue_2018,dengue_2019,dengue_2020, dengue_2021, dengue_2022)

# organizando as variáveis do banco
# classificação final 
dengue_2022 <- dengue_2022 %>% 
  mutate(classificacao = recode(CLASSI_FIN,
                           "5"  = "Descartado",
                           "10" = "Dengue",
                           "11" = "Dengue com sinais de alarme",
                           "12" = "Dengue grave",
                           "13" = "Chikungunya",
                           "8"  = "Inconclusivo"))

dengue_2022 <- dengue_2022 %>% 
  mutate(classificacao = replace_na(classificacao, "Suspeito"))

#evolução
dengue_2022 <- dengue_2022 %>% 
  mutate(evolucao = recode(EVOLUCAO,
                           "1" = "Cura",
                           "2" = "óbito por dengue",
                           "3" = "óbito por outras causas",
                           "4" = "óbito em investigação",
                           "9" = "ignorado"))



# Faixa etária 
dengue_2022$idade <- as.numeric((dengue_2022$DT_SIN_PRI - dengue_2022$DT_NASC) /365)

dengue_2022 <- dengue_2022 %>% 
  mutate(faixa_etaria = age_categories(idade, 
                                      lower=0, 
                                      upper=60, 
                                      by=10))


# semana epiemiológica ----------------------------------------------------

dengue_2022 <- dengue_2022 %>% 
  mutate(epi_semana = floor_date(DT_SIN_PRI, unit= "week"),
         ano = floor_date(DT_SIN_PRI, unit = "year"),
         DT_SIN_PRI = as.Date(DT_SIN_PRI)
         ) %>%
    filter(DT_SIN_PRI >= "2022-01-01")
          

# join do banco de população em cada município de residência

dengue_2022 <- left_join(dengue_2022, populacao, by = c("ID_MN_RESI" = "cod_municipio_ibge"))

#rename 
dengue_2022 <- dengue_2022 %>% 
  rename(municipio_residencia = nom_municipio,
         populacao_residente  = qtd_populacao_estimada)

# obitos
obitos2022 <- dengue_2022 %>% 
  mutate(evolucao = recode(EVOLUCAO,
                           # for reference: OLD = NEW
                           "1" = "Cura",
                           "2" = "óbito por dengue",
                           "3" = "óbito por outras causas",
                           "4" = "óbito em investigação",
                           "9" = "ignorado"))

Panorama por município

Row 1

Chart Notificações

# primeiro value box de notificações 
# documentação em: https://www.rdocumentation.org/packages/shinydashboard/versions/0.7.2/topics/valueBox 

renderValueBox({
  
  if (input$municipio != "Todos")
    {                            # se selecionar cada municipio rodar o codigo abaixo
    notificacoes <- dengue_2022 %>%
    filter(municipio_residencia == input$municipio) %>% 
    count()
  } 
  else 
    { # se selecionar o estado todo rodar abaixo (opacao 'todos')
     
    notificacoes <- dengue_2022 %>%
    count()
  }
  
  valueBox(
    value = notificacoes,
    caption = "Notificações",
    color = "white")
})

Chart Casos

renderValueBox({
  
  if (input$municipio != "Todos"){
    
  casos_confirmados <- dengue_2022 %>%
    filter(CLASSI_FIN =="10" | CLASSI_FIN =="11" | CLASSI_FIN =="12" & SG_UF =="42") %>%  
    filter(municipio_residencia == input$municipio) %>%
    count() 
 
   } else {
  
  casos_confirmados <- dengue_2022 %>%
    filter(CLASSI_FIN =="10" | CLASSI_FIN =="11" | CLASSI_FIN =="12" & SG_UF =="42") %>%
    count()
   }
     
  valueBox(
    value = casos_confirmados,
    caption = "Casos",
    color = "white"
  )
})

#color= "light-blue", "teal"

Chart Óbitos

renderValueBox({
  
    if (input$municipio != "Todos"){
    
    obitos <- dengue_2022%>%
    filter(evolucao== "óbito por dengue") %>% 
    filter(municipio_residencia == input$municipio) %>%
    count()
  
    } else {
      
  obitos <- dengue_2022 %>%
    filter(evolucao== "óbito por dengue") %>% 
    count()
    }

  valueBox(
    value = obitos,
    caption = "Obitos",
    color = "white"
  )
})

Row 2

Gráfico 1. Frequência dos casos de dengue segundo a data de início de sintomas, Santa Catarina, 2022.

# Sempre abrir com o renderplotly para tornar o gráfico dinâmico e interativo com os botoes. 

renderPlotly({

  if (input$municipio != "Todos") 
    {

epicurva_dia <- dengue_2022 %>%
        filter(CLASSI_FIN =="10" | CLASSI_FIN =="11" | CLASSI_FIN =="12" & SG_UF =="42") %>%  #selecao dos casos e uf
        filter(municipio_residencia == input$municipio) %>%  #selecao do input
        group_by(DT_SIN_PRI) %>%  # contar agrupando por semana
        summarise(casos = n()) %>%  # contar
   
  ggplot(aes(x= DT_SIN_PRI,
             y= casos,
             group=1,
             text = paste0("Data do início dos sintomas: ", DT_SIN_PRI, '\n', #aparece quando passa o mouse na coluna
                            "Casos confirmados: ", casos, "\n"))) +
  
  geom_line(color="red") +
  
  labs(x= "Data de início de sintomas",
       y= "Frequência (n)") +
  
  scale_x_date(date_breaks = "3 week", 
               date_minor_breaks = "1 week",
              date_labels = "%d/%B")+
  theme_minimal() +
 
   theme(text = element_text(family = "Times New Roman"),
        axis.text.x = element_text(face = "bold"),
        legend.position = "bottom",
        legend.text = element_text(size = 10))

 } else {

   epicurva_dia <- dengue_2022 %>%
  filter(CLASSI_FIN =="10" | CLASSI_FIN =="11" | CLASSI_FIN =="12" & SG_UF =="42") %>%  #selecao dos casos e uf
  group_by(DT_SIN_PRI) %>%  # contar agrupando por semana
  summarise(casos = n()) %>%  # contar
  ggplot(aes(x=DT_SIN_PRI,
             y=casos,
             group=1,
             text = paste0("Data do início dos sintomas: ", DT_SIN_PRI, '\n', #aparece quando passa o mouse na coluna
                  "Casos confirmados: ", casos, "\n"))) +

  geom_line(color="red") +
   labs(x= "Data de início de sintomas",
        y= "Frequência (n)") +
     
      scale_x_date(date_breaks =  "3 week", 
               date_minor_breaks = "1 week",
              date_labels = "%d/%B")+
     
     theme_minimal() +
 
   theme(text = element_text(family = "Times New Roman"),
        axis.text.x = element_text(face = "bold"),
        legend.position = "bottom",
        legend.text = element_text(size = 10))
     
 }

ggplotly(epicurva_dia, tooltip = "text") %>%
  layout(hoverlabel = list(bgcolor = "white")
)

})

Row 3

Gráfico 2. Frequência das notificações de dengue conforme a classificação final por semana epidemiológica, Santa Catarina, 2022.

renderPlotly({  
  
  if (input$municipio != "Todos")
    {
    
epicurva <- dengue_2022 %>%
  filter(classificacao != "Chikungunya" & SG_UF =="42") %>%  
  filter(municipio_residencia == input$municipio) %>%  #selecao do input
  mutate(semana_sint = epiweek(DT_SIN_PRI)) %>% # variavel semaan epi
  group_by(semana_sint,classificacao) %>%  
  summarise(casos = n()) %>%  
  ggplot(aes(x= semana_sint, 
             y= casos, 
             fill = classificacao,
             text = paste0("Semana Epidemiológica: " ,semana_sint, '\n', 
                  "Número de casos confirmados: ", casos, "\n",
                  "Classificação final: ", classificacao, "\n")
             )
         )+
   geom_bar(stat= "identity") +
  scale_fill_manual(values = c("#ffffb2", "#fecc5c", "#fd8d3c", "#f03b20", "#bd0026", "#30638E"), 
                     breaks = c("Dengue", "Dengue com sinais de alarme", "Dengue grave", "Inconclusivo", "Descartado")) +
  scale_x_continuous(n.breaks=10) +
  labs( x= "Semana Epidemiológica",
        y= "Frequência (n)",
        fill = "")  + 
  theme_minimal() +
 
   theme(text = element_text(family = "Times New Roman"),
        axis.text.x = element_text(face = "bold"),
        legend.position = "bottom",
        legend.text = element_text(size = 10))



  } else {

epicurva <- dengue_2022 %>%
  filter(classificacao != "Chikungunya" & SG_UF =="42") %>%  
  mutate(semana_sint = epiweek(DT_SIN_PRI)) %>% 
  group_by(semana_sint,classificacao) %>%  
  summarise(casos = n()) %>%  
  ggplot(aes(x= semana_sint, 
             y= casos, 
             fill = classificacao,
              text = paste0("Semana Epidemiológica: ", semana_sint, '\n', 
                  "Número de casos confirmados: ", casos, "\n",
                  "Classificação final: ", classificacao, "\n")
             )
         )+
  geom_bar(stat= "identity") +
  scale_fill_manual(values = c("#ffffb2", "#fecc5c", "#fd8d3c", "#f03b20", "#bd0026", "#30638E"), 
                     breaks = c("Dengue", "Dengue com sinais de alarme", "Dengue grave", "Inconclusivo", "Descartado")) +
  scale_x_continuous(n.breaks=10) +
  labs( x= "Semana Epidemiológica",
        y= "Frequência (n)",
        fill = "")  + 
  theme_minimal() +
 
   theme(text = element_text(family = "Times New Roman"),
        axis.text.x = element_text(face = "bold"),
        legend.position = "bottom",
        legend.text = element_text(size = 10))

}

ggplotly(epicurva, tooltip = "text") %>% 
   layout(hoverlabel = list(bgcolor = "white"),
          legend = list(orientation = 'h')
          ) 

})

Row 4

Gráfico 3. Frequência dos casos de dengue conforme a faixa etária por semana epidemiológica, Santa Catarina, 2022.

renderPlotly({  
  
  if (input$municipio != "Todos")
    {

idade_semana <- dengue_2022 %>% 
    filter(CLASSI_FIN =="10" | CLASSI_FIN =="11" | CLASSI_FIN =="12" & SG_UF =="42") %>%  
    filter(DT_SIN_PRI >= "2022-01-01") %>% 
    filter(municipio_residencia == input$municipio) %>%  
    mutate(semana_epi = floor_date(DT_SIN_PRI, unit= "week")) %>% 
    group_by(semana_epi,faixa_etaria) %>% 
    summarise(casos = n()) %>% 

  ggplot(aes(x= semana_epi,
           y = casos, 
           fill = faixa_etaria,
           text = paste0("Semana Epidemiológica: ", semana_epi, '\n', 
                  "Número de casos confirmados: ", casos, "\n",
                  "Faixa etária:", faixa_etaria, "\n")))+
  
  geom_bar(stat= "identity",  color= "white") +
    facet_wrap(~faixa_etaria, ncol = 2)+
  
  labs(x = "Semana epidemiológica",
    y = "Frequência (n)") +
  
  scale_x_date(date_breaks = "month", date_labels = "%U", minor_breaks = "2 week")+
  

  theme_bw()+
  
  theme(axis.text.x = element_text( hjust = 1, color = "black", face= "bold", size=7),
        strip.text = element_text(face = "bold", size = 8),
        strip.background = element_rect(fill = "white"),
        panel.grid.major = element_blank(),
        text = element_text(family = "Times New Roman")) 


} else {

idade_semana <- dengue_2022 %>% 
    filter(CLASSI_FIN =="10" | CLASSI_FIN =="11" | CLASSI_FIN =="12" & SG_UF =="42") %>%
    filter(DT_SIN_PRI >= "2022-01-01") %>% 
    mutate(semana_epi = floor_date(DT_SIN_PRI, unit= "week")) %>% 
    group_by(semana_epi,faixa_etaria) %>% 
    summarise(casos = n()) %>% 

  ggplot(aes(x= semana_epi, 
           y = casos, 
           fill = faixa_etaria,
           text = paste0("Semana Epidemiológica: ", semana_epi, '\n', 
                  "Número de casos confirmados: ", casos, "\n",
                  "Faixa etária:", faixa_etaria, "\n")))+
  
  geom_bar(stat= "identity", color= "white") +
    facet_wrap(~faixa_etaria, ncol = 2)+
  
  labs(x = "Semana epidemiológica",
       y = "Frequência (n)") +
  
  scale_x_date(date_breaks = "month", date_labels = "%U", minor_breaks = "2 week")+

  theme_bw()+
  
  theme(axis.text.x = element_text( hjust = 1, color = "black", face= "bold", size=7),
        strip.text = element_text(face = "bold", size = 8),
        strip.background = element_rect(fill = "white"),
        panel.grid.major = element_blank(),
        text = element_text(family = "Times New Roman")) 


}

ggplotly(idade_semana, tooltip = "text") %>% 
   layout(hoverlabel = list(bgcolor = "white") ,
          legend = list(orientation = 'h')) %>%  #cor do label interativo
   style(marker.color = "#30638E")  # cor da barra (azul)

})

Análise Espacial

Row

Mapa 1. Análise Espacial dos casos de dengue, segundo município de residência, Santa Catarina, 2022.

# mapas
library(rgdal)
library(leaflet)
library(geobr)
library(sf)
library(colorspace)

# Geobr -------------------------------------------------------------------


renderLeaflet({

 sc <- read_municipality(code_muni = 'SC', year=2018)

# contingencia ------------------------------------------------------------

 casos_dengue <- dengue_2022 %>%
   filter(CLASSI_FIN =="10" | CLASSI_FIN =="11" | CLASSI_FIN =="12" & SG_UF =="42")%>%
   group_by(municipio_residencia,ID_MN_RESI) %>%
   summarise(casos = n())


# join 1 -------------------------------------------------------------------

casos_dengue <- left_join(populacao, casos_dengue, by = c("cod_municipio_ibge" = "ID_MN_RESI"))

#rename
casos_dengue$codigo <- casos_dengue$cod_municipio_ibge

# NA para valor zero
casos_dengue <- casos_dengue %>%
  mutate(casos = replace_na(casos, 0))


#shapefile
sc$codigo <- substr(sc$code_muni,1,6) #retira o ultimo algarismo

#save(sc, file="./shapeFile.RData")
#load("shapeFile.RData")

#join2
casos_dengue <- merge(sc, casos_dengue, by.x="codigo")



# bins e colors   -------------------------------------------------------



#cria funcoes para estratificar os casos
 bins <- c(0,10,20,50,100,500,1000,3000,5000, Inf)
 pal <- colorBin("YlOrRd", domain = casos_dengue$casos, bins=bins)


#customizando infos # criando label
 label <- sprintf(
   "<strong>%s</strong></br>%g Casos</br>",
   casos_dengue$nom_municipio, casos_dengue$casos
 ) %>%  lapply(htmltools::HTML)


 map = leaflet(casos_dengue) %>%
   addTiles()


 map %>% addPolygons(
   fillColor = ~pal(casos),
   weight = 2,
   opacity = 1, #opacidade da linha
   color= "white", #cor da linha
   dashArray = "1",
   fillOpacity = 0.7, # cor do fundo
   highlight = highlightOptions( #destacar o mapa quando passa o mouse por cima
     weight = 5,
     color = "#666",
     dashArray = "",
     fillOpacity = 0.7,
     bringToFront = TRUE),
     label = label,
     labelOptions = labelOptions(
      style = list("font-weight"= "normal", padding ="3px 8px"),
     textsize = "15px",
     direction = "auto"
   )) %>%
   addLegend(pal=pal,  #legenda
              values = ~casos,
              opacity = 0.7,
              title = "Casos de dengue",
             position = "bottomright")
})

Série Temporal

Row

Gráfico 4. Série Temporal dos casos confirmados de dengue entre os anos de 2012 e 2022, Santa Catarina.

dengue_temporal <- dengue %>%
     filter(CLASSI_FIN =="10" | CLASSI_FIN =="11" | CLASSI_FIN =="12" & SG_UF =="42") %>%
     filter(DT_SIN_PRI >= "2012-01-01") %>% 
  group_by(DT_SIN_PRI) %>% 
  summarise(casos = n())

all <- xts(x = dengue_temporal$casos, order.by = dengue_temporal$DT_SIN_PRI)


dygraph(all) %>%
  dyOptions(drawGrid = FALSE, colors = "#30638E") %>%
  dyRangeSelector() %>%
  dyCrosshair(direction = "vertical") %>%
  dyHighlight(highlightCircleSize = 5, highlightSeriesBackgroundAlpha = 0.2, hideOnMouseOut = FALSE)  %>%
  dyRoller(rollPeriod = 1) %>%
  dySeries(label = "Casos") %>%
  dyLegend(show = "follow") 

Diagrama de controle

Row

Gráfico 5. Diagrama de controle da dengue em 2022, com a série dos últimos 10 anos, Santa Catarina.

# unindo a variável populacao

dengue_cont <- dengue %>%
  dplyr::select(DT_SIN_PRI, ID_MN_RESI) 


# Contagem - por semana epidemiológica data_sintomas, numero de casos

dengue_cont <- dengue_cont %>%
  filter(DT_SIN_PRI >= "2012-01-01") %>% 
  mutate(semana_epi = floor_date(DT_SIN_PRI, "week")) %>% 
  group_by(semana_epi) %>% 
  summarise(casos = n()) %>% 
  mutate(incidencia = (casos/7338473)*100000)


# Criando o objeto {`nao_epidemic`} com anos não epidêmicos
nao_epidemic <- c(2012, 2013, 2014, 2015,2016, 2017, 2018, 2019, 2020, 2021)

# Criando o objeto {`dengue_2022`} com ano de 2022
dengue_22 <- dengue_cont |> 
  filter(year(semana_epi) == 2022) |> # Filtrando o ano para 2022
  mutate(sem_epi = epiweek(semana_epi)) # Criando uma nova coluna chamada 'sem_epi', referente à semana epidemiológica



# Criando o gráfico com o diagrama de controle 
dengue_stat <- dengue_cont |>
  filter(year(semana_epi) %in% nao_epidemic) |> # Filtrando os dados da série em que o ano não é epidêmico
  mutate(sem_epi = epiweek(semana_epi)) |> # Criando uma nova coluna chamada 'sem_epi', referente à semana epidemiológica
  group_by(sem_epi) |> # Agrupando os dados pela semana epidemiológica
  summarise( 
    n = n(),
    media = mean(incidencia, na.rm = TRUE),
    desvio = sd(incidencia, na.rm = TRUE) ,
    sup = media + 2 * desvio,
    inf = media - 2 * desvio)


# gráfico -----------------------------------------------------------------


# Definindo a base a ser utilizada
 plot_diagrama <- ggplot(data = dengue_stat) +
   aes(x = sem_epi, y = media) +  # Definindo argumentos estéticos com as variáveis usadas em x e em y
  
  # Adicionando a linha referente à incidência média de dengue.
  # Adicionando uma geometria de linha na cor azul e largura de 1.2 pixel
  geom_line(aes(color = 'cor_media_casos'), size = 1.2) +
  
  # Adicionando uma geometria de linha na cor laranja. Além disso, inserindo
  # um argumento estético para o eixo y que, no caso, é a variável de limite
  # superior
  geom_line(aes(y = sup, color = 'cor_limite'), size = 1.2) +
  
  # Adicionando uma geometria de colunas utilizando a base de dados
  # {`dengue_2022`} e y como a incidência de dengue em 2022. O argumento
  # `fill` refere-se à cor das barras e `alpha` à transparência.
  geom_col(data = dengue_22,
           aes(y = incidencia, fill = 'cor_incidencia'), alpha = 0.4) +
  
  # Arrumando o eixo x, definindo o intervalo de tempo que será utilizado (`breaks`) 
  # uma sequência de semanas epidemiológicas de 1 a 53 
  # o argumento `expand` ajuda nesse processo.
  scale_x_continuous(breaks = 1:53, expand = c(0, 0)) +
  
  # Definindo os títulos dos eixos x e y
  labs(x = 'Semana Epidemiológica',
       y = 'Incidência por 100 mil hab.') +
  
  # Definindo o tema do gráfico
 
  theme_bw() +

   theme(text = element_text(family = "Times New Roman"),
        axis.text.x = element_text(face = "bold", size= 10),
        legend.position = "bottom",
        legend.text = element_text(size = 8))+
     
  
  # Criando a legenda das linhas
  scale_color_manual(
    name = "",
    values = c('cor_media_casos' = 'darkblue', 'cor_limite' = 'red'),
    labels = c("Incidência média", "Limite superior")
  ) +
  
  # Criando a legenda das barras
  scale_fill_manual(
    name = "",
    values = c('cor_incidencia' = 'yellow'),
    labels = "Incidência de dengue em 2022"
  )


ggplotly(plot_diagrama) %>% 
   layout( legend = list(orientation = 'h')) 

Tabela

Row

Tabela 1. Principais indicadores por município de residência, Santa Catarina, 2022.

tabela <- dengue_2022 %>%
group_by(municipio_residencia, populacao_residente)%>%
  summarise(casos = n(),
           obitos =  sum(EVOLUCAO == "2", na.rm = T),
           internados = sum(HOSPITALIZ == "1",na.rm =T),
           casos_mulheres = sum (CS_SEXO == "F", na.rm = T),
           casos_homens = sum(CS_SEXO == "M", na.rm = T))%>%
  mutate(taxa_incidencia = round(casos/populacao_residente*100000 , 2)) %>%
  select(municipio_residencia, casos, casos_mulheres, casos_homens, taxa_incidencia, obitos, internados)


renderDT({DT::datatable(tabela,
                        rownames= FALSE,
         colnames = c ( "Município de residência" ,
                        "Número de casos" ,
                        "Casos mulheres",
                        "Casos homens",
                        "Taxa de incidência",
                        "óbitos",
                        "Internações"))
})