Outly: Una Librería que desarrollé en Python para detectar outliers
Hola, hoy quiero contarles sobre Outly, una librería que desarrollé para detectar valores atípicos (outliers) de forma sencilla en Python. Con Outly, puedes identificar y manejar outliers usando dos métodos clásicos: el Z-score y el rango intercuartílico (IQR). La idea es facilitar la limpieza de datos sin complicaciones innecesarias.
¿Qué hace Outly?
Outly implementa dos detectores básicos:
ZScoreDetector:
Calcula cuántas desviaciones estándar separan cada dato de la media y marca como outlier aquellos que superan un umbral (por defecto, 3.0).IQRDetector:
Utiliza los cuartiles para definir un rango normal de datos. Un valor se considera atípico si está fuera del intervalo definido por [Q1 - k×IQR, Q3 + k×IQR] (usualmente con k=1.5).
Además, incluye funciones para filtrar o reemplazar esos outliers, por ejemplo, sustituyéndolos por la mediana.
Ejemplo de uso
Aquí les dejo un ejemplo práctico usando el dataset de House Prices de Kaggle, donde se analiza la variable “GrLivArea”:
!pip install outly
import numpy as np
import pandas as pd
from outly import IQRDetector
from outly.utils import filter_outliers, replace_outliers
import matplotlib.pyplot as plt
# Cargar el dataset
df = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/train.csv')
data = df['GrLivArea'].values
# Calcular percentiles para conocer la distribución
q1, med, q3 = np.percentile(data, [25, 50, 75])
print("Q1:", q1, "Mediana:", med, "Q3:", q3)
# Detectar outliers usando IQRDetector (k=1.5)
iqr_detector = IQRDetector(k=1.5)
mask_iqr = iqr_detector.fit_predict(data)
print("Outliers detectados:", data[mask_iqr])
# Visualizar la distribución
plt.figure(figsize=(10,6))
plt.hist(data, bins=30, color='skyblue', edgecolor='black')
plt.axvline(q1, color='orange', linestyle='dashed', linewidth=2, label='Q1')
plt.axvline(q3, color='green', linestyle='dashed', linewidth=2, label='Q3')
plt.title("Histograma de GrLivArea")
plt.xlabel("GrLivArea")
plt.ylabel("Frecuencia")
plt.legend()
plt.show()
plt.figure(figsize=(8,6))
plt.boxplot(data, vert=False)
plt.title("Boxplot de GrLivArea")
plt.xlabel("GrLivArea")
plt.show()
# Filtrar y reemplazar outliers
filtered_data = filter_outliers(data, mask_iqr)
print("Datos sin outliers:", filtered_data)
replaced_data = replace_outliers(data, mask_iqr, replacement='median')
print("Datos con outliers reemplazados:", replaced_data)
Por ejemplo, con el conjunto de datos se obtuvieron los siguientes valores:
Q1: 1129.5
Mediana: 1464.0
Q3: 1776.75
Y se detectaron los siguientes outliers (valores que superan aproximadamente 2748): [2945 3222 3608 3112 2794 3493 2978 3228 4676 2775 3194 3395 4316 3279 3140 2822 2872 2898 3082 2868 2828 3627 3086 2872 4476 3447 5642 2810 2792 3238 2784]
La distribución de GrLivArea está sesgada hacia la derecha (muchos valores en el rango 1000–2000, pero algunos muy altos que se extienden hasta más de 5000), y el boxplot muestra cómo la mediana está alrededor de 1500 y que los puntos por encima de los ~3000 se consideran outliers.
Finalmente, los datos sin outliers quedaron así:Datos sin outliers: [1710 1262 1786 ... 2340 1078 1256]
Y al reemplazar los outliers por la mediana, se obtiene:
Datos con outliers reemplazados: [1710. 1262. 1786. ... 2340. 1078. 1256.]
En este ejemplo, Outly detecta los valores atípicos en “GrLivArea” y te permite ver cómo se pueden filtrar o reemplazar para mejorar la calidad de los datos.
¿Qué sigue?
Outly ya está disponible en PyPI, por lo que cualquiera puede instalarla usando:
!pip install outly
A partir de aquí, seguiré trabajando en Outly para hacerlo más robusto y ampliar sus funcionalidades. Entre las mejoras planeadas se incluyen:
Mejor manejo de errores y validación de datos.
Soporte para otros tipos de datos.
Actualización y ampliación de la documentación con nuevos ejemplos y casos de uso.
Puedes consultar la documentación en:
Outly es una herramienta simple y práctica para detectar outliers. Si buscas una forma ligera de limpiar tus datos, esta librería puede ser una buena opción.