Python & Data Science
Estadística En revisión

Cómo gestionar correctamente los datos faltantes (¿Es siempre la imputación la respuesta correcta?)

Imagina mirar una hoja de cálculo de pedidos de clientes. El diez por ciento de la columna “Dirección de envío” está vacío. Tu primer instinto podría ser llenar esos huecos: un conjunto de datos completo parece más profesional, ¿verdad?

Pero la forma en que los llenas, o si los llenas o no, cambia la historia que cuentan tus datos. Los datos faltantes no son solo una molestia. Son un punto de decisión que da forma a todo tu análisis.

1. El problema de los datos faltantes: Por qué importa más de lo que crees

Cuando vemos un NaN o un null en Python, normalmente queremos eliminarlo. Tenemos tres opciones principales: eliminar las filas, rellenarlas (imputación) o construir un modelo que ignore los valores faltantes. La mayoría de los profesionales recurren por defecto a la imputación sin preguntarse por qué faltan los datos. Entonces, ¿qué sucede cuando lo manejamos de forma ingenua?

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression

# Create a dataset where missingness is tied to the outcome
np.random.seed(42)
n = 1000
income = np.random.normal(50000, 10000, n)
spending = 0.5 * income + np.random.normal(0, 2000, n)

df = pd.DataFrame({'income': income, 'spending': spending})

# Scenario: High earners are less likely to report income (Missing Not At Random)
df.loc[df['income'] > 65000, 'income'] = np.nan

# 1. Naive Deletion
df_dropped = df.dropna()
model_dropped = LinearRegression().fit(df_dropped[['income']], df_dropped['spending'])

# 2. Naive Mean Imputation
df_imputed = df.copy()
df_imputed['income'] = df_imputed['income'].fillna(df_imputed['income'].mean())
model_imputed = LinearRegression().fit(df_imputed[['income']], df_imputed['spending'])

print(f"True Slope: 0.5")
print(f"Dropped Slope: {model_dropped.coef_[0]:.3f}")
print(f"Imputed Slope: {model_imputed.coef_[0]:.3f}")
print(f"Dropped R2: {model_dropped.score(df_dropped[['income']], df_dropped['spending']):.3f}")
print(f"Imputed R2: {model_imputed.score(df_imputed[['income']], df_imputed['spending']):.3f}")

En este ejemplo, la relación verdadera es 0.5. Ambos modelos muestran una pendiente casi idéntica (~0.488). La imputación por la media no distorsiona la pendiente en este caso porque las filas imputadas se ubican en el mismo valor de X (la media), aportando casi nada al cálculo de la pendiente. El daño se manifiesta en otra parte: revisa el R² de cada modelo. El R² del modelo imputado es dramáticamente más bajo, cayendo de aproximadamente 0.81 a 0.57. La imputación por la media no sesgó el coeficiente en este escenario, pero inyectó una gran cantidad de ruido inexplicado: 75 filas donde un único valor fijo de X se empareja con un amplio rango de valores de gasto elevados que el modelo no puede explicar. Hicimos que nuestros datos parecieran completos, pero hicimos que el ajuste de nuestro modelo fuera deshonesto.

2. Tres tipos de datos faltantes: Por qué la razón importa más que la cantidad

Elegir la solución correcta comienza por entender el “mecanismo de datos faltantes”. La razón de la brecha importa más que su tamaño.

  1. MCAR (Faltantes completamente al azar): Los datos faltan por pura casualidad. Se agotó la batería de un sensor. Un formulario se perdió en el correo. Nada de esto se relaciona con los datos en sí mismos.
  2. MAR (Faltantes al azar): El nombre es confuso. Lo que significa: que falten datos depende de los datos que podemos ver, no del valor faltante en sí mismo. Los hombres podrían ser menos propensos a reportar su peso. Pero si conocemos su edad y altura, podemos estimarlo con precisión.
  3. MNAR (Faltantes no al azar): Este es el caso más complicado. Que falten datos depende del valor que está ausente. Las personas con deudas muy altas podrían simplemente omitir por completo la pregunta sobre la deuda.
