Detectar y tratar valores atípicos
Identifique valores atípicos mediante el rango intercuartílico y las puntuaciones Z, decida si debe limitarlos, eliminarlos o marcarlos, y documente las decisiones.
Detectar y tratar valores atípicos es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué es un valor atípico?
Un valor atípico es un dato que difiere considerablemente del resto del conjunto de datos. Los valores atípicos pueden ser genuinos (un único cliente empresarial con un pedido de $500,000 en un conjunto de datos donde los pedidos tienen un valor medio de $100) o erróneos (un precio negativo o un error tipográfico que convirtió 120 en 12,000). El primer paso para tratar un valor atípico es decidir si el valor extremo es real y relevante o si se debe a un problema de calidad de datos; el tratamiento es muy diferente en cada caso.
import pandas as pd
import numpy as np
df = pd.read_parquet('sales_clean.parquet')
print(df['revenue'].describe())Detección visual de valores atípicos: diagrama de caja
Un diagrama de caja es la herramienta visual más rápida para detectar valores atípicos. La caja abarca el rango intercuartílico (IQR, Q1–Q3), los bigotes se extienden hasta 1.5× IQR y los puntos situados fuera de los bigotes se representan individualmente como posibles valores atípicos. Use df['revenue'].plot(kind='box') o sns.boxplot() de Seaborn para ver inmediatamente los valores atípicos sin calcular los umbrales manualmente.
import matplotlib.pyplot as plt
import seaborn as sns
fig, ax = plt.subplots(figsize=(6, 4))
df['revenue'].plot(kind='box', ax=ax)
ax.set_title('Revenue Distribution — Box Plot')
plt.tight_layout()
plt.show()Método de cercas del IQR
El método de cercas del IQR calcula el rango intercuartílico y define los límites en Q1 − 1.5×IQR y Q3 + 1.5×IQR. Los valores que quedan fuera de estos límites se marcan como valores atípicos. El multiplicador 1.5 es el estándar para valores atípicos leves; use 3.0 únicamente para valores atípicos extremos. Este método es robusto: a diferencia de las puntuaciones Z, no presupone una distribución normal.
Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['revenue'] < lower) | (df['revenue'] > upper)]
print(f'Q1={Q1:.0f}, Q3={Q3:.0f}, IQR={IQR:.0f}')
print(f'Bounds: [{lower:.0f}, {upper:.0f}]')
print(f'Outliers: {len(outliers)}')Método de la puntuación Z para detectar valores atípicos
La puntuación Z mide cuántas desviaciones estándar separan un valor de la media. Convencionalmente, un valor con |Z| > 3 se considera atípico, lo que abarca el 99.7 % de los datos con distribución normal. Sin embargo, las puntuaciones Z son sensibles a los mismos valores atípicos que intentan detectar: los valores extremos desplazan la media y aumentan la desviación estándar, lo que puede ocultar otros valores atípicos.
mean = df['revenue'].mean()
std = df['revenue'].std()
df['revenue_z'] = (df['revenue'] - mean) / std
z_outliers = df[df['revenue_z'].abs() > 3]
print(f'Z-score outliers (|z|>3): {len(z_outliers)}')
print(z_outliers[['revenue', 'revenue_z']].head())Marcar frente a eliminar valores atípicos
No elimine nunca valores atípicos sin documentar y justificar la decisión. En su lugar, primero márquelos con una columna booleana (is_outlier) y, después, analice si comparten algún patrón (la misma región, el mismo producto o el mismo día). Si son genuinos, consérvelos y modélelos explícitamente. Si son errores, elimínelos y registre el número de eliminaciones en el historial de auditoría del pipeline.
df['is_revenue_outlier'] = (df['revenue'] < lower) | (df['revenue'] > upper)
print('Flagged rows:', df['is_revenue_outlier'].sum())
print(df.groupby('is_revenue_outlier')['revenue'].describe())Limitar (winsorizar) valores atípicos
Limitar (o winsorizar) sustituye los valores que superan los límites por el propio valor límite, en lugar de eliminar la fila. Así se conservan todas las filas del conjunto de datos y se reduce la distorsión que los valores atípicos provocan en los modelos lineales y en las estadísticas de resumen. Use clip(lower=, upper=) para aplicar los límites en una sola operación vectorizada.
df['revenue_capped'] = df['revenue'].clip(lower=lower, upper=upper)
print('Original max:', df['revenue'].max())
print('Capped max:', df['revenue_capped'].max())
print('Rows changed:', (df['revenue'] != df['revenue_capped']).sum())Transformación logarítmica para datos sesgados a la derecha
Las distribuciones de ingresos y precios suelen estar sesgadas a la derecha, con una cola larga de valores elevados. Aplicar una transformación logarítmica con np.log1p() (el logaritmo del valor + 1 para gestionar los ceros) comprime la cola y hace que la distribución sea más simétrica. Muchos modelos estadísticos y visualizaciones presuponen normalidad, por lo que una transformación logarítmica de la columna de ingresos antes de modelar suele mejorar los resultados.
df['log_revenue'] = np.log1p(df['revenue'])
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df['revenue'].hist(bins=50, ax=axes[0])
axes[0].set_title('Original Revenue')
df['log_revenue'].hist(bins=50, ax=axes[1])
axes[1].set_title('Log Revenue')
plt.tight_layout()
plt.show()Valores atípicos en varias columnas
Al analizar muchas columnas a la vez, calcule mediante programación los límites de valores atípicos del IQR para todas las columnas numéricas. Recorra las columnas numéricas, calcule los límites y guarde los resultados en un diccionario. Así podrá generar un informe completo de valores atípicos en unas pocas líneas, en lugar de repetir manualmente el cálculo del IQR para cada columna.
numeric_cols = df.select_dtypes(include=['number']).columns
outlier_report = {}
for col in numeric_cols:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
n_out = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
outlier_report[col] = n_out
print(pd.Series(outlier_report).sort_values(ascending=False))Valores atípicos bivariantes con diagramas de dispersión
Algunos puntos solo son atípicos en combinación: un unit_price de $10 es normal, una quantity de 500 es inusual pero no imposible, pero un unit_price de $10 junto con una quantity de 500 para un artículo de lujo resulta sospechoso. Los valores atípicos bivariantes aparecen como puntos aislados en los diagramas de dispersión. Use df.plot.scatter('quantity', 'unit_price') para detectar puntos alejados del grupo principal.
fig, ax = plt.subplots(figsize=(8, 5))
df.plot.scatter(x='quantity', y='unit_price', alpha=0.3, ax=ax)
ax.set_title('Quantity vs. Unit Price — Bivariate Outliers')
plt.tight_layout()
plt.show()Documentar las decisiones sobre valores atípicos
Toda decisión sobre valores atípicos debe registrarse: la columna, el método de detección, el umbral utilizado, el número de filas marcadas y el tratamiento aplicado (conservar, limitar o eliminar). Esta documentación protege al analista en revisiones de código y auditorías. Guárdela en un diccionario de registro de limpieza junto con el conjunto de datos de salida.
outlier_log = {
'column': 'revenue',
'method': 'IQR 1.5x',
'lower_bound': round(lower, 2),
'upper_bound': round(upper, 2),
'rows_flagged': int(df['is_revenue_outlier'].sum()),
'treatment': 'cap (winsorise)'
}
for k, v in outlier_log.items():
print(f'{k}: {v}')Guardar el conjunto de datos tratado
Después de marcar y tratar los valores atípicos, guarde el DataFrame actualizado. Mantenga la columna indicadora is_outlier en la salida para que los usuarios posteriores puedan optar por excluir las filas marcadas en análisis específicos. Guarde la versión limitada en una columna con un sufijo claro (_capped) junto a la original para que la limpieza sea reversible.
cols_to_save = [c for c in df.columns if c not in ['revenue_z']]
df[cols_to_save].to_parquet('sales_treated.parquet', index=False)
print('Outlier-treated dataset saved:', df.shape)Comprobación rápida
Compruebe su comprensión de los conceptos de análisis de datos de esta lección.
Resumen de la lección
En esta lección ha aprendido a: detectar valores atípicos mediante cercas del IQR y puntuaciones Z, decidir si debe marcar, limitar o eliminar valores atípicos y aplicar transformaciones logarítmicas a distribuciones sesgadas a la derecha. A continuación exploraremos la estandarización de etiquetas de categorías inconsistentes en columnas de texto.
Preguntas frecuentes
¿La lección «Detectar y tratar valores atípicos» es gratis?
Sí — el texto completo de «Detectar y tratar valores atípicos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Detectar y tratar valores atípicos»?
Identifique valores atípicos mediante el rango intercuartílico y las puntuaciones Z, decida si debe limitarlos, eliminarlos o marcarlos, y documente las decisiones. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Pandas & NumPy Academy?
No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Detectar y tratar valores atípicos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?
Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Detectar y eliminar duplicados
- Detectar y tratar valores atípicos
- Estandarizar categorías inconsistentes
- Validación de esquemas y aserciones