10. Resúmenes estadísticos con Pandas

Cuando exploramos un dataset, lo primero que hacemos es generar resúmenes estadísticos que nos permitan entender la estructura y las características básicas de los datos.

10.1 Método .describe()

El método .describe() en Pandas genera automáticamente estadísticas descriptivas básicas para columnas numéricas:

  • count → número de valores no nulos.
  • mean → media aritmética.
  • std → desviación estándar.
  • min, max → valores mínimo y máximo.
  • 25%, 50%, 75% → cuartiles.

👉 Para columnas categóricas (si se incluye include="object"), devuelve:

  • count → número de elementos.
  • unique → número de categorías distintas.
  • top → categoría más frecuente.
  • freq → frecuencia de la categoría más frecuente.

import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    "Edad": np.random.randint(18, 70, 100),
    "Ingreso": np.random.normal(8500, 2000, 100).round(0),
    "Genero": np.random.choice(["M", "F"], 100)
})

print("Resumen de variables numéricas:\n")
print(df.describe(), "\n")

print("Resumen incluyendo categóricas:\n")
print(df.describe(include="object"))
                        

10.2 Personalización de .describe()

Podemos limitar qué percentiles calcular o incluir más de uno.


import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    "Edad": np.random.randint(18, 70, 100),
    "Ingreso": np.random.normal(8500, 2000, 100).round(0),
    "Genero": np.random.choice(["M", "F"], 100)
})

resumen = df.describe(percentiles=[0.1, 0.25, 0.5, 0.75, 0.9])
print(resumen)
                        

👉 Esto añade P10 y P90 al resumen.

10.3 Uso de .agg() para múltiples métricas

El método .agg() nos permite aplicar varias funciones estadísticas a la vez.


import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    "Edad": np.random.randint(18, 70, 100),
    "Ingreso": np.random.normal(8500, 2000, 100).round(0),
    "Genero": np.random.choice(["M", "F"], 100)
})

resumen_ingreso = df["Ingreso"].agg(["mean", "median", "std", "min", "max"])
print("Resumen de ingreso:\n", resumen_ingreso, "\n")

# Resumen sobre múltiples columnas
resumen_multiple = df.agg({
    "Edad": ["mean", "min", "max"],
    "Ingreso": ["mean", "median", "std"]
})
print("Resumen múltiple:\n", resumen_multiple)
                        

👉 .agg() es muy flexible: podemos aplicar funciones predefinidas, funciones lambda o nuestras propias funciones.

10.4 Ejemplo práctico con dataset clásico – Iris

El dataset Iris contiene medidas de flores de tres especies (Setosa, Versicolor, Virginica).


import seaborn as sns
import pandas as pd

iris = sns.load_dataset("iris")
print("Primeras filas:\n", iris.head(), "\n")

print("Resumen general:\n", iris.describe(), "\n")

# Resumen agrupado por especie
resumen_por_especie = iris.groupby("species").agg({
    "sepal_length": ["mean", "std"],
    "sepal_width": ["mean", "std"],
    "petal_length": ["mean", "std"],
    "petal_width": ["mean", "std"]
})
print("Resumen por especie:\n", resumen_por_especie)
                        

👉 Esto permite comparar diferencias estadísticas entre especies de flores.

10.5 Ejemplo práctico con dataset clásico – Titanic

El dataset Titanic (disponible en seaborn) contiene información sobre pasajeros: edad, sexo, clase, sobrevivencia, etc.


import seaborn as sns
import pandas as pd

titanic = sns.load_dataset("titanic")
print("Columnas:", titanic.columns, "\n")

print("Resumen de variables numéricas:\n", titanic.describe(), "\n")

print("Resumen de variables categóricas:\n", titanic.describe(include="object"), "\n")

# Resumen agrupado por clase y sexo
resumen_titanic = titanic.groupby(["class", "sex"]).agg({
    "age": ["mean", "median"],
    "fare": ["mean", "median", "std"],
    "survived": ["mean"]  # tasa de supervivencia
})
print("Resumen Titanic (clase + sexo):\n", resumen_titanic)
                        

👉 Ejemplo de interpretación: podemos ver si los pasajeros de primera clase tenían mayor tasa de supervivencia que los de tercera.

10.6 Conclusión práctica

  • .describe() → resumen rápido y flexible, ideal para exploración inicial.
  • .agg() → permite resúmenes personalizados y comparativos.
  • En datasets clásicos como Iris y Titanic, estos resúmenes muestran diferencias entre grupos y ayudan a entender patrones clave.