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
sampleychoices? - ¿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.
| Caso | Función | Notas |
|---|---|---|
| k distintos de N | random.sample(pob, k) | Exige k ≤ N; no muta la lista |
| k con repetidos | random.choices(pob, k=r) | Vale r > N; cada sorteo independiente |
| Un solo ganador | random.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
samplecon k > N lanzaValueError: 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,
secretsno tienesample: 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
- 1Encuesta: 100 de 10000.
sample(clientes, 100). Estima la proporción con error ≈ √(0,25/100) = 5 pp. - 2Control: 20 de 1000 piezas.
Sin reemplazo: ninguna pieza se revisa dos veces. Si aparecen 2 falladas, la tasa estimada es 10 %.
- 3Simulació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).
Nube que se angosta
p̂ → 0,30 cuando k crece
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
- Con k = 5 y aleatorio: ¿qué tan lejos cae alguna estimación? ¿Y con k = 90?
- Con “primeros k” y k = 20: ¿la media se acerca a 0,30 aunque repitas 60 veces?
- ¿Cuánto k pedirías para un error típico de 3 pp con p ≈ 0,3?
Ver respuestas sugeridas
- 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.
- No: los primeros 20 son casi todos A (p̂ ≈ 0). El sesgo no se diluye repitiendo: estima otra población.
- 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.