Clusterização - DataSUS

Introdução

A seguir temos uma AnĆ”lise de dados sobre Ɠbitos maternos durante a gravidez, parto e o puerpĆ©rio de mulheres com idades entre 10 a 49 anos , ocorridos nos municĆ­pios do estado do Rio de Janeiro, entre 2012 e 2022.

Em seguida, utilizei um método de segmentação chamado cluster hierÔrquico,que permitirÔ agrupar os municípios em categorias e estabelecer relações de similaridade e hierarquia entre eles.

Os dados foram coletados de diversas fontes: DataSUS, IBGE e o site Atlas.

OBS: Este projeto foi, originalmente, desenvolvido como uma tarefa avaliativa, da disciplina de Introdução à Banco de Dados (FEA-RP | USP).

Diretório

getwd()
## [1] "C:/0.Projetos/4.DataSUS/0.Github"
#setwd("C:/Users/UsuƔrio/Documents/Disciplinas 2024.2/Introducao_a_Banco_de_Dados/Desafio_02")

Importar pacotes

library(tidyverse)
library(readxl) # carregar arquivos .xlsx (Excel)
library(openxlsx) # Salvar tabela no formato .xlsx (Excel)
library(DT) # Função datatable()
library(kableExtra) #Visualização (parecido com o pacote "DT")

library(sf) # dados espaciais
library(geobr) #  dados espaciais

library(forcats) # Ordenar os valores no grƔfico ggplot()

library(plotly)# Usar ggplotly()
library(scales) # Usar scale_x_continuous()

library(viridis) # Paleta de cores

library(gridExtra) # usar no grid.arrange()
library(grid)

library(Hmisc) # calcular correlação -->  rcorr()
library(ggcorrplot) # grafico de correlação --> ggcorrplot()

Carregar dados principais

dados_socioeconomicos <- read_excel("../Dados/Dados_Economicos/dados_socioeconomicos.xlsx") 

dados_socioeconomicos <- dados_socioeconomicos %>% 
                         mutate(
                           Codmun7 = as.character(Codmun7),
                           Codmun6 = as.character(Codmun6),
                         )
tabela_municipio <- read_excel("../Dados/Dados_Transformados/Transformacao_parte_1/tabela_municipio.xlsx") %>% 
                         mutate(
                           Codmun7 = as.character(Codmun7),
                           Codmun6 = as.character(Codmun6),
                         )
taxa_media_obito_1 <- read_excel("../Dados/Dados_Economicos/Dados_Populacao/2.Populacao_feminina_por_faixa_etaria/taxa_media_obito_1.xlsx")
taxa_media_obito_2 <- read_excel("../Dados/Dados_Economicos/Dados_Populacao/2.Populacao_feminina_por_faixa_etaria/taxa_media_obito_2.xlsx")

obitos_em_relacao_a_populacao_1 <- read_excel("../Dados/Dados_Economicos/Dados_Populacao/2.Populacao_feminina_por_faixa_etaria/obitos_em_relacao_a_populacao_1.xlsx")

Carregar dados auxiliares

dados_IBGE <- read_excel("../Dados/Dados_Economicos/Dados_IBGE_2022_v3_com_dict.xlsx", sheet=2)%>% 
                         mutate(
                           Codmun7 = as.character(Codmun7),
                           Codmun6 = as.character(Codmun6),
                         )
populacao_2022 <- read_excel("../Dados/Dados_Economicos/Dados_Raca_Cor_municipio/Pop_Raca_Cor_Faixa_Etaria_por_municipio_2010_e_2022.xlsx", sheet=4) %>% 
  .[, !grepl("2010$", colnames(.))] %>%  # Remover colunas que terminam com 2010 
  mutate(
   Codmun7 = as.character(Codmun7)
 )
dados_espaciais_municipios <- st_read("../Dados/Dados_geom/dados_espaciais_municipios_v2.gpkg")
causa_obito_puerperio_42_2012_2022 <- read_excel("../Dados/Dados_Transformados/Transformacao_parte_1/causa_obito_puerperio_42_2012_2022.xlsx")

causa_obito_puerperio_42_2012_2019<- read_excel("../Dados/Dados_Transformados/Transformacao_parte_1/causa_obito_puerperio_42_2012_2019.xlsx")

Visualizar tabelas

Tabela municĆ­pios

datatable(head(tabela_municipio),
          options=list(dom="t"), # Exibir só a tabela
          caption = "Primeiras linhas da tabela municĆ­pios"
  )

Dados socioconƓmicos

datatable(head(dados_socioeconomicos),
          options=list(dom="t"), # Exibir só a tabela
          caption = "Primeiras linhas da tabela Dados socioconƓmicos"
  )

1. Qual a quantidade de óbitos maternos em cada categoria?

Neste tópico, vamos analisar a quantidade total de óbitos, por categoria, ocorridos entre 2012 à 2022.

O puerpério até 42 dias após o parto é o momento em que ocorrem mais mortes. Ao investigarmos as causas dos óbitos desta categoria, vemos que problemas relacionados a doenças virais, são as maiores causas de óbito.

Isso provavelmente oconteceu por causa da COVID-19, possivelmente, a paciente foi para o hospital ter o bebĆŖ e acabou contraindo Covid.

Prova disso é que as causas do óbito, antes da pandemia, eram diferentes. Sendo a maior delas relacionadas ao aparelho circulatório, por exemplo, hipertensão pós-parto ou insuficiência cardíaca.

Outras causas estão relacionadas a hemorragias, infecções pós-parto, doenças respiratórias, convulsões que ocorrem com mulheres com pré-eclâmpsia.

quantidade_total <- tabela_municipio %>% 
                    # Agrupar pela coluna "Momento_do_Obito"
                    group_by(Momento_do_Obito) %>% 
                    reframe(
                      Total_entre_2012_2019 = sum(Ano_do_Obito >= 2012  & Ano_do_Obito <=2019),
                      Total_entre_2012_2022 = sum(Ano_do_Obito >= 2012  & Ano_do_Obito <=2022)) %>% 
                      mutate(
                        Momento_do_Obito = ifelse(is.na(Momento_do_Obito), "NA", Momento_do_Obito))%>%  
                      arrange(desc(Total_entre_2012_2022)) # Ordenar pelo valor da coluna "Total"
datatable(quantidade_total,
          options=list(dom="t"), # Exibir só a tabela
          caption = "Quantidade Total de óbitos maternos, por categoria"
  ) 
quantidade_total %>% 
  ggplot() +
  geom_col(aes(
           x=Total_entre_2012_2022, 
           y=fct_reorder(Momento_do_Obito, Total_entre_2012_2022)), #fct_reorder() -> Ordenar o eixo y
           fill = "#381850") + 
  labs(
    x = "Total (Contagem)",
    y = "Momento do Ɠbito Materno",
    title = "Total de óbitos materno, entre 2012 à 2022, no estado do RJ",
    subtitle = "Ocorrem mais óbitos no puérperio de até 42 dias após o parto"
  )+ 
  geom_text(aes(x=Total_entre_2012_2022, y=Momento_do_Obito, label = Total_entre_2012_2022, hjust=-0.3), size=3.0)+
  scale_x_continuous(expand = c(0.1, 0)) +  # Expande o eixo X para dar mais espaƧo
  theme_minimal() +
  theme(
  plot.title.position = "plot"    # Posiciona o tĆ­tulo no canto do plot
)

#  theme(
#  plot.title = element_text(hjust = 0), # Alinha o texto Ć  esquerda
#  plot.subtitle = element_text(hjust = 0),
#  plot.title.position = "plot"    # Posiciona o tĆ­tulo no canto do plot
# )

Investigar as causas do óbito no Puerpério, ocorridos até 42 dias após o parto

