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
Promedio temporal
L = área / T: personas medias en sistema. Se cobra en cada evento con N viejo.
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.
| Medida | Se cobra | Denominador | Responde |
|---|---|---|---|
| L (en sistema) | En cada evento: área += N_prev·Δt | T (horizonte) | ¿Cuán lleno vive? |
| Lq (en cola) | Igual con Nq_prev | T | ¿Cuánta fila hay? |
| Wq (espera) | Al desencolar: inicio − llegada | Iniciados (con ceros) | ¿Cuánto espera cada uno? |
| U (utilización) | En cada evento: ocupado·Δt | T (× c si múltiple) | ¿Cuánto trabaja? |
| Máx N / máx Wq | Al actualizar: max() | — (extremo) | ¿Cuál fue lo peor? |
03 · Cómo medir bien
Tiempo vs. cliente: no mezclar
- 1Temporales: 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.
- 2Por cliente: sumar.
Cada desencolado aporta su Wq (incluso 0). Dividir por iniciados da la espera media honesta; excluir ceros la infla.
- 3Extremos 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
| Pregunta | Medida | Lectura |
|---|---|---|
| ¿Está lleno? | L = 4.2 | En promedio hay 4.2 adentro |
| ¿Se espera mucho? | Wq = 3.1 | Cada uno espera 3.1 de media |
| ¿Da abasto? | U = 95% | Casi sin descanso: al borde |
| ¿Hubo pico? | máx N = 9 | En 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.
Medir para decidir
L = área/12 · Wq = ΣWq/iniciados · U = ocupado/12
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
- Con A=2, S=3, anotá L, Wq, U y máx. ¿Qué cuenta cada uno?
- Con A=1, S=3 (avalancha), ¿qué medida explota primero: L, Wq o U? ¿U puede pasar de 100%?
- Con A=4, S=2 (holgura), ¿Wq da cero? ¿Y U?
Ver respuestas sugeridas
- L≈2–3 (lleno medio), Wq de varios pasos, U alta (>80%), máx 4–5: sistema exigido pero vivo.
- L y Wq se disparan; U se clava en 100% (no puede más: el techo es 1). U saturada + L creciendo = cola inestable.
- 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.