Generación de Variables Aleatorias · Tema 15

Métodos de urna

Cómo muestrear por extracciones secuenciales: condicionales, hipergeométrica y la urna de Polya que refuerza lo que sale.

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)

Misma urna inicial (R rojas, B blancas), tres destinos.
ReposiciónEnsayosDistribución del conteo
Devolver la bolaIndependientesBinomial(n, R/(R+B))
No devolverDependientes (−)Hipergeométrica(R,B,n)
Devolver + c del colorContagio (+)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

extraer→reponer ± c→repetir
  1. 1
    Sorteos y auditorías.

    Sin reemplazo: jurados, muestras, loterías. Hipergeométrica exacta por draws. (Temas 31–32)

  2. 2
    Controles de calidad.

    Lotes finitos con defectuosas: hipergeométrica, no binomial, cuando n/N no es despreciable.

  3. 3
    Contagio y modas.

    Polya: epidemias simples, adopción, urnas de voto. El refuerzo c regula la persistencia.

  4. 4
    Puente 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.

EXPERIMENTO 15

Urna de Polya R₀=B₀=1

si sale rojo: R += c · si no: B += c

Los resultados numéricos aparecen debajo.
Media final rojas0,500
Mín – máx final0,10 – 0,90
RégimenContagio
Trayectorias8 × 200

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

  1. Con c = 0, ¿las 8 trayectorias se juntan en 0,5? ¿Por qué es binomial con reemplazo?
  2. Con c = 5, ¿cuántas terminan cerca de 0 o de 1? ¿Qué historia temprana las llevó ahí?
  3. La media final sigue ≈ 0,5 en ambos casos. ¿Qué cambia entonces: la media o la varianza entre urnas?
Ver respuestas sugeridas
  1. Sí: sin refuerzo cada draw es Bernoulli(0,5) independiente y la proporción converge a 0,5.
  2. La mayoría: los primeros draws con +5 pesan muchísimo y la urna “recuerda” para siempre.
  3. 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.