Sesión 2 – Limpieza y tratamiento de datos¶
Datasets: Adult Census Income y Congressional Voting Records¶
Objetivo de la sesión¶
En esta sesión se busca que el estudiante reconozca los principales problemas de calidad de datos y comprenda por qué el tratamiento de datos es un paso fundamental antes de entrenar cualquier modelo de machine learning.
Durante la práctica se trabajarán los siguientes aspectos:
- Valores perdidos (numéricos y categóricos)
- Datos irrelevantes o redundantes
- Valores atípicos
- Importancia de la limpieza de datos en el desempeño de modelos de machine learning
Carga de los datasets¶
Trabajaremos con dos datasets del repositorio UCI Machine Learning:
- Adult Census Income - Para predecir niveles de ingreso
- Congressional Voting Records - Para clasificar partidos políticos
import pandas as pd
Carga del dataset Adult¶
Este dataset contiene información del Censo de EE.UU. de 1994. El objetivo es predecir si una persona gana más o menos de $50,000/año.
# Definimos los nombres de las columnas (el dataset no los incluye)
adult_columns = ['age', 'workclass', 'fnlwgt', 'education', 'education_num',
'marital_status', 'occupation', 'relationship', 'race',
'sex', 'capital_gain', 'capital_loss', 'hours_per_week',
'native_country', 'income']
# Cargamos el dataset
# na_values=' ?' significa que ' ?' representa valores faltantes
url_adult = 'https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data'
df_adult = pd.read_csv(url_adult, names=adult_columns, na_values=' ?', skipinitialspace=True)
df_adult.head()
Exploración inicial del dataset Adult¶
Antes de limpiar los datos, es fundamental explorar el dataset para entender:
- Qué variables existen
- Qué tipo de datos contiene cada columna
- Si hay valores faltantes
df_adult.info()
df_adult.describe()
Identificación de valores perdidos¶
Los valores perdidos son uno de los problemas más comunes en los datasets reales. Un modelo de machine learning no puede trabajar directamente con valores nulos, por lo que deben ser tratados.
df_adult.isnull().sum()
Tratamiento de valores faltantes categóricos¶
Las variables categóricas con valores faltantes en este dataset son:
- workclass
- occupation
- native_country
Se imputarán con la moda (valor más frecuente).
df_adult['workclass'].fillna(df_adult['workclass'].mode()[0], inplace=True)
df_adult['occupation'].fillna(df_adult['occupation'].mode()[0], inplace=True)
df_adult['native_country'].fillna(df_adult['native_country'].mode()[0], inplace=True)
# Verificamos que no quedan valores faltantes
df_adult.isnull().sum()
Eliminación de duplicados¶
Los registros duplicados pueden sesgar los resultados del modelo.
print(f"Registros antes: {len(df_adult)}")
df_adult = df_adult.drop_duplicates()
print(f"Registros después: {len(df_adult)}")
Valores atípicos (outliers)¶
En la variable capital_gain y capital_loss se observan valores extremadamente altos.
Analizamos su distribución.
df_adult['capital_gain'].describe()
df_adult.boxplot(column='capital_gain')
df_adult['capital_loss'].describe()
df_adult.boxplot(column='capital_loss')
Revisión final del dataset Adult¶
Después del proceso de limpieza, se revisa nuevamente el dataset.
df_adult.info()
df_adult.isnull().sum()
Carga del dataset Votes¶
Este dataset contiene los votos de congresistas de EE.UU. en 1984. El objetivo es clasificar si un congresista es Republicano o Demócrata.
votes_columns = ['class', 'handicapped_infants', 'water_project', 'budget_resolution',
'physician_fee_freeze', 'el_salvador_aid', 'religious_groups_schools',
'anti_satellite_test_ban', 'aid_nicaraguan_contras', 'mx_missile',
'immigration', 'synfuels_cutback', 'education_spending',
'superfund_right_to_sue', 'crime', 'duty_free_exports', 'export_south_africa']
url_votes = 'https://archive.ics.uci.edu/ml/machine-learning-databases/voting-records/house-votes-84.data'
df_votes = pd.read_csv(url_votes, names=votes_columns, na_values='?')
df_votes.head()
Exploración inicial del dataset Votes¶
df_votes.info()
Identificación de valores perdidos¶
En este dataset, el '?' representa abstenciones o votos no registrados.
df_votes.isnull().sum()
Tratamiento de valores faltantes¶
Imputamos con la moda (el voto más común para cada tema).
for col in df_votes.columns:
if df_votes[col].isnull().any():
df_votes[col].fillna(df_votes[col].mode()[0], inplace=True)
# Verificamos que no quedan valores faltantes
df_votes.isnull().sum()
Eliminación de duplicados¶
print(f"Registros antes: {len(df_votes)}")
df_votes = df_votes.drop_duplicates()
print(f"Registros después: {len(df_votes)}")
Revisión final del dataset Votes¶
df_votes.info()
df_votes.isnull().sum()
Distribución de la variable objetivo¶
df_votes['class'].value_counts()
Conclusión de la sesión¶
El tratamiento de datos no es un paso opcional en machine learning. La calidad del modelo depende directamente de la calidad de los datos utilizados.
Un modelo aprende exactamente a partir de los datos que recibe. Datos con errores, valores faltantes o ruido generan modelos poco confiables.
Referencias¶
- Dua, D., & Graff, C. (2019). UCI Machine Learning Repository. University of California, Irvine. https://archive.ics.uci.edu/ml
- Rothman, D. (2018). Artificial Intelligence by Example. Packt Publishing.