Ir al contenido
wannacode

Muestra y población

En resumen: Una muestra es una parte de la población y su media salta de muestra en muestra; el ruido se reduce con la raíz cuadrada del tamaño: 4 veces más datos dan la mitad de ruido.

Problema

Dos muestras, dos medias

El jefe quiere saber el pedido medio. No quiere esperar al informe del año: toma 30 pedidos del sistema y obtiene 12,11 €. Su compañera toma otros 30 y obtiene 10,33 €.

¿Quién tiene razón? Ninguno se equivocó en el cálculo. Solo son distintos los pedidos que tomaron. ¿Cuánto puedes fiarte de una media de 30 pedidos? ¿Y de 3000?

La idea

Población y muestra

Todo aquello sobre lo que preguntas se llama población: aquí, todos los pedidos del año sin los cancelados. La parte que miraste es una muestra.

Normalmente no ves toda la población: todos los clientes, todos los pedidos futuros. Aquí la tienes, así que puedes comprobar cuánto se equivoca una muestra. La verdad es:

Pythondatos: las tablas de la tienda

La media de los 10 459 pedidos es 10,63 €. Cada muestra se comparará con este número.

La idea

Una muestra aleatoria con NumPy

np.random.default_rng(42) crea un generador de números aleatorios. 42 es la semilla: el punto de partida. Con la misma semilla cada ejecución da los mismos números. Por eso los ejemplos de aquí muestran siempre lo mismo y puedes comprobar cada resultado.

rng.choice(values, size=30, replace=False) elige al azar 30 pedidos distintos. Tres muestras de cada tamaño:

Pythondatos: las tablas de la tienda

Las medias de 30 pedidos son 11,33 €, 12,11 € y 10,33 €: los números del jefe y de su compañera. Con 300 pedidos van de 10,07 € a 11,42 €. Con 3000 van de 10,65 € a 11,02 €: más cerca entre sí y de la verdad de 10,63 €.

1. Ejecutas el ejemplo por segunda vez sin cambiar nada. ¿Qué medias ves?

La idea

Mil muestras

Tres muestras son pocas para ver cuánto salta la media. Tomemos 1000 de cada tamaño. rng.choice(values, size=(1000, n)) da una tabla de 1000 × n: cada fila es una muestra. mean(axis=1) da la media de cada fila: 1000 medias.

Pythondatos: las tablas de la tienda

Cada histograma son 1000 medias, y la línea negra es la verdad. Con 30 pedidos, el 90 % de las medias está entre 7,99 € y 13,85 €: una muestra de 30 puede mostrar casi cualquier cosa. Con 300 están entre 9,80 € y 11,50 €, y con 3000 entre 10,35 € y 10,91 €.

sharex=True da a los tres gráficos el mismo eje horizontal, para poder compararlos. Sin él, cada gráfico se estiraría hasta sus propias medias y los tres parecerían igual de anchos.

Más precisamente, para curiosos

Aquí las muestras son con reemplazo (replace=True es el valor por defecto): un pedido puede salir dos veces en una muestra. Eso permite 1000 muestras a la vez, en una sola tabla. Con 30 o 3000 de 10 459 pedidos la diferencia con una muestra sin reemplazo es pequeña.

Los pedidos tienen una cola larga a la derecha, y sin embargo los histogramas de las medias son simétricos, como una campana. La media de suficientes pedidos se comporta así casi sin importar cómo sean los pedidos: cuanto más larga la cola, más pedidos necesita la campana. Esto se llama teorema central del límite.

La idea

La ley de los grandes números

¿Qué pasa si vas apilando pedidos uno a uno y calculas la media hasta ese momento después de cada uno? np.cumsum da la suma hasta cada posición. Divídela entre la cantidad hasta ahí (np.arange(1, 3001)) y tendrás la media tras 1, 2, … 3000 pedidos:

Pythondatos: las tablas de la tienda

Tras 10 pedidos la media es 11,29 €, tras 100 es 9,82 €, tras 1000 es 10,96 € y tras 3000 es 10,65 €. Al principio salta mucho, luego se calma alrededor de la verdad. Esta es la ley de los grandes números: cuanto mayor es una muestra aleatoria, más se acerca su media a la media de la población.