Entre 2012 Ć  2022

datatable(head(causa_obito_puerperio_42_2012_2022, 10),           
  options=list(dom='t'),           
  caption = "As maiores 10 causas de óbitos no Puerpério, ocorridos até 42 dias após o parto, entre 2012 à 2022")   

Entre 2012 Ć  2019

datatable(head(causa_obito_puerperio_42_2012_2019, 10),
          options=list(dom='t'),
          caption = "As maiores 10 causas de óbitos no Puerpério, ocorridos até 42 dias após o parto, entre 2012 à 2019")

2. Qual a quantidade de óbitos maternos em cada categoria, por ano?

Agora, vamos analisar a quantidade total de óbitos anuais, por categoria.
Ɖ possĆ­vel notar que todas as categorias se mantiveram estĆ”veis atĆ© 2019. A partir de 2020, houve um drĆ”stico aumento, principalmente, em óbitos durante a gravidez e o puĆ©rperio de atĆ© 42 dias após o parto. E, conforme dito no tópico anterior, isso provavelmente aconteceu por causa da Pandemia.

quantidade_total_anual <- tabela_municipio %>% 
                          group_by(Ano_do_Obito, Momento_do_Obito) %>% 
                          reframe(Total_de_Obitos_anuais = n()) %>% 
                          mutate(Momento_do_Obito = ifelse(is.na(Momento_do_Obito), "NA", Momento_do_Obito)) %>% 
                          arrange(desc(Total_de_Obitos_anuais))  
datatable(quantidade_total_anual,
          options = list(PageLength = 10),
          caption = "Total de óbitos maternos anuais, por categoria, ocorridos entre 2012 e 2022, no estado do RJ")
quant_anual <-quantidade_total_anual %>% 
          ggplot(aes(x = Ano_do_Obito, y = Total_de_Obitos_anuais, color = Momento_do_Obito)) + #, group = Momento_do_Obito
          geom_line() +
          labs(
            title = "Total anual de óbitos materno, entre 2012 à 2022, no estado do RJ",
            x = "Ano do Ɠbito",
            y = "Total de Ɠbitos Anuais"
          ) +
           scale_x_continuous(
             breaks = seq(min(quantidade_total_anual$Ano_do_Obito), max(quantidade_total_anual$Ano_do_Obito), by=1),
             labels = label_number(accuracy = 1)) +  # Remover casas decimais e usar ponto
theme_minimal()+
    theme(
    plot.title = element_text(size = 12), # Ajusta o tamanho da letra do tĆ­tulo
  )

ggplotly(quant_anual,width = 750)%>%
      layout(legend = list(x = 0.5,
                           y = -0.5,
                           xanchor = "center",
                           yanchor = "bottom",
                           orientation = "h"))%>%
  config(displayModeBar = FALSE) %>%  # Desativa a barra de ferramentas superior e o zoom com o scroll
  layout(
    xaxis = list(fixedrange = TRUE),  # Desativa o zoom no eixo X
    yaxis = list(fixedrange = TRUE)   # Desativa o zoom no eixo Y
  )
#%>%
#  config(displayModeBar = FALSE, scrollZoom = FALSE) %>%  # Desativa a barra de ferramentas superior e o zoom com o scroll
#  layout(
#    dragmode = "pan",  # Desativa o zoom e pan com dragmode
#    xaxis = list(fixedrange = TRUE),  # Desativa o zoom no eixo X
#    yaxis = list(fixedrange = TRUE)   # Desativa o zoom no eixo Y
#  )

3. Qual a Taxa média de óbitos maternos em cada categoria por município ?

Para verificar a quantidade de óbitos, fiz alguns mapas e histogramas. A taxa média de óbitos foi calculada da seguinte forma:

Em relação aos resultados abaixo, é possível observar um certo padrão nos municípios com as maiores taxas médias de óbitos de cada categoria.

  1. Muitos municípios, com altas taxas médias de óbitos, ficam próximos de outros com altas taxas . Como por exemplo, Rio Bonito e Saquarema, ou Cantagalo e Duas Barras. Isso é um indício de que a localização geogrÔfica pode influenciar na taxa média de óbito materno.
  2. Municípios do interior (como Resende e Volta Redonda) e da Baixa Fluminense (como Nova Iguaçu e Duque de Caxias ) tem altas taxas média de óbito materno. Algo que eles tem em comum é a pobreza, desigualdade social e falta de infraestrutura.

Preparar os dados

# Exibir a tabela
datatable(taxa_media_obito_1,
          options = list(pageLength = 5),
          caption = "Taxa média de óbitos maternos, por categoria, ocorridos entre 2012 e 2022, no estado do RJ")
# DimensƵes da tabela
dim(taxa_media_obito_1)
## [1] 92  8

Unir dados

Agora, vou unir a tabela criada acima com a tabela dados_espaciais_municipios, que contĆŖm as geometrias de cada municĆ­pio do RJ.
Em seguida, vou substituir as NA“s por zero, utilizando across()e coalesce().

taxa_e_geom<- dados_espaciais_municipios %>%
  left_join(taxa_media_obito_1, by = "Codmun7")  %>%  # Remover coluna redundante
  mutate(
    across(starts_with("T"), ~ coalesce(., 0))  # Substituir NA por 0 em colunas que comeƧam com "T"
  )

# OBS: coalesce() --> Substituir NA“s
#st_write(quantidade_muni_2b, "C:/Users/UsuƔrio/Documents/Disciplinas 2024.2/Introducao_a_Banco_de_Dados/Desafio_02/Dados/Dados_Transformados/Transformacao_parte_1/quantidade_muni_2b.gpkg")

#quantidade_muni_2b <- st_read("C:/Users/UsuƔrio/Documents/Disciplinas 2024.2/Introducao_a_Banco_de_Dados/Desafio_02/Dados/Dados_Transformados/Transformacao_parte_1/quantidade_muni_2b.gpkg")

Checar se a união deu certo

Agora eu vou checar se a união deu certo e se a tabela ainda tem informações espaciais.

# Verificar a classe do objeto
class(taxa_e_geom)
## [1] "sf"         "data.frame"

FunƧƵes

Função para criar histograma

# Função para criar o grÔfico
grafico_ranking <- function(data, var_x, var_y, titulo, lab_x, subtitulo=NULL) {
  data %>%
    arrange(desc(.data[[var_x]])) %>%
    head(10) %>%
    ggplot() +
    geom_col(
      aes(
        x = .data[[var_x]],
        y = fct_reorder(.data[[var_y]], .data[[var_x]])#fct_reorder() -> Ordenar o eixo y
      ),
      fill = "#381850"
    ) + 
    labs(
      x = lab_x,
      y = "MunicĆ­pio",
      title = titulo,
      subtitle = subtitulo # Adiciona o subtĆ­tulo apenas se fornecido
    ) + 
    geom_text(
      aes(
        x = .data[[var_x]],
        y = .data[[var_y]], 
        label =  round(.data[[var_x]], 2), # Arredonda as labels das barras
        hjust = -0.25
      ), 
      size = 3.0
    ) +
    # OBS: estou usando scale_x_continuous( ), pois a maior barra do grƔfico estava sendo "cortada"
     scale_x_continuous(
      expand = c(0, 0), # Remove expansão automÔtica
      limits = c(0, max(data[[var_x]]) * 1.3) # Define limite mƔximo 10% maior que o valor mƔximo
    )+  
    theme_minimal() +
    theme(
      # Tamanho da fonte e negrito do tƭtulo do grƔfico
      plot.title = element_text(size = 11, face = 'bold'),
      # Posiciona o tƭtulo no canto do grƔfico (plot)
      plot.title.position = "plot",
      # Tamanho da fonte e negrito do subtƭtulo do grƔfico
      plot.subtitle = element_text(size = 9), 
      # Tamanho dos rótulos dos eixos (axis) x e y
      axis.text.x = element_text(size = 8, color = "black"),  
      axis.text.y = element_text(size = 8, color = "black"),
      # Tamanho dos TĆ­tulo dos eixos (axis) x e y
      axis.title.x = element_text(size = 7, color = "gray37"),
      axis.title.y = element_text(size = 7, color = "gray37"),
      # Margens --> margin(top, right, bottom, left)
      plot.margin = margin(10,10,10,20)
    )
}

