#title: “limpeza_de_dados”
#author: “antonio_sergio_da_silva”
#date: “31/10/2021”
#output: html_document

Limpeza de Dados

Limpeza de Dados

Limpeza de Dados

Limpeza de Dados

Antonio Sergio da Silva

Antonio Sergio da Silva

Antonio Sergio da Silva

Criado no RStudio Version 1.3.1073, R Version 4.0.2


As ferramentas para a limpeza de dados imputam valores ausentes, suavizam ruídos, identificam valores discrepantes e corrigem inconsistências.

 

Valores ausentes

 

Um valor ausente na base de dados caracteriza um valor ignorado ou que não foi observado.

A imputação ou a substituição de valores ausentes busca estimar estes valores usando informações disponíves na base de dados.

A imputação de valores ausentes implica em perda de informação relevante de algum atributo.

Não obstante, diversos algoritmos para mineração de dados desconseguirem operar com valores ausentes, deve-se atentar para que a imputação de valores não enviese a base de dados.


Caracterização da distribuição dos valores ausentes

 

Missing Completely At Random - MCAR - Ausência de dados completamente aleatória, independentemente de eventos externos. Exemplo: erro de entrada de dados por digitadores.

Missing At Random - MAR - Ausência de dados aleatórios que dependem de dados observados.

Exemplo: homens estarem mais dispostos a informar a idade real do que as mulheres.

Not Missing At Random - NMAR - Ausência de dados não aleatória. A ausência depende de valores não observados.

Exemplo: o valor do salário informado corretamente por uma pessoa.


Métodos para imputação de valores ausentes

 

É muito importante analisar o impacto na análise de dados em relação aos dados ausentes. Recomenda-se:

  1. Investigar as razões dos dados ausentes e tomar ações para previnir a recorrência;

  2. Investigar o impacto dos dados ausentes no resultado das análises, considerando a confiabilidade, a validade e a generalização das conclusões;

  3. Considerar mais de um método para a imputação de dados ausentes;

  4. Selecionar o método de imputação de dados que cause o menor impacto no resultado das análises.


 

Exemplo Didático para Limpeza de Banco de Dados

 

Amostra da base de dados mamo (de Castro & Ferrari, 2016).

 

if (!require("pacman")) install.packages("pacman")
## Carregando pacotes exigidos: pacman
pacman::p_load(pacman, magrittr, rio, tidyverse, 
               readxl, openxlsx, writexl,
               sampling, 
               knitr, xtable, stargazer)

mamo <- import("C:/Users/tao28/OneDrive/Documentos/r_data_analysis_2021/r_markdown/mamo.xlsx") 

Nota explicativa sobre os pacotes carregados.

pacman: for loading/unloading packages (package management tool).

magrittr: for a forwarding pipe operator.

rio: for importing data.

tidyverse: import, tidy, transform, visualize, and model data.

readxl: for reading excel files.

openxlsx: does not require rJava package.

writexl: for exporting excel files.

sampling: for generating samples.

knitr/xtable/stargazer: for generating tabels on RMarkdown.

 

A função no R para testar a presença de missing data em um dataframe pode ser complete.cases().

 

complete.cases(mamo)
##  [1]  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE

 

Importa verificar cada atributo individualmente.

Às vezes um ou mais atributos podem contribuir por uma maior quantidade de dados ausentes. Nestes casos, pode ser útil eliminar o(s) atributo(s) predomimante(s), ao invés de descartar os objetos.

A função apply usada com a função is.na soma os dados ausentes em cada atributo.

 

apply(apply(mamo, 2, is.na), 2, sum)
##         id     BIRADS      idade      forma   contorno  densidade severidade 
##          0          0          0          2          3          2          0

 

Neste exemplo, o atributo contorno tem três valores ausentes.

 

Estrutura da base de dados

 

str(mamo)
## 'data.frame':    10 obs. of  7 variables:
##  $ id        : num  1 2 3 4 5 6 7 8 9 10
##  $ BIRADS    : num  5 4 5 4 5 4 4 5 5 5
##  $ idade     : num  67 43 58 28 74 65 70 42 57 60
##  $ forma     : chr  "lobular" "redonda" "irregular" "redonda" ...
##  $ contorno  : chr  "especulada" "circunscrita" "especulada" "circunscrita" ...
##  $ densidade : chr  "baixa" NA "baixa" "baixa" ...
##  $ severidade: chr  "maligno" "maligno" "maligno" "benigno" ...

 

No R, o tipo int designa tanto o tipo numérico discreto, quanto o tipo numérico contínuo.

O tipo Factor designa o tipo categórico nominal. Duas informações são apresentadas: levels (nível) que representa a quatidade de valores existentes na variável sob estudo; e uma conversão para números, por conveniência da linguagem.

 

A seguir, as conversões dos atributos de interesse em fatores.

 

