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.
- 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
- ¿Qué es la estadística descriptiva?
- ¿Para qué sirve?
- ¿Cómo funciona por dentro?
- Sintaxis: describir una tabla
- Ejemplo básico: tres centros para ocho notas
- Ejemplo intermedio: dispersión y correlación
- Caso práctico: un EDA guiado por preguntas
- Visualización: la matriz de correlaciones
- Errores comunes
- Buenas prácticas
- Ejercicios
- Soluciones explicadas
- Resumen
- 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.
| Medida | Qué responde | Sensible a extremos | Cuándo usarla |
|---|---|---|---|
| Media | Centro aritmético | Mucho | Distribuciones simétricas |
| Mediana | Valor central | Poco | Ingresos, precios, tiempos |
| Moda | Valor más frecuente | Nada | Categorías y conteos |
| Desviación estándar | Dispersión promedio | Mucho | Comparar variabilidad |
| Rango intercuartílico | Ancho del 50 % central | Poco | Datos 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.
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()incluyecount, 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()yisna().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.
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.
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.
| Pregunta | Operación | Qué te dice |
|---|---|---|
| ¿Cuántos datos y de cuándo son? | shape y fechas mínima y máxima | Cobertura y huecos |
| ¿Faltan valores? | isna().sum() | Si el resumen usó menos filas |
| ¿Cómo se reparte el monto? | describe() e histograma | Centro, 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 |
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.
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.
notas = [12, 14, 15, 11, 18, 13, 16, 15]n = len(notas)media = sum(notas) / nordenadas = sorted(notas)mediana = (ordenadas[3] + ordenadas[4]) / 2print(media, mediana)—
Avanza paso a paso: observa la línea resaltada, las variables y la salida.
Errores comunes
| Error | Ejemplo | Qué hacer |
|---|---|---|
| Reportar solo la media | Dos grupos opuestos promedian un valor que nadie tiene | Añade mediana, cuartiles y gráfico |
| Ignorar los nulos | describe muestra un count menor que el total | Compara count con shape |
| Confundir desviaciones | std() de pandas no coincide con numpy.std() | Fija ddof explícitamente |
| Leer causalidad en una correlación | Helados y ahogamientos suben en verano | Busca la variable oculta |
| Extrapolar de una muestra sesgada | Encuestas solo a clientes activos | Pregunta 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.
print(df["monto"].mean())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
describeesconde. - 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
El efecto de un valor extremo
Pista
Crea una Series y usa agg(["mean", "median", "std"]). Para el IQR, resta quantile(0.75) menos quantile(0.25).
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.
Una correlación que un punto destruye
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: fijaddofcuando 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
Diez clientes gastan 10, 10, 10, 10, 10, 10, 10, 10, 10 y 500 soles. ¿Qué medida describe mejor el gasto típico?
Una correlación de Pearson de −0.85 entre precio y unidades vendidas indica que…
df["monto"].std() devuelve 2.25 y numpy.std(df["monto"]) devuelve 2.11. ¿Por qué?
¿Ya lo entendiste?
Márcala como completada para llevar tu progreso y desbloquear el siguiente paso de la ruta.