Números Pseudoaleatorios · Tema 25

Muestreo aleatorio

Tomar muestras que representan al todo: sin reemplazo con sample, con reemplazo con choices, y tamaño que achica el error.

01 · Punto de partida

Del sorteo a la muestra

Los Temas 23 y 24 sortean uno o mezclan todos. El muestreo está en el medio: de 10000 clientes encuestás 100, de 1000 piezas revisás 20. Si esos pocos salen al azar de verdad, sus proporciones estiman las del todo; si los elegís “a ojo” (los primeros, los más cómodos), la muestra miente aunque el cálculo sea perfecto.

La receta tiene dos ramas: sin reemplazo (cada elemento sale 0 o 1 vez: encuesta, control) y con reemplazo (puede repetirse: bootstrap, simulación).

  • ¿Qué diferencia hay entre sample y choices?
  • ¿Por qué los primeros k no son una muestra aunque sean k?
  • ¿Cómo achica el error agrandar la muestra?
  • ¿Qué tamaño pedir para estimar una proporción?

02 · Definición

Población, marco y muestra

◈

Sin reemplazo

sample(pob, k): k distintos, orden aleatorio. Para encuestas y control: nadie se cuenta dos veces.

⇄

Con reemplazo

choices(pob, k=r): cada sorteo parte de cero, hay repetidos. Para bootstrap y réplicas de simulación.

▣

Representativa

No significa “igualita”: significa sin sesgo sistemático. Con k = 20 el ruido es grande; con k = 2000 se pega al valor real.

Qué función pedir.
CasoFunciónNotas
k distintos de Nrandom.sample(pob, k)Exige k ≤ N; no muta la lista
k con repetidosrandom.choices(pob, k=r)Vale r > N; cada sorteo independiente
Un solo ganadorrandom.choice(pob)Caso k = 1 (Tema 23)

03 · Técnica y tamaño

Aleatorio de verdad, k con cuenta

sample implementa un Fisher-Yates parcial O(k): parejo sobre los C(N,k) grupos, sin mezclar todo (Tema 24). El tamaño manda en la precisión: para una proporción p, el error estándar es √(p(1−p)/k); cuadruplicar k divide el error a la mitad.

Marco
La lista de donde sorteás debe ser la población entera y actualizada. Marco incompleto (solo clientes con email) sesga más que cualquier generador.
k ≤ N
sample con k > N lanza ValueError: no hay k distintos. Si necesitás más sorteos que población, es con reemplazo (choices).
Semilla y réplica
Misma semilla, misma muestra: registrala para auditar (Tema 36). Para sorteo con premio, secrets no tiene sample: sortear índices sin reemplazo propios.

Bien muestreado

sample + k suficiente

Cada grupo con igual chance, estimador sin sesgo, error que se achica con √k. Repetible y auditable.

Mal muestreado

Primeros k o a dedo

Los primeros heredan el orden de carga (morosos, recientes): la muestra estima otro universo. Ningún k lo arregla.

04 · Ejemplos

Tres muestras típicas

Población N→Sorteo parejo→Muestra k
  1. 1
    Encuesta: 100 de 10000.

    sample(clientes, 100). Estima la proporción con error ≈ √(0,25/100) = 5 pp.

  2. 2
    Control: 20 de 1000 piezas.

    Sin reemplazo: ninguna pieza se revisa dos veces. Si aparecen 2 falladas, la tasa estimada es 10 %.

  3. 3
    Simulación: 5000 réplicas de 50.

    Con reemplazo entre escenarios: un escenario puede repetirse; es lo correcto para estimar variabilidad.

05 · Implementación en Python

Muestrear y estimar

Población de 100 con 30 “B” (p = 0,30). Tomamos una muestra de 20 sin reemplazo y estimamos p: cerca de 0,30 con ruido honesto.

Python en tu navegador. Subí k a 80 y la estimación se clava; bajalo a 5 y el ruido manda.

import random

pob = ["A"] * 70 + ["B"] * 30
rng = random.Random(25)
m = rng.sample(pob, 20)
print(m)
print("estimada p(B):", round(m.count("B") / len(m), 4), "real: 0.3")
print("n:", len(m), "todos en pob:", all(x in ("A", "B") for x in m))

Una muestra, una estimación con ruido: repetí el bloque mentalmente con otra semilla y cae en otro valor cercano.

Con reemplazo y el error 1/√k

import math
import random

pob = ["A"] * 70 + ["B"] * 30
for k in [20, 80, 320]:
    rng = random.Random(k)
    est = sum(1 for _ in range(200) for _ in [rng.choices(pob, k=1)[0] == "B"]) / 200
    print(k, round(est, 4), "error tipico:", round(math.sqrt(0.3 * 0.7 / k), 4))

