Modelos y Simulación · Tema 32

Diseño de experimentos

Qué variar, cuántas réplicas y en qué orden: el plan que convierte corridas sueltas en evidencia.

01 · Punto de partida

Del simulador al plan

En el Tema 31 dejamos el motor corriendo: reloj, agenda, azar con semilla y traza. Ahora aparece la tentación típica del programador: correr el simulador muchas veces, mover parámetros a ojo y quedarse con el resultado que «cierra». Eso no es experimentar: es anecdotario con gráficos.

Diseñar el experimento es decidir por escrito, antes de correr, qué escenarios se comparan, cuántas veces se repite cada uno y en qué orden, para que la diferencia observada sea atribuible al factor y no al azar ni al orden de ejecución.

  • ¿Qué pregunta responde cada corrida?
  • ¿Qué factores varían y cuáles quedan fijos?
  • ¿Cuántas réplicas necesita cada escenario?
  • ¿En qué orden se ejecutan y con qué semillas?

02 · Vocabulario mínimo

Factores, niveles y respuestas

◈

Factor

Lo que decidís variar: número de cajeros, tasa de llegadas, capacidad del tanque.

▤

Nivel

Cada valor que toma el factor: 1 o 2 cajeros; llegada baja o alta.

◎

Respuesta

Lo que medís para comparar: espera promedio, clientes atendidos, nivel final.

El mismo simulador, tres diseños distintos.
PreguntaFactor (niveles)Respuesta
¿Conviene abrir otra caja?Cajeros (1, 2)Espera promedio
¿Aguanta la hora pico?Llegadas (baja, alta)Atendidos y espera
¿Hay interacción?Cajeros × llegadas (2 × 2)Espera por combinación
¿Es estable el resultado?Semilla (10 réplicas)Media y dispersión

03 · Tres decisiones

Qué variar, cuánto repetir, en qué orden

  1. 1
    Qué variar.

    Elegí pocos factores ligados a la pregunta. El resto queda fijo y anotado como supuesto.

  2. 2
    Cuántas réplicas.

    Si hay azar, una corrida es un sorteo: se repite con semillas distintas hasta que la media se estabiliza.

  3. 3
    En qué orden.

    Se aleatoriza el orden y se registran semillas: el orden no debe favorecer a ningún escenario.

Uno a la vez

Simple pero ciego

Mueve un factor dejando el resto fijo. Fácil de leer, pero no ve interacciones: «2 cajeros» puede rendir distinto con poca o mucha llegada.

Factorial

Todas las combinaciones

Cruza todos los niveles entre sí (2 × 2 = 4 escenarios). Cuesta más corridas, pero revela interacciones.

Factor
Variable controlada que se varía deliberadamente.
Nivel
Valor concreto que toma un factor en un escenario.
Réplica
Repetición del mismo escenario con semilla distinta.
Aleatorización
Orden sorteado de ejecución para no sesgar comparaciones.

04 · Protocolo

El plan en una línea

Pregunta→Factores→Réplicas→Orden→Registro

Cada experimento se anuncia con esa frase: «para responder P, cruzo F en estos niveles, con R réplicas por celda, en orden aleatorio con semilla S, y guardo historia + traza». El Tema 33 ejecutará ese plan; el Tema 41 exigirá que otro pueda repetirlo idéntico.

05 · En Python

El plan es una lista de escenarios

Un diseño factorial es un producto cartesiano: cada combinación de niveles es un escenario. Python lo genera sin olvidos con itertools.product.

Python en tu navegador. El plan, las semillas y el orden aleatorio son stdlib puro.

import itertools

cajeros = [1, 2]
llegadas = ["baja", "alta"]
plan = list(itertools.product(cajeros, llegadas))

for i, (c, l) in enumerate(plan):
    print(i, "cajeros:", c, "llegadas:", l)
print("escenarios:", len(plan))

Réplicas con semillas y orden sorteado

Cada escenario se repite con semillas distintas y el orden total se baraja con un generador propio, para que el sorteo también sea reproducible:

import random

def escenarios_con_replicas(plan, replicas, semilla=7):
    corridas = []
    for escenario in plan:
        for r in range(replicas):
            corridas.append({"escenario": escenario, "semilla": semilla * 1000 + r})
    rng = random.Random(semilla)
    rng.shuffle(corridas)
    return corridas


