Método de Monte Carlo · Tema 06

Variables de entrada

Lo incierto que alimenta el modelo: qué sortear, con qué distribución y con qué datos.

01 · Punto de partida

Todo arranca con una entrada

La salida solo puede ser tan buena como la entrada. Si la demanda, el costo o la falla están mal modelados, el promedio converge al valor equivocado con total seguridad.

Las entradas se dividen en dos familias: las aleatorias (se sortean con F) y las de decisión (las fijás vos para comparar, como Q o el precio).

  • ¿Qué entradas son azar y cuáles son decisión?
  • ¿Qué F describe cada azar: uniforme, Bernoulli, normal, empírica?
  • ¿De dónde salen sus parámetros?
  • ¿Son independientes o se mueven juntas?

02 · Definición

Dos familias de entradas

🎲

Aleatoria

Se sortea en cada réplica con su F: demanda, costo, falla, punto (x,y). Ejemplo: D ~ {80,100,120}.

🎛️

Decisión

La fijás vos y no se sortea: Q a comprar, precio, umbral. Se prueba un valor por simulación.

📌

Parámetro

Constante de F o del modelo: p = 0,3, μ = 100, σ = 15. Se estima con datos o se supone explícito.

Catálogo mínimo de entradas aleatorias.
Si la entrada es…Usá F…Sorteo
Cualquier valor entre a y bUniforme(a,b)random.uniform(a, b)
Sí/no con pBernoulli(p)random.random() < p
Conteo 1–6, cara/cecaDiscreta equiprobablerandom.randint / choice
Tabla de valores con pesosEmpíricarandom.choices(val, weights)
Campana con μ, σNormal(μ,σ)random.gauss(mu, sigma)

03 · Cómo elegir F

Del dato a la distribución en 3 pasos

Dato→Forma→Parámetros
  1. 1
    Mirar el dato.

    ¿Toma 2 valores, 6, continuos? ¿Histograma parejo, con pico o con campana? La forma manda.

  2. 2
    Elegir la forma.

    Binaria → Bernoulli. Pocos valores → discreta/empírica. Rango acotado sin pico → uniforme. Campana → normal.

  3. 3
    Poner parámetros.

    p con la frecuencia, μ/σ con media/desvío, pesos con conteos. Siempre con fuente: «p = 0,3 de 400 tickets».

Bien declarada

Trazable

«D en {80,100,120} con 30/40/30% de 200 días». Otro puede repetirla, criticarla y mejorarla.

Mal declarada

Mágica

«Demanda más o menos 100». Nadie puede repetirla: ¿uniforme 80–120? ¿normal? ¿con qué σ?

Independencia
Supuesto por defecto: cada entrada se sortea sin mirar a las otras. Si hay correlación, hay que modelarla aparte.
Rango válido
Valores posibles: demanda ≥ 0, p en [0,1]. El generador debe respetarlo (truncar o elegir F acotada).
Fuente
De dónde sale cada parámetro: datos, experto o supuesto explícito. Sin fuente no hay confianza.

04 · Ejemplos

Cinco entradas bien escritas

  1. 1
    Punto para π.

    x, y ~ U(0,1) independientes. Sin parámetros. Fuente: diseño del experimento.

  2. 2
    Falla.

    Bernoulli(p = 0,05). Fuente: 50 fallas en 1 000 equipos.

  3. 3
    Demanda.

    {80,100,120} con 30/40/30%. Fuente: 200 días de ventas.

  4. 4
    Costo.

    Normal(μ = 100, σ = 15), truncada en ≥ 0. Fuente: 60 presupuestos.

  5. 5
    Decisión Q.

    No es aleatoria: se prueba Q = 80, 100, 120. Fuente: decisión a evaluar.

05 · Representación en Python

Una función generadora por entrada

Cada entrada aleatoria merece su generar_*. La simulación queda legible y cambiar F es tocar un solo lugar.

Python en tu navegador. Ejecutá y cambiá p, μ, σ y los pesos: las salidas se moverán en el próximo tema.

