Visualização de dados do SUS

Utilizando o R para obter dados do SUS e realizar análises exploratórias utilizando visualização de dados
Data de Publicação

18 de outubro de 2025

     Olá, esta é mais uma de um conjunto de práticas em bioinformática desenvolvidas para o curso de Biomedicina da PUC-MG. Você pode encontrar as demais práticas aqui.

     Hoje nós vamos trabalhar com dados obtidos do Sistema Único de Saúde, o SUS.

Introdução

Os dados do SUS

     O SUS mantém e disponibiliza diversos sistemas de informação contendo dados relacionados à doenças, condições, causas de óbito, quadros hospitalares e características de indivíduos brasileiros. Estes dados são anonimizados, o que significa que não se é possível associá-los ao indivíduo fonte, desta maneira garantindo a privacidade do cidadão.

O DATASUS disponibiliza informações que podem servir para subsidiar análises objetivas da situação sanitária, tomadas de decisão baseadas em evidências e elaboração de programas e ações em saúde. Estes dados podem ser coletados manualmente, através da interface TABNET, ou diversas outras fontes. Recentemente foi desenvolvido o pacote de R microdatasus, que possibilita baixar os dados através de interface programática, facilitando enormemente o processo.

Existem diversos sistemas distintos, vamos conhecer os principais:

Principais Sistemas

SIM - Sistema de Informações sobre Mortalidade

  • Objetivo: Registrar e monitorar os óbitos ocorridos no Brasil.
  • Fonte de dados: Declarações de Óbito (DO).
  • Informações coletadas:
    • Causa básica da morte (CID-10),
    • Idade,
    • Sexo,
    • Escolaridade,
    • Local de ocorrência.

O SIM é usado para análises de mortalidade por causas específicas, como doenças crônicas, infecções e causas externas (acidentes, homicídios).

SINASC - Sistema de Informações sobre Nascidos Vivos

  • Objetivo: Registrar todos os nascimentos vivos no país.
  • Fonte de dados: Declarações de Nascido Vivo (DNV).
  • Informações coletadas:
    • Peso ao nascer,
    • Idade gestacional,
    • Tipo de parto,
    • Escolaridade da mãe,
    • Local do parto.

O SINASC é importante para estudar indicadores como prematuridade, baixo peso ao nascer e saúde materno-infantil.

Outros Sistemas Relevantes

  • SIH-SUS (Sistema de Informações Hospitalares): registros de internações hospitalares no SUS.
  • SIA-SUS (Sistema de Informações Ambulatoriais): registros de atendimentos ambulatoriais no SUS.
  • SINAN (Sistema de Informação de Agravos de Notificação): monitora doenças de notificação obrigatória, como dengue, tuberculose e HIV.
  • CNES (Cadastro Nacional de Estabelecimentos de Saúde): registra informações sobre hospitais, postos de saúde e outros estabelecimentos de saúde.

O uso integrado desses sistemas permite compreender a situação de saúde da população brasileira, monitorar tendências e embasar decisões em saúde pública.

Prática

Nesta prática iremos explorar um subconjunto de dados do sistema SIM-DO, mais especificamente analisando óbitos relacionados ao CID J159: “Pneumonia bacteriana, não especificada”. Aproveitaremos também para revisar alguns consceitos importantes sobre a linguagem R e seu funcionamento.

Preparação

Carregar pacotes

# para instalar o pacote, caso ainda não tenha (só se instala uma vez)
install.packages("ggplot2")
install.packages("dplyr")

# execute para carregar o pacote, caso já instalado
library("ggplot2")
library("dplyr")

DICA 1: toda vez que você for reiniciar um sessão é necessário carregar os pacotes. Eles são a primeira coisa de qualquer código.

DICA 2: Se ao carregar o pacote você tiver uma mensagem de erro como pacote não disponível, package not available, etc, praticamente qualquer pacore pode ser instalado com o comando intall.packages(“nome_do_pacote”).

DICA 3: Cada pacote só precisa ser instalado uma única vez.

Obtendo os dados

Definindo seu diretório de trabalho

Para cada projeto, sempre crie uma pasta onde você vai salvar todos arquivos e scripts, assim você mantém seu trabalho sempre organizado. No comando abaixo, coloque dentro das aspas o caminho para o seu diretório de trabalho.

::: Sempre utilize a tecla TAB para autocompletar os caminhos a partir do ~ ou / (ou ****, caso no windows). Para isso, coloque o cursor (|, a barra onde sua digitação aparece) entre as ” “.

getwd()

setwd("")
# utilize o tab para autocompletar com o cursor entre as aspas

Obter arquivos

Para facilitar, iremos trabalhar com um subconjunto já organizado, que deve ser baixado com o comando a seguir. Você irá fazer download do arquivo e em seguida iremos carregar esse arquivo para o R.

download.file(
  "https://raw.githubusercontent.com/heronoh/bioinfo/main/aulas/r/arquivos/dados_SUS_pneumo.csv",
  destfile = "dados_SUS_pneumo.csv",
  mode = "wb",
  method = "libcurl"
  )