# Visualizing patterns
import seaborn as sns
import matplotlib.pyplot as plt

# Let's check if 'spending' predicts if 'income' is missing
df['is_missing'] = df['income'].isnull()
sns.boxplot(x='is_missing', y='spending', data=df)
plt.title("Is spending different when income is missing?")
plt.show()

Si los boxplots se ven diferentes, es probable que tus datos no sean MCAR. Si el gasto es mayor cuando faltan los datos de ingresos, tienes un patrón que debes tener en cuenta.

3. Cuándo simplemente eliminar filas (y cuándo es una trampa)

Eliminar filas (eliminación por lista) es el enfoque más honesto. No estás inventando nada. Pero solo es seguro si tus datos son MCAR.

Si eliminas filas bajo MAR o MNAR, introduces sesgo. Has eliminado sistemáticamente a un grupo específico de personas de tu estudio. También pierdes “poder”. Los conjuntos de datos más pequeños implican intervalos de confianza más amplios, lo que dificulta demostrar que tus resultados son reales.

Regla general: Si falta menos del 5% de tus datos y parece ruido puro, eliminar suele ser aceptable.

4. Imputación: La navaja suiza (y sus limitaciones)

La imputación completa los valores faltantes para que tus modelos puedan entrenar de verdad.

  • Media/Mediana: Rápido. Pero colapsa la varianza, asumiendo que cada valor faltante se sitúa en el promedio.
  • Imputación KNN: Observa filas similares — los “vecinos” — para estimar un valor. Mucho más inteligente que la media.
  • Imputación Múltiple (MICE): En lugar de una sola suposición, hace varias — típicamente cinco o diez. Yo lo llamaría el estándar de oro: al menos admite que el valor verdadero es incierto.
from sklearn.impute import KNNImputer

imputer = KNNImputer(n_neighbors=5)
df_knn = pd.DataFrame(imputer.fit_transform(df[['income', 'spending']]), columns=['income', 'spending'])
print(f"KNN Imputed Mean: {df_knn['income'].mean():.2f}")

5. La ilusión de la imputación: Por qué más datos no siempre significa mejores datos

El problema es el siguiente: una vez que imputas, tu software trata esos valores rellenados como un hecho. Si rellenas el 20% de tu conjunto de datos con la media, tus errores estándar se reducen. Los resultados se ven más ajustados. Pero esa confianza no es merecida — estás agregando puntos que nunca mediste y tratando la muestra inflada como si fuera real.

6. Alternativas: Cuándo usar indicadores o mantener los datos faltantes

A veces, los datos faltantes son la señal.

  • Indicador de datos faltantes: En lugar de solo imputar, agrega una columna is_income_missing. El modelo puede entonces detectar que las personas que no reportan ingresos se comportan de manera diferente.
  • Manejo nativo: XGBoost y LightGBM manejan NaN internamente. En cada división, dirigen los valores faltantes hacia la dirección que reduzca el error. Esto suele superar a la imputación manual.

7. Un árbol de decisiones: Cómo elegir tu estrategia

¿Cómo elegir? Tres preguntas suelen resolverlo:

  1. ¿Es MCAR? Si es así, y los datos faltantes son menos del 5%, Eliminar.
  2. ¿Es MAR? Si es así, opta por Imputación KNN o Imputación múltiple.
  3. ¿Es MNAR? Si es así, necesitarás Indicadores de datos faltantes o conocimiento del dominio. La imputación simple probablemente no te servirá aquí.

8. Ejemplo real: Datos de pedidos de comercio electrónico

Considera un caso real. A un sitio de comercio electrónico le falta el 5% de sus direcciones de envío, y la mayoría de esos vacíos provienen de usuarios móviles.

  • Eliminación: Perdemos el 5% de los datos — los usuarios móviles — por lo que el análisis sobre-representa a los de escritorio.
  • Imputación por la media: No se puede imputar por la media una dirección postal, así que esto no aplica.
  • Indicador: Marcamos estos casos como “Mobile_Missing”. El modelo capta que los usuarios móviles tienen una tasa de conversión diferente, y esa es la señal que queremos.

