6.  Avaliando a distribuição dos dados

Já estudamos que todos os cálculos apresentados podem ser feitos com comandos específicos no R. Alguns destes cálculos podem ser obtidos com apenas um comando utilizando a função summary(). Ela é muito utilizada, pois automatiza a visão geral das variáveis do banco de dados analisado permitindo ao profissional de vigilância conhecer as medidas resumo de uma só vez, ou seja, agiliza o trabalho.

Agora, em todas as avaliações que você fizer da distribuição dos dados analisados, o comando summary() se tornará um argumento essencial para análise. Ele resulta em uma espécie de “sumarização” de cada variável conforme seu tipo.

Observe no script abaixo a avaliação que faremos da nossa tabela {dados}, oriunda do banco de dados {NINDINET.dbf} disponível no menu lateral “Arquivos”, do módulo, vamos analisar apenas as variavéis: ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS e CS_SEXO. As variáveis numéricas serão apresentadas segundo as métricas mínimo, máximo, média, mediana, primeiro e terceiro quartis. Entretanto, lembre-se que no caso das variáveis do tipo fator (fct), o argumento summary() retornará apenas a frequência de cada categoria.

Acompanhe os script abaixo com três exemplos para praticar junto ao seu RStudio:

  • No primeiro exemplo selecionamos algumas variáveis utilizadas anteriormente, mas sem agrupar ou filtrar agravos.
  • No segundo exemplo adicionamos ao filtro, a seleção dos registros notificados de dengue.
  • E, por fim no terceiro exemplo filtramos apenas os casos notificados por hepatite viral.

Vamos lá!

Observe o output do código abaixo quando não filtramos um agravo:

# 1º exemplo: sem utilização de filtro pelo agravo
dados |>
  
  # criando uma nova coluna chamada IDADE_ANOS com a função mutate() e, nela,
  # calculando a idade em anos. Primeiro, fazendo a diferença em dias entre
  # data de primeiros  sintomas e data de notificação e transformando em
  # número inteiro com a função as.integer(), seguido da divisão por 365.25,
  # e, no final, arredondamento para o menor número inteiro com uso da função
  # floor()
  mutate(IDADE_ANOS = floor(as.integer(DT_SIN_PRI - DT_NASC) / 365.25)) |>
  
  # selecionando as colunas ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS
  # e CS_SEXO
  select(ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS, CS_SEXO) |>
  
  # sumarizando o banco utilizando a função summary()
  summary()
#>    ID_AGRAVO       DT_NOTIFIC           DT_SIN_PRI           IDADE_ANOS    
#>  A90    :12781   Min.   :2007-01-01   Min.   :1939-04-24   Min.   :  0.00  
#>  W64    : 5438   1st Qu.:2008-03-28   1st Qu.:2008-03-17   1st Qu.: 15.00  
#>  A169   : 2347   Median :2009-06-18   Median :2009-04-23   Median : 28.00  
#>  X58    : 1606   Mean   :2009-09-24   Mean   :2009-08-01   Mean   : 30.26  
#>  B19    :  955   3rd Qu.:2011-04-20   3rd Qu.:2011-04-09   3rd Qu.: 44.00  
#>  B24    :  675   Max.   :2012-12-30   Max.   :2012-12-29   Max.   :101.00  
#>  (Other): 3819                                             NA's   :4304    
#>  CS_SEXO  
#>  F:13567  
#>  I:   56  
#>  M:13998  
#>           
#>           
#>           
#> 


Perceba que no primeiro exemplo acima, a tabela visualizada apresenta as variáveis ID_AGRAVO e CS_SEXO com suas respectivas frequências e as variáveis DT_NOTIFIC, DT_SIN_PRI e IDADE_ANOS com as estatísticas descritivas básicas (mínimo, 1º quartil, mediana, média, 3º quartil e máxima).

Agora, acompanhe o output do código abaixo quando filtramos os registros notificados com código CID10 = A90, replique os passos em seu RStudio:

# 2º exemplo: filtro pelo agravo dengue ("A90")
dados |>
  
  # filtrando os agravos de dengue (código "A90") com a função filter()
  filter(ID_AGRAVO == "A90") |>
  
  # utilizando a função mutate() para modificar a coluna ID_AGRAVO, removendo as
  # categorias (levels) em branco após o filtro usando a função droplevels()
  mutate(ID_AGRAVO = droplevels(ID_AGRAVO)) |>
  
  # criando uma nova coluna chamada IDADE_ANOS com a função mutate() e, nela,
  # calculando a idade em anos. Primeiro, fazendo a diferença em dias entre
  # data de primeiros  sintomas e data de notificação e transformando em
  # número inteiro com a função as.integer(), seguido da divisão por 365.25,
  # e, no final, arredondamento para o menor número inteiro com uso da função 
  # floor()
  mutate(IDADE_ANOS = floor(as.integer(DT_SIN_PRI - DT_NASC) / 365.25)) |>
  
  # selecionando as colunas ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS
  # e CS_SEXO
  select(ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS, CS_SEXO) |>
  
  # sumarizando o banco utilizando a função summary()
  summary()
