Método de Monte Carlo · Tema 03

Principio fundamental del muestreo aleatorio

Si podés sortear la incertidumbre con su distribución, podés estimar lo que quieras: la muestra representa, el promedio aproxima.

01 · Punto de partida

El azar que sí representa

No cualquier azar sirve. Tirar una moneda justa no representa la demanda de un negocio ni el tiempo entre fallas. El principio fundamental dice: si la muestra se genera con la misma distribución que la realidad, el promedio muestral estima la realidad.

Por eso el corazón de Monte Carlo no es el promedio: es sortear bien. Un mal muestreo arruina millones de réplicas; un buen muestreo hace que mil alcancen.

  • ¿Qué distribución tiene mi incertidumbre?
  • ¿Cómo la convierto en sorteos en Python?
  • ¿Mis sorteos son independientes e idénticos (iid)?
  • ¿La muestra se parece a la realidad cuando N crece?

02 · Definición

Muestrear es imitar la distribución

📦

Distribución F

La regla del azar: qué valores salen y con qué probabilidad. Uniforme, dado, Bernoulli, normal, empírica.

🔁

Muestra iid

Independiente e idénticamente distribuida: cada sorteo no mira al anterior y todos usan la misma F.

🪞

Representatividad

Con N grande, la muestra copia a F: el histograma se parece a la teoría y el promedio se pega a la esperanza.

Distribuciones que todo programador debe saber sortear.
IncertidumbreDistribuciónSorteo en Python
Punto al azar en [0,1]Uniforme(0,1)random.random()
Dado, cara o selloDiscreta equiprobablerandom.randint(1,6)
Cliente compra o no (30%)Bernoulli(0,3)random.random() < 0.3
Demanda 10/20/30 con 50/30/20%Empírica con pesosrandom.choices(val, weights=w)
Medición con ruidoNormal(μ,σ)random.gauss(mu, sigma)

03 · Cómo funciona

De la incertidumbre al sorteo en 3 pasos

Observar→Elegir F→Sortear
  1. 1
    Observar.

    ¿La demanda es 10, 20 o 30 con qué frecuencia? ¿El tiempo de falla es exponencial? Los datos sugieren F.

  2. 2
    Elegir F.

    Uniforme si todo vale igual, Bernoulli si es sí/no, normal si hay campana, empírica si solo tengo tabla de frecuencias.

  3. 3
    Sortear iid.

    Un sorteo por réplica, sin memoria: no reutilizar el mismo número, no «compensar» rachas.

Bien muestreado

La muestra copia a F

Histograma parejo para el dado, 30% de unos para Bernoulli(0,3), campana para la normal. El promedio coincide con la teoría.

Mal muestreado

El promedio miente

Usar uniforme cuando era normal, reutilizar sorteos o «corregir» rachas sesga todo. N grande no arregla un F equivocado.

iid
Independientes e idénticamente distribuidos: la condición que exige la Ley de los Grandes Números. Sin iid, no hay garantía.
Semilla
Número inicial del generador. Igual semilla = igual muestra: sirve para depurar y para reproducir.
Tamaño N
Más N = muestra más fiel, pero el error cae lento (1/√N). Primero elegir bien F, después agrandar N.

04 · Ejemplos

Cinco sorteos de todos los días

  1. 1
    Punto en [0,1].

    random.random(). Promedio → 0,5. Base de áreas e integrales.

  2. 2
    Dado.

    randint(1,6). Promedio → 3,5. Cada cara debe salir ~1/6.

  3. 3
    Compra sí/no.

    random() < 0.3. Promedio → 0,3. Así se simula riesgo y conversión.

  4. 4
    Demanda con pesos.

    choices([10,20,30], weights=[50,30,20]). Promedio → 10·0,5 + 20·0,3 + 30·0,2 = 17.

  5. 5
    Ruido normal.

    gauss(100, 15). Promedio → 100. Así se modela error de medición e incertidumbre continua.

05 · Representación en Python

La caja de herramientas random

Casi todo Monte Carlo estático sale de estas cinco funciones. Aprendelas de memoria.

Python en tu navegador. Ejecutá, cambiá N y los pesos, y mirá cómo el promedio se acerca a la teoría.

import random

N = 10000
uniformes = [random.random() for _ in range(N)]
dados = [random.randint(1, 6) for _ in range(N)]
compras = [1 if random.random() < 0.3 else 0 for _ in range(N)]

print("U(0,1) →", sum(uniformes) / N, "(teórico 0.5)")
print("Dado →", sum(dados) / N, "(teórico 3.5)")
print("Bernoulli(0.3) →", sum(compras) / N, "(teórico 0.3)")