set_xscale('log') pone 1, 10, 100, 1000 a distancias iguales en el eje horizontal. Así se ven tanto el principio, donde pasa todo, como el final.

La idea

El ruido se reduce con la raíz cuadrada de n

¿Cuánto más precisa se vuelve la media cuando tomas más pedidos? Compara 100, 400 y 1600: cada tamaño es 4 veces el anterior.

Pythondatos: las tablas de la tienda

El ruido es la std de las 1000 medias: 0,93 € con 100 pedidos, 0,447 € con 400 y 0,238 € con 1600. Cada vez, 4 veces más pedidos dan más o menos la mitad de ruido. El ruido se reduce con la raíz cuadrada del tamaño, no con el tamaño mismo.

Así que hay un camino corto sin simulación: la desviación estándar de los pedidos dividida entre la raíz cuadrada de n. Se llama error estándar: 9,43 / √100 ≈ 0,94 €. La fórmula y la simulación dan casi lo mismo (0,472 € frente a 0,447 € con 400; la diferencia es el ruido de la propia simulación).

El precio es alto: una media el doble de precisa necesita 4 veces más datos, y una diez veces más precisa, 100 veces más.

Pruébalo

El ruido de 400 pedidos

¿Qué tamaño tiene el ruido de la media de 400 pedidos? Saca 1000 muestras de 400 pedidos y guarda en noise la desviación estándar de sus medias.

Pythondatos: las tablas de la tienda

La idea

«Diciembre cayó a la décima parte»

En la primera lección del curso, los ingresos de la tienda pequeña en diciembre fueron 22,70 € y en octubre 255 €. La tabla tiene 53 pedidos sin los cancelados, en 14 meses: unos 4 al mes. Diciembre tiene 2 de ellos, octubre 7.

Si todos los meses fueran iguales, ¿qué brecha daría el azar por sí solo? Mandamos cada uno de los 53 pedidos a un mes al azar y calculamos los ingresos de cada mes. 1000 veces:

Pythondatos: las tablas de la tienda

rng.integers(0, 14, ...) da a cada pedido un número de mes de 0 a 13. np.where(month == m, values, 0) conserva el valor solo para los pedidos del mes m, y sum(axis=1) los suma para cada año inventado.

En el 85,6 % de los años inventados el mes más fuerte es al menos 10 veces el más flojo. Y en ellos los meses son iguales por construcción. La caída a la décima parte no es señal de nada: con 4 pedidos al mes es el ruido habitual.

En los datos del año un mes tiene de media unos 870 pedidos, y el ruido es mucho menor. Por eso allí diciembre sí es el más fuerte. La caída de septiembre es otra pregunta: si es ruido y por qué ocurrió, lo averiguaremos en el proyecto.

Ejercicio

¿Cuántos pedidos bastan?

El jefe quiere el pedido medio con una precisión de ±0,50 € en 95 casos de cada 100. Para muestras de 100, 300, 1000, 2000 y 3000 pedidos, saca 1000 muestras de cada una y guarda en close (un dict: tamaño → proporción) cuántas de las medias están a 0,50 € o menos de la verdadera. Guarda en enough el menor tamaño que baste.

Pythondatos: las tablas de la tienda

Test

Ponte a prueba

1. La media de 100 pedidos tiene un ruido de unos 0,94 €. ¿Qué ruido tiene con 400 pedidos?
2. La desviación estándar de los pedidos es de 9,43 € y el error estándar de la media de 100 pedidos es de 0,94 €. ¿Cuál es la diferencia?
3. Una muestra de 300 pedidos del año da una media con un ruido de unos 0,54 €. Si la tienda tuviera un millón de pedidos en lugar de 10 459, ¿qué ruido tendrían 300 de ellos?
4. La tienda pequeña tiene unos 4 pedidos al mes. Diciembre da 22,70 € y octubre 255 €. ¿Qué se deduce?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·