AulaML Python · C++
Python intermedio · 45 min · Python para ciencia de datos

Estadística y análisis exploratorio

Media, dispersión y correlación: qué afirman los números y qué dejan fuera

Antes de modelar hay que mirar. Aprenderás a resumir una variable con media, mediana y dispersión, a leer una correlación sin confundirla con causalidad y a conducir un análisis exploratorio guiado por preguntas, detectando los sesgos que un solo número esconde.

Lección 5 de 5 del módulo
Al terminar esta lección podrás
  • Elegir entre media, mediana y moda según la forma de la distribución
  • Medir dispersión con desviación estándar, rango intercuartílico y cuantiles
  • Interpretar una correlación de Pearson y saber cuándo usar Spearman
  • Conducir un EDA a partir de preguntas concretas sobre los datos
  • Reconocer sesgos de selección, de supervivencia y paradojas de agregación

Antes necesitas: Pandas: Series y DataFrames · Limpieza de datos

En esta lección
  1. ¿Qué es la estadística descriptiva?
  2. ¿Para qué sirve?
  3. ¿Cómo funciona por dentro?
  4. Sintaxis: describir una tabla
  5. Ejemplo básico: tres centros para ocho notas
  6. Ejemplo intermedio: dispersión y correlación
  7. Caso práctico: un EDA guiado por preguntas
  8. Visualización: la matriz de correlaciones
  9. Errores comunes
  10. Buenas prácticas
  11. Ejercicios
  12. Soluciones explicadas
  13. Resumen
  14. Evaluación

Un gerente pregunta cuánto gasta el cliente típico. Respondes con la media y él decide subir el precio del plan básico. Semanas después descubres que dos clientes corporativos concentraban el 60 % del gasto. El número era correcto; la conclusión, no. La estadística descriptiva no consiste en calcular, sino en saber qué representa cada cálculo.

El análisis exploratorio de datos (EDA) es la conversación previa al modelo: preguntas, resúmenes y comprobaciones que revelan la forma de los datos. Aquí usarás pandas y NumPy para cinco preguntas: ¿dónde está el centro, cuánto se dispersa, cómo se distribuye, qué se relaciona con qué y quién falta en la tabla?

¿Qué es la estadística descriptiva?

La estadística descriptiva resume un conjunto de observaciones en pocos números. Se distingue de la inferencial, que intenta extrapolar de una muestra a una población y por eso necesita intervalos de confianza y pruebas de hipótesis. En un EDA casi todo es descriptivo: describes lo que tienes, sin afirmar todavía qué pasaría con datos que no tienes.

Tres familias de medidas cubren casi todo. Las de posición indican dónde está el centro: media, mediana, moda. Las de dispersión indican cuánto se alejan los valores de ese centro: desviación estándar, rango, rango intercuartílico. Las de forma y relación describen la silueta de la distribución y cómo se mueven dos variables juntas: asimetría, correlación.

¿Para qué sirve?

  • Elegir un modelo: la dispersión orienta la normalización y la asimetría sugiere transformaciones.
  • Detectar errores: una edad media de 7 años indica un problema de captura, no un mercado infantil.
  • Comparar segmentos: dos sedes con la misma media pueden tener riesgos muy distintos.
  • Priorizar variables: una correlación alta con la objetivo ahorra probar columnas a ciegas.
  • Comunicar con honestidad: «mediana 21, media 29.6 por una compra atípica» dice más que un promedio solo.

¿Cómo funciona por dentro?

La media suma los valores y divide entre la cantidad; es el centro de gravedad, y se desplaza si un dato se aleja. La mediana deja la mitad de las observaciones a cada lado: se ordenan los datos y se toma el central, o el promedio de los dos centrales. La moda es el valor más repetido, útil con categorías.

Cuando la distribución es simétrica, media y mediana coinciden. Cuando hay una cola hacia la derecha, la media queda por encima de la mediana porque los valores grandes la atraen; cuando la cola es hacia la izquierda, ocurre lo contrario. Esa comparación es un diagnóstico rápido de asimetría, y también la razón por la que los ingresos se reportan con mediana.

