Apunte 33 — Workforce planning y cadenas de Markov

Analítica de Personas · Semestre otoño 2026 · Semana 15 · Prof. René Gempp

1. Del diagnóstico a la proyección

Durante catorce semanas miramos al pasado y al presente: por qué se va la gente, quién está en riesgo, cuánto se les paga, cuán comprometidos están, cuánto tiempo se quedan. Todo ese trabajo es diagnóstico. Hoy hacemos algo distinto: usamos el pasado para proyectar el futuro. La pregunta de Carolina Tagle no es "¿qué pasó?" sino "¿cuánta gente vamos a necesitar?".

El gancho del problema está en el error que cometió el directorio. InnovaCo quiere crecer 40% en dotación en dos años, y la reacción fue: "40% más, obvio" — es decir, contratar 480 personas (el 40% de 1.200). Pero eso ignora dos flujos que erosionan la dotación todos los años:

La necesidad bruta de contratación (~813) es bastante mayor que el crecimiento neto (~480). Cuantificar esa diferencia es el corazón del workforce planning.

El cambio de postura epistemológica. Un diagnóstico se valida contra los datos: si dices que las mujeres ganan menos, se puede comprobar. Una proyección no se puede validar contra nada, porque el futuro todavía no existe. La única integridad disponible es la transparencia sobre los supuestos. Este apunte te enseña el modelo; el Apunte 34 te enseña a comunicar su incertidumbre con honestidad.

2. El modelo oferta–demanda–brecha

Todo workforce planning se apoya en un balance entre tres cantidades, calculado idealmente por segmento (aquí: por nivel jerárquico):

Brechanivel = Demandanivel − Oferta interna proyectadanivel

La acción que sigue suele organizarse con el marco build / buy / borrow: construir talento internamente (desarrollo, promoción), comprarlo en el mercado externo (contratación) o pedirlo prestado (contingentes). La decisión entre construir y comprar es el núcleo estratégico de la gestión de talento (Cappelli, 2008): comprar es rápido pero caro; construir es barato pero lento, y solo funciona si existe un pipeline interno — justo lo que el modelo de Markov nos permite ver.

Planificación operacional vs. estratégica

DimensiónOperacionalEstratégica
Horizonte0–12 meses2–5 años
Pregunta¿Qué vacantes cubrimos?¿Qué fuerza laboral exige la estrategia?
IncertidumbreBajaAlta → exige escenarios
HerramientaSeguimiento de vacantesModelos de flujo y simulación
Simplificación declarada. En InnovaCo la demanda es top-down: el directorio fijó +40% uniforme para todos los niveles. La tomamos como dada. En la práctica, la demanda debería diferenciarse por nivel: no es obvio que las jefaturas crezcan al mismo ritmo que los operativos.

3. Pronosticar la demanda

4. Cadenas de Markov: el modelo

Una cadena de Markov es un proceso que se mueve entre un conjunto finito de estados en pasos de tiempo discretos, bajo la propiedad markoviana: la probabilidad de pasar al estado siguiente depende solo del estado actual, no de cómo se llegó a él.

P(Xt+1 = j | Xt = i, historia) = P(Xt+1 = j | Xt = i) = pij

En la dotación de InnovaCo, los estados son los cuatro niveles jerárquicos más la Salida:

{ Operativo, Profesional, Jefatura, Gerencia, Salida }

La matriz de transición P

El corazón del modelo: la celda pij es la probabilidad de pasar del estado i al j en un año. Cada fila suma 1. A continuación, la matriz estimada del panel histórico de InnovaCo (cifras ilustrativas, semilla 2026):

Desde \ HaciaOperativoProfesionalJefaturaGerenciaSalida
Operativo0,7030,1280,0000,0000,169
Profesional0,0000,8350,0170,0000,148
Jefatura0,0000,0000,8730,0050,122
Gerencia0,0000,0000,0000,8640,136
Salida0,0000,0000,0000,0001,000

Lectura en lenguaje de negocio:

La proyección

Si nt es el vector de estado —la dotación distribuida por nivel en el año t— la proyección a un año es simplemente una multiplicación matricial:

nt+1 = nt · P

Una sola operación matricial captura simultáneamente las salidas y las promociones de toda la organización. Iterando dos veces sobre n0 = [265, 830, 98, 7]:

Sin contratar, la organización pierde ~333 personas netas en dos años. Ese es el costo invisible que el directorio ignoraba.

5. Construir la matriz desde datos en R

La matriz P no se inventa: se estima de datos longitudinales. El procedimiento: contar y dividir.

Paso 1: emparejar año t con año t+1 con lead()

# lead() mira "la fila siguiente" dentro de cada persona (group_by)
pares <- dotacion |>
  arrange(id_empleado, anio) |>
  group_by(id_empleado) |>
  mutate(nivel_sig = lead(nivel_jerarquico)) |>
  ungroup() |>
  filter(nivel_jerarquico %in% NIVELES, !is.na(nivel_sig))
# nivel_sig == "Salida" cuando la persona dejó la empresa al año siguiente

Paso 2: contar y controlar el n de cada fila

# CRUCIAL: ¿cuántas transiciones sustentan cada fila?
pares |> count(nivel_jerarquico)
#>   Operativo   ~987   (robusto)
#>   Profesional ~2903  (muy robusto)
#>   Jefatura    ~393   (aceptable)
#>   Gerencia      22   (<-- muy pocos; tenlo en mente)

Paso 3: construir la matriz y normalizar

P_wide <- pares |>
  count(nivel_jerarquico, nivel_sig) |>
  pivot_wider(names_from = nivel_sig, values_from = n, values_fill = 0) |>
  mutate(nivel_jerarquico = factor(nivel_jerarquico, levels = NIVELES)) |>
  arrange(nivel_jerarquico) |>
  column_to_rownames("nivel_jerarquico") |>
  select(all_of(c(NIVELES, "Salida"))) |>
  as.matrix()

# prop.table(margin = 1): normaliza por FILAS -> cada fila suma 1
P <- prop.table(P_wide, margin = 1)
rowSums(P)   # 1 1 1 1  ← verificación obligatoria

# Agregar fila absorbente y usar %*% para proyectar
P5 <- rbind(P, Salida = c(0,0,0,0,1))
n0 <- c(Operativo=265, Profesional=830, Jefatura=98, Gerencia=7, Salida=0)
n1 <- n0 %*% P5    # año 1
n2 <- n1 %*% P5    # año 2
Función nueva: prop.table(x, margin = 1). Convierte una tabla de conteos en proporciones. Con margin = 1, divide cada celda por el total de su fila (la fila suma 1 → es una distribución de probabilidad). Es el paso que transforma "cuántos pasaron" en "con qué probabilidad pasan".

6. Proyectar la dotación

Encapsulamos la proyección en una función reutilizable, necesaria para los escenarios del Apunte 34:

proyectar_dotacion <- function(P5, n0, horizonte) {
  estado <- n0
  filas  <- list(tibble(anio = 0L, nivel = names(n0), headcount = as.numeric(n0)))
  for (h in seq_len(horizonte)) {
    estado <- as.numeric(estado %*% P5)
    names(estado) <- colnames(P5)
    filas[[h + 1L]] <- tibble(anio = h, nivel = names(estado), headcount = estado)
  }
  bind_rows(filas) |> filter(nivel != "Salida")
}

7. La matriz fundamental: tiempo esperado de permanencia

Una cadena de Markov absorbente esconde un resultado precioso. Si Q es la submatriz de transiciones entre estados transitorios (los cuatro niveles), la matriz fundamental se define como:

N = (I − Q)−1

La celda Nij es el número esperado de años que una persona en el nivel i pasará en el nivel j antes de salir. La suma de cada fila es la permanencia total esperada según el nivel de ingreso.

