Python

Limpieza de datos con Pyjanitor: Optimizando los flujos de trabajo

Contar con unos datos de calidad es clave para que los resultados de un análisis de datos sean válidos. Sin embargo, en la mayoría de las ocasiones, los conjuntos de datos suelen tener múltiples problemas de calidad. Por ejemplo, la presencia de valores nulos, nombres de columnas no estandarizados y datos mal formateados. En esta entrada se analizará las opciones existentes para la limpieza de datos con Pyjanitor. Una biblioteca que ofrece métodos para hacer más fácil este proceso.

En esta entrada es parte de una serie sobre la biblioteca Pyjanitor, el resto de las publicaciones son:

  1. Introducción a Pyjanitor
  2. Limpieza de datos con Pyjanitor
  3. Transformación de datos con Pyjanitor
  4. Visualización de datos con Pyjanitor y Matplotlib o Seaborn

Carga de datos de ejemplo

Antes de comenzar, es necesario importar un conjunto de datos de ejemplo que cuente con varios problemas de los que puede solucionar Pyjanitor. Por ejemplo, el conjunto de datos clásico como los del Titanic. Un conjunto de datos contiene información sobre los pasajeros del famoso barco Titanic, incluyendo detalles como edad, género, clase de pasajero y si sobrevivieron o no. Para facilitar el seguimiento de los ejemplos, los datos se pueden cargar directamente desde una URL utilizando la biblioteca Pandas:

import pandas as pd

# URL del nuevo conjunto de datos de ventas
url = 'https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'

# Cargar el conjunto de datos en un DataFrame
titanic = pd.read_csv(url)

# Mostrar las primeras filas del DataFrame para verificar la carga exitosa
titanic.head()
   PassengerId  Survived  Pclass  \
0 1 0 3
1 2 1 1
2 3 1 3
3 4 1 1
4 5 0 3

Name Sex Age SibSp \
0 Braund, Mr. Owen Harris male 22.0 1
1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1
2 Heikkinen, Miss. Laina female 26.0 0
3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1
4 Allen, Mr. William Henry male 35.0 0

Parch Ticket Fare Cabin Embarked
0 0 A/5 21171 7.2500 NaN S
1 0 PC 17599 71.2833 C85 C
2 0 STON/O2. 3101282 7.9250 NaN S
3 0 113803 53.1000 C123 S
4 0 373450 8.0500 NaN S

Una vez cargados los datos, se puede comenzar a explorar algunas técnicas de limpieza de datos utilizando Pyjanitor.

Limpiar nombres de columnas

Los nombres de las columnas inconsistentes o mal formateadas de los conjuntos de datos pueden dificultar los procesos de análisis de datos. Provocando la aparición de errores a la hora de referenciar una columna en concreto. Veamos cómo se puede limpiar los nombres de las columnas en el conjunto de datos de Titanic:

import janitor

# Limpiar nombres de columnas
titanic_cleaned_names = titanic.clean_names()

# Mostrar los nombres de las columnas limpiados
print(titanic_cleaned_names.columns)
Index(['passengerid', 'survived', 'pclass', 'name', 'sex', 'age', 'sibsp',
'parch', 'ticket', 'fare', 'cabin', 'embarked'],
dtype='object')

En este ejemplo, se ha empleado el método clean_names() de Pyjanitor para estandarizar los nombres de las columnas del conjunto de datos. Modificando estos para que tengan una notación homogénea y coherente. Al aplicar el método, todos los nombres de las columnas se convierten a minúsculas y se reemplaza los espacios en blanco con guiones bajos, lo que facilita tanto el acceso a las columnas, como mejora la legibilidad del código.

Manejo de valores nulos

Uno de los problemas más comunes en los conjuntos de datos es la presencia de valores nulos. La primera opción puede ser la eliminación de los registros que cuenta con algún valor nulo, lo que en Pandas se puede conseguir con el método dropna(). Aunque, como se ve en el siguiente código, para el conjunto de datos de Titanic esto es un problema ya que la mayoría de los registros cuentan con algún valor nulo y, por lo tanto, los registros que quedan son una pequeña fracción de los originales.

# Eliminar filas con valores nulos
titanic_no_nan = titanic_cleaned_names.dropna()

# Mostrar el número de filas antes y después de la limpieza
print("Número de filas antes de la limpieza:", len(titanic_cleaned_names))
print("Número de filas después de la limpieza:", len(titanic_no_nan))
Número de filas antes de la limpieza: 891
Número de filas después de la limpieza: 183

A modo de ejemplo, se pueden ver los registros que no cuentan con la edad del pasajero.

