Logo Workshop: Crítica e Imputação de Dados no R: Validate

Tutorial Transformação Digital nº 3

Autores
Afiliações

Fundação João Pinheiro

Fundação João Pinheiro/Cedeplar

Resumo

Neste tutorial, exploramos o poderoso pacote validate do R, que é uma ferramenta essencial para validar dados e garantir a qualidade dos resultados em projetos. O pacote validate oferece uma variedade de funções que nos permitem verificar a validade dos dados criando regras de crítica.

Contato: transformacao.digital@fjp.mg.gov.br

1 Escrevendo e aplicando regras de críticas usando validate

O pacote validate do R é uma ferramenta poderosa que pode ser usada para validar dados e garantir a qualidade dos resultados de um projeto. Ele oferece uma variedade de funções que podem ser usadas para verificar a validade de dados, incluindo:

  • Validação de tipos de dados: O pacote validate pode ser usado para verificar se os dados estão no formato correto. Por exemplo, você pode usar a função is.numeric() para verificar se uma variável é um número.

  • Validação de valores: O pacote validate pode ser usado para verificar se os valores estão dentro de um intervalo aceitável. Por exemplo, você pode usar a função between() para verificar se um valor está entre dois valores especificados.

  • Validação de regras: O pacote validate pode ser usado para verificar se os dados atendem a regras específicas. Por exemplo, você pode usar a função validate() para verificar se um valor é maior que outro valor.

Confrontar os dados com as regras e armazenar os resultados

Van der Loo; de Jonge (2019).

Van der Loo; de Jonge (2019).

Regras de crítica são expressões que são avaliadas ao ser confrontadas com dados, e resultam em um objeto do tipo ‘logical’ (TRUE ou FALSE)

Verificações de tipo da variável: is.numeric, is.character,. . .

Comparações: <, <=, ==, identical, !=, %in%, >=, >

Operadores lógicos: |, &, if, !, all, any

2 Padronização nas regras de crítica

A padronização dos nomes permite que seja possível a identificação da classificação da regra e a presença do atributo de flexibilidade. Define-se a seguinte proposta de nomenclatura para as regras de crítica, conforme Silva (2020):

1 carácter indicando finalidade + 1 carácter indicando flexibilidade + Sequência numérica

Classificação por finalidade

  • Tipo (T): refere-se a classe da variável, são realizadas verificações no sentido de identificar se os dados são numéricos, caracteres, lógicos, entre outros.

  • Validade ou Intervalo (V): refere-se aos intervalos estabelecidos matematicamente para um dado ou indicador. Verificações de valores positivos, intervalos entre 0 e 1, são exemplos de verificação de validades.

  • Fluxo (F): quando se estabelece que uma variável só existirá dado que outra existe, pode-se estabelecer uma regra de fluxo. Pode ser usada para os casos de questionários com as verificações dos “pulos”.

  • Consistência (C): refere-se aos casos em que se verificam as relações matemáticas com outras variáveis, por exemplo, parcelas de um total não podem ser maiores do que o próprio total.

  • Distribuição (D): regras de distribuição estabelecem parâmetros esperados para as estatísticas descritivas da variável como média, moda, mediana, máximo, mínimo e as medidas de dispersão.

Classificação por flexibilidade

  • Flexível (F): construída com parâmetros esperados, mas caso algum caso falhe a regra, precisa ser investigado o motivo, entendendo se a regra deveria ser outra ou se é o caso de se tratar de um valor atípico que futuramente merecerá uma imputação, ou ainda, simplesmente é um valor atípico explicado por alguma situação.

  • Inflexível (I): necessariamente precisa ser seguida, uma regra inflexível é rígida e não existe exceção a sua condição estipulada.

Exemplos

TI01: regra de tipo e inflexível

VI08: regra de validade e inflexível

CF02: regra de consistência e flexível

Por definição, regras da classe tipo, validade e fluxo são inflexíveis. As regras da classe consistência podem ser flexíveis e inflexíveis e, por fim, a regra do tipo distribuição é sempre flexível.

3 Leitura dos dados

Disponível em: base_dados

### Instalação e Carregamento do Pacote

