DEV Community

Carlos-Ed-B
Carlos-Ed-B

Posted on

1 3

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.

Image of Datadog

How to Diagram Your Cloud Architecture

Cloud architecture diagrams provide critical visibility into the resources in your environment and how they’re connected. In our latest eBook, AWS Solution Architects Jason Mimick and James Wenzel walk through best practices on how to build effective and professional diagrams.

Download the Free eBook

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay