Modelos y Simulación · Tema 39

Análisis de escenarios

Qué pasa si cambian las condiciones: futuros posibles, comparados con la misma vara.

01 · Punto de partida

Del modelo validado a la decisión

En el Tema 38 dejamos el modelo comparado con la realidad: sabemos dónde responde. Ahora lo usamos para lo que fue construido: preguntar por futuros que aún no pasaron. ¿Qué pasa si la demanda crece 30%? ¿Y si abrimos otra caja? ¿Y si ambas cosas a la vez?

Analizar escenarios es correr esos futuros con el mismo modelo, las mismas métricas y las mismas réplicas, para comparar decisiones en igualdad de condiciones. No adivina el futuro: ordena las opciones ante futuros posibles.

  • ¿Cuál es el escenario base contra el que se compara todo?
  • ¿Qué cambia en cada variante y qué queda fijo?
  • ¿La ventaja sobrevive al ruido de las réplicas?
  • ¿Qué escenario rompe el sistema y dónde está el límite?

02 · Vocabulario mínimo

Base, variante y supuesto

●

Base

El presente calibrado: condiciones actuales con las que todo se compara.

⑂

Variante

Un futuro posible: base más un cambio declarado (más demanda, más capacidad).

✎

Supuesto

Lo que se declara fijo para comparar: mismas réplicas, mismo horizonte, misma métrica.

Familia mínima de escenarios.
EscenarioQué cambiaQué pregunta responde
BaseNada: presente calibrado¿De dónde partimos?
PicoDemanda +30%¿Aguanta la hora pico?
RefuerzoPico + 1 cajero¿Alcanza con abrir otra caja?
RupturaDemanda que quiebra el sistema¿Dónde está el límite?

03 · Tres reglas

Cómo comparar sin autoengañarse

  1. 1
    Anclar a la base.

    Toda variante se mide contra la base con las mismas semillas: la diferencia es del escenario, no del azar.

  2. 2
    Cambiar poco a la vez.

    Una diferencia por variante al principio; las combinaciones después, como factorial del Tema 32.

  3. 3
    Declarar supuestos.

    Lo que queda fijo se escribe: horizonte, warm-up, réplicas. Sin eso, los escenarios no son comparables.

Pronóstico

Un futuro anunciado

«La espera será 6,8». Finge certeza donde hay azar y supuestos: se equivoca con confianza.

Escenarios

Varios futuros comparados

«En pico llega a 11; con refuerzo baja a 5». Muestra el abanico y qué decisión lo achica.

Escenario
Futuro posible con cambios y supuestos declarados.
Base
Escenario de referencia: el presente calibrado.
Variante
Base más un cambio explícito de condiciones.
Ruptura
Escenario donde el sistema deja de responder aceptablemente.

04 · Protocolo

El abanico en cinco pasos

Base→Variantes→Correr→Comparar→Contar

Se fija la base, se declaran pocas variantes, se corren todas con las mismas semillas y métricas, se comparan contra la base y se cuenta la historia para decidir. El Tema 40 preguntará qué parámetro mueve cada resultado.

05 · En Python

Escenarios como datos

Cada escenario es un diccionario con los mismos campos: solo cambian los valores declarados. El modelo no se toca, solo se alimenta distinto.

Python en tu navegador. Escenarios en lista, corridas con las mismas semillas.

escenarios = [
    {"nombre": "base", "demanda": 5, "cajeros": 1},
    {"nombre": "pico", "demanda": 8, "cajeros": 1},
    {"nombre": "refuerzo", "demanda": 8, "cajeros": 2},
]

for e in escenarios:
    print(e["nombre"], "demanda:", e["demanda"], "cajeros:", e["cajeros"])

Correr todos con la misma vara

La misma función, las mismas réplicas por escenario: la diferencia que aparezca es del escenario.

import random

def espera(demanda, cajeros, semilla):
    rng = random.Random(semilla)
    ruido = rng.choice([-1, 0, 1])
    return max(0, 2 + 1.2 * (demanda - 2.5 * cajeros) + ruido)

for e in escenarios:
    medias = [espera(e["demanda"], e["cajeros"], 7000 + r) for r in range(5)]
    print(e["nombre"], round(sum(medias) / len(medias), 2))

06 · Exploración

Laboratorio: pico y refuerzo

Partís de tu base (demanda y cajeros a elección). El laboratorio construye dos variantes: pico (+3 de demanda) y refuerzo (pico + 1 cajero). ¿El pico rompe el sistema? ¿El refuerzo lo salva?

EXPERIMENTO 39

Tres futuros

base · pico · refuerzo

Los resultados numéricos aparecen debajo.
Base0
Pico0
Refuerzo0
LecturaAguanta

Con base 5 y 1 cajero, el pico duele y el refuerzo lo compensa.

Tres barras: espera media de 20 réplicas por escenario, con las mismas semillas. Línea: umbral de ruptura en 8.

Preguntas para explorar

  1. Con base 5 y 1 cajero, ¿el pico supera el umbral de 8? ¿El refuerzo lo devuelve abajo?
  2. Subí la base a 7. ¿El refuerzo sigue alcanzando o el sistema pide más que un cajero?
  3. ¿Por qué los tres escenarios usan las mismas 20 semillas? ¿Qué pasaría con semillas distintas?
Ver respuestas sugeridas
  1. Sí: el pico trepa cerca de 9 y el refuerzo lo baja a ~5. El abanico justifica abrir la caja en pico.
  2. No siempre: con base alta, pico + refuerzo siguen arriba del umbral. Ahí aparece la ruptura y hay que rediseñar.
  3. Porque acopla el azar: la diferencia es del escenario, no de la suerte. Con semillas distintas harían falta más réplicas para la misma certeza.

07 · Comprensión

Confusiones frecuentes

«El escenario es un pronóstico»

No: es un futuro posible con supuestos. El análisis ordena opciones, no adivina cuál ocurrirá.

«Más escenarios siempre es mejor»

El abanico útil es chico y legible: base más 2–3 variantes. Veinte escenarios sin base clara son ruido.

«Cada escenario con sus semillas»

Al revés: mismas semillas para todos, para que el azar no disfrace el efecto del escenario.

«El que gana en media gana siempre»

Solo si la ventaja supera al error (Tema 34) y vale en el rango validado (Tema 36). Si no, es empate técnico.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: declarar la familia

Escribí base, pico y refuerzo como lista de diccionarios con los mismos campos.

escenarios = [
    {"nombre": "base", "demanda": 5, "cajeros": 1},
    {"nombre": "pico", "demanda": 8, "cajeros": 1},
    {"nombre": "refuerzo", "demanda": 8, "cajeros": 2},
]
print(len(escenarios), "escenarios")
Ver solución razonada

Hay 3 escenarios con idéntica estructura: lo único que cambia son los valores declarados.

Ejercicio 2: correr con la misma vara

Corré los 3 escenarios con las mismas 5 semillas y compará medias.

import random

def espera(demanda, cajeros, semilla):
    rng = random.Random(semilla)
    return max(0, 2 + 1.2 * (demanda - 2.5 * cajeros) + rng.choice([-1, 0, 1]))

for e in escenarios:
    ms = [espera(e["demanda"], e["cajeros"], 7000 + r) for r in range(5)]
    print(e["nombre"], round(sum(ms) / len(ms), 2))
Ver solución

La base ronda 5, el pico 8,6 y el refuerzo 5,6: el pico duele y el refuerzo casi lo anula.

Ejercicio 3: buscar la ruptura

Bar ré la demanda con 1 cajero y encontrá dónde la espera cruza el umbral 8.

Ver una posible respuesta
def espera_media(demanda, cajeros=1):
    ms = [espera(demanda, cajeros, 7000 + r) for r in range(5)]
    return sum(ms) / len(ms)

for d in [5, 6, 7, 8, 9]:
    print(d, round(espera_media(d), 2))

El cruce aparece entre demanda 7 y 8: ahí está la ruptura con 1 cajero y el argumento para el refuerzo.

09 · Síntesis

Ideas para recordar

  • Escenarios son futuros posibles con supuestos escritos, no pronósticos.
  • Todo se mide contra la misma base, con la misma vara.
  • Mismas semillas en todos: el azar acoplado compara con menos réplicas.
  • Familia chica y legible: base, pico, refuerzo y ruptura.
  • En Python: escenarios como dicts y una sola función de corrida para todos.

En el próximo tema preguntaremos qué mueve cada resultado: el análisis de sensibilidad.