import random

def generar_punto():
    return random.random(), random.random()

def generar_falla(p=0.05):
    return 1 if random.random() < p else 0

def generar_demanda():
    return random.choices([80, 100, 120], weights=[30, 40, 30])[0]

def generar_costo(mu=100, sigma=15):
    return max(0, random.gauss(mu, sigma))

print(generar_punto())
print(generar_falla())
print(generar_demanda())
print(generar_costo())

06 · Exploración

Laboratorio: qué forma tiene cada entrada

Elegí la entrada, mové su parámetro y sorteá. Mirá cómo el histograma cambia de forma y cómo la media sigue al parámetro.

EXPERIMENTO 06

Entradas con forma propia

X ~ F(parámetro)

Los resultados numéricos aparecen debajo.
Media muestral—
Teórica—
Mín – Máx—
Lectura—

Tocá «Sortear» para generar la entrada.

Uniforme: barras parejas entre 0 y b. Bernoulli: dos barras (0 y 1). Normal: campana centrada en μ. Cambiar el parámetro mueve la escala, no el método.

Preguntas para explorar

  1. En Uniforme(0, b), si duplicás b, ¿qué le pasa a la media?
  2. En Bernoulli(p), ¿qué p da la barra del 1 más alta que la del 0?
  3. En Normal, ¿por qué el rango mín–máx supera a μ ± 15?
Ver respuestas sugeridas
  1. Se duplica: la media teórica es b/2. La forma sigue pareja, solo cambia la escala.
  2. Solo p > 0,5. Con p = 0,3 lo normal es que el 0 domine: eso es respetar F.
  3. Porque σ = 15 dispersa: con N = 5 000 aparecen colas de ±3σ. El rango crece con N; σ no.

07 · Comprensión

Confusiones frecuentes

«La decisión también se sortea»

No: Q o el precio se fijan para comparar. Si los sorteás, mezclás políticas y el promedio no decide nada.

«Uniforme sirve para todo»

Solo si todo vale igual. Para sí/no va Bernoulli; para campanas va normal; para tablas va empírica.

«Los parámetros se adivinan»

Se estiman con datos o se declaran como supuesto con fuente. Adivinar sin escribirlo es el error más caro.

«Si son varias, son independientes»

Solo si lo verificás o lo suponés por escrito. Precio y demanda suelen moverse juntos.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: uniforme a medida

Generá Uniforme(10, 20) con uniform() y verificá media ~15.

import random

N = 10000
m = sum(random.uniform(10, 20) for _ in range(N)) / N
print(m)
Ver solución razonada

Verás ~15 ± 0,1. La media de U(a,b) es (a+b)/2: el generador la respeta si N es grande.

Ejercicio 2: Bernoulli con p dado

Simulá fallas con p = 0,05 y N = 20 000. ¿La proporción se pega a 0,05?

import random

p, N = 0.05, 20000
print(sum(1 for _ in range(N) if random.random() < p) / N)
Ver solución

Sí: ~0,05 ± 0,003. Con N = 100 verías 0,02 u 0,09: el mismo generador, distinto ruido.

Ejercicio 3: empírica desde datos

Con ventas [80×30, 100×40, 120×30], escribí la generadora y comprobá la media 100.

Ver una posible respuesta
import random

def generar_demanda():
    return random.choices([80, 100, 120], weights=[30, 40, 30])[0]

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

Media teórica: 80·0,3 + 100·0,4 + 120·0,3 = 100. Verás ~100 ± 1.

09 · Síntesis

Ideas para recordar

  • Separar aleatorias (se sortean) de decisión (se fijan) y parámetros (se estiman).
  • Cada aleatoria declara F + parámetros + fuente + rango.
  • Elegir F por la forma del dato, no por comodidad.
  • En Python: una generar_*() por entrada, validada sola.
  • La independencia se supone por escrito o se modela; nunca se asume en silencio.

En el próximo tema veremos las variables de salida: qué medir en cada réplica y cómo promediarlo.