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.
| Pregunta | Factor (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
- 1Qué variar.
Elegí pocos factores ligados a la pregunta. El resto queda fijo y anotado como supuesto.
- 2Cuántas réplicas.
Si hay azar, una corrida es un sorteo: se repite con semillas distintas hasta que la media se estabiliza.
- 3En 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
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.
Media contra ruido
espera = base + efecto + azar
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
- Con 1 réplica, cambiá la semilla del 1 al 9. ¿La «conclusión» cambia? ¿Por qué?
- Subí a 25 réplicas y repetí el cambio de semilla. ¿Qué le pasa a la media?
- Subí la demanda a 8. ¿La media sube, el desvío sube, o ambas? ¿Qué implica para el diseño?
Ver respuestas sugeridas
- Sí: una sola réplica es un sorteo y cada semilla cuenta otra historia. Comparar con n = 1 es comparar suertes.
- Se mueve poco: la media se estabiliza porque el error cae como 1/√n. Ahí sí se puede comparar.
- 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.productpara el plan yrandom.Random(semilla)para réplicas y orden.
En el próximo tema pondremos el plan en marcha: la ejecución de la simulación.