Skip to main content
Logo
Resumen

Matemáticas para Gerencia: Por qué el 'Promedio' destruye tu margen

3 de mayo de 2026
12 min de lectura

Existe un teorema en estadística llamado la Ley de los grandes números. Simplificado al extremo, dice que si repites un experimento muchas veces, el resultado promedio se acercará al valor esperado teórico.

Sin embargo, en la práctica gerencial, este principio suele aplicarse de forma simplificada, a veces olvidando los matices que lo hacen realmente útil.

Muchos gerentes confunden el promedio como descripción del pasado con el promedio como predictor del futuro. Y esa confusión, cuando la llevas a un presupuesto de obra o a una proyección de margen, tiene nombre: pérdida.

Este artículo no es cómodo de leer, pero los números tampoco son cómodos cuando te sorprenden a fin de mes.

El pecado original: planificar con el centro

Imaginemos que gestionas la instalación de 50 ventanas en un proyecto. Le preguntas a tu cuadrilla cuánto demoran en instalar una ventana. Ellos te dan 9 tiempos históricos:

[45, 48, 50, 52, 55, 55, 58, 60, 120] minutos

El promedio es 60,3 minutos. Redondeas a 60, lo usas para estimar el total del trabajo (50 ventanas × 60 minutos = 50 horas), y planificas la semana.

Esta decisión, aunque lógica a primera vista, esconde una trampa estadística muy común.

El número 120 del final, la ventana donde el perfil era complicado, la herramienta falló y el operario nuevo tuvo que pedir ayuda, arrastró el promedio hacia arriba. Pero no solo eso: el promedio no te dice qué probabilidad real tienes de terminar a tiempo. Te dice exactamente lo que ocurrirá si el mundo es perfectamente simétrico y sin sorpresas.

Sin embargo las cosas rara vez funcionan así.

Nota (El dilema del gerente: ¿Planificar o Empujar?)

Muchos gerentes de obra argumentan, con razón, que su trabajo no es observar la estadística, sino vencerla. Si planificas con holgura, la obra se relaja. Pero hay una diferencia crítica entre la meta que le pones a tu equipo y la realidad que le informas a tus accionistas. Este artículo no es para que dejes de “apretar” en el terreno, sino para que dejes de mentirte en el papel.

La distribución que el Excel no te muestra

Cuando tienes una serie de datos operativos reales, como tiempos de proceso, costos unitarios y rendimientos, estos raramente se distribuyen de forma simétrica alrededor del promedio. La realidad tiene una forma técnica: distribución sesgada a la derecha.

Los eventos rápidos tienen un piso físico (no puedes instalar una ventana en 0 minutos). Los eventos lentos no tienen techo: una falla inesperada puede triplicar el tiempo. Esto genera una cola derecha larga que el promedio incorpora sin explicarte su magnitud.

import numpy as np
import pandas as pd
# Datos históricos de instalación (minutos)
tiempos = np.array([45, 48, 50, 52, 55, 55, 58, 60, 120])
print(f"Media (Promedio): {np.mean(tiempos):.1f} min")
print(f"Mediana: {np.median(tiempos):.1f} min")
print(f"Desv. Estándar: {np.std(tiempos, ddof=1):.1f} min")
print(f"Percentil 90: {np.percentile(tiempos, 90):.1f} min")
Media (Promedio): 60.3 min
Mediana: 55.0 min
Desv. Estándar: 22.9 min
Percentil 90: 72.0 min

Distribución de tiempos de instalación (9 registros históricos)

La cola derecha larga hace que la media quede por encima del valor típico

Valores normalesOutlier (120 min)MedianaMedia (inflada por outlier)
Importante (Lee esos números con cuidado)

La mediana (55 min) te dice que la mitad de tus instalaciones terminan en 55 minutos o menos. El promedio (60 min) está inflado por el evento extremo. Planificaste con 60. La realidad estructural es 55. Pagaste 5 minutos de colchón invisible por cada ventana.

Pero el Percentil 90 (72 min) es el que debería quitarte el sueño: el 10% de tus instalaciones supera los 72 minutos. En 50 ventanas, eso son 5 instalaciones problemáticas que no tienes presupuestadas.

Desviación estándar: la métrica que los gerentes evitan

La desviación estándar (σ) es una medida de dispersión: qué tan lejos se alejan típicamente los datos individuales del promedio. Una sigma pequeña significa que los datos son predecibles y consistentes. Una sigma grande significa que el promedio es casi ficción.

En el ejemplo anterior, la desviación estándar es 22,9 minutos sobre un promedio de 60,3. Eso es un coeficiente de variación del 38%.

Para ponerlo en perspectiva de gestión, una tabla de reglas gruesas (no son un estándar de la industria, pero sirven para ordenar la conversación):