mamo[,2] <- as.factor(mamo[,2])
mamo[,4] <- as.factor(mamo[,4])
mamo[,5] <- as.factor(mamo[,5])
mamo[,6] <- as.factor(mamo[,6])
mamo[,7] <- as.factor(mamo[,7])

str(mamo)
## 'data.frame':    10 obs. of  7 variables:
##  $ id        : num  1 2 3 4 5 6 7 8 9 10
##  $ BIRADS    : Factor w/ 2 levels "4","5": 2 1 2 1 2 1 1 2 2 2
##  $ idade     : num  67 43 58 28 74 65 70 42 57 60
##  $ forma     : Factor w/ 3 levels "irregular","lobular",..: 2 3 1 3 3 3 NA 3 3 NA
##  $ contorno  : Factor w/ 2 levels "circunscrita",..: 2 1 2 1 2 NA NA NA 2 2
##  $ densidade : Factor w/ 2 levels "alta","baixa": 2 NA 2 2 NA 2 2 2 2 1
##  $ severidade: Factor w/ 2 levels "benigno","maligno": 2 2 2 1 2 1 1 1 2 2

 

O tipo categórico ordinal é tratado no R com a função ordered(). Esta função recebe um Factor que retorna um tipo categórico ordinal.

 

ordered(mamo[,2], c("4", "5"))
##  [1] 5 4 5 4 5 4 4 5 5 5
## Levels: 4 < 5
str(mamo)
## 'data.frame':    10 obs. of  7 variables:
##  $ id        : num  1 2 3 4 5 6 7 8 9 10
##  $ BIRADS    : Factor w/ 2 levels "4","5": 2 1 2 1 2 1 1 2 2 2
##  $ idade     : num  67 43 58 28 74 65 70 42 57 60
##  $ forma     : Factor w/ 3 levels "irregular","lobular",..: 2 3 1 3 3 3 NA 3 3 NA
##  $ contorno  : Factor w/ 2 levels "circunscrita",..: 2 1 2 1 2 NA NA NA 2 2
##  $ densidade : Factor w/ 2 levels "alta","baixa": 2 NA 2 2 NA 2 2 2 2 1
##  $ severidade: Factor w/ 2 levels "benigno","maligno": 2 2 2 1 2 1 1 1 2 2

 

Tabela resumo dos atributos

 

Valores ausentes Valores inconsistentes Valores ruidosos Redundância de dados
Sim Não Não Não

 

Cat Binário Cat Nominal Cat Ordinal Num Discreto Num Contínuo
Severidade Forma BI-RADS Idade -
- Margem - - -
- Densidade - - -

LDD1 - Ignorar o objeto

 

Consiste na remoção de todos os objetos da base que possuem um ou mais valores ausentes.

Nesta base mamo, o método ignoraria os objetos 2, 5, 6, 7, 8 e 10. Isto descartaria 60% dos objetos da base de dados.

 

mamo_ignorar_objeto <- mamo[-c(2, 5, 6, 7, 8, 10),] 

mamo_ignorar_objeto
##   id BIRADS idade     forma     contorno densidade severidade
## 1  1      5    67   lobular   especulada     baixa    maligno
## 3  3      5    58 irregular   especulada     baixa    maligno
## 4  4      4    28   redonda circunscrita     baixa    benigno
## 9  9      5    57   redonda   especulada     baixa    maligno

 

O descarte dos objetos com atributos ausentes também pode ser feito com a função na.omit().

 

mamo <- import("C:/Users/tao28/OneDrive/Documentos/r_data_analysis_2021/r_markdown/mamo.xlsx")

mamo_omitir <-na.omit(mamo)

mamo_omitir
##   id BIRADS idade     forma     contorno densidade severidade
## 1  1      5    67   lobular   especulada     baixa    maligno
## 3  3      5    58 irregular   especulada     baixa    maligno
## 4  4      4    28   redonda circunscrita     baixa    benigno
## 9  9      5    57   redonda   especulada     baixa    maligno

LDD2 - Imputar manualmente os valores ausentes

 

Consiste em imputar, manualmente, um valor empírico para cada valor ausente.

Este método demanda grande esforço manual. Os valores imputados devem respeitar o domínio de cada atributo.


LDD3 - Usar uma constante global para imputar o valor ausente

 

Consiste em substituir todos os valores ausentes de um determinado atributo por uma única constante.

O algoritmo de mineração pode considerar que essa constante seja um conceito relevante, o que requer atenção do analista.

 

mamo[is.na(mamo)]<- "redonda"

mamo
##    id BIRADS idade     forma     contorno densidade severidade
## 1   1      5    67   lobular   especulada     baixa    maligno
## 2   2      4    43   redonda circunscrita   redonda    maligno
## 3   3      5    58 irregular   especulada     baixa    maligno
## 4   4      4    28   redonda circunscrita     baixa    benigno
## 5   5      5    74   redonda   especulada   redonda    maligno
## 6   6      4    65   redonda      redonda     baixa    benigno
## 7   7      4    70   redonda      redonda     baixa    benigno
## 8   8      5    42   redonda      redonda     baixa    benigno
## 9   9      5    57   redonda   especulada     baixa    maligno
## 10 10      5    60   redonda   especulada      alta    maligno