9. Lista de verificación de implementación

  1. Contar: Comienza con df.isnull().sum() — te indica la escala de un vistazo.
  2. Visualizar: La librería missingno revela si los datos faltantes se agrupan o se dispersan de forma aleatoria.
  3. Diagnosticar: Comprueba si la ausencia de datos se correlaciona con otras variables en el conjunto de datos.
  4. Decidir: Recorre el árbol de decisión anterior.
  5. Validar: Ejecuta tu modelo de ambas formas, con y sin las filas con datos faltantes. Si los resultados cambian drásticamente, tu imputación probablemente esté sesgando los resultados.

10. ¿Qué sigue?

Los datos faltantes en tablas estáticas son bastante manejables. Pero ¿qué pasa con las series de tiempo, o con las afirmaciones de que X causa Y? A continuación veremos cómo los valores faltantes pueden descarrilar la inferencia causal y cómo DoWhy mantiene el análisis sólido.

Explora más: Ejecuta un imputador KNN en tu proyecto actual y compara la varianza frente a una imputación por la media simple. La diferencia en la “forma” de tus datos suele ser sorprendente.

Comprueba tu comprensión

Las preguntas a continuación avanzan desde el simple recuerdo hasta el diseño abierto, siguiendo de manera aproximada la Taxonomía de Bloom.

Recordar ¿Qué son MCAR, MAR y MNAR, y cuál describe el ejemplo de altos ingresos del artículo?

Comprender Con tus propias palabras, explica por qué el experimento de imputación por la media del artículo dejó la pendiente de la regresión casi sin cambios pero hundió la puntuación R² — ¿cuál es la diferencia entre que un coeficiente esté sesgado y que el ajuste de un modelo se degrade?

Aplicar Utilizando el árbol de decisión del artículo (MCAR + <5% faltante → Eliminar; MAR → KNN/Imputación Múltiple; MNAR → Indicadores/conocimiento del dominio), ¿qué harías con una columna que tiene un 3% de datos faltantes, confirmada como MCAR mediante una verificación con un boxplot?

Analizar El ejemplo de comercio electrónico del artículo encuentra que las direcciones de envío faltantes se correlacionan con los usuarios móviles, y recomienda un indicador “Mobile_Missing” en lugar de la eliminación o la imputación por la media. Explica paso a paso por qué eliminar esas filas específicamente sesga el análisis hacia los usuarios de escritorio, de una manera en la que una eliminación aleatoria del 5% no lo haría.

Evaluar El artículo dice “si eliminas filas bajo MAR o MNAR, introduces un sesgo” y llama a esto el costo oculto de perder poder estadístico. Critica el riesgo inverso: ¿puede la Imputación Múltiple (MICE), el “estándar de oro” del artículo, también introducir su propio tipo de sesgo si el modelo de imputación en sí está mal especificado? ¿Cómo se vería eso?

Crear Diseña un diagnóstico de datos faltantes y una estrategia para un nuevo conjunto de datos: un conjunto de datos de predicción de churn donde last_login_date falta para el 15% de los usuarios. Propón una verificación específica (como la prueba de boxplot contra el resultado del artículo) para determinar si esto parece MCAR, MAR o MNAR, y elige una estrategia del conjunto de herramientas del artículo basándote en lo que esperarías encontrar.


Esta traducción fue generada automáticamente y puede contener errores. Si el idioma inglés es tu preferencia, puedes leer el artículo original en inglés .

«Aplica lo que aprendiste» es para suscriptores Supporter e Insider.

Suscríbete para desbloquear los ejercicios de este artículo.

Ver planes

¿Buscas otra cosa?

Busca en todos los artículos por título, resumen o tema.