Análisis Exploratorio de Datos (EDA): Guía Exhaustiva
El Análisis Exploratorio de Datos (EDA) representa el primer contacto crítico con cualquier conjunto de datos y constituye la fase fundamental previa al modelado estadístico o de machine learning. Este proceso sistemático permite comprender las características principales de los datos, detectar patrones ocultos, identificar anomalías y generar hipótesis que guiarán análisis posteriores.
Definición y Concepto Fundamental
El EDA es un enfoque de análisis que examina, resume y visualiza conjuntos de datos para entender sus características principales y patrones subyacentes. Desarrollado originalmente por el estadístico John Tukey en la década de 1970, este método se centra en explorar los datos de manera descriptiva, utilizando herramientas visuales y estadísticas para obtener una comprensión inicial antes de aplicar técnicas más sofisticadas.
La analogía médica es particularmente apropiada: así como un médico realiza un diagnóstico inicial mediante examen físico, historial clínico y pruebas básicas antes de determinar un tratamiento específico, el EDA funciona como ese “diagnóstico inicial” que revela el estado de salud de nuestros datos.
Objetivos Principales del EDA
Comprensión de la Estructura de Datos
- Entender la distribución de variables individuales y su forma (normal, sesgada, bimodal)
- Identificar la naturaleza de cada variable (numérica continua, discreta, categórica)
- Evaluar la calidad general del conjunto de datos
Detección de Anomalías y Problemas
- Identificar valores atípicos (outliers) que podrían distorsionar análisis posteriores
- Detectar valores faltantes (missing values) y sus patrones de ocurrencia
- Encontrar inconsistencias y errores en los datos
Descubrimiento de Patrones y Relaciones
- Revelar relaciones entre variables diferentes
- Identificar correlaciones y dependencias
- Generar hipótesis para investigación posterior
Métodos No Gráficos: Estadísticas Descriptivas
Los métodos no gráficos constituyen el arsenal cuantitativo del EDA, proporcionando medidas numéricas precisas sobre las características de los datos.
Función describe() de Pandas
La función describe() es la herramienta fundamental para obtener un resumen estadístico rápido y comprensivo:
import pandas as pd
import numpy as np
# Cargar datos
df = pd.read_csv('datos.csv')
# Resumen estadístico básico
print(df.describe())
# Incluir variables categóricas
print(df.describe(include='all'))
# Percentiles personalizados
print(df.describe(percentiles=[.1, .25, .5, .75, .9, .95]))
Estadísticas Descriptivas Avanzadas
# Estadísticas específicas por variable
print(f"Media: {df['variable'].mean():.2f}")
print(f"Mediana: {df['variable'].median():.2f}")
print(f"Moda: {df['variable'].mode().values}")
print(f"Desviación estándar: {df['variable'].std():.2f}")
print(f"Varianza: {df['variable'].var():.2f}")
print(f"Asimetría: {df['variable'].skew():.2f}")
print(f"Curtosis: {df['variable'].kurtosis():.2f}")
# Rango intercuartílico (IQR)
Q1 = df['variable'].quantile(0.25)
Q3 = df['variable'].quantile(0.75)
IQR = Q3 - Q1
print(f"IQR: {IQR:.2f}")
Análisis de Percentiles y Cuartiles
Los percentiles proporcionan información crucial sobre la distribución de los datos:
# Percentiles detallados
percentiles = [0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99]
for p in percentiles:
valor = df['salario'].quantile(p)
print(f"P{int(p*100)}: {valor:.0f}")
Métodos Gráficos: Visualizaciones Fundamentales
Histogramas: Distribución de Variables Continuas
Los histogramas revelan la forma, centrado y dispersión de variables numéricas:
import matplotlib.pyplot as plt
import seaborn as sns
# Histograma básico
plt.figure(figsize=(10, 6))
plt.hist(df['salario'], bins=30, alpha=0.7, color='skyblue', edgecolor='black')
plt.title('Distribución de Salarios')
plt.xlabel('Salario')
plt.ylabel('Frecuencia')
plt.grid(True, alpha=0.3)
plt.show()
# Histograma con curva de densidad
plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='salario', bins=30, kde=True)
plt.title('Distribución con Curva de Densidad')
plt.show()
Boxplots: Detección de Outliers y Resumen de Distribución
Los boxplots (diagramas de caja y bigotes) son excepcionales para identificar valores atípicos y visualizar la distribución de manera robusta:
# Boxplot básico
plt.figure(figsize=(8, 6))
plt.boxplot(df['experiencia'])
plt.title('Boxplot de Años de Experiencia')
plt.ylabel('Años de Experiencia')
plt.show()
# Boxplot agrupado por categoría
plt.figure(figsize=(12, 6))
sns.boxplot(data=df, x='departamento', y='salario')
plt.title('Salarios por Departamento')
plt.xticks(rotation=45)
plt.show()
Interpretación del Boxplot:
- La caja representa el rango intercuartílico (IQR)
- La línea central indica la mediana
- Los bigotes se extienden hasta 1.5 × IQR desde Q1 y Q3
- Los puntos fuera de los bigotes son outliers potenciales
Gráficos de Dispersión: Relaciones entre Variables
Los scatter plots revelan correlaciones y patrones de relación entre variables numéricas:
# Gráfico de dispersión básico
plt.figure(figsize=(10, 6))
plt.scatter(df['edad'], df['salario'], alpha=0.6)
plt.xlabel('Edad')
plt.ylabel('Salario')
plt.title('Relación entre Edad y Salario')
plt.grid(True, alpha=0.3)
plt.show()
# Con categorización por color
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='edad', y='salario', hue='departamento')
plt.title('Edad vs Salario por Departamento')
plt.show()
# Matriz de correlación
plt.figure(figsize=(10, 8))
correlation_matrix = df.select_dtypes(include=[np.number]).corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Matriz de Correlación')
plt.show()
Gráficos de Barras: Variables Categóricas
Para analizar la distribución de variables categóricas:
# Conteo de categorías
plt.figure(figsize=(10, 6))
df['departamento'].value_counts().plot(kind='bar', color='lightcoral')
plt.title('Distribución por Departamento')
plt.xlabel('Departamento')
plt.ylabel('Número de Empleados')
plt.xticks(rotation=45)
plt.show()
# Gráfico de barras agrupado
plt.figure(figsize=(12, 6))
sns.barplot(data=df, x='departamento', y='salario', estimator='mean')
plt.title('Salario Promedio por Departamento')
plt.xticks(rotation=45)
plt.show()