#>  ID_AGRAVO     DT_NOTIFIC           DT_SIN_PRI           IDADE_ANOS    CS_SEXO 
#>  A90:12781   Min.   :2007-01-03   Min.   :1993-06-23   Min.   : 0.00   F:6827  
#>              1st Qu.:2008-03-13   1st Qu.:2008-03-06   1st Qu.:12.00   I:  11  
#>              Median :2008-04-20   Median :2008-04-11   Median :24.00   M:5943  
#>              Mean   :2009-04-03   Mean   :2009-03-24   Mean   :26.93           
#>              3rd Qu.:2011-03-31   3rd Qu.:2011-03-27   3rd Qu.:39.00           
#>              Max.   :2012-12-23   Max.   :2012-12-21   Max.   :98.00           
#>                                                        NA's   :3364


Você conseguiu executar? A tabela apresentada em seu Rtudio no painel console, deve ser igual ao que visualizamos aqui. Perceba que estamos analisando agora as estatísticas descritivas básicas dos casos de Dengue notificados em Rosas:

  • Temos 12.781 casos notificados.
  • A menor data de notificação foi em 03/01/2007 e a maioria destes casos foram notificados em 20/04/2008.
  • A última data de início de sintomas registrada no sistema foi em 21/12/2012, mas a média dos casos foi notificada em 24/03/2009.
  • Quanto as idades dos casos, a média (26,9 anos) e a mediana (24 anos), sendo 98 anos a maior idade entre os notificados, e 3.364 dos casos não tiveram a idade relatada.
  • A maioria dos notificados eram do sexo feminino (6.827 casos).

Agora vamos praticar com um último exemplo. Observe o output do código abaixo em que filtraremos os registros notificados com código CID10 = B19, replique em seu RStudio:

# 3º exemplo: filtro pelo agravo hepatite viral ("B19")
dados |>
  
  # filtrando os agravos de hepatite viral (código "B19") com a função filter()
  filter(ID_AGRAVO == "B19") |>
  
  # utilizando a função mutate() para modificar a coluna ID_AGRAVO, removendo as
  # categorias (levels) em branco após o filtro usando a função droplevels()
  mutate(ID_AGRAVO = droplevels(ID_AGRAVO)) |>
  
  # criando uma nova coluna chamada IDADE_ANOS com a função mutate() e, nela,
  # calculando a idade em anos. Primeiro, fazendo a diferença em dias entre
  # data de primeiros  sintomas e data de notificação e transformando em
  # número inteiro com a função as.integer(), seguido da divisão por 365.25,
  # e, no final, arredondamento para o menor número inteiro com uso da função 
  # floor()
  mutate(IDADE_ANOS = floor(as.integer(DT_SIN_PRI - DT_NASC) / 365.25)) |>
  
  # selecionando as colunas ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS
  # e CS_SEXO
  select(ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS, CS_SEXO) |>
  
  # sumarizando o banco utilizando a função summary()
  summary()
#>  ID_AGRAVO   DT_NOTIFIC           DT_SIN_PRI           IDADE_ANOS    CS_SEXO
#>  B19:955   Min.   :2007-01-04   Min.   :1951-08-13   Min.   : 0.00   F:418  
#>            1st Qu.:2008-11-09   1st Qu.:2008-06-25   1st Qu.:31.00   I:  0  
#>            Median :2009-10-23   Median :2009-07-14   Median :45.00   M:537  
#>            Mean   :2009-12-25   Mean   :2009-07-01   Mean   :42.92          
#>            3rd Qu.:2011-04-12   3rd Qu.:2011-01-11   3rd Qu.:56.00          
#>            Max.   :2012-12-27   Max.   :2012-12-20   Max.   :89.00          
#>                                                      NA's   :55


Observe que visualizamos a tabela com as estatísticas descritivas básicas dos casos notificados com hepatites virais do Estado de Rosas. Tente descrever os dados que visualiza, será um bom exercício para memorização e aprendizagem!


Se houver uma grande quantidade de variáveis contidas na base de dados analisada, a visualização dos outputs (resultados) da função summary() poderá ficar comprometida.

Nestes casos, voê pode utilizar a função de forma individualizada, ou seja, escrevemos os comandos para cada variável de interesse da seguinte forma:

# utilizando a função summary() para
# visualizar a coluna CS_SEXO da tabela {`dados`}
summary(dados$CS_SEXO)
#>     F     I     M 
#> 13567    56 13998


Você também poderá utilizar o pacote summarytools para melhorar a visualização do comando executado. Este pacote possui a função dfSummary(). Ela apresenta um resumo dos dados em forma de tabela, contendo os nomes, tipos, frequência, resumo numérico, gráfico histograma, a porcentagem de registros em branco e registros preenchidos (válidos). Isso torna a leitura dos resultados mais agradável.