Q <- P_corr[NIVELES, NIVELES]           # submatriz sin la columna Salida
N <- solve(diag(4) - Q)                # (I - Q)^{-1}
tibble(nivel = NIVELES, permanencia = round(rowSums(N), 1))
#> Operativo   6.4 años   (nivel de entrada; el que más rota)
#> Profesional 6.9 años
#> Jefatura    8.4 años
#> Gerencia   12.5 años   (el que más se queda)
Función nueva: solve(A). Calcula la inversa de la matriz A. Aquí A = diag(4) - Q: la matriz identidad menos la submatriz de transición entre niveles. Si la matriz es singular (no invertible), R lanza un error — es señal de que los estados no son independientes o hay celdas perfectamente vacías.
Conexión con la Clase 9. El tiempo esperado de permanencia es el análogo markoviano del tiempo medio de supervivencia. La antigüedad media observada en innovaco_empleados.csv (~3,5 años) es una medida censurada: muchos empleados siguen activos y su duración final es desconocida. Las cifras de la matriz fundamental (~6–12 años) son la permanencia completa esperada bajo las tasas del modelo — por eso son mayores. La diferencia no es una contradicción; es la diferencia entre medir el tiempo ya vivido (censurado) y el tiempo total que vivirán (esperado).

El problema de las celdas pequeñas: Gerencia y la corrección P_corr

Si calculamos la permanencia usando la matriz estimada directamente (sin corrección), obtenemos:

# Con P estimada SIN corrección:
round(rowSums(solve(diag(4) - P[NIVELES, NIVELES])), 1)
#> Operativo   6.3    Profesional  6.9    Jefatura  8.2    Gerencia  7.4

¿Notaste? La permanencia de Gerencia (7,4 años) es menor que la de Jefatura (8,2 años). Organizacionalmente es absurdo: los gerentes son los que más se quedan, no menos. Es el mismo fenómeno que rompió el cox.zph() en la Clase 9:

El problema de las celdas pequeñas. Con n pequeño, el error de muestreo domina sobre la señal. Una sola salida de gerencia cambia la probabilidad estimada en varios puntos porcentuales, y el efecto se amplifica en la matrix fundamental (porque la inversa es sensible a pequeños cambios en la diagonal). Nunca presentes las cifras de Gerencia al directorio sin advertir este límite.

La solución práctica: reemplazar la fila de Gerencia por un supuesto experto razonable (permanencia ~92%, salida ~8%), creando una matriz corregida P_corr:

P_corr <- P
P_corr["Gerencia", ] <- c(Operativo=0, Profesional=0, Jefatura=0,
                           Gerencia=0.92, Salida=0.08)
# Ahora la permanencia de Gerencia es 12.5 años: más alta que Jefatura. ✓

La lección de fondo es la misma de siempre: los modelos solo son tan buenos como los datos que los alimentan. Declarar la corrección y su justificación es parte de la honestidad profesional.

8. La brecha por nivel

Con la proyección a dos años y la demanda del 40%:

demanda     <- n0[NIVELES] * 1.40
oferta_int  <- n2[, NIVELES]        # año 2 sin contratar
brecha      <- demanda - oferta_int

tibble(nivel = NIVELES, demanda = round(demanda), oferta = round(oferta_int),
       brecha = round(brecha))
#> Operativo    371  131  +240
#> Profesional 1162  631  +531
#> Jefatura     137   99   +38
#> Gerencia      10    6    +4
#> TOTAL       1680  867  +813
El hallazgo central. La brecha total es ~813 contrataciones — casi el doble de los 480 "intuitivos" del directorio. Y no está pareja: el 95% se concentra en Operativo y Profesional, los niveles de entrada. Las jefaturas y gerencias también muestran un déficit modesto (~42), porque el pipeline de promoción interna no alcanza a cubrir la demanda de crecimiento de esos niveles. El plan de acción: reclutar masivamente en la base; el cuello de botella hacia arriba es que hay muy pocos candidatos internos —solo 1,7% de profesionales son promovidos a jefatura por año—, lo que convierte en crítico el programa de desarrollo.

