Índice Futuros — cómo se calcula
El Índice Futuros es la cifra 0–100 que encabeza cada país en el atlas de futuros.xyz. No es una opinión ni una estimación editorial: es una función documentada de indicadores citados, recalculada desde los datos crudos en cada build de la plataforma. Esta página explica el método completo, paso a paso, con las fórmulas exactas y la cadena de auditoría que permite descomponer cualquier puntaje hasta su registro de fuente original.
Resumen en una línea
El índice es el promedio, con pesos iguales, de 10 puntajes de eje; cada eje es el promedio de sus indicadores citados, normalizados a 0–100 contra metas fijadas en los percentiles 5 y 95 de la distribución regional agrupada (método tipo IDH/ODS).
Alcance
| Dimensión | Valor |
|---|---|
| Geografías | 26 (25 países + agregado LATAM) |
| Ejes | 10 |
| Ventana temporal | 2010–2024, serie anual |
| Indicadores con señal (ids únicos) | 798 |
| Indicadores excluidos (neutral o constante) | 133 |
| Instancias indicador×eje×país que contribuyen | 16.970 |
| Celdas eje×país puntuadas | 260 de 260 (0 vacías, 0 en cuarentena) |
Cifras del último horneado (generated_at = 2026-08-25); se regeneran con cada actualización de datos — las cifras exactas viven en el bloque stats de scores.json, que es la autoridad sobre esta tabla.
Los 10 ejes, con peso idéntico (0,10 cada uno): salud · educación · trabajo y economía · seguridad · justicia y estado de derecho · medio ambiente y clima · infraestructura · innovación y soberanía tecnológica · cohesión social e inclusión · gobernanza democrática.
El pipeline, de la caché al atlas
- Entrada. Cada celda
pilar × paísde la caché de parámetros contiene instancias de indicadores con serie temporal, unidad, dirección deseable (good_direction) ycitation_id. Las celdas en cuarentena (marcadas por los controles de integridad) se excluyen por completo — ver la semántica exacta abajo. - Horneado. El script
scripts/bake-composite-scores.tsaplica el método descrito abajo y emitepublic/data/scores.json. - Verificación. Un gate de prebuild (
scripts/check-scores.ts) bloquea el despliegue con cuatro comprobaciones: el archivo existe y parsea; cubre toda geografía no-cuarentenada presente en la caché; cada geografía tiene ≥1 pilar puntuado; y el compuesto, ellatestde cada pilar y cada punto de cada serie son números finitos en [0, 100]. Es un gate de forma y cobertura, no de frescura. - Presentación. La interfaz lee
scores.json; los pesos de pilar viven en un solo lugar del cliente (PARAM_WEIGHTSensrc/lib/composite-score.ts) y se renormalizan a suma 1, de modo que reponderar el índice es un cambio de una línea, transparente y versionado.
Semántica de cuarentena
La cuarentena no es un descuento de puntaje: es exclusión total, con reglas precisas en cada eslabón.
| Regla | Efecto exacto |
|---|---|
| Origen | La bandera viene del pipeline de validación: el sobre de cada celda lleva validator_status, red_team_status, quarantine y quarantine_reason (tipos en src/shared/index.ts). |
| Horneado | La celda se descarta antes de la pasada 1: no recibe puntaje y sus observaciones tampoco participan en la fijación de goalposts de ningún indicador. |
| Gate | check-scores.ts construye el conjunto de geografías exigidas solo con celdas no-cuarentenadas; una celda en cuarentena no rompe el build por "faltante". |
| Interfaz | La página del parámetro muestra un banner de cuarentena tanto para sobres status: "quarantined" como para sobres ready con quarantine: true. |
| Contabilidad | scores.json publica stats.cells_quarantined; hoy es 0, pero el mecanismo está siempre activo. |
| Monitoreo | La cuarentena excluye del índice, no del monitoreo: la capa de salud del dato puntúa toda celda ready, en cuarentena o no, así la celda conserva su puntaje de confianza y sus anomalías visibles. |
El método, paso a paso
Paso 1 — Metas (goalposts) por indicador
Para cada indicador (por ejemplo, esperanza de vida al nacer) se agrupan todas sus observaciones a través de todos los países y todos los años de la ventana. Las metas se fijan en los percentiles 5 y 95 de esa distribución agrupada:
- P5 = piso (puntaje 0) · P95 = techo (puntaje 100)
- Con menos de 8 observaciones se usa mín–máx como respaldo.
- Si aún así la amplitud de las metas es degenerada (P95 − P5 < 10⁻⁹) se recae a mín–máx; si también esa amplitud es nula, el indicador se excluye — un indicador que no separa valores no discrimina.
- La
good_directionde un id es la primera declarada que se encuentra en la caché; se aplica de forma consistente a todas las instancias del mismo indicador en todos los países.
Usar percentiles en lugar del mínimo y máximo evita que el valor atípico de un solo país defina la escala para toda la región. Y agrupar todos los años en una sola distribución hace las metas estables en el tiempo: si un país mejora, su puntaje sube; la vara no se mueve con él.
Paso 2 — Normalización 0–100, consciente de la dirección
Cada observación se transforma a puntaje:
n(i, c, t) = clamp[0,100]( (x(i, c, t) − P5ᵢ) / (P95ᵢ − P5ᵢ) × 100 )
si good_direction(i) = "down": n ← 100 − ndonde x(i, c, t) es el valor del indicador i en el país c el año t. La inversión direccional garantiza que más puntaje siempre significa mejor: en homicidios por 100.000 o emisiones per cápita, un valor bajo produce un puntaje alto.
Exclusiones (por diseño, no por conveniencia):
- Indicadores con
good_direction: neutral(población total, superficie…) son descriptivos, no normativos → no puntúan. - Indicadores constantes o con un solo valor no discriminan entre países → no puntúan.
- En el último horneado: 133 ids excluidos por estas reglas, 798 con señal.
Paso 3 — Relleno de la serie 2010–2024
Muchas fuentes publican con rezago o en años alternos. Para cada instancia de indicador se completa la serie anual arrastrando la observación más cercana: para cada año sin dato se busca la observación más reciente anterior o igual a ese año (forward-fill); solo los años previos a la primera observación toman el valor de esa primera observación (back-fill). Cada celda anual queda marcada como observada o rellenada.
La cobertura publicada por pilar es exactamente:
cobertura(p, c) = celdas indicador×año observadas / (n_indicadores × 15 años), 3 decimalesPor ejemplo, salud en Costa Rica: 141 indicadores, cobertura 0,749 — el 74,9% de las 2.115 celdas anuales (141 × 15 años) son observaciones reales, el resto es arrastre. El relleno nunca inventa niveles nuevos — solo sostiene el último valor conocido.
Paso 4 — Puntaje de eje
S(p, c, t) = promedio de n(i, c, t) sobre los indicadores i que contribuyen al eje pPromedio simple, sin pesos internos: dentro de un eje, cada indicador con señal cuenta igual.
Paso 5 — El Índice Futuros
Índice(c, t) = Σₚ wₚ · S(p, c, t), con wₚ = 0,10 para los 10 ejesLos pesos son iguales de forma deliberada: el índice es un promedio transparente de diez lentes, no un modelo con ponderaciones opacas. Cualquier reponderación futura será un cambio explícito y auditable en PARAM_WEIGHTS (los pesos se renormalizan a suma 1 automáticamente).
La variación a 5 años (Δ5a) que acompaña al índice es simplemente Índice(c, 2024) − Índice(c, 2019) sobre la misma serie.
Cadena de auditoría: de la cifra a la fuente
Cada puntaje es descomponible de extremo a extremo:
Índice (71, Costa Rica)
└─ eje salud (75) — 141 indicadores, cobertura 0,749
└─ contributing[]: id del indicador + citation_id
└─ citations.json: fuente, serie, año, URL profunda
└─ registro original (Banco Mundial, CEPAL, OPS, fuente nacional…)La forma exacta de scores.json:
| Nivel | Campos |
|---|---|
| Raíz | generated_at · method (descripción del método en una línea) · year_min/year_max · pillar_weight (0,1) · stats · geographies{} |
stats | geos · params · cells_scored · cells_quarantined · indicator_ids_scored · indicator_ids_excluded_neutral_or_constant · empty_pillar_cells |
| Por geografía | composite (último año) · composite_series (2010–2024) · delta_5y · pillars{} |
| Por pilar | series · latest · n_indicators · coverage (3 decimales) · contributing[] con {id, label, citation_id, good_direction} de cada indicador |
No existe ningún número en el índice que no se pueda seguir hasta un registro de fuente citado.
Cómo leer el número
- Es relativo a la región, no absoluto. Un 100 significa "en el percentil 95 de la distribución agrupada de América Latina y el Caribe 2010–2024", no "problema resuelto". No es comparable con el IDH ni con otros índices en niveles.
- La ordenación importa más que el decimal. Los puntajes se redondean a enteros en el horneado (el puntaje de pilar es
round(promedio)y el compuesto esround(promedio de pilares redondeados)); diferencias de 1–2 puntos entre países están dentro del ruido de cobertura. - El comportamiento del índice es verificable en los extremos. En el último horneado: Uruguay 78, Chile 77, Costa Rica 71, Argentina 70 y Brasil 65 arriba; Nicaragua 43, Honduras 42 y Haití 24 abajo; el agregado LATAM en 58. Los Estados frágiles puntúan bajo, las democracias más sólidas lideran gobernanza y justicia — la dirección del método se sostiene sin ajustes manuales.
Limitaciones declaradas
Lea esto antes de citar el índice
Las cuatro limitaciones siguientes son parte de la metodología, no letra pequeña.
- Relleno temporal. Los años sin observación arrastran el último valor conocido; la cobertura publicada por pilar cuantifica cuánto de la serie es observado vs. sostenido.
- Promedio simple dentro del pilar. Un pilar con muchos indicadores de un mismo tema inclina el puntaje hacia ese tema; la lista
contributing[]hace visible esa composición. - Metas agrupadas por región. El índice mide posición dentro de América Latina y el Caribe; no captura la distancia frente a referentes extrarregionales.
- Ventana 2010–2024. Cambios estructurales anteriores a 2010 no afectan las metas.
Reproducibilidad
El índice completo se regenera desde los datos citados con un comando:
bun run scripts/bake-composite-scores.ts # regenera public/data/scores.json
bun run scripts/check-scores.ts # gate: cobertura + todo puntaje ∈ [0,100]El método está implementado en un único archivo legible (scripts/bake-composite-scores.ts, ~360 líneas) y este documento se corresponde línea a línea con ese código. Si el código y este documento divergen, el código manda y el documento se corrige — nunca al revés.
La promesa de que "reponderar es un cambio de una línea" tiene además una cara práctica en la plataforma: /indice es el constructor de índices propios (elige componentes, pesos y normalización min-max o z; los 25 países se re-clasifican en vivo), y /indices es el hub de transparencia que lista cada compuesto publicado (ICF, ISC, IAC, ICR) con su árbol de pesos leído de los archivos horneados reales.
Referencias metodológicas
- PNUD, Human Development Report — Technical Notes (normalización por metas del IDH).
- OCDE/JRC, Handbook on Constructing Composite Indicators: Methodology and User Guide, 2008.