En este tutorial nos convertimos en exploradores y vemos el proceso para hacer un análisis exploratorio de datos (EDA) completo en Python.
Utilizaremos un ejemplo real con código y te guiaré paso a paso en cada una de las etapas del análisis.
Podrás seguir el tutorial sin problema en tu propio Notebook de Google Colab (o en el entorno que utilices 🙂)
El análisis exploratorio de datos (EDA) es una de las partes fundamentales en cualquier proyecto de ciencia de datos ya que nos ayuda a entender los datos con los que estamos trabajando.
Durante el EDA (de sus siglas en inglés Exploratory Data Analysis) analizaremos la calidad de los datos e intentaremos comprender cómo se comportan las características de nuestro dataset y cómo se relacionan entre sí.
Fundamentalmente utilizaremos:
Así que si estás pensando ya en qué modelo de ML vas a elegir y cómo lo vas a entrenar sin ni siquiera saber cuáles son las características de tu dataset, para un momento y respira 🛑
Porque de la misma manera que un cirujano no empieza a operar sin haber estudiado antes el historial clínico y las pruebas pre-operatorias de su paciente, un ninja de los datos investigará con atención el dataset que tiene delante para poder elegir el mejor modelo posible para resolver su problema.
Además, un buen análisis exploratorio evitará muchos errores en tu proyecto... y los que no pueda evitar, te ayudará a detectarlos y entenderlos más rápido.
Cuenta la leyenda que todo ninja de los datos pasa el 70-80% de su tiempo en el proceso de análisis exploratorio y limpieza de datos.
Recuerda tu objetivo. Hemos venido con una misión.
No hay una única manera de hacer un análisis exploratorio de datos. Es un proceso que se adapta a las características de cada conjunto de datos.
Además, es iterativo. A medida que descubrimos patrones, podemos ajustar el enfoque de nuestro EDA y es una etapa súper interrelacionada con la fase de limpieza de datos.
Sin embargo, en este tutorial vamos a seguir una guía paso a paso general que podrás personalizar para cualquier dataset.
Seguiremos los siguientes pasos:
Existen muchas herramientas para hacer un análisis exploratorio de datos.
Desde herramientas especialmente diseñadas para la visualización y el análisis de datos como Power BI o Tableau (aunque existen muchas otras), que no necesitan mucho código a librerías especializadas de lenguajes de programación como Python (pandas
, matplotlib
, seaborn
) y R (ggplot2
, dplyr
).
Nosotros vamos a desarrollar el análisis exploratorio de datos en Python utilizando:
pandas
: Es una librería de Python que permite limpiar, transformar, filtrar y agregar datos. Además, tiene funciones para calcular estadísticas básicas.matplotlib
: Una de las librerías de visualización más utilizadas en Python.seaborn
: Es una librería de Python construida sobre Matplotlib que facilita la creación de gráficos estadísticos atractivos y fáciles de interpretar.Para nuestro ejemplo de análisis exploratorio de datos vamos a utilizar el dataset Census Income, disponible en el repositorio UCI Machine Learning.
El dataset fue extraído del censo de EEUU de 1994 bajo ciertas condiciones. Los datos se limitaron a:
El objetivo del conjunto de datos es predecir si una persona gana más de 50.000 dólares al año o no, siendo un problema de clasificación binaria estupendo peeero en este tutorial sólo haremos la parte de EDA.
Es un dataset ideal para explorar relaciones entre variables sociodemográficas, como la edad, el nivel educativo, y el tipo de empleo, y su relación con los niveles de ingresos.
Aparte de eso sólo vamos a necesitar un Notebook de Google Colab.
Primero instalamos la librería ucimlrepo
para poder importar el dataset directamente desde el repositorio de Machine Learning de UC Irvine.
!pip install ucimlrepo
Importamos todas las librerías que vamos a usar hoy...
¡Y cargamos los datos!
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt import math from ucimlrepo import fetch_ucirepo # Recuperamos el dataset adult = fetch_ucirepo(id=2) # Obtenemos los datos como dataframes de Pandas X = adult.data.features y = adult.data.targets # metadatos print(adult.metadata) # Creamos un único dataset con las características y la variable objetivo data = pd.concat([X, y], axis=1)
En esta primera fase, nos enfocamos en obtener una comprensión inicial del dataset mediante la exploración de su estructura y contenido.
Utilizamos una serie de comandos para revisar los datos de forma rápida de un vistazo y para obtener un resumen detallado de las columnas con sus tipos de datos y estadísticas descriptivas.
Este paso nos ayuda a identificar los valores más comunes lo que permite comprender las distribuciones predominantes en cada característica.
Como hemos dicho antes que el análisis exploratorio de datos es un proceso iterativo vamos a crear una función para poder reutilizarla siempre que queramos (incluso en otros EDAs 😉)
¡Ahora vamos a analizar los valores únicos!
Al contar los valores únicos en cada columna, obtenemos una idea del nivel de diversidad de las variables, lo que es especialmente útil para las variables categóricas.
Ahora que ya entendemos un poco mejor las características de nuestro dataset, qué significan y sus posibles rangos de valores vamos a analizar la calidad de los datos.
Como imaginarás, si tenemos datos de muy mala calidad con muchos valores faltantes y registros duplicados y no hacemos nada al respecto, el rendimiento del modelo de ML que entrenemos será penoso 😩
De hecho, ya hemos detectado posibles errores en nuestro dataset con la variable income
.
🚨 En los datasets reales los datos suelen ser de bastante mala calidad y con errores. No te saltes este paso.
Primero, vamos a identificar si existen registros duplicados dentro del dataset, es decir, filas que contienen exactamente los mismos valores en todas las columnas.
Sólo vamos a ver si existen y luego tomaremos una decisión sobre qué hacer con estos registros.
El siguiente paso es ver si tenemos valores faltantes. Los valores faltantes pueden ocurrir por varias razones, y es importante identificarlos y decidir una estrategia de tratamiento.
Tienes un tutorial completísimo sobre cómo gestionar valores faltantes en este enlace.
Otro marcador muy potente de la calidad de los datos es la presencia de outliers o valores atípicos, que son aquellos datos que se desvían mucho del resto de los puntos.
Los outliers pueden ser indicativos de errores de captura de datos o de fenómenos interesantes que tendremos que investigar más en profundidad 🕵️.
Para ellos, utilizamos visualizaciones como diagramas de caja (boxplots) o métricas estadísticas como el rango intercuartílico (IQR).
En la siguiente fase, al explorar el análisis univariante, podremos ver las distribuciones de cada variable en busca de outliers aunque ya sospechamos de la etapa anterior que las características capital-gain
y capital-loss
vienen con valores anómalos.
Si quieres ver más sobre la detección y manejo de outliers, este es tu tutorial.
El análisis univariante nos permite entender la distribución y el comportamiento de cada variable del dataset en particular de manera individual, sin tener en cuenta cómo se relaciona con el resto de variables del conjunto de datos.
Para realizar el análisis univariante vamos a utilizar visualizaciones. Si quieres saber más sobre qué gráfico utilizar en cada caso te recomiendo este capítulo del libro Storytelling con datos.
¡Vamos con el análisis bivariante!
El análisis bivariante nos permite examinar la relación entre dos variables dentro de un dataset.
El objetivo es encontrar las asociaciones y correlaciones entre distintos pares de variables y ver cómo se relacionan entre sí.
De esta manera podremos descubrir patrones o dependencias que pueden influir en el comportamiento de las características.
Durante el análisis exploratorio de los datos es especialmente valioso entender cómo se relacionan las características con la variable objetivo (en nuestro caso, income
). Esto nos dará pistas sobre las columnas con mayor poder predictivo y también nos ayudará a detectar casos de data leakage (si quieres saber más sobre data leakage, mira esto).
Una vez damos por terminada nuestra primera iteración podemos repasar las conclusiones que hemos obtenido y a partir de ahí decidir los siguientes pasos.
Durante el propio análisis exploratorio hemos corregido un error en las categorías de la etiqueta que nos habría llevado a fallos en nuestro modelo.
Pero además, tendríamos que:
capital-gain
y capital-loss
.age
en rangos de edad significativos para nuestro caso.Además, en el análisis bivariante obsdervamos que:
Masters
" y "Doctorate
".Estas relaciones nos sugieren que las variables socioeconómicas tienen un impacto importante en los niveles de ingresos, lo que podría sernos útil para el modelado predictivo.
Como ves, el análisis exploratorio de los datos nos ha permitido generar hipótesis, detectar problemas de calidad en los datos, y entender qué características tienen un mayor impacto en los ingresos.
Esto sienta las bases para una fase de preparación de datos más efectiva, lo que a su vez permitirá un modelado predictivo más robusto en etapas posteriores y menos quebraderos de cabeza en el futuro 🙂.