Manejo de outliers

Introducción

En un artículo anterior se discutió la importancia de la limpieza de datos antes de empezar cualquier proyecto de data science. Se describieron algunos pasos que son transversales a cualquier proyecto, como por ejemplo, remover duplicados, corregir errores estructurales, qué hacer con datos faltantes y el manejo de outliers. En este artículo ahondaremos en las diferentes técnicas que existen para abordar el manejo de outliers.

Como ya sabemos, un outlier o valor atípico es aquel que se “escapa” del rango normal de valores de la variable que se está estudiando. Generalmente se producen por errores en las mediciones o describen fenómenos que no representan el funcionamiento común de lo que se está estudiando. Es importante realizar primero un análisis de los datos antes de remover o reemplazar los outliers que se pueden encontrar.

Existen 2 técnicas bien sencillas que permiten detectar outliers para casos univariados: usando rango intercuartil (IQR por sus siglas en inglés) y z-score. Explicaremos brevemente en qué consiste cada uno.

Método IQR

El primer método es un método no-paramétrico que tiene al rango intercuartil como su base. El IQR es simplemente la diferencia entre el tercer y el primer cuartil de la distribución de los datos que se están estudiando. Recordar que, para calcular un cuartil, se ordenan los datos de menor a mayor y se define:

  • Primer cuartil (Q1): es la mediana de la primera mitad del conjunto de datos (percentil 25).
  • Segundo cuartil (Q2): es la mediana de la totalidad de los datos (percentil 50).
  • Tercer cuartil (Q3): es la mediana de la segunda mitad del conjunto de datos (percentil 75).

Luego, el outlier estará dado por aquel valor que esté fuera del rango Q1-1.5*IQR, por debajo; y Q3+1.5*IQR, por arriba. IQR está dado por IQR = Q3-Q1. El valor de 1.5 se debe a que es aquél que más acerca el outlier a un valor de (asumiendo que nuestros datos sigan una distribución Gaussiana). En realidad, un valor de 1.5 equivale a 2.7σ. Una muy buena explicación de estos valores se puede encontrar acá.

Ejemplo:

Tenemos una lista de números

n=(5, 7, 10, 15, 19, 21, 21, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24 24, 25).

Los números ya están ordenados de menor a mayor. Necesitamos encontrar la primera y segunda mitad del conjunto de datos. Para eso, calculamos la mediana. Son 19 puntos, por ende, la mediana vendría dada por 23. Esto separa el conjunto de puntos en grupos de 9 números.

El primer cuartil viene dado por Q1 = 19 (la mitad del segundo conjunto de puntos). Por otra parte, Q3 = 24. De esta manera, IQR = Q3 – Q1 = 5.

El límite inferior es, entonces, Q1 – 1.5*IQR = 11.5, mientras que el límite superior viene dado por Q3 + 1.5*IQR = 31.5

Viendo la lista de números n descrita anteriormente, existen solo 3 outliers en esta lista: 5, 7 y 10. Visualmente, hace sentido. Se puede ver que la mayoría de los números están en un rango de 20 a 25, por lo que 5, 7 y 10 estarían un poco “fuera” de este rango:

n=(5, 7, 10, 15, 19, 21, 21, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24 24, 25).

Método z-score

El segundo método, z-score, es un método paramétrico para detectar outliers. Se asume que los datos siguen una distribución Gaussiana. Los outliers serán los puntos que estén en la cola de la distribución y, por consiguiente, lejos de la media. Este umbral viene dado por:

zi = (xi – µ)/σ

Donde xi es un punto i, µ y σ son la media y la desviación estándar de todos los puntos, respectivamente. El outlier será, entonces, aquel punto que cumpla |zi| > zumbral. Valores típicos de zumbral son 2.5, 3 y 3.5. La definición exacta dependerá del problema en cuestión, y de cuán estricto se quiere ser con los datos.

Métodos para casos multivariados

Uno de ellos se basa en el algoritmo DBSCAN (en inglés, Density-Based Spatial Clustering of Applications with Noise). DBSCAN es un método muy robusto para segmentaciones, pero también se puede utilizar para outliers. A diferencia de K-means, en DBSCAN no todos los puntos pueden pertenecer a algún clúster. Por ende, al fijar una distancia, los puntos que queden fuera de esa distancia (y de los clústers) son considerados como outliers. Un ejemplo de esto se puede ver acá.