Consejo: corré dos veces con N = 100 y con N = 10 000. El temblor con N chico es la lección.

Demanda empírica con pesos

import random

valores = [10, 20, 30]
pesos = [50, 30, 20]
N = 10000
muestra = random.choices(valores, weights=pesos, k=N)
print("Promedio:", sum(muestra) / N, "(teórico 17.0)")
print("Frecuencias:", {v: muestra.count(v) / N for v in valores})

06 · Exploración

Laboratorio: la muestra copia a la realidad

Elegí la distribución y la cantidad de sorteos. El histograma verde es tu muestra; la línea amarilla es el valor teórico y la celeste tu promedio. Con N grande se abrazan.

EXPERIMENTO 03

Muestrear bien, estimar bien

promedio muestral → esperanza

Los resultados numéricos aparecen debajo.
Promedio muestral—
Valor teórico—
Diferencia—
Lectura—

Tocá «Sortear» para generar la muestra.

Barras: frecuencia de cada intervalo o valor. Línea amarilla punteada: teoría. Línea celeste: tu promedio. Si sorteás bien, con N grande coinciden.

Preguntas para explorar

  1. Con Uniforme y N = 200, ¿las 10 barras son parejas? ¿Y con N = 20 000?
  2. Con Dado y N = 300, ¿alguna cara «desaparece»? ¿Qué pasa con N = 12 000?
  3. Con Bernoulli(0,3), ¿por qué la barra del 0 es más alta que la del 1 aunque el sorteo sea justo?
Ver respuestas sugeridas
  1. No: con N chico hay huecos y picos falsos. Con N grande las barras se emparejan: la muestra copia a la uniforme.
  2. Con N = 300 alguna cara puede salir la mitad que otra por puro ruido. Con N grande todas rondan 1/6.
  3. Porque P(1) = 0,3 y P(0) = 0,7: lo justo es que el 0 salga más. Justo no significa mitad y mitad, sino respetar F.

07 · Comprensión

Confusiones frecuentes

«Aleatorio es tirar cualquier cosa»

No: cada problema tiene su F. Tirar uniforme cuando tocaba normal es el error más frecuente y el más grave.

«Si salió mucho 0, ahora toca 1»

La falacia del jugador: los sorteos iid no tienen memoria. Cada réplica empieza de cero.

«Con N enorme todo se arregla»

N grande reduce el ruido, pero no corrige una F equivocada ni sorteos dependientes.

«Reutilizar la misma muestra da igual»

Reutilizar rompe la independencia (iid) y subestima el error. Cada réplica necesita su sorteo fresco.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: verificar el dado

Sorteá 6 000 dados y comprobá que cada cara sale ~1/6 y el promedio ~3,5.

import random

N = 6000
tiradas = [random.randint(1, 6) for _ in range(N)]
print("Promedio:", sum(tiradas) / N)
for cara in range(1, 7):
    print(cara, tiradas.count(cara) / N)
Ver solución razonada

Cada frecuencia debe rondar 0,166 ± 0,01 y el promedio 3,5 ± 0,05. Si alguna cara da 0,10 o 0,25 con N = 6 000, sospechá del generador, no del azar.

Ejercicio 2: Bernoulli a mano

Sin usar choices: simulá 5 000 clientes que compran con p = 0,3 usando random() y estimá la proporción.

import random

N = 5000
compras = sum(1 for _ in range(N) if random.random() < 0.3)
print(compras / N)
Ver solución

Verás ~0,30 ± 0,015. La condición random() < p es la forma canónica de sortear Bernoulli(p).

Ejercicio 3: demanda empírica

La demanda es 0, 1 o 2 unidades con probabilidades 0,2, 0,5 y 0,3. Escribí generar_demanda() y estimá la demanda media teórica (1,1) con N = 10 000.

Ver una posible respuesta
import random

def generar_demanda():
    r = random.random()
    if r < 0.2:
        return 0
    if r < 0.7:
        return 1
    return 2

N = 10000
m = sum(generar_demanda() for _ in range(N)) / N
print(m)

Deberías ver ~1,1. Este «acumular probabilidades» es la transformada inversa a mano: la base para sortear cualquier discreta.

09 · Síntesis

Ideas para recordar

  • El principio fundamental: muestra iid con distribución F ⇒ el promedio estima E[g(X)].
  • Sortear bien es elegir bien F: uniforme, discreta, Bernoulli, empírica o normal según el caso.
  • Justo no es mitad y mitad: es respetar las probabilidades de F.
  • Los sorteos no tienen memoria: cada réplica es fresca e independiente.
  • N grande pule el ruido, pero jamás corrige una F equivocada.

En el próximo tema veremos la simulación estática: el marco donde estas muestras independientes se convierten en decisiones.