Função para criar mapas

# Função para criar o mapa
criar_mapa <- function(data, var, title, subtitulo = NULL) {
  # Filtrar os dados com valores diferentes de zero
  data_destacado <- data %>% 
    filter(.data[[var]] != 0) %>%
    arrange(desc(.data[[var]])) 
  
  # Selecionar os 10 maiores valores
  data_top10 <- data_destacado %>% 
    slice_head(n = 10)
  
  # Criação do mapa
  mapa <- ggplot() +
    # Camada 1: Todos os MunicĆ­pios (fundo cinza)
    geom_sf(
      data = data, 
      aes(text = paste("MunicĆ­pio: ", MunicĆ­pio,
                       "<br>", var, ": ", .data[[var]])),
      fill = "ghostwhite", 
      color = "black", 
      lwd = 0.1
    ) +
    # Camada 2: Todos os municĆ­pios com valores positivos (tom pastel)
    geom_sf(
      data = data_destacado, 
      aes(fill = .data[[var]], label = MunicĆ­pio),
      color = "black", 
      lwd = 0.1,
      alpha = 0.5  # TransparĆŖncia para tom pastel
    ) +
    # Camada 3: MunicĆ­pios com os 10 maiores valores
    geom_sf(
      data = data_top10, 
      aes(fill = .data[[var]], label = MunicĆ­pio),
      color = "black", 
      lwd = 0.9
    ) +
    # Paleta de cores
    scale_fill_viridis_c(
      option = "viridis", 
      name = "Tx. mƩdia por Municƭpio", 
      direction = -1
    ) +
    labs(title = title) +
    theme_minimal() +
    theme(
      legend.title = element_text(size = 9), 
      plot.title = element_text(size = 11, face = "bold", hjust = -1)
    )
  
  # Transformar o grƔfico em interativo com ggplotly
  ggplotly(mapa, width = 650) %>%
    config(displayModeBar = FALSE) %>%
    layout(
      title = list(
        text = paste0("<b>", title, "</b><br><sub>", subtitulo, "</sub>"),
        x = 0,
        xanchor = "left"
      ),
      xaxis = list(fixedrange = TRUE),
      yaxis = list(fixedrange = TRUE)
    )
}

Aplicar as FunƧƵes

Ɠbitos no parto, gravidez e puerpĆ©rio, entre 2012 Ć  2022