LDD4 - Imputação hot-deck

 

Seleciona-se um valor similar aleatoriamente dentre os atributos de um objeto e o substitui pelo valor ausente.


LDD5 -Imputar de acordo com a última observação

 

Ordena-se a base de dados por um ou mais de seus atributos.

Identifica-se o valor ausente.

Usa-se o valor da célula imediatamente anterior para imputar o valor ausente.

Este método difere-se do hot-deck porque o critério de similaridade não é aleatório, mas baseado em uma ordenação da base.


LDD6 - Usar a média ou a moda de um atributo para imputar o valor ausente

 

Consiste em substituir os valores ausentes de cada atributo pela média (atributos numéricos: discreto, contínuo, razão) ou pela moda (atributos categóricos : binário, nominal, ordinal).

Método sensível aos outliers.


LDD7 - Usar a média ou a moda de todos os objetos da mesma classe para imputar o valor ausente

 

Neste método, a média ou a moda é tomada considerando-se apenas os objetos da mesma classe daquele que contém o valor ausente.

Método sensível aos outliers.


LDD8 - Usar modelos preditivos para imputar o valor ausente

 

Neste método, o valor ausente é considerado como um atributo dependente e os demais valores como atibutos independentes.

Pode-se escolher algum modelo preditivo para estimar os valores ausentes.


Exemplo: processo de preparação da base de dados (tarefa limpeza de dados)

 

mamo_imput <- import("C:/Users/tao28/OneDrive/Documentos/r_data_analysis_2021/r_markdown/mamo.xlsx", sheet = 2, col_names = TRUE) %>% 
  as_tibble()

mamo_imput
## # A tibble: 10 x 7
##       id `BI-RADS` idade forma     contorno     densidade severidade
##    <dbl>     <dbl> <dbl> <chr>     <chr>        <chr>     <chr>     
##  1     1         5    67 lobular   especulada   baixa     maligno   
##  2     2         4    43 redonda   circunscrita baixa     maligno   
##  3     3         5    58 irregular especulada   baixa     maligno   
##  4     4         4    28 redonda   circunscrita baixa     benigno   
##  5     5         5    74 redonda   especulada   baixa     maligno   
##  6     6         4    65 redonda   circunscrita baixa     benigno   
##  7     7         4    70 redonda   circunscrita baixa     benigno   
##  8     8         5    42 redonda   circunscrita baixa     benigno   
##  9     9         5    57 redonda   especulada   baixa     maligno   
## 10    10         5    60 irregular especulada   alta      maligno

 

Para o atributo forma , na classe benigno, o valor mais frequente (moda) é redonda; e na classe maligno, a moda é irregular.

Para o atributo contorno, na classe benigno, a moda é circunscrita; e na classe maligno, a moda é mal definida.

Para o atributo densidade, tanto na classe benigno, quanto na classe maligno, a moda é baixa.

Portanto, neste exemplo, foi usado o critério LDD7.

 

knitr::kable(mamo_imput, 
             align = "c", 
             caption = "Mammographic Mass Data Sample")
Mammographic Mass Data Sample
id BI-RADS idade forma contorno densidade severidade
1 5 67 lobular especulada baixa maligno
2 4 43 redonda circunscrita baixa maligno
3 5 58 irregular especulada baixa maligno
4 4 28 redonda circunscrita baixa benigno
5 5 74 redonda especulada baixa maligno
6 4 65 redonda circunscrita baixa benigno
7 4 70 redonda circunscrita baixa benigno
8 5 42 redonda circunscrita baixa benigno
9 5 57 redonda especulada baixa maligno
10 5 60 irregular especulada alta maligno

 


Referências bibliográficas

 

Crawley, M.J. (2013). The R Book. Chichester, UK: Wiley.

Da Silva, L. A., Peres, S.M. & Boscarioli, C. (2016,2021). Introdução à mineração de dados: com aplicações em R. 1. ed. [Reimpr.]. Rio de Janeiro: LTC.

De Castro, L.N. & Ferrari, D.G. (2016). Introdução à mineração de dados: conceitos básicos, algoritmos, e aplicações. São Paulo: Editora Saraiva.

Goldschmidt, R. & Passos, E. (2006). Data mining: um guia prático. Conceitos, técnicas, ferramentas, orientações e aplicações. Rio de Janeiro: Campus/Elsevier.


 

Acesse a base de dados original Mammographic Mass Data Set.

 

Acesse a página Tabela de Cores HTML para acessar códigos de cores em HTML.

 

Acesse a página do RMarkdown.

 

De acordo com a RN N 405 da ANS, O PM-QUALISS avaliará de forma sistemática os indicadores individualizados por prestador e coletivamente para obtenção de medidas de tendência e de outros parâmetros estatísticos.