Coef. de VariaciónQué significa para la planificación
< 10%Proceso estable. El promedio es un estimador confiable.
10% – 25%Proceso con variabilidad moderada. Añadir colchón del 15-20%.
25% – 50%Proceso inestable. El promedio es engañoso. Usar percentiles.
> 50%El proceso no está bajo control. Planificar con percentiles altos o revisar el proceso antes de presupuestar.

Un 38% de coeficiente de variación te dice que el promedio es un mal punto de partida. Necesitas otra herramienta.

Percentiles: la gerencia honesta del riesgo

Un percentil responde a una pregunta diferente al promedio. En lugar de “¿cuál es el valor típico?”, responde “¿con qué valor me cubro el X% de los casos?”.

  • P50 (Mediana): Te cubre el 50% de los escenarios. Fallarás la mitad de las veces. Literalmente.
  • P80: Cubre el 80% de los escenarios. Aceptas un 20% de probabilidad de sobrepasar.
  • P90: Cubre el 90%. En proyectos de costo relevante, este es el mínimo razonable.
  • P95 / P99: Para proyectos críticos donde el sobrecosto tiene consecuencias contractuales o reputacionales.
percentiles = [50, 75, 80, 90, 95, 99]
print("Análisis de percentiles - Tiempo de instalación (min)")
print("-" * 50)
for p in percentiles:
valor = np.percentile(tiempos, p)
print(f" P{p:<3}: {valor:>6.1f} min")
Análisis de percentiles - Tiempo de instalación (min)
--------------------------------------------------
P50 : 55.0 min
P75 : 58.0 min
P80 : 58.8 min
P90 : 72.0 min
P95 : 96.0 min
P99 : 115.2 min

Si planificas con el promedio (60 min), estás planificando prácticamente en el P80. Estás aceptando un 20% de probabilidad de sobrecosto sin saberlo. No porque seas temerario, sino porque nadie te dijo que el promedio y el P80 eran casi lo mismo en este conjunto de datos.

Y cuando el proyecto tenga 200 hitos en lugar de 50, ese 20% compuesto se convierte en una certeza estadística de que algo va a salir de presupuesto.

Importante (Cuidado con la Ley de Parkinson)

Si decides ser “honesto” y le asignas a tu equipo el P90 (72 min) como meta oficial, ocurrirá un fenómeno psicológico: el trabajo se expandirá hasta llenar el tiempo disponible. La estrategia correcta: Gestiona tu obra con el P50 (o incluso menos) para mantener el ritmo, pero protege tu contrato y tus finanzas con el P90. La diferencia entre ambos no es “grasa”, es tu seguro.

El teorema que los gerentes deben tatuar

Hay una propiedad estadística que aplica directamente a la gestión de proyectos con múltiples tareas secuenciales. Si cada tarea tiene su propia distribución de duración, la duración esperada del proyecto sí es la suma de los promedios. Lo que no se suma es la incertidumbre: la desviación estándar del total es la raíz de la suma de los cuadrados de las desviaciones de cada tarea (si son independientes). Y un plazo con promedio correcto pero sin su desviación es un plazo que fallas la mitad de las veces.

# Tres tareas secuenciales en un proyecto
tareas = pd.DataFrame({
'tarea': ['Excavación', 'Estructura', 'Terminaciones'],
'duracion_media_dias': [10, 25, 15],
'desv_std_dias': [2, 8, 4]
})
# Duración total naïve (suma de promedios)
total_media_naive = tareas['duracion_media_dias'].sum()
# Desviación estándar del proyecto completo (propagación de errores)
sigma_proyecto = np.sqrt((tareas['desv_std_dias'] ** 2).sum())
# Estimaciones con distintos niveles de confianza
# Asumiendo distribución normal (simplificación razonable para mu > 3*sigma)
from scipy import stats
p50 = stats.norm.ppf(0.50, loc=total_media_naive, scale=sigma_proyecto)
p80 = stats.norm.ppf(0.80, loc=total_media_naive, scale=sigma_proyecto)
p90 = stats.norm.ppf(0.90, loc=total_media_naive, scale=sigma_proyecto)
print(f"Suma ingenua de promedios: {total_media_naive} días")
print(f"Sigma del proyecto: {sigma_proyecto:.1f} días")
print()
print("Estimaciones con nivel de confianza:")
print(f" P50 (planificación sin colchón): {p50:.1f} días ← Fallarás el 50% de las veces")
print(f" P80 (colchón razonable): {p80:.1f} días")
print(f" P90 (colchón profesional): {p90:.1f} días ← Recomendado")
Suma ingenua de promedios: 50 días
Sigma del proyecto: 9.2 días
Estimaciones con nivel de confianza:
P50 (planificación sin colchón): 50.0 días ← Fallarás el 50% de las veces
P80 (colchón razonable): 57.7 días
P90 (colchón profesional): 61.7 días ← Recomendado