# Municípios do RJ com mais óbitos no parto, gravidez e puerpério, entre 2012 à 2022
rank_1 <- grafico_ranking(
  data = taxa_e_geom,
  var_x = "Tx_media_obito_Grav_Part_Puerp",
  var_y = "MunicĆ­pio",
  titulo = "Municípios do RJ com mais óbitos no parto, gravidez e puerpério, entre 2012 à 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)",
  lab_x = "Tx. média de óbitos no parto, gravidez e puerpério"
)
# Total de óbitos na gravidez, por Município do RJ, entre 2012 a 2022
mapa_1 <- criar_mapa(
  data = taxa_e_geom,
  var = "Tx_media_obito_Grav_Part_Puerp",
  title = "Ɠbitos no parto, gravidez e puerpĆ©rio, por MunicĆ­pio do RJ, entre 2012 a 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Ɠbitos na gravidez, entre 2012 a 2022

# Municípios do RJ com mais óbitos na gravidez, entre 2012 a 2022
rank_2 <- grafico_ranking(
  data = taxa_e_geom,
  var_x = "Tx_media_obito_Gravidez",
  var_y = "MunicĆ­pio",
  titulo = "Ɠbitos na gravidez",
  lab_x = "Tx. média de óbitos na gravidez"
)
# Total de óbitos na gravidez, por Município do RJ, entre 2012 a 2022
mapa_2 <- criar_mapa(
  data = taxa_e_geom,
  var = "Tx_media_obito_Gravidez",
  title = "Ɠbitos na gravidez, por Municƭpio do RJ, entre 2012 a 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Ɠbitos no parto, entre 2012 a 2022

# Municípios do RJ com mais óbitos no parto, entre 2012 a 2022
rank_3 <- grafico_ranking(
  data = taxa_e_geom,
  var_x = "Tx_media_obito_Parto",
  var_y = "MunicĆ­pio",
  titulo = "Ɠbitos no parto",
  lab_x = "Tx. média de óbitos na Parto"
)
# Total de óbitos no parto, por Município do RJ, entre 2012 a 2022
mapa_3 <- criar_mapa(
  data = taxa_e_geom,
  var = "Tx_media_obito_Parto",
  title = "Ɠbitos no parto, por Municƭpio do RJ, entre 2012 a 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Ɠbitos no puĆ©rperio de atĆ© 42 dias após o parto, entre 2012 a 2022

# Municípios do RJ com mais óbitos no puérperio de até 42 dias após o parto, entre 2012 a 2022
rank_4 <- grafico_ranking(
  data = taxa_e_geom,
  var_x = "Tx_media_obito_Puerp_42",
  var_y = "MunicĆ­pio",
  titulo = "Ɠbitos no puĆ©rperio de atĆ© 42 dias",
  lab_x = "Tx. média de óbitos no puerpério de até 42 dias"
)
# Total de óbitos no puerpério de até 42 dias, por Município do RJ, entre 2012 a 2022
mapa_4 <- criar_mapa(
  data = taxa_e_geom,
  var = "Tx_media_obito_Puerp_42",
  title = "Ɠbitos no puerpĆ©rio de atĆ© 42 dias",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Ɠbitos no puĆ©rperio de 43 dias a 1 ano após o parto, entre 2012 a 2022

# Municípios do RJ com mais óbitos no puérperio de 43 dias a 1 ano após o parto, entre 2012 a 2022
rank_5 <- grafico_ranking(
  data = taxa_e_geom,
  var_x = "Tx_media_obito_Puerp_43_1ano",
  var_y = "MunicĆ­pio",
  titulo = "Ɠbitos no puĆ©rperio de 43 dias a 1 ano",
  lab_x = "Tx. média de óbitos no puerpério de 43 dias à 1 ano"
)
# Total de óbitos no puerpério de 43 dias a 1 ano após o parto, por Município do RJ, entre 2012 a 2022
mapa_5 <- criar_mapa(
  data = taxa_e_geom,
  var = "Tx_media_obito_Puerp_43_1ano",
  title = "Ɠbitos no puerpĆ©rio de 43 dias a 1 ano, por MunicĆ­pio do RJ, entre 2012 a 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Ranking: Municípios do RJ com mais óbitos no parto, gravidez e puerpério, entre 2012 à 2022

rank_1

Ranking: Municípios do RJ com mais óbitos por categoria, entre 2012 a 2022

# Configurar o tĆ­tulo 
titulo_painel <- textGrob(
  "Municípios do RJ com mais óbitos maternos, por categoria (2012 a 2022)",
  gp = gpar(fontsize = 14, fontface = "bold", col = "black"),  
  hjust = 0, # Alinha o texto Ć  esquerda
  x=0) # definir margem Ć  esquerda 


# Configurar o subtĆ­tulo
subtitulo_painel <- textGrob(
  "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos), de cada município, entre 2012 a 2022",
  gp = gpar(fontsize = 9, fontface = "italic", col = "gray40"), hjust = 0, x=0)

# Combinar tĆ­tulo e subtĆ­tulo em um Ćŗnico grob
titulo_completo <- arrangeGrob(
  titulo_painel,
  subtitulo_painel,
  ncol = 1
)

# Criar o painel
grid.arrange(
  rank_2, rank_3, rank_4, rank_5,
  ncol = 2, 
  nrow = 2,
  top =titulo_completo, # TĆ­tulo do painel
  padding = unit(1, "cm") # EspaƧamento entre os grƔficos
)

Mapas

mapa_1
mapa_2
mapa_3
mapa_4
mapa_5

4. AnÔlise de Correlação entre óbitos maternos e os indicadores socioeconÓmicos

As variĆ”veis socioconĆ“micas que tem maior correlação o total de obito materno em cada categoria sĆ£o: população, PIB por municĆ­pio e ā€œVAB_Administracao_Defesa_Educacao_Saude_publica_Seguridade_Socialā€, essa Ćŗltima estĆ” relacionada aos gastos pĆŗblicos com saĆŗde, educação, aposentadoria e etc. JĆ” o PIB por municĆ­pio define o consumo, que impacta na arrecadação de impostos. Portanto, faz sentido essas duas variĆ”veis serem altamente correlacionadas com o total de óbitos.

Também faz sentido a variÔvel População ser correlacionada, pois quanto maior o tamanho da população de um lugar, maiores as chances de óbito.

Preparar a base

indicadores <- dados_socioeconomicos %>% 
  select(- c("Codigo_UF",
             "Municipio",
    "Codigo_Mesorregiao",
             "Sigla_UF",
             "Nome_Mesorregiao",
             "Nome da Microrregião",
             "Codigo_Microrregiao", 
             "Codigo_Regiao_Geografica_Imediata",
             "Nome_Regiao_Geografica_Imediata")) %>% 
     mutate(Codmun7 = as.character(Codmun7),
            Codmun6 = as.character(Codmun6)
            )

datatable(head(indicadores),
          options = list(dom='t'))
names(obitos_em_relacao_a_populacao_1)
##  [1] "Codmun6"                          "Codmun7"                         
##  [3] "Municipio"                        "Ano"                             
##  [5] "Total_Obito_Outras_categorias"    "Total_Obito_Puerp_42_parto"      
##  [7] "Total_Obito_Puerp_43_1ano"        "Total_Obito_Gravidez"            
##  [9] "Total_Obito_Parto"                "Total_Obito_NA"                  
## [11] "TOTAL_Grav_Part_Puerp"            "TOTAL_todas_categorias"          
## [13] "Populacao_feminina_total_por_ano" "obitos_relac_pop_Grav_Part_Puerp"
## [15] "obitos_relac_pop_Gravidez"        "obitos_relac_pop_Parto"          
## [17] "obitos_relac_pop_Puerp_42_parto"  "obitos_relac_pop_Puerp_43_1ano"
obitos_pop <- obitos_em_relacao_a_populacao_1 %>% select(
                Codmun6, Codmun7, Ano,
                Municipio, Total_Obito_Gravidez,
                Total_Obito_Parto, Total_Obito_Puerp_42_parto, 
                Total_Obito_Puerp_43_1ano,
                TOTAL_Grav_Part_Puerp)
tx_e_indicadores <-obitos_pop %>% 
                  left_join(indicadores, by= c("Codmun7","Codmun6", "Ano" ))

Calcular correlação

# Calcular a correlação
correlacao <- tx_e_indicadores %>%
  select(-c(Codmun7, Codmun6, Ano, Municipio)) %>% # Remover as colunas irrelevantes
  select(where(is.numeric)) %>%                   # Selecionar apenas colunas numƩricas
  as.matrix() %>%                                 # Converter em matriz
  rcorr()                                         # Calcular a correlação


# Mostrar resultados
# correlacao$r  # Matriz de correlação
# correlacao$n  # Número de pares usados para calcular cada correlação
# correlacao$P  # Valores p para cada correlação
# Dividir a correlação em partes menores
correlacao_reduzida_1 <- correlacao$r[c(1:5), 6:11]
correlacao_reduzida_2 <- correlacao$r[c(1:5), 12:16]
#melt(correlacao_reduzida_2) # --> library(reshape2)
correlacao_reduzida_3 <- correlacao$r[c(1:5), 14:18]

Função para criar grÔfico de correlação

# Função correlação
grafico_correlacao <- function(correlacao_reduzida_3, matriz_p) {
  ggcorrplot(
    correlacao_reduzida_3,
    hc.order = TRUE,  # Agrupar as variƔveis
    type = "lower",   # Esconder o espelhamento
    lab = TRUE,       # Mostrar os valores das correlaƧƵes
    lab_size = 3,     # Tamanho da fonte com o valor da correlação
    p.mat = matriz_p, # Matriz de p-valores
    sig.level = 0.05, # Nível de significância de 5%
    insig = "blank",  # Deixar em branco os p-valores estatisticamente insignificantes
    colors = c("#E69F00", "white", "#954ECA") # Cores: negativa, neutra, positiva
  ) +
  labs(
    title = "Matriz de Correlação",
    subtitle = "Correlação considerando o p-valor"
  ) +
  theme(
    axis.text.x = element_text(size = 7, angle = 25),
    axis.text.y = element_text(size = 8)
  )
}

Aplicar a função

grafico_correlacao(correlacao_reduzida_1, correlacao$P)

grafico_correlacao(correlacao_reduzida_2, correlacao$P)

grafico_correlacao(correlacao_reduzida_3, correlacao$P)

5. Quais municípios têm as maiores taxas médias de óbito maternos, para cada categoria de raça/cor?

Preparar os dados

Farei a mesma preparação do tópico 3.

Tabela 1 - Taxa média de óbito + geom

taxa_e_geom_2<- dados_espaciais_municipios %>%
  left_join(taxa_media_obito_2, by = "Codmun7")  %>%  # Remover coluna redundante
  mutate(
    across(starts_with("T"), ~ coalesce(., 0))  # Substituir NA por 0 em colunas que comeƧam com "T"
  )

# OBS: coalesce() --> Substituir NA“s
# Verificar a classe do objeto
class(taxa_e_geom_2)
## [1] "sf"         "data.frame"

Tabela 2 - População por raça/cor + geom

pop_2022 <- populacao_2022 %>% 
 pivot_longer(
    cols = starts_with("Mulher") & ends_with("2022"),  # Selecione as colunas
    names_to = "Raca_Cor",  # Nome da nova coluna que agrupa os valores
    values_to = "Populacao_por_Raca_Cor"     # Nome da coluna para os valores correspondentes
  ) %>%
  # Remover "Mulher" e "2022" da coluna "Raca_Cor"
  mutate(
    Raca_Cor = str_remove(Raca_Cor, "Mulher_"),  # Remove "Mulher_"
    Raca_Cor = str_remove(Raca_Cor, "_2022")     # Remove "_2022"
  ) %>% 
  select(- c(Pop_Total_Mulheres_por_faixa_etaria_2022,Faixa_Etaria)) %>% 
  group_by(Codmun7, Municipio,Raca_Cor) %>% 
  reframe(Populacao_por_Raca_Cor = sum(Populacao_por_Raca_Cor, rm.na=TRUE)) %>% 
  distinct()
pop_2022 <- pop_2022  %>% 
  mutate(Municipio = sub("\\(RJ\\)$", "", Municipio))%>%
  # Preencher todos os NAs com 0
  mutate_all(~replace(., is.na(.), 0))
pop_2022_geom <- dados_espaciais_municipios %>% 
                 left_join(pop_2022, by="Codmun7")

Aplicar as funções do Tópico 3

Categoria de Cor/RaƧa: Branca

rank_1b <- grafico_ranking(
  data = taxa_e_geom_2,
  var_x = "Tx_media_obito_Branca",
  var_y = "Municipio",
  titulo = "Categoria Cor/RaƧa: Branca",
  subtitulo = "",
  lab_x = "Tx. média de óbitos maternos de mulheres brancas"
)
mapa_1b <- criar_mapa(
  data = taxa_e_geom_2,
  var = "Tx_media_obito_Branca",
  title = "Ɠbitos de mulheres brancas, por Municƭpio do RJ, entre 2012 a 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)
filtro_1b1 <- pop_2022_geom %>% filter(Raca_Cor == "Branca")


mapa_1b1 <- criar_mapa(
  data = filtro_1b1,
  var = "Populacao_por_Raca_Cor",
  title = "População de mulheres brancas, por Município do RJ, em 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Categoria de Cor/RaƧa: Preta

rank_2b <- grafico_ranking(
  data = taxa_e_geom_2,
  var_x = "Tx_media_obito_Preta",
  var_y = "Municipio",
  titulo = "Categoria Cor/RaƧa: Preta",
  subtitulo = "",
  lab_x = "Tx. média de óbitos maternos de mulheres pretas"
)
mapa_2b <- criar_mapa(
  data = taxa_e_geom_2,
  var = "Tx_media_obito_Preta",
  title = "Ɠbitos de mulheres pretas, por Municƭpio do RJ, entre 2012 a 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)
filtro_2b1 <- pop_2022_geom %>% filter(Raca_Cor == "Preta")


mapa_2b1 <- criar_mapa(
  data = filtro_2b1,
  var = "Populacao_por_Raca_Cor",
  title = "População de mulheres pretas, por Município do RJ, em 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Categoria de Cor/RaƧa: Parda

rank_3b <- grafico_ranking(
  data = taxa_e_geom_2,
  var_x = "Tx_media_obito_Parda",
  var_y = "Municipio",
  titulo = "Categoria Cor/RaƧa: Parda",
  subtitulo = "",
  lab_x = "Tx. média de óbitos maternos de mulheres pardas"
)
mapa_3b <- criar_mapa(
  data = taxa_e_geom_2,
  var = "Tx_media_obito_Parda",
  title = "Ɠbitos de mulheres pardas, por Municƭpio do RJ, entre 2012 a 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)
filtro_3b1 <- pop_2022_geom %>% filter(Raca_Cor == "Parda")


mapa_3b1 <- criar_mapa(
  data = filtro_3b1,
  var = "Populacao_por_Raca_Cor",
  title = "População de mulheres pardas, por Município do RJ, em 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Categoria de Cor/RaƧa: Amarela

rank_4b <- grafico_ranking(
  data = taxa_e_geom_2,
  var_x = "Tx_media_obito_Amarela",
  var_y = "Municipio",
  titulo = "Categoria Cor/RaƧa: Amarela",
  subtitulo = "",
  lab_x = "Tx. média de óbitos maternos de mulheres amarelas"
)
mapa_4b <- criar_mapa(
  data = taxa_e_geom_2,
  var = "Tx_media_obito_Amarela",
  title = "Ɠbitos de mulheres amarela, por Municƭpio do RJ, entre 2012 a 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)
filtro_4b1 <- pop_2022_geom %>% filter(Raca_Cor == "Amarela")


mapa_4b1 <- criar_mapa(
  data = filtro_4b1,
  var = "Populacao_por_Raca_Cor",
  title = "População de mulheres Amarela, por Município do RJ, em 2022",
  subtitulo = "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos)"
)

Ranking MunicĆ­pios

library(grid)
# Configurar o tĆ­tulo 
titulo_painel <- textGrob(
  "Municípios com maiores as taxas médias de óbito maternos, para cada categoria de raça/cor",
  gp = gpar(fontsize = 14, fontface = "bold", col = "black"),  
  hjust = 0, # Alinha o texto Ć  esquerda
  x=0) # definir margem Ć  esquerda 


# Configurar o subtĆ­tulo
subtitulo_painel <- textGrob(
  "Taxa média de óbitos por 100.000 habitantes femininos (10 a 49 anos), de cada município, entre 2012 a 2022",
  gp = gpar(fontsize = 9, fontface = "italic", col = "gray40"), hjust = 0, x=0)

# Configurar o subtĆ­tulo
subtitulo_painel_1 <- textGrob(
  "Categorias de Cor/RaƧa, de acordo com o IBGE",
  gp = gpar(fontsize = 6, fontface = "italic", col = "gray40"), hjust = 0, x=0)

# Combinar tĆ­tulo e subtĆ­tulo em um Ćŗnico grob
titulo_completo <- arrangeGrob(
  titulo_painel,
  subtitulo_painel,
  subtitulo_painel_1 ,
  ncol = 1
  )

# Criar o painel
grid.arrange(
  rank_1b, rank_2b, rank_3b, rank_4b,
  ncol = 2, 
  nrow = 2,
  top =titulo_completo, # TĆ­tulo do painel
  padding = unit(1, "cm") # EspaƧamento entre os grƔficos
)

Mapas

Categoria de Cor/RaƧa: Branca

mapa_1b
mapa_1b1

Categoria de Cor/RaƧa: Preta

mapa_2b
mapa_2b1

Categoria de Cor/RaƧa: Parda

mapa_3b
mapa_3b1

Categoria de Cor/RaƧa: Branca

mapa_4b
mapa_4b1

6. Existe alguma associação entre o momento do óbito e as categorias de raça/cor?

Para responder esta pergunta, eu criei uma tabela de contigência e um teste de hipótese, cujas hipótese são:

\(H_0:\) Não existe associação significativa entre as variÔveis Raca_Cor e Momento_do_Obito.

\(H_1:\) Existe associação significativa entre as variÔveis Raca_Cor e Momento_do_Obito. Ou seja, o momento do óbito estÔ relacionado à cor/raça das mulheres.

O teste rejeitou a hipótese nula, mostrando que, possivelmente, existe associação entre as variÔveis, indicando que o momento do óbito varia conforme a raça/cor da mulher.

Isso também é destacado na tabela de contigência, onde, por exemplo mulheres pretas e pardas morrem mais no puerpério entre 43 dias a 1 ano, após o parto (se comparado com outras categorias).

table_contingencia <- as.data.frame.matrix(
  table(tabela_municipio$Raca_Cor, tabela_municipio$Momento_do_Obito))

datatable(table_contingencia,
          options=list(dom='t'))
# Teste qui-quadrado
#teste_chi2 <- chisq.test(table_contingencia)

# Teste exato de Fisher
#teste_fisher <- fisher.test(table_contingencia)

# Teste exato de Fisher com simulação
teste_fisher <- fisher.test(table_contingencia, simulate.p.value = TRUE, B = 500000) 
# B --> Quantidade de simulaƧƵes
teste_fisher
## 
##  Fisher's Exact Test for Count Data with simulated p-value (based on
##  5e+05 replicates)
## 
## data:  table_contingencia
## p-value = 0.4043
## alternative hypothesis: two.sided

7. Perfil - óbitos maternos na faixa etÔria entre 10 a 14 anos

Podemos notar que a maioria dos municípios em que jÔ ocorreram óbitos maternos nesta faixa etÔria se encontra na baixada fluminense (São joão de Meriti, Duque de Caxias e Nova Iguaçu), além do Rio de Janeiro, Resende (região Sul Fluminense) e Campo dos Goytacazes e Petropólis.

A maioria dessas meninas era da cor ā€œPardaā€, 66% delas tinham emprego e 33% delas tinha só atĆ© 3 anos de estudo.

Além disso, os óbitos ocorreram, ou na gravidez ou no puerpério.

Gestações nesta faixa etÔria são muito críticas por diversos motivos, como o fato de terem sido frutos de pedofilia.

obitos_10_14_anos <- tabela_municipio %>% 
                     filter(Idade_Categoria == "10 a 14 anos")

Tabela com o resumo dos dados

datatable(obitos_10_14_anos,
          options = list (dom ='t'))

Muncípios do RJ que ocorreram óbitos maternos, na faixa etÔria entre 10 a 14 anos

obitos_10_14_anos_1 <- dados_espaciais_municipios %>% 
 left_join(tabela_municipio, by= "Codmun7") %>% 
                     filter(Idade_Categoria == "10 a 14 anos")%>% 
                       rename(MunicĆ­pio = MunicĆ­pio.x)


class(obitos_10_14_anos_1)  
## [1] "sf"         "data.frame"
mapa_10_14 <- ggplot() +
  geom_sf(
    data = dados_espaciais_municipios, 
    aes(text = paste("MunicĆ­pio: ", MunicĆ­pio)), 
    fill = "ghostwhite", 
    color = "black", 
    lwd = 0.1
  ) +
  geom_sf(
    data = obitos_10_14_anos_1, 
    aes(fill = Momento_do_Obito,
        text = paste("MunicĆ­pio: ", MunicĆ­pio)),  
    color = "black", 
    lwd = 0.1,
    alpha = 0.5
  ) +
  labs(title = "title" ) +
  theme_minimal() +
  theme(
    legend.title = element_text(size = 9), 
    plot.title = element_text(size = 11, face = "bold", hjust = -1)
  )

ggplotly(mapa_10_14, width = 650) %>%
  config(displayModeBar = FALSE) %>%
  layout(
    title = list(
      text = paste0("<b>", "Muncípios do RJ que ocorreram óbitos maternos", 
                    "</b><br><sub>", "Na faixa etƔria entre 10 a 14 anos ", "</sub>"),
      x = 0,
      xanchor = "left"
    ),
    xaxis = list(fixedrange = TRUE),
    yaxis = list(fixedrange = TRUE),
    legend = list(x = 0.5,
                 y = -0.2,
                 xanchor = "center",
                 yanchor = "bottom",
                 orientation = "h")) 

Contagem de óbitos maternos, separados por raça/cor, na Faixa EtÔria de 10 a 14 anos

# Criar tabela de contagem
tabela_contagem <- obitos_10_14_anos_1 %>%
  count(Raca_Cor, name = "Contagem")
grafico_raca_cor <- ggplot(tabela_contagem, aes(x = Raca_Cor, y = Contagem, fill = Raca_Cor)) +
  geom_col() +
  geom_text(aes(label = Contagem), vjust = -0.3, color = "black", size = 4) + # Ajuste no posicionamento do rótulo
  labs(
    title = "Contagem de óbitos maternos, separados por raça/cor",
    subtitle = "Faixa EtƔria de 10 a 14 anos",
    x = "",
    y = "Contagem",
    fill = "RaƧa/Cor"
  ) +
  scale_fill_manual(values = c(
    "Branca" = "#954ECA",
    "Preta" = "#56B4E9",
    "Parda" = "#009E73",
    "Amarela" = "#E69F00"
  )) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.x = element_text(angle = 0, hjust = 0.5),
    plot.margin = margin(10, 15, 20, 15) # margem 
  ) +
  expand_limits(y = max(tabela_contagem$Contagem) * 1.1) # Aumentar o limite do eixo Y


print(grafico_raca_cor)

AnÔlise multivariada de classificação (Clusters hierarquicos por componentes princiais)

Para a classificação desses municípios, utilizarei o método de clusters hierÔrquicos. O objetivo é entender o perfil dos municípios, em relação as variÔveis socioecÓnomicas. Eu vou utilizar o ano de 2021 por ser recente e ter mais informações socioeconomicas na tabela (se comparado ao ano de 2022, por exemplo).

Primeiro, eu vou preparar a base e olhar as informaƧƵes socieconomicas de 2021.

Preparar a base

final<-read.csv2('../Dados/0.Tabelas/final.csv')
# Retirando linhas com NA“s
finalt <- final[-c(1, 917, 918, 919, 920), ]
# Filtrando o Ano de 2021
final_2021<-finalt%>%filter(
  Ano==2021)

Criando a variƔvel morte

mortes_municipio<-tabela_municipio %>% group_by(MunicĆ­pio)%>%summarise(
  mortes = sum(Contagem_Obitos)
)
mortes_municipio1 <- merge(
  mortes_municipio,              # DataFrame principal
  tabela_municipio[, c("MunicĆ­pio", "Codmun7")],  # Seleciona as colunas relevantes
  by = "Município",              # Faz a junção com base na coluna "Município"
  all.x = TRUE                   # Preserva todas as linhas de mortes_municipio
)

mortes_municipio1 <- mortes_municipio1[!duplicated(mortes_municipio1$Codmun7), ]
final_2021e <- merge(
  final_2021,                 # DataFrame principal
  mortes_municipio1[, c("Codmun7", "mortes")],  # Seleciona as colunas relevantes
  by = "Codmun7",             # Faz a junção com base na coluna "Codmun7"
  all.x = TRUE                # Preserva todas as linhas de final_2021
)
final_2021 <- final_2021e %>%
  mutate(mortes = if_else(is.na(mortes), 0, mortes)) 
df<-final_2021%>%select(Impostos_liquidos_de_subsidios,
                                 VAB_Agropecuaria,
                              VAB_Servico,
                      VAB_Administracao_Defesa_Educacao_Saude_publica_Seguridade_social,
                      PIB_Municipio,
                      Populacao,
                      Rendimento_medio_no_setor_formal,
                      Valor_medio_Internacoes_hospitalares,
                      Porcentagem_de_meninas_de_10_a_14_anos_de_idade_que_tiveram_filhos,
                      Porcentagem_de_adolescentes_de_15_a_17_anos_de_idade_que_tiveram_filhos,
                        mortes
  )

Dados SocioeconƓmicos

Os valores das categorias foram obtidos atrƔves da mƩdia de cada variƔvel.

Produto interno Bruto (Mapa)

Neste mapa, os municípios do estado do Rio de Janeiro estão divididos em três categorias com base no PIB municipal:

  1. Entre R$ 900 milhões e R$ 2 bilhões (classificação média);
  2. Abaixo de R$ 900 milhƵes;
  3. Acima de R$ 2 bilhƵes.

A produção interna do município constitui o principal fator para a arrecadação tributÔria local, influenciando diretamente as possibilidades de investimento em políticas públicas, especialmente na Ôrea da saúde.

final_2021_pibm<-final_2021 %>% filter(
  PIB_Municipio>=900000000&
    PIB_Municipio<=2000000000
)
final_2021_pibam<-final_2021 %>% filter(
  PIB_Municipio<900000000
 )

final_2021_pibacm<-final_2021 %>% filter(
  PIB_Municipio>2000000000
)

mapa_filtrado_pibm<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% final_2021_pibm$Municipio)

mapa_filtrado_pibam<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% final_2021_pibam$Municipio) 

mapa_filtrado_pibacm<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% final_2021_pibacm$Municipio)

mapa_filtrado_pibm$cat_pib <- "Próximos da média"
mapa_filtrado_pibam$cat_pib <- "Abaixo da mƩdia"
mapa_filtrado_pibacm$cat_pib <- "Acima da mƩdia"

# Criar o grƔfico
ggplot() +
  # Mapa de base
  geom_sf(data = dados_espaciais_municipios, fill = "gray90", color = "black") +
  
  # Mapeando a cor de acordo com a categoria 'cat_pib'
  geom_sf(data = mapa_filtrado_pibm, aes(fill = cat_pib), color = "black") +
  geom_sf(data = mapa_filtrado_pibam, aes(fill = cat_pib), color = "black") +
  geom_sf(data = mapa_filtrado_pibacm, aes(fill = cat_pib), color = "black") +
  
  # Definindo as cores para as categorias
  scale_fill_manual(values = c("Próximos da média" = "#381850", 
                               "Abaixo da mƩdia" = "#2C848C", 
                               "Acima da mƩdia" = "#F5E62B")) +
  
  theme_minimal() +
  labs(title = "Produto Interno Bruto 2021",
       subtitle = "Municipal",
       fill = "Legenda")

Gasto pĆŗblico

Outra variÔvel que considero decisiva para o número específico de mortes analisado é o gasto público municipal, que inclui os investimentos em saúde. Em grande parte dos municípios, aproximadamente 65 localidades no estado do Rio de Janeiro, o gasto público foi inferior a R$ 900 milhões, como é possível observar no mapa. Além disso, 15 municípios apresentaram gastos próximos à média, enquanto 11 superaram esse patamar.

final_2021_gpm<-final_2021 %>% filter(
  VAB_Administracao_Defesa_Educacao_Saude_publica_Seguridade_social>=900000000&
    VAB_Administracao_Defesa_Educacao_Saude_publica_Seguridade_social<=2000000000
)

final_2021_gpam<-final_2021 %>% filter(
  VAB_Administracao_Defesa_Educacao_Saude_publica_Seguridade_social<900000000
)

final_2021_gpacm<-final_2021 %>% filter(
  VAB_Administracao_Defesa_Educacao_Saude_publica_Seguridade_social>2000000000
)

mapa_filtrado_gpm<- dados_espaciais_municipios%>%
  filter(MunicĆ­pio %in% final_2021_gpm$Municipio)

mapa_filtrado_gpam<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% final_2021_gpam$Municipio) 

mapa_filtrado_gpacm<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio%in% final_2021_gpacm$Municipio)

mapa_filtrado_gpm$cat_pib <- "Próximos da média"
mapa_filtrado_gpam$cat_pib <- "Abaixo da mƩdia"
mapa_filtrado_gpacm$cat_pib <- "Acima da mƩdia"

# Criar o grƔfico
ggplot() +
  # Mapa de base
  geom_sf(data = dados_espaciais_municipios, fill = "gray90", color = "black") +
  
  # Mapeando a cor de acordo com a categoria 'cat_pib'
  geom_sf(data = mapa_filtrado_gpm, aes(fill = cat_pib), color = "black") +
  geom_sf(data = mapa_filtrado_gpam, aes(fill = cat_pib), color = "black") +
  geom_sf(data = mapa_filtrado_gpacm, aes(fill = cat_pib), color = "black") +
  
  # Definindo as cores para as categorias
  scale_fill_manual(values = c("Próximos da média" = "#381850", 
                               "Abaixo da mƩdia" = "#2C848C", 
                               "Acima da mƩdia" = "#F5E62B")) +
  
  theme_minimal() +
  labs(title = "Gasto pĆŗblico",
       subtitle = "Municipal",
       fill = "Legenda")

População

Outra variÔvel relevante para compreender essas mortes é a população. Observa-se que o mapa da distribuição populacional apresenta grande semelhança com o mapa do gasto público, evidenciando uma possível correlação entre esses dois fatores.

final_2021_popm<-final_2021 %>% filter(
  Populacao>=100000&
    Populacao<=250000)

final_2021_popam<-final_2021 %>% filter(
  Populacao<100000)


final_2021_popacm<-final_2021 %>% filter(
  Populacao>250000)


mapa_filtrado_popm<-  dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% final_2021_popm$Municipio)

mapa_filtrado_popam<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% final_2021_popam$Municipio) 

mapa_filtrado_popacm<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% final_2021_popacm$Municipio)

mapa_filtrado_popm$cat_pib <- "Próximos da média"
mapa_filtrado_popam$cat_pib <- "Abaixo da mƩdia"
mapa_filtrado_popacm$cat_pib <- "Acima da mƩdia"

# Criar o grƔfico
ggplot() +
  # Mapa de base
  geom_sf(data = dados_espaciais_municipios, fill = "gray90", color = "black") +
  
  # Mapeando a cor de acordo com a categoria 'cat_pib'
  geom_sf(data = mapa_filtrado_popm, aes(fill = cat_pib), color = "black") +
  geom_sf(data = mapa_filtrado_popam, aes(fill = cat_pib), color = "black") +
  geom_sf(data = mapa_filtrado_popacm, aes(fill = cat_pib), color = "black") +
  
  # Definindo as cores para as categorias
  scale_fill_manual(values = c("Próximos da média" = "#381850", 
                               "Abaixo da mƩdia" = "#2C848C", 
                               "Acima da mƩdia" = "#F5E62B"))  +
  
  theme_minimal() +
  labs(title = "População 2021",
       subtitle = "Municipal",
       fill = "Legenda")

Cluster

Inicialmente, construirei uma matriz contendo apenas as variÔveis numéricas, que serão padronizadas para evitar discrepâncias devido às diferenças de escala. A partir da matriz padronizada, estimarei a matriz de distância euclidiana. Com base nessa matriz, treinarei o algoritmo de clusters hierÔrquicos para definir os agrupamentos e, em seguida, estimar o dendrograma, que auxiliarÔ na anÔlise e visualização das hierarquias entre os municípios.

df<-final_2021%>%select(Impostos_liquidos_de_subsidios,
                                 VAB_Agropecuaria,
                              VAB_Servico,
                      VAB_Administracao_Defesa_Educacao_Saude_publica_Seguridade_social,
                      PIB_Municipio,
                      Populacao,
                      Rendimento_medio_no_setor_formal,
                      Valor_medio_Internacoes_hospitalares,
                      Porcentagem_de_meninas_de_10_a_14_anos_de_idade_que_tiveram_filhos,
                      Porcentagem_de_adolescentes_de_15_a_17_anos_de_idade_que_tiveram_filhos
                        
  )
#Padronização
df_pad <- scale(df)

# Criar a matriz de distâncias usando a distância euclidiana
matriz_dist <- dist(df_pad, method = "euclidean")

# Clusterização hierÔrquica usando o método de ligação completa
hclust_model <- hclust(matriz_dist, method = "complete")

plot(hclust_model, main = "Dendrograma", xlab = "ObservaƧƵes", sub = "", cex = 0.8)

Escolha dos clusters

Com base no dendrograma, em uma anÔlise inicial e informal, identifico a presença de cinco grupos distintos na amostra. O objetivo da anÔlise de clusters é agrupar municípios que apresentem maior proximidade entre si em relação às variÔveis analisadas. Nesse contexto, acredito que hÔ cinco grupos de municípios no estado do Rio de Janeiro que compartilham características similares.

num_clusters <- 5
clusters <- cutree(hclust_model, k = num_clusters)

# Adicionar os clusters ao DataFrame original


final_2021<-final_2021 %>%mutate(cluster=clusters )

Clusters no mapa

O mapa de cluster estÔ bem proximo dos mapas anteriores, pricipalmente em relação ao mapa da população e do gasto público

#mapa_rj <- read_municipality(code_muni = "RJ", year = 2021)

# Filtrar municĆ­pios de cada cluster
cluster_1<-final_2021 %>%filter(cluster==1)

mapa_filtrado_1<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% cluster_1$Municipio)

cluster_2<-final_2021 %>%filter(cluster==2)

mapa_filtrado_2<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% cluster_2$Municipio)

cluster_3<-final_2021 %>%filter(cluster==3)

mapa_filtrado_3<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% cluster_3$Municipio)


