Datos perdidos

Datos faltantes

En datos reales, casi nunca todo viene completo.

Datos faltantes

A veces faltan valores en variables:

  • numéricas
  • categóricas
  • temporales

Datos faltantes

Un valor faltante no es lo mismo que un cero.

Datos faltantes

Tampoco es lo mismo que una categoría vacía.

Problema

Muchos modelos no aceptan valores faltantes directamente.

Problema

Así que antes de modelar, hay que decidir qué hacer con ellos.

Primer paso

Detectarlos.

Revisar faltantes

df.isnull().head(1)

Contar faltantes

df.isnull().sum()

Imputar datos faltantes

Hay distintas estrategias.

Imputar datos faltantes

Depende del tipo de variable.

Datos numéricos

Dos estrategias muy comunes:

  • media o mediana
  • valor constante

Imputación numérica con media

from sklearn.impute import SimpleImputer

mean_imputer = SimpleImputer(strategy="mean")
df[["num"]] = mean_imputer.fit_transform(df[["num"]])

Imputación numérica con mediana

from sklearn.impute import SimpleImputer

median_imputer = SimpleImputer(strategy="median")
df[["num"]] = median_imputer.fit_transform(df[["num"]])

Imputación numérica con constante

from sklearn.impute import SimpleImputer

constant_imputer = SimpleImputer(strategy="constant", fill_value=-999)
df[["num"]] = constant_imputer.fit_transform(df[["num"]])

Idea

Media o mediana

Idea

Media o mediana cuando el valor faltante puede aproximarse con el centro de la variable.

Idea

Constante como -999

Idea

Constante como -999 cuando queremos marcar explícitamente que faltaba información.

Ojo

Eso no significa que -999 sea un valor real.

Ojo

Significa:

“aquí faltaba el dato”

Datos categóricos

También hay dos estrategias típicas:

  • categoría más frecuente
  • categoría nueva

Imputación categórica con la categoría más frecuente

from sklearn.impute import SimpleImputer

frequent_imputer = SimpleImputer(strategy="most_frequent")
df[["cat"]] = frequent_imputer.fit_transform(df[["cat"]])

Imputación categórica con una categoría nueva

from sklearn.impute import SimpleImputer

constant_imputer = SimpleImputer(strategy="constant", fill_value="MISS")
df[["cat"]] = constant_imputer.fit_transform(df[["cat"]])

Idea

Categoría más frecuente

Idea

Categoría más frecuente si creemos que el faltante se parece al comportamiento general.

Idea

Nueva categoría como MISS

Idea

Nueva categoría como MISS si queremos conservar la información de que el dato faltaba.

Comparación

Numéricas

  • media
  • mediana
  • constante

Comparación

Categóricas

  • más frecuente
  • nueva categoría

Código completo

from sklearn.impute import SimpleImputer

# Imputadores numéricos
mean_imputer = SimpleImputer(strategy="mean")
constant_num_imputer = SimpleImputer(strategy="constant", fill_value=-999)

# Imputadores categóricos
frequent_imputer = SimpleImputer(strategy="most_frequent")
constant_cat_imputer = SimpleImputer(strategy="constant", fill_value="MISS")

Ejemplo de aplicación

df[["num"]] = mean_imputer.fit_transform(df[["num"]])
df[["cat"]] = constant_cat_imputer.fit_transform(df[["cat"]])

Error común

Imputar sin mirar la variable

Error común

No toda variable debe tratarse igual.

Error común

Una variable sesgada puede preferir mediana.

Error común

Una variable categórica puede beneficiarse más de MISS que de la moda.

Idea importante

Imputar no es “rellenar por rellenar”.

Idea importante

Es decidir qué significado tendrá el faltante dentro del modelo.

Conexión con lo anterior

Primero transformamos variables.

Conexión con lo anterior

Después codificamos categorías.

Conexión con lo anterior

Y también necesitamos tratar los faltantes.