Métodos Gráficos Fundamentales del Análisis Exploratorio de Datos (EDA)
Herramientas Especializadas
Visualizaciones con Plotly vs Matplotlib
Matplotlib es la biblioteca fundamental para visualización estática en Python, ofreciendo control granular sobre cada aspecto del gráfico. Plotly, por otro lado, proporciona visualizaciones interactivas que permiten zoom, hover y selección de datos:
# Plotly para gráficos interactivos
import plotly.express as px
# Gráfico interactivo
fig = px.scatter(df, x='edad', y='salario', color='departamento',
title='Relación Edad-Salario (Interactivo)')
fig.show()
# Matplotlib para control preciso
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
for dept in df['departamento'].unique():
dept_data = df[df['departamento'] == dept]
plt.scatter(dept_data['edad'], dept_data['salario'],
label=dept, alpha=0.7)
plt.xlabel('Edad')
plt.ylabel('Salario')
plt.legend()
plt.title('Edad vs Salario por Departamento')
plt.show()
Nubes de Palabras para Análisis de Texto
Las wordclouds visualizan la frecuencia de palabras en datos textuales:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# Texto de ejemplo
texto = """
análisis exploratorio datos EDA patrones outliers
missing values estadísticas descriptivas visualización
histogramas boxplots scatter plots correlación
pandas describe percentiles distribución
"""
# Crear nube de palabras
wordcloud = WordCloud(
width=800,
height=400,
background_color='white',
colormap='viridis',
max_words=50,
stopwords=['de', 'la', 'el', 'en', 'y', 'a'] # Palabras a excluir
).generate(texto)
# Visualizar
plt.figure(figsize=(12, 6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('Conceptos Clave del EDA')
plt.show()
Detección de Patrones, Outliers y Missing Values
Identificación Sistemática de Outliers
# Método IQR (Rango Intercuartílico)
def detect_outliers_iqr(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
return outliers, lower_bound, upper_bound
# Método Z-Score
def detect_outliers_zscore(df, column, threshold=3):
z_scores = np.abs((df[column] - df[column].mean()) / df[column].std())
outliers = df[z_scores > threshold]
return outliers
# Aplicar detección
outliers_iqr, lower, upper = detect_outliers_iqr(df, 'salario')
print(f"Outliers IQR: {len(outliers_iqr)} ({len(outliers_iqr)/len(df)*100:.1f}%)")
print(f"Límites: [{lower:.0f}, {upper:.0f}]")
Análisis de Valores Faltantes
# Análisis completo de missing values
def analyze_missing_values(df):
missing_info = pd.DataFrame({
'Column': df.columns,
'Missing_Count': df.isnull().sum(),
'Missing_Percentage': (df.isnull().sum() / len(df)) * 100,
'Data_Type': df.dtypes
})
missing_info = missing_info[missing_info['Missing_Count'] > 0]
missing_info = missing_info.sort_values('Missing_Percentage', ascending=False)
return missing_info
# Visualizar patrones de missing values
plt.figure(figsize=(12, 6))
sns.heatmap(df.isnull(), cbar=True, yticklabels=False, cmap='viridis')
plt.title('Patrón de Valores Faltantes')
plt.show()
# Correlación entre missing values
missing_corr = df.isnull().corr()
plt.figure(figsize=(8, 6))
sns.heatmap(missing_corr, annot=True, cmap='coolwarm')
plt.title('Correlación entre Patrones de Missing Values')
plt.show()
La Importancia del EDA: “La Punta del Iceberg”
El EDA representa efectivamente “la punta del iceberg” en el análisis de datos. Aunque puede revelar insights inmediatos y patrones evidentes, su verdadero valor radica en preparar el terreno para análisis más profundos y sofisticados.
Los profesionales de ciencia de datos típicamente invierten 70-80% de su tiempo en las fases de EDA y limpieza de datos, lo que subraya su importancia crítica. Esta inversión de tiempo es fundamental porque:
Prevención de Errores Costosos
- Identifica problemas de calidad antes del modelado
- Revela sesgos en los datos que podrían invalidar conclusiones
- Detecta patrones que requieren tratamiento especial
Guía para Decisiones Metodológicas
- Informa la selección de algoritmos apropiados
- Sugiere transformaciones necesarias de variables
- Identifica la necesidad de técnicas de balanceo o normalización
Generación de Hipótesis
- Descubre relaciones inesperadas entre variables
- Sugiere nuevas preguntas de investigación
- Identifica segmentos interesantes en los datos
El Análisis Exploratorio de Datos trasciende ser una simple fase preliminar; constituye el cimiento sobre el cual se construye todo análisis de datos exitoso. La combinación de métodos gráficos y no gráficos, junto con herramientas especializadas como pandas, plotly y matplotlib, proporciona un arsenal completo para desentrañar los secretos ocultos en los datos. La analogía médica del diagnóstico inicial captura perfectamente la esencia del EDA: un examen cuidadoso y sistemático que informa todas las decisiones posteriores en el proceso analítico.
Hi :)
Matemáticas
Vectores
Álgebra Lineal
Geometría Analítica
Producto Punto
Espacios Vectoriales
Ortogonalidad
Normalización
Funciones
Álgebra
Composición de Funciones
Función Inversa
Combinación de Funciones
Transformaciones Gráficas
Aplicaciones Económicas
Interés Compuesto
Proporcionalidad
R
Data
Machine Learning
Aprendizaje Supervisado
Inteligencia Artificial
Clasificación
Regresión
Deep Learning