Vamos ver o arquivo no formato tabular clássico, nesta tabela.

Para as análises da desta aula prática, você pode pular a próxima sessão.

DICA 1: Para prosseguir na análise que vamos desenvolver, copie e cole os blocos de código num novo documento do tipo .R.

DICA 2: utilize a tecla tab para autocompletar e evitar erros!

#complete usando a tecla TAB até chegar ao arquivo que você baixou
dados_SUS <- read.csv(file = "",
                      sep = ","
                      ) %>% 
  tibble::tibble()

Para outros projetos

Caso você tenha interesse em investigar outras questões sanitárias da população brasileira, você pode obter diferentes conjuntos de dados assim:

# executar apenas se estiver instalando em um computador windows ----
install.packages("read.dbc", repos = "https://packagemanager.posit.co/cran/2024-07-05")

#instalar pacotes necessários ----
install.packages("remotes")
remotes::install_github("rfsaldanha/microdatasus")

library(microdatasus)

# baixar dados ----
dados_brutos_SUS <- fetch_datasus(year_start = 2020,
                       year_end = 2023, 
                       uf = "MG", 
                       information_system = "SIM-DO")

dados_SUS <- process_sim(dados_brutos_SUS)

dados_SUS

Investigando os dados

   Nossos dados estão no formato tabular, ou seja, organizados em linhas e colunas. As linhas são as observações de qualquer tabela. No nosso caso elas correspondem a indivíduos. Já as colunas são conjuntos definidos de informação. Cada coluna armazena um tipo de informação única, como a idade, Sexo, município de nascimento, entre outros. Assim, uma coluna que armazena a idade terá apenas valores numéricos positivos, já a de município de nascimento terá apenas nomes de cidade, e a coluna Sexo terá apenas as classes de valores masculino, feminino ou não informado. Desta maneira, idade é uma variável contínua e numérica. Por outro lado, Sexo é uma variável discreta e categórica. Vamos entender isso melhor.

# ver a tabela de dados
dados_SUS

# qual o tamanho da tabela
dim(dados_SUS)

# qual o nome das colunas
colnames(dados_SUS)

# quais os valores de uma coluna
dados_SUS$Idade_anos 
dados_SUS$Sexo 

# quantas observações temos de cada tipo? 
dados_SUS$Idade_anos %>% table()
dados_SUS$Sexo %>% table()


# visualizar quantas observações temos de cada tipo
dados_SUS$Idade_anos %>% table() %>% plot()
dados_SUS$Sexo %>% table() %>% barplot()



#quais as 10 primeiras observações dessa tabela
dados_SUS[1:10,]

#quais asegunda coluna
dados_SUS[,2]


#qual a média de idades?
dados_SUS$Idade_anos %>% mean(na.rm = T)

Gráficos exploratórios

Gráfico escolaridade por Sexo

# grágico escolaridade por Sexo
 dados_SUS %>%
  mutate(Idade_anos = as.numeric(Idade_anos) ) %>% 
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = CID_significado,
             group = Escolaridade,
             col = Escolaridade,
             fill  = Escolaridade)) +
  geom_bar(stat = "count",position = "dodge") +
  facet_grid(cols = vars(Sexo))

Gráfico de Sexo e escolaridade

 dados_SUS %>%
  mutate(Idade_anos = as.numeric(Idade_anos) ) %>% 
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = CID_significado,
             group = Sexo,
             col = Sexo,
             fill  = Sexo)) +
  geom_bar(stat = "count",position = "dodge") +
  facet_grid(cols = vars(Escolaridade))

Gráfico aumento de mortes por grupo de escolaridade

 dados_SUS %>%
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = Ano_obito,
             group = Sexo,
             col = Sexo,
             fill  = Sexo)) +
  geom_density(stat = "count",position = "stack") +
  facet_grid(cols = vars(Escolaridade)) +
   theme(axis.text.x = element_text(angle = 90))

Gráfico aumento de mortes total

 dados_SUS %>%
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = Ano_obito,
             group = Sexo,
             col = Sexo,
             fill  = Sexo)) +
  geom_density(stat = "count",position = "stack") +
   theme(axis.text.x = element_text(angle = 90))

Gráfico aumento de mortes por ano e estado civil

 dados_SUS %>%
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(x = Ano_obito,
             group = Estado_civil,
             col = Estado_civil,
             fill  = Estado_civil)) +
  geom_density(stat = "count",position = "stack") +
   theme(axis.text.x = element_text(angle = 90)) +
  facet_grid(cols = vars(Sexo)) 

Gráfico de média de idades por grupo de escolaridade

 dados_SUS %>%
  filter(Sexo %in% c("Masculino", "Feminino")) %>% 
  ggplot(aes(y = Idade_anos,
             x = Sexo,
             group = Sexo,
             fill  = Sexo)) +
  geom_boxplot() +
   # geom_jitter() +
   theme(axis.text.x = element_text(angle = 90)) +
  facet_grid(cols = vars(Escolaridade)) 

E por hoje ficamos por aqui!


Voltar para a página inicial