La desviación estándar es la distancia típica a la media: se calcula la varianza, promedio de las distancias al cuadrado, y se toma su raíz. Aquí aparece una trampa: pandas divide entre n − 1 y NumPy entre n, así que con pocos datos las cifras discrepan. El rango intercuartílico, distancia entre el cuartil 75 y el 25, no se deja arrastrar por los extremos.

MedidaQué respondeSensible a extremosCuándo usarla
MediaCentro aritméticoMuchoDistribuciones simétricas
MedianaValor centralPocoIngresos, precios, tiempos
ModaValor más frecuenteNadaCategorías y conteos
Desviación estándarDispersión promedioMuchoComparar variabilidad
Rango intercuartílicoAncho del 50 % centralPocoDatos con colas largas

Sintaxis: describir una tabla

Instala con pip install pandas numpy; pandas trae las medidas en métodos de Series y en dos resúmenes de DataFrame. describe() devuelve conteo, media, desviación, mínimo, cuartiles y máximo de cada columna numérica, y value_counts() cuenta categorías. numeric_only=True omite las columnas de texto.

PYTHON resumen.py
import pandas as pd

df.describe()
df["monto"].mean()
df["monto"].median()
df["monto"].std()
df["monto"].quantile([0.25, 0.5, 0.75])
df["sede"].value_counts(normalize=True)
df.corr(numeric_only=True)
  • describe() incluye count, que revela cuántos valores no nulos entraron en cada cálculo.
  • value_counts(normalize=True) devuelve proporciones en lugar de conteos.
  • corr() calcula Pearson por defecto; method="spearman" usa rangos.
  • groupby(...).agg(["mean", "median", "std"]) compara segmentos de una vez.
  • nunique() y isna().sum() completan el perfil antes de concluir nada.

Ejemplo básico: tres centros para ocho notas

Ocho estudiantes obtuvieron 12, 14, 15, 11, 18, 13, 16 y 15. Calcula los tres centros y compáralos antes de mirar cualquier gráfico.

PYTHON centros.py
import pandas as pd

notas = pd.Series([12, 14, 15, 11, 18, 13, 16, 15])

print(notas.mean())
print(notas.median())
print(notas.mode().tolist())
print(notas.max() - notas.min())

La media es 14.25, porque la suma es 114 y hay ocho datos. La mediana es 14.5: al ordenar quedan 11, 12, 13, 14, 15, 15, 16 y 18, y el promedio de los dos centrales es 14.5. La moda es 15, el único valor repetido, y el rango es 7.

Que la media sea menor que la mediana indica una cola leve hacia la izquierda: las notas de 11 y 12 pesan más que la de 18. Con ocho datos la diferencia es pequeña, pero comparar ambas cifras detecta asimetrías que un promedio oculta.

Ejemplo intermedio: dispersión y correlación

Saber que la nota media es 14.25 no dice si todos sacaron entre 13 y 16 o si la mitad reprobó. Para eso está la dispersión; para saber si las horas acompañan a las notas, la correlación.

PYTHON dispersion.py
import pandas as pd

notas = pd.Series([12, 14, 15, 11, 18, 13, 16, 15])
horas = pd.Series([2, 4, 6, 8, 10])
calificaciones = pd.Series([10, 11, 14, 15, 18])

print(round(notas.std(), 2))
print(round(notas.std(ddof=0), 2))
print(notas.quantile([0.25, 0.75]).tolist())
print(round(horas.corr(calificaciones), 2))

La desviación con el criterio de pandas es 2.25; con el de NumPy, 2.11. La diferencia viene del divisor: siete frente a ocho. Los cuartiles son 12.75 y 16.5, así que el rango intercuartílico es 3.75: la mitad central ocupa menos de cuatro puntos.

La correlación entre las cinco parejas de horas y calificaciones es 0.99. Pearson mide cuánto se parece la nube de puntos a una recta: vale 1 con relación lineal creciente perfecta, −1 con decreciente perfecta y 0 cuando no hay relación lineal. No dice que estudiar cause la nota, ni detecta relaciones curvas.

