Arquitectura de Scoring y Datos
Desglose visual de la metodología de scoring y la infraestructura de datos que alimenta Relocate Index — desde datos institucionales crudos hasta rankings de países personalizados en tiempo real.
Vista General del Sistema: Arquitectura de Scoring de 3 Capas
Capa 1 — Datos Crudos (Ingesta)
Datos institucionales almacenados por país y por fuente en una tabla de datos crudos. Cada registro lleva el nombre de la fuente, código de indicador, año y valor crudo. Las fuentes van desde accesibles por API (World Bank, Open-Meteo) hasta seeded manualmente desde reportes publicados (IMD, InterNations, Pew, PISA).
Capa 2 — Scores Normalizados (Transformación)
Todos los valores crudos convertidos a escala 0-100 vía normalización min-max contra el dataset de 60 países, donde mayor siempre significa mejor. Las inversiones ocurren en el momento de normalización — los scores crudos del GPI van de 1.0-3.5 (menor = más pacífico), invertidos a 0-100 (mayor = más pacífico). Los límites min-max se almacenan en una tabla de parámetros y se recalculan cuando se agregan países. Output almacenado en una tabla de scores normalizados.
Capa 3 — Compuesto (Client-Side)
Suma ponderada computada enteramente en el navegador. Los usuarios definen sliders 0-100 por dimensión. Los pesos se normalizan internamente para sumar 1.0. Slider en 0 excluye la dimensión; los pesos restantes se re-normalizan. Todos los sliders en 0 dispara un estado de error. Dimensiones NULL excluidas del compuesto con re-normalización automática.
Decisión: Todo el scoring es client-side. El volumen de datos es 60 × 10 = 600 scores — cabe en un solo payload JSON pequeño. Se carga una vez al abrir la página desde una materialised view. Se recomputa en cada cambio de slider con cero round-trips al API. Esta decisión arquitectónica hace que el re-ranking en tiempo real sea gratis.
Deep-Dives por Dimensión
Healthcare (V2) — Fórmula de Tres Pilares
healthcare = weighted_blend(UHC, HAQ, capacity)
capacity = weighted_blend(physicians_norm, beds_norm, nurses_norm)
- ◆ ¿Existe el sistema? → WHO Universal Health Coverage Service Coverage Index
- ◆ ¿Produce buenos resultados? → IHME GBD Healthcare Access & Quality Index (mortalidad evitable en 32 causas)
- ◆ ¿Tiene recursos estructurales? → OECD/WHO médicos, camas hospitalarias, enfermeros por cada 1,000 habitantes
Decisión de producto: Esta fórmula pasó por 3 iteraciones. La versión solo-UHC ubicó a EE.UU. en el #1 (score UHC 90 — los servicios existen, pero el acceso requiere seguro). Agregar OOP% no lo arregló (11% de $4.5T = $1,472/persona, pero 11% se ve engañosamente barato como porcentaje). La fórmula de tres pilares diferencia correctamente: que los servicios existan (UHC) ≠ que los resultados sean buenos (HAQ) ≠ que los recursos sean suficientes (capacity). Si los datos de HAQ o capacity son NULL, la fórmula cae gracefully — los pilares restantes absorben el peso.
Civic Culture — Dos Capas: Gobernanza + Seguridad Callejera
civic_culture = weighted_blend(governance, street_safety) — con peso mayor en gobernanza
governance = weighted_blend(WGI_rule_of_law, WGI_corruption_control)
street_safety = 100 − numbeo_crime_index
- ◆ Calidad institucional → World Bank Worldwide Governance Indicators (construidos a partir de 35 fuentes de datos cross-country — encuestas, evaluaciones de expertos, reportes de ONGs). Rule of Law mide cumplimiento de contratos, derechos de propiedad, calidad de policía/tribunales. Corruption Control mide el ejercicio del poder público para beneficio privado.
- ◆ Seguridad vivida → Numbeo Crime Index (gratuito, scrapeado). Captura la experiencia cotidiana de seguridad personal en espacios públicos que el lente institucional de WGI no alcanza.
Decisión: La ponderación con mayor peso en gobernanza refleja que la calidad de gobernanza institucional es una señal más profunda y duradera que la percepción de crimen callejero (que puede cambiar con un solo incidente de alto perfil). Pero un país con excelentes instituciones y alto crimen callejero no debería puntuar tan bien como uno donde ambas capas están alineadas.
Clima — Perfiles Discretos con Parámetros Calibrados
climate = f(avg_temp, rain_days, sunshine_hours, profile_params)
Cinco perfiles — Cálido y Soleado, Caliente y Tropical, Templado y Verde, Frío y Seco, Sin Preferencia — cada uno con una temperatura de referencia, una curva de penalización por desviación, un umbral de lluvia y un umbral de sol distintos. Los perfiles están calibrados para que los multiplicadores de penalización se ajusten a la tolerancia real del usuario: un perfil tropical tolera alta pluviosidad con penalización mínima, mientras que un perfil soleado penaliza fuertemente la misma pluviosidad.
Decisión de producto: Perfiles discretos en lugar de sliders continuos. A un usuario tropical genuinamente no le importan 200+ días de lluvia — el perfil penaliza solo 5 puntos. Un usuario cálido-y-soleado pierde 15 puntos por la misma cantidad de lluvia. Esta asimetría codifica conocimiento de dominio. Un slider continuo con un solo multiplicador de penalización no puede capturarla. Los componentes crudos del clima se almacenan en la base de datos; los perfiles se aplican enteramente client-side sin queries adicionales.
Pipeline de Datos Automatizado
4 Edge Functions de Supabase · pg_cron · Refresh Mensual
- ◆ Refresh World Bank — consulta los indicadores más recientes de WGI, price level y GDP PPP vía API
- ◆ Refresh WHO — consulta datos de UHC y OOP health expenditure vía GHO API
- ◆ Refresh Climate — obtiene promedios anuales de Open-Meteo (temperatura, lluvia, sol) por capital
- ◆ Recómputo de scores — re-corre normalización min-max, aplica todas las fórmulas de dimensiones (incluyendo Healthcare V2), y refresca la materialised view
Decisión: Refresh mensual para fuentes accesibles por API. Las fuentes anuales (IMD, InterNations, EF EPI, GPI, Pew, IHME GBD, OECD capacity, PISA) se actualizan cuando se publican nuevas ediciones — se seedean manualmente vía scripts porque los datos subyacentes cambian una vez al año (PISA: cada 3 años). Automatizar su ingesta agregaría complejidad sin beneficio práctico. Service role key almacenada en Supabase Vault. El frontend nunca toca la service key — usa solo la anon key para acceso de solo lectura a la materialised view.
Manejo de NULLs y Calidad de Datos
- ◆ Los scores de dimensiones NULL se excluyen del cálculo del compuesto. Los pesos restantes se re-normalizan para sumar 1.0.
- ◆ Los países con demasiadas dimensiones NULL reciben una flag de "datos limitados" en la UI.
- ◆ Flag de discrepancia de warmth: cuando la brecha entre Hofstede IVR e InterNations supera un umbral calibrado, la UI señala la discrepancia. Suecia: IVR alto, InterNations bajo — culturalmente cálida internamente, alta barrera social para extranjeros. Portugal: IVR bajo, InterNations alto — cultura contenida, genuinamente acogedora.
- ◆ Países angloparlantes nativos (UK, Irlanda, Australia, Nueva Zelanda, Canadá, EE.UU.) hardcodeados a 100 en English proficiency independientemente de la cobertura de EF EPI.
- ◆ Badges de tipo de sistema de salud (Cubierto / Debes contratar seguro / Atado al empleador / Presupuesta privado) agregan contexto no-scoring sobre qué significa el sistema de cada país para el presupuesto de quien se muda.
Decisión: El manejo de NULLs no es un fallback — es un feature de producto. Un país con excelentes scores en 7 dimensiones y sin datos en 3 debería seguir rankeando correctamente en las 7 que tiene. La alternativa — excluir países con cualquier dato faltante — eliminaría candidatos fuertes (Taiwán: 7 indicadores NULL por no-reconocimiento del World Bank) y penalizaría la disponibilidad de datos en lugar de la calidad del país.
Onboarding → Mapeo de Pesos
6 preguntas — cubriendo situación familiar, fuente de ingreso, importancia de cultura cívica, importancia de calidez, preferencia de clima y necesidades de comunidad religiosa — cada una mapeando a ajustes de peso por dimensión según el perfil del usuario. Los mapeos están diseñados para que cada respuesta eleve naturalmente las dimensiones más relevantes para la situación del usuario (ej: las familias ven subir cultura escolar y healthcare; los trabajadores remotos ven subir purchasing power).
Skip en cualquier pregunta aplica pesos por defecto. Todo el flujo corre en estado de Zustand — sin round-trips al servidor — y se transfiere sin fricción a la vista de ranking.
Decisión de producto: El onboarding es una herramienta de descubrimiento, no de configuración. La mayoría de usuarios llegan pensando en salario y costo de vida. Las 6 preguntas los exponen a cultura cívica, calidez, ambiente escolar, libertad religiosa y clima como posibles prioridades que no habían considerado — antes de que el ranking les muestre algo. El primer trabajo del producto es expandir lo que el usuario cree que debe evaluar.