DEV Community

Carlos-Ed-B
Carlos-Ed-B

Posted on

Identificando outliers com R

Em estatística, o outlier (também conhecidos como valor aberrante ou valor atípico) é uma observação que apresenta uma grande diferença dos demais valores ou até mesmo inconsistente.

A existência de outliers implica em uma interpretação errada dos resultados estatísticos.

Existem vários métodos de identificação de outliers, nesse artigo vamos utilizar o gráfico de boxplot.stats e hist.

Para uma melhor apresentação e comparação, vamos criar um método chamado outlierInfo que plota os gráficos com e sem os outliers, com isso, temos uma visão mais nítida comparando os dados.

#outlierInfo: fornece uma analise sobre possiveis outliers em um dado
outlierInfo <- function(dt, var, labelName = "", showMessage = FALSE, removeOutlier = FALSE) {
    varName <- eval(substitute(var), eval(dt))

    tot <- sum(!is.na(varName)) #Total de itens nao null
    na1 <- sum(is.na(varName)) #Total de itens null
    m1 <- mean(varName, na.rm = T) #Media dos itens

    #Criando grafico com os outliers
    par(mfrow = c(2, 2), oma = c(0, 0, 3, 0))
    boxplot(varName, main = "Boxplot com outliers")
    hist(varName, main = "Histograma com outliers", xlab = NA, ylab = NA)
    outlier <- boxplot.stats(varName)$out

    #Criando grafico sem os outliers
    varName <- ifelse(varName %in% outlier, NA, varName)
    boxplot(varName, main = "Boxplot sem outliers")
    hist(varName, main = "Histograma sem outliers", xlab = NA, ylab = NA)
    title(paste(labelName, "Outlier Check"), outer = TRUE)
    na2 <- sum(is.na(varName))

    #Calculando dados com e sem outliers
    outliersCount = na2 - na1
    outliersPercent = ((na2 - na1) / tot * 100)
    meanoutliers <- mean(outlier)
    meanWithOutliers = m1
    meanWithoutOutliers = mean(varName, na.rm = T)

    #Remove os outliers conforme o parametro
    if (removeOutlier) {
        dt[as.character(substitute(var))] <- invisible(var_name)
        assign(as.character(as.list(match.call())$dt), dt, envir = .GlobalEnv)
    }

    #Apresenta informações sobre os dados conforme o paramtro
    if (showMessage) {
        message(labelName, " observations:")
        message("Outliers identified: ", outliersCount, " from ", tot, " observations")
        message("Proportion (%) of outliers: ", outliersPercent)
        message("Mean of the outliers: ", meanoutliers)
        message("Mean with outliers: ", meanWithOutliers)
        message("Mean without outliers: ", meanWithoutOutliers)
    }

    #Crio variavel de retorno
    results <- list()

    #Preencho os dados da variavel de retorno
    results$withoutOutliers <- varName[!is.na(varName)]
    results$withOutliers <- var
    results$outliers <- outlier
    results$outliersCount <- outliersCount
    results$outliersPercent <- outliersPercent
    results$meanoutliers <- meanoutliers
    results$meanWithOutliers <- meanWithOutliers
    results$meanWithoutOutliers <- meanWithoutOutliers

    #Retorno a variavel
    return(invisible(results));
}

Após criado o método, vamos criar o dataframe com os dados do outliers na variável dataOutliers.

dataOutliers <- data.frame(speed = c(18, 19, 19, 20, 20, 20, 23, 22, 25, 25), dist = c(183, 190, 186, 210, 220, 218, 220, 200, 1200, 1250))

O dataframe possui 2 colunas, speed e dist, onde na coluna speed passamos os valores [18, 19, 19, 20, 20, 20, 23, 22, 25, 25] e na coluna dist passamos os valores [183,190, 186, 210, 220, 218, 220, 200, 1200, 1250].

O dataframe possui 2 colunas, speed e dist, onde na coluna speed passamos os valores [18, 19, 19, 20, 20, 20, 23, 22, 25, 25] e na coluna dist passamos os valores [183,190, 186, 210, 220, 218, 220, 200, 1200, 1250].

Após criado o dataFrame, vamos chamar o método outlierInfo e passar os parâmetros:

  • dataOutliers (dataFrame para analise)
  • dataOutliers.dist (coluna do dataFrame para analise)
  • Carros – Distancia (título do gráfico)
  • FALSE (informar os dados no console)
result <- outlierInfo(dataOutliers, dataOutliers$dist, "Carros - Distancia", FALSE)

Analisando os dados

Se olharmos os dados originais, que são representados pelos gráficos Boxplot com outliers e Histograma com outliers, temos no gráfico Boxplot com outliers 2 pontos na parte superior enquanto que no Histograma com outliers temos um gráfico irregular.


Com Outliers

Nos dados tratados, temos os gráficos Boxplot sem outliers e Histograma sem outliers. No gráfico Boxplot sem outliers vemos que os 2 pontos na parte superior sumiram enquanto que no Histograma com outliers temos uma distribuição regular.


Sem Outliers

Conclusão

Utilizando os gráficos boxplot.stats e hist temos uma visão rápida e direta dos dados e com a método outlierInfo que criamos, conseguimos comparar visualmente como seriam os dados com e sem outlers.

Top comments (0)