# Lista de pacotes necessários
pacotes <- c('validate', 'tidyverse', 'gt','readxl')

# Verifica se os pacotes estão instalados e instala se necessário
install.packages(setdiff(x = pacotes,
                         y = rownames(installed.packages())))

# Carrega os pacotes
lapply(X = pacotes,
       FUN = library,
       character.only = TRUE)
# Carregando dados

dados <- read_excel("dados/dados_validate.xlsx")


dados %>%
  head(5) %>%
  gt()
IBGE7 S_TXBRUTAMORT S_TXBRUTAMORT_t_1 S_TXBRUTAMORTPAD S_TXMOISQCOR45A59 S_TXMOAVC45A59 S_TXMOATRA15A29 S_TXMOHOMI S_TXMOHOMI15A29 S_TXMOCANCOLUT S_TXMOCANMA S_TXMOCANPUL S_OBITO60 S_NASCBAIXOPESO S_OBINFSIFILS S_OBTETANONEO S_OBRAIVA S_INTERDVHID S_INTERDRSAI S_COBPSF S_NASC7CONSUL D_POPP0 D_POPT U_CONSSAU
3100104 6.631924 7.494074 5.266178 68.01919 34.13898 17.26465 16.37508 18.92622 2.743636 4.047273 12.734716 70.84277 7.966403 0.04761905 0 0 1.4818316 2.424763 63.56396 85.62254 81.32823 6727.818 Sim
3100203 6.901495 6.694450 5.551739 41.06278 59.70752 21.01915 11.13580 11.54727 4.294268 11.389564 12.263125 67.82305 8.727496 0.14285714 0 0 0.5450845 1.695791 73.72931 69.30783 258.86858 23051.727 Sim
3100302 6.972738 6.554374 5.409386 56.15467 70.47148 36.66989 10.12720 14.11258 4.796480 9.526933 7.107865 69.61344 8.588212 0.19047619 0 0 8.4660438 8.706795 88.25773 57.10980 171.93268 13370.409 Sim
3100401 7.218662 7.363035 5.462740 39.95764 65.72227 31.78636 10.34898 19.79552 6.632273 11.331034 14.866371 64.36046 9.979573 0.00000000 0 0 0.8072727 1.296870 88.93818 68.81270 49.09710 4012.364 Sim
3100500 6.133833 5.827141 4.717667 59.36335 53.45524 21.76632 19.14619 36.94967 2.853984 5.538755 6.754168 66.83756 9.117280 0.23809524 0 0 0.8704670 1.241831 92.52909 53.73894 150.48368 10537.500 Sim

A função validator serve para definir um conjunto de regras de críticas que podem ser aplicadas a diferentes tipos de conjuntos de dados.

Verificar valores nulos:

  • Verifique se não há valores nulos em colunas críticas, como “IBGE7,” e outras colunas-chave.

Validar faixas de valores:

  • Verifique se os valores em colunas numéricas estão dentro de faixas aceitáveis, por exemplo, garantir que as taxas estejam entre 0 e 100.

Verificar valores ausentes em grupos de colunas relacionadas:

  • Verifique se as colunas relacionadas, como as taxas de mortalidade, têm valores ausentes em conjunto.

Verificar valores booleanos:

  • Verifique se as colunas com valores lógicos (TRUE/FALSE) estão preenchidas corretamente.

Validar que certas colunas não possuem valores nulos e são numéricas:

  • Certifique-se de que determinadas colunas têm valores numéricos válidos e não nulos.

A função confront serve para aplicar o conjunto de regras de crítica a uma base de dados específica.

4 Regras de tipo (T)