# mapa do cluster 4 ####

cluster_4<-final_2021 %>%filter(cluster==4)


mapa_filtrado_4<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio %in% cluster_4$Municipio)



# cluster 5
cluster_5<-final_2021 %>%filter(cluster==5)


mapa_filtrado_5<- dados_espaciais_municipios %>%
  filter(MunicĆ­pio =="Rio de Janeiro") 

# Especificar o nĆŗmero do cluster
mapa_filtrado_1$Cluster <- "Cluster 1"
mapa_filtrado_2$Cluster <- "Cluster 2"
mapa_filtrado_4$Cluster <- "Cluster 4"
mapa_filtrado_3$Cluster <- "Cluster 3"
mapa_filtrado_5$Cluster <- "Cluster 5"
# Criar o grƔfico clusters ####
ggplot() +
  geom_sf(data = dados_espaciais_municipios, fill = "lightgray", color = "black")+
     geom_sf(data = mapa_filtrado_1, aes(fill = Cluster), color = "black") +
  geom_sf(data = mapa_filtrado_5, aes(fill = Cluster), color = "black") +
  geom_sf(data = mapa_filtrado_2, aes(fill = Cluster), color = "black") +
  geom_sf(data = mapa_filtrado_4, aes(fill = Cluster), color = "black") +
  geom_sf(data = mapa_filtrado_3, aes(fill = Cluster), color = "black") +
  scale_fill_manual(values = c("Cluster 1" = "#381850", 
                               "Cluster 2" =  "blue",#3366FF", 
                               "Cluster 3" = "#F5E62B", 
                               "Cluster 4" = "#2C848C", 
                               "Cluster 5" = "#FF9900")) +
  
  theme_minimal() +
  labs(title = "Clusters no mapa",
       subtitle = "Rio de Janeiro 2021",
       fill = "Clusters")

