01 · Punto de partida
La urna como máquina de muestrear
Una urna con bolas de colores es el modelo físico del muestreo discreto: sacar, mirar, reponer (o no) y repetir. Tres regímenes salen de la misma urna cambiando la reposición: con reemplazo (binomial), sin reemplazo (hipergeométrica) y con refuerzo (Polya).
Además, la urna da un algoritmo secuencial para cualquier discreta finita sin tabla acumulada: decidir valor por valor con probabilidades condicionales sobre la masa restante.
- ¿Cómo se muestrea una discreta con un U fresco por valor?
- ¿Qué cambia entre reponer, no reponer y agregar bolas?
- ¿Cómo se genera hipergeométrica por extracciones?
- ¿Por qué Polya produce trayectorias que se “pegan”?
02 · Definición
Secuencial condicional e hipergeométrica
Para p₁…pₙ con resto r = 1: para i = 1..n−1, con Uᵢ ~ U(0,1) fresco, devolver i si Uᵢ < pᵢ/r; si no, r −= pᵢ y seguir. El último valor sale por descarte. Es exacto por regla de la cadena.
Con reemplazo
Devolver la bola: ensayos independientes. n extracciones ⇒ Binomial(n,p). (Tema 19)
Sin reemplazo
No devolver: la composición cambia. K rojas + resto blancas, n draws ⇒ Hipergeométrica. (Temas 31–32)
Polya +c
Devolver + agregar c del color salido: refuerzo. Contagio, modas y trayectorias persistentes. (Laboratorio)
| Reposición | Ensayos | Distribución del conteo |
|---|---|---|
| Devolver la bola | Independientes | Binomial(n, R/(R+B)) |
| No devolver | Dependientes (−) | Hipergeométrica(R,B,n) |
| Devolver + c del color | Contagio (+) | Beta-binomial (límite Beta) |
03 · Anatomía
Cuándo usar cada urna
- Secuencial para discretas
- Evita construir F completa si pᵢ se genera sobre la marcha (series infinitas, streaming). Cuesta O(E[X]) uniformes por muestra.
- Hipergeométrica por draws
- Simular las n extracciones una por una es O(n). Para n grande usar inversión/chí o librería; para n chico la urna es el método más claro.
- Polya como modelo
- No es un truco de eficiencia: es un modelo de refuerzo (contagio, modas, “el éxito llama al éxito”). Su límite es Beta(R/c, B/c).
- Un U por paso, frescos
- Cada extracción usa su propio uniforme. Reutilizar U entre pasos correlaciona draws y rompe hipergeométrica/Polya.
Urna secuencial
Sin tabla previa
Ideal si pᵢ llega en stream o n es enorme y solo querés una muestra. Paga un U por valor visitado.
Tabla + bisect/alias
Tabla reutilizable
Mejor si la misma p se muestrea N veces. La urna secuencial no amortiza; alias sí.
04 · Dónde aparecen las urnas
Del sorteo al contagio
- 1Sorteos y auditorías.
Sin reemplazo: jurados, muestras, loterías. Hipergeométrica exacta por draws. (Temas 31–32)
- 2Controles de calidad.
Lotes finitos con defectuosas: hipergeométrica, no binomial, cuando n/N no es despreciable.
- 3Contagio y modas.
Polya: epidemias simples, adopción, urnas de voto. El refuerzo c regula la persistencia.
- 4Puente a Bayes.
Polya(R,B,c) → Beta(R/c,B/c): la urna anticipa la conjugada Beta-Binomial. (Temas 27–28)
05 · Representación en Python
Secuencial, hipergeométrica y Polya en una urna
Tres funciones, una idea: extraer con el uniforme fresco y actualizar la urna según el régimen.
Python en tu navegador. Subí c en Polya y mirá cómo las trayectorias se extreman.
import random
random.seed(110)
def secuencial(probs):
r = 1.0
for i, p in enumerate(probs[:-1]):
if random.random() < p / r:
return i
r -= p
return len(probs) - 1
def hipergeometrica(R, B, n):
urna = ["R"] * R + ["B"] * B
random.shuffle(urna)
return urna[:n].count("R")
def polya(pasos, R0=1, B0=1, c=2):
R, B = R0, B0
rojas = 0
for _ in range(pasos):
if random.random() < R / (R + B):
R += c
rojas += 1
else:
B += c
return rojas
probs = [0.10, 0.20, 0.30, 0.25, 0.10, 0.05]
print("secuencial:", [secuencial(probs) + 1 for _ in range(8)])
print("hipergeom R=7 B=13 n=5:", [hipergeometrica(7, 13, 5) for _ in range(8)])
print("polya c=2:", [polya(20) for _ in range(8)])
Secuencial e hipergeométrica deben respetar sus tablas; Polya con c = 2 ya muestra trayectorias pegadas a 0 o a 20.
06 · Exploración
Laboratorio: Polya que se enamora de lo que sale
Ocho urnas parten de 1–1 y juegan 200 pasos con el mismo c. Con c = 0 (reemplazo) todas rondan 0,5; con c grande se van a los extremos y se quedan: el refuerzo congela la historia temprana.
Urna de Polya R₀=B₀=1
si sale rojo: R += c · si no: B += c
Con c 2, las trayectorias se dispersan y persisten.
Proporción de rojas paso a paso. Probá c = 0 (todas al centro) y c = 5 (casi todas a bordes).
Preguntas para explorar
- Con c = 0, ¿las 8 trayectorias se juntan en 0,5? ¿Por qué es binomial con reemplazo?
- Con c = 5, ¿cuántas terminan cerca de 0 o de 1? ¿Qué historia temprana las llevó ahí?
- La media final sigue ≈ 0,5 en ambos casos. ¿Qué cambia entonces: la media o la varianza entre urnas?
Ver respuestas sugeridas
- Sí: sin refuerzo cada draw es Bernoulli(0,5) independiente y la proporción converge a 0,5.
- La mayoría: los primeros draws con +5 pesan muchísimo y la urna “recuerda” para siempre.
- La varianza entre urnas: el límite es Beta(1/c,1/c), uniforme con c = 1 y en U con c grande.
07 · Comprensión
Confusiones frecuentes
«Sin reemplazo ≈ con reemplazo siempre»
Solo si n ≪ N. Con R=7, B=13, n=15, la hipergeométrica y la binomial difieren mucho: la urna finita se nota.
«Polya tiene la misma media, así que es lo mismo»
Media igual, varianza y trayectorias opuestas: reemplazo concentra, Polya dispersa y persiste. Mirar el rango final, no solo la media.
«Un U para toda la secuencia»
Cada extracción necesita su uniforme. Reutilizar congela draws y rompe conteos hipergeométricos.
«La lista de bolas escala»
Con R+B = 10⁶ la lista es pesada e innecesaria: trabajar con conteos y probabilidades R/(R+B).
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: secuencial que respeta p
Con p = [0,1 · 0,2 · 0,3 · 0,25 · 0,1 · 0,05] y 8000 muestras (semilla 111), verificá frecuencias por secuencial.
import random
random.seed(111)
probs = [0.10, 0.20, 0.30, 0.25, 0.10, 0.05]
def secuencial(probs):
r = 1.0
for i, p in enumerate(probs[:-1]):
if random.random() < p / r:
return i
r -= p
return len(probs) - 1
m = [secuencial(probs) for _ in range(8000)]
for v in range(6):
print(v + 1, round(m.count(v) / len(m), 3))
Ver solución razonada
Deben dar ≈ tabla. Si el último valor sale de más, el bucle no descuenta r correctamente.
Ejercicio 2: hipergeométrica vs binomial
Urna R=7, B=13, n=5: estimá P(2 rojas) por draws (semilla 112) y compará con la fórmula hipergeométrica.
import random
import math
random.seed(112)
R, B, n, N = 7, 13, 5, 8000
def draw():
urna = ["R"] * R + ["B"] * B
random.shuffle(urna)
return urna[:n].count("R")
m = [draw() for _ in range(N)]
print("muestral P=2:", round(m.count(2) / N, 3))
teo = math.comb(R, 2) * math.comb(B, 3) / math.comb(R + B, n)
print("teórica:", round(teo, 3))
Ver solución
Teórica ≈ 0,352. La binomial(5, 0,35) daría ≈ 0,336: parecidas aquí porque n/N = 0,25, pero distintas.
Ejercicio 3: Polya que se pega
Con R₀=B₀=1, c=3 y 60 pasos, repetí 12 urnas y mirá el rango final de rojas/60. Debe cubrir casi [0,1].
Ver una posible respuesta
import random
random.seed(113)
c, pasos, urnas = 3, 60, 12
finales = []
for _ in range(urnas):
R, B, rojas = 1, 1, 0
for _ in range(pasos):
if random.random() < R / (R + B):
R += c
rojas += 1
else:
B += c
finales.append(rojas / pasos)
print([round(v, 2) for v in finales])
print("rango:", round(min(finales), 2), "-", round(max(finales), 2))
Rango típico 0,05–0,95: cada urna se enamora de su historia temprana. Con c = 0 el rango sería ~0,4–0,6.
09 · Síntesis
Ideas para recordar
- Secuencial condicional: pᵢ/r con U fresco por valor, sin tabla previa.
- Con reemplazo ⇒ binomial; sin reemplazo ⇒ hipergeométrica.
- Polya +c ⇒ refuerzo y persistencia; límite Beta(R₀/c, B₀/c).
- Un uniforme por extracción; conteos en vez de listas para escalar.
- Media igual no implica régimen igual: mirar rango y varianza entre urnas.
En el próximo tema bajamos al caso n = 1: la generación de Bernoulli perfecta.