Qué es un outlier y cómo detectarlo en R
Un outlier (o valor atípico) es una observación que se aleja mucho del resto. Puede ser un error de medición, un caso excepcional real o simplemente un dato mal introducido. Y da igual cuál de las tres cosas sea: si no lo detectas, contaminará tus resultados.
Por qué importan tanto
Vuelve a este ejemplo clásico:
sueldos <- c(1300, 1350, 1400, 1450, 1500, 25000)
mean(sueldos)
median(sueldos)
La media te dice que el sueldo típico ronda los 5.300 € (frente a una mediana de 1.425 €). Nadie de ese grupo cobra eso. Un único valor ha desplazado la media casi cuatro veces por encima de la realidad.
Los outliers no solo afectan a la media: inflan la desviación típica, distorsionan las correlaciones y pueden hacer que un modelo de regresión apunte en la dirección equivocada.
El método más usado: el rango intercuartílico
La regla más extendida se apoya en los cuartiles. El rango intercuartílico (IQR) es la distancia entre el primer y el tercer cuartil, es decir, el espacio que ocupa el 50 % central de los datos.
Se considera atípico todo valor que quede:
- por debajo de
Q1 − 1,5 × IQR - o por encima de
Q3 + 1,5 × IQR
En R:
sueldos <- c(1300, 1350, 1400, 1450, 1500, 25000)
q1 <- quantile(sueldos, 0.25)
q3 <- quantile(sueldos, 0.75)
iqr <- IQR(sueldos)
limite_inferior <- q1 - 1.5 * iqr
limite_superior <- q3 + 1.5 * iqr
sueldos[sueldos < limite_inferior | sueldos > limite_superior]
El resultado señala el 25000 como valor atípico.
Puedes empaquetarlo en una función reutilizable:
detectar_outliers <- function(x) {
q1 <- quantile(x, 0.25, na.rm = TRUE)
q3 <- quantile(x, 0.75, na.rm = TRUE)
iqr <- IQR(x, na.rm = TRUE)
x[x < (q1 - 1.5 * iqr) | x > (q3 + 1.5 * iqr)]
}
detectar_outliers(sueldos)
El atajo: boxplot.stats()
R ya trae este cálculo incorporado, porque es exactamente el criterio que usa el diagrama de caja:
boxplot.stats(sueldos)$out
Y si quieres verlo de un vistazo:
boxplot(sueldos, horizontal = TRUE,
main = "Distribución de sueldos")
Los puntos que aparecen fuera de los "bigotes" son los outliers.
¿Eliminarlos o no?
Aquí está la parte que casi nadie explica bien: borrar un outlier no siempre es lo correcto. Antes de decidir, pregúntate de dónde sale.
Es un error (un peso de 700 kg en personas, una edad de 250 años). Corrígelo o elimínalo: no representa nada real.
Es un caso real y excepcional (el sueldo del director general). No lo borres sin más: forma parte de la realidad que estudias. Lo razonable es usar medidas resistentes como la mediana, o analizarlo por separado.
Es justamente lo que buscas. En detección de fraude, averías o intrusiones, el outlier es la señal. Eliminarlo sería tirar el hallazgo a la basura.
Si decides excluirlos para un análisis concreto:
sin_outliers <- sueldos[!(sueldos %in% detectar_outliers(sueldos))]
mean(sin_outliers) # Ahora sí representa al grupo
Documenta siempre que has excluido observaciones y por qué. Un análisis que elimina datos sin explicarlo no es reproducible.
En resumen
Un outlier es un valor muy alejado del resto. El método del rango intercuartílico (Q1 − 1,5 × IQR y Q3 + 1,5 × IQR) es el estándar para detectarlos, y en R lo tienes resuelto con IQR() o directamente con boxplot.stats(). Lo importante no es la fórmula, sino la decisión posterior: entender por qué ese dato está ahí antes de tocarlo.