GrÔficos dos clusters e Conclusão

Como pode ser observado na tabela e no grÔfico, o Cluster 1, composto pelos municípios mais vulnerÔveis e em maior número, apresentou também o maior número de mortes. A cidade do Rio de Janeiro ocupa o segundo lugar, seguida pelo Cluster 4 em terceiro, Cluster 2 em quarto, e o Cluster 3 em quinto. No grÔfico a unidade de medida de população estÔ em mil.

Em relação ao PIB, o Cluster 5 (RJ) possui o maior PIB, seguido pelo Cluster 4 em segundo lugar, o Cluster 3 em terceiro, o Cluster 1 em quarto e o Cluster 2 em quinto. A distribuição da população segue a mesma tendência observada no PIB, assim como os gastos públicos e impostos.

Os grÔficos e tabelas evidenciam que o número de mortes tem uma forte correlação com as questões socioeconÓmicas dos municípios, de maneira coordenada. Em todos os clusters, observa-se que, em média, a cada 10.000 habitantes (número de óbitos dividido pela população), ocorre uma morte no parto de mulheres entre 10 e 49 anos nos municípios do estado do Rio de Janeiro.

Conclusão: Em conclusão, a anÔlise dos clusters revela uma forte correlação entre as mortes no parto e os fatores socioeconÓmicos dos municípios do estado do Rio de Janeiro. O Cluster 1, com municípios mais vulnerÔveis, apresentou o maior número de mortes, evidenciando a relação entre a vulnerabilidade social e os desfechos adversos na saúde. A anÔlise do PIB, população, gasto público e impostos reforça a ideia de que as condições econÓmicas e a capacidade de investimento em saúde pública influenciam diretamente a mortalidade materna. Em todos os clusters, observou-se que, em média, a cada 1.000 mortes, hÔ uma morte no parto de mulheres entre 10 e 49 anos, o que destaca a necessidade urgente de políticas públicas mais eficazes e equitativas, direcionadas às Ôreas mais vulnerÔveis.