9. Aplicaciones organizacionales del modelo

  1. Planificación de sucesión: cuantifica el pipeline que la Clase 12 identificó persona a persona.
  2. Pipeline de diversidad: matrices separadas por género revelan si las mujeres tienen menor probabilidad de promoción. En nuestros datos, la promoción Profesional→Jefatura es 2,3% en hombres y 1,1% en mujeres: una brecha real que conviene vigilar. Si el patrón persiste, la composición futura de los niveles altos se deteriora aunque la contratación de entrada sea paritaria. (Leaky pipeline.)
  3. Proyección de costos: multiplicar la dotación proyectada por nivel por el salario promedio da la proyección del gasto en remuneraciones (puente con la Clase 5).
  4. Análisis de trayectorias: la matriz fundamental muestra cuánto tarda en promedio un operativo en llegar a jefatura, y qué proporción llega a gerencia.

Empuje (push) vs. arrastre (pull)

La elección es un supuesto sustantivo: en una organización estable, un modelo de empuje sobreestimaría las promociones.

10. Ventajas y límites del modelo

VentajasLímites / supuestos
Transparente y auditable: cada celda tiene un significado de negocio directo.Ausencia de memoria: la transición depende solo del nivel actual, no del tiempo en el nivel ni del desempeño.
Captura la movilidad interna, no solo las salidas.Estacionariedad: se asume P constante en el tiempo.
Solo requiere conteos agregados de transiciones.Homogeneidad: todos en un nivel comparten las mismas probabilidades.
Entrega proyecciones por nivel, no un único número global.Celdas pequeñas: la fila de Gerencia (n = 22) es poco confiable; requiere corrección por supuesto experto.
Facilita escenarios: cambiar un supuesto = cambiar una celda.Ignora el mercado externo: dice cuántos contratar, no si están disponibles ni a qué costo.
El supuesto más débil: la ausencia de memoria. El modelo asume un hazard de salida constante dentro de cada nivel. Pero la Clase 9 mostró que el hazard varía con la antigüedad. Los modelos semi-markovianos relajan esto haciendo que las tasas dependan del tiempo en el estado — son el puente formal entre Markov y la supervivencia de la Clase 9.

11. La frontera (saber que existe)

12. Glosario

TérminoSignificado
EstadoCada situación posible en el modelo (nivel jerárquico o Salida).
Propiedad markovianaLa transición depende solo del estado actual, no de la historia.
Matriz de transición (P)Probabilidades de pasar de cada estado a cada otro; filas suman 1.
Estado absorbenteEstado del que no se sale (Salida en nuestro modelo).
Vector de estado (nt)Dotación distribuida por estado en el año t.
Matriz fundamental (N)(I−Q)−1: tiempo esperado en cada estado antes de salir.
BrechaDemanda − oferta interna proyectada, por nivel.
P_corrMatriz corregida: la fila de Gerencia reemplazada por supuesto experto.
Push / pullTransiciones dirigidas por probabilidades individuales vs. por vacantes.

Referencias

Bartholomew, D. J. (1982). Stochastic models for social processes (3.ª ed.). Wiley.

Bartholomew, D. J., Forbes, A. F., & McClean, S. I. (1991). Statistical techniques for manpower planning (2.ª ed.). Wiley.

Cappelli, P. (2008). Talent management for the twenty-first century. Harvard Business Review, 86(3), 74–81.

Doeringer, P. B., & Piore, M. J. (1971). Internal labor markets and manpower analysis. Heath.

Edwards, M. R., & Edwards, K. (2019). Predictive HR analytics: Mastering the HR metric (2.ª ed.). Kogan Page.

Guenole, N., Ferrar, J., & Feinzig, S. (2017). The power of people. Pearson FT Press.

Schoemaker, P. J. H. (1995). Scenario planning: A tool for strategic thinking. Sloan Management Review, 36(2), 25–40.

Spedicato, G. A. (2017). Discrete time Markov chains with R. The R Journal, 9(2), 84–104.

Sterman, J. D. (2000). Business dynamics: Systems thinking and modeling for a complex world. McGraw-Hill.

Vroom, V. H., & MacCrimmon, K. R. (1968). Toward a stochastic model of managerial careers. Administrative Science Quarterly, 13(1), 26–46.