Diez días de invierno
Un empleado nuevo cuenta los alquileres de los diez primeros días del año y dice: «Alquilamos unas 197 bicis al día». El dueño asiente.
El año entero da unas 270. El número era correcto y la frase era falsa. Un resultado vale lo que valen la muestra, la dispersión y el grupo que lo respaldan.
Al final de esta lección
Nota
Puedo decir hasta dónde se puede creer el resultado de una muestra.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Muestra | unas pocas filas tomadas de una tabla más grande |
| Representativa | una muestra que se parece a la tabla entera |
| Dispersión | cuánto se separan los valores unos de otros |
| Valor atípico | un valor lejos del resto, verdadero o falso |
| Mediana | el valor del medio cuando los valores están ordenados |
| Tamaño del grupo | cuántas filas hay detrás de una media o un recuento |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una muestra debe parecerse al todo
Muchas veces no puedes mirarlo todo, así que tomas una muestra. Una buena muestra es representativa: se parece a la tabla entera en lo que importa.
Las diez primeras filas de una tabla rara vez son representativas. Vienen todas del mismo lugar o del mismo momento.
Comparar tres maneras de elegir días
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); print(\"media del año:\", round(h['hires'].mean(),1)); print(\"media de los 10 primeros días:\", round(h['hires'].head(10).mean(),1)); print(\"media de un día de cada 36:\", round(h['hires'].iloc[::36].mean(),1), len(h['hires'].iloc[::36]))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una muestra al azar también se mueve
Tomar filas al azar evita un patrón. Pero una muestra pequeña al azar da una media distinta cada vez, y una más grande se mueve menos.
En pandas, sample(10, random_state=1) toma diez días. El random_state es una semilla: el mismo número da los mismos días.
Seis muestras de 10 y de 100 días
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); print([round(h['hires'].sample(10, random_state=s).mean(),1) for s in range(1,7)]); print([round(h['hires'].sample(100, random_state=s).mean(),1) for s in range(1,7)])"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un valor grande y qué hacer con él
Un valor atípico está lejos del resto. Tira de la media hacia él, pero apenas mueve la mediana.
No lo borres porque sea grande. Pregunta si puede ser verdad. Un error, como 5000 alquileres en una tienda de 30 bicis, se quita. Un día de mucho movimiento real se queda y se menciona.
Un día enorme, calculado en Python
# Siete días de alquileres en una estación, y la misma lista con un día enorme.
days = [204, 173, 327, 173, 240, 198, 220]
def middle(values):
in_order = sorted(values)
half = len(in_order) // 2
if len(in_order) % 2 == 1:
return in_order[half]
return (in_order[half - 1] + in_order[half]) / 2
print("media:", round(sum(days) / len(days), 1), "mediana:", middle(days))
days.append(5000)
print("media:", round(sum(days) / len(days), 1), "mediana:", middle(days))
# ¿Cuál de los dos números se movió más?
Poner un 5000 inventado en el primer día
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); t=h.copy(); t.loc[t.index[0],'hires']=5000; print(round(h['hires'].mean(),1), h['hires'].median(), round(t['hires'].mean(),1), t['hires'].median())"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mirar los tres días más grandes
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); print(h.nlargest(3,'hires')[['date','weather','hires']].to_string(index=False))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que la mediana es siempre mejor que la media. Es más estable ante un valor atípico, pero oculta lo grande que es. Da las dos, y di cuál fue el valor más grande y por qué lo conservaste.
Mira el tamaño de cada grupo
Una media de 8 días y una de 200 días no son pruebas iguales. Muestra siempre cuántas filas hay en cada grupo junto a su media.
Y cuida el verbo. Los días de lluvia van con menos alquileres en esta tabla. Mostrar que la lluvia los causa pide más que una media.
Días de lluvia contra días de sol
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); r=h[h['weather']=='rainy']['hires']; s=h[h['weather']=='sunny']['hires']; print(len(r),len(s),round(r.mean(),1),round(s.mean(),1)); print(round(r.std(),1), round(s.std(),1))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: leer los números
| Lo que ves | Lo que puedes decir | Lo que no puedes decir |
|---|---|---|
| 120 días de lluvia, media 227.6 | Los días de lluvia tuvieron menos alquileres aquí | Que la lluvia es la única razón |
| 131 días de sol, media 312.2 | Los días de sol tuvieron más movimiento aquí | Que será igual el año que viene |
| Dispersión de 80.3 y 68.2 | Un día suelto varía mucho | Que un día cualquiera se parecerá a su media |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Para ir más lejos: una regla justa
En tu cuaderno, halla los percentiles 25 y 75 de hires con quantile. Llama a su diferencia el RIC (rango intercuartílico).
Cuenta los días por debajo del percentil 25 menos 1,5 RIC o por encima del 75 más 1,5 RIC. ¿Qué días son y quitarías alguno?