A combinação de variĆ”veis socioeconĆ“micas com os dados de mortalidade materna aponta para a importĆ¢ncia de uma abordagem integrada nas polĆ­ticas pĆŗblicas, como destaca Paim (2011) ao afirmar que ā€œas desigualdades sociais e econĆ“micas tĆŖm um impacto direto na saĆŗde da população, refletindo nas taxas de mortalidade e morbidadeā€. Portanto, Ć© fundamental que os gestores pĆŗblicos se concentrem na melhoria das condiƧƵes socioeconĆ“micas e de saĆŗde nos municĆ­pios mais vulnerĆ”veis para reduzir as desigualdades e melhorar os Ć­ndices de saĆŗde materna.

# Agrupar os dados por cluster e calcular as mƩtricas
cluster_summary <- final_2021 %>%
  filter(mortes > 0) %>%  # Considerar apenas municĆ­pios com mortes > 0
  group_by(cluster) %>%
  summarise(
    Mortes = sum(mortes, na.rm = TRUE),
    Quantidade = n(),
    PIB = mean(PIB_Municipio, na.rm = TRUE),
    `População` = mean(Populacao, na.rm = TRUE),
    `Gasto pĆŗblico` = mean(VAB_Administracao_Defesa_Educacao_Saude_publica_Seguridade_social, na.rm = TRUE),
    Impostos = mean(Impostos_liquidos_de_subsidios, na.rm = TRUE)
  )