# Crie um conjunto de regras de validade
regras_tipo <- validator(
  #Taxa bruta de mortalidade 
  TI01 = is.numeric(S_TXBRUTAMORT),  
  #Taxa de mortalidade por homicídio da população total
  TI02 = is.numeric(S_TXMOHOMI),
  #Taxa de mortalidade por homicídio da população de 15 a 29 anos
  TI03 = is.numeric(S_TXMOHOMI15A29),
  #Mortalidade proporcional da população idosa
  TI04 = is.numeric(S_OBITO60),
  #Proporção de nascidos vivos com baixo peso
  TI05 = is.numeric(S_NASCBAIXOPESO),
  #Casos confirmados notificados de sífilis congênita em menores de 1 ano
  TI06 = is.numeric(S_OBINFSIFILS),
  #Casos confirmados notificados de raiva humana
  TI07 = is.numeric(S_OBRAIVA),
  #Proporção de internações por doenças de veiculação hídrica
  TI08 = is.numeric(S_INTERDVHID),
  #Proporção de internações por doenças relacionadas ao saneamento ambiental inadequado
  TI09 = is.numeric(S_INTERDRSAI),
  #Existência de Conselho Municipal de Saúde
  TI10 = is.character(U_CONSSAU)
)

# Aplica regras de crítica aos dados
base_conf_tipo <- confront(dados, regras_tipo)

# Obtém resumo da aplicação das regras aos dados
summary(base_conf_tipo) %>% gt()
name items passes fails nNA error warning expression
TI01 1 1 0 0 FALSE FALSE is.numeric(S_TXBRUTAMORT)
TI02 1 1 0 0 FALSE FALSE is.numeric(S_TXMOHOMI)
TI03 1 1 0 0 FALSE FALSE is.numeric(S_TXMOHOMI15A29)
TI04 1 1 0 0 FALSE FALSE is.numeric(S_OBITO60)
TI05 1 1 0 0 FALSE FALSE is.numeric(S_NASCBAIXOPESO)
TI06 1 1 0 0 FALSE FALSE is.numeric(S_OBINFSIFILS)
TI07 1 1 0 0 FALSE FALSE is.numeric(S_OBRAIVA)
TI08 1 1 0 0 FALSE FALSE is.numeric(S_INTERDVHID)
TI09 1 1 0 0 FALSE FALSE is.numeric(S_INTERDRSAI)
TI10 1 1 0 0 FALSE FALSE is.character(U_CONSSAU)
# gráfico
plot(base_conf_tipo)

5 Regras de validade (V)

regras_validade <- validator(
  #Taxa bruta de mortalidade 
  VI01 = (S_TXBRUTAMORT>= 0),  
  #Taxa de mortalidade por homicídio da população total
  VI02 = (S_TXMOHOMI >= 0),
  #Taxa de mortalidade por homicídio da população de 15 a 29 anos
  VI03 = (S_TXMOHOMI15A29 >= 0),
  #Mortalidade proporcional da população idosa
  VI04 = (S_OBITO60 >= 0),
  #Proporção de nascidos vivos com baixo peso
  VI05 = (S_NASCBAIXOPESO >= 0 & S_NASCBAIXOPESO <= 100),
  #Casos confirmados notificados de sífilis congênita em menores de 1 ano
  VI06 = (S_OBINFSIFILS >= 0),
  #Casos confirmados notificados de raiva humana
  VI07 = (S_OBRAIVA >= 0),
  #Proporção de internações por doenças de veiculação hídrica
  VI08 = (S_INTERDVHID >= 0 & S_INTERDVHID <= 100),
  #Proporção de internações por doenças relacionadas ao saneamento ambiental inadequado
  VI09 = (S_INTERDRSAI >= 0 & S_INTERDRSAI <= 100),
  #Existência de Conselho Municipal de Saúde
  VI10 = (U_CONSSAU %in% c("Sim","Não"))
)

# Aplica regras de crítica aos dados
base_conf_validade <- confront(dados, regras_validade)

