Tratamiento de valores faltantes

En este tutorial vamos a explorar todo lo que podemos hacer cuando nos encontramos con valores faltantes en nuestro dataset.

¿Qué se entiende por valor faltante?

En un conjunto de datos hay veces que todas las variables no tienen un valor asociado.

Son valores que faltan 🙃

Por ejemplo, si tienes una lista de personas con su edad y una persona no tiene su edad registrada, ese espacio estará vacío o lo que es lo mismo tendrá un valor faltante.

Los valores faltantes pueden surgir por varias razones, como errores en la recopilación de datos, respuestas incompletas en encuestas, o simplemente porque cierta información no está disponible.

Esto es súper común.

En el análisis de datos, es importante identificar y tratar estos valores faltantes, ya que pueden afectar los resultados de los análisis o los modelos estadísticos.

Además, si lo que estás haciendo es preparar tu dataset para entrenar un modelo de Machine Learning ten en cuenta que hay modelos que no soportan datos de entrada incompletos.

Esto sucede, por ejemplo, en los modelos de la librería Scikit-learn.

Valores faltantes en Pandas

En el mundo del análisis de datos con Python, la librería Pandas es una herramienta esencial, especialmente cuando se trata de manejar valores faltantes.

En los próximos apartados vamos a ver diversas técnicas de tratamiento de valores faltantes y con cada una habrá un ejemplo de cómo implementarla con Pandas.

Nuestro objetivo de hoy es conseguir un conjunto de datos completo. Sin valores faltantes.

Estos valores faltantes, que a menudo se representan como NaN (Not a Number), son muy habituales en conjuntos de datos reales y pueden ser un desafío significativo.

Ejemplo de tratamiento de valores faltantes

Vamos a aplicar las técnicas de tratamiento de valores faltantes sobre un ejemplo concreto.

El ejemplo será un dataset de aprobación de operaciones de crédito.

En este dataset todos los nombres de características y valores han sido cambiados a símbolos arbitrarios para proteger la confidencialidad de los datos.

Así que prepara un Notebook de Google Colab y vamos a ello. No es necesario que te instales nada, solo te hace falta una cuenta en Google 🙂

Para poder utilizar el dataset directamente en Google Colab sólo tienes que seguir este tutorial y sustituir el dataset que se descarga en ese tutorial por el que realmente queremos utilizar aquí.

!kaggle datasets download -d martaarroyo/credit-approval-dataset

Exploración de los datos

Lo primero que vamos a hacer es cuantificar los valores faltantes que tiene nuestro dataset.

Esto es importante a la hora de decidir cuál de las técnicas de imputación que vamos a ver a continuación vamos a utilizar.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer, MissingIndicator
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer

Lo primero que haremos es averiguar cuántos valores faltantes tenemos en cada característica. Para ello usaremos pandas.

Nuestro dataset está en la variable data.

data = pd.read_csv('CreditApproval.csv')
data.isnull().sum()
A1     12
A2     12
A3     90
A4      6
A5      6
A6      9
A7      9
A8     90
A9     90
A10    90
A11     0
A12     0
A13     0
A14    13
A15     0
A16     0
dtype: int64

Otro dato que nos puede dar información es saber el porcentaje de valores faltantes que tenemos en cada característica.

data.isnull().mean()

Y también podemos representarlo gráficamente.

data.isnull().mean().plot.bar(figsize=(12,6))
plt.ylabel('Porcentaje de valores faltantes')
plt.xlabel('Características')
Valores faltantes

Estos son los métodos de Pandas que hemos utilizado en esta primera parte:

  1. isnull(): Lo usamos para identificar los valores faltantes. Crea un vector booleano para cada característica, donde "Verdadero" (True) indica un valor faltante y "Falso" (False) indica que el valor está presente en cada fila del conjunto de datos.
  2. sum(): Lo aplicamos sobre los vectores booleanos. Suma todos los valores "Verdadero" (True), lo que da como resultado el número total de valores faltantes en el conjunto de datos.
  3. mean(): Este método también lo hemos utilizado sobre los vectores booleanos. Calcula el promedio de los valores "Verdadero" (True), proporcionando el porcentaje de datos faltantes en el conjunto de datos, expresado en forma decimal.

Eliminar observaciones con valores faltantes

Cuando tenemos un conjunto de datos con valores faltantes y mucha prisa, la solución más hardcore 🔥 es eliminar todas las observaciones en las que haya alguna característica cuyo valor no sabemos.

👍 Como ventaja sí que es verdad que es un método rápido y fácil y además preserva la distribución de las variables.

👎 Peeero con este método es posible que acabes cepillándote una parte muy grande del dataset. Implica una gran pérdida de información.

data_cca = data.dropna()
print(f'Número total de observaciones: {len(data)}')
print(f'Número total de observaciones sin valores faltantes {len(data_cca)}')
Número total de observaciones: 690
Número total de observaciones sin valores faltantes 565

¿Cuál es el mejor método de imputación?

No hay un método de imputación correcto para todos los casos. Usaremos uno u otro dependiendo de nuestro dataset particular.

En cada apartado te iré diciendo en qué casos es más conveniente que apliques cada técnica para tratar los valores faltantes.

Tendrás que tener en cuenta:

  • Si hay algún patrón en los datos faltantes o éstos simplemente faltan de manera aleatoria. Igual hay alguna causa por la que determinadas variables del dataset no tienen un valor asociado 🧐
  • El número de datos que faltan
  • El modelo de Machine Learning que tienes planeado entrenar con esos datos (si es que tienes planeado entrenar alguno)

A continuación vamos a ver los distintos tipos de imputación y veremos como aplicarlos en la práctica tanto en Pandas como en Scikit-learn.

  • Imputación con la media o mediana
  • Imputación con la moda o la categoría más frecuente
  • Imputación con una observación aleatoria
  • Reemplazaremos missing values con un número arbitrario
  • Capturaremos la información escondida en los valores faltantes
  • Crearemos una canalización para el tratamiento de valores faltantes con las técnicas anteriores con scikit-learn

¡Vamos a ello!

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Accede a todo el contenido premium

Ya no necesitas pagar cientos de euros por un Bootcamp para convertirte en ninja de los datos. Por solo 17€/mes (o menos 🤯), obtén acceso al podcast premium, a todos los tutoriales y a los resúmenes de los libros más top sobre Machine Learning y Ciencia de datos y aprende a tu ritmo.
¡Empieza ahora!
Copyright © 2024  · Datos 🥷 · Todos los derechos reservados