3. Avaliando a consistência dos dados
A avaliação de consistência dos dados é uma etapa rotineira e essencial do profissional de vigilância em saúde. Nela, os dados são checados para verificação de sua coerência. Esta análise de consistência permite a melhoria no rastreamento e monitoramento das doenças, agravos e outros eventos em saúde pública.
Nesta etapa você permanecerá utilizando o pacote dplyr
que está contido no universo do metapacote tidyverse
. O
pacote dplyr
oferece muitos recursos para transformação de
bases de dados, seja ela necessária nas colunas (variáveis) ou nas
linhas (registros). No quadro abaixo listamos as funções mais utilizadas
no pacote dplyr
:

Atenção
O pacote dplyr
oferece muitos recursos para
transformação de bases de dados e suas funções nos remetem a ações
comuns, os chamados ‘verbos’.
Lembre-se que o profissional de vigilância do Estado de Rosas necessita avaliar os casos de hepatites virais e, para isso ele precisará examinar os dados e escolher as variáveis adequadas para análise, corrigindo distorções ou informações inadequadas.
O primeiro passo para avaliar a consistência dos dados é importar o
banco de dados do Sinan Net {NINDINET.dbf
} disponível no
menu lateral “Arquivos”, Ambiente Virtual do curso. Aqui chamaremos o
objeto da análise de {base
}. Observe os comandos abaixo e
replique-os em seu RStudio
:
# Criando o objeto {`base`} que armazenará o banco de dados {`NINDINET.dbf`}
base <- read.dbf(file = 'Dados/NINDINET.dbf', as.is = TRUE)
Digitando a função glimpse()
você conseguirá visualizar
a área inicial do banco de dados. Com este comando será possível
visualizar o número de linhas da sua tabela (Rows: 27,621), o
número de variáveis (Columns: 62), o nome de cada coluna, o
tipo de dado da variável e os registros iniciais contidos em cada
variável. Veja o script e replique-o em seu
RStudio
:
# Visualizando o número de linhas e colunas com a função `glimpse()`
glimpse(base)
#> Rows: 27,621
#> Columns: 62
#> $ NU_NOTIFIC <chr> "7671320", "0855803", "8454645", "3282723", "9799526", "727…
#> $ TP_NOT <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
#> $ ID_AGRAVO <chr> "A509", "W64", "X58", "A90", "B19", "A90", "A90", "Y09", "A…
#> $ CS_SUSPEIT <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ IN_AIDS <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CS_MENING <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ DT_NOTIFIC <date> 2012-04-11, 2010-09-17, 2010-10-19, 2008-04-14, 2011-06-20…
#> $ SEM_NOT <chr> "201215", "201037", "201042", "200816", "201125", "200807",…
#> $ NU_ANO <int> 2012, 2010, 2010, 2008, 2011, 2008, 2007, 2011, 2008, 2011,…
#> $ SG_UF_NOT <int> 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,…
#> $ ID_MUNICIP <int> 610213, 610213, 610213, 610213, 610213, 610213, 610213, 610…
#> $ ID_REGIONA <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ ID_UNIDADE <int> 256100, 180142, 559191, 180142, 480722, 570404, 319816, 289…
#> $ DT_SIN_PRI <date> 2012-04-05, 2010-09-09, 2010-10-19, 2008-04-11, 2011-04-02…
#> $ SEM_PRI <chr> "201214", "201036", "201042", "200815", "201113", "200806",…
#> $ DT_NASC <date> 2012-04-04, 1988-04-23, 1971-03-25, 1928-05-29, 2002-09-18…
#> $ NU_IDADE_N <int> 2001, 4022, 4039, 4079, 4008, 4054, 4032, 4014, 4037, 4011,…
#> $ CS_SEXO <chr> "M", "M", "M", "F", "M", "F", "F", "F", "F", "F", "M", "M",…
#> $ CS_GESTANT <int> 6, 6, 6, 9, 6, 9, 9, 9, 6, 5, 6, 6, 6, 6, 9, 9, 9, 9, 6, 5,…
#> $ CS_RACA <int> 4, 1, NA, 4, 4, 9, NA, 1, 9, 4, NA, 9, NA, NA, 9, NA, 1, 9,…
#> $ CS_ESCOL_N <chr> "10", NA, NA, "02", "01", "09", NA, "09", "09", "01", "10",…
#> $ SG_UF <int> 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,…
#> $ ID_MN_RESI <int> 610213, 610213, 610250, 610213, 610250, 610213, 610213, 610…
#> $ ID_RG_RESI <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ ID_DISTRIT <chr> "05", "05", "05", "01", "01", "04", "05", "04", "01", "04",…
#> $ ID_BAIRRO <chr> "020", "019", "020", "001", "001", "014", "020", "012", "00…
#> $ ID_LOGRADO <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ ID_GEO1 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ ID_GEO2 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CS_ZONA <int> 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, …
#> $ ID_PAIS <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
#> $ NDUPLIC_N <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ IN_VINCULA <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ DT_INVEST <date> NA, NA, 2010-10-19, 2008-04-14, 2011-06-20, NA, NA, NA, 20…
#> $ ID_OCUPA_N <chr> NA, NA, NA, NA, "999991", NA, NA, NA, NA, NA, NA, NA, NA, N…
#> $ CLASSI_FIN <int> NA, NA, NA, 5, 1, 8, 8, 1, 1, NA, 8, 1, 8, 8, 1, NA, 1, 8, …
#> $ CRITERIO <int> NA, NA, NA, 1, NA, NA, NA, NA, 2, NA, NA, 1, NA, NA, 2, NA,…
#> $ TPAUTOCTO <int> NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, 1, NA, NA, NA, N…
#> $ COUFINF <int> NA, NA, NA, NA, NA, NA, NA, NA, 61, NA, NA, 61, NA, NA, NA,…
#> $ COPAISINF <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,…
#> $ COMUNINF <int> NA, NA, NA, NA, NA, NA, NA, NA, 610213, NA, NA, 610213, NA,…
#> $ CODISINF <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CO_BAINFC <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0…
#> $ NOBAIINF <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ DOENCA_TRA <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ EVOLUCAO <int> 1, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, 1, NA, NA, NA, NA…
#> $ DT_OBITO <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ DT_ENCERRA <date> NA, 2010-10-16, 2010-10-19, 2008-06-19, 2011-06-20, 2008-0…
#> $ DT_DIGITA <date> 2012-11-09, 2010-11-17, 2011-03-14, 2008-04-24, 2011-09-14…
#> $ DT_TRANSUS <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ DT_TRANSDM <date> NA, NA, NA, NA, NA, NA, NA, NA, 2008-07-10, NA, NA, NA, NA…
#> $ DT_TRANSSM <date> 2012-11-13, 2010-11-23, 2011-04-12, 2010-11-16, 2011-09-19…
#> $ DT_TRANSRM <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ DT_TRANSRS <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ DT_TRANSSE <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
#> $ NU_LOTE_V <chr> "2012049", "2010047", "2011015", "2010044", "2011038", "201…
#> $ NU_LOTE_H <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CS_FLXRET <int> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
#> $ FLXRECEBI <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
#> $ MIGRADO_W <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CO_USUCAD <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ CO_USUALT <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
Você deve ter observado que o comando glimpse(base)
retornou três tipos de dados das colunas estudadas:
<chr>
, <date>
e
<int>
. Os dados do tipo <chr>
são
letras ou textos como “a” “b” “c” “d”, os do tipo
<date>
se referem a datas como “2012-11-13”
“2010-11-23” e os dados do tipo <int>
se referem a
números gerais como “2001” “7” “22”.
Será muito importante que no processo de utilização do R
você fique atento ao tipo de dado das tabelas utilizadas.
3.1 Selecionado as variáveis que serão analisadas
Você deve verificar que o objeto {base
} foi criado a
partir do arquivo {NINDINET.dbf
}, que possui 62 variáveis.
No entanto, para o exercício de análise do Estado de Rosas utilizaremos
apenas as variáveis de interesse. Assim faremos um exercício neste
tópico no qual reduziremos as colunas desta tabela para apenas 6 colunas
com as variáveis epidemiológicas necessárias: Data da notificação
(DT_NOTIFIC
), Data de nascimento (DT_NASC
),
Sexo (CS_SEXO
), Raça/cor (CS_RACA
), Código do
município de residência (ID_MN_RESI
) e Código do CID10 do
agravo notificado (ID_AGRAVO
).
Para esta ação utilizaremos a função select()
, que tem
por objetivo selecionar variáveis de interesse para serem analisadas. Os
argumentos principais da função select()
são:
- a tabela de origem dos dados (data.frame, tibble, etc),
- os nomes das colunas que devem ser selecionadas.
Após aplicá-la, você terá como resultado uma tabela apenas com as variáveis escolhidas, ou seja, um recorte contendo todos os registros (linhas e/ou valores) do banco de dados, porém apenas com as seis variáveis (colunas) selecionadas.
Vamos praticar! Criaremos uma nova tabela apenas com seis variáveis
escolhidas que chamaremos de {base_menor
}. Esta tabela
armazenará o objeto {base
} que possui o banco de dados
NINDINET ({NINDINET.dbf
}) com as notificações do Estado de
Rosas. Execute o seguinte comando e replique-o em seu
RStudio
:
# Criando a tabela {`base_menor`} e selecionado colunas específicas
base_menor <- select(base, DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI,
ID_AGRAVO)
Agora, visualize em seu console as primeiras linhas de sua nova
tabela, executando o comando. Replique-o em seu
RStudio
:
# Utilizando a função `head()` para visualizar colunas específicas da tabela
# {`base_menor`}
head(base_menor)
#> DT_NOTIFIC DT_NASC CS_SEXO CS_RACA ID_MN_RESI ID_AGRAVO
#> 1 2012-04-11 2012-04-04 M 4 610213 A509
#> 2 2010-09-17 1988-04-23 M 1 610213 W64
#> 3 2010-10-19 1971-03-25 M NA 610250 X58
#> 4 2008-04-14 1928-05-29 F 4 610213 A90
#> 5 2011-06-20 2002-09-18 M 4 610250 B19
#> 6 2008-02-12 1953-08-01 F 9 610213 A90
Observe que a sua nova tabela possui apenas as colunas indicadas pela
função select()
.
3.2 Simplificando o fluxo de análises
Ao utilizar uma linguagem de programação como R
para
analisar dados, quase sempre precisaremos reaproveitar o resultado de
uma análise anterior para realizar a análise seguinte, ou seja,
utilizamos o output de um código anterior como o
argumento principal de uma próxima análise. Esta ação é
importante, pois tornará seu código menor e mais prático, evitando erros
de análises quando precisamos repetir comandos já utilizados.
Observe no script abaixo como utilizaremos o output
da função select()
, que selecionamos algumas colunas, para
visualizar as primeiras linhas usando a função head()
.
Estamos aninhando estas funções e, assim, termos o mesmo resultado.
Replique este comando em seu RStudio
:
# Criando a tabela {`base_menor`} selecionado colunas específicas
base_menor <- select(base, DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI,
ID_AGRAVO)
# Utilizando a função `head()` aninhada com a função `select()`
head(select(base, DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI, ID_AGRAVO))
Em análises como a que estamos trabalhando, à medida que necessitamos
realizar ações, o código fica maior e podemos nos perder entre tantas
vírgulas, nomes de funções e parênteses. Como solução, no R
podemos utilizar uma proposta de sintaxe (forma curta de
escrever os comandos) implementada pela utilização de operadores
chamados pipes, conforme descreve a tabela abaixo:
Nos exemplos deste curso iremos utilizar o operador
|>
, por dispensar o carregamento de pacotes! É
importante destacar que o seu uso foi implementado a partir da versão
4.1 do R
. Em códigos produzidos antes desta versão, será
comum você encontrar o operador %>%
, sendo necessário
carregar o pacote magrittr
ou o conjunto de pacotes pelo
tidyverse
.
Utilizando estes pipes (|>
ou
%>%
) podemos encadear diferentes operações em que o
objeto à esquerda do pipe (o output
anterior) será utilizado como o primeiro argumento da função à
direita do pipe, sem que seja necessário digitá-la
novamente (isto é, o primeiro argumento é omitido).
Observe o script abaixo, em que criaremos o objeto
{base_menor
}, a partir do data.frame
{base
} utilizando o pipe
(|>
).Replique estas linhas em seu
RStudio
:
# Criando o objeto {`base_menor`} a partir do objeto {`base`} e
# inserindo o pipe `|>` para encadear a seleção de variáveis
base_menor <- base |>
select(DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI, ID_AGRAVO)
Perceba que agora o objeto {base
} ficou antes do
operador |>
e, em seguida, utilizamos a função
select()
, fornecendo diretamente os argumentos que viriam
na sequência, isto é, o nome das colunas a serem selecionadas.
Agora acrescente a função head()
para visualizar o
resultado da operação. Replique o script abaixo em seu
RStudio
:
# Criando a {`base_menor`}
base_menor <- base |>
# Selecionando as variáveis que queremos utilizar com a função `select()`
select(DT_NOTIFIC, DT_NASC, CS_SEXO, CS_RACA, ID_MN_RESI, ID_AGRAVO) |>
# Acrescentando a função `head()` ao final do código após um pipe `|>`
head()
# Visualizando a o objeto {`base_menor`} criado com as primeiras linhas selecionadas
# pela função `head()` e com colunas específicas, selecionadas pela função `select()`
base_menor
#> DT_NOTIFIC DT_NASC CS_SEXO CS_RACA ID_MN_RESI ID_AGRAVO
#> 1 2012-04-11 2012-04-04 M 4 610213 A509
#> 2 2010-09-17 1988-04-23 M 1 610213 W64
#> 3 2010-10-19 1971-03-25 M NA 610250 X58
#> 4 2008-04-14 1928-05-29 F 4 610213 A90
#> 5 2011-06-20 2002-09-18 M 4 610250 B19
#> 6 2008-02-12 1953-08-01 F 9 610213 A90
Como visto, os comandos acima selecionaram as colunas de interesse:
Data da notificação (DT_NOTIFIC
), Data de nascimento
(DT_NASC
), Sexo (CS_SEXO
), Raça/cor
(CS_RACA
), Código do município de residência
(ID_MN_RESI
), Código do CID10 do agravo notificado
(ID_AGRAVO
) e, então, apresentam em seu console as linhas
iniciais da tabela gerada.
Acompanhe as próximas seções deste módulo em que utilizaremos o
pipe (|>
) para analisar dados de vigilância em
saúde.