En este tutorial te explico cómo detectar valores atípicos en tu dataset y qué hacer para manejar outliers en Python.
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:
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:
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 entrenar un modelo de Machine Learning, la cantidad y tipo de outliers presente puede determinar el modelo que seleccionemos.
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()
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.
Cada cuartil es el valor que divide al conjunto de datos en cuatro partes iguales.
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.
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
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.
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
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.
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.
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.
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 🙂.
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.
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'])
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.
Es parecido a los cuartiles de antes pero cambiando los porcentajes 🙂.
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.