# Identificar los resgistros sin edad
titanic_no_age = titanic_cleaned_names.isna().age

# Mostrar los primeros registros sin edad
print(titanic_cleaned_names[titanic_no_age].head())
    passengerid  survived  pclass                           name     sex  age  \
5 6 0 3 Moran, Mr. James male NaN
17 18 1 2 Williams, Mr. Charles Eugene male NaN
19 20 1 3 Masselmani, Mrs. Fatima female NaN
26 27 0 3 Emir, Mr. Farred Chehab male NaN
28 29 1 3 O'Dwyer, Miss. Ellen "Nellie" female NaN

sibsp parch ticket fare cabin embarked
5 0 0 330877 8.4583 NaN Q
17 0 0 244373 13.0000 NaN S
19 0 0 2649 7.2250 NaN C
26 0 0 2631 7.2250 NaN C
28 0 0 330959 7.8792 NaN Q

Otro enfoque común para tratar los valores nulos es rellenarlos con valores específicos. Pyjanitor cuenta con el método impute() que permite agregar un valor dado a una columna. Por ejemplo, se puede agregar el valor 30 a los registros que no cuentan con un dato de edad.

# Rellenar valores nulos con un valor constante
titanic_age_filled = titanic_cleaned_names.impute(column_names="age",
                                                  value=30)

# Mostrar el resultado
print(titanic_age_filled[titanic_no_age].head())
    passengerid  survived  pclass                           name     sex  \
5 6 0 3 Moran, Mr. James male
17 18 1 2 Williams, Mr. Charles Eugene male
19 20 1 3 Masselmani, Mrs. Fatima female
26 27 0 3 Emir, Mr. Farred Chehab male
28 29 1 3 O'Dwyer, Miss. Ellen "Nellie" female

age sibsp parch ticket fare cabin embarked
5 30.0 0 0 330877 8.4583 NaN Q
17 30.0 0 0 244373 13.0000 NaN S
19 30.0 0 0 2649 7.2250 NaN C
26 30.0 0 0 2631 7.2250 NaN C
28 30.0 0 0 330959 7.8792 NaN Q

En este ejemplo se ha llamado al método impute() indicando tanto la columnas que se desea rellenar como el valor que se desea usar. Un enfoque más avanzado puede ser rellenar los valores nulos con la media de la columna. Algo que se pude conseguir mediante indicando la operación en la propiedad ‌statistic_column_name como se muestra a continuación.

# Rellenar valores nulos con el valor medio de la columna
titanic_age_filled = titanic_cleaned_names.impute(column_names="age",
                                                  statistic_column_name="mean")

# Mostrar el resultado
print(titanic_age_filled[titanic_no_age].head())
    passengerid  survived  pclass                           name     sex  \
5 6 0 3 Moran, Mr. James male
17 18 1 2 Williams, Mr. Charles Eugene male
19 20 1 3 Masselmani, Mrs. Fatima female
26 27 0 3 Emir, Mr. Farred Chehab male
28 29 1 3 O'Dwyer, Miss. Ellen "Nellie" female

age sibsp parch ticket fare cabin embarked
5 29.699118 0 0 330877 8.4583 NaN Q
17 29.699118 0 0 244373 13.0000 NaN S
19 29.699118 0 0 2649 7.2250 NaN C
26 29.699118 0 0 2631 7.2250 NaN C
28 29.699118 0 0 330959 7.8792 NaN Q

Conclusiones

En esta entrada, se han analizado las opciones que están disponibles para la limpieza de datos con Pyjanitor. Viendo como estas pueden optimizar los flujos de trabajo para cualquier análisis de datos.

En la próxima entrada se explicará en detalle los métodos que ofrece Pyjanitor para la transformación de datos en Python.

Imagen de Ryan McGuire en Pixabay

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Analytics Lane lanza la versión 1.2 del laboratorio con nuevas herramientas de ajuste de curvas y cálculo matricial

Seguimos iterando sobre el laboratorio de Analytics Lane y lanzamos la versión 1.2, disponible en:https://www.analyticslane.com/lab/es…

1 día ago

Cómo comparar tendencias con gráficos de líneas en Matplotlib: guía práctica paso a paso

Tienes los datos de tráfico web de los últimos cinco meses desglosados por canal: orgánico,…

4 días ago

Calibración vs Discriminación en Credit Scoring: diferencias clave y cómo evaluarlas

Imagina que construyes un modelo de credit scoring y obtienes un Gini de 0,65. Un…

2 semanas ago

Ley de Benford: cómo detectar datos manipulados con ejemplos reales

En un mundo donde los datos se han convertido en el lenguaje dominante de la…

2 semanas ago

This website uses cookies.