El proyecto que tu equipo presentó como “50 días” tiene un 90% de probabilidad de completarse en 62 días. La diferencia no es pesimismo; es matemática. Y ese colchón de 12 días tiene un costo directo en salarios, maquinaria y capital de trabajo que no está en el presupuesto aprobado.

Intuición (Por qué la incertidumbre no se suma, sino que se propaga)

Las tres tareas tienen desviaciones de 2, 8 y 4 días. Sumadas dan 14, pero la del proyecto es 9,2. La razón: es muy poco probable que las tres se atrasen al máximo al mismo tiempo, y los desvíos de una se compensan en parte con los de otra. Por eso la incertidumbre total es mayor que la de cualquier tarea sola, pero menor que la suma directa. Ojo con el supuesto de independencia: si el mismo invierno atrasa las tres tareas, la compensación desaparece y te acercas a la suma directa.

Simulación de Montecarlo: la herramienta definitiva

Cuando las distribuciones no son simétricas (que es casi siempre en contextos operativos), la aproximación normal se queda corta. La solución profesional es ejecutar una Simulación de Montecarlo: repetir el proyecto virtualmente miles de veces, con valores aleatorios extraídos de las distribuciones reales de cada tarea, y observar qué distribución de resultados emerge.

import numpy as np
np.random.seed(42)
N_SIMULACIONES = 50_000
# Excavación: distribución log-normal (asimétrica positiva, típica en construcción)
# mu y sigma son parámetros de la distribución log-normal subyacente
excavacion = np.random.lognormal(mean=np.log(10), sigma=0.20, size=N_SIMULACIONES)
# Estructura: distribución triangular (conocemos el mín, el más probable y el máx)
estructura = np.random.triangular(left=18, mode=25, right=55, size=N_SIMULACIONES)
# Terminaciones: distribución normal (proceso más controlado)
terminaciones = np.random.normal(loc=15, scale=4, size=N_SIMULACIONES)
# Duración total del proyecto en cada simulación
duracion_total = excavacion + estructura + terminaciones
# Resultados
print("=== Simulación de Montecarlo (50.000 iteraciones) ===")
print()
print(f"Media simulada: {np.mean(duracion_total):.1f} días")
print(f"Mediana (P50): {np.percentile(duracion_total, 50):.1f} días")
print(f"P80: {np.percentile(duracion_total, 80):.1f} días")
print(f"P90: {np.percentile(duracion_total, 90):.1f} días")
print(f"P95: {np.percentile(duracion_total, 95):.1f} días")
print()
# Probabilidad de terminar en el plazo "prometido" de 50 días
prob_50_dias = np.mean(duracion_total <= 50) * 100
print(f"Probabilidad de terminar en ≤ 50 días: {prob_50_dias:.1f}%")
print(f"Probabilidad de exceder 50 días: {100 - prob_50_dias:.1f}%")
=== Simulación de Montecarlo (50.000 iteraciones) ===
Media simulada: 57.9 días
Mediana (P50): 57.0 días
P80: 66.0 días
P90: 70.5 días
P95: 74.0 días
Probabilidad de terminar en ≤ 50 días: 21.1%
Probabilidad de exceder 50 días: 78.9%

Simulación de Montecarlo (50.000 iteraciones)

Histograma de duración + probabilidad acumulada (curva azul)

P50
57 días
P80
66 días
P90
70,5 días
Exceder 50 días
78,9%

Presentaste un proyecto de 50 días. La simulación te dice que tiene un 79% de probabilidad de excederse. No porque algo salga “mal”. El plan de 50 días usó el valor más probable de la estructura (25 días), pero esa tarea puede atrasarse hasta 55 y adelantarse solo hasta 18: su promedio real es casi 33. Esa asimetría, correctamente modelada, produce esa distribución de resultados casi de forma obligatoria.

Y si el contrato tiene penalidades por incumplimiento de plazo, acabas de modelar también la probabilidad de activarlas: cuatro de cada cinco veces.

Aplicación directa: el margen que desaparece

La misma lógica aplica a costos. Cuando presupuestas una partida con un costo unitario promedio, estás haciendo exactamente lo mismo: comprando incertidumbre sin etiqueta de precio.

