Manejo de outliers en Python

En este tutorial te explico cómo detectar valores atípicos en tu dataset y qué hacer para manejar outliers en Python.

¿Qué es un outlier o valor atípico?

Un outlier, o valor atípico, es un punto en tu dataset que toma un valor significativamente distinto al resto de datos.

Por ejemplo, imagina que estás midiendo la altura de un grupo de personas, y gran parte de las alturas que has registrado están entre 1.50 y 1.90 metros, pero tienes una medida de 2.30 metros.

La altura de esa persona es significativamente distinta al valor que toma la característica altura en tu dataset para el resto de observaciones.

Los outliers pueden aparecer por varias razones:

  • Errores de medición o de entrada de datos: Por ejemplo, alguien podría haber escrito 2.30 metros en lugar de 1.80 metros. Un claro ejemplo de un error sería una altura de 3.80 metros ya que es imposible que la altura de una persona tome ese valor.
  • Variaciones naturales: En algunos casos, los outliers son mediciones correctas y representan variaciones reales, como alguien naturalmente muy alto. Es posible medir 2.30 metros (de hecho, la persona más alta de la historia según el libro Guinness llegó a medir 2.72 metros 😱).
  • Cambios en el proceso de los datos: A veces, un outlier puede indicar un cambio en el comportamiento del sistema que estamos observando, como un pico inusual en el tráfico de un sitio web debido a un evento específico.

Cuando tenemos valores atípicos en nuestro dataset algunos estadísticos como la media y la varianza pueden verse afectados distorsionando sus valores.

Además algunos modelos de Machine Learning pueden ver afectado su rendimiento si se entrenan sobre un dataset con outliers:

  1. Regresión lineal y logística: Estos modelos son muy sensibles a los outliers porque calculan la línea de mejor ajuste basándose en minimizar el error cuadrático.
  2. Modelos basados en distancias (k-NN o K-means): Un outlier puede distorsionar las distancias entre dos puntos de datos, llevando a clasificaciones erróneas o a formación de clusters incorrectos. En el caso de K-means, los outliers pueden arrastrar el centro de un cluster hacia ellos o formar un cluster propio, que no representa realmente una agrupación natural de los datos.
  3. Árboles de decisión: En general es un modelo robusto ante outliers pero éstos pueden influir en la formación de las reglas de decisión. Esto puede hacer que el modelo aprenda reglas específicas para manejar esos outliers en lugar de aprender las tendencias generales en los datos.

¿Cómo identificar un outlier?

A la hora de analizar un dataset es importante detectar si hay outliers presentes para después identificar su naturaleza.

No tomaremos las mismas decisiones para gestionar un outlier que es claramente un error de medición o entrada de datos que uno que nos da información sobre un cambio en el proceso que estamos observando.

Además, si estamos realizando un análisis de datos exploratorio de un dataset sobre el que queremos entranr un modelo de Machine Learning, la cantidad y tipo de outliers presente puede determinar el modelo que selccionemos.

Para ver cómo detectar y manejar outliers vamos a usar el dataset Breast cancer Wisconsin (diagnosis) que está incluido en Scikit-learn.

Si quieres entender mejor las características de este dataset también lo utilizamos en este tutorial sobre normalización de variables numéricas. Ahí te explico más cosas sobre el dataset que vamos a usar 🙂.

Aparte de eso sólo vamos a necesitar un Notebook de Google Colab.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_breast_cancer

cancer_data = load_breast_cancer()
data = pd.DataFrame(cancer_data.data,columns=cancer_data.feature_names)

data['target'] = cancer_data.target
data.head()

Identificar outliers visualmente

Una manera muy rápida de detectar outliers es visualmente mediante un diagrama de caja y bigotes (boxplot) o un histograma, que representa la distribución de los valores de una característica.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Detectar outliers mediante el rango intercuartílico (IQR)

Cada cuartil es el valor que divide al conjunto de datos en cuatro partes iguales.

  • El primer cuartil (Q1) es el valor que tiene el 25% de los datos por debajo de él.
  • El segundo cuartil (Q2) es el que tiene el 50% de los datos por debajo.
  • El tercer cuartil (Q3) es el valor que tiene el 75% de los datos por debajo de él.
  • El cuarto cuartil (Q4) es el valor que tiene todos los datos por debajo.

El rango intercuartílico es el que contiene la mitad central de los datos. Es decir, desde Q1 hasta Q3 y se corresponde con "la caja" de un boxplot.

En la práctica, el IQR se utiliza para identificar outliers.

Un método común es considerar cualquier dato que esté a más de 1.5 veces el IQR por debajo de Q1 o por encima de Q3 como un outlier. Esta regla ayuda a identificar valores que son inusualmente bajos o altos en comparación con el resto del conjunto de datos.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Estos son los outliers para mean area según nuestra definición:

data.loc[outliers,'mean area']
23     1404.0
82     1878.0
108    1509.0
122    1761.0
164    1686.0
180    2250.0
202    1685.0
212    2499.0
236    1670.0
250    1364.0
265    1419.0
272    1491.0
339    1747.0
352    2010.0
368    1546.0
369    1482.0
372    1386.0
373    1335.0
393    1407.0
449    1384.0
461    2501.0
503    1682.0
521    1841.0
563    1347.0
564    1479.0
Name: mean area, dtype: float64

Detectar outliers con la desviación típica

Otro método para detectar outliers es utilizar la desviación típica.

La desviación típica es una medida que indica cuánto se desvían los valores en un conjunto de datos respecto a la media y se utiliza cuando asumimos que los datos siguen una distribución aproximadamente normal o gaussiana.

Si en nuestra variable numérica los valores siguen una distribución normal podemos considerar outliers aquellos que están a más de dos o tres desviaciones estándar de la media.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Estos son los outliers para mean area según nuestra definición:

data.loc[outliers,'mean area']
23     1404.0
82     1878.0
108    1509.0
122    1761.0
164    1686.0
180    2250.0
202    1685.0
212    2499.0
236    1670.0
250    1364.0
265    1419.0
272    1491.0
339    1747.0
352    2010.0
368    1546.0
369    1482.0
372    1386.0
393    1407.0
449    1384.0
461    2501.0
503    1682.0
521    1841.0
564    1479.0
Name: mean area, dtype: float64

¿Qué hacemos con los outliers?

Como ves, tienes mucho que decir a la hora de definir qué considerar como outlier y qué no en tu dataset.

Los criterios que te he indicado son una norma general de definir un outlier pero tú tendrás la última palabra cuando estés analizando tu dataset específico.

A continuación te explico varias técnicas para manejar outliers y cómo implementarlas en Python.

Eliminar los outliers

La opción más rápida una vez hemos identificado los outliers en nuestro dataset es eliminarlos.

Si sospechamos que el outlier es resultado de un error en la entrada de datos, tiene un efecto desproporcionado en el análisis y tenemos un dataset lo suficientemente grande, podría convenirnos esta opción.

Aquí seleccionamos únicamente los valores del dataset que no se consideran como outliers.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Imputar los valores atípicos

De la misma manera que imputamos los valores faltantes podríamos imputar los outliers si confirmamos que el valor atípico es un error, pero podemos estimar un valor más razonable basado en otros datos y nuestro dataset no es lo suficientemente grande como para poder permitirnos descartar observaciones.

Capado de outliers

Al capar los valores atípicos estamos conservando esas observaciones pero sustituímos el outlier por otro valor que elijamos.

Con esto conseguimos limitar la influencia de los outliers sin eliminar observaciones de nuestro dataset 🙂.

Capado con un valor arbitrario

La idea de esta técnica es sustituir los valores atípicos por valores arbitrarios que estén más cercanos a la media de la distribución.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Así queda el boxplot de la característica mean area después de aplicar el capado con un valor arbitrario.

sns.boxplot(data['mean area'])

Winsorizing

Este es un caso particular de capado de los valores atípicos en el que utilizamos los valores de la distribución que se corresponden con un percentil.

Normalmente se elige un percentil 90 - 95 para valores atípicos anormalmente grandes y un percentil 5 - 10 para outliers pequeños.

  • El percentil 90 se corresponde con el valor de la distribución que es mayor o igual al 90% de los datos. Es decir, tiene al 90% de los datos por debajo de él.
  • El percentil 10 se corresponde con el valor de la distribución que es mayor o igual al 10% de los datos. Es decir, tiene al 10% de los datos por debajo de él.

Es parecido a los cuartiles de antes pero cambiando los porcentajes 🙂.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Transformaciones de la distribución de datos

Si llevamos a cabo diferentes transformaciones sobre la variable numérica en la que hemos detectado valores atípicos podemos reducir el impacto de los outliers.

Estas transformaciones las hemos visto en otros tutoriales que te dejo enlazados.

  • Discretización de la variable: Con esta transformación los outliers quedarán recogidos junto con el resto de valores de los bins superior e inferior de la variable por lo que su impacto será mucho más reducido.
  • Normalización de la distribución: Usar transformaciones logarítmicas o de raíz cuadrada, como vemos en el tutorial correspondiente, hacen que la distribución de la variable sea más gaussiana y reduce el impacto de outliers extremos.

Boletín Ninja

Suscríbete a la newsletter y recibe la guía ninja del Big Data y la Inteligencia Artificial.

Guía ninja del Big Data
Copyright © 2024  · Datos 🥷 · Todos los derechos reservados
💼 Aviso legal y cookies