Skip to main content
Logo
Resumen

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

3 de mayo de 2026
11 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.

Confundieron 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: 91.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 (91 min) es el que debería quitarte el sueño: el 10% de tus instalaciones supera los 91 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:

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.5 min
P80 : 60.0 min
P90 : 91.0 min
P95 : 107.5 min
P99 : 117.7 min

Si planificas con el promedio (60 min), estás planificando 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 (91 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 total del proyecto no es la suma de los promedios. Es la suma de los promedios más la suma cuadrática de las desviaciones estándar.

# 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.8 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)

Si tiras una moneda dos veces, la probabilidad de que ambas salgan cara no es 50% + 50% = 100%. Es 25%. Las incertidumbres de eventos independientes se combinan por raíz cuadrada de la suma de cuadrados. Cuando tienes 10 tareas de proyecto con incertidumbre moderada, la incertidumbre total del proyecto es significativamente mayor que la suma de las partes —pero menor que la suma directa. La raíz cuadrática es la matemática que escala el riesgo correctamente.

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)
estructrura = 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 + estructrura + 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: 50.4 días
Mediana (P50): 49.2 días
P80: 59.7 días
P90: 65.8 días
P95: 71.0 días
Probabilidad de terminar en ≤ 50 días: 52.1%
Probabilidad de exceder 50 días: 47.9%

Simulación de Montecarlo (50.000 iteraciones)

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

Probabilidad de exceder 50 días: 47.9% (casi una de cada dos veces)

Presentaste un proyecto de 50 días. La simulación te dice que tiene un 48% de probabilidad de excederse. No porque algo salga “mal”. Sino porque la estructura de incertidumbre de las tareas individuales, 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: casi una de cada dos 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_unitario_esperado': [95_000, 1_200_000, 18_000, 350_000, 4_500_000],
'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_unitario_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_unitario_esperado'].sum():>12,.0f}")
print(f"Media simulada: ${np.mean(costo_total_sim):>12,.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_unitario_esperado'].sum()
print(f" P{p:<2}: ${val:>12,.0f} (exceso sobre presupuesto: ${excess:>9,.0f})")
=== Análisis de riesgo de costo ===
Presupuesto 'central' (suma de esperados): $ 6,163,000
Media simulada: $ 6,162,841
Distribución de resultados:
P50: $ 6,162,513 (exceso sobre presupuesto: $ -487)
P70: $ 6,568,291 (exceso sobre presupuesto: $ 405,291)
P80: $ 6,792,043 (exceso sobre presupuesto: $ 629,043)
P90: $ 7,091,844 (exceso sobre presupuesto: $ 928,844)
P95: $ 7,316,009 (exceso sobre presupuesto: $ 1,153,009)

Análisis de Contingencia y Riesgo de Costo

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

Nota: el eje Y comienza en $6.0M para mostrar las diferencias entre percentiles con mayor claridad. La variación real entre P50 y P95 es del 19%.

Si presentas este presupuesto de $6.163.000 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. El P90 está casi un millón de pesos por encima.

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.