Para utilizá-la você deve utilizar o argumento view(), pois ele permitirá a visualização do relatório elaborado pelo comando na aba Viewer do RStudio, no formato de relatório em HTML (página da web). A função também é simples, tendo como argumento apenas a base de dados.

Acompanhe o script abaixo e replique em seu RStudio:

dados |>
  
  # criando uma nova coluna chamada IDADE_ANOS com a função mutate() e, nela,
  # calculando a idade em anos. Primeiro, fazendo a diferença em dias entre
  # data de primeiros  sintomas e data de notificação e transformando em
  # número inteiro com a função as.integer(), seguido da divisão por 365.25,
  # e, no final, arredondamento para o menor número inteiro com uso da função
  # floor()
  mutate(IDADE_ANOS = floor(as.integer(DT_SIN_PRI - DT_NASC) / 365.25)) |>
  
  # selecionando as colunas ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS
  # e CS_SEXO
  select(ID_AGRAVO, DT_NOTIFIC, DT_SIN_PRI, IDADE_ANOS, CS_SEXO) |>
  
  # criando o sumário com a função dfSummary()
  dfSummary() |> 
  
  # visualizando o relatório em formato HTML com função view()
  view()



O relatório gerado é apresentado no formato HTML, e pode ser visualizado em um navegador de internet, clicando no ícone do painel Viewer conforme a Figura 4:


Figura 4: Tela de visualização da aba Viewer.


Observe que a tabela acima apresentou a visualização das seguintes análises em cada coluna:

  • Variável: indicando qual é a variável estudada;
  • Estatísticas ou Valores: indicando a frequência absoluta de cada registro da variável estudada,
  • Freqs (% de válidos): indicando a frequência absoluta e relativa de cada registro da variável estudada,
  • Graph: visualização gráfica da distribuição dos dados da variável estudada,
  • Valid: indicando a frequência absoluta e relativa dos valores considerados validos da variável estudada e
  • Faltante: indicando a frequência absoluta e relativa dos valores considerados nulos ou em branco da variável estudada.

O que você achou depois de executar os comandos? Esta visualização é mais agradável, não é mesmo? Pratique com os bancos de dados que você utiliza na vigilância.



Para geração de tabelas que possuam variáveis calculadas incluindo cálculos de porcentagens e médias, o pacote gtsummary é muito útil. Afinal, com poucas linhas de comando, será possível gerar uma bela tabela para análises. Veja e acompanhe os passos abaixo:

  1. Primeiro, filtramos com a função filter() os casos notificados de dengue e hepatite virais, notificados no Estado de Rosas.

  2. Segundo, eliminamos os valores nulos com a função droplevels().

  3. No terceiro passo, selecionamos com a função select() as variável (CS_SEXO) que utilizaremos para a análise dos agravos.

  4. Por fim, utilizamos a função tbl_summary(), incluindo o argumento by = CS_SEXO que permitirá que os agravos selecionados no passo 1, sejam cruzados com a variável sexo.

Assim, teremos como resultado uma tabela com estatísticas descritivas já calculadas. Observe o script abaixo:

dados |>
  
  # filtrando os agravos de dengue (código "A90") e 
  # hepatite viral
  # (código "B19") com a função filter()
  filter(ID_AGRAVO %in% c("A90", "B19")) |>
  
  # utilizando a função mutate() para modificar a 
  # coluna ID_AGRAVO, removendo as
  # categorias (levels) em branco após o filtro usando 
  # a função droplevels()
  mutate(ID_AGRAVO = droplevels(ID_AGRAVO)) |>
  
  # selecionando apenas as colunas de agravo (ID_AGRAVO) 
  # e sexo (CS_SEXO)
  select(ID_AGRAVO, CS_SEXO) |>
  
  # gerando uma tabela com resumo das informações 
  # cruzando 
  # do agravo (ID_AGRAVO) pelo sexo (CS_SEXO)
  tbl_summary(by = CS_SEXO)

A tabela gerada poderá ser visualizada no painel Viewer do seu RStudio (ela não será visualizada no painel Console). Agora vamos interpretar os resultados:

  • N é o número de valores totais por categorias de sexo, está localizado no cabeçalho da tabela.
  • n é o número total de casos por agravo, está sinalizado com ¹ no rodapé da tabela.
  • (%) é a porcentagem total por agravo, está sinalizado com ¹ no rodapé da tabela.

Para a visualização dessas informações apresentadas na tabela no idioma português, precisamos definir o idioma português como padrão. Siga o script com o comando abaixo configure esse padrão.

# definindo o idioma das tabelas geradas em pacote 
# "gtsummary" como português ("pt")
theme_gtsummary_language("pt")



Próximo módulo

Parabéns, você chegou ao final do nosso quarto módulo! Agora você já conhece todas as funções básicas para manipular banco de dados e fazer cálculos epidemiológicos utilizando a linguagem R. No próximo módulo você irá colocar em prática cálculos de indicadores de saúde necessários para estabelecer rotinas de trabalho para o seu dia a dia na vigilância em saúde.

Até lá.