Volver al curso

Data Science con Python: Análisis de Datos para Tu Carrera

leccion
21 / 23
intermediate
8 horas
Proyecto Final: Analisis de Datos Real

Limpieza y Analisis Exploratorio (EDA)

Lectura
60 min~4 min lectura

Limpieza y Analisis Exploratorio (EDA)

El Proceso Sistematico

El Analisis Exploratorio de Datos (EDA) es la fase donde investigas tus datos antes de construir modelos o sacar conclusiones. Es como ser detective: haces preguntas, buscas patrones, identificas problemas.


Framework de EDA en 7 Pasos
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

sns.set_theme(style='whitegrid')

# Cargar datos (ejemplo con dataset real)
url = 'https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'
df = pd.read_csv(url)

print("=" * 60)
print("PASO 1: PRIMERA MIRADA")
print("=" * 60)
print(f"\nForma: {df.shape} ({df.shape[0]} filas, {df.shape[1]} columnas)")
print(f"\nPrimeras filas:")
print(df.head())

Paso 2: Tipos y estructura

print("=" * 60)
print("PASO 2: TIPOS DE DATOS")
print("=" * 60)
print(df.info())
print(f"\nMemoria usada: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")

# Clasificar columnas
numericas = df.select_dtypes(include='number').columns.tolist()
categoricas = df.select_dtypes(include='object').columns.tolist()
print(f"\nNumericas ({len(numericas)}): {numericas}")
print(f"Categoricas ({len(categoricas)}): {categoricas}")

Paso 3: Valores faltantes

print("=" * 60)
print("PASO 3: VALORES FALTANTES")
print("=" * 60)

faltantes = df.isnull().sum()
faltantes_pct = (faltantes / len(df) * 100).round(1)

df_faltantes = pd.DataFrame({
    'faltantes': faltantes,
    'porcentaje': faltantes_pct
}).sort_values('porcentaje', ascending=False)

df_faltantes = df_faltantes[df_faltantes['faltantes'] > 0]
print(df_faltantes)

# Visualizar valores faltantes
if len(df_faltantes) > 0:
    fig, ax = plt.subplots(figsize=(8, 4))
    df_faltantes['porcentaje'].plot(kind='barh', color='#FF5722', ax=ax)
    ax.set_title('Porcentaje de Valores Faltantes')
    ax.set_xlabel('% Faltante')
    plt.tight_layout()
    plt.show()

Paso 4: Estadisticas descriptivas

print("=" * 60)
print("PASO 4: ESTADISTICAS DESCRIPTIVAS")
print("=" * 60)

print("\nVariables numericas:")
print(df.describe().round(2))

print("\nVariables categoricas:")
for col in categoricas:
    print(f"\n{col}:")
    print(df[col].value_counts().head(10))

Paso 5: Distribuciones

print("=" * 60)
print("PASO 5: DISTRIBUCIONES")
print("=" * 60)

# Histogramas de todas las variables numericas
num_cols = df.select_dtypes(include='number').columns
n_cols = len(num_cols)
n_rows = (n_cols + 2) // 3

fig, axes = plt.subplots(n_rows, 3, figsize=(15, 4*n_rows))
axes = axes.flatten()

for i, col in enumerate(num_cols):
    df[col].hist(bins=30, ax=axes[i], edgecolor='white', alpha=0.7)
    axes[i].set_title(col)
    axes[i].axvline(df[col].mean(), color='red', linestyle='--', alpha=0.7)
    axes[i].axvline(df[col].median(), color='blue', linestyle='--', alpha=0.7)

# Ocultar ejes vacios
for j in range(i+1, len(axes)):
    axes[j].set_visible(False)

plt.suptitle('Distribuciones (rojo=media, azul=mediana)', fontsize=14)
plt.tight_layout()
plt.show()

Paso 6: Correlaciones

print("=" * 60)
print("PASO 6: CORRELACIONES")
print("=" * 60)

corr = df.select_dtypes(include='number').corr()

fig, ax = plt.subplots(figsize=(10, 8))
mask = np.triu(np.ones_like(corr, dtype=bool))
sns.heatmap(corr, mask=mask, annot=True, fmt='.2f', cmap='RdBu_r',
            center=0, square=True, linewidths=0.5, ax=ax)
ax.set_title('Matriz de Correlaciones')
plt.tight_layout()
plt.show()

# Top correlaciones
corr_pares = corr.unstack().sort_values(ascending=False)
corr_pares = corr_pares[(corr_pares < 1) & (corr_pares > -1)]
print("\nTop 10 correlaciones:")
print(corr_pares.head(10))

Paso 7: Insights y preguntas

print("=" * 60)
print("PASO 7: INSIGHTS")
print("=" * 60)

# Ejemplo con Titanic
if 'Survived' in df.columns:
    # Tasa de supervivencia por clase
    surv_clase = df.groupby('Pclass')['Survived'].mean()
    print("Tasa de supervivencia por clase:")
    for clase, tasa in surv_clase.items():
        print(f"  Clase {clase}: {tasa:.1%}")
    
    # Por genero
    surv_genero = df.groupby('Sex')['Survived'].mean()
    print("\nTasa de supervivencia por genero:")
    for genero, tasa in surv_genero.items():
        print(f"  {genero}: {tasa:.1%}")

Video Recomendado

EDA Completo con Python - Paso a Paso


Ejercicio Practico

Crea un notebook 21_eda.ipynb:

  1. Carga un dataset real (Titanic, tips de Seaborn, o datos propios)
  2. Sigue los 7 pasos del framework de EDA completo
  3. Documenta cada paso con celdas Markdown explicativas
  4. Genera al menos 6 graficos diferentes
  5. Escribe 3 insights o hallazgos principales
  6. Lista 3 preguntas que quedan pendientes para investigar

💡 Concepto Clave

Revisemos los puntos más importantes de esta lección antes de continuar.

Resumen

  • EDA es sistematico: Sigue un framework de 7 pasos
  • Primero entender: Forma, tipos, faltantes, distribuciones
  • Despues buscar patrones: Correlaciones, diferencias entre grupos
  • Documentar todo: Cada hallazgo con su grafico y explicacion
  • Generar preguntas: El EDA no solo responde, tambien genera nuevas preguntas
  • Un buen EDA es la base de todo analisis exitoso
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
  • Comprendo el concepto principal y puedo explicarlo con mis palabras
  • Entiendo cómo aplicarlo en mi situación específica
  • Necesito repasar algunas partes antes de continuar
  • Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.