corridas = escenarios_con_replicas([(1, "alta"), (2, "alta")], 2)
for c in corridas:
    print(c)

06 · Exploración

Laboratorio: réplicas que estabilizan

Un banco con una espera que depende de la demanda más ruido aleatorio. Con pocas réplicas la media «baila»; con muchas se estabiliza. Movete los controles y observá cuándo podés confiar en la comparación.

EXPERIMENTO 32

Media contra ruido

espera = base + efecto + azar

Los resultados numéricos aparecen debajo.
Media (espera)0
Desvío0
Réplicas12
LecturaInestable

Con 12 réplicas la media todavía baila con cada semilla.

Puntos: espera de cada réplica. Línea: media acumulada. Banda: dispersión que se achica al repetir.

Preguntas para explorar

  1. Con 1 réplica, cambiá la semilla del 1 al 9. ¿La «conclusión» cambia? ¿Por qué?
  2. Subí a 25 réplicas y repetí el cambio de semilla. ¿Qué le pasa a la media?
  3. Subí la demanda a 8. ¿La media sube, el desvío sube, o ambas? ¿Qué implica para el diseño?
Ver respuestas sugeridas
  1. Sí: una sola réplica es un sorteo y cada semilla cuenta otra historia. Comparar con n = 1 es comparar suertes.
  2. Se mueve poco: la media se estabiliza porque el error cae como 1/√n. Ahí sí se puede comparar.
  3. Ambas: más demanda sube la espera y su variabilidad. Con más ruido hacen falta más réplicas por escenario.

07 · Comprensión

Confusiones frecuentes

«Con una corrida por escenario alcanza»

Solo si el modelo es determinístico. Con azar, una corrida es una muestra de tamaño uno: no estima nada.

«Más niveles siempre es mejor»

Cada nivel multiplica el plan (3 × 3 × 5 réplicas = 45 corridas). Pocos niveles bien elegidos responden; muchos niveles sin réplicas confunden.

«El orden no importa en computadora»

Importa: warm-up, caches, estados que no se reinician o archivos que se pisan. El orden sorteado reparte esos efectos.

«Cambiar la semilla es hacer trampa»

Al revés: repetir con semillas distintas y reportarlas es honestidad. Trampa es elegir la semilla que confirma lo que querías.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: contar el plan factorial

Generá el cruce de cajeros [1, 2] con llegadas ["baja", "alta"]. ¿Cuántos escenarios hay?

import itertools

plan = list(itertools.product([1, 2], ["baja", "alta"]))
print(plan)
print("escenarios:", len(plan))
Ver solución razonada

Hay 4 escenarios: 2 × 2. Cada tupla es un escenario que luego se replica.

Ejercicio 2: expandir con réplicas

Expandí 2 escenarios con 3 réplicas cada uno. ¿Cuántas corridas genera el diseño?

plan = [(1, "alta"), (2, "alta")]
corridas = [(e, r) for e in plan for r in range(3)]
print("corridas:", len(corridas))
print(corridas[:3])
Ver solución

Da 6 corridas: escenarios × réplicas = 2 × 3. Cada una llevará después su propia semilla.

Ejercicio 3: sortear el orden

Barajá 6 corridas con semilla fija y verificá que el orden sea reproducible.

Ver una posible respuesta
import random

corridas = list(range(6))
rng = random.Random(7)
rng.shuffle(corridas)
print(corridas)

Con semilla 7 el orden sorteado se repite idéntico en cada ejecución: aleatorio pero reproducible. Cambiá la semilla y el orden cambia, también de forma registrable.

09 · Síntesis

Ideas para recordar

  • Diseñar es planificar: pregunta, factores, niveles, réplicas, orden y registro.
  • Factorial revela interacciones; uno a la vez es más barato pero ciego a ellas.
  • Con azar, cada escenario se replica con semillas distintas hasta estabilizar la media.
  • El orden se sortea con semilla registrada: aleatorio y reproducible.
  • En Python: itertools.product para el plan y random.Random(semilla) para réplicas y orden.

En el próximo tema pondremos el plan en marcha: la ejecución de la simulación.