Detección de datos atípicos y su tratamiento (automatización)
Con la base de datos ozone
de R comprueba si las variables tienen datos atípicos
inputData <- read.csv("ozone.csv") # import data
Para ver si hay datos atípicos en todas las variables numéricas de esta base de datos, podemos pensar en automatizar la comprobación creando una función.
Esta sería la función propia outliers()
# Inspirado en: https://datascienceplus.com/identify-describe-plot-and-removing-the-outli0ers-from-the-dataset
outliers <- function(tt) {
var_name<-eval(parse(text = tt))
tot <- sum(!is.na(var_name))
na1 <- sum(is.na(var_name))
par(mfrow=c(1, 2), oma=c(0,0,3,0))
hist(var_name, main="All observations", xlab=NA, ylab=NA)
outlier <- boxplot.stats(var_name,coef = 3)$out
var_name <- ifelse(var_name %in% outlier, NA, var_name)
na2 <- sum(is.na(var_name))
hist(var_name, main=c("Outliers removed",paste0(round((na2 - na1) / tot*100,2),"%")),
xlab=NA, ylab=NA) title(paste0("Outlier Check for ",tt), outer=TRUE)
message("Outliers identified in ", tt, ": ", na2 - na1, " from ", tot, " observations")
message("Proportion (%) of outliers: ", (na2 - na1) / tot*100)
response <- readline(prompt="Do you want to replace outliers with NA? [yes/no]: ")
if(response == "y" | response == "yes"){
eval(parse(text = paste0(tt, " <<- invisible(var_name)")))
message("Outliers successfully removed", "\n") }
else{
message("Nothing changed", "\n") }
par(mfrow=c(1, 1), oma=c(0,0,0,0))
}
Y para usarla sería como una función cualquiera de R:
outliers("inputData$pressure_height")
# Aplicar la función a múltiples variables numéricas o enteras
numeric_integer_vars <- names(which(sapply(inputData, is.numeric) | sapply(inputData, is.integer)))
outliers_results <- lapply(paste0("inputData$", numeric_integer_vars), outliers)
Esta función proporciona datos extremos, modifica la función para detectar datos atípicos (sin ser extremos) y aplícala a las distintas variables, luego piensa si modificas o no la base de datos.