# 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

{% file src="<https://content.gitbook.com/content/rM42Q5mZztagDRQM9E7z/blobs/COVrWE5iIqvXii86gIy9/ozone.csv>" %}

```r
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 <mark style="color:green;">**`outliers()`**</mark>

```r
# 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:

```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.

{% hint style="info" %}
Piensa cuidadosamente si quitar o no los datos atípicos de tu base de datos. Un dato atípico no es un dato que se va de la media sino un dato que realmente es incorrecto.&#x20;
{% endhint %}
