Simulación de Eventos Discretos · Tema 20

Recolección de estadísticas

Contadores, áreas y promedios honestos — L, Wq, utilización y máximos — medidos en el orden correcto con el denominador correcto.

01 · Punto de partida

Simular sin medir es solo animar

El simulador del banco procesó 6 llegadas y terminó en N=0. ¿Fue bueno o malo? Sin números no hay respuesta: ¿cuántos había en promedio (L)?, ¿cuánto esperó cada uno (Wq)?, ¿qué tan ocupada estuvo la caja (utilización)?, ¿cuál fue el pico (máximo)?

La recolección es el sistema de medición que corre junto a la simulación: cobra áreas, suma esperas y cuenta eventos para responder esas cuatro preguntas sin sesgar.

  • ¿Promedio en el tiempo o promedio por cliente?
  • ¿Con qué denominador: T, atendidos o iniciados?
  • ¿Los ceros (Wq=0) cuentan o se esconden?
  • ¿Máximo y distribución acompañan a la media?

02 · Definición

Cuatro medidas que lo dicen todo

L

Promedio temporal

L = área / T: personas medias en sistema. Se cobra en cada evento con N viejo.

Wq

Promedio por cliente

Wq = espera_total / n: espera media de quien inició servicio. Incluye ceros.

%

Utilización y pico

U = ocupado_T / T y máx N: cuánto trabajó el recurso y el peor momento.

Qué se cobra, cuándo y con qué denominador.
MedidaSe cobraDenominadorResponde
L (en sistema)En cada evento: área += N_prev·ΔtT (horizonte)¿Cuán lleno vive?
Lq (en cola)Igual con Nq_prevT¿Cuánta fila hay?
Wq (espera)Al desencolar: inicio − llegadaIniciados (con ceros)¿Cuánto espera cada uno?
U (utilización)En cada evento: ocupado·ΔtT (× c si múltiple)¿Cuánto trabaja?
Máx N / máx WqAl actualizar: max()— (extremo)¿Cuál fue lo peor?

03 · Cómo medir bien

Tiempo vs. cliente: no mezclar

eventos → área → /T→salidas de cola → suma → /n
  1. 1
    Temporales: integrar.

    El área se cobra antes de actualizar (Tema 18) con N viejo. Dividir por T da el promedio ponderado por tiempo: un N=5 durante 1 minuto pesa 5× más que N=1.

  2. 2
    Por cliente: sumar.

    Cada desencolado aporta su Wq (incluso 0). Dividir por iniciados da la espera media honesta; excluir ceros la infla.

  3. 3
    Extremos siempre.

    La media sin máximo esconde el pico que enoja clientes. Reportar L con máx N y Wq con máx Wq es el informe mínimo serio.

Denominador coherente
Truncado divide por T; vaciado por T+extra; Wq por iniciados. (Tema 19). Denominador ajeno = número inventado.
Ceros que cuentan
Wq=0 (entró directo) es éxito y promedia. Quitarlos responde “¿cuánto esperan los que esperan?”, no “¿cuánto se espera?”.
Historia para histogramas
Guardar la lista de Wq individuales permite media, máximo, percentil 90 y “% que esperó >5”. Sin lista solo hay media.
Por clase
Áreas y esperas separadas por prioridad/tipo revelan injusticias que el global esconde. (Temas 6 y 39)

Promedio temporal (L)

Pesa por duración

5 personas 1 minuto = 1 persona 5 minutos. Lo cobra el área evento a evento.

Promedio por cliente (Wq)

Pesa por persona

Cada cliente vale 1, espere o no. Lo cobra la suma al desencolar.

04 · Ejemplos

Cada pregunta, su medida

Del reclamo al número.
PreguntaMedidaLectura
¿Está lleno?L = 4.2En promedio hay 4.2 adentro
¿Se espera mucho?Wq = 3.1Cada uno espera 3.1 de media
¿Da abasto?U = 95%Casi sin descanso: al borde
¿Hubo pico?máx N = 9En el peor momento hubo 9

05 · Representación en Python

Stats como dict que se cobra solo

Un stats con área, esperas, conteos y máximos; dos funciones (cobrar en cada evento, registrar_espera al desencolar) y un reporte() con denominadores honestos.

Python en tu navegador. El primero cobra un tramo; el segundo reporta con ceros incluidos. Cambiá valores y verificá L y Wq.

stats = {"area": 0.0, "t_prev": 0.0, "espera_total": 0.0,
         "iniciados": 0, "max_N": 0, "ocupado_T": 0.0}

def cobrar(t, N, ocupado):
    stats["area"] += N * (t - stats["t_prev"])
    stats["ocupado_T"] += ocupado * (t - stats["t_prev"])
    stats["t_prev"] = t
    stats["max_N"] = max(stats["max_N"], N)