Caso práctico: un EDA guiado por preguntas

Un EDA sin preguntas es una pared de gráficos. Elige cinco y respóndelas en orden, anotando lo que encuentres; el esquema sirve para cualquier tabla de ventas.

PreguntaOperaciónQué te dice
¿Cuántos datos y de cuándo son?shape y fechas mínima y máximaCobertura y huecos
¿Faltan valores?isna().sum()Si el resumen usó menos filas
¿Cómo se reparte el monto?describe() e histogramaCentro, cola y extremos
¿Qué segmento aporta más?groupby(...).sum()Concentración del ingreso
¿Qué se mueve con el monto?corr(numeric_only=True)Posibles variables explicativas
PYTHON eda.py
import pandas as pd

pedidos = pd.read_csv("pedidos.csv")
pedidos["fecha"] = pd.to_datetime(pedidos["fecha"])

print(pedidos["fecha"].min(), pedidos["fecha"].max())
print(pedidos.isna().sum().to_dict())
print(pedidos["monto"].describe().round(2).to_dict())
print(pedidos.groupby("sede")["monto"].agg(["sum", "median", "count"]))
print(pedidos.corr(numeric_only=True)["monto"].sort_values(ascending=False))

El orden no es casual. Primero compruebas cobertura: con dos semanas de datos, cualquier conclusión mensual es prematura. Después cuentas nulos, que cambian el denominador. Solo entonces comparas segmentos y correlaciones.

Visualización: la matriz de correlaciones

La matriz resume un cuestionario a 120 estudiantes. Cada celda es la correlación entre dos variables; la diagonal vale 1 porque cada una coincide consigo misma. Solo importan las relaciones claras: con 120 casos, valores por debajo de 0.2 en valor absoluto son débiles.

Mapa de datos ·Correlaciones del cuestionario (n = 120)
4 × 4 rango [-0.22, 1] La diagonal es 1 en todas las celdas: una variable consigo misma.
horas estudio
asistencia
nota
horas sueño
horas estudio
1
0.62
0.78
-0.15
asistencia
0.62
1
0.55
-0.08
nota
0.78
0.55
1
-0.22
horas sueño
-0.15
-0.08
-0.22
1

Recorre los pasos para ver cómo cambian las celdas.

Una correlación de 0.78 entre horas de estudio y nota no demuestra que estudiar suba la nota: puede que los estudiantes más motivados estudien más y además rindan mejor. Para acercarte a una relación causal necesitas un experimento o controlar esas variables ocultas.

Ejecución visual ·Media y mediana, paso a paso
1 / 6
1 notas = [12, 14, 15, 11, 18, 13, 16, 15]
2 n = len(notas)
3 media = sum(notas) / n
4 ordenadas = sorted(notas)
5 mediana = (ordenadas[3] + ordenadas[4]) / 2
6 print(media, mediana)
Ocho notas sin ordenar. La lista conserva el orden de captura.
Variables
notas = [12, 14, 15, 11, 18, 13, 16, 15]
Salida
—

Avanza paso a paso: observa la línea resaltada, las variables y la salida.

Errores comunes

ErrorEjemploQué hacer
Reportar solo la mediaDos grupos opuestos promedian un valor que nadie tieneAñade mediana, cuartiles y gráfico
Ignorar los nulosdescribe muestra un count menor que el totalCompara count con shape
Confundir desviacionesstd() de pandas no coincide con numpy.std()Fija ddof explícitamente
Leer causalidad en una correlaciónHelados y ahogamientos suben en veranoBusca la variable oculta
Extrapolar de una muestra sesgadaEncuestas solo a clientes activosPregunta quién falta en la tabla

El sesgo más difícil de ver es el de supervivencia: analizas los proyectos que llegaron a publicarse y concluyes que cierto enfoque funciona, sin saber cuántos intentos iguales fracasaron. Ninguna medida lo corrige; solo la pregunta sobre el origen.