# Obtém resumo da aplicação das regras aos dados
summary(base_conf_validade) %>% gt()
name items passes fails nNA error warning expression
VI01 853 853 0 0 FALSE FALSE (S_TXBRUTAMORT - 0 >= -1e-08)
VI02 853 819 0 34 FALSE FALSE (S_TXMOHOMI - 0 >= -1e-08)
VI03 853 853 0 0 FALSE FALSE (S_TXMOHOMI15A29 - 0 >= -1e-08)
VI04 853 853 0 0 FALSE FALSE (S_OBITO60 - 0 >= -1e-08)
VI05 853 853 0 0 FALSE FALSE (S_NASCBAIXOPESO - 0 >= -1e-08 & S_NASCBAIXOPESO - 100 <= 1e-08)
VI06 853 853 0 0 FALSE FALSE (S_OBINFSIFILS - 0 >= -1e-08)
VI07 853 853 0 0 FALSE FALSE (S_OBRAIVA - 0 >= -1e-08)
VI08 853 853 0 0 FALSE FALSE (S_INTERDVHID - 0 >= -1e-08 & S_INTERDVHID - 100 <= 1e-08)
VI09 853 853 0 0 FALSE FALSE (S_INTERDRSAI - 0 >= -1e-08 & S_INTERDRSAI - 100 <= 1e-08)
VI10 853 835 18 0 FALSE FALSE (U_CONSSAU %vin% c("Sim", "Não"))
# gráfico
plot(base_conf_validade)

6 Regras de consistência (C)

regras_consistencia <- validator(
  #Taxa bruta de mortalidade 
  CF01 = (S_TXBRUTAMORT/S_TXBRUTAMORT_t_1) <= 1.10,  
  #Casos confirmados notificados de sífilis congênita em menores de 1 ano
  CI06 = (S_OBINFSIFILS <= D_POPP0),
  #Casos confirmados notificados de raiva humana
  CI07 = (S_OBRAIVA <= D_POPT)
)

# Aplica regras de crítica aos dados
base_conf_consistencia <- confront(dados, regras_consistencia)

# Obtém resumo da aplicação das regras aos dados
summary(base_conf_consistencia) %>% gt()
name items passes fails nNA error warning expression
CF01 853 805 48 0 FALSE FALSE (S_TXBRUTAMORT/S_TXBRUTAMORT_t_1) <= 1.1
CI06 853 853 0 0 FALSE FALSE (S_OBINFSIFILS - D_POPP0 <= 1e-08)
CI07 853 853 0 0 FALSE FALSE (S_OBRAIVA - D_POPT <= 1e-08)
# gráfico
plot(base_conf_consistencia)

7 Regras de distribuição (D)

regras_distribuicao <- validator(
    #Casos confirmados notificados de sífilis congênita em menores de 1 ano
  DF01 = (S_OBINFSIFILS  < 5),
  #Casos confirmados notificados de raiva humana
  DF02 = (S_OBRAIVA < 5),
  #Proporção de internações por doenças de veiculação hídrica
  DF03 = (mean(S_INTERDVHID) <= 4),
  #Proporção de internações por doenças relacionadas ao saneamento ambiental inadequado
  DF04 = (mean(S_INTERDRSAI) <= 4),
  #Existência de Conselho Municipal de Saúde
  DF05 = (mean(U_CONSSAU=="Sim") >= 0.95)
)
# Aplica regras de crítica aos dados
base_conf_distribuicao <- confront(dados, regras_distribuicao)

# Obtém resumo da aplicação das regras aos dados
summary(base_conf_distribuicao) %>% gt()
name items passes fails nNA error warning expression
DF01 853 825 28 0 FALSE FALSE (S_OBINFSIFILS < 5)
DF02 853 852 1 0 FALSE FALSE (S_OBRAIVA < 5)
DF03 1 1 0 0 FALSE FALSE (mean(S_INTERDVHID) <= 4)
DF04 1 1 0 0 FALSE FALSE (mean(S_INTERDRSAI) <= 4)
DF05 1 1 0 0 FALSE FALSE (mean(U_CONSSAU == "Sim") >= 0.95)
# gráfico
plot(base_conf_distribuicao)

8 Citação

Gonçalves, C; Marinho,V.. Crítica e Imputação de Dados no R: Validate. Tutorial Transformação Digital. Fundação João Pinheiro, n. 2, 2023. Disponível em: https://rpubs.com/fjp/validate.

9 Referências

Silva, P.L.d.N. (2020). Crítica e Imputação de Dados. Notas de aula - Escola Nacional de Ciências Estatísticas.

van der Loo, M. P. J., & de Jonge, E. (2021). Data Validation Infrastructure for R. Journal of Statistical Software, 97(10), 1–31. https://doi.org/10.18637/jss.v097.i10