Analítica de Personas · Semestre otoño 2026 · Semana 15 · Prof. René Gempp
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.
Todo workforce planning se apoya en un balance entre tres cantidades, calculado idealmente por segmento (aquí: por nivel jerárquico):
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.
| Dimensión | Operacional | Estratégica |
|---|---|---|
| Horizonte | 0–12 meses | 2–5 años |
| Pregunta | ¿Qué vacantes cubrimos? | ¿Qué fuerza laboral exige la estrategia? |
| Incertidumbre | Baja | Alta → exige escenarios |
| Herramienta | Seguimiento de vacantes | Modelos de flujo y simulación |
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.
En la dotación de InnovaCo, los estados son los cuatro niveles jerárquicos más la Salida:
{ Operativo, Profesional, Jefatura, Gerencia, Salida }
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 \ Hacia | Operativo | Profesional | Jefatura | Gerencia | Salida |
|---|---|---|---|---|---|
| Operativo | 0,703 | 0,128 | 0,000 | 0,000 | 0,169 |
| Profesional | 0,000 | 0,835 | 0,017 | 0,000 | 0,148 |
| Jefatura | 0,000 | 0,000 | 0,873 | 0,005 | 0,122 |
| Gerencia | 0,000 | 0,000 | 0,000 | 0,864 | 0,136 |
| Salida | 0,000 | 0,000 | 0,000 | 0,000 | 1,000 |
Lectura en lenguaje de negocio:
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:
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.
La matriz P no se inventa: se estima de datos longitudinales. El procedimiento: contar y dividir.
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
# 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)
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
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".
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")
}
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:
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)
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.
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).
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:
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.
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
La elección es un supuesto sustantivo: en una organización estable, un modelo de empuje sobreestimaría las promociones.
| Ventajas | Lí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. |
markovchain (Spedicato, 2017): infraestructura de objetos R para cadenas de Markov. En clase usamos el álgebra base (%*%, solve()) por transparencia.| Término | Significado |
|---|---|
| Estado | Cada situación posible en el modelo (nivel jerárquico o Salida). |
| Propiedad markoviana | La 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 absorbente | Estado 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. |
| Brecha | Demanda − oferta interna proyectada, por nivel. |
| P_corr | Matriz corregida: la fila de Gerencia reemplazada por supuesto experto. |
| Push / pull | Transiciones dirigidas por probabilidades individuales vs. por vacantes. |
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.