Un resumen que no explica nada
Incorrecto
PYTHON Solo el promedio
print(df["monto"].mean())
Correcto
PYTHON Centro, dispersión y tamaño
print(df["monto"].agg(["count", "mean", "median", "std"]))
print(df["monto"].quantile([0.25, 0.75]))

Un único promedio no distingue una distribución estrecha de una con dos picos ni revela cuántos nulos quedaron fuera. Cuatro números y dos cuartiles ocupan una línea y evitan la mayoría de las conclusiones falsas.

Buenas prácticas

  • Escribe la pregunta antes del cálculo; si no sabes qué harías con la respuesta, no la calcules.
  • Informa el tamaño de la muestra junto a cualquier porcentaje o media.
  • Reporta mediana y cuartiles cuando la distribución tenga colas largas.
  • Grafica antes de resumir: el histograma detecta lo que describe esconde.
  • No compares promedios de grupos muy distintos sin mirar la dispersión de cada uno.
  • Repite el análisis por segmento antes de afirmar una relación global.

Ejercicios

Ejercicio 1

El efecto de un valor extremo

Con los montos 12, 15, 18, 20, 22, 25, 30 y 95, calcula media, mediana, desviación estándar y rango intercuartílico. Repite el cálculo sin el valor 95 y compara. Explica qué medida describe mejor el gasto típico.
Pista

Crea una Series y usa agg(["mean", "median", "std"]). Para el IQR, resta quantile(0.75) menos quantile(0.25).

Completar código Completa el resumen
promedio = df["nota"].()
mediana = df["nota"].()
dispersion = df["nota"].(ddof=1)
print(promedio, mediana, dispersion)

Los tres nombres son los mismos que usarías en una calculadora estadística. `ddof=1` solo tiene sentido en la medida de dispersión.

Ejercicio 2

Una correlación que un punto destruye

Calcula la correlación entre horas de estudio 2, 4, 6, 8 y 10 y notas 10, 11, 14, 15 y 18. Después añade el par (10, 8), un estudiante que estudió mucho y rindió mal, y vuelve a calcularla. Explica por qué cambia tanto y qué conclusión puedes sostener.
Pista

Usa serie_a.corr(serie_b). Compara el número de puntos: cinco observaciones son muy pocas para afirmar una relación estable.

Soluciones explicadas

En el primer ejercicio, el valor 95 no es un error: es un cliente corporativo legítimo. Por eso no lo elimines del análisis; sepáralo. Reportar «mediana 21, con un caso de 95» describe mejor la realidad que borrar la fila o publicar un promedio de 29.62 que ningún cliente reconoce.

En el segundo, el punto añadido no es un dato malo, es información: alguien estudió diez horas y sacó 8. Su presencia demuestra que la relación no es perfecta y que cinco observaciones no bastan para estimar una pendiente. Con muestras pequeñas, cualquier conclusión sobre causalidad es una hipótesis, no un resultado.

Resumen

  • Media, mediana y moda responden a preguntas distintas; compáralas para detectar asimetría.
  • La media se desplaza con los extremos; la mediana y el IQR son más robustos.
  • std() de pandas usa n − 1 y NumPy usa n: fija ddof cuando compares.
  • Pearson mide relación lineal; Spearman, relación monótona entre rangos.
  • Una correlación alta no implica causalidad ni descarta una variable oculta.
  • Un EDA se guía por preguntas: cobertura, nulos, forma, segmentos y relaciones.
  • El sesgo de selección no se corrige con fórmulas: hay que preguntar quién falta en la tabla.

Evaluación

Evaluación 1

Diez clientes gastan 10, 10, 10, 10, 10, 10, 10, 10, 10 y 500 soles. ¿Qué medida describe mejor el gasto típico?

Evaluación 2

Una correlación de Pearson de −0.85 entre precio y unidades vendidas indica que…

Evaluación 3

df["monto"].std() devuelve 2.25 y numpy.std(df["monto"]) devuelve 2.11. ¿Por qué?

Tus notas

¿Ya lo entendiste?

Márcala como completada para llevar tu progreso y desbloquear el siguiente paso de la ruta.