import pandas as pd
import numpy as np
# Presupuesto de partidas con incertidumbre
np.random.seed(7)
partidas = pd.DataFrame({
'partida': ['Hormigón H30', 'Acero A630', 'Moldaje', 'Mano de Obra', 'Subcontratos'],
'costo_esperado': [9_500_000, 120_000_000, 1_800_000, 35_000_000, 450_000_000], # costo total de cada partida
'variabilidad_pct': [0.08, 0.15, 0.12, 0.10, 0.25] # σ como % del valor esperado
})
N = 20_000
costo_total_sim = np.zeros(N)
for _, row in partidas.iterrows():
mu = row['costo_esperado']
sigma = mu * row['variabilidad_pct']
costo_total_sim += np.random.normal(loc=mu, scale=sigma, size=N)
print("=== Análisis de riesgo de costo ===\n")
print(f"Presupuesto 'central' (suma de esperados): ${partidas['costo_esperado'].sum():>14,.0f}")
print(f"Media simulada: ${np.mean(costo_total_sim):>14,.0f}")
print()
print("Distribución de resultados:")
for p in [50, 70, 80, 90, 95]:
val = np.percentile(costo_total_sim, p)
excess = val - partidas['costo_esperado'].sum()
print(f" P{p:<2}: ${val:>14,.0f} (exceso sobre presupuesto: ${excess:>12,.0f})")
=== Análisis de riesgo de costo ===
Presupuesto 'central' (suma de esperados): $ 616,300,000
Media simulada: $ 615,740,560
Distribución de resultados:
P50: $ 615,627,999 (exceso sobre presupuesto: $ -672,001)
P70: $ 675,616,692 (exceso sobre presupuesto: $ 59,316,692)
P80: $ 711,402,293 (exceso sobre presupuesto: $ 95,102,293)
P90: $ 760,906,790 (exceso sobre presupuesto: $ 144,606,790)
P95: $ 803,302,623 (exceso sobre presupuesto: $ 187,002,623)

Análisis de Contingencia y Riesgo de Costo

La probabilidad de terminar el proyecto al precio "Base" es apenas del 50%.

La línea punteada es el presupuesto base: todo lo que la supera es riesgo sin contingencia.

Presupuesto base (P50)
$616M
P80
$711M (+15%)
P95
$803M (+30%)

Si presentas este presupuesto de $616 millones como tu cifra “definitiva”, estás poniendo al cliente (o a la empresa) en una posición donde tiene un 50% de probabilidad de que el costo real sea mayor. Y eso con una simplificación generosa: la simulación usa distribuciones normales, simétricas. Con costos reales, que se desvían mucho más hacia arriba que hacia abajo, la probabilidad de superar el presupuesto base es mayor que 50%. El P90 está $145 millones por encima, y casi todo ese riesgo viene de una sola línea: los subcontratos, que pesan el 73% del presupuesto con la variabilidad más alta.

Esa es la contingencia estadística: no es margen de utilidad, es el precio de la incertidumbre que no se nombró.

Intuición (El presupuesto dual)

Nadie gana una licitación presupuestando al P90. Te quedarías sin trabajo. La madurez financiera consiste en separar:

  1. Presupuesto Objetivo (Target): El número agresivo con el que sales a pelear al mercado y exiges a tus subcontratos.
  2. Presupuesto de Riesgo (Risk-Adjusted): El número real que el Directorio debe conocer para entender cuánta caja debe tener de respaldo si la estadística decide cobrarse su deuda.
Importante (La pregunta que define la madurez financiera)

Cuando el directorio aprueba un presupuesto, debería preguntar obligatoriamente: “¿Este número es el P50, el P80 o el P90?” Si el equipo financiero no puede responder esa pregunta, no están gestionando riesgo. Están gestionando ilusiones.

Conclusión

El promedio no es una mentira. Es una descripción incompleta.

Es el primer resumen estadístico que aprendemos y el último que deberíamos usar para tomar decisiones de alta consecuencia. Cuando planificas con el promedio, estás eligiendo el escenario donde la mitad del tiempo el mundo te favorece y la otra mitad te penaliza. En el largo plazo, esas dos mitades no se compensan: las pérdidas de los meses malos suelen ser estructuralmente mayores que las ganancias de los buenos.

La desviación estándar te dice qué tan peligroso es ese promedio. Los percentiles te dicen cuánto colchón necesitas para operar con una probabilidad de éxito definida. La simulación de Montecarlo te permite ver la distribución completa de resultados posibles antes de comprometer un peso.

Esas no son herramientas de un matemático. Son herramientas de un gerente que respeta su propio presupuesto y entiende que, aunque en el terreno se pelea con el lodo, en la oficina se sobrevive con los números.

Nota (El próximo artículo)

En el siguiente artículo exploraremos la Curva S, analizando cómo este sesgo de optimismo se manifiesta en la herramienta de control de avance más usada en la industria de la construcción y por qué casi nadie la está leyendo correctamente.

Si no sabes la desviación estándar de tus costos principales, no tienes un presupuesto. Tienes un deseo expresado en pesos.