Lo típico y lo variable
Lo que vamos a construir hoy
Apertura
¿Cuánto tarda un pedido típico, y qué tan variable es?
Dos horas en cinco momentos
Hoy respondemos la primera pregunta de la gerencia: cuánto tarda un pedido típico y qué tan variable es.
Otra persona del curso revisa tus tres frases con tres criterios
| Criterio | Pregunta |
|---|---|
| Exactitud | ¿Lo que dice la frase se ve en la tabla o en el histograma? |
| Precisión | ¿Da una cifra y dice sobre qué total se calculó? |
| Claridad | ¿La entendería alguien de la gerencia que no sabe estadística? |
Dos preguntas del diagnóstico se responden hoy con datos
- Cinco pedidos tardan 20, 22, 25, 27 y 150 min. ¿Qué describe mejor el tiempo típico: la media (48,8 min) o la mediana (25 min)?
- Dos ciudades con media de 35 min: en A, la desviación es de 4 min; en B, de 15. ¿Qué cambia?
1, la mediana: el 150 arrastra la media. 2, en B los tiempos son menos predecibles: la media dice dónde está el centro; la desviación, cuánto se alejan de él los pedidos.
Para prometer una hora de llegada hacen falta dos números
Lo típico
Un número que represente a los 12 000 pedidos: las medidas de tendencia central, como la media, la mediana y la moda.
Lo variable
Cuánto se alejan los pedidos de ese número: las medidas de dispersión, como el rango, la desviación estándar y el rango intercuartílico.
El centro
Un número para representar a 12 000 pedidos: ¿cuál?
La media es el punto de equilibrio de los datos
$$ \begin{aligned} \bar{x} &= \frac{1}{n}\sum_{i=1}^{n} x_i && \text{media} \\[6pt] \sum_{i=1}^{n} \left(x_i - \bar{x}\right) &= 0 && \text{punto de equilibrio} \end{aligned} $$
Con los cinco tiempos del diagnóstico, \(\bar{x} = 48{,}8\): el pedido de 150 queda 101,2 min por encima, y los otros cuatro suman 101,2 min por debajo.
La mediana deja la mitad de los pedidos a cada lado
El valor del medio cuando los datos se ordenan de menor a mayor. Con un número par de datos, el promedio de los dos del medio.
- Cinco tiempos ordenados: 20, 22, 25, 27, 150
- No usa los valores, solo el orden: el 150 podría ser 300 y la mediana seguiría en 25
- En una tabla de frecuencias, es donde el % acumulado llega al 50 %
En Tingua, la media es 35,1 min y la mediana, 33,7
tiempo = pedidos["tiempo_entrega_min"]
print(f"Media: {tiempo.mean():.1f} min")
print(f"Mediana: {tiempo.median():.1f} min")
#> Media: 35.1 min
#> Mediana: 33.7 minmean()suma y divide;median()ordena y toma el del medio- La media queda 1,4 min por encima de la mediana
- Python escribe el decimal con punto (35.1); en el texto va con coma (35,1)
En una continua, la moda es una clase, no un valor
moda = tiempo.mode()[0]
print("Moda de los valores:", moda, "min,",
"en", (tiempo == moda).sum(), "pedidos")
clases = pd.cut(tiempo, bins=range(0, 210, 5), right=False)
conteo = clases.value_counts(sort=False)
print("Clase modal:", conteo.idxmax(), "con", conteo.max(), "pedidos")
#> Moda de los valores: 31.3 min, en 73 pedidos
#> Clase modal: [30, 35) con 2619 pedidos- 31,3 min se repite en 73 pedidos, el 0,6 %: lo decide el azar del redondeo
- La clase modal, \([30, 35)\), reúne 2619 pedidos: el 21,8 %
mode()sí sirve en una nominal o en una discreta con pocos valores
La cola a la derecha empuja la media por encima de la mediana
- El pico está en \([30, 35)\): ahí cae la mediana
- Los pedidos lentos de la cola tiran de la media hacia la derecha
- Con una cola a la derecha, la media supera a la mediana
La media sigue a los extremos; la mediana, no
Cinco tiempos
Media 48,8 · mediana 25 min. Un solo pedido de 150 deja la media lejos de los otros cuatro.
El tiempo de Tingua
Media 35,1 · mediana 33,7 min. La cola apenas mueve la media: la diferencia es de 1,4 min.
El valor del pedido
Media 65 964 · mediana 58 000 pesos. Una cola larga, que llega a 1 751 600 pesos.
Si el pedido de 150 minutos hubiera tardado 300, ¿qué les pasa a la media y a la mediana?
La media sube de 48,8 a 78,8 min; la mediana sigue en 25. La mediana solo usa el orden, y el pedido más lento sigue siendo el último.
cinco = pd.Series([20, 22, 25, 27, 150])
print("Media:", cinco.mean(), "· mediana:", cinco.median())
cinco[4] = 300
print("Media:", cinco.mean(), "· mediana:", cinco.median())
#> Media: 48.8 · mediana: 25.0
#> Media: 78.8 · mediana: 25.0El tipo de variable decide qué centro tiene sentido
| Tipo de variable | Centro | En Tingua |
|---|---|---|
| Nominal | La moda | El medio de pago más usado |
| Ordinal | La mediana (y la moda) | La franja o la calificación mediana |
| Cuantitativa, simétrica | La media o la mediana | La temperatura en Medellín |
| Cuantitativa, con cola | La mediana, sin olvidar la media | El valor del pedido |
La mediana de una ordinal tiene sentido, pero pandas no la calcula
try:
pedidos["franja"].median()
except TypeError as error:
print("TypeError:", error)
#> TypeError: 'Categorical' with dtype category
#> does not support reduction 'median'- En la sesión 1,
mean()se negaba porque promediar una ordinal no tiene sentido - Aquí la mediana sí lo tiene, pero pandas no la implementa
- Un error de la herramienta no es un error del concepto
La mediana de una ordinal se lee en la acumulada: la franja mediana es el almuerzo
franja = pedidos["franja"].value_counts(sort=False, normalize=True)
(franja.cumsum() * 100).round(1)
#> franja
#> Mañana 15.1
#> Almuerzo 51.1
#> Tarde 70.7
#> Noche 100.0
#> Name: proportion, dtype: float64- La acumulada llega al 50 % en el Almuerzo: es la primera que lo alcanza
- El 51,1 % de los pedidos se hizo en el almuerzo o antes
- En la práctica harás lo mismo con el estrato y la calificación
La media usa los valores; la mediana, solo el orden
Por eso la mediana resiste a los extremos y sirve para las ordinales; la media aprovecha toda la información cuando la forma lo permite.
La dispersión
El mismo centro puede esconder pedidos muy parecidos o muy distintos.
El rango solo mira los dos pedidos más extremos
print("Mínimo:", tiempo.min(), "· máximo:", tiempo.max())
print(f"Rango: {tiempo.max() - tiempo.min():.1f} min")
#> Mínimo: 6.0 · máximo: 200.9
#> Rango: 194.9 min- \(\text{Rango} = \text{máximo} - \text{mínimo}\)
- Depende de dos pedidos entre 12 000
- Con los cinco tiempos del diagnóstico, el rango es de 130 min, y casi todo lo pone el 150
Las distancias a la media siempre suman cero
| Tiempo | 20 | 22 | 25 | 27 | 150 |
|---|---|---|---|---|---|
| Distancia a la media | \(-28{,}8\) | \(-26{,}8\) | \(-23{,}8\) | \(-21{,}8\) | \(+101{,}2\) |
Su promedio no sirve: siempre da cero. Por eso se elevan al cuadrado antes de promediar: el cuadrado las vuelve positivas y pesa más las grandes.
La varianza promedia los cuadrados; la desviación vuelve a minutos
$$ \begin{aligned} \sigma^2 &= \frac{1}{N}\sum_{i=1}^{N} \left(x_i - \mu\right)^2 && \text{población: divide entre } N \\[6pt] s^2 &= \frac{1}{n-1}\sum_{i=1}^{n} \left(x_i - \bar{x}\right)^2 && \text{muestra: divide entre } n - 1 \end{aligned} $$
La desviación estándar es la raíz: \(\sigma = \sqrt{\sigma^2}\) y \(s = \sqrt{s^2}\), otra vez en minutos.
Con 12 000 pedidos, dividir entre N o entre n − 1 casi no cambia nada
print(f"Varianza: {tiempo.var():.1f} min²")
print(f"s, entre n - 1: {tiempo.std():.3f} min")
print(f"σ, entre N: {tiempo.std(ddof=0):.3f} min")
#> Varianza: 160.2 min²
#> s, entre n - 1: 12.658 min
#> σ, entre N: 12.657 min- La varianza está en minutos al cuadrado: no se lee
std()divide entre \(n - 1\); conddof=0, entre \(N\)- Si la pregunta es sobre el semestre, los 12 000 pedidos son la población; aun así, la diferencia no se nota
pandas y numpy no dan la misma desviación para cinco tiempos: ¿cuál se equivocó?
Con los cinco tiempos del diagnóstico, pandas da 56,64 min y numpy, 50,66 min.
Ninguno. pandas divide entre \(n - 1\) y numpy, entre \(n\): ddof dice cuánto se le resta a \(n\). Con 5 datos la diferencia es grande; con 12 000, desaparece.
cinco = [20, 22, 25, 27, 150]
print(f"pandas: {pd.Series(cinco).std():.2f}")
print(f"numpy: {np.std(cinco):.2f}")
print(f"pandas con ddof=0: {pd.Series(cinco).std(ddof=0):.2f}")
#> pandas: 56.64
#> numpy: 50.66
#> pandas con ddof=0: 50.66El 81,7 % de los pedidos está a menos de una desviación de la media
media, s = tiempo.mean(), tiempo.std()
cerca = tiempo.between(media - s, media + s)
print(f"De {media - s:.1f} a {media + s:.1f} min:",
f"{cerca.mean() * 100:.1f} % de los pedidos")
#> De 22.5 a 47.8 min: 81.7 % de los pedidos- Una desviación de 12,7 min alrededor de 35,1: de 22,5 a 47,8 min
betweenmarca cada pedido con True o False- La media de True y False es la proporción de True
Los cuartiles parten los pedidos en cuatro partes iguales
q1 = tiempo.quantile(0.25)
q3 = tiempo.quantile(0.75)
print(f"Q1 = {q1:.1f} · Q3 = {q3:.1f} · RIC = {q3 - q1:.1f} min")
tiempo.describe().round(1)
#> Q1 = 27.9 · Q3 = 40.4 · RIC = 12.5 min
#> count 12000.0
#> mean 35.1
#> std 12.7
#> min 6.0
#> 25% 27.9
#> 50% 33.7
#> 75% 40.4
#> max 200.9
#> Name: tiempo_entrega_min, dtype: float64- \(Q_1\) deja debajo el 25 %; \(Q_2\), la mediana, el 50 %, y \(Q_3\), el 75 %
- \(\text{RIC} = Q_3 - Q_1\): la mitad central de los pedidos tarda de 27,9 a 40,4 min
- Mínimo, \(Q_1\), mediana, \(Q_3\) y máximo: el resumen de cinco números
El diagrama de caja dibuja los cuartiles de cada ciudad y aparta los pedidos lejanos
- La caja va de \(Q_1\) a \(Q_3\); la línea es la mediana
- Los bigotes llegan hasta el pedido más lejano que está a no más de 1,5 RIC de la caja
- Los puntos: candidatos a atípicos, el tema de la sesión 4
Sin el 0,5 % más lento, la desviación cae un 23 % y la mediana no se mueve
corte = tiempo.quantile(0.995)
sin_cola = tiempo[tiempo <= corte]
print(f"Salen {len(tiempo) - len(sin_cola)} pedidos,",
f"de más de {corte:.1f} min")
print(f"Media: {tiempo.mean():.1f} → {sin_cola.mean():.1f}")
print(f"Desviación: {tiempo.std():.1f} → {sin_cola.std():.1f}")
print(f"Mediana: {tiempo.median():.1f} → {sin_cola.median():.1f}")
#> Salen 60 pedidos, de más de 94.1 min
#> Media: 35.1 → 34.6
#> Desviación: 12.7 → 9.7
#> Mediana: 33.7 → 33.7- 60 pedidos entre 12 000 bajan la desviación de 12,7 a 9,7 min
- La media baja de 35,1 a 34,6; la mediana no cambia
- Una medida que no se mueve con unos pocos extremos es robusta
Barranquilla y Bucaramanga: casi la misma media, casi el mismo RIC y distinta desviación
dos = pedidos[pedidos["ciudad"].isin(["Barranquilla", "Bucaramanga"])]
grupos = dos.groupby("ciudad")["tiempo_entrega_min"]
resumen = pd.DataFrame({
"media": grupos.mean(),
"desviación": grupos.std(),
"RIC": grupos.quantile(0.75) - grupos.quantile(0.25),
})
resumen.round(1)
#> media desviación RIC
#> ciudad
#> Barranquilla 29.8 10.5 10.3
#> Bucaramanga 29.7 13.3 10.6groupby("ciudad")calcula lo mismo en cada ciudad- Media: 29,8 y 29,7 min · RIC: 10,3 y 10,6 min
- Desviación: 10,5 y 13,3 min
El cuerpo es igual; Bucaramanga tiene más demoras extremas
La desviación las siente y el RIC no. El 1 % más lento de Bucaramanga tarda más de 63,4 min; el de Barranquilla, más de 54,9. Su pedido más lento: 200,9 frente a 152,9 min.
La media va con la desviación; la mediana, con el RIC
| Centro | Dispersión | Con unos pocos datos extremos |
|---|---|---|
| Media | Desviación estándar | Se mueven |
| Mediana | Cuartiles y RIC | Casi no se mueven |
Con una cola larga, informa la mediana y el RIC; con una forma simétrica, la media y la desviación.
El coeficiente de variación: el valor varía más del doble que el tiempo
valor = pedidos["valor_pedido"]
print(f"Tiempo: CV = {tiempo.std() / tiempo.mean():.2f}")
print(f"Valor: CV = {valor.std() / valor.mean():.2f}")
#> Tiempo: CV = 0.36
#> Valor: CV = 0.77- \(\text{CV} = s / \bar{x}\): no tiene unidades, así que compara minutos con pesos
- En proporción a su media, el valor varía 2,1 veces lo que varía el tiempo
- Solo para variables de razón con media positiva: nunca para la temperatura
Ningún centro sin su dispersión
«35,1 minutos» no le sirve a la gerencia sin su desviación, 12,7, ni la mediana, 33,7, sin su RIC, 12,5: el centro dice cuánto tarda un pedido típico, y la dispersión, cuánto se alejan de él los demás.
Práctica y cierre
Treinta y cinco minutos con el cuaderno (notebook): cuatro ejercicios con verificador.
Práctica guiada: cuatro ejercicios en el notebook
n_productos · 7 minestrato y de calificacion · 8 minAbrir el notebook de la sesión 3 en Colab. Antes del ejercicio 1: clic en [ej1] → Entorno de ejecución → Ejecutar anteriores.
¿Qué medida usarías?
- El medio de pago más usado en Bucaramanga
- La calificación típica de los pedidos calificados
- El valor típico de un pedido, para un informe a la gerencia
- La temperatura típica en Medellín y cuánto varía
1 la moda: es nominal · 2 la mediana (o el % de 4 y 5 estrellas): es ordinal · 3 la mediana con el RIC: tiene una cola larga · 4 la media con la desviación: es simétrica; el CV, no, porque la temperatura es de intervalo
Lo que te llevas hoy
- La media es el punto de equilibrio; la mediana, el valor del medio; en una continua, la moda es una clase
- El tipo de variable decide el centro: moda, mediana o media
- La desviación se lee en minutos; el RIC es el ancho de la mitad central
- La media y la desviación sienten los extremos; la mediana y el RIC, casi no
- Ningún centro sin su dispersión
La sesión 4 busca los pedidos que se salen de lo normal
- Termina la práctica: los verificadores revisan los cuatro ejercicios, salvo el diagrama de caja
- Lee OpenIntro Statistics (4.ª edición): en la sección 2.1, los diagramas de caja y la robustez; en la sección 4.1, el puntaje Z (Z-score)
- Escribe tres frases sobre una ciudad que elijas: su centro, su dispersión y un pedido que te parezca raro. Otra persona del curso las revisará
Próxima sesión: datos atípicos y exploración multidimensional.