1. Introducción a la Estadística Descriptiva

1.1 ¿Qué es la estadística descriptiva?

La estadística descriptiva reúne técnicas para organizar, resumir y describir datos. Sus herramientas típicas son:

  • Tendencia central: media, mediana, moda.
  • Dispersión: rango, varianza, desviación estándar, coeficiente de variación.
  • Posición: cuartiles, percentiles.
  • Formas de la distribución: asimetría y curtosis.
  • Visualizaciones: tablas de frecuencia, histogramas, boxplots, etc.

👉 En pocas palabras: contarte “cómo son” tus datos sin sacar conclusiones generales sobre una población más grande.

1.2 Descriptiva vs. inferencial (diferencias clave)

  • Descriptiva: resume los datos que tenés (muestra o población observada).
    Ej.: “El ticket promedio fue $8.420 con una desviación estándar de $1.900”.
  • Inferencial: usa la muestra para concluir sobre la población, con incertidumbre (intervalos de confianza, tests de hipótesis, modelos).
    Ej.: “Con 95% de confianza, el gasto promedio poblacional está entre $8.100 y $8.700”.

Regla mental: descriptiva = foto del presente; inferencial = estimación + azar/margen de error.

1.3 Importancia en análisis de datos

  • Primero, entender: detectar outliers, errores de carga, sesgos, escalas.
  • Guiar decisiones: elegir transformaciones, normalizaciones, modelos.
  • Comunicar: resumir hallazgos de forma clara y reproducible.

Mini-scripts listos para correr

Todos los ejemplos son auto-contenidos. Si querés, instalá librerías con:

pip install pandas numpy

Script 1 — Crear un dataset de ejemplo y explorarlo

# -*- coding: utf-8 -*-
# Script 1: dataset de ejemplo y exploración básica
import numpy as np
import pandas as pd

np.random.seed(42)

n = 200
datos = pd.DataFrame({
    "edad": np.random.normal(loc=35, scale=10, size=n).round(0).clip(18, 70).astype(int),
    "ingreso_mensual": np.random.normal(loc=8500, scale=2000, size=n).round(0).clip(2000, 20000).astype(int),
    "propina": np.random.gamma(shape=2.0, scale=150.0, size=n).round(0).astype(int)
})

print("Vista rápida:")
print(datos.head())
print()

print("Info del DataFrame:")
datos.info()
print()

print("Resumen describe():")
print(datos.describe())

Qué mirar:

  • head() y info() te muestran columnas, tipos y nulos.
  • describe() resume conteo, media, desvío, mínimos/máximos y cuartiles.

Script 2 — Medidas básicas de tendencia central y dispersión

# -*- coding: utf-8 -*-
# Script 2: medidas descriptivas clave
import numpy as np
import pandas as pd

np.random.seed(42)
n = 200
datos = pd.DataFrame({
    "edad": np.random.normal(loc=35, scale=10, size=n).round(0).clip(18, 70).astype(int),
    "ingreso_mensual": np.random.normal(loc=8500, scale=2000, size=n).round(0).clip(2000, 20000).astype(int),
})

# Tendencia central
media_ing = datos["ingreso_mensual"].mean()
mediana_ing = datos["ingreso_mensual"].median()
moda_ing = datos["ingreso_mensual"].mode()  # puede devolver más de un valor

# Dispersión
rango_ing = datos["ingreso_mensual"].max() - datos["ingreso_mensual"].min()
var_ing = datos["ingreso_mensual"].var(ddof=1)         # varianza muestral
std_ing = datos["ingreso_mensual"].std(ddof=1)         # desviación estándar muestral
cv_ing = std_ing / media_ing                           # coeficiente de variación

print(f"Media ingreso: {media_ing:.2f}")
print(f"Mediana ingreso: {mediana_ing:.2f}")
print(f"Moda ingreso (primeros 5 valores si hay varias): {list(moda_ing[:5])}")
print(f"Rango ingreso: {rango_ing}")
print(f"Varianza ingreso: {var_ing:.2f}")
print(f"Desvío estándar ingreso: {std_ing:.2f}")
print(f"Coeficiente de variación ingreso: {cv_ing:.3f}")

Claves:

  • Si la distribución es asimétrica, mediana suele ser más robusta que la media.
  • ddof=1 → fórmula muestral (divide por N−1).

Script 3 — Percentiles, cuartiles y resumen personalizado

# -*- coding: utf-8 -*-
# Script 3: percentiles y agregaciones personalizadas
import numpy as np
import pandas as pd

np.random.seed(42)
n = 200
x = pd.Series(np.random.normal(100, 15, n))

resumen = x.agg(
    media="mean",
    mediana="median",
    desvio="std",
    p10=lambda s: s.quantile(0.10),
    p25=lambda s: s.quantile(0.25),
    p75=lambda s: s.quantile(0.75),
    p90=lambda s: s.quantile(0.90),
)
print(resumen.round(2))

Claves:

  • Percentiles ayudan a ubicar un valor dentro de la distribución.
  • El Rango Intercuartílico o IQR (p75 − p25) es robusto frente a outliers.

¿Por qué la descriptiva importa? (misma media, distinta dispersión)

# -*- coding: utf-8 -*-
# Script 4: misma media ≠ mismo comportamiento (dispersión distinta)
import numpy as np
import pandas as pd

np.random.seed(123)

a = np.random.normal(loc=50, scale=5, size=500)
b = np.random.normal(loc=50, scale=15, size=500)

df = pd.DataFrame({"A": a, "B": b})

print("Medias:")
print(df.mean().round(2), "
")

print("Desvíos:")
print(df.std(ddof=1).round(2), "
")

print("Resumen describe():")
print(df.describe().round(2))

Idea: A y B tienen la misma media (~50), pero B es mucho más variable. Solo mirar la media oculta riesgos.