Otro método está basado en el algoritmo de Isolation Forest. La idea detrás de este algoritmo es aislar los puntos que son outliers. Este método se basa en la idea de que es más difícil separar un punto “bueno” que un “outlier” de una colección de datos, lo que se define como número de cortes (number of splits). Este número de cortes se encuentra de la siguiente manera:

  • Se escoge aleatoriamente un punto que se quiere aislar.
  • Para cada feature del dataset, se escoge el rango a aislar entre el máximo y el mínimo.
  • Se escoge una feature aleatoriamente.
  • Se escoge un valor, aleatoriamente, que está en el rango de la feature en cuestión (y diferente al punto original).
  • Si el valor escogido hace que el punto original quede arriba, entonces se cambia el valor mínimo de la feature a este valor.
  • Si el valor escogido hace que el punto original quede abajo, entonces se cambia el valor máximo de la feature a este valor.
  • Este proceso se repite cuantas veces sea necesario, hasta que no haya otro punto distinto entre los rangos de la feature.
  • Un outlier se define como aquel punto que necesite un número de cortes inferior a cierto límite impuesto (este límite es uno de los parámetros del algoritmo).

La figura de más abajo muestra un ejemplo de cómo funcionaría el algoritmo (referencia). A la izquierda, hay un punto que requiere de muchos cortes para poder ser aislado, mientras que a la derecha, la figura muestra un punto con muchos menos cortes. Este ejemplo nos diría que el punto de la izquierda es un outlier (número de cortes muy pequeño), mientras que el punto de la izquierda no es outlier (muchos cortes para poder aislarlo).

Otro método es el conocido como Local Outlier Factor (LOF). Este es un algoritmo no-supervisado que calcula la densidad local de un punto dado con respecto a sus vecinos más cercanos. Aquellos puntos que tienen menos densidad que sus vecinos son considerados outliers.

También se puede utilizar la distancia de Mahalanobis para detectar outliers. Esta distancia es la distancia entre un punto y una distribución, y no entre dos puntos diferentes, como sería la distancia euclidiana. Se define como

En donde D es la distancia de Mahalanobis, x es el vector de la observación (una fila en un dataset), m es el vector de los valores medios de las variables independientes (la media de cada columna) y C-1 es la inversa de la matriz de covarianza de las variables independientes.

Veamos con un ejemplo cómo sería la aplicación de estas cuatro técnicas. Para esto, utilizaremos el dataset del valor de casas de Boston que viene con el paquete sklearn de Python.

Con el dataset construido, construiremos una función para calcular la distancia de Mahalanobis.

Para obtener la distancia mínima para decidir si un punto es outlier o no, usualmente se asume que el dataset sigue una distribución multivariada normal con K variables, y la distancia de Mahalanobis sigue una distribución chi-cuadrada con K grados de libertad. Podemos asumir un nivel de significancia razonable (2.5%, 1%, 0.01%). En este caso, escogemos 0.001%. Ese es nuestro valor de corte.

El resultado de ese print es de 17 puntos. Esto quiere decir que del dataset, 17 puntos pueden ser considerados outliers. Veamos el caso con DBSCAN.

Por otro lado DBSCAN acepta como variables min_samples, que es el mínimo de puntos que pueden pertenecer a un grupo, y eps es la distancia mínima entre dos puntos para ser considerado un vecino. Este es un parámetro muy importante, porque influye en el número de grupos que se pueden encontrar. El resultado, clusters, es un valor entre -1 y n para cada punto, en donde n es el número de grupos que encontró, y -1 indica que ese punto no pertenece a ningún grupo. Esos son los outliers. En este caso, el print da como resultado 82.

Para isolation forest, la variable contamination es el porcentaje de datos que puede que sean outliers. Para este caso, lo dejamos como auto, i.e., que lo encuentre automáticamente. Por otro lado, max_features es el máximo número de features sobre el cual entrenar el modelo.

El algoritmo da como resultado 1 para puntos que no son considerados outliers, y -1 para aquellos que sí. En este caso, se encuentran 132 outliers.

Finalmente, en LOF, el parámetro contamination tiene la misma definición que para isolation forest, y n_neighbors es el máximo número de vecinos sobre el cual calcular la densidad.

Para este ejemplo, el resultado del código anterior arroja 51 outliers.

Cierre

Como vemos, los resultados son diferentes para los 4 algoritmos. Además, cada algoritmo tiene parámetros que pueden cambiar el resultado. Generalmente, los parámetros que vienen por default son los que más funcionan. Independiente del método que se utilice, es importante ir revisando los datos después de cada iteración. En ocasiones, se necesita una combinación de métodos para encontrar y remover outliers. Siempre es importante entender los datos que se tienen al frente, y cualquier decisión que se tome (ya sea remover outliers o reemplazarlos por algún otro valor) debe venir acompañado de una definición del negocio, pero sin duda su limpieza es fundamental para conseguir resultados más precisos en las predicciones.