cluster_summary
## # A tibble: 5 Ɨ 7
##   cluster Mortes Quantidade           PIB População `Gasto público`     Impostos
##     <int>  <dbl>      <int>         <dbl>     <dbl>           <dbl>        <dbl>
## 1       1    862         51   8162145674.   163447.     1314927751.   665620642.
## 2       2     15          5   1467342794.    61349.      502247902.   182934761.
## 3       3    104          3  14614125008.   240832.     1944572643.   737713369 
## 4       4     73          3  22958098291.   172534.     1904577467.  1243553043.
## 5       5    853          1 359635000000   6775561     56971983974  79324423329
cluster_summary_long <- cluster_summary %>%
  pivot_longer(cols = -cluster, names_to = "variavel", values_to = "valor")

cluster_summary_long <- cluster_summary %>%
  mutate(
    PIB = PIB / 1e6,
    Impostos = Impostos / 1e6,
    `Gasto pĆŗblico` =  `Gasto pĆŗblico` / 1e6,
    `População`=  `População`/1e3
  ) %>%
  pivot_longer(cols = -cluster, names_to = "variavel", values_to = "valor") %>%
  group_by(variavel) %>%
  mutate(
    proporcao = valor / sum(valor) * 100  # Calcular porcentagens (opcional)
  ) %>%
  ungroup()

# Iterar por cada variƔvel e criar grƔficos de barras
unique_vars <- unique(cluster_summary_long$variavel)

for (var in unique_vars) {
  # Filtrar os dados para a variƔvel atual
  data_var <- cluster_summary_long %>%
    filter(variavel == var)
  
  # Criar o grƔfico de barras
  p <- ggplot(data_var, aes(x = factor(cluster), y = valor, fill = factor(cluster))) +
    geom_bar(stat = "identity", position = "dodge") +
    geom_text(
      aes(label = round(valor, 2)),  # Adicionar os valores em cima das barras
      position = position_dodge(width = 0.9),
      vjust = -0.5,
      size = 3
    ) +
    labs(
      title = paste("Distribuição de", var, "por Cluster"),
      x = "Cluster",
      y = ifelse(var %in% c("PIB", "impostos", "Gasto público"), "Valor (em milhões)", ""),
      fill = "Cluster"
    ) +
     scale_fill_manual(values = c("#381850", "blue","#F5E62B", "#2C848C", "#FF9900")) +  # Definir cores especĆ­ficas
    theme_minimal() +
    theme(
      plot.title = element_text(hjust = 0.5, size = 14),
      axis.text.x = element_text(size = 10),
      axis.text.y = element_text(size = 10)
    )
  
 print(p)
}