06 · Exploración

Laboratorio: el error se achica con k

Población 70/30 fija. Repetimos R = 60 muestras y dibujamos cada estimación de p(B): con k chico la nube es ancha, con k grande se pega a 0,30. Compará muestreo parejo con “primeros k” sesgado (población ordenada: primero todas las A).

EXPERIMENTO 25

Nube que se angosta

p̂ → 0,30 cuando k crece

Los resultados numéricos aparecen debajo.
p real—
p̂ media (R=60)—
Error típico—
Veredicto—

Con k = 20 el ruido honesto ronda ±10 pp.

La línea blanca es p = 0,30 real. Puntos sistemáticamente debajo delatan muestra no aleatoria.

Preguntas para explorar

  1. Con k = 5 y aleatorio: ¿qué tan lejos cae alguna estimación? ¿Y con k = 90?
  2. Con “primeros k” y k = 20: ¿la media se acerca a 0,30 aunque repitas 60 veces?
  3. ¿Cuánto k pedirías para un error típico de 3 pp con p ≈ 0,3?
Ver respuestas sugeridas
  1. Con k = 5 hay nubes de 0,0 a 0,6; con k = 90 casi todo cae entre 0,25 y 0,35. Más k, menos ruido.
  2. No: los primeros 20 son casi todos A (p̂ ≈ 0). El sesgo no se diluye repitiendo: estima otra población.
  3. k ≈ 0,21/0,03² ≈ 233. Regla: cuadruplicar k parte el error a la mitad.

07 · Comprensión

Confusiones frecuentes

«sample y choices son intercambiables»

No: sample prohíbe repetidos y k ≤ N; choices los permite y admite k > N. Pedir 120 de 100 con sample lanza ValueError.

«Tomo los primeros k, total son k»

Si la lista está ordenada (por fecha, monto, nombre), los primeros heredan ese orden: muestra cómoda pero viciada. Aleatorio o nada.

«Más sorteos con reemplazo equivalen a mayor k sin reemplazo»

Se parecen con N » k, pero con k cercano a N difieren: sin reemplazo agota la población (varianza menor), con reemplazo no.

«Representativa significa idéntica al todo»

Significa sin sesgo, no sin ruido: con k = 20 una muestra perfecta puede dar 0,20 o 0,40. La garantía es estadística, no foto.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: control de calidad

De 1000 piezas (suponé la lista lote con 8 % falladas), tomá 20 sin reemplazo y estimá la tasa. Verificá que no hay repetidos.

import random

lote = ["OK"] * 920 + ["FALLA"] * 80
rng = random.Random(6)
m = rng.sample(lote, 20)
print(m.count("FALLA"), round(m.count("FALLA") / len(m), 4))
print("distintos:", len(set(m)) <= 20, "n:", len(m))
Ver solución razonada

≈ 1–2 falladas (tasa ≈ 0,05–0,10): el estimador oscila alrededor del 0,08 real. Sin reemplazo ningún índice se repite por construcción.

Ejercicio 2: el k imposible

Provocá el ValueError de sample con k > N y resolvelo con choices.

import random

xs = list(range(10))
rng = random.Random(1)
try:
    rng.sample(xs, 12)
except ValueError as e:
    print("ValueError:", e)
print(len(rng.choices(xs, k=12)))
Ver solución

Sample larger than population y luego 12: con reemplazo no hay tope. La excepción es tu amiga: avisa diseño equivocado.

Ejercicio 3: regla 1/√k

Mostrá que cuadruplicar k parte el error a la mitad estimando p(B) = 0,3 con k = 20 y k = 80 (60 réplicas cada uno).

Ver una posible respuesta
import random
import statistics

pob = ["A"] * 70 + ["B"] * 30
for k in [20, 80]:
    rng = random.Random(k)
    ests = [sum(1 for x in rng.sample(pob, k) if x == "B") / k for _ in range(60)]
    print(k, "media:", round(statistics.mean(ests), 4),
          "desvio:", round(statistics.pstdev(ests), 4))

Medias ≈ 0,30 en ambas; desvío con k = 80 ≈ mitad del de k = 20. Esa es la tasa 1/√k en acción.

09 · Síntesis

Ideas para recordar

  • Sin reemplazo: sample(pob, k), k ≤ N, sin repetidos.
  • Con reemplazo: choices(pob, k), admite k > N, con repetidos.
  • Aleatorio simple = cada grupo con igual chance; primeros k ≠ muestra.
  • Error típico ≈ √(p(1−p)/k): ×4 k → ÷2 error.
  • Marco completo + semilla registrada = muestra auditable.

En el próximo bloque cambia el juego: calidad de una secuencia pseudoaleatoria, cuándo desconfiar de un generador.