cobrar(2.0, 1, 1)  # [0,2) con N=1, ocupado
cobrar(4.0, 2, 1)  # [2,4) con N=2
print("área:", stats["area"], "| máx:", stats["max_N"])  # 6.0
def reporte(stats, T):
    L = stats["area"] / T
    Wq = stats["espera_total"] / max(1, stats["iniciados"])  # ceros dentro
    U = stats["ocupado_T"] / T
    return {"L": round(L, 2), "Wq": round(Wq, 2), "U": round(U, 2),
            "max_N": stats["max_N"]}

stats.update({"espera_total": 9.0, "iniciados": 3})
print(reporte(stats, 12.0))  # Wq=3.0 honesta con sus ceros

06 · Exploración

Laboratorio: el tablero del banco

Llega uno cada A, S, 1 caja, T=12 exactos. La curva es N(t) y el sombreado su área (la materia de L). La ficha trae el tablero completo: L, Wq (con ceros), U y máx N. Congestioná (A chico, S grande) y mirá los cuatro moverse juntos.

EXPERIMENTO 20

Medir para decidir

L = área/12 · Wq = ΣWq/iniciados · U = ocupado/12

Los resultados numéricos aparecen debajo.
L (área/12)0
Wq media0
Utilización U0%
Máx N0

Congestioná para mover el tablero.

Sombreado lima: área N·Δt acumulada hasta 12. Punteada blanca: L media. El tablero resume tiempo (L, U) y cliente (Wq) más el pico.

Preguntas para explorar

  1. Con A=2, S=3, anotá L, Wq, U y máx. ¿Qué cuenta cada uno?
  2. Con A=1, S=3 (avalancha), ¿qué medida explota primero: L, Wq o U? ¿U puede pasar de 100%?
  3. Con A=4, S=2 (holgura), ¿Wq da cero? ¿Y U?
Ver respuestas sugeridas
  1. L≈2–3 (lleno medio), Wq de varios pasos, U alta (>80%), máx 4–5: sistema exigido pero vivo.
  2. L y Wq se disparan; U se clava en 100% (no puede más: el techo es 1). U saturada + L creciendo = cola inestable.
  3. Wq≈0 (entran directo) y U baja (~50% o menos): sobra capacidad. El tablero pide cerrar una caja, no abrir otra.

07 · Comprensión

Confusiones frecuentes

«L es el promedio de los N visitados»

L pondera por tiempo (área/T), no por visitas. Promediar N de eventos sin pesar por Δt ignora cuánto duró cada uno.

«Wq sin ceros es más representativa»

Sin ceros responde otra pregunta (“los que esperan”). La Wq del sistema los incluye: entrar directo es dato, no ausencia.

«U puede dar 140%»

U ≤ 100% por recurso (ocupado/T). Más de 100% delata doble conteo o denominador menor que el usado.

«Con la media alcanza»

Media sin máximo ni distribución esconde picos y colas injustas. El informe mínimo es L + Wq + U + máx.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: L pondera por tiempo

N=5 durante 1 y N=1 durante 5: ¿promedio simple vs. L?

print("simple:", (5 + 1) / 2)  # 3.0: ignora duración
print("L:", (5 * 1 + 1 * 5) / 6)  # 1.67: pesa por tiempo
Ver solución razonada

3.0 vs. 1.67: el 5 duró poco y pesa poco. L es el área (10) sobre 6, no el promedio de visitas.

Ejercicio 2: Wq honesta

Esperas [0, 0, 6]: ¿con y sin ceros?

wqs = [0, 0, 6]
print("honesta:", sum(wqs) / len(wqs))  # 2.0
print("sin ceros:", sum(w for w in wqs if w) / sum(1 for w in wqs if w))  # 6.0
Ver solución

2.0 vs. 6.0: la segunda triplica el problema escondiendo los dos directos. Se reporta 2.0 (y se anota que 2/3 no esperó).

Ejercicio 3: tablero completo

Con área 30, espera 9 en 3 iniciados, ocupado 10 y máx 5 en T=12, reportá.

Ver una posible respuesta
L, Wq, U, mx, T = 30 / 12, 9 / 3, 10 / 12, 5, 12
print(f"L={L:.2f} Wq={Wq:.2f} U={U:.0%} máx={mx} (T={T})")

L=2.50, Wq=3.00, U=83%, máx=5: el tablero mínimo con denominadores a la vista.

09 · Síntesis

Ideas para recordar

  • Tiempo: L = área/T (N viejo, antes de actualizar); cliente: Wq = suma/n (con ceros, al desencolar).
  • U = ocupado/T (≤100%); máx N y máx Wq acompañan siempre a la media.
  • Denominador coherente con el cierre; historia de Wq para percentiles.
  • En Python: dict stats + cobrar() + registrar + reporte() con T a la vista.
  • L pesa duración; Wq pesa personas: no mezclar.

Cerramos la primera mitad del curso. En el próximo tema cruzamos el puente hacia la teoría de colas: el marco matemático que valida estos números.