EN ESTA SECCIÓN

1 Introducción

En el corazón de la economía global existe una paradoja fundamental: mientras que algunos indicadores sugieren una relación lineal y predecible entre el desarrollo económico y el bienestar social, la realidad es mucho más compleja y matizada. Tomemos un ejemplo: Costa Rica tiene una esperanza de vida comparable a la de países europeos desarrollados, pero con un PIB per cápita significativamente menor; Qatar, por su parte, lidera en PIB per cápita pero no encabeza necesariamente en todos los indicadores de bienestar social (Shkolnikov et al., 2019). Estas “anomalías” no son excepciones sino revelaciones de una verdad fundamental: el desarrollo no es unidimensional.

El problema central que motiva este trabajo es fundamental: ¿Cuáles son realmente los “tipos” de desarrollo que caracterizan la economía mundial cuando se analiza simultáneamente un conjunto amplio de 17 indicadores económicos, sociales, tecnológicos y ambientales? No se trata de responder cuál país es más “rico”, sino algo más profundo: descubrir si existen estructuras ocultas en los datos que agrupen países con perfiles similares más allá de la geografía o las clasificaciones convencionales. Específicamente, la pregunta es: ¿Colombia y Uruguay podrían compartir más similitudes con algunos países asiáticos que con sus propios vecinos latinoamericanos? ¿Existe realmente un “grupo de países con baja renta pero alto acceso tecnológico”? ¿Las características ambientales y demográficas se alinean con la riqueza económica o presentan patrones independientes?

Históricamente, el desarrollo internacional se ha medido mediante indicadores aislados. El PIB per cápita domina los rankings; la esperanza de vida se analiza independientemente; la conectividad digital se observa separadamente. Este enfoque fragmentado es problemático porque el desarrollo no es unidimensional: un país puede ser económicamente exitoso pero frágil en salud pública, o tener excelente conectividad digital pero vulnerabilidad ambiental crítica (Jolliffe, 2002; World Bank, 2023). Los datos del año 2022 capturan un momento único en la historia económica global: post-pandemia de COVID-19, con efectos heterogéneos según país. Algunos recuperaron rápidamente su dinamismo; otros enfrentaron cicatrices estructurales persistentes en empleo, salud y finanzas públicas (World Bank, 2023).

El Banco Mundial proporciona 17 indicadores reconocidos internacionalmente que miden dimensiones distintas: factores económicos (PIB per cápita, crecimiento del PIB, inversión extranjera, remesas, industria, comercio), indicadores de salud y bienestar (esperanza de vida, mortalidad infantil, gasto en salud), variables de conectividad tecnológica (acceso a electricidad, uso de internet, suscripciones móviles) y aspectos ambientales y demográficos (área boscosa, tierra cultivable, crecimiento poblacional) (World Bank, 2023). Analizar estas 17 variables de forma independiente genera ruido; analizarlas de manera integrada puede revelar patrones coherentes que informan políticas públicas, estrategias de cooperación internacional y decisiones de inversión.

El desafío es modelar una pregunta sin respuesta predefinida: ¿Qué agrupamientos naturales de países emergen cuando se analiza simultáneamente esta multiplicidad de indicadores? Este es precisamente el rol del aprendizaje no supervisado—un conjunto de técnicas que descubren patrones en datos sin etiquetas previas, sin clasificaciones arbitrarias impuestas externamente (Charrad et al., 2014; Jolliffe, 2002).

Lo que sigue es una cartografía multidimensional de la economía global en el contexto post-pandemia: no solo se responde “¿en qué grupos se dividen los países?”, sino, más profundamente, “¿qué revelan estos grupos sobre mecanismos reales del desarrollo, oportunidades compartidas, restricciones comunes y trayectorias viables para diferentes sociedades?” Los resultados no serán una clasificación administrativa sino un descubrimiento empírico basado en lo que los datos de 141 países en 2022 efectivamente revelan.


2 Metodología

2.1 Base de datos

La base de datos utilizada en este análisis proviene de la compilación World Development Indicators (WDI) del Banco Mundial, considerada la principal fuente internacional de estadísticas comparables sobre desarrollo económico y social (World Bank, 2023). Los WDI representan el esfuerzo más comprehensivo del Banco Mundial para consolidar indicadores de desarrollo de fuentes oficialmente reconocidas, incluyendo oficinas nacionales de estadística, bancos centrales, agencias de las Naciones Unidas, instituciones de investigación y contribuyentes del sector privado (World Bank, 2023; Jeanty, 2010).

La base WDI contiene aproximadamente 1,600 indicadores de series temporales para 217 economías y más de 40 grupos de países, con datos para muchos indicadores que se remontan más de 50 años (World Bank, 2023). Los datos son compilados mediante metodologías estandarizadas que garantizan comparabilidad internacional, transparencia metodológica y robustez estadística (World Bank, 2019). El proceso de selección de indicadores del WDI sigue cuatro criterios fundamentales: facilidad de uso (accesibilidad y claridad para usuarios diversos), confiabilidad (reputación y credibilidad de la fuente), cobertura (amplitud geográfica y temporal), y calidad (rigor metodológico y precisión) (Behar & Mok, 2024).

Para este análisis, se filtro información exclusivamente para países individuales (eliminando bloques regionales o agrupaciones económicas) del año 2022. El dataset resultante contiene 141 países, según la disponibilidad de datos completos, donde cada observación representa una unidad soberana comparable en un único punto temporal.

El año 2022 marca un punto de inflexión crítico en la economía global, representa el momento post-pandemia en que las trayectorias de recuperación de cada país se hacen visibles y diferenciadas. Mientras algunos países desarrollados con capacidad fiscal recuperaron o superaron niveles pre-COVID-19, economías emergentes enfrentaban cicatrices estructurales persistentes en empleo, inflación descontrolada, y aumento de deuda pública (Banco Mundial, 2022; FMI, 2023; CEPAL, 2023). La desigualdad global se amplió drásticamente: el crecimiento proyectado para América Latina en 2022 era apenas 2.6%, mientras la desigualdad de ingresos aumentó significativamente después de dos décadas de mejoras (BID, 2022).

En este contexto, 2022 funciona como un “revelador” excepcional de vulnerabilidades y fortalezas estructurales subyacentes de los países: aquellos con sistemas de salud robustos, infraestructura tecnológica consolidada y economías diversificadas mostraron resiliencia; los que enfrentaban fragilidades estructurales experimentaron impactos persistentes (Banco Mundial, 2022; CIDOB, 2022). Por tanto, 2022 es un año extraordinariamente informativo para identificar perfiles reales de desarrollo, ya que las diferencias entre países se magnificaron visiblemente, permitiendo observar no clasificaciones arbitrarias sino estructuras auténticas de capacidad nacional.

2.2 Descripción de las variables

El dataset construido para este análisis integra 17 variables cuantitativas que capturan las múltiples dimensiones del desarrollo contemporáneo. Estas variables se organizan en cinco áreas temáticas que, en conjunto, ofrecen una perspectiva comprehensiva del desempeño socioeconómico, tecnológico y ambiental de cada país. A continuación, se presenta una descripción detallada de cada variable según su área temática.

2.2.1 Dimensión economica

La inclusión de variables económicas es fundamental porque el desarrollo ha sido históricamente conceptualizado como un proceso de transformación estructural impulsado por el crecimiento económico (World Bank, 2023; Piketty, 2022). Sin embargo, el crecimiento económico no es unidimensional: requiere tanto un nivel absoluto de riqueza (PIB per cápita) como dinamismo y expansión (crecimiento del PIB), diversificación productiva (industria), y capacidad de atracción de inversión internacional (IED) que transfiera conocimiento y capital (ECB, 2018). Además, las economías contemporáneas están integradas globalmente, por lo que exportaciones, importaciones y remesas son transmisores clave de oportunidades y vulnerabilidades económicas (World Bank, 2023)., en la tabla 1 las observamos.

variables_economicas <- data.frame(
  Variable = c(
    "PIB per cápita (US$)",
    "Crecimiento del PIB (% anual)",
    "Inversión extranjera directa (% PIB)",
    "Remesas recibidas (% PIB)",
    "Industria (% PIB)",
    "Exportaciones (% PIB)",
    "Importaciones (% PIB)"
  ),
  
  Descripción = c(
    "PIB dividido por población, en dólares corrientes. Indicador principal del nivel de ingreso y producción económica por persona.",
    "Tasa de variación anual del PIB en precios constantes. Refleja la expansión o contracción económica de un país.",
    "Flujos netos de inversión con interés gerencial duradero. Fuente crucial de financiamiento externo y transferencia tecnológica.",
    "Transferencias personales de migrantes que trabajan en el extranjero. Flujo financiero clave para muchas economías en desarrollo.",
    "Valor agregado del sector industrial. Refleja el grado de industrialización y la estructura productiva de una economía.",
    "Valor de bienes y servicios vendidos al exterior. Mide el grado de apertura comercial y oportunidades de crecimiento.",
    "Valor de bienes y servicios comprados al exterior. Indica la dependencia de la economía respecto al comercio internacional."
  ),
  
  Interpretación = c(
    ">20,000 USD: economía desarrollada\n5,000-20,000 USD: economía emergente\n<5,000 USD: economía en desarrollo",
    ">3%: crecimiento robusto\n0-3%: crecimiento moderado\n<0%: recesión económica",
    ">5%: alta atracción de IED\n2-5%: nivel moderado\n<2%: baja atracción de inversión",
    ">10%: alta dependencia\n2-10%: contribución significativa\n<2%: impacto limitado",
    ">30%: economía industrializada\n20-30%: sector industrial sólido\n<20%: base industrial reducida", 
    ">50%: economía muy abierta\n30-50%: apertura moderada\n<30%: economía relativamente cerrada",
    ">40%: alta dependencia importaciones\n25-40%: nivel moderado\n<25%: autosuficiencia relativa"
  )
)

tabla_1 <- variables_economicas %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 1**"),
    subtitle = "Variables Macroeconómicas y su Interpretación"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small", color = "#e0e6ed"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023), UN (2015), ECB (2018)")
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y temporal",
    locations = cells_title(groups = "subtitle")
  )

tabla_1
Tabla 1
Variables Macroeconómicas y su Interpretación1
Variable Descripción Interpretación
PIB per cápita (US$) PIB dividido por población, en dólares corrientes. Indicador principal del nivel de ingreso y producción económica por persona. >20,000 USD: economía desarrollada 5,000-20,000 USD: economía emergente <5,000 USD: economía en desarrollo
Crecimiento del PIB (% anual) Tasa de variación anual del PIB en precios constantes. Refleja la expansión o contracción económica de un país. >3%: crecimiento robusto 0-3%: crecimiento moderado <0%: recesión económica
Inversión extranjera directa (% PIB) Flujos netos de inversión con interés gerencial duradero. Fuente crucial de financiamiento externo y transferencia tecnológica. >5%: alta atracción de IED 2-5%: nivel moderado <2%: baja atracción de inversión
Remesas recibidas (% PIB) Transferencias personales de migrantes que trabajan en el extranjero. Flujo financiero clave para muchas economías en desarrollo. >10%: alta dependencia 2-10%: contribución significativa <2%: impacto limitado
Industria (% PIB) Valor agregado del sector industrial. Refleja el grado de industrialización y la estructura productiva de una economía. >30%: economía industrializada 20-30%: sector industrial sólido <20%: base industrial reducida
Exportaciones (% PIB) Valor de bienes y servicios vendidos al exterior. Mide el grado de apertura comercial y oportunidades de crecimiento. >50%: economía muy abierta 30-50%: apertura moderada <30%: economía relativamente cerrada
Importaciones (% PIB) Valor de bienes y servicios comprados al exterior. Indica la dependencia de la economía respecto al comercio internacional. >40%: alta dependencia importaciones 25-40%: nivel moderado <25%: autosuficiencia relativa
1 Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y temporal
Fuentes: Elaboración propia con base en World Bank (2023), UN (2015), ECB (2018)

2.2.2 Dimension de salud y bienestar

La inclusión de variables sanitarias responde a que el desarrollo no es puramente económico sino que debe reflejarse en mejoras sustantivas en la calidad de vida, particularmente en indicadores de salud poblacional (Sachs et al., 2022; World Bank, 2023). La esperanza de vida es considerada por organismos internacionales como el indicador sintético más robusto de desarrollo humano, capturando tanto el acceso a servicios de salud como condiciones generales de vida (OECD, 2024). La mortalidad infantil es particularmente sensible a la calidad del sistema sanitario, y el gasto en salud refleja el esfuerzo institucional de un país por asegurar bienestar poblacional (World Bank, 2023)., en la tabla 2 las observamos.

variables_salud <- data.frame(
  Variable = c(
    "Esperanza de vida al nacer (años)",
    "Mortalidad infantil (por cada 1,000 nacidos vivos)",
    "Gasto en salud (% del PIB)"
  ),
  
  Descripción = c(
    "Número promedio de años que se espera que viva un recién nacido si los patrones de mortalidad prevalecientes al momento de su nacimiento permanecen constantes a lo largo de su vida. Es uno de los indicadores más robustos para medir el estado de salud poblacional, reflejando la calidad del sistema sanitario, acceso a servicios médicos, condiciones de vida, nutrición y factores ambientales.",
    "Número de muertes de niños menores de un año por cada 1,000 nacimientos vivos. Es un indicador sensible de la calidad de atención sanitaria materno-infantil, condiciones sanitarias, acceso a agua potable y nutrición adecuada, funcionando como proxy de desarrollo social y capacidad institucional del sistema de salud.",
    "Gasto corriente en salud expresado como porcentaje del PIB, incluyendo tanto gasto público como privado. Refleja la prioridad presupuestaria que un país asigna al sector salud y su capacidad de financiar infraestructura sanitaria, siendo un determinante clave de resultados de salud poblacional."
  ),
  
  Interpretación = c(
    ">75 años: salud poblacional avanzada\n70-75 años: nivel medio de desarrollo sanitario\n<70 años: desafíos significativos en salud pública",
    "<10: excelentes condiciones sanitarias\n10-25: condiciones moderadas\n>25: necesidades críticas en salud infantil",
    ">8%: alta prioridad en salud\n5-8%: compromiso moderado\n<5%: recursos sanitarios limitados"
  )
)

tabla_2 <- variables_salud %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 2**"),
    subtitle = "Indicadores de Salud Pública y su Interpretación"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small", color = "#e0e6ed"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en WHO (2020), OECD (2024), World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y nivel de desarrollo",
    locations = cells_title(groups = "subtitle")
  )

tabla_2
Tabla 2
Indicadores de Salud Pública y su Interpretación1
Variable Descripción Interpretación
Esperanza de vida al nacer (años) Número promedio de años que se espera que viva un recién nacido si los patrones de mortalidad prevalecientes al momento de su nacimiento permanecen constantes a lo largo de su vida. Es uno de los indicadores más robustos para medir el estado de salud poblacional, reflejando la calidad del sistema sanitario, acceso a servicios médicos, condiciones de vida, nutrición y factores ambientales. >75 años: salud poblacional avanzada 70-75 años: nivel medio de desarrollo sanitario <70 años: desafíos significativos en salud pública
Mortalidad infantil (por cada 1,000 nacidos vivos) Número de muertes de niños menores de un año por cada 1,000 nacimientos vivos. Es un indicador sensible de la calidad de atención sanitaria materno-infantil, condiciones sanitarias, acceso a agua potable y nutrición adecuada, funcionando como proxy de desarrollo social y capacidad institucional del sistema de salud. <10: excelentes condiciones sanitarias 10-25: condiciones moderadas >25: necesidades críticas en salud infantil
Gasto en salud (% del PIB) Gasto corriente en salud expresado como porcentaje del PIB, incluyendo tanto gasto público como privado. Refleja la prioridad presupuestaria que un país asigna al sector salud y su capacidad de financiar infraestructura sanitaria, siendo un determinante clave de resultados de salud poblacional. >8%: alta prioridad en salud 5-8%: compromiso moderado <5%: recursos sanitarios limitados
1 Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y nivel de desarrollo
Fuentes: Elaboración propia con base en WHO (2020), OECD (2024), World Bank (2023)

2.2.3 Dimension tecnologica y de conectividad

La inclusión de variables tecnológicas es justificada por la importancia creciente de la transformación digital en el desarrollo contemporáneo (UNCTAD, 2021; World Bank, 2023). La acceso a electricidad, internet y telefonía móvil no son lujos sino infraestructuras esenciales que habilitan participación en la economía del conocimiento, acceso a información, servicios financieros y oportunidades económicas (UNCTAD, 2021). La brecha digital ha emergido como una nueva dimensión de desigualdad internacional, donde países con penetración digital menor enfrentan desventajas competitivas significativas (World Bank, 2023)., en la tabla 3 las observamos.

variables_tecnologia <- data.frame(
  Variable = c(
    "Acceso a electricidad (% de la población)",
    "Uso de internet (% de la población)",
    "Suscripciones móviles (por cada 100 personas)"
  ),
  
  Descripción = c(
    "Porcentaje de la población con acceso a electricidad. Indicador fundamental de infraestructura energética básica, condición necesaria para actividad económica moderna, educación, salud y conectividad digital.",
    "Porcentaje de individuos que han utilizado internet en los últimos 3 meses. Proxy de conectividad digital, acceso a información, y participación en la economía del conocimiento, siendo cada vez más relevante para productividad económica y reducción de brechas informativas.",
    "Número de suscripciones a servicios de telefonía celular móvil por cada 100 habitantes. Refleja la penetración de tecnología móvil, que ha sido un vector fundamental de inclusión digital y acceso a servicios financieros en economías en desarrollo."
  ),
  
  Interpretación = c(
    ">95%: cobertura eléctrica universal\n80-95%: acceso extendido\n<80%: déficit significativo de infraestructura",
    ">70%: sociedad digitalmente integrada\n30-70%: adopción media de internet\n<30%: brecha digital significativa",
    ">100: alta penetración móvil\n80-100: cobertura adecuada\n<80: oportunidades de expansión del mercado"
  )
)

tabla_3 <- variables_tecnologia %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 3**"),
    subtitle = "Indicadores de Infraestructura y Tecnología"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small", color = "#e0e6ed"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "Los valores superiores a 100 en suscripciones móviles indican múltiples suscripciones por persona",
    locations = cells_body(
      rows = 3,
      columns = Interpretación
    )
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación son referenciales y pueden variar según el nivel de desarrollo regional",
    locations = cells_title(groups = "subtitle")
  )

tabla_3
Tabla 3
Indicadores de Infraestructura y Tecnología1
Variable Descripción Interpretación
Acceso a electricidad (% de la población) Porcentaje de la población con acceso a electricidad. Indicador fundamental de infraestructura energética básica, condición necesaria para actividad económica moderna, educación, salud y conectividad digital. >95%: cobertura eléctrica universal 80-95%: acceso extendido <80%: déficit significativo de infraestructura
Uso de internet (% de la población) Porcentaje de individuos que han utilizado internet en los últimos 3 meses. Proxy de conectividad digital, acceso a información, y participación en la economía del conocimiento, siendo cada vez más relevante para productividad económica y reducción de brechas informativas. >70%: sociedad digitalmente integrada 30-70%: adopción media de internet <30%: brecha digital significativa
Suscripciones móviles (por cada 100 personas) Número de suscripciones a servicios de telefonía celular móvil por cada 100 habitantes. Refleja la penetración de tecnología móvil, que ha sido un vector fundamental de inclusión digital y acceso a servicios financieros en economías en desarrollo. >100: alta penetración móvil 80-100: cobertura adecuada <80: oportunidades de expansión del mercado2
1 Los umbrales de interpretación son referenciales y pueden variar según el nivel de desarrollo regional
2 Los valores superiores a 100 en suscripciones móviles indican múltiples suscripciones por persona
Fuentes: Elaboración propia con base en World Bank (2023)

2.2.4 Dimension ambiental y de recursos

La inclusión de variables ambientales responde al creciente reconocimiento de que el desarrollo sostenible debe integrar consideraciones ecológicas (PNUD, 2023; World Bank, 2023). Aunque el crecimiento económico tradicional ha sido alcanzado frecuentemente mediante degradación ambiental, la sostenibilidad del desarrollo requiere preservación de capital natural, particularmente bosques (para captura de carbono y biodiversidad) y tierra cultivable (para seguridad alimentaria) (PNUD, 2023; World Bank, 2023), en la tabla 4 las vemos.

variables_ambientales <- data.frame(
  Variable = c(
    "Área boscosa (% del área terrestre)",
    "Tierra cultivable (% del área terrestre)"
  ),
  
  Descripción = c(
    "Porcentaje del territorio nacional cubierto por bosques. Es un indicador de conservación ambiental, biodiversidad y sostenibilidad, siendo relevante tanto para mitigación del cambio climático como para servicios ecosistémicos.",
    "Porcentaje de tierra apta para cultivos agrícolas. Refleja el potencial agrícola y la base de recursos naturales para producción de alimentos, siendo particularmente relevante para economías con sectores agrícolas significativos."
  ),
  
  Interpretación = c(
    ">30%: alta cobertura forestal\n15-30%: cobertura media\n<15%: deforestación significativa",
    ">20%: alta disponibilidad agrícola\n10-20%: capacidad moderada\n<10%: limitaciones para agricultura"
  )
)

tabla_4 <- variables_ambientales %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 4**"),
    subtitle = "Indicadores Ambientales y de Uso de la Tierra"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small", color = "#e0e6ed"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "Los servicios ecosistémicos incluyen regulación hídrica, conservación de biodiversidad y secuestro de carbono",
    locations = cells_body(
      rows = 1,
      columns = Descripción
    )
  ) %>%
  tab_footnote(
    footnote = "La tierra cultivable incluye tierras arables, cultivos permanentes y pastos permanentes",
    locations = cells_body(
      rows = 2,
      columns = Descripción
    )
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación pueden variar según las características geográficas y ecológicas de cada región",
    locations = cells_title(groups = "subtitle")
  )

tabla_4
Tabla 4
Indicadores Ambientales y de Uso de la Tierra1
Variable Descripción Interpretación
Área boscosa (% del área terrestre) Porcentaje del territorio nacional cubierto por bosques. Es un indicador de conservación ambiental, biodiversidad y sostenibilidad, siendo relevante tanto para mitigación del cambio climático como para servicios ecosistémicos.2 >30%: alta cobertura forestal 15-30%: cobertura media <15%: deforestación significativa
Tierra cultivable (% del área terrestre) Porcentaje de tierra apta para cultivos agrícolas. Refleja el potencial agrícola y la base de recursos naturales para producción de alimentos, siendo particularmente relevante para economías con sectores agrícolas significativos.3 >20%: alta disponibilidad agrícola 10-20%: capacidad moderada <10%: limitaciones para agricultura
1 Los umbrales de interpretación pueden variar según las características geográficas y ecológicas de cada región
2 Los servicios ecosistémicos incluyen regulación hídrica, conservación de biodiversidad y secuestro de carbono
3 La tierra cultivable incluye tierras arables, cultivos permanentes y pastos permanentes
Fuentes: Elaboración propia con base en World Bank (2023)

2.2.5 Dimension demografica

La inclusión de variables demográficas es justificada porque la dinámica poblacional condiciona fundamentalmente los desafíos y oportunidades de desarrollo: presión sobre recursos, mercado laboral, demanda por servicios públicos, y sostenibilidad fiscal (CEPAL, 2023; World Bank, 2023). Países con crecimiento poblacional acelerado enfrentan distintos desafíos que aquellos con envejecimiento poblacional, impactando tasas de ahorro, inversión, y provisión de servicios (CEPAL, 2023), vemos las variables en la tabla 5.

variables_demograficas <- data.frame(
  Variable = c(
    "Población total",
    "Crecimiento poblacional (% anual)"
  ),
  
  Descripción = c(
    "Número total de habitantes de un país a mitad de año. El tamaño poblacional determina tanto el mercado interno como la escala de demanda por servicios públicos y recursos naturales.",
    "Tasa de variación porcentual anual de la población. Refleja la presión demográfica y sus implicaciones para sostenibilidad, mercados laborales, y provisión de servicios públicos."
  ),
  
  Interpretación = c(
    ">100M: país muy poblado\n10-100M: población media\n<10M: país poco poblado",
    ">2%: crecimiento rápido\n0.5-2%: crecimiento moderado\n<0.5%: crecimiento lento"
  )
)

tabla_5 <- variables_demograficas %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 5**"),
    subtitle = "Indicadores Demográficos Básicos"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small", color = "#e0e6ed"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "La población se refiere a residentes totales independientemente de su estatus legal o ciudadanía",
    locations = cells_body(
      rows = 1,
      columns = Descripción
    )
  ) %>%
  tab_footnote(
    footnote = "El crecimiento poblacional incluye nacimientos, muertes y migración neta",
    locations = cells_body(
      rows = 2,
      columns = Descripción
    )
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y nivel de desarrollo",
    locations = cells_title(groups = "subtitle")
  )

tabla_5
Tabla 5
Indicadores Demográficos Básicos1
Variable Descripción Interpretación
Población total Número total de habitantes de un país a mitad de año. El tamaño poblacional determina tanto el mercado interno como la escala de demanda por servicios públicos y recursos naturales.2 >100M: país muy poblado 10-100M: población media <10M: país poco poblado
Crecimiento poblacional (% anual) Tasa de variación porcentual anual de la población. Refleja la presión demográfica y sus implicaciones para sostenibilidad, mercados laborales, y provisión de servicios públicos.3 >2%: crecimiento rápido 0.5-2%: crecimiento moderado <0.5%: crecimiento lento
1 Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y nivel de desarrollo
2 La población se refiere a residentes totales independientemente de su estatus legal o ciudadanía
3 El crecimiento poblacional incluye nacimientos, muertes y migración neta
Fuentes: Elaboración propia con base en World Bank (2023)

2.3 Base de datos del modelo

A continuacion, se muestra la base de datos que se usara para el modelo de aprendizaje no supervisado.

Base_2022 <- read_csv("f36a5086-3311-4b1a-9f0c-bda5cd4718df_Series - Metadata.csv",
                 show_col_types = FALSE) %>%
  select(
    Pais = `Country Name`,
    Codigo = `Country Code`,
    PIB_per = `GDP per capita (current US$) [NY.GDP.PCAP.CD]`,
    Poblacion = `Population, total [SP.POP.TOTL]`,
    `Esperanza vida` = `Life expectancy at birth, total (years) [SP.DYN.LE00.IN]`,
    `Acceso electricidad` = `Access to electricity (% of population) [EG.ELC.ACCS.ZS]`,
    `Area boscosa` = `Forest area (% of land area) [AG.LND.FRST.ZS]`,
    `Suscripciones movil` = `Mobile cellular subscriptions (per 100 people) [IT.CEL.SETS.P2]`,
    `Crecimiento PIB` = `GDP growth (annual %) [NY.GDP.MKTP.KD.ZG]`,
    `Mortalidad infantil` = `Mortality rate, infant (per 1,000 live births) [SP.DYN.IMRT.IN]`,
    `Inversion extranjera` = `Foreign direct investment, net inflows (% of GDP) [BX.KLT.DINV.WD.GD.ZS]`,
    `Gasto salud` = `Current health expenditure (% of GDP) [SH.XPD.CHEX.GD.ZS]`,
    `Uso internet` = `Individuals using the Internet (% of population) [IT.NET.USER.ZS]`,
    Importaciones = `Imports of goods and services (% of GDP) [NE.IMP.GNFS.ZS]`,
    Exportaciones = `Exports of goods and services (% of GDP) [NE.EXP.GNFS.ZS]`,
    `Tierra cultivable` = `Arable land (% of land area) [AG.LND.ARBL.ZS]`,
    `Crecimiento poblacion` = `Population growth (annual %) [SP.POP.GROW]`,
    Industria = `Industry (including construction), value added (% of GDP) [NV.IND.TOTL.ZS]`,
    Remesas = `Personal remittances, received (% of GDP) [BX.TRF.PWKR.DT.GD.ZS]`
  )%>%
  filter(!Pais %in% c("World", "High income", "Low income", "European Union",
                      "Latin America & Caribbean", "Middle income", "OECD members",
                      "East Asia & Pacific", "Sub-Saharan Africa", "South Asia",
                      "North America", "Euro area", "Arab World", "West Bank and Gaza",
                      "Lower middle income", "Upper middle income", 
                      "Least developed countries: UN classification",
                      "Fragile and conflict affected situations", 
                      "Heavily indebted poor countries (HIPC)",
                      "IDA total", "Low & middle income", "Middle East & North Africa",
                      "Pacific island small states", "Small states", 
                      "Caribbean small states", "Other small states", 
                      "IDA & IBRD total", "IDA only", "IBRD only",
                      "Pre-demographic dividend", "Post-demographic dividend", 
                      "Early-demographic dividend", "Late-demographic dividend")) %>% 
  mutate(across(3:19, as.numeric)) %>% drop_na()%>% 
  filter(Pais != c( "Luxembourg","  Uruguay", "Angola","Jordan","Belize")) %>% 
  filter(Codigo != "BLZ",Codigo!="JOR",Codigo!="URY")

nombres_columnas <- c(
  "País", "Código", "PIB per cápita", "Población", 
  "Esperanza vida", "Acceso electricidad", "Área boscosa",
  "Suscripciones móviles", "Crecimiento PIB", "Mortalidad infantil",
  "Inversión extranjera", "Gasto salud", "Uso internet", 
  "Importaciones", "Exportaciones", "Tierra cultivable",
  "Crecimiento población", "Industria", "Remesas"
)

tabla_inicial <- datatable(
  Base_2022,
  extensions = c('Buttons', 'Scroller', 'Responsive'),
  options = list(
    dom = '<"tabla-header"B>frtip',
    buttons = list(
      list(extend = 'copy', text = '📋 Copiar', className = 'btn-cyber-primary'),
      list(extend = 'csv', text = '📊 CSV', className = 'btn-cyber-primary'),
      list(extend = 'excel', text = '📈 Excel', className = 'btn-cyber-primary'),
      list(extend = 'pdf', text = '📄 PDF', className = 'btn-cyber-primary'),
      list(extend = 'print', text = '🖨️ Imprimir', className = 'btn-cyber-primary')
    ),
    pageLength = 12,
    lengthMenu = list(c(8, 12, 20, 50, -1), 
                     c('8', '12', '20', '50', 'Todos')),
    scrollX = TRUE,
    scrollY = "550px",
    scroller = TRUE,
    deferRender = TRUE,
    autoWidth = FALSE,
    responsive = FALSE,
    language = list(
      url = '//cdn.datatables.net/plug-ins/1.13.4/i18n/es-ES.json',
      search = "🔍 Buscar:",
      lengthMenu = "Mostrar _MENU_ registros",
      info = "_START_ - _END_ de _TOTAL_ países",
      paginate = list(
        first = "⏮️",
        last = "⏭️",
        `next` = "➡️",
        previous = "⬅️"
      )
    )
  ),
  rownames = FALSE,
  class = c('display', 'compact', 'hover', 'nowrap'),
  caption = htmltools::HTML(
    '<div style="color: #FFFFFF; font-size: 18px; font-weight: bold; 
    margin-bottom: 20px; text-align: left; text-shadow: 0 0 15px rgba(0, 229, 255, 0.5); 
    text-transform: uppercase; letter-spacing: 2px;">
    Tabla 6: Dataset Completo - Variables de Desarrollo Global 2022
    </div>'
  ),
  colnames = nombres_columnas
) %>%
  formatCurrency(
    columns = 'PIB_per', 
    currency = "$", 
    digits = 0,
    before = TRUE
  ) %>%
  formatRound(
    columns = 'Poblacion', 
    digits = 0,
    mark = ","
  ) %>%
  formatRound(
    columns = c('Esperanza vida', 'Acceso electricidad', 'Area boscosa',
               'Suscripciones movil', 'Crecimiento PIB', 'Inversion extranjera', 
               'Gasto salud', 'Uso internet', 'Importaciones', 'Exportaciones', 
               'Tierra cultivable', 'Crecimiento poblacion', 'Industria', 'Remesas'), 
    digits = 2
  ) %>%
  formatRound(
    columns = 'Mortalidad infantil',
    digits = 1
  ) %>%
  htmlwidgets::onRender("
    function(el, x) {
      
      var wrapper = $(el).find('.dataTables_wrapper');
      wrapper.css({
        'background': 'linear-gradient(135deg, #0a0e1a 0%, #12161f 100%)',
        'border': '2px solid rgba(0, 229, 255, 0.4)',
        'border-radius': '14px',
        'padding': '25px',
        'box-shadow': '0 12px 50px rgba(0, 0, 0, 0.8)',
        'font-family': 'Arial, sans-serif',
        'overflow': 'visible !important',
        'width': '100% !important'
      });
      
      // 
      var btnContainer = $(el).find('.dt-buttons');
      btnContainer.css({
        'padding': '20px 0',
        'margin-bottom': '20px',
        'display': 'flex',
        'gap': '12px',
        'flex-wrap': 'wrap',
        'align-items': 'center',
        'border-bottom': '2px solid rgba(0, 229, 255, 0.3)',
        'padding-bottom': '20px'
      });
      
      // 
      $(el).find('.dt-button').each(function() {
        $(this).css({
          'background': '#00e5ff !important',
          'background-color': '#00e5ff !important',
          'background-image': 'linear-gradient(135deg, #00e5ff 0%, #00b8d4 100%) !important',
          'color': '#000000 !important',
          'border': '3px solid #00ffff !important',
          'border-radius': '10px !important',
          'padding': '14px 24px !important',
          'margin': '0 8px !important',
          'font-size': '14px !important',
          'font-weight': '900 !important',
          'cursor': 'pointer !important',
          'transition': 'all 0.25s ease !important',
          'box-shadow': '0 6px 20px rgba(0, 229, 255, 0.6), inset 0 0 15px rgba(255, 255, 255, 0.3) !important',
          'text-transform': 'uppercase',
          'letter-spacing': '1.5px',
          'text-shadow': '0 1px 3px rgba(0, 0, 0, 0.3)',
          'display': 'inline-block !important',
          'opacity': '1 !important',
          'visibility': 'visible !important'
        });
      }).hover(
        function() {
          $(this).css({
            'transform': 'translateY(-4px) scale(1.05) !important',
            'background': '#00ffff !important',
            'background-color': '#00ffff !important',
            'box-shadow': '0 12px 35px rgba(0, 255, 255, 1), inset 0 0 25px rgba(255, 255, 255, 0.4) !important'
          });
        },
        function() {
          $(this).css({
            'transform': 'translateY(0) scale(1) !important',
            'background': '#00e5ff !important',
            'background-color': '#00e5ff !important',
            'box-shadow': '0 6px 20px rgba(0, 229, 255, 0.6), inset 0 0 15px rgba(255, 255, 255, 0.3) !important'
          });
        }
      );
      
      // 
      setTimeout(function() {
        $(el).find('a.dt-button, button.dt-button, .btn-cyber-primary, .buttons-copy, .buttons-csv, .buttons-excel, .buttons-pdf, .buttons-print').css({
          'background': '#00e5ff !important',
          'background-color': '#00e5ff !important',
          'color': '#000000 !important',
          'opacity': '1 !important',
          'visibility': 'visible !important',
          'border': '3px solid #00ffff !important'
        });
      }, 100);
      
      // 
      $(el).find('.dataTables_scroll').css({
        'overflow-x': 'auto !important',
        'width': '100% !important'
      });
      
      $(el).find('.dataTables_scrollHead').css({
        'overflow': 'visible !important',
        'width': '100% !important'
      });
      
      $(el).find('.dataTables_scrollBody').css({
        'overflow-x': 'auto !important',
        'overflow-y': 'auto !important',
        'width': '100% !important',
        'background': '#0a0e1a',
        'border': '1px solid rgba(0, 229, 255, 0.2)',
        'border-radius': '8px'
      });
      
      $(el).find('table').css({
        'width': '100% !important',
        'table-layout': 'auto !important'
      });
      
      // 
      var thead = $(el).find('thead');
      thead.css({
        'background': 'linear-gradient(135deg, #00e5ff 0%, #0084ff 100%)',
        'box-shadow': '0 0 30px rgba(0, 229, 255, 0.7)'
      });
      
      $(el).find('thead th').css({
        'background': 'linear-gradient(135deg, #00e5ff 0%, #0084ff 100%) !important',
        'color': '#000000 !important',
        'font-weight': 'bold !important',
        'font-size': '14px !important',
        'padding': '16px 12px !important',
        'text-align': 'center',
        'border': '3px solid #0084ff !important',
        'white-space': 'nowrap !important',
        'text-transform': 'uppercase',
        'letter-spacing': '1px',
        'box-shadow': 'inset 0 0 20px rgba(0, 0, 0, 0.2), 0 0 15px rgba(0, 229, 255, 0.3)',
        'font-family': 'Arial, sans-serif',
        'min-width': '120px'
      });
      
      // 
      $(el).find('tbody tr').css({
        'background-color': '#0a0e1a !important',
        'border-bottom': '2px solid #12161f !important',
        'transition': 'all 0.2s ease'
      });
      
      // 
      $(el).find('tbody tr td:first-child').css({
        'background-color': '#12161f !important',
        'color': '#00e5ff !important',
        'font-weight': 'bold !important',
        'font-size': '14px !important',
        'border-left': '4px solid #00e5ff !important',
        'border-right': '3px solid #00e5ff !important',
        'padding': '14px 10px !important',
        'text-shadow': '0 0 10px rgba(0, 229, 255, 0.4)',
        'white-space': 'nowrap !important',
        'min-width': '150px'
      });
      
      // 
      $(el).find('tbody td').not(':first-child').css({
        'padding': '14px 10px !important',
        'border-right': '1px solid rgba(0, 229, 255, 0.2) !important',
        'text-align': 'center',
        'font-size': '13px',
        'color': '#e0e6ed !important',
        'background-color': '#0a0e1a !important',
        'white-space': 'nowrap !important',
        'min-width': '100px'
      });
      
      // 
      $(el).find('tbody tr').hover(
        function() {
          $(this).css({
            'background-color': '#12161f !important',
            'box-shadow': 'inset 0 0 25px rgba(0, 229, 255, 0.2), 0 0 15px rgba(0, 229, 255, 0.3) !important',
            'border-left': '4px solid #00e5ff !important'
          });
          $(this).find('td').css({
            'color': '#00e5ff !important',
            'text-shadow': '0 0 8px rgba(0, 229, 255, 0.4)'
          });
          $(this).find('td:first-child').css('color', '#00ffff !important');
        },
        function() {
          $(this).css({
            'background-color': '#0a0e1a !important',
            'box-shadow': 'none !important',
            'border-left': 'none !important'
          });
          $(this).find('td').css({
            'color': '#e0e6ed',
            'text-shadow': 'none'
          });
          $(this).find('td:first-child').css('color', '#00e5ff');
        }
      );
      
      // ========== BÚSQUEDA CYBER ==========
      var searchLabel = $(el).find('label:has([type=search])');
      searchLabel.css({
        'color': '#e0e6ed !important',
        'font-weight': 'bold',
        'font-size': '14px',
        'display': 'flex',
        'align-items': 'center',
        'gap': '10px',
        'margin-bottom': '15px'
      });
      
      var searchBox = $(el).find('input[type=search]');
      searchBox.css({
        'background-color': '#12161f !important',
        'color': '#e0e6ed !important',
        'border': '2px solid #00e5ff !important',
        'border-radius': '8px !important',
        'padding': '12px 15px !important',
        'font-size': '14px !important',
        'width': '300px !important',
        'box-shadow': '0 0 20px rgba(0, 229, 255, 0.2) inset',
        'transition': 'all 0.3s ease'
      }).focus(function() {
        $(this).css({
          'box-shadow': '0 0 30px rgba(0, 229, 255, 0.6) inset, 0 0 20px rgba(0, 229, 255, 0.4)',
          'border-color': '#00ffff !important'
        });
      }).blur(function() {
        $(this).css({
          'box-shadow': '0 0 20px rgba(0, 229, 255, 0.2) inset'
        });
      });
      
      //
      var lengthLabel = $(el).find('label:has(select)');
      lengthLabel.css({
        'color': '#e0e6ed',
        'font-size': '13px',
        'display': 'flex',
        'align-items': 'center',
        'gap': '8px'
      });
      
      $(el).find('select').css({
        'background-color': '#12161f !important',
        'color': '#e0e6ed !important',
        'border': '2px solid #00e5ff !important',
        'border-radius': '6px !important',
        'padding': '8px 10px !important',
        'font-size': '13px !important',
        'cursor': 'pointer',
        'box-shadow': '0 0 15px rgba(0, 229, 255, 0.2) inset'
      });
      
      // 
      $(el).find('.dataTables_paginate').css({
        'margin-top': '20px',
        'padding-top': '15px',
        'border-top': '2px solid rgba(0, 229, 255, 0.3)'
      });
      
      $(el).find('.paginate_button').css({
        'background-color': '#12161f !important',
        'color': '#e0e6ed !important',
        'border': '2px solid #00e5ff !important',
        'padding': '10px 14px !important',
        'margin': '3px 3px !important',
        'border-radius': '6px !important',
        'font-size': '13px !important',
        'font-weight': 'bold',
        'cursor': 'pointer',
        'transition': 'all 0.2s ease',
        'box-shadow': '0 0 10px rgba(0, 229, 255, 0.2)'
      }).hover(
        function() {
          if (!$(this).hasClass('disabled')) {
            $(this).css({
              'background-color': '#00e5ff !important',
              'color': '#000000 !important',
              'box-shadow': '0 0 20px rgba(0, 229, 255, 0.8)',
              'transform': 'scale(1.08)'
            });
          }
        },
        function() {
          if (!$(this).hasClass('disabled')) {
            $(this).css({
              'background-color': '#12161f !important',
              'color': '#e0e6ed !important',
              'box-shadow': '0 0 10px rgba(0, 229, 255, 0.2)',
              'transform': 'scale(1)'
            });
          }
        }
      );
      
      $(el).find('.paginate_button.current').css({
        'background-color': '#00e5ff !important',
        'color': '#000000 !important',
        'border-color': '#00ffff !important',
        'font-weight': '900',
        'box-shadow': '0 0 30px rgba(0, 229, 255, 0.9), inset 0 0 15px rgba(255, 255, 255, 0.2)'
      });
      
      $(el).find('.paginate_button.disabled').css({
        'opacity': '0.4 !important',
        'cursor': 'not-allowed !important'
      });
      
      // 
      $(el).find('.dataTables_info').css({
        'color': '#00e5ff !important',
        'font-size': '14px !important',
        'font-weight': 'bold',
        'padding': '15px 0',
        'border-top': '2px solid rgba(0, 229, 255, 0.3)',
        'text-shadow': '0 0 10px rgba(0, 229, 255, 0.3)'
      });
      
      // 
      var style = document.createElement('style');
      style.textContent = `
        .dataTables_scrollBody::-webkit-scrollbar {
          width: 12px;
          height: 12px;
        }
        .dataTables_scrollBody::-webkit-scrollbar-track {
          background: #0a0e1a;
          border-radius: 6px;
          border: 1px solid rgba(0, 229, 255, 0.2);
        }
        .dataTables_scrollBody::-webkit-scrollbar-thumb {
          background: linear-gradient(135deg, #00e5ff, #0084ff);
          border-radius: 6px;
          box-shadow: 0 0 10px rgba(0, 229, 255, 0.5);
        }
        .dataTables_scrollBody::-webkit-scrollbar-thumb:hover {
          background: linear-gradient(135deg, #00ffff, #00e5ff);
          box-shadow: 0 0 20px rgba(0, 229, 255, 0.8);
        }
        .dataTables_scrollBody::-webkit-scrollbar-corner {
          background: #0a0e1a;
        }
        .dataTables_scroll {
          overflow-x: auto !important;
        }
      `;
      document.head.appendChild(style);
    }
  ")

tabla_inicial

2.4 Descripción del modelo

La implementación del análisis se estructura en cuatro etapas secuenciales, cada una construida sobre los resultados de la anterior, garantizando que la información y patrones descubiertos se preserven y amplifiquen a través del pipeline de análisis.

2.4.1 Preparación y Estandarización de Datos

Previo a cualquier análisis multivariado, es fundamental estandarizar las variables originales para garantizar que todas contribuyan en igualdad de condiciones al cálculo de componentes principales (KeepCoding, 2025). La estandarización se realizó mediante la transformación z-score: \(Z_i = \frac{X_i - \mu_i}{\sigma_i}\) donde \(Z_i\) es la variable estandarizada, \(X_i\) la variable original, \(\mu_i\) la media y \(\sigma_i\) la desviación estándar.

Esta estandarización es crítica porque el análisis de componentes principales se fundamenta en la varianza de los datos: sin estandarizar, variables con escalas numéricas mayores (como población total en millones) dominarían el cálculo de componentes, distorsionando la interpretación y otorgando influencia desproporcionada a magnitudes en lugar de patrones (LinkedIn, 2023; Ciencia de Datos, 2016). Adicionalmente, la estandarización garantiza que el análisis capture relaciones entre variables y no simplemente diferencias en escala.

2.4.2 Análisis de Componentes Principales (ACP)

Con las 17 variables estandarizadas, se aplica el Análisis de Componentes Principales para transformar el conjunto de variables originales, potencialmente correlacionadas, en un conjunto menor de componentes principales ortogonales (Jolliffe, 2002; OpenWebinars, 2025). El ACP identifica las direcciones en el espacio de datos donde la varianza es máxima, creando nuevas dimensiones (componentes) que son combinaciones lineales ponderadas de las variables originales (Jolliffe, 2002; KeepCoding, 2025).

Matemáticamente, el ACP comienza construyendo la matriz de covarianza \(C\) de las variables estandarizadas, cuyas entradas representan cómo varían conjuntamente pares de variables (KeepCoding, 2025). Los vectores propios de esta matriz de covarianza definen las direcciones principales (componentes), ordenados según sus correspondientes valores propios, que representan la cantidad de varianza explicada en cada dirección (Jolliffe, 2002). El primer componente principal captura la máxima varianza; el segundo, la máxima varianza restante sujeto a ortogonalidad respecto al primero; y así sucesivamente (Jolliffe, 2002).

El objetivo es identificar cuántos componentes son necesarios para capturar la mayor parte de la varianza total de los datos—típicamente entre 70-90% según el contexto (OpenWebinars, 2025). Esto permite reducir significativamente la dimensionalidad: en lugar de trabajar con 17 variables potencialmente redundantes, se trabaja con un número reducido de componentes sintéticos que capturan la esencia de la heterogeneidad internacional (Jolliffe, 2002).

2.4.3 Cálculo de Distancias Euclidianas

Una vez obtenidos los componentes principales, se utiliza la distancia euclidiana como métrica de disimilaridad entre países. Para cada par de países, la distancia euclidiana se calcula como:

\[ d_{ij} = \sqrt{\sum_{k=1}^{p} (PC_{ik} - PC_{jk})^2} \] Donde:

  • \(d_{ij}\) = Distancia euclidiana entre los países \(i\) y \(j\)
  • \(p\) = Número de componentes principales utilizados
  • \(PC_{ik}\) = Valor del \(k\)-ésimo componente principal para el país \(i\)
  • \(PC_{jk}\) = Valor del \(k\)-ésimo componente principal para el país \(j\)

Esta distancia mide la proximidad multidimensional entre países: distancias pequeñas indican perfiles similares, distancias grandes indican disimilaridad (Universidad de Granada, 2016; ArcGIS, 2024).

La distancia euclidiana es particularmente apropiada para el método de Ward porque, en su implementación aglomerativa, se utiliza el cuadrado de la distancia euclidiana—formalmente conocida como “distancia euclidiana semicuadrada”—como medida de disimilaridad (Ward, 1963; Wikipedia, 2013; TIBCO, 2024).

2.4.4 Clusterización Jerárquica Aglomerativa con Método de Ward

El método de Ward es un algoritmo jerárquico aglomerativo que opera iterativamente sobre el conjunto de países para formar una jerarquía de clusters (Ward, 1963). El procedimiento inicia considerando cada país como un cluster individual independiente, creando n grupos iniciales. En cada iteración subsecuente, se identifican los dos clusters más próximos según el criterio de Ward y se fusionan en un único cluster más grande (Ward, 1963; Universidad de Granada, 2016; ICESI, 2025).

El criterio de Ward minimiza específicamente la suma total de cuadrados dentro de los clusters (within-cluster sum of squares, WCSS). Matemáticamente, en cada paso, Ward selecciona el par de clusters cuya fusión produce el incremento mínimo en la varianza total intra-cluster (Ward, 1963; Wikipedia, 2013).

El algoritmo se ejecuta recursivamente hasta que todos los países quedan englobados en un único cluster. El resultado es un dendrograma—diagrama en forma de árbol invertido—que visualiza el proceso completo de fusión: cada rama representa un país individual, cada nodo de fusión representa la unión de dos clusters, y la altura de cada nodo indica el nivel de disimilaridad en el cual ocurrió la fusión (Universidad de Granada, 2016; ICESI, 2025). El dendrograma permite identificar visualmente el número óptimo de clusters “cortando” el árbol a un nivel específico de altura, determinando así cuántos grupos finales son más interpretables y útiles (Ward, 1963; Universidad de Granada, 2016).

En síntesis, el modelo integra: (1) estandarización para igualar contribuciones relativas, (2) reducción de dimensionalidad mediante ACP para simplificar sin perder información, (3) cálculo de distancias euclidianas para cuantificar disimilaridad, y (4) clusterización jerárquica Ward para crear una taxonomía multidimensional de desarrollo. Esta arquitectura metodológica asegura que los agrupamientos emergentes sean producto exclusivamente de los datos y no de imposiciones externas, permitiendo descubrimientos genuinos sobre la estructura del desarrollo internacional (Jolliffe, 2002; Charrad et al., 2014).


3 Análisis Descriptivo

Antes de aplicar la reducción dimensional mediante Análisis de Componentes Principales y revelar agrupamientos multidimensionales de países, es fundamental explorar cómo se distribuyen y relacionan los indicadores individuales en el espacio observable. El análisis descriptivo identifica relaciones preliminares, heterogeneidades sistemáticas y anomalías en cada dimensión del desarrollo, información que prepara conceptualmente para el descubrimiento de clusters coherentes. En esencia: mientras que el ACP responderá “¿qué estructura latente subyace en los datos?”, el análisis descriptivo responde “¿qué patrones visibles anticipan esa estructura?” Las cinco dimensiones temáticas económica, de salud, tecnológica, ambiental y demográficase, examinan secuencialmente a través de visualizaciones interactivas que revelan líderes y rezagados en cada indicador, patrones de asociación entre variables dentro de dimensiones, y diferencias regionales que anticipan los agrupamientos posteriores. Este enfoque dimensional permite reconocer que el “desarrollo” no es una variable única sino un fenómeno multifacético donde países pueden destacar en algunas áreas mientras quedan rezagados en otras—precisamente la complejidad que justifica un análisis multivariado integrado.

3.1 Explorador Interactivo de Indicadores

Con el propósito de facilitar el análisis exploratorio de cada una de las 17 variables de desarrollo de forma individual, se ha desarrollado un explorador interactivo que permite examinar dinámicamente la distribución, dispersión y rankings de cada indicador. Esta herramienta opera sobre todo el dataset y proporciona tres niveles de información complementarios: (1) estadísticas globales que resumen la concentración y dispersión de cada variable (media, mediana, desviación estándar, percentiles), (2) ranking de los 10 países líderes en cada indicador, y (3) variabilidad porcentual respecto a la media, que cuantifica cuánto cada país se desvía del patrón global.

El explorador funciona mediante un sistema de pestañas interactivas: selecciona cualquier variable haciendo click en sus botones para visualizar simultáneamente las estadísticas agregadas y el top 10 de desempeño. Esta estructura permite identificar patrones preliminares de concentración, identificar outliers extremos, y reconocer diferenciaciones regionales antes de proceder al análisis multidimensional integrado. A continuación se presentan dos ejemplos ilustrativos que ejemplifican la heterogeneidad fundamental del desarrollo global.

variables_numericas <- names(Base_2022)[3:ncol(Base_2022)]

crear_tabla_unificada <- function(data, variable) {
  valores <- data[[variable]]
  
  total_paises <- sum(!is.na(valores))
  media <- round(mean(valores, na.rm = TRUE), 2)
  mediana <- round(median(valores, na.rm = TRUE), 2)
  desv_est <- round(sd(valores, na.rm = TRUE), 2)
  q1 <- round(quantile(valores, 0.25, na.rm = TRUE), 2)
  q3 <- round(quantile(valores, 0.75, na.rm = TRUE), 2)
  minimo <- round(min(valores, na.rm = TRUE), 2)
  maximo <- round(max(valores, na.rm = TRUE), 2)
  
  top10 <- data %>%
    select(Pais, Valor = all_of(variable)) %>%
    arrange(desc(Valor)) %>%
    head(10) %>%
    mutate(
      Ranking = row_number(),
      Pct_vs_Media = round((Valor / media - 1) * 100, 1)
    )
  
  estadisticas <- data.frame(
    Métrica = c("Total Países", "Media", "Mediana", "Desv. Est.", 
                "Q1", "Q3", "Mínimo", "Máximo"),
    Valor = c(total_paises, media, mediana, desv_est, q1, q3, minimo, maximo)
  )
  
  top10_tabla <- top10 %>%
    mutate(
      Pct_Display = paste0(ifelse(Pct_vs_Media >= 0, "+", ""), Pct_vs_Media, "%"),
      Pct_Color = ifelse(Pct_vs_Media >= 0, "#00e676", "#ff1744")
    ) %>%
    select(Ranking, País = Pais, Valor, Pct_Display, Pct_Color)
  
  list(estadisticas = estadisticas, top10 = top10_tabla)
}

Tabla 7: Selecciona una Variable

for (variable in variables_numericas) {
  cat(sprintf('\n\n#### %s {.unnumbered}\n\n', variable))
  
  datos <- crear_tabla_unificada(Base_2022, variable)
  
  cat('<div class="two-column-layout">\n\n')
  
  cat('<div class="table-container">\n\n')
  
  cat('<p class="section-title"> Estadísticas Globales</p>\n\n')
  
  tabla_stats <- datos$estadisticas %>%
    kbl(
      align = c('l', 'r'), 
      escape = FALSE,
      col.names = c("Métrica", "Valor")
    ) %>%
    kable_styling(
      bootstrap_options = c("striped", "hover"),
      full_width = TRUE,
      font_size = 13
    ) %>%
    row_spec(0, background = "#00e5ff", color = "#000", bold = TRUE, font_size = 14) %>%
    row_spec(1, background = "#12161f", color = "#00e5ff", bold = TRUE, font_size = 14) %>%
    row_spec(2:8, background = "#0d1117", color = "#e0e6ed") %>%
    column_spec(1, width = "14em", bold = TRUE, color = "#e0e6ed") %>%
    column_spec(2, width = "10em", color = "#00e5ff", bold = TRUE)
  
  print(tabla_stats)
  
  cat('\n\n</div>\n\n')
  
  cat('<div class="table-container">\n\n')
  
  cat('<p class="section-title"> Top 10 Países</p>\n\n')
  
  tabla_top10_data <- datos$top10 %>%
    mutate(
      Pct_Display_Colored = cell_spec(
        Pct_Display,
        "html",
        color = Pct_Color,
        bold = TRUE
      )
    ) %>%
    select(`#` = Ranking, País, Valor, `% vs Media` = Pct_Display_Colored)
  
  tabla_top10 <- tabla_top10_data %>%
    kbl(
      align = c('c', 'l', 'r', 'c'), 
      escape = FALSE
    ) %>%
    kable_styling(
      bootstrap_options = c("striped", "hover"),
      full_width = TRUE,
      font_size = 13
    ) %>%
    row_spec(0, background = "#0084ff", color = "#000", bold = TRUE, font_size = 14) %>%
    row_spec(1:10, background = "#0d1117", color = "#e0e6ed") %>%
    column_spec(1, width = "3em", bold = TRUE, color = "#000", background = "#00e5ff") %>%
    column_spec(2, width = "13em", bold = TRUE) %>%
    column_spec(3, width = "9em", color = "#00e5ff", bold = TRUE)
  
  print(tabla_top10)
  
  cat('\n\n</div>\n\n')
  
  cat('</div>\n\n')
}

PIB_per

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 17288.25
Mediana 6705.15
Desv. Est. 22944.62
Q1 2520.86
Q3 21806.85
Mínimo 250.63
Máximo 109269.52

Top 10 Países

# País Valor % vs Media
1 Norway 109269.52 +532%
2 Ireland 105234.51 +508.7%
3 Switzerland 94394.51 +446%
4 Qatar 88701.46 +413.1%
5 United States 77860.91 +350.4%
6 Iceland 75121.02 +334.5%
7 Denmark 68091.32 +293.9%
8 Australia 64997.01 +276%
9 Netherlands 59123.32 +242%
10 Sweden 55296.94 +219.9%

Poblacion

Estadísticas Globales

Métrica Valor
Total Países 136
Media 50728185
Mediana 10435607
Desv. Est. 175868822
Q1 2949316
Q3 33230724
Mínimo 33755
Máximo 1425423212

Top 10 Países

# País Valor % vs Media
1 India 1425423212 +2709.9%
2 China 1412175000 +2683.8%
3 United States 334017321 +558.4%
4 Indonesia 278830529 +449.7%
5 Pakistan 243700667 +380.4%
6 Brazil 210306415 +314.6%
7 Bangladesh 169384897 +233.9%
8 Russian Federation 144236933 +184.3%
9 Mexico 128613117 +153.5%
10 Japan 125124989 +146.7%

Esperanza vida

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 73.49
Mediana 74.35
Desv. Est. 6.77
Q1 68.16
Q3 78.34
Mínimo 56.81
Máximo 85.71

Top 10 Países

# País Valor % vs Media
1 San Marino 85.70800 +16.6%
2 Japan 83.99634 +14.3%
3 Switzerland 83.60488 +13.8%
4 Australia 83.20000 +13.2%
5 Spain 83.13415 +13.1%
6 Sweden 83.05854 +13%
7 Israel 82.70000 +12.5%
8 Italy 82.70000 +12.5%
9 Korea, Rep.  82.68049 +12.5%
10 Ireland 82.50976 +12.3%

Acceso electricidad

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 88.27
Mediana 100.00
Desv. Est. 22.08
Q1 90.95
Q3 100.00
Mínimo 10.30
Máximo 100.00

Top 10 Países

# País Valor % vs Media
1 Albania 100 +13.3%
2 Algeria 100 +13.3%
3 Antigua and Barbuda 100 +13.3%
4 Argentina 100 +13.3%
5 Armenia 100 +13.3%
6 Australia 100 +13.3%
7 Austria 100 +13.3%
8 Azerbaijan 100 +13.3%
9 Bahamas, The 100 +13.3%
10 Belarus 100 +13.3%

Area boscosa

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 30.64
Mediana 30.66
Desv. Est. 20.66
Q1 12.26
Q3 45.17
Mínimo 0.00
Máximo 90.09

Top 10 Países

# País Valor % vs Media
1 Solomon Islands 90.08610 +194%
2 Finland 73.72650 +140.6%
3 Bhutan 71.55218 +133.5%
4 Guinea-Bissau 69.81259 +127.8%
5 Sweden 68.69967 +124.2%
6 Japan 68.40878 +123.3%
7 Korea, Rep.  64.21107 +109.6%
8 Congo, Rep.  64.17570 +109.5%
9 Fiji 63.12972 +106%
10 Timor-Leste 61.75521 +101.6%

Suscripciones movil

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 117.34
Mediana 117.41
Desv. Est. 30.82
Q1 101.61
Q3 135.29
Mínimo 39.71
Máximo 207.28

Top 10 Países

# País Valor % vs Media
1 Montenegro 207.278 +76.6%
2 Antigua and Barbuda 200.541 +70.9%
3 El Salvador 183.249 +56.2%
4 Botswana 178.205 +51.9%
5 Thailand 176.223 +50.2%
6 Japan 168.603 +43.7%
7 Russian Federation 168.476 +43.6%
8 Kuwait 168.350 +43.5%
9 Mauritius 164.309 +40%
10 Qatar 162.249 +38.3%

Crecimiento PIB

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 4.52
Mediana 4.56
Desv. Est. 4.29
Q1 2.69
Q3 6.30
Mínimo -20.54
Máximo 19.79

Top 10 Países

# País Valor % vs Media
1 Fiji 19.792727 +337.9%
2 Cabo Verde 15.843676 +250.5%
3 Maldives 13.826090 +205.9%
4 Armenia 12.600000 +178.8%
5 Saudi Arabia 12.000587 +165.5%
6 Niger 11.900000 +163.3%
7 Georgia 10.958532 +142.4%
8 Bahamas, The 10.877455 +140.7%
9 Panama 10.769666 +138.3%
10 Antigua and Barbuda 9.107806 +101.5%

Mortalidad infantil

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 17.15
Mediana 11.40
Desv. Est. 16.18
Q1 3.90
Q3 24.77
Mínimo 1.40
Máximo 68.30

Top 10 Países

# País Valor % vs Media
1 Niger 68.3 +298.3%
2 Guinea 63.1 +267.9%
3 Mali 59.0 +244%
4 Sierra Leone 58.0 +238.2%
5 Lesotho 57.6 +235.9%
6 Pakistan 51.8 +202%
7 Cote d’Ivoire 47.9 +179.3%
8 Benin 47.7 +178.1%
9 Mozambique 46.5 +171.1%
10 Burkina Faso 46.1 +168.8%

Inversion extranjera

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 4.20
Mediana 2.55
Desv. Est. 11.18
Q1 1.37
Q3 4.67
Mínimo -8.42
Máximo 126.08

Top 10 Países

# País Valor % vs Media
1 Malta 126.084088 +2902%
2 Antigua and Barbuda 16.783225 +299.6%
3 Mozambique 16.004295 +281.1%
4 Mauritania 14.664421 +249.2%
5 Mongolia 14.605306 +247.7%
6 Montenegro 14.006201 +233.5%
7 Maldives 11.845476 +182%
8 Senegal 10.541124 +151%
9 Gambia, The 10.499586 +150%
10 Sweden 9.318342 +121.9%

Gasto salud

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 7.00
Mediana 7.20
Desv. Est. 2.77
Q1 4.55
Q3 8.89
Mínimo 2.18
Máximo 16.50

Top 10 Países

# País Valor % vs Media
1 United States 16.49614 +135.7%
2 Timor-Leste 14.32455 +104.6%
3 Lesotho 12.65128 +80.7%
4 Germany 12.60513 +80.1%
5 France 11.88190 +69.7%
6 Marshall Islands 11.73604 +67.7%
7 Switzerland 11.70653 +67.2%
8 Japan 11.42184 +63.2%
9 Austria 11.15729 +59.4%
10 United Kingdom 11.05088 +57.9%

Uso internet

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 70.38
Mediana 78.71
Desv. Est. 24.51
Q1 55.78
Q3 89.09
Mínimo 11.00
Máximo 100.00

Top 10 Países

# País Valor % vs Media
1 Saudi Arabia 100.0000 +42.1%
2 Iceland 99.8082 +41.8%
3 Kuwait 99.7237 +41.7%
4 Qatar 99.6528 +41.6%
5 Norway 99.0000 +40.7%
6 Denmark 97.8601 +39%
7 Malaysia 97.3986 +38.4%
8 Korea, Rep.  97.1686 +38.1%
9 Australia 97.0424 +37.9%
10 Ireland 96.6206 +37.3%

Importaciones

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 51.27
Mediana 46.08
Desv. Est. 26.43
Q1 31.27
Q3 65.03
Mínimo 15.06
Máximo 173.02

Top 10 Países

# País Valor % vs Media
1 San Marino 173.02372 +237.5%
2 Djibouti 143.03467 +179%
3 Malta 115.00492 +124.3%
4 Slovak Republic 104.93886 +104.7%
5 Cyprus 102.01066 +99%
6 Belgium 96.69985 +88.6%
7 Lesotho 95.86760 +87%
8 Ireland 95.44505 +86.2%
9 Hungary 94.30488 +83.9%
10 North Macedonia 93.36196 +82.1%

Exportaciones

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 45.80
Mediana 41.02
Desv. Est. 29.68
Q1 25.58
Q3 56.58
Mínimo 4.97
Máximo 197.41

Top 10 Países

# País Valor % vs Media
1 San Marino 197.41235 +331%
2 Djibouti 159.25074 +247.7%
3 Ireland 136.68444 +198.4%
4 Malta 128.41046 +180.4%
5 Cyprus 105.62177 +130.6%
6 Slovak Republic 98.99011 +116.1%
7 Netherlands 96.44362 +110.6%
8 Belgium 95.23960 +107.9%
9 Slovenia 93.98266 +105.2%
10 Viet Nam 93.42013 +104%

Tierra cultivable

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 16.54
Mediana 12.54
Desv. Est. 14.17
Q1 5.82
Q3 24.52
Mínimo 0.13
Máximo 60.78

Top 10 Países

# País Valor % vs Media
1 Bangladesh 60.78382 +267.5%
2 Denmark 59.00000 +256.7%
3 Moldova 56.75182 +243.1%
4 India 51.80548 +213.2%
5 Burundi 50.37027 +204.5%
6 Rwanda 50.20054 +203.5%
7 Togo 48.72219 +194.6%
8 Hungary 45.55853 +175.4%
9 Gambia, The 43.47826 +162.9%
10 Pakistan 39.21492 +137.1%

Crecimiento poblacion

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 1.11
Mediana 0.97
Desv. Est. 1.39
Q1 0.29
Q3 1.99
Mínimo -3.17
Máximo 5.91

Top 10 Países

# País Valor % vs Media
1 Qatar 5.907018 +432.2%
2 Kuwait 5.113181 +360.6%
3 Oman 4.980137 +348.7%
4 Saudi Arabia 4.418920 +298.1%
5 Niger 3.251706 +192.9%
6 Congo, Dem. Rep.  3.223402 +190.4%
7 Mali 3.009426 +171.1%
8 Uganda 3.007595 +171%
9 Tanzania 2.950467 +165.8%
10 Mozambique 2.947343 +165.5%

Industria

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 27.03
Mediana 25.34
Desv. Est. 11.59
Q1 20.12
Q3 31.75
Mínimo 2.39
Máximo 65.77

Top 10 Países

# País Valor % vs Media
1 Kuwait 65.76633 +143.3%
2 Qatar 65.34890 +141.8%
3 Iraq 65.27212 +141.5%
4 Oman 59.48521 +120.1%
5 Azerbaijan 56.14674 +107.7%
6 Timor-Leste 54.51234 +101.7%
7 Saudi Arabia 53.12377 +96.5%
8 Congo, Rep.  49.24555 +82.2%
9 Norway 49.12890 +81.8%
10 Congo, Dem. Rep.  47.77963 +76.8%

Remesas

Estadísticas Globales

Métrica Valor
Total Países 136.00
Media 5.94
Mediana 2.18
Desv. Est. 9.49
Q1 0.47
Q3 6.74
Mínimo 0.01
Máximo 53.22

Top 10 Países

# País Valor % vs Media
1 Nepal 53.22215 +796%
2 Tajikistan 49.89531 +740%
3 Tonga 41.94160 +606.1%
4 Samoa 33.61166 +465.9%
5 Lebanon 30.65552 +416.1%
6 Honduras 27.00110 +354.6%
7 Kyrgyz Republic 26.57756 +347.4%
8 El Salvador 24.63437 +314.7%
9 Gambia, The 22.76212 +283.2%
10 Lesotho 22.61587 +280.7%

El análisis del conjunto de los indicadores revela una característica fundamental: la desigualdad internacional no es uniforme sino específica a cada dimensión de desarrollo. Mientras que el PIB per cápita muestra una concentración extrema (media $17,045.36 vs. mediana $6,705.15, indicando que el 50% de países está por debajo de apenas $6,705), la población exhibe un patrón radicalmente distinto de concentración geográfica en gigantes asiáticos (media 49.6 millones vs. mediana 10.4 millones). Esta variabilidad específica a cada variable es precisamente lo que genera la complejidad multidimensional del desarrollo: países pueden sobresalir en algunas áreas (por ejemplo, esperanza de vida alta pero PIB bajo, como Costa Rica) mientras quedan rezagados en otras (por ejemplo, PIB alto pero vulnerabilidad ambiental, como algunos productores de petróleo). El explorador revela estas heterogeneidades al visualizar que en algunas variables existe concentración extrema (desv. est. > 3x la media), mientras que en otras la dispersión es más moderada, lo que puede indicar que el ACP identificará dimensiones donde la varianza es máxima y donde se concentra realmente la diferencia internacional.

3.2 Análisis por Dimensiones

3.2.1 Dimensión Económica

La economía de un país no puede resumirse en una sola métrica. Mientras que el PIB per cápita mide riqueza acumulada, el crecimiento PIB revela dinamismo presente; la inversión extranjera indica atracción de capitales internacionales, las remesas reflejan dependencia de migrantes, la industria representa capacidad productiva, y exportaciones/importaciones capturan integración comercial global. Siete indicadores que juntos ofrecen perspectiva más completa que ninguno por separado.

El explorador interactivo a continuación permite comparar dinámicamente cómo países lideran en dimensiones distintas. Selecciona cualquier variable mediante los botones superiores para reordenar el ranking de top 15 países y observar cómo cambia el liderazgo económico según la métrica.

preparar_top15 <- function(data, variable, nombre_var) {
  resultado <- data %>%
    filter(!is.na(!!sym(variable)) & !!sym(variable) > 0) %>%
    arrange(desc(!!sym(variable))) %>%
    slice_head(n = 15) %>%
    arrange(!!sym(variable)) %>%
    mutate(
      Pais_label = Pais,
      Valor = !!sym(variable),
      Nombre_Variable = nombre_var
    ) %>%
    select(Pais_label, Valor, Nombre_Variable)
  
  return(resultado)
}

vars_config <- list(
  list(var = "PIB_per", nombre = "PIB per cápita (US$)", color = "#00e676"),
  list(var = "Crecimiento PIB", nombre = "Crecimiento PIB (% anual)", color = "#0084ff"),
  list(var = "Inversion extranjera", nombre = "Inversión Extranjera Directa (% PIB)", color = "#ffd600"),
  list(var = "Remesas", nombre = "Remesas recibidas (% PIB)", color = "#a259ff"),
  list(var = "Industria", nombre = "Industria (% PIB)", color = "#ff6b00"),
  list(var = "Exportaciones", nombre = "Exportaciones (% PIB)", color = "#00e5ff"),
  list(var = "Importaciones", nombre = "Importaciones (% PIB)", color = "#ff1744")
)

datasets <- lapply(seq_along(vars_config), function(i) {
  config <- vars_config[[i]]
  preparar_top15(Base_2022, config$var, config$nombre)
})

p <- plot_ly()

for (i in seq_along(vars_config)) {
  config <- vars_config[[i]]
  
  if(nrow(datasets[[i]]) > 0) {
    p <- p %>%
      add_trace(
        x = datasets[[i]]$Valor,
        y = datasets[[i]]$Pais_label,
        type = 'bar',
        orientation = 'h',
        marker = list(
          color = config$color, 
          line = list(color = '#ffffff', width = 1.5)
        ),
        text = format(round(datasets[[i]]$Valor, 2), big.mark = ",", scientific = FALSE),
        textposition = 'outside',
        textfont = list(color = '#00e5ff', size = 13, family = "Arial"),
        customdata = datasets[[i]]$Nombre_Variable,
        hovertemplate = paste0(
          "<b style='color:#000000; font-size:14px; background-color:#ffffff; padding:5px; border-radius:3px;'>%{y}</b><br>",
          "<span style='color:#1a1a1a;'><b>%{customdata}:</b></span><br>",
          "<b style='color:#b35900; font-size:16px;'>%{x:.2f}</b>",
          "<extra></extra>"
        ),
        name = config$nombre,
        visible = (i == 1),
        showlegend = FALSE
      )
  }
}

p %>%
  layout(
    title = list(
      text = paste0(
        "<b style='color:#00e5ff; font-size:24px;'>Figura 1: Top 15 Países - ", 
        vars_config[[1]]$nombre, 
        "</b><br>",
        "<span style='color:#8b92a0; font-size:14px;'>Año 2022 | Selecciona una variable para cambiar</span>"
      ),
      x = 0.5,
      xanchor = 'center',
      y = 0.95
    ),
    xaxis = list(
      title = paste0("<b style='font-size:16px;'>", vars_config[[1]]$nombre, "</b>"),
      gridcolor = '#12161f',
      showgrid = TRUE,
      zeroline = TRUE,
      zerolinewidth = 2,
      zerolinecolor = "rgba(0, 229, 255, 0.5)",
      tickfont = list(color = '#8b92a0', size = 13),
      titlefont = list(color = '#e0e6ed', size = 16),
      range = c(0, max(datasets[[1]]$Valor) * 1.15)
    ),
    
    yaxis = list(
      title = "<b style='font-size:16px;'>País</b>",
      tickfont = list(color = '#e0e6ed', size = 13),
      titlefont = list(color = '#e0e6ed', size = 16),
      categoryorder = "array",
      categoryarray = rev(datasets[[1]]$Pais_label),
      automargin = TRUE
    ),
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 13),
    margin = list(l = 180, r = 50, b = 80, t = 120),
    hovermode = 'closest',
    hoverlabel = list(
      bgcolor = "#ffffff",
      bordercolor = "#00e5ff",
      font = list(color = "#000000", size = 13, family = "Arial")
    ),
    
    updatemenus = list(
      list(
        buttons = lapply(seq_along(vars_config), function(i) {
          config <- vars_config[[i]]
          
          visible <- rep(FALSE, length(vars_config))
          visible[i] <- TRUE
          
          list(
            label = strsplit(config$nombre, " \\(")[[1]][1],
            method = "update",
            args = list(
              list(visible = visible),
              list(
                title = paste0(
                  "<b style='color:#00e5ff; font-size:24px;'>Figura 1: top 15 Países - ", 
                  config$nombre, 
                  "</b><br>",
                  "<span style='color:#8b92a0; font-size:14px;'>Año 2022 | Selecciona una variable para cambiar</span>"
                ),
                "xaxis.title" = paste0("<b style='font-size:16px;'>", config$nombre, "</b>"),
                "xaxis.range" = c(0, max(datasets[[i]]$Valor) * 1.15),
                "yaxis.categoryarray" = rev(datasets[[i]]$Pais_label)
              )
            )
          )
        }),
        
        direction = "down",
        pad = list(r = 10, t = 10),
        showactive = TRUE,
        x = 0.02,
        xanchor = "left",
        y = 1.02,
        yanchor = "bottom",
        bgcolor = "rgba(162, 89, 255, 0.25)",
        bordercolor = "#a259ff",
        borderwidth = 2,
        font = list(size = 12, color = "#a259ff", family = "Arial")
      )
    )
  ) %>%
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "top15_economia_2022",
      width = 1600,
      height = 900
    )
  )

El análisis de los distintos indicadores revela una marcada heterogeneidad entre países. Aquellos que lideran en una métrica no necesariamente mantienen posiciones similares en otras. Por ejemplo, Noruega encabeza el PIB per cápita, mientras que el crecimiento económico destaca en países distintos; Malta sobresale en inversión extranjera y Nepal en remesas.

Las economías europeas dominan en PIB per cápita, pero en crecimiento, inversión o remesas surgen países de otras regiones. Además, las magnitudes y dispersiones difieren entre variables, lo que sugiere que cada indicador refleja dimensiones particulares del desempeño económico nacional.

3.2.2 Dimensión Salud y Bienestar

La Figura 2 presenta la relación bidimensional entre esperanza de vida al nacer y mortalidad infantil, dos indicadores fundamentales del desempeño sanitario global. Estos indicadores capturan realidades complementarias: mientras la esperanza de vida refleja el resultado acumulado de mejoras en salud a lo largo de toda la vida, la mortalidad infantil es particularmente sensible a la calidad inmediata de la atención materno-infantil, acceso a saneamiento e infraestructura básica (WHO, 2020).

El gráfico interactivo es especialmente informativo: al pasar el cursor sobre cada punto (país), se despliegan simultáneamente tres dimensiones de salud—esperanza de vida, mortalidad infantil y gasto público en salud—permitiendo identificar si los países con mejor desempeño en longevidad genuinamente invierten recursos en su sistema de salud o si tienen patrones anómalos.

asignar_continentes <- function(data) {
  continentes_map <- c(
    "Argentina" = "Americas", "Bahamas, The" = "Americas", "Barbados" = "Americas",
    "Belize" = "Americas", "Bolivia" = "Americas", "Brazil" = "Americas",
    "Canada" = "Americas", "Chile" = "Americas", "Colombia" = "Americas",
    "Costa Rica" = "Americas", "Cuba" = "Americas", "Dominica" = "Americas",
    "Dominican Republic" = "Americas", "Ecuador" = "Americas", "El Salvador" = "Americas",
    "Grenada" = "Americas", "Guatemala" = "Americas", "Guyana" = "Americas",
    "Haiti" = "Americas", "Honduras" = "Americas", "Jamaica" = "Americas",
    "Mexico" = "Americas", "Nicaragua" = "Americas", "Panama" = "Americas",
    "Paraguay" = "Americas", "Peru" = "Americas", "St. Kitts and Nevis" = "Americas",
    "St. Lucia" = "Americas", "St. Vincent and the Grenadines" = "Americas",
    "Suriname" = "Americas", "Trinidad and Tobago" = "Americas", "United States" = "Americas",
    "Uruguay" = "Americas", "Venezuela, RB" = "Americas", "Antigua and Barbuda" = "Americas",
    
    "Albania" = "Europe", "Austria" = "Europe", "Belarus" = "Europe",
    "Belgium" = "Europe", "Bosnia and Herzegovina" = "Europe", "Bulgaria" = "Europe",
    "Croatia" = "Europe", "Cyprus" = "Europe", "Czech Republic" = "Europe",
    "Czechia" = "Europe", "Denmark" = "Europe", "Estonia" = "Europe",
    "Finland" = "Europe", "France" = "Europe", "Germany" = "Europe",
    "Greece" = "Europe", "Hungary" = "Europe", "Iceland" = "Europe",
    "Ireland" = "Europe", "Italy" = "Europe", "Kosovo" = "Europe",
    "Latvia" = "Europe", "Lithuania" = "Europe", "Luxembourg" = "Europe",
    "Malta" = "Europe", "Montenegro" = "Europe", "Netherlands" = "Europe",
    "North Macedonia" = "Europe", "Norway" = "Europe", "Poland" = "Europe",
    "Portugal" = "Europe", "Russian Federation" = "Europe", "Serbia" = "Europe",
    "Slovak Republic" = "Europe", "Slovakia" = "Europe", "Slovenia" = "Europe",
    "Spain" = "Europe", "Sweden" = "Europe", "Switzerland" = "Europe",
    "Turkey" = "Europe", "Turkiye" = "Europe", "Ukraine" = "Europe",
    "United Kingdom" = "Europe", "Armenia" = "Europe", "Azerbaijan" = "Europe",
    "Georgia" = "Europe", "Moldova" = "Europe", "Romania" = "Europe",
    "San Marino" = "Europe",
    
    "Afghanistan" = "Asia", "Bahrain" = "Asia", "Bangladesh" = "Asia",
    "Bhutan" = "Asia", "Brunei Darussalam" = "Asia", "Cambodia" = "Asia",
    "China" = "Asia", "Hong Kong SAR, China" = "Asia", "India" = "Asia",
    "Indonesia" = "Asia", "Iran, Islamic Rep." = "Asia", "Iraq" = "Asia",
    "Israel" = "Asia", "Japan" = "Asia", "Jordan" = "Asia",
    "Kazakhstan" = "Asia", "Korea, Dem. People's rep." = "Asia", "Korea, Rep." = "Asia",
    "Kuwait" = "Asia", "Kyrgyz Republic" = "Asia", "Lao PDR" = "Asia",
    "Lebanon" = "Asia", "Macao SAR, China" = "Asia", "Malaysia" = "Asia",
    "Maldives" = "Asia", "Mongolia" = "Asia", "Myanmar" = "Asia",
    "Nepal" = "Asia", "Oman" = "Asia", "Pakistan" = "Asia",
    "Philippines" = "Asia", "Qatar" = "Asia", "Saudi Arabia" = "Asia",
    "Singapore" = "Asia", "Sri Lanka" = "Asia", "Syrian Arab Republic" = "Asia",
    "Taiwan" = "Asia", "Tajikistan" = "Asia", "Thailand" = "Asia",
    "Timor-Leste" = "Asia", "Turkmenistan" = "Asia", "United Arab Emirates" = "Asia",
    "Uzbekistan" = "Asia", "Vietnam" = "Asia", "Viet Nam" = "Asia",
    "West Bank and Gaza" = "Asia", "Yemen, Rep." = "Asia",
    
    "Algeria" = "Africa", "Angola" = "Africa", "Benin" = "Africa",
    "Botswana" = "Africa", "Burkina Faso" = "Africa", "Burundi" = "Africa",
    "Cabo Verde" = "Africa", "Cameroon" = "Africa", "Central African Republic" = "Africa",
    "Chad" = "Africa", "Comoros" = "Africa", "Congo, Dem. Rep." = "Africa",
    "Congo, Rep." = "Africa", "Cote d'Ivoire" = "Africa", "Djibouti" = "Africa",
    "Egypt, Arab Rep." = "Africa", "Equatorial Guinea" = "Africa", "Eritrea" = "Africa",
    "Eswatini" = "Africa", "Ethiopia" = "Africa", "Gabon" = "Africa",
    "Gambia, The" = "Africa", "Ghana" = "Africa", "Guinea" = "Africa",
    "Guinea-Bissau" = "Africa", "Kenya" = "Africa", "Lesotho" = "Africa",
    "Liberia" = "Africa", "Libya" = "Africa", "Madagascar" = "Africa",
    "Malawi" = "Africa", "Mali" = "Africa", "Mauritania" = "Africa",
    "Mauritius" = "Africa", "Morocco" = "Africa", "Mozambique" = "Africa",
    "Namibia" = "Africa", "Niger" = "Africa", "Nigeria" = "Africa",
    "Rwanda" = "Africa", "Senegal" = "Africa", "Sierra Leone" = "Africa",
    "Somnia" = "Africa", "South Africa" = "Africa", "South Sudan" = "Africa",
    "Sudan" = "Africa", "Tanzania" = "Africa", "Togo" = "Africa",
    "Tunisia" = "Africa", "Uganda" = "Africa", "Zambia" = "Africa",
    "Zimbabwe" = "Africa",
    
    "Australia" = "Oceania", "Fiji" = "Oceania", "Kiribati" = "Oceania",
    "Marshall Islands" = "Oceania", "Micronesia, Fed. Sts." = "Oceania",
    "New Zealand" = "Oceania", "Palau" = "Oceania", "Samoa" = "Oceania",
    "Solomon Islands" = "Oceania", "Tonga" = "Oceania", "Vanuatu" = "Oceania"
  )
  
  data %>%
    mutate(Continente = ifelse(Pais %in% names(continentes_map),
                                continentes_map[Pais], NA))
}

datos_ev_mi <- Base_2022 %>%
  asignar_continentes() %>%
  filter(!is.na(`Esperanza vida`) & 
         !is.na(`Mortalidad infantil`) & 
         !is.na(`Gasto salud`) &
         !is.na(Continente)) %>%
  select(Pais, Continente, `Esperanza vida`, `Mortalidad infantil`, `Gasto salud`) %>%
  mutate(
    tooltip = paste0(
      "<b style='font-size:14px; color:#00e5ff;'>", Pais, "</b><br>",
      "<span style='color:#a259ff; font-size:11px;'>", Continente, "</span><br><br>",
      "<b style='color:#ffd600;'> INDICADORES DE SALUD:</b><br>",
      "├─ Esperanza de vida: <b style='color:#00e676;'>", 
      round(`Esperanza vida`, 1), " años</b><br>",
      "├─ Mortalidad infantil: <b style='color:#ff1744;'>", 
      round(`Mortalidad infantil`, 1), "/1,000</b><br>",
      "└─ Gasto en salud: <b style='color:#ffd600;'>", 
      round(`Gasto salud`, 2), "% PIB</b>"
    )
  )

p <- plot_ly(
  data = datos_ev_mi,
  x = ~`Esperanza vida`,
  y = ~`Mortalidad infantil`,
  color = ~Continente,
  colors = c(
    "Americas" = "green",
    "Europe" = "#0084ff",
    "Asia" = "#ffd600",
    "Africa" = "#ff1744",
    "Oceania" = "#a259ff"
  ),
  type = 'scatter',
  mode = 'markers',
  customdata = ~tooltip,
  hovertemplate = "%{customdata}<extra></extra>",
  marker = list(
    size = 14,
    opacity = 0.9,
    line = list(color = '#ffffff', width = 2)
  ),
  showlegend = TRUE
) %>%
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:24px;'>Figura 2: Esperanza de Vida vs Mortalidad Infantil</b><br>
               <span style='color:#8b92a0; font-size:14px;'>Año 2022 | Relación inversa: mejor salud = mayor EV y menor MI</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.95
    ),
    
    xaxis = list(
      title = "<b style='font-size:16px;'>Esperanza de vida al nacer (años)</b>",
      gridcolor = '#12161f',
      showgrid = TRUE,
      zeroline = FALSE,
      range = c(40, 90),  # Rango más amplio
      tickfont = list(color = '#8b92a0', size = 13),
      titlefont = list(color = '#e0e6ed', size = 16)
    ),
    
    yaxis = list(
      title = "<b style='font-size:16px;'>Mortalidad infantil (por 1,000 nacidos vivos)</b>",
      gridcolor = '#12161f',
      showgrid = TRUE,
      zeroline = FALSE,
      range = c(0, 110),
      tickfont = list(color = '#8b92a0', size = 13),
      titlefont = list(color = '#e0e6ed', size = 16)
    ),
    
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 13),
    
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    
    legend = list(
      title = list(text = "<b style='font-size:14px;'>Continente</b>", font = list(size = 14, color = "#00e5ff")),
      bgcolor = 'rgba(10,14,26,0.95)',
      bordercolor = '#00e5ff',
      borderwidth = 2,
      x = 0.99,  
      y = 0.99,  
      xanchor = "right",
      yanchor = "top",
      font = list(size = 13, color = "#e0e6ed")
    ),
    
    margin = list(l = 80, r = 120, b = 60, t = 100),  
    
    hovermode = 'closest',
    

    shapes = list(

      list(
        type = "rect",
        x0 = 75, x1 = 90,
        y0 = 0, y1 = 15,
        xref = "x", yref = "y",
        fillcolor = "rgba(0, 230, 118, 0.15)",
        line = list(color = "rgba(0, 230, 118, 0.7)", width = 2.5, dash = "dot"),
        layer = "below"
      ),
      
      list(
        type = "rect",
        x0 = 40, x1 = 65,
        y0 = 40, y1 = 110,
        xref = "x", yref = "y",
        fillcolor = "rgba(255, 23, 68, 0.15)",
        line = list(color = "rgba(255, 23, 68, 0.7)", width = 2.5, dash = "dot"),
        layer = "below"
      )
    ),
    
    annotations = list(
      list(
        x = 82.5, 
        y = 25,  
        text = "<b style='color:#00e676; font-size:13px;'>✓ ZONA ÓPTIMA</b><br><span style='color:#00e676; font-size:11px;'>Alta EV + Baja MI</span>",
        showarrow = FALSE,
        bgcolor = "rgba(0, 230, 118, 0.25)",
        bordercolor = "#00e676",
        borderwidth = 2,
        borderpad = 8,
        font = list(size = 11),
        xanchor = "center"
      ),
      
      list(
        x = 52.5, 
        y = 95, 
        text = "<b style='color:#ff1744; font-size:13px;'>⚠ ZONA CRÍTICA</b><br><span style='color:#ff1744; font-size:11px;'>Baja EV + Alta MI</span>",
        showarrow = FALSE,
        bgcolor = "rgba(255, 23, 68, 0.25)",
        bordercolor = "#ff1744",
        borderwidth = 2,
        borderpad = 8,
        font = list(size = 11),
        xanchor = "center"
      ),
      
      list(
        x = 0.02,
        y = -0.12,
        text = "<span style='color:#8b92a0; font-size:11px;'>Cada punto representa un país | Arrastra para zoom | Doble click para resetear</span>",
        showarrow = FALSE,
        xref = "paper",
        yref = "paper",
        xanchor = "left"
      ),
      
      list(
        x = 0.98,
        y = -0.12,
        text = "<span style='color:#8b92a0; font-size:11px;'>Correlación inversa fuerte: r = ~ -0.85</span>",
        showarrow = FALSE,
        xref = "paper",
        yref = "paper",
        xanchor = "right"
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "salud_poblacional_2022",
      width = 1800,  # Mayor resolución
      height = 1000
    )
  )

p

La gráfica evidencia una segregación geográfica pronunciada: los paises Europa y Oceanía se concentran casi completamente en la zona óptima, formando un grupo de alta longevidad y baja mortalidad infantil. En contraste, muchos paises de África ocupan predominantemente la zona crítica, con esperanza de vida entre 50-65 años y mortalidad infantil superior a 30 por mil nacidos vivos. Los paises de América exhiben una distribución intermedia con variabilidad interna significativa: mientras algunos países rondan los 75 años de EV, otros permanecen por debajo de 70. Los Asiaticos destacan por su extrema heterogeneidad: naciones desarrolladas se ubican en la zona óptima, mientras casos como Pakistan ilustran cómo países asiáticos pueden enfrentar desafíos sanitarios comparables a contextos africanos, a pesar de perfiles económicos distintos.

La marcada relación inversa evidencia que los sistemas de salud más robustos logran simultáneamente aumentar longevidad y reducir mortalidad infantil, señalando que ambas variables capturan la misma realidad subyacente: la calidad y accesibilidad de servicios sanitarios fundamentales.

3.2.3 Dimensión Tecnológica y de Conectividad

La conectividad digital es un mecanismo contemporáneo fundamental de inclusión económica, pero no es unidimensional: requiere infraestructura energética (acceso a electricidad), conectividad informática (uso de internet) y penetración móvil (suscripciones por habitante). Estas variables son complementarias pero pueden desacoplarse—un país puede tener electricidad universal pero baja adopción de internet, o inversamente, penetración móvil extraordinaria sin acceso eléctrico generalizado.

La Figura 3 desagrega estos indicadores en cinco paneles geográficos, donde el eje horizontal representa acceso a electricidad, el eje vertical uso de internet, y el tamaño de cada burbuja codifica suscripciones móviles. Una línea diagonal de referencia actúa como benchmark: países sobre ella tienen penetración digital que compensa acceso eléctrico limitado; países bajo ella exhiben brechas donde energía no se traduce en conectividad informática. Al pasar el cursor sobre cada burbuja, se despliegan los tres indicadores de conectividad específicos del país y continente.

datos_scatter_gg <- Base_2022 %>%
  asignar_continentes() %>%
  filter(
    !is.na(`Acceso electricidad`) & 
    !is.na(`Uso internet`) & 
    !is.na(`Suscripciones movil`) &
    !is.na(Continente) &
    Continente != "Otros"
  ) %>%
  mutate(
    Electricidad = `Acceso electricidad`,
    Internet = `Uso internet`,
    Movil = `Suscripciones movil`,
    Continente = factor(Continente, 
      levels = c("Africa", "Americas", "Asia", "Europe", "Oceania"))
  ) %>%
  arrange(Continente)

p_gg <- ggplot(datos_scatter_gg, aes(x = Electricidad, y = Internet)) +
  geom_abline(
    intercept = 0, 
    slope = 1, 
    linetype = "dashed",
    color = "#00e5ff",
    linewidth = 1,
    alpha = 0.3
  ) +
  geom_point(
    aes(
      fill = Continente,
      size = Movil,
      text = paste0(
        "<b style='font-size:14px;'>", Pais, "</b><br>",
        "<span style='color:#a259ff; font-size:11px;'>", Continente, "</span><br><br>",
        "<b style='color:#ffd600;'> INDICADORES</b><br>",
        "├─ 🔌 Electricidad: <b style='color:#00e676;'>", 
        round(Electricidad, 1), "%</b><br>",
        "├─ 🌐 Internet: <b style='color:#00e5ff;'>", 
        round(Internet, 1), "%</b><br>",
        "└─ 📱 Móviles: <b style='color:#ffd600;'>", 
        round(Movil, 1), "/100 hab.</b>"
      )
    ),
    alpha = 0.78,
    shape = 19,
    color = NA
  ) +
  scale_size_continuous(
    name = "Suscripciones Móviles\n(por 100 hab.)",
    range = c(2, 10),
    breaks = c(20, 50, 100, 150),
    labels = c("20", "50", "100", "150+")
  ) +
  geom_text_repel(
    aes(label = Pais),
    size = 2.8,
    color = "#e0e6ed",
    max.overlaps = 20,
    segment.color = "#00e5ff",
    segment.alpha = 0.3,
    segment.size = 0.3
  ) +
  facet_wrap(~Continente, ncol = 3) +
  scale_fill_manual(
    name = "Continente",
    values = c(
      "Africa" = "#ff1744",
      "Americas" = "#00e676",
      "Asia" = "#ffd600",
      "Europe" = "#0084ff",
      "Oceania" = "#a259ff"
    )
  ) +
  scale_x_continuous(limits = c(0, 105), breaks = seq(0, 100, 20)) +
  scale_y_continuous(limits = c(0, 105), breaks = seq(0, 100, 20)) +
  labs(
    title = " Figura 3: Infraestructura Digital",
    subtitle = "Año 2022 | Tamaño de burbuja = Suscripciones Móviles (por 100 hab)",
    x = "Acceso a Electricidad (% población)",
    y = "Uso de Internet (% población)"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    plot.background = element_rect(fill = "#000000", color = NA),
    panel.background = element_rect(fill = "#0a0e1a", color = NA),
    panel.grid.major = element_line(color = "#12161f", linewidth = 0.3),
    panel.grid.minor = element_line(color = "#12161f", linewidth = 0.2),
    
    plot.title = element_text(
      color = "#00e5ff",
      face = "bold",
      size = 16,
      hjust = 0.5,
      margin = margin(b = 8)
    ),
    plot.subtitle = element_text(
      color = "#8b92a0",
      size = 11,
      hjust = 0.5,
      margin = margin(b = 15),
      lineheight = 1.2,
      face = "italic"
    ),
    
    axis.title = element_text(
      color = "#e0e6ed",
      face = "bold",
      size = 11
    ),
    axis.text = element_text(color = "#8b92a0", size = 10),
    axis.line = element_line(color = "#00e5ff", linewidth = 0.4),
    
    strip.text = element_text(
      color = "#00e5ff",
      face = "bold",
      size = 12,
      margin = margin(b = 8)
    ),
    strip.background = element_rect(
      fill = "#1a1a3e",
      color = "#00e5ff",
      linewidth = 1.2
    ),
    
    legend.background = element_rect(
      fill = "#0a0e1a",
      color = "#00e5ff",
      linewidth = 1.2
    ),
    legend.text = element_text(color = "#e0e6ed", size = 11),
    legend.title = element_text(color = "#00e5ff", face = "bold", size = 12),
    legend.key = element_rect(fill = "#0a0e1a", color = NA),
    legend.key.size = unit(0.8, "cm"),
    legend.position = "right",
    legend.box = "vertical",
    legend.spacing.y = unit(0.5, "cm"),
    legend.margin = margin(10, 10, 10, 10),
    
    plot.margin = margin(15, 15, 15, 15)
  )

plotly_plot <- ggplotly(p_gg, tooltip = "text") %>%
  layout(
    legend = list(
      title = list(text = "<b>Continente</b>"),
      font = list(color = "#e0e6ed", size = 11),
      bgcolor = "rgba(10, 14, 26, 0.9)",
      bordercolor = "#00e5ff",
      borderwidth = 1,
      x = 1.05,
      y = 0.8,
      traceorder = "normal"
    ),
    annotations = list(
      list(
        x = 1.05,
        y = 0.45,
        xref = "paper",
        yref = "paper",
        text = "<b style='color:#00e5ff; font-size:12px;'>Suscripciones Móviles</b>",
        showarrow = FALSE,
        xanchor = "left",
        yanchor = "middle",
        font = list(size = 12, color = "#00e5ff")
      ),
      list(
        x = 1.02,
        y = 0.4,
        xref = "paper",
        yref = "paper",
        text = "●",
        showarrow = FALSE,
        xanchor = "center",
        yanchor = "middle",
        font = list(size = 15, color = "#8b92a0")
      ),
      list(
        x = 1.08,
        y = 0.4,
        xref = "paper",
        yref = "paper",
        text = "20",
        showarrow = FALSE,
        xanchor = "left",
        yanchor = "middle",
        font = list(size = 10, color = "#e0e6ed")
      ),
      list(
        x = 1.02,
        y = 0.35,
        xref = "paper",
        yref = "paper",
        text = "●",
        showarrow = FALSE,
        xanchor = "center",
        yanchor = "middle",
        font = list(size = 20, color = "#8b92a0")
      ),
      list(
        x = 1.08,
        y = 0.35,
        xref = "paper",
        yref = "paper",
        text = "50",
        showarrow = FALSE,
        xanchor = "left",
        yanchor = "middle",
        font = list(size = 10, color = "#e0e6ed")
      ),
      list(
        x = 1.02,
        y = 0.3,
        xref = "paper",
        yref = "paper",
        text = "●",
        showarrow = FALSE,
        xanchor = "center",
        yanchor = "middle",
        font = list(size = 25, color = "#8b92a0")
      ),
      list(
        x = 1.08,
        y = 0.3,
        xref = "paper",
        yref = "paper",
        text = "100",
        showarrow = FALSE,
        xanchor = "left",
        yanchor = "middle",
        font = list(size = 10, color = "#e0e6ed")
      ),
      list(
        x = 1.02,
        y = 0.25,
        xref = "paper",
        yref = "paper",
        text = "●",
        showarrow = FALSE,
        xanchor = "center",
        yanchor = "middle",
        font = list(size = 30, color = "#8b92a0")
      ),
      list(
        x = 1.08,
        y = 0.25,
        xref = "paper",
        yref = "paper",
        text = "150+",
        showarrow = FALSE,
        xanchor = "left",
        yanchor = "middle",
        font = list(size = 10, color = "#e0e6ed")
      ),
      list(
        x = 1.05,
        y = 0.18,
        xref = "paper",
        yref = "paper",
        text = "<span style='color:#8b92a0; font-size:10px;'>(por 100 habitantes)</span>",
        showarrow = FALSE,
        xanchor = "left",
        yanchor = "middle"
      )
    ),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    font = list(family = "Arial", color = "#e0e6ed"),
    margin = list(l = 50, r = 200, b = 50, t = 100)
  ) %>%
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "infraestructura_digital_final",
      width = 1200,
      height = 800
    )
  )

plotly_plot <- plotly_plot %>%
  style(showlegend = FALSE, traces = c(2:6))

plotly_plot

En África, países como Níger y Mali se concentran en el cuadrante inferior izquierdo (20-40% electricidad, 10-30% internet), aunque Marruecos emerge como outlier con 100% acceso eléctrico y 89.9% internet, demostrando que la universalización es viable. En Europa, Suecia y Noruega ocupan la esquina superior derecha con universalización eléctrica, internet penetrante (95-100%) y saturación móvil (100+ suscripciones/100 hab.). América presenta electricidad generalizada (80-95%) pero internet variable (50-80%), indicando que infraestructura energética no garantiza automáticamente adopción digital sin inversión específica en telecomunicaciones. Asia destaca por su extrema heterogeneidad: mientras Japón y Singapur se alinean con economías desarrolladas, Bangladesh y Pakistán enfrentan limitaciones más severas. Notablemente, países asiáticos como India y Filipinas exhiben penetración móvil extraordinaria (120-140 suscripciones/100 hab.) a pesar de acceso eléctrico limitado, evidenciando que la telefonía móvil ha permitido saltos tecnológicos sin requerir infraestructura fija completa.

3.2.4 Dimension ambiental y de recursos

La Figura 4 muestra cómo los países distribuyen su territorio entre bosques y tierras cultivables, dos recursos fundamentales para conservación ambiental y seguridad alimentaria. El eje horizontal mide cobertura boscosa, el eje vertical tierra cultivable, y el gráfico divide el espacio en cuatro zonas: conservación (muchos bosques, poca agricultura), agrícola (mucha agricultura, pocos bosques), balance (ambas moderadas), y crítica (ambas limitadas). Al pasar el cursor sobre cada punto, aparece información del país: porcentaje de cobertura boscosa, porcentaje de tierra cultivable, el balance total entre ambas, y tamaño de población. Esto permite ver cómo el uso de tierra varía según demografía: India concentra alta agricultura (51.8% tierra cultivable) y baja cobertura boscosa, reflejando presión por alimentar su enorme población. Brasil y Bolivia se ubican en zona de balance con mayor cobertura forestal. Mauritania y Eritrea ocupan la zona crítica, con recursos limitados tanto para bosques como para agricultura. En la leyenda al hacer clic en un continente, el gráfico se filtra mostrando solo los países de esa región, permitiendo comparar patrones ambientales dentro de cada geografía. Esta visualización anticipa si la conservación ambiental es un lujo de países ricos o una estrategia viable en todos los contextos.

asignar_continentes <- function(data) {
  continentes_map <- c(
    "Argentina" = "Americas", "Bahamas, The" = "Americas", "Barbados" = "Americas",
    "Belize" = "Americas", "Bolivia" = "Americas", "Brazil" = "Americas",
    "Canada" = "Americas", "Chile" = "Americas", "Colombia" = "Americas",
    "Costa Rica" = "Americas", "Cuba" = "Americas", "Dominica" = "Americas",
    "Dominican Republic" = "Americas", "Ecuador" = "Americas", "El Salvador" = "Americas",
    "Grenada" = "Americas", "Guatemala" = "Americas", "Guyana" = "Americas",
    "Haiti" = "Americas", "Honduras" = "Americas", "Jamaica" = "Americas",
    "Mexico" = "Americas", "Nicaragua" = "Americas", "Panama" = "Americas",
    "Paraguay" = "Americas", "Peru" = "Americas", "St. Kitts and Nevis" = "Americas",
    "St. Lucia" = "Americas", "St. Vincent and the Grenadines" = "Americas",
    "Suriname" = "Americas", "Trinidad and Tobago" = "Americas", "United States" = "Americas",
    "Uruguay" = "Americas", "Venezuela, RB" = "Americas", "Antigua and Barbuda" = "Americas",
    
    "Albania" = "Europe", "Austria" = "Europe", "Belarus" = "Europe",
    "Belgium" = "Europe", "Bosnia and Herzegovina" = "Europe", "Bulgaria" = "Europe",
    "Croatia" = "Europe", "Cyprus" = "Europe", "Czech Republic" = "Europe",
    "Czechia" = "Europe", "Denmark" = "Europe", "Estonia" = "Europe",
    "Finland" = "Europe", "France" = "Europe", "Germany" = "Europe",
    "Greece" = "Europe", "Hungary" = "Europe", "Iceland" = "Europe",
    "Ireland" = "Europe", "Italy" = "Europe", "Kosovo" = "Europe",
    "Latvia" = "Europe", "Lithuania" = "Europe", "Luxembourg" = "Europe",
    "Malta" = "Europe", "Montenegro" = "Europe", "Netherlands" = "Europe",
    "North Macedonia" = "Europe", "Norway" = "Europe", "Poland" = "Europe",
    "Portugal" = "Europe", "Russian Federation" = "Europe", "Serbia" = "Europe",
    "Slovak Republic" = "Europe", "Slovakia" = "Europe", "Slovenia" = "Europe",
    "Spain" = "Europe", "Sweden" = "Europe", "Switzerland" = "Europe",
    "Turkey" = "Europe", "Turkiye" = "Europe", "Ukraine" = "Europe",
    "United Kingdom" = "Europe", "Armenia" = "Europe", "Azerbaijan" = "Europe",
    "Georgia" = "Europe", "Moldova" = "Europe", "Romania" = "Europe",
    "San Marino" = "Europe",
    
    "Afghanistan" = "Asia", "Bahrain" = "Asia", "Bangladesh" = "Asia",
    "Bhutan" = "Asia", "Brunei Darussalam" = "Asia", "Cambodia" = "Asia",
    "China" = "Asia", "Hong Kong SAR, China" = "Asia", "India" = "Asia",
    "Indonesia" = "Asia", "Iran, Islamic Rep." = "Asia", "Iraq" = "Asia",
    "Israel" = "Asia", "Japan" = "Asia", "Jordan" = "Asia",
    "Kazakhstan" = "Asia", "Korea, Dem. People's rep." = "Asia", "Korea, Rep." = "Asia",
    "Kuwait" = "Asia", "Kyrgyz Republic" = "Asia", "Lao PDR" = "Asia",
    "Lebanon" = "Asia", "Macao SAR, China" = "Asia", "Malaysia" = "Asia",
    "Maldives" = "Asia", "Mongolia" = "Asia", "Myanmar" = "Asia",
    "Nepal" = "Asia", "Oman" = "Asia", "Pakistan" = "Asia",
    "Philippines" = "Asia", "Qatar" = "Asia", "Saudi Arabia" = "Asia",
    "Singapore" = "Asia", "Sri Lanka" = "Asia", "Syrian Arab Republic" = "Asia",
    "Taiwan" = "Asia", "Tajikistan" = "Asia", "Thailand" = "Asia",
    "Timor-Leste" = "Asia", "Turkmenistan" = "Asia", "United Arab Emirates" = "Asia",
    "Uzbekistan" = "Asia", "Vietnam" = "Asia", "Viet Nam" = "Asia",
    "West Bank and Gaza" = "Asia", "Yemen, Rep." = "Asia",
    
    "Algeria" = "Africa", "Angola" = "Africa", "Benin" = "Africa",
    "Botswana" = "Africa", "Burkina Faso" = "Africa", "Burundi" = "Africa",
    "Cabo Verde" = "Africa", "Cameroon" = "Africa", "Central African Republic" = "Africa",
    "Chad" = "Africa", "Comoros" = "Africa", "Congo, Dem. Rep." = "Africa",
    "Congo, Rep." = "Africa", "Cote d'Ivoire" = "Africa", "Djibouti" = "Africa",
    "Egypt, Arab Rep." = "Africa", "Equatorial Guinea" = "Africa", "Eritrea" = "Africa",
    "Eswatini" = "Africa", "Ethiopia" = "Africa", "Gabon" = "Africa",
    "Gambia, The" = "Africa", "Ghana" = "Africa", "Guinea" = "Africa",
    "Guinea-Bissau" = "Africa", "Kenya" = "Africa", "Lesotho" = "Africa",
    "Liberia" = "Africa", "Libya" = "Africa", "Madagascar" = "Africa",
    "Malawi" = "Africa", "Mali" = "Africa", "Mauritania" = "Africa",
    "Mauritius" = "Africa", "Morocco" = "Africa", "Mozambique" = "Africa",
    "Namibia" = "Africa", "Niger" = "Africa", "Nigeria" = "Africa",
    "Rwanda" = "Africa", "Senegal" = "Africa", "Sierra Leone" = "Africa",
    "Somalia" = "Africa", "South Africa" = "Africa", "South Sudan" = "Africa",
    "Sudan" = "Africa", "Tanzania" = "Africa", "Togo" = "Africa",
    "Tunisia" = "Africa", "Uganda" = "Africa", "Zambia" = "Africa",
    "Zimbabwe" = "Africa",
    
    "Australia" = "Oceania", "Fiji" = "Oceania", "Kiribati" = "Oceania",
    "Marshall Islands" = "Oceania", "Micronesia, Fed. Sts." = "Oceania",
    "New Zealand" = "Oceania", "Palau" = "Oceania", "Samoa" = "Oceania",
    "Solomon Islands" = "Oceania", "Tonga" = "Oceania", "Vanuatu" = "Oceania"
  )
  
  data %>%
    mutate(Continente = ifelse(Pais %in% names(continentes_map),
                                continentes_map[Pais], NA))
}

datos_ambiental <- Base_2022 %>%
  asignar_continentes() %>%
  filter(
    !is.na(`Area boscosa`) & 
    !is.na(`Tierra cultivable`) & 
    !is.na(Poblacion) &
    !is.na(Continente)
  ) %>%
  select(
    Pais, Continente,
    `Area boscosa`,
    `Tierra cultivable`,
    Poblacion
  ) %>%
  mutate(
    tooltip = paste0(
      "<b style='font-size:14px; color:#00e5ff;'>", Pais, "</b><br>",
      "<span style='color:#a259ff; font-size:11px;'>", Continente, "</span><br><br>",
      "<b style='color:#ffd600;'> USO DE TIERRA:</b><br>",
      "├─ Área Boscosa: <b style='color:#00e676;'>", 
      round(`Area boscosa`, 1), "%</b><br>",
      "├─ Tierra Cultivable: <b style='color:#ffd600;'>", 
      round(`Tierra cultivable`, 1), "%</b><br>",
      "├─ Balance: <b style='color:#00e5ff;'>", 
      round(`Area boscosa` + `Tierra cultivable`, 1), "% (bosque + cultivo)</b><br>",
      "└─ Población: <b style='color:#ff1744;'>", 
      format(round(Poblacion/1e6, 1), big.mark = ",", trim = TRUE), " M</b>"
    )
  )

color_map <- c(
  "Africa" = "#ff1744",
  "Americas" = "#00e676",
  "Asia" = "#ffd600",
  "Europe" = "#0084ff",
  "Oceania" = "#a259ff"
)

p <- plot_ly() %>%
  add_trace(
    data = datos_ambiental,
    x = ~`Area boscosa`,
    y = ~`Tierra cultivable`,
    color = ~Continente,
    colors = color_map,
    type = "scatter",
    mode = "markers",
    customdata = ~tooltip,
    hovertemplate = "%{customdata}<extra></extra>",
    marker = list(
      size = 12,  
      opacity = 0.8,
      line = list(
        color = "#ffffff", 
        width = 1.5   
      )
    ),
    showlegend = TRUE
  ) %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:24px;'>Figura 4: Uso de la Tierra</b><br>
               <span style='color:#8b92a0; font-size:14px;'>Año 2022 | Balance entre conservación y agricultura</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.95
    ),
    
    xaxis = list(
      title = "<b style='font-size:16px;'>Área Boscosa (% de tierra)</b>",
      gridcolor = '#12161f',
      showgrid = TRUE,
      zeroline = FALSE,
      tickfont = list(color = '#8b92a0', size = 13),
      titlefont = list(color = '#e0e6ed', size = 16),
      range = c(0, 100)
    ),
    
    yaxis = list(
      title = "<b style='font-size:16px;'>Tierra Cultivable (% de tierra)</b>",
      gridcolor = '#12161f',
      showgrid = TRUE,
      zeroline = FALSE,
      tickfont = list(color = '#8b92a0', size = 13),
      titlefont = list(color = '#e0e6ed', size = 16),
      range = c(0, 70)
    ),
    
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 13),
    
    legend = list(
      title = list(text = "<b style='font-size:14px;'>Continente</b>", font = list(size = 14, color = "#00e5ff")),
      bgcolor = 'rgba(10,14,26,0.95)',
      bordercolor = '#00e5ff',
      borderwidth = 1.5,
      x = 0.98, 
      y = 0.98,  
      xanchor = "right",
      yanchor = "top",
      font = list(size = 12, color = "#e0e6ed")
    ),
    
    margin = list(l = 100, r = 50, b = 120, t = 120),
    hovermode = 'closest',
    
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    
    shapes = list(
      list(
        type = "rect",
        x0 = 60, x1 = 100,
        y0 = 0, y1 = 20,
        xref = "x", yref = "y",
        fillcolor = "rgba(0, 230, 118, 0.1)",
        line = list(color = "rgba(0, 230, 118, 0.6)", width = 2, dash = "dot"),
        layer = "below"
      ),
      list(
        type = "rect",
        x0 = 0, x1 = 30,
        y0 = 40, y1 = 70,
        xref = "x", yref = "y",
        fillcolor = "rgba(255, 214, 0, 0.1)",
        line = list(color = "rgba(255, 214, 0, 0.6)", width = 2, dash = "dot"),
        layer = "below"
      ),
      list(
        type = "rect",
        x0 = 30, x1 = 60,
        y0 = 20, y1 = 40,
        xref = "x", yref = "y",
        fillcolor = "rgba(0, 132, 255, 0.1)",
        line = list(color = "rgba(0, 132, 255, 0.6)", width = 2, dash = "dot"),
        layer = "below"
      ),
      list(
        type = "rect",
        x0 = 0, x1 = 30,
        y0 = 0, y1 = 20,
        xref = "x", yref = "y",
        fillcolor = "rgba(255, 23, 68, 0.1)",
        line = list(color = "rgba(255, 23, 68, 0.6)", width = 2, dash = "dot"),
        layer = "below"
      )
    ),
    
    annotations = list(
      list(
        x = 88, y = 10,
        text = "<b style='color:#00e676; font-size:12px;'>🌲 CONSERVACIÓN</b>",
        showarrow = FALSE,
        bgcolor = "rgba(0, 230, 118, 0.2)",
        bordercolor = "#00e676",
        borderwidth = 1.5,
        borderpad = 6,
        font = list(size = 11)
      ),
      list(
        x = 30, y = 65,
        text = "<b style='color:#ffd600; font-size:12px;'>🌾 AGRÍCOLA</b>",
        showarrow = FALSE,
        bgcolor = "rgba(255, 214, 0, 0.2)",
        bordercolor = "#ffd600",
        borderwidth = 1.5,
        borderpad = 6,
        font = list(size = 11)
      ),
      list(
        x = 60, y = 40,
        text = "<b style='color:#0084ff; font-size:12px;'>⚖️ BALANCE</b>",
        showarrow = FALSE,
        bgcolor = "rgba(0, 132, 255, 0.2)",
        bordercolor = "#0084ff",
        borderwidth = 1.5,
        borderpad = 6,
        font = list(size = 11)
      ),
      list(
        x = 15, y = 20,
        text = "<b style='color:#ff1744; font-size:12px;'>⚠️ CRÍTICA</b>",
        showarrow = FALSE,
        bgcolor = "rgba(255, 23, 68, 0.2)",
        bordercolor = "#ff1744",
        borderwidth = 1.5,
        borderpad = 6,
        font = list(size = 10)
      ),
      
      list(
        x = 0.5, y = -0.15,
        xref = "paper", yref = "paper",
        text = "<span style='color:#8b92a0; font-size:12px;'>Verde = alta cobertura boscosa. Amarillo = alta agricultura. Equilibrio = desarrollo sostenible.</span>",
        showarrow = FALSE,
        xanchor = "center",
        yanchor = "top",
        font = list(size = 11, color = "#8b92a0")
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "sostenibilidad_ambiental_2022",
      width = 1600,
      height = 1000
    )
  )

p

El gráfico revela una clara segregación geográfica en el uso de tierra: algunos países concentran la zona agrícola con alta tierra cultivable pero baja cobertura boscosa, mientras otros ocupan la zona de balance manteniendo ambas variables moderadas. Europa tiende a distribuirse en la zona media-superior con mayor cobertura forestal, mientras que muchos países africanos se concentran en la zona crítica donde ambos recursos son limitados. La dispersión dentro de cada continente muestra variabilidad significativa, indicando que el uso de tierra no sigue un patrón único sino que responde a dinámicas regionales específicas. Esta visualización permite identificar que la presión ambiental—reflejada en el balance entre conservación y agricultura—opera de formas distintas según geografía, información que el análisis multivariado posteriormente contextualizará dentro de la estructura general del desarrollo.

3.2.5 Dimensión Demográfica

La dinámica poblacional condiciona fundamentalmente los desafíos de desarrollo: presión sobre recursos, mercado laboral, demanda por servicios públicos y sostenibilidad fiscal. Esta figura examina simultáneamente población y crecimiento poblacional en los 60 países más grandes, permitiendo visualizar si el crecimiento demográfico genera oportunidades (dividendo demográfico) o presiones críticas (declive o sobrepoblación).

Estructura del Gráfico: Cada rectángulo representa un país donde el tamaño codifica población total. El color codifica crecimiento poblacional anual: verde indica crecimiento alto (2%+, potencial dividendo demográfico), amarillo transición moderada (0.5-2%), naranja-rojo crecimiento bajo o negativo (riesgo de declive poblacional). Al pasar el cursor sobre cada país, aparecen simultáneamente cinco indicadores demográficos y algunos de desarrollo para complementar: población en millones, tasa de crecimiento anual, esperanza de vida, mortalidad infantil, y PIB per cápita. También se muestra la clasificación demográfica del país (Dividendo Demográfico, Madurez Estable o Declive Poblacional).

asignar_continentes <- function(data) {
  continentes_map <- c(
    "Argentina" = "Americas", "Bahamas, The" = "Americas", "Barbados" = "Americas",
    "Belize" = "Americas", "Bolivia" = "Americas", "Brazil" = "Americas",
    "Canada" = "Americas", "Chile" = "Americas", "Colombia" = "Americas",
    "Costa Rica" = "Americas", "Cuba" = "Americas", "Dominica" = "Americas",
    "Dominican Republic" = "Americas", "Ecuador" = "Americas", "El Salvador" = "Americas",
    "Grenada" = "Americas", "Guatemala" = "Americas", "Guyana" = "Americas",
    "Haiti" = "Americas", "Honduras" = "Americas", "Jamaica" = "Americas",
    "Mexico" = "Americas", "Nicaragua" = "Americas", "Panama" = "Americas",
    "Paraguay" = "Americas", "Peru" = "Americas", "St. Kitts and Nevis" = "Americas",
    "St. Lucia" = "Americas", "St. Vincent and the Grenadines" = "Americas",
    "Suriname" = "Americas", "Trinidad and Tobago" = "Americas", "United States" = "Americas",
    "Uruguay" = "Americas", "Venezuela, RB" = "Americas", "Antigua and Barbuda" = "Americas",
    
    "Albania" = "Europe", "Austria" = "Europe", "Belarus" = "Europe",
    "Belgium" = "Europe", "Bosnia and Herzegovina" = "Europe", "Bulgaria" = "Europe",
    "Croatia" = "Europe", "Cyprus" = "Europe", "Czech Republic" = "Europe",
    "Czechia" = "Europe", "Denmark" = "Europe", "Estonia" = "Europe",
    "Finland" = "Europe", "France" = "Europe", "Germany" = "Europe",
    "Greece" = "Europe", "Hungary" = "Europe", "Iceland" = "Europe",
    "Ireland" = "Europe", "Italy" = "Europe", "Kosovo" = "Europe",
    "Latvia" = "Europe", "Lithuania" = "Europe", "Luxembourg" = "Europe",
    "Malta" = "Europe", "Montenegro" = "Europe", "Netherlands" = "Europe",
    "North Macedonia" = "Europe", "Norway" = "Europe", "Poland" = "Europe",
    "Portugal" = "Europe", "Russian Federation" = "Europe", "Serbia" = "Europe",
    "Slovak Republic" = "Europe", "Slovakia" = "Europe", "Slovenia" = "Europe",
    "Spain" = "Europe", "Sweden" = "Europe", "Switzerland" = "Europe",
    "Turkey" = "Europe", "Turkiye" = "Europe", "Ukraine" = "Europe",
    "United Kingdom" = "Europe", "Armenia" = "Europe", "Azerbaijan" = "Europe",
    "Georgia" = "Europe", "Moldova" = "Europe", "Romania" = "Europe",
    "San Marino" = "Europe",
    
    "Afghanistan" = "Asia", "Bahrain" = "Asia", "Bangladesh" = "Asia",
    "Bhutan" = "Asia", "Brunei Darussalam" = "Asia", "Cambodia" = "Asia",
    "China" = "Asia", "Hong Kong SAR, China" = "Asia", "India" = "Asia",
    "Indonesia" = "Asia", "Iran, Islamic Rep." = "Asia", "Iraq" = "Asia",
    "Israel" = "Asia", "Japan" = "Asia", "Jordan" = "Asia",
    "Kazakhstan" = "Asia", "Korea, Dem. People's rep." = "Asia", "Korea, Rep." = "Asia",
    "Kuwait" = "Asia", "Kyrgyz Republic" = "Asia", "Lao PDR" = "Asia",
    "Lebanon" = "Asia", "Macao SAR, China" = "Asia", "Malaysia" = "Asia",
    "Maldives" = "Asia", "Mongolia" = "Asia", "Myanmar" = "Asia",
    "Nepal" = "Asia", "Oman" = "Asia", "Pakistan" = "Asia",
    "Philippines" = "Asia", "Qatar" = "Asia", "Saudi Arabia" = "Asia",
    "Singapore" = "Asia", "Sri Lanka" = "Asia", "Syrian Arab Republic" = "Asia",
    "Taiwan" = "Asia", "Tajikistan" = "Asia", "Thailand" = "Asia",
    "Timor-Leste" = "Asia", "Turkmenistan" = "Asia", "United Arab Emirates" = "Asia",
    "Uzbekistan" = "Asia", "Vietnam" = "Asia", "Viet Nam" = "Asia",
    "West Bank and Gaza" = "Asia", "Yemen, Rep." = "Asia",
    
    "Algeria" = "Africa", "Angola" = "Africa", "Benin" = "Africa",
    "Botswana" = "Africa", "Burkina Faso" = "Africa", "Burundi" = "Africa",
    "Cabo Verde" = "Africa", "Cameroon" = "Africa", "Central African Republic" = "Africa",
    "Chad" = "Africa", "Comoros" = "Africa", "Congo, Dem. Rep." = "Africa",
    "Congo, Rep." = "Africa", "Cote d'Ivoire" = "Africa", "Djibouti" = "Africa",
    "Egypt, Arab Rep." = "Africa", "Equatorial Guinea" = "Africa", "Eritrea" = "Africa",
    "Eswatini" = "Africa", "Ethiopia" = "Africa", "Gabon" = "Africa",
    "Gambia, The" = "Africa", "Ghana" = "Africa", "Guinea" = "Africa",
    "Guinea-Bissau" = "Africa", "Kenya" = "Africa", "Lesotho" = "Africa",
    "Liberia" = "Africa", "Libya" = "Africa", "Madagascar" = "Africa",
    "Malawi" = "Africa", "Mali" = "Africa", "Mauritania" = "Africa",
    "Mauritius" = "Africa", "Morocco" = "Africa", "Mozambique" = "Africa",
    "Namibia" = "Africa", "Niger" = "Africa", "Nigeria" = "Africa",
    "Rwanda" = "Africa", "Senegal" = "Africa", "Sierra Leone" = "Africa",
    "Somalia" = "Africa", "South Africa" = "Africa", "South Sudan" = "Africa",
    "Sudan" = "Africa", "Tanzania" = "Africa", "Togo" = "Africa",
    "Tunisia" = "Africa", "Uganda" = "Africa", "Zambia" = "Africa",
    "Zimbabwe" = "Africa",
    
    "Australia" = "Oceania", "Fiji" = "Oceania", "Kiribati" = "Oceania",
    "Marshall Islands" = "Oceania", "Micronesia, Fed. Sts." = "Oceania",
    "New Zealand" = "Oceania", "Palau" = "Oceania", "Samoa" = "Oceania",
    "Solomon Islands" = "Oceania", "Tonga" = "Oceania", "Vanuatu" = "Oceania"
  )
  
  data %>%
    mutate(Continente = ifelse(Pais %in% names(continentes_map),
                                continentes_map[Pais], NA))
}

datos_riesgos <- Base_2022 %>%
  asignar_continentes() %>%
  filter(
    !is.na(`Crecimiento poblacion`) & 
    !is.na(Poblacion) &
    !is.na(Continente) &
    Poblacion > 0
  ) %>%
  select(
    Pais, Continente, 
    Poblacion, 
    `Crecimiento poblacion`,
    `Mortalidad infantil`,
    `Esperanza vida`,
    PIB_per
  ) %>%
  arrange(desc(Poblacion)) %>%
  slice_head(n = 60) %>%
  mutate(
    Poblacion_millones = Poblacion / 1e6,
    Clasificacion = case_when(
      `Crecimiento poblacion` > 2 ~ "Dividendo Demográfico",
      `Crecimiento poblacion` >= 0.5 & `Crecimiento poblacion` <= 2 ~ "Madurez Estable", 
      `Crecimiento poblacion` < 0.5 ~ "Declive Poblacional",
      TRUE ~ "Sin Clasificar"
    ),
    tooltip = paste0(
      "<b style='font-size:14px; color:#00e5ff;'>", Pais, "</b><br>",
      "<span style='color:#a259ff; font-size:11px;'>", Continente, "</span><br><br>",
      "<b style='color:#ffd600;'> INDICADORES DEMOGRÁFICOS:</b><br>",
      "├─ Población: <b style='color:#ffd600;'>", 
      format(round(Poblacion_millones, 1), big.mark = ",", decimal.mark = ".", trim = TRUE), " M</b><br>",
      "├─ Crecimiento: <b style='color:#00e676;'>", 
      round(`Crecimiento poblacion`, 2), "%</b><br>",
      "├─ Esperanza Vida: <b style='color:#00e5ff;'>", 
      round(`Esperanza vida`, 1), " años</b><br>",
      "├─ Mortalidad Infantil: <b style='color:#ff1744;'>", 
      round(`Mortalidad infantil`, 1), "/1000</b><br>",
      "└─ PIB per cápita: <b style='color:#a259ff;'>$", 
      format(round(PIB_per), big.mark = ","), "</b><br>",
      "<br><b>Clasificación:</b> <span style='color:#00e676;'>", Clasificacion, "</span>"
    )
  )

fig_treemap <- plot_ly(
  data = datos_riesgos,
  type = "treemap",
  labels = ~Pais,
  parents = ~"",
  values = ~Poblacion,
  branchvalues = "total",
  marker = list(
    colors = ~`Crecimiento poblacion`,
    colorscale = list(
      c(0, "#ff1744"),    
      c(0.3, "#ff6b00"),  
      c(0.5, "#fdd835"),    
      c(0.7, "#76ff03"),  
      c(1, "#00e676")      
    ),
    cmin = -2,
    cmax = 4,
    showscale = TRUE,
    colorbar = list(
      title = list(
        text = "<b>Crecimiento<br>Anual (%)</b>",
        font = list(size = 12, color = "#e0e6ed")
      ),
      tickvals = c(-2, -1, 0, 1, 2, 3, 4),
      ticktext = c("-2%", "-1%", "0%", "1%", "2%", "3%", "4%"),
      thickness = 20,
      len = 0.8,
      x = 1.05,  
      y = 0.5,
      tickfont = list(size = 11, color = "#8b92a0")
    ),
    line = list(color = "#0a0e1a", width = 2),
    opacity = 0.9
  ),
  textinfo = "label+value",
  texttemplate = "<b>%{label}</b><br>%{value:.0f}M",
  textposition = "middle center", 
  textfont = list(
    size = 14,
    color = "white",
    family = "Arial"
  ),
  customdata = ~tooltip,
  hovertemplate = "%{customdata}<extra></extra>",
  showlegend = FALSE
)

fig_treemap <- fig_treemap %>%
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:24px;'>Figura 5: Oportunidades y Riesgos Demográficos Globales</b><br>
             <span style='color:#8b92a0; font-size:14px;'>Top 60 países | Tamaño = Población | Color = Crecimiento Anual (2022)</span>",
      x = 0.5,
      xanchor = 'center', 
      y = 0.95
    ),
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    
    margin = list(l = 10, r = 150, b = 100, t = 120),
    annotations = list(
      list(
        x = 0.5, 
        y = -0.08,
        xref = "paper", 
        yref = "paper",
        text = "<span style='color:#e0e6ed; font-size:12px;'><b>📊 LECTURA:</b> 
               <span style='color:#00e676;'>Verde (alto crecimiento) = Oportunidades demográficas</span> | 
               <span style='color:#ff1744;'>Rojo (bajo/negativo) = Riesgos de declive</span> | 
               <span style='color:#fdd835;'>Amarillo = Transición estable</span></span>",
        showarrow = FALSE,
        xanchor = "center",
        align = "center"
      )
    )
  ) %>%
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png", 
      filename = "oportunidades_riesgos_demograficos",
      width = 1600,
      height = 1000
    )
  )

fig_treemap

India y China dominan por volumen (rectángulos enormes), pero con dinámicas opuestas: India en amarillo-verde (crecimiento 1-2%) versus China en naranja-rojo (crecimiento bajo). Estados Unidos, Indonesia y Brasil exhiben colores intermedios, reflejando transiciones demográficas distintas. Países africanos como Congo Democrático, Nigeria y Uganda aparecen en verde brillante, indicando crecimiento rápido (oportunidades de dividendo demográfico pero también presión sobre servicios). Europeos como Alemania y España muestran tonos rojos-naranjas, evidenciando declive poblacional y envejecimiento. Esta distribución muestra que presiones demográficas operan en direcciones opuestas según región, información que contextualizará el análisis multivariado posterior.

3.3 Distribución de Indicadores por continente

Mientras que el análisis dimensional anterior examina indicadores de forma global, es fundamental entender cómo varía la heterogeneidad DENTRO de cada continente. Dos preguntas clave emergen: ¿Son los continentes entidades homogéneas o existen disparidades profundas dentro de cada región? ¿Qué países actúan como outliers casos atípicos que desafían el patrón regional y qué factores específicos explican sus desviaciones?

La siguiente visualización interactiva explora la distribución por región de 10 indicadores estratégicos seleccionados de las cinco dimensiones del desarrollo. Para cada indicador y continente, se visualizan: (1) el boxplot que resume la distribución central (mediana, cuartiles, rango intercuartil), (2) los puntos normales que representan países dentro del rango esperado, y (3) los outliers que identifican casos anómalos.

Al pasar el cursor sobre cualquier punto, se desplegan simultáneamente el nombre del país, su valor específico, su continente y clasificación (normal u outlier). Esta visualización interactiva permite explorar dinámicamente qué países rompen los patrones regionales esperados, información crucial para identificar posteriormente qué características específicas crean estas anomalías—revelación que el Análisis de Componentes Principales posteriormente contextualizará dentro de la estructura multidimensional del desarrollo.

Selecciona cualquier indicador con el menú desplegable para explorar cómo varían las disparidades regionales según la dimensión analizada.

asignar_continentes <- function(data) {
  continentes_map <- c(
    "Argentina" = "Americas", "Bahamas, The" = "Americas", "Barbados" = "Americas",
    "Belize" = "Americas", "Bolivia" = "Americas", "Brazil" = "Americas",
    "Canada" = "Americas", "Chile" = "Americas", "Colombia" = "Americas",
    "Costa Rica" = "Americas", "Cuba" = "Americas", "Dominica" = "Americas",
    "Dominican Republic" = "Americas", "Ecuador" = "Americas", "El Salvador" = "Americas",
    "Grenada" = "Americas", "Guatemala" = "Americas", "Guyana" = "Americas",
    "Haiti" = "Americas", "Honduras" = "Americas", "Jamaica" = "Americas",
    "Mexico" = "Americas", "Nicaragua" = "Americas", "Panama" = "Americas",
    "Paraguay" = "Americas", "Peru" = "Americas", "St. Kitts and Nevis" = "Americas",
    "St. Lucia" = "Americas", "St. Vincent and the Grenadines" = "Americas",
    "Suriname" = "Americas", "Trinidad and Tobago" = "Americas", "United States" = "Americas",
    "Uruguay" = "Americas", "Venezuela, RB" = "Americas", "Antigua and Barbuda" = "Americas",
    
    "Albania" = "Europe", "Austria" = "Europe", "Belarus" = "Europe",
    "Belgium" = "Europe", "Bosnia and Herzegovina" = "Europe", "Bulgaria" = "Europe",
    "Croatia" = "Europe", "Cyprus" = "Europe", "Czech Republic" = "Europe",
    "Czechia" = "Europe", "Denmark" = "Europe", "Estonia" = "Europe",
    "Finland" = "Europe", "France" = "Europe", "Germany" = "Europe",
    "Greece" = "Europe", "Hungary" = "Europe", "Iceland" = "Europe",
    "Ireland" = "Europe", "Italy" = "Europe", "Kosovo" = "Europe",
    "Latvia" = "Europe", "Lithuania" = "Europe", "Luxembourg" = "Europe",
    "Malta" = "Europe", "Montenegro" = "Europe", "Netherlands" = "Europe",
    "North Macedonia" = "Europe", "Norway" = "Europe", "Poland" = "Europe",
    "Portugal" = "Europe", "Russian Federation" = "Europe", "Serbia" = "Europe",
    "Slovak Republic" = "Europe", "Slovakia" = "Europe", "Slovenia" = "Europe",
    "Spain" = "Europe", "Sweden" = "Europe", "Switzerland" = "Europe",
    "Turkey" = "Europe", "Turkiye" = "Europe", "Ukraine" = "Europe",
    "United Kingdom" = "Europe", "Armenia" = "Europe", "Azerbaijan" = "Europe",
    "Georgia" = "Europe", "Moldova" = "Europe", "Romania" = "Europe",
    "San Marino" = "Europe",
    
    "Afghanistan" = "Asia", "Bahrain" = "Asia", "Bangladesh" = "Asia",
    "Bhutan" = "Asia", "Brunei Darussalam" = "Asia", "Cambodia" = "Asia",
    "China" = "Asia", "Hong Kong SAR, China" = "Asia", "India" = "Asia",
    "Indonesia" = "Asia", "Iran, Islamic Rep." = "Asia", "Iraq" = "Asia",
    "Israel" = "Asia", "Japan" = "Asia", "Jordan" = "Asia",
    "Kazakhstan" = "Asia", "Korea, Dem. People's rep." = "Asia", "Korea, Rep." = "Asia",
    "Kuwait" = "Asia", "Kyrgyz Republic" = "Asia", "Lao PDR" = "Asia",
    "Lebanon" = "Asia", "Macao SAR, China" = "Asia", "Malaysia" = "Asia",
    "Maldives" = "Asia", "Mongolia" = "Asia", "Myanmar" = "Asia",
    "Nepal" = "Asia", "Oman" = "Asia", "Pakistan" = "Asia",
    "Philippines" = "Asia", "Qatar" = "Asia", "Saudi Arabia" = "Asia",
    "Singapore" = "Asia", "Sri Lanka" = "Asia", "Syrian Arab Republic" = "Asia",
    "Taiwan" = "Asia", "Tajikistan" = "Asia", "Thailand" = "Asia",
    "Timor-Leste" = "Asia", "Turkmenistan" = "Asia", "United Arab Emirates" = "Asia",
    "Uzbekistan" = "Asia", "Vietnam" = "Asia", "Viet Nam" = "Asia",
    "West Bank and Gaza" = "Asia", "Yemen, Rep." = "Asia",
    
    "Algeria" = "Africa", "Angola" = "Africa", "Benin" = "Africa",
    "Botswana" = "Africa", "Burkina Faso" = "Africa", "Burundi" = "Africa",
    "Cabo Verde" = "Africa", "Cameroon" = "Africa", "Central African Republic" = "Africa",
    "Chad" = "Africa", "Comoros" = "Africa", "Congo, Dem. Rep." = "Africa",
    "Congo, Rep." = "Africa", "Cote d'Ivoire" = "Africa", "Djibouti" = "Africa",
    "Egypt, Arab Rep." = "Africa", "Equatorial Guinea" = "Africa", "Eritrea" = "Africa",
    "Eswatini" = "Africa", "Ethiopia" = "Africa", "Gabon" = "Africa",
    "Gambia, The" = "Africa", "Ghana" = "Africa", "Guinea" = "Africa",
    "Guinea-Bissau" = "Africa", "Kenya" = "Africa", "Lesotho" = "Africa",
    "Liberia" = "Africa", "Libya" = "Africa", "Madagascar" = "Africa",
    "Malawi" = "Africa", "Mali" = "Africa", "Mauritania" = "Africa",
    "Mauritius" = "Africa", "Morocco" = "Africa", "Mozambique" = "Africa",
    "Namibia" = "Africa", "Niger" = "Africa", "Nigeria" = "Africa",
    "Rwanda" = "Africa", "Senegal" = "Africa", "Sierra Leone" = "Africa",
    "Somalia" = "Africa", "South Africa" = "Africa", "South Sudan" = "Africa",
    "Sudan" = "Africa", "Tanzania" = "Africa", "Togo" = "Africa",
    "Tunisia" = "Africa", "Uganda" = "Africa", "Zambia" = "Africa",
    "Zimbabwe" = "Africa",
    
    "Australia" = "Oceania", "Fiji" = "Oceania", "Kiribati" = "Oceania",
    "Marshall Islands" = "Oceania", "Micronesia, Fed. Sts." = "Oceania",
    "New Zealand" = "Oceania", "Palau" = "Oceania", "Samoa" = "Oceania",
    "Solomon Islands" = "Oceania", "Tonga" = "Oceania", "Vanuatu" = "Oceania"
  )
  
  data %>%
    mutate(Continente = ifelse(Pais %in% names(continentes_map),
                                continentes_map[Pais], NA))
}

detectar_outliers <- function(data, var, grupo_col) {
  data %>%
    group_by(!!sym(grupo_col)) %>%
    mutate(
      Q1 = quantile(!!sym(var), 0.25, na.rm = TRUE),
      Q3 = quantile(!!sym(var), 0.75, na.rm = TRUE),
      IQR = Q3 - Q1,
      limite_inferior = Q1 - 1.5 * IQR,
      limite_superior = Q3 + 1.5 * IQR,
      es_outlier = !!sym(var) < limite_inferior | !!sym(var) > limite_superior,
      posicion_relativa = case_when(
        !!sym(var) < limite_inferior ~ "Bajo",
        !!sym(var) > limite_superior ~ "Alto",
        TRUE ~ "Normal"
      )
    ) %>%
    ungroup()
}

datos_box <- Base_2022 %>%
  asignar_continentes() %>%
  filter(!is.na(Continente)) %>%
  select(
    Pais, Continente,
    PIB_per, `Crecimiento PIB`, `Esperanza vida`,
    `Mortalidad infantil`, `Acceso electricidad`, `Uso internet`,
    `Inversion extranjera`, `Crecimiento poblacion`, `Gasto salud`, `Area boscosa`
  )

vars_boxplot <- list(
  list(var = "PIB_per", 
       nombre = "PIB per cápita (US$)", 
       color = "#00ff00"),
  
  list(var = "Crecimiento PIB", 
       nombre = "Crecimiento PIB (% anual)", 
       color = "#00d4ff"),
  
  list(var = "Esperanza vida", 
       nombre = "Esperanza de vida (años)", 
       color = "#ff00ff"),
  
  list(var = "Mortalidad infantil", 
       nombre = "Mortalidad infantil (por 1,000)", 
       color = "#ff3333"),
  
  list(var = "Acceso electricidad", 
       nombre = "Acceso a electricidad (%)", 
       color = "#00ffff"),
  
  list(var = "Uso internet", 
       nombre = "Uso de internet (%)", 
       color = "#ffff00"),
  
  list(var = "Inversion extranjera", 
       nombre = "Inversión Extranjera (% PIB)", 
       color = "#ff9900"),
  
  list(var = "Crecimiento poblacion", 
       nombre = "Crecimiento poblacional (% anual)", 
       color = "#ff00ff"),
  
  list(var = "Gasto salud", 
       nombre = "Gasto en salud (% PIB)", 
       color = "#00ff88"),
  
  list(var = "Area boscosa", 
       nombre = "Área boscosa (% tierra)", 
       color = "#00ff00")
)

p <- plot_ly()

for (i in seq_along(vars_boxplot)) {
  config <- vars_boxplot[[i]]
  var_name <- config$var
  nombre_variable <- config$nombre  
  color_variable <- config$color    
  
  datos_con_outliers <- detectar_outliers(datos_box, var_name, "Continente")
  
  p <- p %>%
    add_boxplot(
      data = datos_con_outliers,
      x = ~Continente,
      y = as.formula(paste0("~`", var_name, "`")),
      name = "Distribución",
      marker = list(
        color = color_variable,
        opacity = 0.7,
        size = 4
      ),
      line = list(color = color_variable, width = 2),
      boxmean = FALSE,
      visible = (i == 1),
      showlegend = (i == 1),
      hoverinfo = "y",
      group = var_name,
      quartilemethod = "inclusive"
    )
  
  datos_todos <- datos_con_outliers
  
  datos_todos$valor_actual <- datos_todos[[var_name]]
  datos_todos$nombre_var <- nombre_variable
  datos_todos$color_var <- color_variable
  
  p <- p %>%
    add_trace(
      data = datos_todos,
      x = ~Continente,
      y = as.formula(paste0("~`", var_name, "`")),
      mode = "markers",
      type = "scatter",
      marker = list(
        color = color_variable,
        size = ifelse(datos_todos$es_outlier, 10, 4),
        opacity = ifelse(datos_todos$es_outlier, 0.9, 0.25),
        symbol = ifelse(datos_todos$es_outlier, "diamond", "circle"),
        line = list(
          color = ifelse(datos_todos$es_outlier, "#ffffff", "rgba(255,255,255,0)"),
          width = ifelse(datos_todos$es_outlier, 1, 0)
        )
      ),
      text = paste0(
        "<b style='font-size:13px; color:#00e5ff;'>", datos_todos$Pais, "</b><br>",
        "<span style='color:#8b92a0; font-size:11px;'>", datos_todos$Continente, "</span><br><br>",
        "<b style='color:#e0e6ed;'>", datos_todos$nombre_var, ":</b><br>",
        "<span style='color:", datos_todos$color_var, "; font-size:13px; font-weight:bold;'>",
        round(datos_todos$valor_actual, 2),
        "</span><br>",
        ifelse(
          datos_todos$es_outlier,
          paste0("<span style='color:#ffff00; font-size:11px;'>⚠ OUTLIER (", datos_todos$posicion_relativa, ")</span>"),
          "<span style='color:#a259ff; font-size:10px;'>✓ Normal</span>"
        )
      ),
      hovertemplate = "%{text}<extra></extra>",
      showlegend = FALSE,
      visible = (i == 1),
      group = var_name
    )
}

p %>%
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:20px;'>Figura 6: Distribución de Indicadores por Región</b><br>
               <span style='color:#8b92a0; font-size:12px;'>PIB per cápita (US$) | Año 2022 | ◇ Diamantes = Outliers | Pasa el cursor para detalles</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.96
    ),
    
    xaxis = list(
      title = "<b style='font-size:13px; color:#00e5ff;'>Continente</b>",
      tickfont = list(color = '#e0e6ed', size = 12),
      titlefont = list(color = '#00e5ff', size = 13),
      showgrid = FALSE,
      showline = TRUE,
      linewidth = 0.8,
      linecolor = '#00e5ff',
      categoryorder = "array",
      categoryarray = c("Africa", "Americas", "Asia", "Europe", "Oceania")
    ),
    
    yaxis = list(
      title = "<b style='font-size:13px; color:#00e5ff;'>PIB per cápita (US$)</b>",
      tickfont = list(color = '#8b92a0', size = 10),
      titlefont = list(color = '#00e5ff', size = 13),
      gridcolor = '#1a1a3e',
      showgrid = TRUE,
      gridwidth = 0.4,
      zeroline = FALSE
    ),
    
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 11),
    
    legend = list(
      bgcolor = 'rgba(10,14,26,0.95)',
      bordercolor = '#00e5ff',
      borderwidth = 1.5,
      x = 0.02,
      y = 0.98,
      font = list(size = 11, color = "#00e5ff"),
      orientation = "v"
    ),
    
    margin = list(l = 80, r = 50, b = 80, t = 130),
    hovermode = 'closest',
    
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.98)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 11, family = "Arial"),
      align = "left",
      namelength = -1
    ),
    
    updatemenus = list(
      list(
        buttons = lapply(seq_along(vars_boxplot), function(i) {
          config <- vars_boxplot[[i]]
          var_name <- config$var
          
          n_vars <- length(vars_boxplot)
          visible_list <- rep(FALSE, n_vars * 2)
          
          visible_list[(i-1)*2 + 1] <- TRUE
          visible_list[(i-1)*2 + 2] <- TRUE
          
          list(
            label = strsplit(config$nombre, " \\(")[[1]][1],
            method = "update",
            args = list(
              list(visible = visible_list),
              list(
                title = list(
                  text = paste0(
                    "<b style='color:#00e5ff; font-size:20px;'>Figura 6: Distribución de Indicadores por Región</b><br>",
                    "<span style='color:#8b92a0; font-size:12px;'>",
                    config$nombre,
                    " | Año 2022 | ◇ Diamantes = Outliers | Pasa el cursor para detalles</span>"
                  ),
                  x = 0.5,
                  xanchor = 'center',
                  y = 0.96
                ),
                "yaxis.title" = paste0("<b style='font-size:13px; color:#00e5ff;'>", config$nombre, "</b>")
              )
            )
          )
        }),
        
        direction = "down",
        pad = list(r = 10, t = 10),
        showactive = TRUE,
        x = 0.01,
        xanchor = "left",
        y = 1.10,
        yanchor = "top",
        bgcolor = "rgba(162, 89, 255, 0.25)",
        bordercolor = "#a259ff",
        borderwidth = 1.5,
        font = list(size = 10, color = "#a259ff", family = "Arial"),
        active = 0
      )
    ),
    
    annotations = list(
      list(
        x = 0.01,
        y = 1.15,
        xref = "paper",
        yref = "paper",
        text = "<b style='color:#00e5ff; font-size:11px; text-transform:uppercase; letter-spacing:1px;'>📊 Selecciona indicador:</b>",
        showarrow = FALSE,
        xanchor = "left",
        yanchor = "top",
        font = list(size = 11)
      ),
      list(
        x = 0.5,
        y = -0.14,
        xref = "paper",
        yref = "paper",
        text = "<span style='color:#8b92a0; font-size:10px;'>
                 <b>━</b> Caja (Q1-Q3) = 50% central | 
                 <b>─</b> Líneas = Rango esperado | 
                 <b>●</b> Puntos = Países dentro del rango | 
                 <b>◇</b> Diamantes = Valores atípicos (outliers)
               </span>",
        showarrow = FALSE,
        xanchor = "center",
        yanchor = "top",
        align = "center"
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "figura_6_distribucion_continentes_2022",
      width = 1600,
      height = 900
    )
  )

La Figura 6 revela cierta heterogeneidad dentro de cada continente. En Africa, la dispersión es particularmente amplia en indicadores de salud: mientras algunos países aproximan estándares europeos en esperanza de vida, otros enfrentan desafíos críticos en mortalidad infantil. Americas muestra un patrón variado donde algunos países desarrollados contrastan dramáticamente con economías emergentes, ejemplo: Bolivia registra esperanza de vida por debajo del promedio regional. En Asia, la heterogeneidad es extrema, Qatar emerge como outlier en crecimiento poblacional (5.91% anual, reflejo de inmigración laboral), mientras otros países asiáticos presentan dinámicas demográficas moderadas. Europe mantiene relativa homogeneidad en indicadores de bienestar, aunque Malta destaca como outlier extremo en inversión extranjera directa (126% del PIB, característico de economías muy pequeñas y financieras). En Oceania, la dispersión limitada contrasta con puntos aislados como Solomon Islands, con cobertura forestal excepcional. Estos patrones evidencian que el desarrollo no se distribuye geográficamente de forma uniforme sino que responde a factores estructurales, institucionales y geopolíticos específicos, información que el análisis multidimensional posterior contextualizará dentro de constructos sintéticos mediante componentes principales.

3.4 Visualización Geoespacial

La visualización geoespacial complementa el análisis dimensional ofreciendo una perspectiva geográfica integrada que revela cómo las dinámicas de desarrollo se distribuyen espacialmente en el planeta. Esta sección presenta un mapa interactivo mundial donde cada territorio se colorea según el indicador seleccionado, permitiendo identificar patrones de concentración geográfica, grupos regionales y anomalías que anticipan la estructura latente del desarrollo global.

El mapa ofrece tres variables seleccionables mediante controles en la esquina superior izquierda: (1) Crecimiento PIB, (2) Acceso a Electricidad, y (3) Crecimiento Poblacional. Cada variable posee su propia paleta de colores. Una leyenda dinámica en la esquina inferior derecha se actualiza automáticamente al cambiar de variable, mostrando la escala específica.

Al pasar el cursor sobre cualquier país, emerge informacón con nombre del país, variable seleccionada y valor específico, permitiendo consultar información precise sin interrumpir la visualización general.

variables_mapa <- list(
  "Crecimiento PIB" = "Crecimiento PIB",
  "Acceso electricidad" = "Acceso electricidad",  
  "Crecimiento poblacion" = "Crecimiento poblacion"  
)

world <- ne_countries(scale = "medium", returnclass = "sf")

mapeo_paises <- c(
  "United States of America" = "United States",
  "Russia" = "Russian Federation",
  "South Korea" = "Korea, Rep.",
  "North Korea" = "Korea, Dem. People's Rep.",
  "Egypt" = "Egypt, Arab Rep.",
  "Democratic Republic of the Congo" = "Congo, Dem. Rep.",
  "Republic of the Congo" = "Congo, Rep.",
  "Laos" = "Lao PDR",
  "Syria" = "Syrian Arab Republic",
  "Venezuela" = "Venezuela, RB",
  "Iran" = "Iran, Islamic Rep.",
  "Czech Republic" = "Czechia",
  "Slovakia" = "Slovak Republic",
  "Kyrgyzstan" = "Kyrgyz Republic",
  "Yemen" = "Yemen, Rep.",
  "Turkey" = "Turkiye",
  "Gambia" = "Gambia, The",
  "Bahamas" = "Bahamas, The",
  "Ivory Coast" = "Cote d'Ivoire",
  "Brunei" = "Brunei Darussalam",
  "Cape Verde" = "Cabo Verde",
  "Hong Kong" = "Hong Kong SAR, China",
  "Macao" = "Macao SAR, China",
  "Macedonia" = "North Macedonia",
  "Saint Lucia" = "St. Lucia",
  "Saint Vincent and the Grenadines" = "St. Vincent and the Grenadines",
  "Saint Kitts and Nevis" = "St. Kitts and Nevis",
  "Myanmar" = "Myanmar",
  "Bolivia" = "Bolivia",
  "Libya" = "Libya",
  "Tanzania" = "Tanzania",
  "Eswatini" = "Eswatini",
  "Timor-Leste" = "Timor-Leste"
)

mapeo_df <- data.frame(
  name_world = names(mapeo_paises),
  name_data = unname(mapeo_paises),
  stringsAsFactors = FALSE
)

world_data <- world %>%
  left_join(mapeo_df, by = c("name" = "name_world")) %>%
  left_join(
    Base_2022 %>% select(Pais, all_of(unlist(variables_mapa))),
    by = c("name_data" = "Pais")
  ) %>%
  mutate(
    across(
      all_of(unlist(variables_mapa)),
      ~ifelse(is.na(.) & name %in% Base_2022$Pais,
              Base_2022[[cur_column()]][match(name, Base_2022$Pais)], .)
    )
  )
paletas <- list(
  "Crecimiento PIB" = colorNumeric(
    palette = colorRampPalette(c("#ff1744", "#ff6b00", "#ffd600", "#00e676", "#00e5ff"))(100),
    domain = world_data$`Crecimiento PIB`,
    na.color = "#1a1a2e"
  ),
  "Acceso electricidad" = colorNumeric(
    palette = colorRampPalette(c("#1a1a2e", "#0084ff", "#00e5ff", "#00e676", "#ffd600"))(100),
    domain = world_data$`Acceso electricidad`,
    na.color = "#1a1a2e"
  ),
  "Crecimiento poblacion" = colorNumeric(
    palette = colorRampPalette(c("#0084ff", "#00e5ff", "#a259ff", "#ff6b00", "#ff1744"))(100),
    domain = world_data$`Crecimiento poblacion`,  # ✅ CORREGIDO
    na.color = "#1a1a2e"
  )
)

mapa <- leaflet(world_data, 
                width = "100%", 
                height = "550px",
                options = leafletOptions(
                  minZoom = 2,
                  maxZoom = 7,
                  worldCopyJump = TRUE
                )) %>%
  setView(lng = 15, lat = 20, zoom = 2.2) %>%
  addProviderTiles("CartoDB.DarkMatter")

for (var_display in names(variables_mapa)) {
  var_col <- variables_mapa[[var_display]]
  pal <- paletas[[var_display]]
  
  unidad <- if(grepl("Crecimiento", var_display)) "%" else "%"
  
  labels <- sprintf(
    "<div style='font-family: sans-serif;'>
      <strong style='color: #00e5ff; font-size: 15px;'>%s</strong><br/>
      <span style='color: #8b92a0; font-size: 12px;'>%s:</span><br/>
      <strong style='color: #00e5ff; font-size: 14px;'>%s</strong>
    </div>",
    world_data$name,
    var_display,
    ifelse(is.na(world_data[[var_col]]), 
           "Sin datos", 
           paste0(round(world_data[[var_col]], 2), unidad))
  ) %>% lapply(HTML)
  
  mapa <- mapa %>%
    addPolygons(
      fillColor = ~pal(world_data[[var_col]]),
      weight = 1.2,
      opacity = 0.9,
      color = "#00e5ff",
      fillOpacity = 0.75,
      highlight = highlightOptions(
        weight = 2.5,
        color = "#00ffff",
        fillOpacity = 0.9,
        bringToFront = TRUE
      ),
      label = labels,
      labelOptions = labelOptions(
        style = list(
          "background" = "rgba(10, 14, 26, 0.95)",
          "border" = "2px solid #00e5ff",
          "border-radius" = "6px",
          "padding" = "10px",
          "box-shadow" = "0 0 15px rgba(0, 229, 255, 0.6)"
        ),
        textsize = "13px"
      ),
      group = var_display
    )
}

mapa <- mapa %>%
  addLayersControl(
    baseGroups = names(variables_mapa),
    options = layersControlOptions(collapsed = FALSE),
    position = "topleft"
  ) %>%
  hideGroup(names(variables_mapa)[-1])

mapa <- mapa %>%
  htmlwidgets::onRender("
    function(el, x) {
      var map = this;
      
      // Configuración de leyendas
      var legendConfigs = {
        'Crecimiento PIB': {
          title: 'CRECIMIENTO DEL PIB',
          subtitle: '(% anual)',
          min: -10,
          max: 10,
          colors: ['#ff1744', '#ff6b00', '#ffd600', '#00e676', '#00e5ff'],
          labels: ['-10%', '-5%', '0%', '5%', '10%']
        },
        'Acceso electricidad': {
          title: 'ACCESO A ELECTRICIDAD',
          subtitle: '(% de población)',
          min: 0,
          max: 100,
          colors: ['#1a1a2e', '#0084ff', '#00e5ff', '#00e676', '#ffd600'],
          labels: ['0%', '25%', '50%', '75%', '100%']
        },
        'Crecimiento poblacion': {
          title: 'CRECIMIENTO POBLACIÓN',
          subtitle: '(% anual)',
          min: -2,
          max: 4,
          colors: ['#0084ff', '#00e5ff', '#a259ff', '#ff6b00', '#ff1744'],
          labels: ['-2%', '-1%', '0%', '2%', '4%']
        }
      };
      
      // Crear leyenda
      var LegendControl = L.Control.extend({
        options: { position: 'bottomright' },
        onAdd: function(map) {
          var div = L.DomUtil.create('div', 'info legend');
          div.id = 'bar-legend';
          return div;
        }
      });
      
      map.addControl(new LegendControl());
      
      // Función para crear barra de gradiente
      function updateLegend(varName) {
        var div = document.getElementById('bar-legend');
        var config = legendConfigs[varName];
        
        // Crear gradiente CSS
        var gradient = 'linear-gradient(to right';
        config.colors.forEach(function(color) {
          gradient += ', ' + color;
        });
        gradient += ')';
        
        var html = '<div style=\"background: linear-gradient(135deg, #0a0e1a, #12161f); padding: 18px; border-radius: 10px; border: 2px solid #00e5ff; box-shadow: 0 8px 32px rgba(0,0,0,0.9); min-width: 280px;\">';
        
        // Título
        html += '<div style=\"color: #00e5ff; font-weight: 700; font-size: 13px; text-transform: uppercase; letter-spacing: 1.2px; margin-bottom: 4px; text-align: center; text-shadow: 0 0 10px rgba(0,229,255,0.5);\">' + config.title + '</div>';
        html += '<div style=\"color: #8b92a0; font-size: 11px; text-align: center; margin-bottom: 12px;\">' + config.subtitle + '</div>';
        
        // Barra de color
        html += '<div style=\"height: 20px; background: ' + gradient + '; border-radius: 4px; border: 1px solid #00e5ff; margin-bottom: 8px; box-shadow: inset 0 0 10px rgba(0,0,0,0.5);\"></div>';
        
        // Etiquetas
        html += '<div style=\"display: flex; justify-content: space-between; font-size: 11px; color: #e0e6ed;\">';
        config.labels.forEach(function(label) {
          html += '<span>' + label + '</span>';
        });
        html += '</div>';
        
        html += '</div>';
        div.innerHTML = html;
      }
      
      // Inicializar
      updateLegend('Crecimiento PIB');
      
      // Actualizar al cambiar capa
      map.on('baselayerchange', function(e) {
        updateLegend(e.name);
      });
      
      // Estilizar control de capas
      setTimeout(function() {
        var ctrl = document.querySelector('.leaflet-control-layers');
        if (ctrl) {
          ctrl.style.background = 'linear-gradient(135deg, #0a0e1a, #12161f)';
          ctrl.style.border = '2px solid rgba(0, 229, 255, 0.4)';
          ctrl.style.borderRadius = '10px';
          ctrl.style.padding = '18px';
          ctrl.style.boxShadow = '0 8px 32px rgba(0, 0, 0, 0.9)';
        }
        
        var base = document.querySelector('.leaflet-control-layers-base');
        if (base && !document.getElementById('sel-title')) {
          var title = document.createElement('div');
          title.id = 'sel-title';
          title.innerHTML = '<strong style=\"color: #00e5ff; font-size: 13px; text-transform: uppercase; letter-spacing: 1.5px; text-shadow: 0 0 10px rgba(0,229,255,0.5);\">📊 SELECCIONA VARIABLE</strong>';
          title.style.marginBottom = '12px';
          title.style.paddingBottom = '10px';
          title.style.borderBottom = '2px solid rgba(0, 229, 255, 0.3)';
          base.insertBefore(title, base.firstChild);
        }
        
        var labels = document.querySelectorAll('.leaflet-control-layers-base label');
        labels.forEach(function(label, idx) {
          label.style.color = '#e0e6ed';
          label.style.fontSize = '13px';
          label.style.fontWeight = '600';
          label.style.padding = '9px 12px';
          label.style.margin = '4px 0';
          label.style.display = 'block';
          label.style.borderRadius = '6px';
          label.style.cursor = 'pointer';
          label.style.transition = 'all 0.3s';
          
          var input = label.querySelector('input');
          if (input) {
            input.style.accentColor = '#00e5ff';
            if (idx === 0) {
              label.style.background = 'rgba(0, 229, 255, 0.15)';
              label.style.color = '#00e5ff';
            }
          }
          
          label.addEventListener('mouseenter', function() {
            this.style.background = 'rgba(0, 229, 255, 0.1)';
            this.style.color = '#00e5ff';
          });
          
          label.addEventListener('mouseleave', function() {
            if (!this.querySelector('input').checked) {
              this.style.background = 'transparent';
              this.style.color = '#e0e6ed';
            }
          });
        });
        
        var inputs = document.querySelectorAll('.leaflet-control-layers-base input');
        inputs.forEach(function(input) {
          input.addEventListener('change', function() {
            labels.forEach(function(l) {
              l.style.background = 'transparent';
              l.style.color = '#e0e6ed';
            });
            if (this.checked) {
              this.parentElement.style.background = 'rgba(0, 229, 255, 0.15)';
              this.parentElement.style.color = '#00e5ff';
            }
          });
        });
      }, 100);
    }
  ")

htmltools::tagList(
  htmltools::HTML(
    '<div style="
      text-align: center;
      color: #00e5ff;
      font-size: 22px;
      font-weight: bold;
      margin-bottom: 20px;
      text-shadow: 0 0 15px rgba(0, 229, 255, 0.5);
      text-transform: uppercase;
      letter-spacing: 2px;
    ">
       Figura 7: Distribución Geoespacial de Indicadores de Desarrollo Global 2022
    </div>'
  ),
  mapa
)
Figura 7: Distribución Geoespacial de Indicadores de Desarrollo Global 2022

En crecimiento PIB, se observa segregación clara: Europa y América del Norte tienden a tonos amarillo-verde (crecimiento moderado), mientras muchas naciones africanas muestran tonos oscuros (estancamiento). Asia exhibe máxima variabilidad: gigantes como India y Bangladesh en verde (crecimiento dinámico), mientras Japón mantiene tonos amarillos (crecimiento moderado). En acceso a electricidad, la brecha digital-energética es evidente: Europa, América del Norte y gran parte de Asia en amarillo (acceso universal), mientras amplias regiones de África central permanecen en azul oscuro. América Latina exhibe transición: colores intermedios reflejando acceso extendido pero no universal. En crecimiento poblacional, se observa un patrón opuesto al desarrollo económico: Europa y Japón dominan tonos azules (declive demográfico), mientras África muestra naranjas y rojos intensos (presión poblacional extrema), y América Latina ocupa posiciones intermedias. Esta disociación geográfica entre prosperidad económica, acceso de servicios básicos y dinámica demográfica anticipa que el análisis multivariado revelará si estas dimensiones operan de forma integrada o representan trayectorias diferentes del desarrollo.


4 Resultados del modelo

4.1 Analisis de componentes principales (ACP)

4.1.1 Matriz de correlaciones

Antes de aplicar el Análisis de Componentes Principales, es fundamental examinar la estructura de correlaciones entre las 17 variables para identificar redundancias potenciales y validar la pertinencia de la reducción de dimensionalidad. La matriz de correlación de Pearson revela las asociaciones lineales entre pares de variables, proporcionando una visión exploratoria de cómo las dimensiones del desarrollo se interrelacionan. (Jolliffe, 2002).

datos_analisis <- Base_2022 %>%
  select(-Codigo) %>%
  column_to_rownames("Pais")

matriz_cor <- cor(datos_analisis, use = "complete.obs")

nombres_completos <- c(
  "PIB_per" = "PIB per cápita",
  "Poblacion" = "Población total",
  "Esperanza vida" = "Esperanza de vida",
  "Acceso electricidad" = "Acceso electricidad",
  "Area boscosa" = "Área boscosa",
  "Suscripciones movil" = "Suscripciones móviles",
  "Crecimiento PIB" = "Crecimiento PIB",
  "Mortalidad infantil" = "Mortalidad infantil",
  "Inversion extranjera" = "Inversión extranjera",
  "Gasto salud" = "Gasto en salud",
  "Uso internet" = "Uso de internet",
  "Importaciones" = "Importaciones",
  "Exportaciones" = "Exportaciones",
  "Tierra cultivable" = "Tierra cultivable",
  "Crecimiento poblacion" = "Crecimiento población",
  "Industria" = "Industria",
  "Remesas" = "Remesas"
)

rownames(matriz_cor) <- nombres_completos[rownames(matriz_cor)]
colnames(matriz_cor) <- nombres_completos[colnames(matriz_cor)]

heatmap_interactivo <- plot_ly(
  x = colnames(matriz_cor),
  y = rownames(matriz_cor),
  z = matriz_cor,
  type = "heatmap",
  colors = colorRamp(c("#ff1744", "#0a0e1a", "#00e5ff")), 
  hoverinfo = "text",
  text = matrix(
    paste(
      "<b>", rep(colnames(matriz_cor), each = nrow(matriz_cor)), "</b><br>",
      "vs <b>", rep(rownames(matriz_cor), times = ncol(matriz_cor)), "</b><br>",
      "Correlación: <b style='color:#00e5ff'>", round(c(matriz_cor), 3), "</b>"
    ),
    nrow = nrow(matriz_cor),
    ncol = ncol(matriz_cor)
  ),
  colorbar = list(
    title = list(
      text = "<b>Correlación</b>",
      font = list(color = "#e0e6ed", size = 12)
    ),
    tickfont = list(color = "#8b92a0", size = 10),
    thickness = 15,
    len = 0.8
  )
) %>%
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:20px;'>Figura 8: Matriz de Correlaciones Multidimensional</b><br>
             <span style='color:#8b92a0; font-size:13px;'>17 Variables de Desarrollo Global | Año 2022</span>",
      x = 0.05,
      y = 0.95,
      font = list(size = 14)
    ),
    xaxis = list(
      title = "",
      tickangle = -45,
      tickfont = list(size = 10, color = "#8b92a0"),
      showgrid = FALSE,
      zeroline = FALSE
    ),
    yaxis = list(
      title = "",
      tickfont = list(size = 10, color = "#8b92a0"),
      showgrid = FALSE,
      zeroline = FALSE
    ),
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed'),
    margin = list(l = 180, r = 50, b = 180, t = 120),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 11, family = "Arial")
    ),
    annotations = list(
      list(
        x = 0.5,
        y = -0.18,
        text = "<span style='color:#8b92a0; font-size:11px;'>🔍 Haz clic y arrastra para zoom • 📊 Pasa el cursor para ver valores exactos</span>",
        showarrow = FALSE,
        xref = "paper",
        yref = "paper",
        font = list(size = 11)
      )
    )
  ) %>%
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "matriz_correlaciones_cyber",
      width = 1400,
      height = 1000
    )
  )

heatmap_interactivo
matriz_cor_long <- matriz_cor %>%
  as.data.frame() %>%
  rownames_to_column("Variable1") %>%
  pivot_longer(
    cols = -Variable1,
    names_to = "Variable2",
    values_to = "Correlacion"
  ) %>%
  filter(Variable1 != Variable2) %>%
  mutate(Correlacion = round(Correlacion, 3))

nombres_abreviados <- c(
  "PIB per cápita" = "PIB pc",
  "Población total" = "Población",
  "Esperanza de vida" = "Esp. vida",
  "Acceso electricidad" = "Electricidad",
  "Área boscosa" = "Bosques",
  "Suscripciones móviles" = "Móvil",
  "Crecimiento PIB" = "Crec. PIB",
  "Mortalidad infantil" = "Mort. inf.",
  "Inversión extranjera" = "IED",
  "Gasto en salud" = "Salud",
  "Uso de internet" = "Internet",
  "Importaciones" = "Import.",
  "Exportaciones" = "Export.",
  "Tierra cultivable" = "Cultivable",
  "Crecimiento población" = "Crec. pob.",
  "Industria" = "Industria",
  "Remesas" = "Remesas"
)

cor_significativas <- matriz_cor_long %>%
  mutate(
    Variable1_abr = nombres_abreviados[Variable1],
    Variable2_abr = nombres_abreviados[Variable2]
  ) %>%
  filter(abs(Correlacion) > 0.5) %>%
  arrange(desc(abs(Correlacion))) %>%
  select(Variable1_abr, Variable2_abr, Correlacion) %>%
  distinct()

tabla_cor <- cor_significativas %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 8: Correlaciones Significativas entre Variables**"),
    subtitle = "Relaciones con |r| > 0.5 entre indicadores de desarrollo global"
  ) %>%
  cols_label(
    Variable1_abr = md("**Variable 1**"),
    Variable2_abr = md("**Variable 2**"),
    Correlacion = md("**Correlación (r)**")
  ) %>%
  cols_align(
    align = "center",
    columns = everything()
  ) %>%
  fmt_number(
    columns = Correlacion,
    decimals = 3
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable1_abr, Variable2_abr))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = c(Variable1_abr, Variable2_abr))
  ) %>%
  tab_style(
    style = cell_fill(color = "rgba(0, 230, 118, 0.15)"),
    locations = cells_body(
      rows = Correlacion > 0.7
    )
  ) %>%
  tab_style(
    style = cell_fill(color = "rgba(255, 23, 68, 0.15)"),
    locations = cells_body(
      rows = Correlacion < -0.7
    )
  ) %>%
  tab_style(
    style = cell_text(color = "#00e676"),
    locations = cells_body(
      rows = Correlacion > 0.7,
      columns = Correlacion
    )
  ) %>%
  tab_style(
    style = cell_text(color = "#ff1744"),
    locations = cells_body(
      rows = Correlacion < -0.7,
      columns = Correlacion
    )
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(90),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(2),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 12,
    source_notes.font.size = 12,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuente:** Elaboración propia con base en World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "💚 Correlaciones positivas fuertes (r > 0.7) indican relaciones directas significativas",
    locations = cells_body(rows = 1)
  ) %>%
  tab_footnote(
    footnote = "❤️ Correlaciones negativas fuertes (r < -0.7) indican relaciones inversas significativas",
    locations = cells_body(rows = nrow(cor_significativas))
  )

tabla_cor
Tabla 8: Correlaciones Significativas entre Variables
Relaciones con |r| > 0.5 entre indicadores de desarrollo global
Variable 1 Variable 2 Correlación (r)
Esp. vida1 Mort. inf.1 −0.9041
Mort. inf. Esp. vida −0.904
Import. Export. 0.831
Export. Import. 0.831
Mort. inf. Internet −0.829
Internet Mort. inf. −0.829
Esp. vida Internet 0.823
Electricidad Internet 0.823
Internet Esp. vida 0.823
Internet Electricidad 0.823
Electricidad Mort. inf. −0.801
Mort. inf. Electricidad −0.801
Esp. vida Electricidad 0.761
Electricidad Esp. vida 0.761
PIB pc Esp. vida 0.685
Esp. vida PIB pc 0.685
PIB pc Internet 0.599
Internet PIB pc 0.599
PIB pc Mort. inf. −0.534
Mort. inf. PIB pc −0.534
Móvil Internet 0.511
Internet Móvil 0.511
Electricidad Crec. pob. −0.505
Crec. pob.2 Electricidad2 −0.5052
1 💚 Correlaciones positivas fuertes (r > 0.7) indican relaciones directas significativas
2 ❤️ Correlaciones negativas fuertes (r < -0.7) indican relaciones inversas significativas
Fuente: Elaboración propia con base en World Bank (2023)

La matriz de correlación entre todas las variables de desarrollo es fundamental porque exhibe patrones predecibles: variables económicas tienden a correlacionarse positivamente entre sí (PIB per cápita, crecimiento del PIB, inversión extranjera), variables de bienestar social correlacionan positivamente (esperanza de vida, acceso a electricidad, uso de internet), y existe una correlación positiva sustancial entre estas dos dimensiones generales (Hastie et al., 2009). Adicionalmente, se observan correlaciones negativas entre indicadores de rezago (mortalidad infantil, tierra cultivable) y variables de desarrollo avanzado, reflejando que países con mayor riqueza y bienestar exhiben menores tasas de mortalidad y menor dependencia agrícola. La presencia de correlaciones altas (superiores a 0.7) entre múltiples pares de variables justifica plenamente la aplicación del ACP: la reducción dimensional elimina redundancia sin perder información esencial (Jolliffe, 2002; Hastie et al., 2009).

4.1.2 ACP

El Análisis de Componentes Principales fue aplicado al conjunto de 17 variables estandarizadas para identificar las dimensiones latentes subyacentes de variabilidad en el desarrollo internacional. El procedimiento consiste en la descomposición espectral de la matriz de covarianza estandarizada, identificando vectores propios (componentes) ordenados según sus valores propios (autovalores) en orden descendente. Cada componente principal es una combinación lineal ortogonal de las variables originales, diseñada para capturar la máxima varianza posible de manera sucesiva (Jolliffe, 2002; Hastie et al., 2009).

acp_temp <- dudi.pca(datos_analisis, center = TRUE, scale = TRUE, scannf = FALSE, nf = ncol(datos_analisis))

varianza_acum <- cumsum(acp_temp$eig) / sum(acp_temp$eig) * 100

n_componentes <- which(varianza_acum >= 70)[1]

acp_resultado <- dudi.pca(
  df = datos_analisis,
  center = TRUE,
  scale = TRUE,
  scannf = FALSE,
  nf = n_componentes
)

factores <- acp_resultado$li
varianza_df <- data.frame(
  Componente = factor(1:length(acp_resultado$eig)),
  Varianza = acp_resultado$eig / sum(acp_resultado$eig) * 100,
  VarianzaAcum = varianza_acum
) %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 9**"),
    subtitle = "Varianza Explicada por Componentes Principales"
  ) %>%
  cols_label(
    Componente = md("**Componente**"),
    Varianza = md("**Varianza (%)**"),
    VarianzaAcum = md("**Varianza Acumulada (%)**")
  ) %>%
  cols_align(
    align = "center",
    columns = everything()
  ) %>%
  fmt_number(
    columns = c(Varianza, VarianzaAcum),
    decimals = 2
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Componente, Varianza))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Componente)
  ) %>%
  tab_style(
    style = cell_text(size = "small", color = "#e0e6ed"),
    locations = cells_body(columns = c(Varianza, VarianzaAcum))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#12161f"),
      cell_text(color = "#00ffff", weight = "bold")
    ),
    locations = cells_body(rows = 1)
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(12),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en los resultados del ACP (Análisis de Componentes Principales)")
  ) %>%
  tab_footnote(
    footnote = "Porcentaje de varianza explicada individualmente por cada componente principal en el espacio multidimensional",
    locations = cells_body(
      rows = 1,
      columns = Varianza
    )
  ) %>%
  tab_footnote(
    footnote = "Porcentaje acumulado de varianza explicada por los componentes hasta el actual. Determina el número óptimo de componentes",
    locations = cells_body(
      rows = 1,
      columns = VarianzaAcum
    )
  ) %>%
  tab_footnote(
    footnote = "Los componentes principales se ordenan de mayor a menor varianza explicada. Un nivel de 70-80% acumulado es típicamente considerado suficiente",
    locations = cells_title(groups = "subtitle")
  )

varianza_df
Tabla 9
Varianza Explicada por Componentes Principales1
Componente Varianza (%) Varianza Acumulada (%)
1 29.062 29.063
2 12.17 41.22
3 11.13 52.36
4 7.83 60.19
5 6.96 67.15
6 6.42 73.57
7 5.69 79.26
8 5.14 84.39
9 4.55 88.94
10 3.13 92.07
11 2.62 94.69
12 1.84 96.53
13 1.27 97.81
14 0.99 98.80
15 0.63 99.43
16 0.35 99.78
17 0.22 100.00
1 Los componentes principales se ordenan de mayor a menor varianza explicada. Un nivel de 70-80% acumulado es típicamente considerado suficiente
2 Porcentaje de varianza explicada individualmente por cada componente principal en el espacio multidimensional
3 Porcentaje acumulado de varianza explicada por los componentes hasta el actual. Determina el número óptimo de componentes
Fuentes: Elaboración propia con base en los resultados del ACP (Análisis de Componentes Principales)
varianza_df <- data.frame(
  Componente = paste0("PC", 1:length(acp_resultado$eig)),
  Varianza = acp_resultado$eig / sum(acp_resultado$eig) * 100,
  VarianzaAcum = varianza_acum
)

pc1_var <- round(varianza_df$Varianza[1], 1)
pc2_var <- round(varianza_df$Varianza[2], 1)
pc3_var <- round(varianza_df$Varianza[3], 1)
pc4_var <- round(varianza_df$Varianza[4], 1)
pc5_var <- round(varianza_df$Varianza[5], 1)
pc6_var <- round(varianza_df$Varianza[6], 1)

pc1_acum <- round(varianza_df$VarianzaAcum[1], 1)
pc2_acum <- round(varianza_df$VarianzaAcum[2], 1)
pc3_acum <- round(varianza_df$VarianzaAcum[3], 1)
pc4_acum <- round(varianza_df$VarianzaAcum[4], 1)
pc5_acum <- round(varianza_df$VarianzaAcum[5], 1)
pc6_acum <- round(varianza_df$VarianzaAcum[6], 1)

En este análisis, el primer componente (PC1) capturó un 29.1% de la varianza total, lo que indica que existe una dimensión principal que diferencia fundamentalmente a los países. Los componentes posteriores capturan variabilidad subsidiaria: el segundo componente (PC2) explica 12.2% (acumulando 41.2%), el tercero (PC3) 11.1% (acumulando 52.4%), el cuarto (PC4) 7.8% (acumulando 60.2%).

4.1.3 Grafico de sedimentacion

El gráfico de sedimentación visualiza el concepto del “codo” (elbow) introducido por Kaiser (1960). La curva de los eigenvalores (representada como barras) exhibe un descenso pronunciado en los primeros componentes, indicando que capturan varianza sustancial. A partir de cierto componente, la pendiente se aplana significativamente, entrando en un régimen donde componentes posteriores explican proporciones cada vez menores de varianza residual (Hastie et al., 2009).

res.pca <- prcomp(datos_analisis, scale = TRUE)

eig.val <- get_eigenvalue(res.pca)

n_comp <- min(10, nrow(eig.val))

eig_df <- data.frame(
  Componente = factor(1:n_comp),
  Varianza = eig.val[1:n_comp, 2]
)

g <- ggplot(eig_df, aes(x = Componente, y = Varianza)) +
  geom_bar(stat = "identity", fill = "#00e5ff", color = "#00e5ff", alpha = 0.8) +
  geom_line(aes(group = 1), color = "#00e5ff", size = 1) +
  geom_point(color = "#00e5ff", size = 2) +
  geom_text(aes(label = round(Varianza, 1)), color = "#ffffff", vjust = -0.4, fontface = "bold", size = 4) +
  theme_cyber() +
  labs(
    title = "Figura 9: Varianza Explicada por Componente Principal",
    subtitle = "Autovalores del análisis de componentes principales",
    x = "Componentes Principales",
    y = "Porcentaje de Varianza Explicada (%)"
  ) +
  theme(
    plot.title = element_text(face = "bold", size = 18, hjust = 0.5, color = "#00e5ff", margin = margin(b = 10)),
    plot.subtitle = element_text(size = 13, hjust = 0.5, color = "#8b92a0", margin = margin(b = 15)),
    axis.title = element_text(face = "bold", size = 14, color = "#e0e6ed"),
    axis.title.x = element_text(margin = margin(t = 10)),
    axis.title.y = element_text(margin = margin(r = 10)),
    axis.text = element_text(size = 11, color = "#8b92a0"),
    panel.grid.minor = element_blank(),
    panel.grid.major = element_line(color = "#12161f", size = 0.5)
  ) +
  ylim(0, max(eig_df$Varianza) + 5)

g

El punto donde esta curvatura cambia de pronunciada a plana (el “codo”) indica aproximadamente el número de componentes que retienen información relevante; componentes posteriores al codo tienden a capturar principalmente ruido estadístico (Jolliffe, 2002). Y se selecciona 4 componentes ya que a partir de \(k=4\) se comienza a aplanar la varianza explicada.

4.1.4 Contribución de Variables a Componentes Principales

La comprensión de cómo cada variable original contribuye a la definición de los componentes principales es esencial para interpretar las dimensiones latentes descubiertas. La contribución de una variable a un componente cuantifica el grado en el cual esa variable particular “explica” o “define” la dirección de ese componente en el espacio multidimensional original. Matemáticamente, la contribución se expresa como porcentaje de la varianza del componente que puede atribuirse a cada variable (Hastie et al., 2009; Jolliffe, 2002).

Adicionalmente, la calidad de representación (\(cos²\)) de una variable en un componente indica qué proporción de la variabilidad total de esa variable es capturada por el componente. Un \(cos²\) cercano a 1 significa que la variable está casi completamente explicada por ese componente; un \(cos²\) cercano a 0 significa que la variable requiere componentes posteriores para ser bien representada (Jolliffe, 2002). Estas dos medidas—contribución y \(cos^2\) son complementarias: la primera explica la importancia relativa de una variable en definir un componente; la segunda explica qué tan bien ese componente explica la variable (Hastie et al., 2009).

contribuciones <- as.data.frame(acp_resultado$co)
contribuciones$Variable <- rownames(contribuciones)

cos2_df <- as.data.frame(acp_resultado$co^2)
cos2_df$Variable <- rownames(cos2_df)
crear_tabla_contribucion <- function(componente_num, contribuciones, cos2_df, titulo, tabla_num) {
  
  comp_data <- data.frame(
    Variable = rownames(contribuciones),
    Descripcion = round(abs(contribuciones[, componente_num]), 4),
    Interpretacion = round(cos2_df[, componente_num], 4)
  )
  
  comp_data <- comp_data[order(comp_data$Descripcion, decreasing = TRUE), ]
  rownames(comp_data) <- NULL
  
  tabla <- comp_data %>%
    gt() %>%
    tab_header(
      title = md(paste0("**Tabla ", tabla_num, "**")),
      subtitle = titulo
    ) %>%
    cols_label(
      Variable = md("**Variable**"),
      Descripcion = md("**Loading**"),
      Interpretacion = md("**Cos²**")
    ) %>%
    cols_align(
      align = "center",
      columns = everything()
    ) %>%
    tab_style(
      style = list(
        cell_text(weight = "bold", size = "medium", color = "#000000"),
        cell_fill(color = "#00e5ff")
      ),
      locations = cells_column_labels()
    ) %>%
    tab_style(
      style = cell_borders(
        sides = c("top", "bottom"),
        color = "#00e5ff",
        weight = px(2)
      ),
      locations = list(
        cells_column_labels(),
        cells_body()
      )
    ) %>%
    tab_style(
      style = cell_borders(
        sides = "right",
        color = "#00e5ff",
        weight = px(1)
      ),
      locations = cells_body(columns = c(Variable, Descripcion))
    ) %>%
    tab_style(
      style = list(
        cell_fill(color = "#0a0e1a"),
        cell_text(color = "#e0e6ed")
      ),
      locations = cells_body()
    ) %>%
    tab_style(
      style = list(
        cell_text(weight = "bold", color = "#00e5ff"),
        cell_fill(color = "#12161f"),
        cell_borders(sides = "left", color = "#00e5ff", weight = px(2))
      ),
      locations = cells_body(columns = Variable)
    ) %>%
    tab_style(
      style = list(
        cell_text(color = "#00e676", weight = "bold"),
        cell_fill(color = "rgba(0, 230, 118, 0.1)")
      ),
      locations = cells_body(
        columns = Descripcion,
        rows = Descripcion > 0.3
      )
    ) %>%
    tab_style(
      style = list(
        cell_text(color = "#a259ff", weight = "bold"),
        cell_fill(color = "rgba(162, 89, 255, 0.1)")
      ),
      locations = cells_body(
        columns = Interpretacion,
        rows = Interpretacion > 0.7
      )
    ) %>%
    tab_style(
      style = list(
        cell_text(color = "#ffd600"),
        cell_fill(color = "rgba(255, 214, 0, 0.08)")
      ),
      locations = cells_body(
        columns = Descripcion,
        rows = Descripcion >= 0.15 & Descripcion <= 0.3
      )
    ) %>%
    tab_style(
      style = list(
        cell_text(weight = "bold", color = "#00e5ff", size = "large")
      ),
      locations = cells_title(groups = "title")
    ) %>%
    tab_style(
      style = list(
        cell_text(color = "#8b92a0", size = "medium")
      ),
      locations = cells_title(groups = "subtitle")
    ) %>%
    tab_options(
      table.font.names = "Arial",
      table.width = pct(100),
      table.border.top.style = "none",
      table.border.bottom.style = "none",
      column_labels.border.top.style = "solid",
      column_labels.border.top.color = "#00e5ff",
      column_labels.border.top.width = px(3),
      column_labels.border.bottom.style = "solid",
      column_labels.border.bottom.width = px(3),
      column_labels.border.bottom.color = "#00e5ff",
      table_body.border.bottom.style = "none",
      table_body.border.top.style = "none",
      table_body.hlines.style = "solid",
      table_body.hlines.color = "#00e5ff",
      table_body.hlines.width = px(1),
      table.background.color = "#0a0e1a",
      data_row.padding = px(12),
      heading.title.font.size = 18,
      heading.subtitle.font.size = 14,
      heading.padding = px(12),
      heading.border.bottom.style = "solid",
      heading.border.bottom.width = px(2),
      heading.border.bottom.color = "#00e5ff",
      footnotes.padding = px(10),
      footnotes.font.size = 13,
      source_notes.font.size = 13,
      source_notes.padding = px(10)
    ) %>%
    tab_source_note(
      source_note = md("**Fuentes:** Elaboración propia con base en los resultados del ACP")
    ) %>%
    tab_footnote(
      footnote = "Loading: Contribución de la variable al componente. >0.3 = fuerte (verde), 0.15-0.3 = moderada (amarillo)",
      locations = cells_title(groups = "subtitle")
    ) %>%
    tab_footnote(
      footnote = "Cos²: Calidad de representación. >0.7 = excelente (púrpura), valores cercanos a 1 = mejor representación",
      locations = cells_body(rows = 1, columns = Interpretacion)
    )
  
  return(tabla)
}

tabla_pc1 <- crear_tabla_contribucion(
  1, contribuciones, cos2_df,
  "Contribución de Variables al Componente Principal 1 (24.3% de varianza)",
  10
)

tabla_pc2 <- crear_tabla_contribucion(
  2, contribuciones, cos2_df,
  "Contribución de Variables al Componente Principal 2 (13.5% de varianza)", 
  11
)

tabla_pc3 <- crear_tabla_contribucion(
  3, contribuciones, cos2_df,
  "Contribución de Variables al Componente Principal 3 (9.1% de varianza)",
  12
)

tabla_pc4 <- crear_tabla_contribucion(
  4, contribuciones, cos2_df,
  "Contribución de Variables al Componente Principal 4 (7.5% de varianza)",
  13
)

tabla_pc1
Tabla 10
Contribución de Variables al Componente Principal 1 (24.3% de varianza)1
Variable Loading Cos²
Esperanza vida 0.9179 0.84262
Uso internet 0.9170 0.8408
Mortalidad infantil 0.9074 0.8233
Acceso electricidad 0.8242 0.6793
PIB_per 0.6677 0.4459
Exportaciones 0.5441 0.2960
Suscripciones movil 0.5353 0.2865
Crecimiento poblacion 0.4980 0.2480
Gasto salud 0.4846 0.2348
Importaciones 0.3854 0.1485
Remesas 0.2430 0.0591
Inversion extranjera 0.1527 0.0233
Area boscosa 0.0743 0.0055
Poblacion 0.0505 0.0026
Tierra cultivable 0.0425 0.0018
Crecimiento PIB 0.0299 0.0009
Industria 0.0216 0.0005
1 Loading: Contribución de la variable al componente. >0.3 = fuerte (verde), 0.15-0.3 = moderada (amarillo)
2 Cos²: Calidad de representación. >0.7 = excelente (púrpura), valores cercanos a 1 = mejor representación
Fuentes: Elaboración propia con base en los resultados del ACP
tabla_pc2
Tabla 11
Contribución de Variables al Componente Principal 2 (13.5% de varianza)1
Variable Loading Cos²
Industria 0.7400 0.54762
Crecimiento poblacion 0.6278 0.3941
Remesas 0.4983 0.2483
Gasto salud 0.4369 0.1909
Importaciones 0.4088 0.1671
Tierra cultivable 0.3472 0.1206
Crecimiento PIB 0.3354 0.1125
PIB_per 0.2815 0.0792
Suscripciones movil 0.2746 0.0754
Area boscosa 0.2634 0.0694
Uso internet 0.1677 0.0281
Poblacion 0.1308 0.0171
Esperanza vida 0.1070 0.0115
Inversion extranjera 0.0791 0.0063
Acceso electricidad 0.0132 0.0002
Exportaciones 0.0125 0.0002
Mortalidad infantil 0.0050 0.0000
1 Loading: Contribución de la variable al componente. >0.3 = fuerte (verde), 0.15-0.3 = moderada (amarillo)
2 Cos²: Calidad de representación. >0.7 = excelente (púrpura), valores cercanos a 1 = mejor representación
Fuentes: Elaboración propia con base en los resultados del ACP
tabla_pc3
Tabla 12
Contribución de Variables al Componente Principal 3 (9.1% de varianza)1
Variable Loading Cos²
Importaciones 0.7136 0.50922
Exportaciones 0.6994 0.4892
Inversion extranjera 0.5110 0.2611
Area boscosa 0.3756 0.1411
Poblacion 0.3618 0.1309
Crecimiento PIB 0.3525 0.1243
Acceso electricidad 0.2684 0.0720
Crecimiento poblacion 0.2573 0.0662
Mortalidad infantil 0.1741 0.0303
Gasto salud 0.1346 0.0181
Suscripciones movil 0.1258 0.0158
Esperanza vida 0.0909 0.0083
Remesas 0.0907 0.0082
Industria 0.0873 0.0076
PIB_per 0.0682 0.0046
Uso internet 0.0585 0.0034
Tierra cultivable 0.0486 0.0024
1 Loading: Contribución de la variable al componente. >0.3 = fuerte (verde), 0.15-0.3 = moderada (amarillo)
2 Cos²: Calidad de representación. >0.7 = excelente (púrpura), valores cercanos a 1 = mejor representación
Fuentes: Elaboración propia con base en los resultados del ACP
tabla_pc4
Tabla 13
Contribución de Variables al Componente Principal 4 (7.5% de varianza)1
Variable Loading Cos²
Tierra cultivable 0.6393 0.40862
Area boscosa 0.5925 0.3510
Poblacion 0.5439 0.2958
Crecimiento PIB 0.3098 0.0960
Gasto salud 0.2058 0.0423
Industria 0.1835 0.0337
Acceso electricidad 0.1562 0.0244
Exportaciones 0.1340 0.0180
Inversion extranjera 0.1237 0.0153
Importaciones 0.1065 0.0113
Esperanza vida 0.0943 0.0089
Remesas 0.0913 0.0083
Crecimiento poblacion 0.0858 0.0074
Mortalidad infantil 0.0728 0.0053
PIB_per 0.0603 0.0036
Uso internet 0.0321 0.0010
Suscripciones movil 0.0292 0.0009
1 Loading: Contribución de la variable al componente. >0.3 = fuerte (verde), 0.15-0.3 = moderada (amarillo)
2 Cos²: Calidad de representación. >0.7 = excelente (púrpura), valores cercanos a 1 = mejor representación
Fuentes: Elaboración propia con base en los resultados del ACP

4.1.5 Análisis Multivariado: Interpretación de Componentes y Países

Una vez identificados los componentes principales y cuantificadas las contribuciones de cada variable, es fundamental realizar un análisis multivariado que permita interpretar simultáneamente las relaciones entre países y variables en el espacio reducido de componentes principales. Este análisis se fundamenta en visualizaciones bidimensionales que proyectan tanto países (individuos) como variables sobre los planos definidos por pares de componentes principales, revelando patrones de similitud, agrupamientos naturales y características diferenciadoras entre grupos de países (Jolliffe, 2002; Hastie et al., 2009).

En la Gráfica 1 observamos la proyección de los países en el espacio reducido de las dos primeras dimensiones del análisis de componentes principales.

ind_data <- get_pca_ind(res.pca)

ind_df <- data.frame(
  Pais = rownames(ind_data$coord),
  Dim1 = ind_data$coord[, 1],
  Dim2 = ind_data$coord[, 2],
  Dim3 = ind_data$coord[, 3],
  Dim4 = ind_data$coord[, 4],
  Contrib1 = ind_data$contrib[, 1],
  Contrib2 = ind_data$contrib[, 2],
  Contrib3 = ind_data$contrib[, 3],
  Contrib4 = ind_data$contrib[, 4],
  Cos2_1 = ind_data$cos2[, 1],
  Cos2_2 = ind_data$cos2[, 2],
  Cos2_3 = ind_data$cos2[, 3],
  Cos2_4 = ind_data$cos2[, 4]
)

cyber_color_scale <- colorRampPalette(c("#0084ff", "#00e5ff", "#a259ff", "#ff1744"))(100)

p1 <- plot_ly(ind_df,
              x = ~Dim1, 
              y = ~Dim2,
              color = ~Contrib1,
              colors = cyber_color_scale,
              text = ~paste("<b style='color:#00e5ff; font-size:14px;'>", Pais, "</b><br>",
                            "<span style='color:#8b92a0;'>COORDENADAS PCA:</span><br>",
                            "├─ Dim 1: <b style='color:#00e676;'>", round(Dim1, 3), "</b><br>",
                            "├─ Dim 2: <b style='color:#00e5ff;'>", round(Dim2, 3), "</b><br>",
                            "<br><span style='color:#8b92a0;'>CONTRIBUCIÓN:</span><br>",
                            "├─ Dim 1: <b style='color:#ffd600;'>", round(Contrib1, 2), "%</b><br>",
                            "├─ Dim 2: <b style='color:#a259ff;'>", round(Contrib2, 2), "%</b><br>",
                            "<br><span style='color:#8b92a0;'>CALIDAD REPRESENTACIÓN (Cos²):</span><br>",
                            "├─ Dim 1: <b style='color:#00e676;'>", round(Cos2_1, 3), "</b><br>",
                            "└─ Dim 2: <b style='color:#0084ff;'>", round(Cos2_2, 3), "</b>"),
              type = "scatter",
              mode = "markers",
              marker = list(
                size = 12, 
                opacity = 0.85, 
                line = list(width = 1.5, color = "#ffffff"),
                symbol = 'circle'
              ),
              hovertemplate = '%{text}<extra></extra>') %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:20px;'>Figura 10: Análisis de Componentes Principales</b><br>
             <span style='color:#8b92a0; font-size:14px;'>Individuos: Dimensión 1 vs Dimensión 2 | Coloreado por Contribución a Dim 1</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.95
    ),
    xaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 1</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    yaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 2</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    hovermode = "closest",
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    margin = list(l = 80, r = 50, b = 80, t = 100),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    coloraxis = list(
      colorbar = list(
        title = list(
          text = "<b>Contribución<br>Dim 1 (%)</b>",
          font = list(size = 12, color = "#e0e6ed")
        ),
        tickfont = list(color = '#8b92a0', size = 11),
        thickness = 20,
        len = 0.75
      )
    ),
    annotations = list(
      list(
        x = 0.5, 
        y = -0.12,
        xref = "paper", 
        yref = "paper",
        text = "<span style='color:#8b92a0; font-size:11px;'>Cada punto representa un país. Colores indican contribución a la Dimensión 1. Hover para detalles.</span>",
        showarrow = FALSE,
        xanchor = "center",
        align = "center"
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "pca_individuos_dim1_dim2",
      width = 1200,
      height = 800
    )
  )

p1

En la dimensión 1, Níger emerge como el mayor contribuidor, posicionándose en el extremo negativo del eje que representa el déficit en desarrollo humano y conectividad tecnológica, reflejando severas limitaciones en acceso a servicios básicos, mortalidad infantil elevada y baja penetración digital. Le sigue San Marino, ubicado en el extremo positivo, representando un microestado con indicadores de bienestar consolidados en salud y esperanza de vida. En la dimensión 2, Qatar lidera como mayor contribuidor, posicionándose en el extremo inferior del eje, consolidándose como economía petroquímica ultraespecializada con estructura industrial dominada por hidrocarburos y dinámicas demográficas atípicas. Islas Marshall emerge como segundo mayor contribuidor, ubicándose en el extremo superior, caracterizándose como Estado insular vulnerable con alta dependencia de ayuda externa y servicios financieros.

En la Figura 9 observamos la proyección de los países en el espacio reducido de las dos ultimas dimensiones del análisis de componentes principales.

p2 <- plot_ly(ind_df,
              x = ~Dim3, 
              y = ~Dim4,
              color = ~Contrib3,
              colors = cyber_color_scale,
              text = ~paste("<b style='color:#00e5ff; font-size:14px;'>", Pais, "</b><br>",
                            "<span style='color:#8b92a0;'>COORDENADAS PCA:</span><br>",
                            "├─ Dim 3: <b style='color:#00e676;'>", round(Dim3, 3), "</b><br>",
                            "├─ Dim 4: <b style='color:#00e5ff;'>", round(Dim4, 3), "</b><br>",
                            "<br><span style='color:#8b92a0;'>CONTRIBUCIÓN:</span><br>",
                            "├─ Dim 3: <b style='color:#ffd600;'>", round(Contrib3, 2), "%</b><br>",
                            "├─ Dim 4: <b style='color:#a259ff;'>", round(Contrib4, 2), "%</b><br>",
                            "<br><span style='color:#8b92a0;'>CALIDAD REPRESENTACIÓN (Cos²):</span><br>",
                            "├─ Dim 3: <b style='color:#00e676;'>", round(Cos2_3, 3), "</b><br>",
                            "└─ Dim 4: <b style='color:#0084ff;'>", round(Cos2_4, 3), "</b>"),
              type = "scatter",
              mode = "markers",
              marker = list(
                size = 12, 
                opacity = 0.85, 
                line = list(width = 1.5, color = "#ffffff"),
                symbol = 'circle'
              ),
              hovertemplate = '%{text}<extra></extra>') %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:20px;'>Figura 11: Análisis de Componentes Principales</b><br>
             <span style='color:#8b92a0; font-size:14px;'>Individuos: Dimensión 3 vs Dimensión 4 | Coloreado por Contribución a Dim 3</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.95
    ),
    xaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 3</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    yaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 4</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    hovermode = "closest",
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    margin = list(l = 80, r = 50, b = 80, t = 100),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    coloraxis = list(
      colorbar = list(
        title = list(
          text = "<b>Contribución<br>Dim 3 (%)</b>",
          font = list(size = 12, color = "#e0e6ed")
        ),
        tickfont = list(color = '#8b92a0', size = 11),
        thickness = 20,
        len = 0.75
      )
    ),
    annotations = list(
      list(
        x = 0.5, 
        y = -0.12,
        xref = "paper", 
        yref = "paper",
        text = "<span style='color:#8b92a0; font-size:11px;'>Cada punto representa un país. Colores indican contribución a la Dimensión 3. Hover para detalles.</span>",
        showarrow = FALSE,
        xanchor = "center",
        align = "center"
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "pca_individuos_dim3_dim4",
      width = 1200,
      height = 800
    )
  )

p2

En la dimensión 3, Malta emerge como el mayor contribuidor, posicionándose en el extremo positivo del eje que representa economías hiperglobalizadas con ratios comerciales excesivamente altos, reflejando su condición de centro financiero y comercial con flujos internacionales que superan significativamente su PIB. China se sitúa en el extremo negativo, evidenciando una estructura comercial más balanceada basada en exportaciones de manufactura y sostenida por una vasta base poblacional. En la dimensión 4, India se coloca en el extremo negativo, reflejando presión demográfica extrema sobre recursos naturales (1,400 millones de habitantes sobre territorio limitado generan demanda exponencial de tierra cultivable y agua). Timor-Leste se ubica en el extremo positivo, caracterizándose por baja densidad poblacional relativa y abundancia de cobertura forestal.

4.1.6 Representación de Variables en el Plano de Componentes Principales

El círculo de correlaciones es una herramienta fundamental para interpretar las dimensiones latentes capturadas por los componentes principales. Cada una de las 17 variables originales se representa como un vector (flecha) proyectado desde el origen hacia el plano bidimensional definido por los dos primeros componentes principales. La longitud de cada flecha indica la calidad de representación de esa variable: flechas largas (próximas al círculo unitario de referencia) indican variables bien representadas los componentes principales, mientras que flechas cortas indican que la variable requiere componentes posteriores para ser completamente explicada (Jolliffe, 2002; Hastie et al., 2009).

La dirección de cada flecha es decir, el ángulo que forma con los ejes indica cómo esa variable se correlaciona con los componentes. Las variables posicionadas en la dirección positiva del eje PC1 (hacia la derecha del gráfico) son aquellas que correlacionan positivamente con PC1 y, por lo tanto, caracterizan el polo derecho del eje.

En la Figura 10, correspondiente al círculo de correlaciones, observamos la proyección de las 17 variables originales en el plano definido por los dos primeros componentes principales.

var_data <- get_pca_var(res.pca)

var_df <- data.frame(
  Variable = rownames(var_data$coord),
  Dim1 = var_data$coord[, 1],
  Dim2 = var_data$coord[, 2],
  Dim3 = var_data$coord[, 3],
  Dim4 = var_data$coord[, 4],
  Dim5 = var_data$coord[, 5],
  Dim6 = var_data$coord[, 6],
  Contrib1 = var_data$contrib[, 1],
  Contrib2 = var_data$contrib[, 2],
  Contrib3 = var_data$contrib[, 3],
  Contrib4 = var_data$contrib[, 4],
  Contrib5 = var_data$contrib[, 5],
  Contrib6 = var_data$contrib[, 6],
  Cos2_1 = var_data$cos2[, 1],
  Cos2_2 = var_data$cos2[, 2],
  Cos2_3 = var_data$cos2[, 3],
  Cos2_4 = var_data$cos2[, 4],
  Cos2_5 = var_data$cos2[, 5],
  Cos2_6 = var_data$cos2[, 6]
)

p1 <- plot_ly(var_df,
              x = ~Dim1, 
              y = ~Dim2,
              color = ~Contrib1,
              colors = cyber_color_scale,
              text = ~paste("<b style='color:#00e5ff; font-size:14px;'>", Variable, "</b><br>",
                            "<span style='color:#8b92a0;'>COORDENADAS PCA:</span><br>",
                            "├─ Dim 1: <b style='color:#00e676;'>", round(Dim1, 3), "</b><br>",
                            "├─ Dim 2: <b style='color:#00e5ff;'>", round(Dim2, 3), "</b><br>",
                            "<br><span style='color:#8b92a0;'>CONTRIBUCIÓN:</span><br>",
                            "├─ Dim 1: <b style='color:#ffd600;'>", round(Contrib1, 2), "%</b><br>",
                            "├─ Dim 2: <b style='color:#a259ff;'>", round(Contrib2, 2), "%</b><br>",
                            "<br><span style='color:#8b92a0;'>CALIDAD (Cos²):</span><br>",
                            "├─ Dim 1: <b style='color:#00e676;'>", round(Cos2_1, 3), "</b><br>",
                            "└─ Dim 2: <b style='color:#0084ff;'>", round(Cos2_2, 3), "</b>"),
              type = "scatter",
              mode = "markers",
              marker = list(
                size = 7,
                opacity = 0.8, 
                line = list(width = 0.5, color = "#ffffff"),
                symbol = 'circle'
              ),
              hovertemplate = '%{text}<extra></extra>') %>%
  
  add_segments(x = 0, xend = ~Dim1, y = 0, yend = ~Dim2,
               line = list(color = "rgba(0, 229, 255, 0.5)", width = 1.2),
               showlegend = FALSE, hoverinfo = "skip") %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:20px;'>Figura 12: Variables-Dimensión 1 vs Dimensión 2</b><br>
             <span style='color:#8b92a0; font-size:14px;'>Coloreado por Contribución a Dimensión 1</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.95
    ),
    xaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 1</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.6)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      range = c(-1.1, 1.1),
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    yaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 2</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.6)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      range = c(-1.1, 1.1),
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    hovermode = "closest",
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    margin = list(l = 80, r = 80, b = 80, t = 100),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 11, family = "Arial")
    ),
    coloraxis = list(
      colorbar = list(
        title = list(
          text = "<b>Contribución<br>Dim 1 (%)</b>",
          font = list(size = 12, color = "#e0e6ed")
        ),
        tickfont = list(color = '#8b92a0', size = 11),
        thickness = 20,
        len = 0.75
      )
    ),
    shapes = list(
      list(
        type = "circle",
        x0 = -1, x1 = 1,
        y0 = -1, y1 = 1,
        xref = "x", yref = "y",
        line = list(color = "rgba(0, 229, 255, 0.3)", width = 1.5, dash = "dash")
      )
    ),
    annotations = list(
      list(
        x = 0.5, 
        y = -0.12,
        xref = "paper", 
        yref = "paper",
        text = "<span style='color:#8b92a0; font-size:11px;'>Pasa el mouse sobre los puntos para ver detalles. Vectores = dirección e importancia de variables.</span>",
        showarrow = FALSE,
        xanchor = "center",
        align = "center"
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "pca_variables_dim1_dim2",
      width = 1200,
      height = 800
    )
  )

p1

En la dimensión 1, la Esperanza de vida lidera, posicionándose en el extremo positivo, consolidando un eje que representa desarrollo humano y calidad de vida. Simultáneamente, la Mortalidad infantil se posiciona en el extremo negativo, estableciendo un contraste fundamental entre naciones con alta esperanza de vida versus aquellas con elevada mortalidad neonatal refleja de sistemas de salud deficitarios. En la dimensión 2, la Industria en el extremo negativo refleja economías donde la dependencia de una única rama industrial es REDUCIDA o donde la manufactura está integrada verticalmente de manera autónoma. Las Remesas emergen como segundo vector importante en el extremo positivo, capturando economías ALTAMENTE DEPENDIENTES de transferencias de capital internacional, caracterizadas por débil base productiva propia y vulnerabilidad a ciclos externos.

En la Figura 11, correspondiente al círculo de correlaciones, observamos la proyección de las 17 variables originales en el plano definido por los componentes principales 3 y 4.

p2 <- plot_ly(var_df,
              x = ~Dim3, 
              y = ~Dim4,
              color = ~Contrib3,
              colors = cyber_color_scale,
              text = ~paste("<b style='color:#00e5ff; font-size:14px;'>", Variable, "</b><br>",
                            "<span style='color:#8b92a0;'>COORDENADAS PCA:</span><br>",
                            "├─ Dim 3: <b style='color:#00e676;'>", round(Dim3, 3), "</b><br>",
                            "├─ Dim 4: <b style='color:#00e5ff;'>", round(Dim4, 3), "</b><br>",
                            "<br><span style='color:#8b92a0;'>CONTRIBUCIÓN:</span><br>",
                            "├─ Dim 3: <b style='color:#ffd600;'>", round(Contrib3, 2), "%</b><br>",
                            "├─ Dim 4: <b style='color:#a259ff;'>", round(Contrib4, 2), "%</b><br>",
                            "<br><span style='color:#8b92a0;'>CALIDAD (Cos²):</span><br>",
                            "├─ Dim 3: <b style='color:#00e676;'>", round(Cos2_3, 3), "</b><br>",
                            "└─ Dim 4: <b style='color:#0084ff;'>", round(Cos2_4, 3), "</b>"),
              type = "scatter",
              mode = "markers",
              marker = list(
                size = 7,
                opacity = 0.8, 
                line = list(width = 0.5, color = "#ffffff"),
                symbol = 'circle'
              ),
              hovertemplate = '%{text}<extra></extra>') %>%
  
  add_segments(x = 0, xend = ~Dim3, y = 0, yend = ~Dim4,
               line = list(color = "rgba(0, 229, 255, 0.5)", width = 1.2),
               showlegend = FALSE, hoverinfo = "skip") %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:20px;'>Figura 13: Variables-Dimensión 3 vs Dimensión 4</b><br>
             <span style='color:#8b92a0; font-size:14px;'>Coloreado por Contribución a Dimensión 3</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.95
    ),
    xaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 3</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.6)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      range = c(-1.1, 1.1),
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    yaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 4</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.6)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      range = c(-1.1, 1.1),
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    hovermode = "closest",
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    margin = list(l = 80, r = 80, b = 80, t = 100),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 11, family = "Arial")
    ),
    coloraxis = list(
      colorbar = list(
        title = list(
          text = "<b>Contribución<br>Dim 3 (%)</b>",
          font = list(size = 12, color = "#e0e6ed")
        ),
        tickfont = list(color = '#8b92a0', size = 11),
        thickness = 20,
        len = 0.75
      )
    ),
    shapes = list(
      list(
        type = "circle",
        x0 = -1, x1 = 1,
        y0 = -1, y1 = 1,
        xref = "x", yref = "y",
        line = list(color = "rgba(0, 229, 255, 0.3)", width = 1.5, dash = "dash")
      )
    ),
    annotations = list(
      list(
        x = 0.5, 
        y = -0.12,
        xref = "paper", 
        yref = "paper",
        text = "<span style='color:#8b92a0; font-size:11px;'>Pasa el mouse sobre los puntos para ver detalles. Vectores = dirección e importancia de variables.</span>",
        showarrow = FALSE,
        xanchor = "center",
        align = "center"
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "pca_variables_dim3_dim4",
      width = 1200,
      height = 800
    )
  )

p2

En la dimensión 3, las Importaciones, Exportaciones e Inversión extranjera se posicionan en el extremo positivo, caracterizando economías altamente integradas en cadenas de valor globales con comercio y flujos de inversión exponenciados. Malta (comercio >260% del PIB), Singapur, Irlanda y otros micro-Estados/hubs financieros ocupan este polo.

En el extremo negativo se ubican Área boscosa y Población, países que preservan ecosistemas naturales tienden a tener menor integración comercial. Esto refleja que naciones con biodiversidad conservada (Timor-Leste, algunos países amazónicos con 70%+ bosques) típicamente tienen economías más locales, menos insertadas en globalización, y mercados más pequeños.

4.1.7 Análisis Integrado de Variables y Países

El análisis combinado de las variables y los países en el espacio reducido de los componentes principales permite identificar patrones de asociación estructural que trascienden el análisis univariable. La metodología del biplot permite vincular directamente las posiciones espaciales de los países con las magnitudes observadas en las variables originales, estableciendo relaciones interpretativas que evidencian cómo las características multidimensionales de desarrollo se manifiestan diferencialmente en distintos grupos de países (Jolliffe, 2002; Hastie et al., 2009).

Para comprender la lógica interpretativa del biplot, es fundamental reconocer que la posición de un país en relación a la dirección de una flecha de variable indica el valor relativo de ese país en esa variable específica. Países ubicados en la misma dirección que una flecha exhiben valores altos en esa variable; países ubicados en dirección opuesta exhiben valores bajos; países ubicados perpendicularmente (formando ángulos de ~\(90°\)) exhiben valores cercanos a la media global. Esta propiedad geométrica del biplot permite realizar diagnósticos cuantitativos directamente desde la visualización gráfica, sin necesidad de consultar la base de datos original, siempre que la calidad de representación (\(cos²\)) sea suficientemente alta (Jolliffe, 2002).

acp_prcomp <- prcomp(datos_analisis, center = TRUE, scale. = TRUE)
ind_data <- get_pca_ind(acp_prcomp)
var_data <- get_pca_var(acp_prcomp)

ind_df <- data.frame(
  Pais = rownames(ind_data$coord),
  Dim1 = ind_data$coord[, 1],
  Dim2 = ind_data$coord[, 2],
  Dim3 = ind_data$coord[, 3],
  Dim4 = ind_data$coord[, 4],
  Contrib1 = ind_data$contrib[, 1],
  Contrib2 = ind_data$contrib[, 2],
  Contrib3 = ind_data$contrib[, 3],
  Contrib4 = ind_data$contrib[, 4]
)

var_df <- data.frame(
  Variable = rownames(var_data$coord),
  Dim1 = var_data$coord[, 1] * 3,
  Dim2 = var_data$coord[, 2] * 3,
  Dim3 = var_data$coord[, 3] * 3,
  Dim4 = var_data$coord[, 4] * 3,
  Contrib1 = var_data$contrib[, 1],
  Contrib2 = var_data$contrib[, 2],
  Contrib3 = var_data$contrib[, 3],
  Contrib4 = var_data$contrib[, 4]
)

p1 <- plot_ly() %>%
  
  add_segments(
    data = var_df,
    x = 0, xend = ~Dim1, y = 0, yend = ~Dim2,
    line = list(color = "#00e5ff", width = 2),
    showlegend = FALSE, hoverinfo = "skip"
  ) %>%
  
  add_trace(
    data = var_df,
    x = ~Dim1, y = ~Dim2,
    text = ~paste("<b style='color:#00e5ff; font-size:14px;'>", Variable, "</b><br>",
                  "<span style='color:#8b92a0;'>COORDENADAS:</span><br>",
                  "├─ Dim 1: <b style='color:#00e676;'>", round(Dim1/3, 3), "</b><br>",
                  "├─ Dim 2: <b style='color:#00e5ff;'>", round(Dim2/3, 3), "</b><br>",
                  "<br><span style='color:#8b92a0;'>CONTRIBUCIÓN:</span><br>",
                  "├─ Dim 1: <b style='color:#ffd600;'>", round(Contrib1, 2), "%</b><br>",
                  "└─ Dim 2: <b style='color:#a259ff;'>", round(Contrib2, 2), "%</b>"),
    type = "scatter",
    mode = "markers",
    marker = list(
      size = 10, 
      color = "#00e5ff", 
      opacity = 0.9, 
      line = list(width = 1.5, color = "#ffffff")
    ),
    hovertemplate = '%{text}<extra></extra>',
    name = "Variables",
    showlegend = TRUE
  ) %>%
  
  add_trace(
    data = ind_df,
    x = ~Dim1, y = ~Dim2,
    text = ~paste("<b style='color:#00e5ff; font-size:14px;'>", Pais, "</b><br>",
                  "<span style='color:#8b92a0;'>COORDENADAS:</span><br>",
                  "├─ Dim 1: <b style='color:#00e676;'>", round(Dim1, 3), "</b><br>",
                  "├─ Dim 2: <b style='color:#00e5ff;'>", round(Dim2, 3), "</b><br>",
                  "<br><span style='color:#8b92a0;'>CONTRIBUCIÓN:</span><br>",
                  "├─ Dim 1: <b style='color:#ffd600;'>", round(Contrib1, 2), "%</b><br>",
                  "└─ Dim 2: <b style='color:#a259ff;'>", round(Contrib2, 2), "%</b>"),
    type = "scatter",
    mode = "markers",
    marker = list(
      size = 6, 
      color = "#4a9eff", 
      opacity = 0.5, 
      line = list(width = 0.5, color = "#00e5ff")
    ),
    hovertemplate = '%{text}<extra></extra>',
    name = "Países",
    showlegend = TRUE
  ) %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:22px;'>Figura 14: Biplot-Dimensión 1 vs Dimensión 2</b><br>
             <span style='color:#8b92a0; font-size:13px;'></span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.98
    ),
    xaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 1</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.6)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    yaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 2</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.6)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    hovermode = "closest",
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    margin = list(l = 80, r = 80, b = 80, t = 120),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 11, family = "Arial")
    ),
    legend = list(
      bgcolor = "rgba(10, 14, 26, 0.9)",
      bordercolor = "#00e5ff",
      borderwidth = 1.5,
      font = list(size = 12, color = "#e0e6ed"),
      x = 0.02,
      y = 0.98,
      xanchor = "left",
      yanchor = "top"
    ),
    annotations = list(
      list(
        x = 0.5, 
        y = -0.12,
        xref = "paper", 
        yref = "paper",
        text = "<span style='color:#8b92a0; font-size:11px;'>Vectores cyan = direcciones de máxima varianza | Puntos azules = posiciones de países en el espacio PCA</span>",
        showarrow = FALSE,
        xanchor = "center",
        align = "center"
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "biplot_dim1_dim2",
      width = 1400,
      height = 900
    )
  )

p1

Senegal y Burkina Faso se alinean con la flecha de mortalidad infantil, confirmando valores altos en esa variable. Egipto se alinea con crecimiento poblacional, indicando tasa de crecimiento demográfico elevada. Corea del Sur y Nueva Zelanda se alinean con exportaciones, indicando economías muy orientadas a comercio externo. Suiza se alinea con esperanza de vida, confirmando longevidad excepcional.

En dirección opuesta: países desarrollados europeos se oponen a flechas de mortalidad y rezago, reflejando valores bajos en estos indicadores negativos. Honduras y República Kirguisa se alinean con remesas, indicando dependencia crítica de transferencias de migrantes.

p2 <- plot_ly() %>%
  
  add_segments(
    data = var_df,
    x = 0, xend = ~Dim3, y = 0, yend = ~Dim4,
    line = list(color = "#00e5ff", width = 2),
    showlegend = FALSE, hoverinfo = "skip"
  ) %>%
  
  add_trace(
    data = var_df,
    x = ~Dim3, y = ~Dim4,
    text = ~paste("<b style='color:#00e5ff; font-size:14px;'>", Variable, "</b><br>",
                  "<span style='color:#8b92a0;'>COORDENADAS:</span><br>",
                  "├─ Dim 3: <b style='color:#00e676;'>", round(Dim3/3, 3), "</b><br>",
                  "├─ Dim 4: <b style='color:#00e5ff;'>", round(Dim4/3, 3), "</b><br>",
                  "<br><span style='color:#8b92a0;'>CONTRIBUCIÓN:</span><br>",
                  "├─ Dim 3: <b style='color:#ffd600;'>", round(Contrib3, 2), "%</b><br>",
                  "└─ Dim 4: <b style='color:#a259ff;'>", round(Contrib4, 2), "%</b>"),
    type = "scatter",
    mode = "markers",
    marker = list(
      size = 10, 
      color = "#00e5ff", 
      opacity = 0.9, 
      line = list(width = 1.5, color = "#ffffff")
    ),
    hovertemplate = '%{text}<extra></extra>',
    name = "Variables",
    showlegend = TRUE
  ) %>%
  
  add_trace(
    data = ind_df,
    x = ~Dim3, y = ~Dim4,
    text = ~paste("<b style='color:#00e5ff; font-size:14px;'>", Pais, "</b><br>",
                  "<span style='color:#8b92a0;'>COORDENADAS:</span><br>",
                  "├─ Dim 3: <b style='color:#00e676;'>", round(Dim3, 3), "</b><br>",
                  "├─ Dim 4: <b style='color:#00e5ff;'>", round(Dim4, 3), "</b><br>",
                  "<br><span style='color:#8b92a0;'>CONTRIBUCIÓN:</span><br>",
                  "├─ Dim 3: <b style='color:#ffd600;'>", round(Contrib3, 2), "%</b><br>",
                  "└─ Dim 4: <b style='color:#a259ff;'>", round(Contrib4, 2), "%</b>"),
    type = "scatter",
    mode = "markers",
    marker = list(
      size = 6, 
      color = "#4a9eff", 
      opacity = 0.5, 
      line = list(width = 0.5, color = "#00e5ff")
    ),
    hovertemplate = '%{text}<extra></extra>',
    name = "Países",
    showlegend = TRUE
  ) %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:22px;'>Figura 15: Biplot-Dimensión 3 vs Dimensión 4</b><br>
             <span style='color:#8b92a0; font-size:13px;'></span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.98
    ),
    xaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 3</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.6)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    yaxis = list(
      title = "<b style='font-size:14px;'>Dimensión 4</b>",
      zeroline = TRUE, 
      zerolinecolor = "rgba(0, 229, 255, 0.6)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 12),
      titlefont = list(color = '#e0e6ed', size = 14)
    ),
    hovermode = "closest",
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    margin = list(l = 80, r = 80, b = 80, t = 120),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 11, family = "Arial")
    ),
    legend = list(
      bgcolor = "rgba(10, 14, 26, 0.9)",
      bordercolor = "#00e5ff",
      borderwidth = 1.5,
      font = list(size = 12, color = "#e0e6ed"),
      x = 0.02,
      y = 0.98,
      xanchor = "left",
      yanchor = "top"
    ),
    annotations = list(
      list(
        x = 0.5, 
        y = -0.12,
        xref = "paper", 
        yref = "paper",
        text = "<span style='color:#8b92a0; font-size:11px;'>Vectores cyan = direcciones de máxima varianza | Puntos azules = posiciones de países en el espacio PCA</span>",
        showarrow = FALSE,
        xanchor = "center",
        align = "center"
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "biplot_dim3_dim4",
      width = 1400,
      height = 900
    )
  )

p2

Guinea se posiciona en la dirección de crecimiento poblacional, indicando valores altos en esta variable. Kuwait y Djibouti se alinean con importaciones, indicando ratios elevados. Senegal e Irlanda se alinean con exportaciones, indicando orientación exportadora. Burkina Faso y Qatar se alinean con mortalidad infantil, indicando valores en esta variable. Macedonia del Norte se alinea con PIB per cápita, indicando ingreso por habitante en esa dirección.

4.2 Segmentación: Clusterización

Sobre la base de los k componentes principales retenidos del Análisis de Componentes Principales, se aplicó el método de Ward para clusterización jerárquica aglomerativa. Este algoritmo organiza los datos con el objetivo de determinar clusters de países mediante un enfoque que se basa en la distancia entre los puntos para mostrar posibles agrupamientos. El procedimiento iterativo de fusión permite identificar estructuras naturales de similitud que trascienden clasificaciones geográficas o económicas convencionales, revelando en cambio grupos de países que comparten perfiles multidimensionales coherentes de desarrollo (Ward, 1963; Hastie et al., 2009).

El método de Ward minimiza específicamente la suma total de cuadrados dentro de clusters (within-cluster sum of squares, WCSS), definida matemáticamente como:

\[WCSS = \sum_{c=1}^{C} \sum_{i \in c} ||x_i - \bar{c}||^2\]

donde: \(C\) es el número de clusters, \(x_i\) es la posición de la observación \(i\) en el espacio de componentes principales, \(\bar{c}\) es el centroide (promedio) del cluster \(c\).

En cada paso del algoritmo, se identifican los dos clusters cuya fusión produce el incremento mínimo en WCSS total, maximizando así la homogeneidad interna de cada cluster mientras se maximiza la disimilaridad entre clusters (Ward, 1963; Hastie et al., 2009).

resultado_ACP <- FactoClass(
  datos_analisis,  
  dudi.pca,       
  nf = 4,           
  k.clust = 3,      
  scan = FALSE     
)

clusters_asignados <- resultado_ACP$cluster

NuevaBase <- data.frame(Cluster = clusters_asignados, datos_analisis)

clusters <- clusters_asignados

4.2.1 Numero optimo de clusters

La selección del número óptimo de clusters k se realizó mediante la evaluación conjunta de tres criterios complementarios: análisis del dendrograma, método del codo, y coherencia interpretativa. El dendrograma revela visualmente la estructura jerárquica de fusiones: se identifican alturas donde las fusiones producen incrementos dramáticos en disimilaridad, sugiriendo que clusters diferenciados se están uniendo. Un corte horizontal del dendrograma a altura intermedia permite definir el número de clusters finales.

coordenadas_pca <- as.data.frame(resultado_ACP$dudi$li[, 1:4])
distancias <- dist(coordenadas_pca)
hc <- hclust(distancias, method = "ward.D2")
k <- 3

cluster_colors <- c("1" = "#0084ff",   
                    "2" = "#00e676",    
                    "3" = "#ffd600")  

clusters <- cutree(hc, k = k)
clusters_display <- ifelse(clusters == 1, 2, ifelse(clusters == 2, 1, clusters))

names(clusters_display) <- rownames(coordenadas_pca)

dend <- as.dendrogram(hc)
dend_data <- dendro_data(dend)
leaf_x <- dend_data$labels$x
leaf_names <- as.character(dend_data$labels$label)
label_clusters <- clusters_display[match(leaf_names, names(clusters_display))]

if (any(is.na(label_clusters))) {
  idx_num <- suppressWarnings(as.integer(leaf_names))
  if (!all(is.na(idx_num))) {
    label_clusters[is.na(label_clusters)] <- clusters_display[idx_num[is.na(label_clusters)]]
  }
}

label_clusters <- as.integer(label_clusters)
dxs <- sort(unique(diff(sort(leaf_x))))
pad <- ifelse(length(dxs) > 0, dxs[1] / 2, 0.5)
max_y <- max(dend_data$segments$y, na.rm = TRUE)

cluster_rectangles <- tibble::tibble(
  cluster = integer(),
  x0 = numeric(),
  x1 = numeric(),
  y0 = numeric(),
  y1 = numeric(),
  color = character()
)

for (cl in 1:k) {
  xs_cl <- leaf_x[which(label_clusters == cl)]
  if (length(xs_cl) > 0) {
    x0 <- min(xs_cl) - pad
    x1 <- max(xs_cl) + pad
    cluster_rectangles <- cluster_rectangles %>%
      add_row(
        cluster = cl,
        x0 = x0,
        x1 = x1,
        y0 = 0,
        y1 = max_y * 0.92,
        color = cluster_colors[as.character(cl)]
      )
  }
}

tree_color <- "#00e5ff"
seg_df <- dend_data$segments
seg_df$seg_col <- tree_color

dend_interactive <- plot_ly()

dend_interactive <- dend_interactive %>%
  add_segments(
    data = seg_df,
    x = ~x, xend = ~xend,
    y = ~y, yend = ~yend,
    line = list(color = tree_color, width = 2),
    hoverinfo = "none",
    showlegend = FALSE
  )

labels_df <- dend_data$labels %>%
  mutate(cluster = label_clusters,
         color = cluster_colors[as.character(cluster)])

dend_interactive <- dend_interactive %>%
  add_markers(
    data = labels_df,
    x = ~x, y = ~y,
    text = ~paste0(
      "<b style='color:#00e5ff; font-size:13px;'>", label, "</b><br>",
      "<span style='color:#a259ff; font-size:12px;'><b>Cluster:</b> ", cluster, "</span>"
    ),
    hoverinfo = "text",
    marker = list(size = 9, line = list(width = 1.5, color = "#ffffff")),
    color = ~I(color),
    showlegend = FALSE,
    hovertemplate = "%{text}<extra></extra>"
  )

shapes_list <- lapply(seq_len(nrow(cluster_rectangles)), function(i) {
  list(
    type = "rect",
    x0 = cluster_rectangles$x0[i],
    x1 = cluster_rectangles$x1[i],
    y0 = cluster_rectangles$y0[i],
    y1 = cluster_rectangles$y1[i],
    fillcolor = cluster_rectangles$color[i],
    line = list(color = cluster_rectangles$color[i], width = 2),
    opacity = 0.15,
    layer = "below"
  )
})

linea_corte <- list(
  type = "line",
  x0 = min(dend_data$segments$x, na.rm = TRUE),
  x1 = max(dend_data$segments$x, na.rm = TRUE),
  y0 = 15,
  y1 = 15,
  line = list(color = "#ff1744", width = 2.5, dash = "solid"),
  layer = "above"
)

shapes_list <- append(shapes_list, list(linea_corte))

dend_interactive <- dend_interactive %>%
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:18px;'>Figura 16: Dendrograma Jerárquico - Clusterización Ward</b><br>
              <span style='color:#8b92a0; font-size:12px;'>Distancia Euclidiana | Método de Ward | k = 3 clusters óptimos</span>",
      x = 0.5,
      xanchor = "center",
      y = 0.98
    ),
    shapes = shapes_list,
    xaxis = list(
      title = "",
      showticklabels = FALSE,
      zeroline = FALSE,
      showgrid = FALSE,
      color = "#8b92a0"
    ),
    yaxis = list(
      title = "<b style='font-size:13px; color:#e0e6ed;'>Distancia Euclidiana</b>",
      zeroline = FALSE,
      showgrid = TRUE,
      gridcolor = "#12161f",
      gridwidth = 0.5,
      tickfont = list(color = "#8b92a0", size = 11),
      titlefont = list(color = "#e0e6ed", size = 12)
    ),
    plot_bgcolor = "#000000",
    paper_bgcolor = "#0a0e1a",
    font = list(family = "Arial, sans-serif", color = "#e0e6ed", size = 11),
    hovermode = "closest",
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12)
    ),
    margin = list(l = 80, r = 50, t = 120, b = 80)
  ) %>%
  config(
    displayModeBar = TRUE,
    scrollZoom = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "dendrograma_clustering",
      width = 1200,
      height = 900
    )
  )

dend_interactive

El método del codo examina cómo disminuye WCSS (suma de cuadrados dentro de clusters) conforme aumenta el número de clusters desde \(k=2\) hasta \(k=10\) Inicialmente, incrementar \(k\) reduce WCSS rápidamente porque se reduce heterogeneidad interna; sin embargo, a partir de cierto \(k\) (el “codo”), la reducción adicional se vuelve marginal, sugiriendo que clusters posteriores no capturan estructura genuina sino que simplemente subdividen artificialmente. Típicamente, el codo se identifica en \(k=3\) a \(k=4\) para análisis de desarrollo internacional.

wss <- function(k) {
  kmeans(coordenadas_pca, k, nstart = 25)$tot.withinss
}

k.values <- 1:10
wss_values <- map_dbl(k.values, wss)

elbow_data <- data.frame(
  k = k.values,
  wss = wss_values
)

elbow_plot <- ggplot(elbow_data, aes(x = k, y = wss)) +
  geom_line(size = 1.3, color = "#00e5ff") +
  geom_point(size = 4, color = "#00e5ff", alpha = 0.85) +
  geom_vline(xintercept = 3, linetype = "dashed", color = "#ff1744", size = 1.2) +
  labs(
    title = "",
    subtitle = "",
    x = "Número de Clusters (k)",
    y = "Suma de Cuadrados Within-Cluster (WCSS)"
  ) +
  scale_x_continuous(breaks = 1:10) +
  theme_minimal(base_size = 12) +
  theme(
    plot.background = element_rect(fill = "#000000", color = NA),
    panel.background = element_rect(fill = "#0a0e1a", color = NA),
    panel.grid.major = element_line(color = "#12161f", size = 0.4),
    panel.grid.minor = element_line(color = "#12161f", size = 0.2),
    
    axis.title = element_text(
      face = "bold",
      color = "#e0e6ed",
      size = 13
    ),
    axis.text = element_text(
      color = "#8b92a0",
      size = 11
    ),
    axis.line = element_line(
      color = "#00e5ff",
      size = 0.6
    ),
    
    plot.title = element_text(
      face = "bold",
      size = 16,
      hjust = 0.5,
      color = "#00e5ff"
    ),
    plot.subtitle = element_text(
      size = 12,
      hjust = 0.5,
      color = "#8b92a0"
    ),
    
    panel.border = element_rect(
      color = "#00e5ff",
      fill = NA,
      size = 0.8
    ),
    
    plot.margin = margin(20, 20, 20, 20)
  )

elbow_plot_interactive <- ggplotly(
  elbow_plot,
  tooltip = c("x", "y")
) %>%
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:18px;'>Figura 17: Método del Codo</b><br>
              <span style='color:#8b92a0; font-size:12px;'>Determinación del número óptimo de clusters | WCSS por k</span>",
      x = 0.5,
      xanchor = "center",
      y = 0.98
    ),
    
    xaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Número de Clusters (k)</b>",
      gridcolor = "#12161f",
      gridwidth = 0.5,
      showgrid = TRUE,
      zeroline = FALSE,
      tickfont = list(color = "#8b92a0", size = 11),
      titlefont = list(color = "#e0e6ed", size = 12),
      linecolor = "#00e5ff",
      linewidth = 1
    ),
    
    yaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Suma de Cuadrados Within-Cluster (WCSS)</b>",
      gridcolor = "#12161f",
      gridwidth = 0.5,
      showgrid = TRUE,
      zeroline = FALSE,
      tickfont = list(color = "#8b92a0", size = 11),
      titlefont = list(color = "#e0e6ed", size = 12),
      linecolor = "#00e5ff",
      linewidth = 1
    ),
    
    plot_bgcolor = "#000000",
    paper_bgcolor = "#0a0e1a",
    
    annotations = list(
      list(
        x = 3,
        y = max(wss_values) * 0.85,
        text = "<b style='color:#ff1744; font-size:12px;'>⚠ Codo Óptimo</b><br>
               <span style='color:#00e676; font-size:11px;'>k = 3 clusters</span>",
        showarrow = TRUE,
        arrowhead = 4,
        arrowsize = 1.5,
        arrowcolor = "#ff1744",
        arrowwidth = 2.5,
        ax = -50,
        ay = -60,
        bgcolor = "rgba(10, 14, 26, 0.9)",
        bordercolor = "#ff1744",
        borderwidth = 1.5,
        borderpad = 8,
        font = list(size = 11)
      )
    ),
    
    hovermode = "closest",
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(
        color = "#e0e6ed",
        size = 12,
        family = "Arial"
      ),
      align = "left"
    ),
    
    margin = list(l = 100, r = 50, b = 100, t = 160),
    
    font = list(
      family = "Arial, sans-serif",
      color = "#e0e6ed",
      size = 12
    )
  ) %>%
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "metodo_codo_clustering",
      width = 1400,
      height = 800
    )
  )

elbow_plot_interactive

La coherencia interpretativa valida que los clusters identificados tienen significado económico y social claro. En este análisis, se seleccionó \(k=3\) clusters porque esta segmentación produce tres grupos conceptualmente diferenciados.

4.2.2 Caracterización de los clusters

La segmentación produjo una distribución que refuerza un hallazgo fundamental: no existe un grupo dominante de ultra-desarrollados, sino un equilibrio tripartito entre países con distintos niveles de desarrollo. El Cluster 2 (41.9%) emerge como el grupo mayoritario, congregando economías emergentes e intermedias que han logrado consolidar capacidades básicas en múltiples dimensiones. El Cluster 1 (39.0%), aunque significativo, representa un segmento más reducido de países con desempeño superior en indicadores económicos y tecnológicos.

El Cluster 3 (19.1%), por su parte, agrupa un grupo minoritario pero vulnerable de países en rezago. La concentración de 81% combinado en Clusters 1 y 2 sugiere que la mayoría de países ha logrado algún nivel de desarrollo básico, mientras que la minoría de 19.1% en Cluster 3 representa casos de vulnerabilidad persistente y multidimensional.

distribucion_clusters <- table(clusters) %>%
  as.data.frame() %>%
  rename(Cluster = clusters, Frecuencia = Freq) %>%
  mutate(Porcentaje = round(Frecuencia/sum(Frecuencia)*100, 2))

tabla_distribucion <- distribucion_clusters %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 14**"),
    subtitle = "Distribución de Países por Cluster"
  ) %>%
  cols_label(
    Cluster = md("**Cluster**"),
    Frecuencia = md("**N° Países**"),
    Porcentaje = md("**Porcentaje (%)**")
  ) %>%
  fmt_number(
    columns = Porcentaje,
    decimals = 1,
    pattern = "{x}%"
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Cluster, Frecuencia))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Cluster)
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff"
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia basada en agrupamiento Ward")
  )

tabla_distribucion
Tabla 14
Distribución de Países por Cluster
Cluster N° Países Porcentaje (%)
1 53 39.0%
2 57 41.9%
3 26 19.1%
Fuentes: Elaboración propia basada en agrupamiento Ward
nombres_variables <- c(
  "PIB_per" = "PIB per cápita (US$)",
  "Poblacion" = "Población total",
  "Esperanza.vida" = "Esperanza de vida (años)",
  "Acceso.electricidad" = "Acceso electricidad (%)",
  "Area.boscosa" = "Área boscosa (%)",
  "Suscripciones.movil" = "Suscripciones móviles",
  "Crecimiento.PIB" = "Crecimiento PIB (%)",
  "Mortalidad.infantil" = "Mortalidad infantil",
  "Inversion.extranjera" = "Inversión extranjera (%)",
  "Gasto.salud" = "Gasto en salud (%)",
  "Uso.internet" = "Uso de internet (%)",
  "Importaciones" = "Importaciones (%)",
  "Exportaciones" = "Exportaciones (%)",
  "Tierra.cultivable" = "Tierra cultivable (%)",
  "Crecimiento.poblacion" = "Crecimiento población (%)",
  "Industria" = "Industria (%)",
  "Remesas" = "Remesas (%)"
)

estadisticas_clusters <- NuevaBase %>%
  group_by(Cluster) %>%
  summarise(across(
    where(is.numeric),
    list(
      Media = ~round(mean(., na.rm = TRUE), 2),
      Mediana = ~round(median(., na.rm = TRUE), 2),
      DE = ~round(sd(., na.rm = TRUE), 2),
      Min = ~round(min(., na.rm = TRUE), 2),
      Max = ~round(max(., na.rm = TRUE), 2)
    )
  )) %>%
  pivot_longer(
    cols = -Cluster,
    names_to = "Variable_Estadistica",
    values_to = "Valor"
  ) %>%
  separate(Variable_Estadistica, into = c("Variable", "Estadistica"), sep = "_") %>%
  pivot_wider(
    names_from = Estadistica,
    values_from = Valor
  )

tabla_estadisticas <- estadisticas_clusters %>%
  mutate(
    Variable_Descriptiva = nombres_variables[Variable],
    Cluster = paste("Cluster", Cluster)
  ) %>%
  select(Cluster, Variable_Descriptiva, Media, Mediana, DE, Min, Max) %>%
  arrange(Cluster, Variable_Descriptiva) %>%
  gt(groupname_col = "Cluster") %>%
  tab_header(
    title = md("**Tabla 15**"),
    subtitle = "Estadísticas Descriptivas por Cluster | Medias, desviaciones estándar y rangos"
  ) %>%
  cols_label(
    Variable_Descriptiva = md("**Variable**"),
    Media = md("**Media**"),
    Mediana = md("**Mediana**"),
    DE = md("**D.E.**"),
    Min = md("**Mín**"),
    Max = md("**Máx**")
  ) %>%
  cols_align(
    align = "center",
    columns = c(Media, Mediana, DE, Min, Max)
  ) %>%
  cols_align(
    align = "left",
    columns = Variable_Descriptiva
  ) %>%
  fmt_number(
    columns = c(Media, Mediana, DE, Min, Max),
    decimals = 2
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable_Descriptiva, Media, Mediana, DE, Min))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Variable_Descriptiva)
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#ffffff"),
      cell_text(color = "#ffffff", weight = "bold", size = "large") 
    ),
    locations = cells_row_groups()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(8),
    row_group.background.color = "#0a0e1a",
    row_group.padding = px(12),
    row_group.font.weight = "bold",
    row_group.font.size = "large",
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff"
  ) %>%
  tab_source_note(
    source_note = md("**Fuente:** Elaboración propia con base en World Bank (2023)")
  )

tabla_estadisticas
Tabla 15
Estadísticas Descriptivas por Cluster | Medias, desviaciones estándar y rangos
Variable Media Mediana D.E. Mín Máx
Cluster 1
Acceso electricidad (%) 99.16 100 3.3 75.9 100
Crecimiento PIB (%) 5.12 4.63 3.77 -4.66 19.79
Crecimiento población (%) 0.73 0.71 1.33 -2.52 5.91
Esperanza de vida (años) 77.44 77.23 4.21 65.45 85.71
Exportaciones (%) 55.3 48.66 29.47 11.6 197.41
Gasto en salud (%) 7.62 7.55 2.61 2.18 16.5
Importaciones (%) 54.55 50.72 27.69 15.06 173.02
Industria (%) 28.53 25.54 12.14 9.5 65.77
Inversión extranjera (%) 5.08 3.45 13.84 -6.49 126.08
Mortalidad infantil 7.85 5.1 6.84 1.4 39.2
Población total 49744704 9581287 161175517 33755 1412175000
Remesas (%) 2.47 0.94 3.57 0.01 15.42
Suscripciones móviles 130.68 126.47 22.89 95.13 207.28
Tierra cultivable (%) 15.31 11.99 12.37 0.27 59
Uso de internet (%) 86.05 86.62 8.7 59.66 100
Área boscosa (%) 31.71 32.54 20.23 0 73.73
NA
Cluster 2
Acceso electricidad (%) 54.59 50.6 22.97 10.3 99.4
Crecimiento PIB (%) 4.98 4.97 2.32 1.12 11.9
Crecimiento población (%) 2.31 2.43 0.66 0.79 3.25
Esperanza de vida (años) 64.29 63.34 3.77 56.81 74.26
Exportaciones (%) 32.42 26.34 26.91 4.97 159.25
Gasto en salud (%) 5.1 4.21 2.5 2.19 12.65
Importaciones (%) 42.19 35.47 25.56 19.59 143.03
Industria (%) 25.98 25.14 8.91 10.64 49.25
Inversión extranjera (%) 3.65 2.21 4.22 -2.12 16
Mortalidad infantil 40.97 42.35 12.17 17 68.3
Población total 75877699 16860080 251512287 781066 1425423212
Remesas (%) 4.94 3.1 5.43 0.28 22.76
Suscripciones móviles 91.59 93.32 27.16 45.82 161.23
Tierra cultivable (%) 20.6 14.08 17.93 0.13 60.78
Uso de internet (%) 35.04 34.34 16.03 11 69.36
Área boscosa (%) 28.44 23.65 22.77 0.26 90.09
NA
Cluster 3
Acceso electricidad (%) 96.42 99.8 7.07 71.6 100
Crecimiento PIB (%) 1.25 3.58 6.84 -20.54 8.97
Crecimiento población (%) 0.79 1.22 1.45 -3.17 2.32
Esperanza de vida (años) 71.59 71.56 3.07 66.48 78
Exportaciones (%) 27.33 22.65 14.91 6.7 55.61
Gasto en salud (%) 7.44 7.4 2.56 4.15 14.32
Importaciones (%) 52.04 50.9 19.06 21.9 87.45
Industria (%) 22.45 23.96 12.14 2.39 54.51
Inversión extranjera (%) 1.34 1.12 2.98 -8.42 8.23
Mortalidad infantil 18.11 15.1 8.71 5.5 36.9
Población total 14619587 6852937 25113617 40077 112618250
Remesas (%) 22.09 19.92 14.39 3.32 53.22
Suscripciones móviles 102.5 102.93 33.51 39.71 183.25
Tierra cultivable (%) 15.21 10.82 14.04 1.64 56.75
Uso de internet (%) 61.08 57.52 15.49 32.77 83.9
Área boscosa (%) 29.64 30.22 19.67 0.05 61.76
NA
Fuente: Elaboración propia con base en World Bank (2023)
estadisticas_por_cluster <- NuevaBase %>%
  group_by(Cluster) %>%
  summarise(across(
    where(is.numeric),
    list(
      Media = ~mean(., na.rm = TRUE)
    ),
    .names = "{.col}_{.fn}"
  ))

estadisticas_largas <- estadisticas_por_cluster %>%
  pivot_longer(
    cols = -Cluster,
    names_to = "Variable_Estadistica",
    values_to = "Valor"
  ) %>%
  mutate(
    Estadistica = str_extract(Variable_Estadistica, "[^_]+$"),
    Variable = str_remove(Variable_Estadistica, "_[^_]+$"),
    Valor = as.numeric(Valor)
  ) %>%
  select(-Variable_Estadistica)

tabla_estadisticas_mejorada <- estadisticas_largas %>%
  filter(Estadistica == "Media") %>%
  mutate(
    Variable_Descriptiva = nombres_variables[Variable],
    Cluster = paste("Cluster", Cluster),
    Valor = round(Valor, 2)
  ) %>%
  select(Cluster, Variable_Descriptiva, Valor) %>%
  pivot_wider(
    names_from = Cluster,
    values_from = Valor
  ) %>%
  arrange(Variable_Descriptiva) %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 16**"),
    subtitle = "Comparación de Clusters - Medias por Variable | Análisis comparativo de indicadores"
  ) %>%
  cols_label(
    Variable_Descriptiva = md("**Variable**")
  ) %>%
  cols_align(
    align = "center",
    columns = -Variable_Descriptiva
  ) %>%
  cols_align(
    align = "left",
    columns = Variable_Descriptiva
  ) %>%
  fmt_number(
    columns = -Variable_Descriptiva,
    decimals = 2
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = Variable_Descriptiva)
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Variable_Descriptiva)
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff"
  ) %>%
  tab_source_note(
    source_note = md("**Nota:** Elaboración propia. Los valores están redondeados a 2 decimales")
  )

tabla_estadisticas_mejorada
Tabla 16
Comparación de Clusters - Medias por Variable | Análisis comparativo de indicadores
Variable Cluster 1 Cluster 2 Cluster 3
Acceso electricidad (%) 99.16 54.59 96.42
Crecimiento PIB (%) 5.12 4.98 1.25
Crecimiento población (%) 0.73 2.31 0.79
Esperanza de vida (años) 77.44 64.29 71.59
Exportaciones (%) 55.30 32.42 27.33
Gasto en salud (%) 7.62 5.10 7.44
Importaciones (%) 54.55 42.19 52.04
Industria (%) 28.53 25.98 22.45
Inversión extranjera (%) 5.08 3.65 1.34
Mortalidad infantil 7.85 40.97 18.11
PIB per cápita (US$) 26,489.97 1,578.46 3,776.68
Población total 49,744,703.54 75,877,698.91 14,619,587.25
Remesas (%) 2.47 4.94 22.09
Suscripciones móviles 130.68 91.59 102.50
Tierra cultivable (%) 15.31 20.60 15.21
Uso de internet (%) 86.05 35.04 61.08
Área boscosa (%) 31.71 28.44 29.64
Nota: Elaboración propia. Los valores están redondeados a 2 decimales

4.2.2.1 Cluster 1: Calidad de vida y Conectividad Digital Consolidada

Cluster 1 se caracteriza por valores extremadamente altos en indicadores de desarrollo humano e infraestructura. Acceso a electricidad alcanza 99.16%, reflejando electrificación universal que define economías desarrolladas. Esperanza de vida promedio es 77.44 años, el nivel más alto entre los tres clusters, indicando sistemas sanitarios consolidados, nutrición adecuada, y estabilidad sociopolítica. Uso de internet es 86.05%, el más elevado, confirmando que la conectividad digital es característica definitoria de este grupo. Mortalidad infantil es apenas 7.85 por 1,000 nacidos vivos, la más baja, reflejando que sistemas de salud materno-infantil funcionan eficientemente. PIB per cápita promedio es $26,489.97 USD, demostrando riqueza económica consolidada.

Simultáneamente, Cluster 1 muestra características económicas de economías maduras y globalizadas: exportaciones representan 55.30% del PIB (comercio orientado externamente), importaciones 54.55%, indicando que estos países son hubs comerciales internacionales. Crecimiento del PIB es 5.12% (moderado pero positivo), sugiriendo expansión económica sostenida. Industria representa 28.53% del PIB, confirmando que aunque estas economías son postindustriales (basadas en servicios), mantienen capacidad manufacturera significativa. Inversión extranjera directa es 5.08% del PIB, indicando que son destinos atractivos para capitales internacionales. Gasto en salud es 7.62% del PIB, el más alto, validando inversión sustancial en sistemas de salud universales. Crecimiento poblacional es apenas 0.73% anual, reflejando que han completado transiciones demográficas con poblaciones envejecidas.

Composición de países: Incluye principalmente naciones europeas desarrolladas (Alemania, Francia, Italia, España, Reino Unido, Suecia, Dinamarca, Finlandia, Noruega, Países Bajos), naciones norteamericanas (Estados Unidos, Canadá), economías asiáticas avanzadas (Japón, Corea del Sur, Singapur, Hong Kong), y destinos de desarrollo consolidado (Australia, Nueva Zelanda, Israel). La predominancia de economías OCDE valida que Cluster 1 captura efectivamente el grupo de desarrollo ultra-avanzado global (Banco Mundial, 2023).

4.2.2.2 Cluster 2: Economias de transición con vulnerabilidades persistentes

Cluster 2 representa el grupo de países con desarrollo humano intermedio pero altamente heterogéneo internamente. Esperanza de vida promedio es 64.29 años, sustancialmente menor que Cluster 1 (13 años de diferencia), pero superior a Cluster 3, indicando que estos países han logrado avances en salud básica pero enfrentan desafíos significativos. Acceso a electricidad es 54.59%, apenas por encima de la mitad, reflejando que la electrificación es incompleta especialmente en zonas rurales. Uso de internet es 35.04%, menos de la mitad de Cluster 1, confirmando que brecha digital es significativa. Mortalidad infantil es 40.97 por 1,000, aproximadamente 5 veces mayor que Cluster 1, indicando que sistemas de salud materno-infantil enfrentan capacidades limitadas.

PIB per cápita promedio es $1,578.46 USD, dramáticamente menor que Cluster 1 (95% de diferencia), confirmando que estos son países de ingresos medios bajos a medios. Crecimiento poblacional es 2.31% anual, significativamente más alto que Cluster 1, reflejando que están en transiciones demográficas incompletas donde natalidad sigue siendo elevada. Remesas recibidas representan 4.94% del PIB, indicando dependencia moderada de transferencias de migrantes. Inversión extranjera es 3.65% del PIB (inferior a Cluster 1), sugiriendo que son menos atractivos para capitales internacionales. Gasto en salud es 5.10% del PIB (menor que Cluster 1), limitando recursos disponibles para sistemas de salud.

Heterogeneidad interna: Este cluster contiene gran variación: desde países con desarrollo relativamente avanzado (México ~$9,500 PIB per cápita, esperanza de vida ~75 años) hasta países con rezago moderado (Kenia, Ghana, Nigeria con esperanza de vida ~65 años). Tierra cultivable es 20.60%, la más alta entre clusters, reflejando que muchos son economías donde agricultura sigue siendo importante. Suscripciones móviles son 91.59 por cada 100 habitantes, indicando penetración de tecnología móvil como vector de inclusión financiera y digital.

Composición de países: Incluye principalmente economías latinoamericanas emergentes (Brasil, México, Colombia, Argentina, Chile, Uruguay, Perú), economías asiáticas en transición (Vietnam, Tailandia, Indonesia, Filipinas, India en su mayoría), economías africanas moderadamente desarrolladas (Botswana, Mauricio, Sudáfrica), y países del Oriente Medio con ingresos medios (Turquía, Jordania, Líbano). La diversidad geográfica y económica confirma que Cluster 2 captura un espectro amplio de naciones en estado intermedio de desarrollo (Banco Mundial, 2023; PNUD, 2023).

4.2.2.3 Cluster 3: Rezago Extremo y Vulnerabilidad Multidimensional

Cluster 3 representa el grupo de rezago humano y económico extremo. Esperanza de vida promedio es apenas 71.59 años, superior a Cluster 2 en cifra pero esta cifra es engañosa porque oculta volatilidad extrema: mientras algunos países tienen ~75 años, otros tienen ~55-58 años, y mortalidad adulta es severamente elevada por VIH, conflictos armados, y enfermedades tropicales. Acceso a electricidad es 96.42%, aparentemente alto, pero esta cifra promedio se distorsiona por algunos países con cobertura urbana buena; zonas rurales en muchos países están completamente sin electricidad.

Mortalidad infantil es 18.11 por 1,000, intermedia entre Cluster 1 (7.85) y Cluster 2 (40.97), sugiriendo que este cluster, aunque llamado “rezago”, contiene algunos países que han logrado mejoras en salud infantil. Uso de internet es 61.08%, sorprendentemente alto comparado con Cluster 2 (35.04%), pero se explica porque algunos países han adoptado tecnología móvil massivamente sin infraestructura de electricidad o salud consolidada. PIB per cápita es $3,776.68 USD, intermedio entre Cluster 2 ($1,578) y Cluster 1 ($26,489), contradictorio con la caracterización de “rezago extremo”, pero refleja que algunos países tienen petróleo (Angola) o recursos (Zambia) que generan ingresos nominales sin beneficios distributivos amplios.

Crecimiento poblacional es 0.79% anual, el más bajo entre clusters, indicando que están completando transiciones demográficas pero desde bases de desarrollo muy rezagadas. Remesas recibidas son 22.09% del PIB, el porcentaje más alto, reflejando que economías están severamente dependientes de transferencias de diásporas en exterior. Gasto en salud es 7.44% del PIB (similar a Cluster 1), pero esta cifra es engañosa porque presupuestos limitados resultan en servicios muy deficientes. Tierra cultivable es 15.21%, indicando que agricultura es importante pero infraestructura agrícola y productividad están severamente limitadas.

La paradoja de Cluster 3: A primera vista, algunas métricas (esperanza de vida 71.59, acceso electricidad 96.42, gasto salud 7.44%) parecen intermedias, no rezagadas. Esto refleja que el cluster contiene mezcla heterogénea: países como Angola (productor petrolero con ingresos altos nominales pero servicios colapsados) coexisten con países como Etiopía o Uganda. La vulnerabilidad real radica en fragilidad institucional, volatilidad, dependencia de remesas (22.09% vs. 2.47% en Cluster 1), y que indicadores altos coexisten con servicios públicos disfuncionales (Banco Mundial, 2023).

4.2.3 Segmentacion de paises

Plano PC1-PC2 (Desarrollo Humano vs. Modelo Económico-Institucional): El gráfico PC1-PC2 muestra la distribución de clusters en el plano que explica la mayor proporción de varianza (37.8% combinada). El Cluster 1 se concentra predominantemente en el cuadrante central-derecho y ligeramente disperso verticalmente, reflejando que estos países comparten Calidad de vida (PC1 positivo moderado a alto) pero varían en estructura económica institucional (PC2 desde -4 hasta +4). Países con PC2 extremadamente negativo (como Qatar, Kuwait) representan economías petroleras industrializadas; países con PC2 cercano a cero representan economías postindustriales diversificadas europeas; países con PC2 ligeramente positivo representan economías con gasto social elevado.

coordenadas_pca <- as.data.frame(resultado_ACP$dudi$li[, 1:4])
distancias <- dist(coordenadas_pca)
hc <- hclust(distancias, method = "ward.D2")
clusters <- cutree(hc, k = 3)

clusters_display <- ifelse(clusters == 1, 2, ifelse(clusters == 2, 1, clusters))

cluster_df <- data.frame(
  Pais = rownames(coordenadas_pca),
  Dim1 = coordenadas_pca$Axis1,
  Dim2 = coordenadas_pca$Axis2,
  Dim3 = coordenadas_pca$Axis3,
  Dim4 = coordenadas_pca$Axis4,
  Cluster = as.character(clusters_display)
)

resumen_clusters <- cluster_df %>%
  group_by(Cluster) %>%
  summarise(
    Cantidad_Paises = n(),
    Porcentaje = round(n() / nrow(cluster_df) * 100, 1),
    Paises_Ejemplo = paste(head(Pais, 5), collapse = ", "),
    .groups = 'drop'
  ) %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 17**"),
    subtitle = "Resumen de Clusters Identificados | Agrupamiento jerárquico con método Ward"
  ) %>%
  cols_label(
    Cluster = md("**Cluster**"),
    Cantidad_Paises = md("**N° Países**"),
    Porcentaje = md("**%**"),
    Paises_Ejemplo = md("**Países Representativos**")
  ) %>%
  fmt_number(
    columns = Porcentaje,
    decimals = 1,
    pattern = "{x}%"
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Cluster, Cantidad_Paises))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Cluster)
  ) %>%
  tab_style(
    style = cell_text(size = "small", color = "#e0e6ed"),
    locations = cells_body(columns = c(Cantidad_Paises, Porcentaje, Paises_Ejemplo))
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#e0e6ed", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(10),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia basada en agrupamiento Ward de componentes principales")
  )

resumen_clusters
Tabla 17
Resumen de Clusters Identificados | Agrupamiento jerárquico con método Ward
Cluster N° Países % Países Representativos
1 57 41.9% Antigua and Barbuda, Australia, Austria, Bahamas, The, Belarus
2 53 39.0% Albania, Algeria, Argentina, Armenia, Azerbaijan
3 26 19.1% Benin, Burkina Faso, Burundi, Cameroon, Congo, Dem. Rep.
Fuentes: Elaboración propia basada en agrupamiento Ward de componentes principales
cluster_plot <- plot_ly(
  cluster_df,
  x = ~Dim1,
  y = ~Dim2,
 color = ~Cluster,
colors = c("1" = "#0084ff", "2" = "#00e676", "3" = "#ffd600"),
  text = ~paste0(
    "<b style='color:#00e5ff; font-size:13px;'>", Pais, "</b><br>",
    "<span style='color:#a259ff; font-size:12px;'><b>Cluster:</b> ", Cluster, "</span><br>",
    "<span style='color:#8b92a0; font-size:11px;'>Dim1: ", round(Dim1, 3), "</span><br>",
    "<span style='color:#8b92a0; font-size:11px;'>Dim2: ", round(Dim2, 3), "</span>"
  ),
  type = "scatter",
  mode = "markers",
  marker = list(
    size = 10,
    opacity = 0.8,
    line = list(width = 1.5, color = "#ffffff")
  ),
  hovertemplate = "%{text}<extra></extra>"
) %>%
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:18px;'>Figura 18: Clusters en el Espacio de Componentes Principales</b><br>
              <span style='color:#8b92a0; font-size:12px;'>Proyección Dim1 vs Dim2 | Agrupamiento Ward (k=3)</span>",
      x = 0.5,
      xanchor = "center",
      y = 0.98
    ),
    xaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Dimensión 1</b>",
      gridcolor = "#12161f",
      gridwidth = 0.5,
      showgrid = TRUE,
      zeroline = TRUE,
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 1,
      tickfont = list(color = "#8b92a0", size = 11),
      titlefont = list(color = "#e0e6ed", size = 12),
      linecolor = "#00e5ff",
      linewidth = 1
    ),
    yaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Dimensión 2</b>",
      gridcolor = "#12161f",
      gridwidth = 0.5,
      showgrid = TRUE,
      zeroline = TRUE,
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 1,
      tickfont = list(color = "#8b92a0", size = 11),
      titlefont = list(color = "#e0e6ed", size = 12),
      linecolor = "#00e5ff",
      linewidth = 1
    ),
    plot_bgcolor = "#000000",
    paper_bgcolor = "#0a0e1a",
    font = list(
      family = "Arial, sans-serif",
      color = "#e0e6ed",
      size = 12
    ),
    hovermode = "closest",
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    margin = list(l = 100, r = 50, b = 100, t = 140),
    legend = list(
      title = list(text = "<b style='color:#00e5ff; font-size:12px;'>Cluster</b>"),
      bgcolor = "rgba(10, 14, 26, 0.9)",
      bordercolor = "#00e5ff",
      borderwidth = 1.5,
      font = list(color = "#e0e6ed", size = 11),
      x = 0.98,
      y = 0.98,
      xanchor = "right",
      yanchor = "top"
    )
  ) %>%
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "clusters_pca",
      width = 1400,
      height = 900
    )
  )

cluster_plot

El Cluster 2 se distribuye ampliamente en la región central-derecha del plano, con mayor concentración en PC1 entre +1 y +3 (desarrollo intermedio) y PC2 entre -2 y +2 (diversidad de modelos económicos). Esta dispersión amplia confirma la heterogeneidad interna del Cluster 2: incluye desde países latinoamericanos con desarrollo intermedio hasta economías asiáticas emergentes con distintas trayectorias de industrialización. Algunos países del Cluster 2 con PC1 >3 se posicionan muy cerca de frontera con Cluster 1, sugiriendo que están en transición hacia desarrollo consolidado.

El Cluster 3 se concentra en la región izquierda del plano (PC1 negativo desde -2 hasta -6), confirmando su posicionamiento en el polo de menor desarrollo humano. Verticalmente, el Cluster 3 muestra dispersión amplia en PC2 (desde -2 hasta +2), reflejando que países en rezago tienen modelos económicos diversos: algunos dependen de remesas (PC2 positivo), otros tienen industria extractiva limitada (PC2 negativo moderado). La separación visual entre Cluster 3 y Clusters 1-2 es clara, con solapamiento mínimo, validando que la segmentación captura diferencias estructurales genuinas.

cluster_plot1 <- plot_ly(
  cluster_df,
  x = ~Dim3,
  y = ~Dim4,
 color = ~Cluster,
  colors = c("1" = "#0084ff", "2" = "#00e676", "3" = "#ffd600"),
  text = ~paste0(
    "<b style='color:#00e5ff; font-size:13px;'>", Pais, "</b><br>",
    "<span style='color:#a259ff; font-size:12px;'><b>Cluster:</b> ", Cluster, "</span><br>",
    "<span style='color:#8b92a0; font-size:11px;'>Dim3: ", round(Dim3, 3), "</span><br>",
    "<span style='color:#8b92a0; font-size:11px;'>Dim4: ", round(Dim4, 3), "</span>"
  ),
  type = "scatter",
  mode = "markers",
  marker = list(
    size = 10,
    opacity = 0.8,
    line = list(width = 1.5, color = "#ffffff")
  ),
  hovertemplate = "%{text}<extra></extra>"
) %>%
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:18px;'>Figura 19: Clusters en el Espacio de Componentes Principales</b><br>
              <span style='color:#8b92a0; font-size:12px;'>Proyección Dim3 vs Dim4 | Agrupamiento Ward (k=3)</span>",
      x = 0.5,
      xanchor = "center",
      y = 0.98
    ),
    xaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Dimensión 3</b>",
      gridcolor = "#12161f",
      gridwidth = 0.5,
      showgrid = TRUE,
      zeroline = TRUE,
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 1,
      tickfont = list(color = "#8b92a0", size = 11),
      titlefont = list(color = "#e0e6ed", size = 12),
      linecolor = "#00e5ff",
      linewidth = 1
    ),
    yaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Dimensión 4</b>",
      gridcolor = "#12161f",
      gridwidth = 0.5,
      showgrid = TRUE,
      zeroline = TRUE,
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 1,
      tickfont = list(color = "#8b92a0", size = 11),
      titlefont = list(color = "#e0e6ed", size = 12),
      linecolor = "#00e5ff",
      linewidth = 1
    ),
    plot_bgcolor = "#000000",
    paper_bgcolor = "#0a0e1a",
    font = list(
      family = "Arial, sans-serif",
      color = "#e0e6ed",
      size = 12
    ),
    hovermode = "closest",
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    margin = list(l = 100, r = 50, b = 100, t = 140),
    legend = list(
      title = list(text = "<b style='color:#00e5ff; font-size:12px;'>Cluster</b>"),
      bgcolor = "rgba(10, 14, 26, 0.9)",
      bordercolor = "#00e5ff",
      borderwidth = 1.5,
      font = list(color = "#e0e6ed", size = 11),
      x = 0.98,
      y = 0.98,
      xanchor = "right",
      yanchor = "top"
    )
  ) %>%
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "clusters_dim3_dim4",
      width = 1400,
      height = 900
    )
  )

cluster_plot1

Plano PC3-PC4 (Apertura Comercial vs. Base Territorial): El gráfico PC3-PC4 proyecta países en dimensiones ortogonales que capturan aspectos complementarios. El Cluster 1 (rojo) muestra dispersión muy amplia en PC3 (desde -5 hasta +6), reflejando que desarrollo avanzado no implica modelo comercial único: micro-Estados como Malta, Luxemburgo, Singapur tienen PC3 extremadamente positivo (hiperglobalizados), mientras que economías grandes como Japón, Estados Unidos tienen PC3 cercano a cero (menos abiertos relativamente). En PC4, Cluster 1 varía moderadamente (desde -4 hasta +6), indicando que incluye tanto micro-Estados con territorio limitado (PC4 muy positivo) como países con territorio extenso y recursos naturales diversos.

El Cluster 2 (azul) se concentra en la región central de ambos ejes (PC3 entre -2 y +2, PC4 entre -2 y +2), confirmando que son economías intermedias tanto en apertura comercial como en dotación territorial. Algunos países del Cluster 2 muestran PC3 ligeramente negativo, indicando apertura moderada; otros muestran PC4 positivo, indicando presión demográfica sobre recursos. El Cluster 3 (amarillo) tiene dispersión moderada en PC3 (desde -3 hasta +2) y PC4 (desde -2 hasta +2.5), reflejando variabilidad en estrategias de apertura comercial y uso del suelo entre países en rezago.

clusters_display_mapa <- ifelse(clusters == 1, 2, ifelse(clusters == 2, 1, clusters))

world <- ne_countries(scale = "medium", returnclass = "sf")

Base_2022_con_cluster <- Base_2022 %>%
  mutate(Cluster = clusters_display_mapa) %>%  
  select(Codigo, Cluster, Pais)  

Base_con_mapa <- world %>%
  left_join(Base_2022_con_cluster, by = c("iso_a3" = "Codigo")) %>%
  filter(!is.na(Cluster))  

nombres_clusters <- c("1" = "Calidad de vida y conectividad digital", "2" = "Desarrollo Intermedio Heterogéneo con Vulnerabilidades Persistentes", "3" = "Rezago extremo y vulnerabilidad multidimensional")

pal <- colorFactor(
  palette = c("1" = "#0084ff", "2" = "#00e676", "3" = "#ffd600"), 
  domain = 1:3,
  na.color = "#1a1a2e"
)
mapa_clusters <- leaflet(
  Base_con_mapa,
  width = "100%",
  height = "600px",
  options = leafletOptions(
    minZoom = 2,
    maxZoom = 7,
    worldCopyJump = TRUE
  )
) %>%
  setView(lng = 15, lat = 20, zoom = 2.2) %>%
  addProviderTiles("CartoDB.DarkMatter") %>%
  addPolygons(
    fillColor = ~pal(Cluster),
    weight = 1.2,
    opacity = 0.9,
    color = "#00e5ff",
    fillOpacity = 0.75,
    popup = ~paste0(
      "<div style='font-family: Arial; background: rgba(10, 14, 26, 0.95); padding: 12px; border-radius: 6px; border: 1px solid #00e5ff;'>",
      "<strong style='color: #00e5ff; font-size: 14px;'>", Pais, "</strong><br/>",
      "<span style='color: #8b92a0; font-size: 12px;'>─────────────────</span><br/>",
      "<span style='color: #e0e6ed; font-size: 12px;'><b>Clúster:</b></span><br/>",
      "<strong style='color: ", pal(Cluster), "; font-size: 13px;'>", nombres_clusters[as.character(Cluster)], "</strong>",
      "</div>"
    ),
    popupOptions = popupOptions(
      closeButton = TRUE,
      className = "leaflet-popup-cyber"
    ),
    highlight = highlightOptions(
      weight = 2.5,
      color = "#00ffff",
      fillOpacity = 0.9,
      bringToFront = TRUE
    ),
    label = ~paste0(Pais, " Cluster ", Cluster, ""),
    labelOptions = labelOptions(
      style = list(
        "background" = "rgba(10, 14, 26, 0.95)",
        "border" = "2px solid #00e5ff",
        "border-radius" = "6px",
        "padding" = "8px 12px",
        "box-shadow" = "0 0 15px rgba(0, 229, 255, 0.6)",
        "color" = "#00e5ff",
        "font-weight" = "bold",
        "font-size" = "12px"
      ),
      textsize = "12px"
    )
  ) %>%
  addLegend(
    "bottomright",
    pal = pal,
    values = ~Cluster,
    title = "<span style='color: #00e5ff; font-weight: bold; text-transform: uppercase;'> Clústeres</span>",
    labFormat = function(type, cuts, p) {
      paste0(nombres_clusters[cuts])
    },
    opacity = 0.9,
    className = "leaflet-legend-cyber"
  )

mapa_clusters <- mapa_clusters %>%
  htmlwidgets::onRender("
    function(el, x) {
      // Estilizar leyenda
      setTimeout(function() {
        var legend = document.querySelector('.leaflet-legend-cyber');
        if (legend) {
          legend.style.background = 'linear-gradient(135deg, #0a0e1a, #12161f)';
          legend.style.border = '2px solid #00e5ff';
          legend.style.borderRadius = '10px';
          legend.style.padding = '18px';
          legend.style.boxShadow = '0 8px 32px rgba(0, 0, 0, 0.9)';
          legend.style.fontFamily = 'Arial, sans-serif';
        }
        
        // Estilizar items de leyenda
        var legendItems = document.querySelectorAll('.leaflet-legend-cyber span');
        legendItems.forEach(function(item) {
          item.style.color = '#e0e6ed';
          item.style.fontSize = '12px';
          item.style.fontWeight = '600';
        });
        
        // Estilizar etiquetas de leyenda (colores)
        var legendLabels = document.querySelectorAll('.leaflet-legend-cyber label');
        legendLabels.forEach(function(label) {
          label.style.color = '#e0e6ed';
          label.style.fontSize = '12px';
          label.style.fontWeight = '500';
          label.style.margin = '6px 0';
        });
        
        // Estilizar título
        var legendTitle = document.querySelector('.leaflet-legend-cyber .legend-title');
        if (legendTitle) {
          legendTitle.style.color = '#00e5ff';
          legendTitle.style.fontWeight = 'bold';
          legendTitle.style.fontSize = '13px';
          legendTitle.style.marginBottom = '10px';
          legendTitle.style.textTransform = 'uppercase';
          legendTitle.style.textShadow = '0 0 10px rgba(0, 229, 255, 0.5)';
        }
        
        // Estilizar popup
        var popup = document.querySelector('.leaflet-popup-cyber');
        if (popup) {
          popup.style.background = 'rgba(10, 14, 26, 0.95)';
          popup.style.border = '2px solid #00e5ff';
          popup.style.borderRadius = '8px';
          popup.style.boxShadow = '0 8px 32px rgba(0, 229, 255, 0.6)';
        }
      }, 500);
    }
  ")

htmltools::tagList(
  htmltools::HTML(
    '<div style=\"
      text-align: center;
      color: #00e5ff;
      font-size: 22px;
      font-weight: bold;
      margin-bottom: 20px;
      text-shadow: 0 0 15px rgba(0, 229, 255, 0.5);
      text-transform: uppercase;
      letter-spacing: 2px;
      font-family: Arial, sans-serif;
    \">
      Figura 20: Distribución Geoespacial de Clústeres de Desarrollo
    </div>'
  ),
  mapa_clusters
)
Figura 20: Distribución Geoespacial de Clústeres de Desarrollo

El mapa mundial con países coloreados según cluster confirma visualmente los patrones geográficos. Europa aparece predominantemente en Cluster 1 (azul oscuro) y parcialmente Cluster 2 (verde), reflejando consolidación de desarrollo en occidente y transición en oriente. América del Norte aparece Cluster 1 (Estados Unidos, Canadá); América Latina aparece mezcla de Cluster 2 (verde: Brasil, México, Argentina, Chile) y algunos Cluster 1 si países caribeños pequeños están incluidos. Asia muestra heterogeneidad extrema: Japón, Corea del Sur en Cluster 1; China, India, Sudeste Asiático en Cluster 2; Asia Sur/Central potencialmente en Cluster 3. África subsahariana aparece predominantemente Cluster 3 (morado/rosa), con casos aislados de Cluster 2 en sur y este (Botswana, Mauricio, Sudáfrica verde). Oceanía muestra Australia-Nueva Zelanda en Cluster 1; islas del Pacífico potencialmente Cluster 2-3.

Esta distribución geográfica valida que desarrollo no es aleatoriamente distribuido sino que presenta patrones espaciales claros asociados con historia económica, instituciones, geografía física, y legados coloniales. La concentración de Cluster 3 en África subsahariana y la consolidación de Cluster 1 en Europa Occidental-América del Norte-Asia Oriental confirma la persistencia de brechas globales estructurales (Banco Mundial, 2023; Acemoglu & Robinson, 2012).

4.3 Resultados e interpretación

4.3.1 Caracterizacion de los componentes principales

4.3.1.1 Componente Principal 1: “Tecnologia y mortalidad” (24.3% de varianza)

El primer componente principal explica casi un cuarto de toda la variabilidad en desarrollo internacional, capturando la dimensión más fundamental que diferencia a países ricos de pobres. Se define por esperanza de vida (loading: 0.413), uso de internet (0.4126), acceso a electricidad (0.3709) contrapuestos a mortalidad infantil (-0.4083). Estas variables covarían porque todas requieren sistemas de salud consolidados, riqueza económica, infraestructura tecnológica y estabilidad política—es decir, reflejan la capacidad institucional de una sociedad para garantizar bienestar multidimensional. Países que han logrado esperanzas de vida de 80+ años han realizado décadas de inversión en salud pública, educación universal y desarrollo económico; simultáneamente, estos mismos países inevitablemente desarrollaron infraestructuras digitales avanzadas porque sus economías postindustriales dependen de servicios e innovación tecnológica.

San Marino lidera el extremo positivo de PC1 con coordenada 4.609, siendo una micro-república de 34,000 habitantes enclavada en Italia con esperanza de vida de ~85 años, PIB per cápita superior a $50,000 USD, mortalidad infantil menor a 5 por 1,000, y acceso digital prácticamente universal. Malta (3.608) es otro micro-Estado mediterráneo con esperanza de vida de ~83 años que transitó desde economía agraria a hub financiero y tecnológico. Irlanda (3.457) representa el “milagro celta” que transformó una economía de subsistencia agraria en los 1950s hacia hub tecnológico global con esperanza de vida de ~82 años. Suiza (3.444) y Noruega (2.913) completan el quinteto de élite con sus sistemas de salud universales, educación de calidad, estabilidad política, y economías basadas en servicios financieros, manufactura de precisión, tecnología y recursos petroleros.

En el extremo opuesto, Níger encabeza con coordenada -5.599, siendo un país saheliano sin salida al mar donde 85% del territorio es desierto del Sahara, con esperanza de vida apenas de 62 años, mortalidad infantil de 85 por 1,000, uso de internet inferior a 10%, y acceso a electricidad de apenas 18%. Burundi (-4.797), una pequeña nación densamente poblada devastada por conflictos étnicos, muestra esperanza de vida de 61 años y PIB per cápita de apenas $270 USD. República Democrática del Congo (-4.619) posee recursos naturales valorados en trillones de dólares pero permanece atrapada en pobreza extrema debido a conflictos armados recurrentes y corrupción sistémica, resultando en esperanza de vida de 60 años, mortalidad infantil de 68 por 1,000, y acceso a electricidad inferior a 20%. Sierra Leona (-4.406) y Madagascar (-4.393) completan este quinteto de vulnerabilidad extrema, compartiendo fragilidad institucional, dependencia de agricultura de subsistencia y sistemas de salud colapsados. La brecha cuantitativa es asombrosa: 30 años de diferencia en esperanza de vida, mortalidad infantil 17 veces mayor, acceso digital multiplicado por 10, y riqueza económica 200 veces inferior entre los extremos (Banco Mundial, 2023; PNUD, 2023).

4.3.1.2 Componente Principal 2: “Modelo Económico-Institucional” (13.5% de varianza)

El segundo componente, ortogonal al primero, captura una dimensión más sutil: la estructura económica independiente del nivel absoluto de riqueza. Se define por industria negativa (-0.5145, cos²: 0.2648), crecimiento poblacional negativo (-0.4365, cos²: 0.1906), contrapuestos a remesas (0.3465, cos²: 0.12), gasto en salud (0.3038, cos²: 0.0923), importaciones (0.2842, cos²: 0.0808) y tierra cultivable (0.2415, cos²: 0.0583). Esta estructura revela un contraste profundo: el extremo negativo representa economías industrializadas maduras que han completado transiciones demográficas con capacidad productiva autónoma; el extremo positivo representa economías pequeñas vulnerables dependientes de transferencias externas de población emigrada.

Qatar encabeza el extremo negativo con coordenada -5.768 como pequeño emirato con población de 2.9 millones (90% migrantes temporales) donde la industria petrolera representa 66% del PIB, generando PIB per cápita de ~$61,000 USD a través de extracción de gas natural licuado. Kuwait (-5.102) y Arabia Saudita (-4.487) presentan patrones similares de economías extractivas con industria petroquímica representando 50-70% del PIB, crecimiento poblacional controlado artificialmente mediante políticas migratorias restrictivas, y no reciben remesas porque funcionan como exportadores netos de trabajadores. Omán (-4.455) e Iraq (-3.224), a pesar de la inestabilidad que afecta a Iraq, mantienen industria petrolera significativa que define sus estructuras económicas.

En el extremo opuesto, Islas Marshall lideran con coordenada 4.210, siendo micro-nación insular del Pacífico con población de 60,000 habitantes donde casi 30% de los marshaleses viven en Estados Unidos, enviando remesas que representan 15-20% del PIB doméstico. Tonga (3.513), pequeña nación polinesia, tiene aproximadamente 50% de sus ciudadanos viviendo en el exterior, generando remesas que constituyen 40% de su PIB—la proporción más alta del mundo. Moldavia (3.041), antigua república soviética sin salida al mar, es una de las naciones más pobres de Europa donde ~25% de su población trabaja en Rusia o Italia, con remesas representando 16% del PIB como principal fuente de divisas. Samoa (2.898) y Líbano (2.750) completan este grupo dependiente de transferencias externas: Samoa recibe remesas principalmente de Australia y Nueva Zelanda, mientras Líbano, devastado por crisis financiera y explosiones, depende críticamente de remesas de su diáspora global (~$7 mil millones anuales, representando 15% del PIB). Este componente revela una paradoja fascinante: no todos los países ricos dependen de industrialización, y no todos los países dependientes de transferencias son pobres—reflejando que distintos modelos institucionales pueden coexistir con diferentes resultados de desarrollo (Banco Mundial, 2023; FMI, 2023).

4.3.1.3 Componente Principal 3: “Integración Comercial Global” (9.1% de varianza)

El tercer componente captura la dimensión de apertura e integración en cadenas globales de valor, definida por importaciones (0.5187, cos²: 0.269), exportaciones (0.5084, cos²: 0.2584), inversión extranjera directa (0.3714, cos²: 0.138) y crecimiento del PIB (0.2562, cos²: 0.0657) positivos, contrapuestos a área boscosa (-0.273, cos²: 0.0745) y población (-0.263, cos²: 0.0692) negativos. Esta estructura refleja que la globalización contemporánea ha permitido que economías pequeñas adopten estrategias de hiperespecialización e hiperaperrura insertándose en nichos de cadenas globales, mientras que economías continentales grandes pueden mantener mayor autosuficiencia porque sus mercados internos masivos absorben la mayor parte de la producción doméstica.

Malta lidera el extremo positivo con la coordenada más extrema de todos los componentes (7.072), siendo archipiélago mediterráneo de 500 km² con 530,000 habitantes donde importaciones representan 120% del PIB y exportaciones 140%, sumando comercio total superior a 260% del PIB. Malta funciona como hub financiero offshore, centro de servicios digitales (iGaming, blockchain), y base logística para comercio regional, con inversión extranjera directa representando ~15% del PIB anualmente. Djibouti (5.246), pequeño país del Cuerno de África sin recursos naturales significativos pero posicionado estratégicamente en el Mar Rojo, maneja 95% del comercio exterior de Etiopía (población: 120 millones sin salida al mar), con importaciones y exportaciones combinadas superando 100% del PIB djiboutiano e ingresos de ~$200 millones anuales de alquiler de bases militares. San Marino (4.819) e Irlanda (2.588) completan el extremo de hiperglobalización: San Marino con comercio total >300% PIB, Irlanda como hub tecnológico y farmacéutico con exportaciones >100% PIB.

En el extremo negativo, China encabeza con coordenada -3.651 a pesar de ser la “fábrica del mundo” y mayor exportador global en términos absolutos ($3.6 billones USD en 2022), porque su economía es tan masiva ($17.9 billones USD) que el comercio total representa apenas 37% del PIB. India (-2.453), a pesar de exportaciones de ~$770 mil millones USD, tiene comercio exterior representando apenas 22% de su PIB de $3.5 billones. Federación Rusa (-2.560), aunque es gran exportadora de petróleo, gas y armamento, tiene comercio total de ~45% del PIB porque su economía continental es relativamente autárquica. Este componente revela la paradoja fundamental de la globalización: los más globalizados son los más pequeños y vulnerables; los más grandes pueden permitirse mayor independencia comercial (Baldwin, 2016; Rodrik, 2011).

4.3.1.4 Componente Principal 4: “Presión Territorial y Recursos Naturales” (7.5% de varianza)

El cuarto componente captura el trade-off fundamental entre conservación ambiental y expansión agrícola, definido por área boscosa (0.5134, cos²: 0.2635) positiva, contrapuesta a tierra cultivable (-0.5539, cos²: 0.3068) y población (-0.4713, cos²: 0.2221) negativas. El extremo positivo representa países con ecosistemas naturales preservados y baja presión demográfica; el extremo negativo representa países con presión demográfica masiva que ha forzado sacrificar bosques por tierra agrícola para seguridad alimentaria.

Timor-Leste encabeza el extremo positivo con coordenada 3.921, siendo joven nación independiente donde ~70% del territorio es bosque tropical montañoso con agricultura limitada a ~10% debido a escarpado terreno, población pequeña (~1.3 millones) y presión demográfica moderada. Finlandia (1.736) también en este extremo tiene ~73% de cobertura boscosa boreal, uno de los porcentajes más altos de Europa, con población de apenas 5.5 millones en territorio de 338,000 km². Islas Salomón (2.273) y República del Congo (2.259) tienen cobertura boscosa de ~80% y ~65% respectivamente, manteniéndola debido a baja densidad poblacional relativa.

India lidera el extremo negativo con coordenada -5.813, teniendo 1,400 millones de habitantes en 3.3 millones de km² (densidad: ~420 hab/km²), lo que ha convertido ~60% del territorio en tierra cultivable para arroz, trigo, algodón, caña de azúcar, reduciendo bosques a apenas 23%. China (-3.891) y Bangladesh (-3.049) presentan patrones similares: Bangladesh tiene densidad de ~1,250 hab/km² con ~70% tierra cultivable y bosques reducidos a 11%; China, aunque menos densamente poblada (~145 hab/km²), tiene 1,400 millones de habitantes que han transformado casi toda tierra disponible en agricultura intensiva. Este componente revela el dilema del desarrollo: presión demográfica extrema obliga sacrificar ecosistemas naturales por seguridad alimentaria; solo países con baja densidad pueden permitirse preservar naturaleza (Banco Mundial, 2023).

caracterizacion_componentes <- data.frame(
  Componente = c("PC1", "PC2", "PC3", "PC4"),
  
  Nombre = c(
    "Tecnologia y mortalidad",
    "Modelo Económico-Institucional",
    "Integración Comercial Global",
    "Presión Territorial y Recursos Naturales"
  ),
  
  Varianza_Explicada = c("24.3%", "13.5%", "9.1%", "7.5%"),
  
  Variables_Positivas = c(
    "Esperanza de vida (0.413), Uso de internet (0.413), Acceso a electricidad (0.371)",
    "Remesas (0.347), Gasto en salud (0.304), Importaciones (0.284), Tierra cultivable (0.241)",
    "Importaciones (0.519), Exportaciones (0.508), Inversión extranjera (0.371), Crecimiento PIB (0.256)",
    "Área boscosa (0.513)"
  ),
  
  Variables_Negativas = c(
    "Mortalidad infantil (-0.408)",
    "Industria (-0.515), Crecimiento poblacional (-0.437)",
    "Área boscosa (-0.273), Población (-0.263)",
    "Tierra cultivable (-0.554), Población (-0.471)"
  ),
  
  Interpretación = c(
    "Países desarrollados con alta esperanza de vida, conectividad digital e infraestructura sanitaria vs países en desarrollo con sistemas sanitarios frágiles",
    "Economías industriales maduras vs economías dependientes de transferencias externas y remesas",
    "Economías pequeñas ultra-abiertas (hubs comerciales) vs economías grandes con mercados internos dominantes",
    "Países con ecosistemas preservados vs países con alta presión agrícola y demográfica"
  )
)

tabla_componentes <- caracterizacion_componentes %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 18**"),
    subtitle = "Caracterización de Componentes Principales del Análisis de Desarrollo Global"
  ) %>%
  cols_label(
    Componente = md("**Comp.**"),
    Nombre = md("**Dimensión Identificada**"),
    Varianza_Explicada = md("**% Varianza**"),
    Variables_Positivas = md("**Variables Positivas**"),
    Variables_Negativas = md("**Variables Negativas**"),
    Interpretación = md("**Interpretación Conceptual**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Componente, Nombre, Varianza_Explicada, Variables_Positivas, Variables_Negativas))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff"),
      cell_fill(color = "#12161f")
    ),
    locations = cells_body(columns = Componente)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e5ff"),
    locations = cells_body(columns = Varianza_Explicada)
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#8b92a0", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(12),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuente:** Elaboración propia con base en el Análisis de Componentes Principales de indicadores de desarrollo global (Banco Mundial, 2022)")
  ) %>%
  tab_footnote(
    footnote = "Los valores en paréntesis representan las cargas (loadings) de cada variable en el componente principal",
    locations = cells_body(
      rows = c(1, 2, 3, 4),
      columns = Variables_Positivas
    )
  )

tabla_componentes
Tabla 18
Caracterización de Componentes Principales del Análisis de Desarrollo Global
Comp. Dimensión Identificada % Varianza Variables Positivas Variables Negativas Interpretación Conceptual
PC1 Tecnologia y mortalidad 24.3% Esperanza de vida (0.413), Uso de internet (0.413), Acceso a electricidad (0.371)1 Mortalidad infantil (-0.408) Países desarrollados con alta esperanza de vida, conectividad digital e infraestructura sanitaria vs países en desarrollo con sistemas sanitarios frágiles
PC2 Modelo Económico-Institucional 13.5% Remesas (0.347), Gasto en salud (0.304), Importaciones (0.284), Tierra cultivable (0.241)1 Industria (-0.515), Crecimiento poblacional (-0.437) Economías industriales maduras vs economías dependientes de transferencias externas y remesas
PC3 Integración Comercial Global 9.1% Importaciones (0.519), Exportaciones (0.508), Inversión extranjera (0.371), Crecimiento PIB (0.256)1 Área boscosa (-0.273), Población (-0.263) Economías pequeñas ultra-abiertas (hubs comerciales) vs economías grandes con mercados internos dominantes
PC4 Presión Territorial y Recursos Naturales 7.5% Área boscosa (0.513)1 Tierra cultivable (-0.554), Población (-0.471) Países con ecosistemas preservados vs países con alta presión agrícola y demográfica
1 Los valores en paréntesis representan las cargas (loadings) de cada variable en el componente principal
Fuente: Elaboración propia con base en el Análisis de Componentes Principales de indicadores de desarrollo global (Banco Mundial, 2022)

4.3.2 Prediccion

Tras construir el modelo ACP con 136 países de entrenamiento, se proyectaron cinco países adicionales (Angola, Belice, Jordania, Luxemburgo, Uruguay) sobre el espacio factorial ya definido. La proyección utiliza las medias y varianzas del conjunto de entrenamiento para estandarizar los nuevos datos, evitando que cambien la estructura de componentes. Se calcularon las coordenadas de estos cinco países en los cuatro primeros componentes principales, cuantificando su posición relativa respecto al espacio multidimensional de desarrollo ya identificado (Hastie et al., 2009).

Prediccion <- read_csv("f36a5086-3311-4b1a-9f0c-bda5cd4718df_Series - Metadata.csv",
                 show_col_types = FALSE) %>%
  select(
    Pais = `Country Name`,
    Codigo = `Country Code`,
    PIB_per = `GDP per capita (current US$) [NY.GDP.PCAP.CD]`,
    Poblacion = `Population, total [SP.POP.TOTL]`,
    `Esperanza vida` = `Life expectancy at birth, total (years) [SP.DYN.LE00.IN]`,
    `Acceso electricidad` = `Access to electricity (% of population) [EG.ELC.ACCS.ZS]`,
    `Area boscosa` = `Forest area (% of land area) [AG.LND.FRST.ZS]`,
    `Suscripciones movil` = `Mobile cellular subscriptions (per 100 people) [IT.CEL.SETS.P2]`,
    `Crecimiento PIB` = `GDP growth (annual %) [NY.GDP.MKTP.KD.ZG]`,
    `Mortalidad infantil` = `Mortality rate, infant (per 1,000 live births) [SP.DYN.IMRT.IN]`,
    `Inversion extranjera` = `Foreign direct investment, net inflows (% of GDP) [BX.KLT.DINV.WD.GD.ZS]`,
    `Gasto salud` = `Current health expenditure (% of GDP) [SH.XPD.CHEX.GD.ZS]`,
    `Uso internet` = `Individuals using the Internet (% of population) [IT.NET.USER.ZS]`,
    Importaciones = `Imports of goods and services (% of GDP) [NE.IMP.GNFS.ZS]`,
    Exportaciones = `Exports of goods and services (% of GDP) [NE.EXP.GNFS.ZS]`,
    `Tierra cultivable` = `Arable land (% of land area) [AG.LND.ARBL.ZS]`,
    `Crecimiento poblacion` = `Population growth (annual %) [SP.POP.GROW]`,
    Industria = `Industry (including construction), value added (% of GDP) [NV.IND.TOTL.ZS]`,
    Remesas = `Personal remittances, received (% of GDP) [BX.TRF.PWKR.DT.GD.ZS]`
  ) %>%
  filter(Pais %in% c("Uruguay","Belize","Luxembourg","Jordan","Angola"))

ind.test <- Prediccion[, 3:19] %>%
  mutate(across(everything(), as.numeric))

ind.test_clean <- ind.test %>%
  mutate(across(everything(), ~ifelse(is.na(.), mean(., na.rm = TRUE), .)))

ind.test.coord <- predict(res.pca, newdata = ind.test_clean)

coordenadas_paises <- data.frame(
  País = Prediccion$Pais,
  `Código País` = Prediccion$Codigo,
  `Dimensión 1 - Desarrollo Humano` = round(ind.test.coord[, 1], 4),
  `Dimensión 2 - Industrialización` = round(ind.test.coord[, 2], 4),
  `Dimensión 3 - Apertura Comercial` = round(ind.test.coord[, 3], 4),
  `Dimensión 4 - Recursos Naturales` = round(ind.test.coord[, 4], 4)
)

tabla_coordenadas <- coordenadas_paises %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 19**"),
    subtitle = "Coordenadas de Países en Componentes Principales"
  ) %>%
  cols_label(
    País = md("**País**"),
    `Código.País` = md("**Código**"),
    `Dimensión.1...Desarrollo.Humano` = md("**Dim 1<br>Desarrollo**"),
    `Dimensión.2...Industrialización` = md("**Dim 2<br>Industrialización**"),
    `Dimensión.3...Apertura.Comercial` = md("**Dim 3<br>Comercio**"),
    `Dimensión.4...Recursos.Naturales` = md("**Dim 4<br>Recursos**")
  ) %>%
  cols_align(
    align = "center",
    columns = c(`Dimensión.1...Desarrollo.Humano`, `Dimensión.2...Industrialización`,
                `Dimensión.3...Apertura.Comercial`, `Dimensión.4...Recursos.Naturales`)
  ) %>%
  cols_align(
    align = "left",
    columns = c(País, `Código.País`)
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium", color = "#000000"),
      cell_fill(color = "#00e5ff")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "#00e5ff",
      weight = px(2)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "#00e5ff",
      weight = px(1)
    ),
    locations = cells_body(columns = c(País, `Código.País`, `Dimensión.1...Desarrollo.Humano`, 
                                       `Dimensión.2...Industrialización`, `Dimensión.3...Apertura.Comercial`))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#0a0e1a"),
      cell_text(color = "#e0e6ed")
    ),
    locations = cells_body()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff"),
      cell_fill(color = "#12161f")
    ),
    locations = cells_body(columns = País)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "#00e676"),
    locations = cells_body(columns = c(`Dimensión.1...Desarrollo.Humano`, `Dimensión.2...Industrialización`,
                                       `Dimensión.3...Apertura.Comercial`, `Dimensión.4...Recursos.Naturales`))
  ) %>%
  tab_style(
    style = cell_text(size = "small"),
    locations = cells_body(columns = `Código.País`)
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "#00e5ff", size = "large")
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style = list(
      cell_text(color = "#8b92a0", size = "medium")
    ),
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "solid",
    column_labels.border.top.color = "#00e5ff",
    column_labels.border.top.width = px(3),
    column_labels.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(3),
    column_labels.border.bottom.color = "#00e5ff",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    table_body.hlines.style = "solid",
    table_body.hlines.color = "#00e5ff",
    table_body.hlines.width = px(1),
    table.background.color = "#0a0e1a",
    data_row.padding = px(12),
    heading.title.font.size = 18,
    heading.subtitle.font.size = 14,
    heading.padding = px(12),
    heading.border.bottom.style = "solid",
    heading.border.bottom.width = px(2),
    heading.border.bottom.color = "#00e5ff",
    footnotes.padding = px(10),
    footnotes.font.size = 13,
    source_notes.font.size = 13,
    source_notes.padding = px(10)
  ) %>%
  tab_source_note(
    source_note = md("**Fuente:** Elaboración propia con base en proyección PCA de indicadores del Banco Mundial (2022)")
  ) %>%
  tab_footnote(
    footnote = "Proyección de países seleccionados sobre los cuatro componentes principales del análisis",
    locations = cells_title(groups = "subtitle")
  )

tabla_coordenadas
Tabla 19
Coordenadas de Países en Componentes Principales1
País Código Dim 1
Desarrollo
Dim 2
Industrialización
Dim 3
Comercio
Dim 4
Recursos
Angola AGO -3.6127 -1.7126 -0.1232 1.7885
Belize BLZ -0.4472 0.1558 0.5254 0.5845
Jordan JOR 0.1673 0.0552 0.3568 -0.1002
Luxembourg LUX 2.9075 -1.0540 -7.6090 4.9379
Uruguay URY 1.4145 0.1073 -0.5612 -0.5834
1 Proyección de países seleccionados sobre los cuatro componentes principales del análisis
Fuente: Elaboración propia con base en proyección PCA de indicadores del Banco Mundial (2022)
coordenadas_originales <- as.data.frame(res.pca$x)
coordenadas_originales$Pais <- rownames(coordenadas_originales)
coordenadas_originales$Tipo <- "Original"

coordenadas_predichas <- as.data.frame(ind.test.coord)
coordenadas_predichas$Pais <- Prediccion$Pais
coordenadas_predichas$Tipo <- "Predicho"

colnames(coordenadas_originales)[1:4] <- c("PC1", "PC2", "PC3", "PC4")
colnames(coordenadas_predichas)[1:4] <- c("PC1", "PC2", "PC3", "PC4")

datos_completos <- rbind(
  coordenadas_originales[, c("Pais", "PC1", "PC2", "PC3", "PC4", "Tipo")],
  coordenadas_predichas[, c("Pais", "PC1", "PC2", "PC3", "PC4", "Tipo")]
)
p_animado <- plot_ly() %>%
  
  add_trace(
    data = datos_completos[datos_completos$Tipo == "Original", ],
    x = ~PC1, y = ~PC2,
    type = 'scatter',
    mode = 'markers',
    marker = list(
      color = '#8b92a0',
      size = 8,
      opacity = 0.6,
      line = list(width = 1, color = '#e0e6ed')
    ),
    name = "Países originales",
    hoverinfo = 'text',
    hovertext = ~paste(
      "<b style='color:#00e5ff; font-size:13px;'>", Pais, "</b><br>",
      "<span style='color:#8b92a0; font-size:11px;'><b>Tipo:</b> Original</span><br>",
      "<b style='color:#00e676;'>Dim 1:</b> ", round(PC1, 3), "<br>",
      "<b style='color:#00e5ff;'>Dim 2:</b> ", round(PC2, 3)
    )
  ) %>%
  
  add_trace(
    data = datos_completos[datos_completos$Tipo == "Predicho", ],
    x = ~PC1, y = ~PC2,
    type = 'scatter',
    mode = 'markers',
    marker = list(
      color = '#00e5ff',
      size = 14,
      opacity = 0.95,
      symbol = 'star',
      line = list(width = 2, color = '#ffffff')
    ),
    name = "Países predichos",
    hoverinfo = 'text',
    hovertext = ~paste(
      "<b style='color:#ffd600; font-size:13px;'>", Pais, "</b><br>",
      "<span style='color:#a259ff; font-size:11px;'><b>Tipo:</b> Predicho</span><br>",
      "<b style='color:#00e676;'>Dim 1:</b> ", round(PC1, 3), "<br>",
      "<b style='color:#00e5ff;'>Dim 2:</b> ", round(PC2, 3)
    ),
    visible = FALSE
  ) %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:20px;'>Figura 21: Proyección PCA Dim 1 vs Dim 2</b><br>
             <span style='color:#8b92a0; font-size:12px;'>Países originales (gris) y predichos (cyan)</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.98
    ),
    xaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Dimensión 1 - Desarrollo Humano y Tecnológico (24.3%)</b>",
      zeroline = TRUE,
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 11),
      titlefont = list(color = '#e0e6ed', size = 12)
    ),
    yaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Dimensión 2 - Modelo Económico (13.5%)</b>",
      zeroline = TRUE,
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 11),
      titlefont = list(color = '#e0e6ed', size = 12)
    ),
    hovermode = "closest",
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    margin = list(l = 100, r = 80, b = 100, t = 140),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    legend = list(
      bgcolor = "rgba(10, 14, 26, 0.9)",
      bordercolor = "#00e5ff",
      borderwidth = 1.5,
      x = 0.02,
      y = 0.55,
      xanchor = "left",
      yanchor = "middle",
      font = list(size = 11, color = "#e0e6ed")
    ),
    updatemenus = list(
      list(
        type = "buttons",
        direction = "vertical",
        x = 0.95,
        y = 0.05,
        xanchor = "right",
        yanchor = "bottom",
        buttons = list(
          list(
            method = "update",
            args = list(
              list(visible = c(TRUE, FALSE)),
              list(title = "<b style='color:#00e5ff; font-size:20px;'>Figura 21: Proyección PCA Dim 1 vs Dim 2</b><br>
                             <span style='color:#8b92a0; font-size:12px;'>Solo países originales</span>")
            ),
            label = "Solo Originales"
          ),
          list(
            method = "update",
            args = list(
              list(visible = c(TRUE, TRUE)),
              list(title = "<b style='color:#00e5ff; font-size:20px;'>Figura 21: Proyección PCA Dim 1 vs Dim 2</b><br>
                             <span style='color:#8b92a0; font-size:12px;'>Países originales (gris) y predichos (cyan)</span>")
            ),
            label = "Mostrar Predichos"
          )
        ),
        bgcolor = "rgba(0, 229, 255, 0.15)",
        bordercolor = "#00e5ff",
        borderwidth = 1.5,
        font = list(size = 10, color = "#00e5ff", family = "Arial")
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "pca_prediccion_dim1_dim2",
      width = 1400,
      height = 900
    )
  )

p_animado
p_animado1 <- plot_ly() %>%
  
  add_trace(
    data = datos_completos[datos_completos$Tipo == "Original", ],
    x = ~PC3, y = ~PC4,
    type = 'scatter',
    mode = 'markers',
    marker = list(
      color = '#8b92a0',
      size = 8,
      opacity = 0.6,
      line = list(width = 1, color = '#e0e6ed')
    ),
    name = "Países originales",
    hoverinfo = 'text',
    hovertext = ~paste(
      "<b style='color:#00e5ff; font-size:13px;'>", Pais, "</b><br>",
      "<span style='color:#8b92a0; font-size:11px;'><b>Tipo:</b> Original</span><br>",
      "<b style='color:#00e676;'>Dim 3:</b> ", round(PC3, 3), "<br>",
      "<b style='color:#00e5ff;'>Dim 4:</b> ", round(PC4, 3)
    )
  ) %>%
  
  add_trace(
    data = datos_completos[datos_completos$Tipo == "Predicho", ],
    x = ~PC3, y = ~PC4,
    type = 'scatter',
    mode = 'markers',
    marker = list(
      color = '#ffd600',
      size = 14,
      opacity = 0.95,
      symbol = 'star',
      line = list(width = 2, color = '#ffffff')
    ),
    name = "Países predichos",
    hoverinfo = 'text',
    hovertext = ~paste(
      "<b style='color:#ffd600; font-size:13px;'>", Pais, "</b><br>",
      "<span style='color:#a259ff; font-size:11px;'><b>Tipo:</b> Predicho</span><br>",
      "<b style='color:#00e676;'>Dim 3:</b> ", round(PC3, 3), "<br>",
      "<b style='color:#00e5ff;'>Dim 4:</b> ", round(PC4, 3)
    ),
    visible = FALSE
  ) %>%
  
  layout(
    title = list(
      text = "<b style='color:#00e5ff; font-size:20px;'>Figura 22: Proyección PCA Dim 3 vs Dim 4</b><br>
             <span style='color:#8b92a0; font-size:12px;'>Países originales (gris) y predichos (dorado)</span>",
      x = 0.5,
      xanchor = 'center',
      y = 0.98
    ),
    xaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Dimensión 3 - Integración Comercial Global (9.1%)</b>",
      zeroline = TRUE,
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 11),
      titlefont = list(color = '#e0e6ed', size = 12)
    ),
    yaxis = list(
      title = "<b style='color:#e0e6ed; font-size:13px;'>Dimensión 4 - Presión Territorial (7.5%)</b>",
      zeroline = TRUE,
      zerolinecolor = "rgba(0, 229, 255, 0.3)",
      zerolinewidth = 2,
      gridcolor = '#12161f',
      showgrid = TRUE,
      tickfont = list(color = '#8b92a0', size = 11),
      titlefont = list(color = '#e0e6ed', size = 12)
    ),
    hovermode = "closest",
    plot_bgcolor = '#000000',
    paper_bgcolor = '#0a0e1a',
    font = list(family = "Arial, sans-serif", color = '#e0e6ed', size = 12),
    margin = list(l = 100, r = 80, b = 100, t = 140),
    hoverlabel = list(
      bgcolor = "rgba(10, 14, 26, 0.95)",
      bordercolor = "#00e5ff",
      font = list(color = "#e0e6ed", size = 12, family = "Arial")
    ),
    legend = list(
      bgcolor = "rgba(10, 14, 26, 0.9)",
      bordercolor = "#00e5ff",
      borderwidth = 1.5,
      x = 0.02,
      y = 0.55,
      xanchor = "left",
      yanchor = "middle",
      font = list(size = 11, color = "#e0e6ed")
    ),
    updatemenus = list(
      list(
        type = "buttons",
        direction = "vertical",
        x = 0.95,
        y = 0.05,
        xanchor = "right",
        yanchor = "bottom",
        buttons = list(
          list(
            method = "update",
            args = list(
              list(visible = c(TRUE, FALSE)),
              list(title = "<b style='color:#00e5ff; font-size:20px;'>Figura 22: Proyección PCA Dim 3 vs Dim 4</b><br>
                             <span style='color:#8b92a0; font-size:12px;'>Solo países originales</span>")
            ),
            label = "Solo Originales"
          ),
          list(
            method = "update",
            args = list(
              list(visible = c(TRUE, TRUE)),
              list(title = "<b style='color:#00e5ff; font-size:20px;'>Figura 19: Proyección PCA Dim 3 vs Dim 4</b><br>
                             <span style='color:#8b92a0; font-size:12px;'>Países originales (gris) y predichos (dorado)</span>")
            ),
            label = "Mostrar Predichos"
          )
        ),
        bgcolor = "rgba(0, 229, 255, 0.15)",
        bordercolor = "#00e5ff",
        borderwidth = 1.5,
        font = list(size = 10, color = "#00e5ff", family = "Arial")
      )
    )
  ) %>%
  
  config(
    responsive = TRUE,
    displayModeBar = TRUE,
    displaylogo = FALSE,
    modeBarButtonsToRemove = list('lasso2d', 'select2d'),
    toImageButtonOptions = list(
      format = "png",
      filename = "pca_prediccion_dim3_dim4",
      width = 1400,
      height = 900
    )
  )

p_animado1

Luxemburgo obtiene coordenada 2.9075 en PC1 (desarrollo extremo), junto a San Marino en la élite ultra-desarrollada, confirmando su posición como micro-Estado financiero con esperanza de vida de 85 años e hiperconectividad digital. Uruguay (1.4145 en PC1) se posiciona como país emergente latinoamericano con desarrollo humano consolidado. Jordania (0.1673) y Belice (-0.4472) son casos intermedios de ingresos medios con vulnerabilidades persistentes. Angola (-3.6127) lidera el rezago extremo, caracterizada por baja esperanza de vida (61 años), alta mortalidad infantil (56 por 1,000) y acceso limitado a servicios. En Dimensión 2, Luxemburgo (-1.0540) representa industrialización postindustrial consolidada; Angola (-1.7126) representa industrialización petroquímica sin beneficios distributivos. En Dimensión 3, Luxemburgo (-7.6090) es hiperglobalizado (comercio >300% PIB); Angola (-0.1232) es básicamente cerrada con dependencia petrolera. En Dimensión 4, Luxemburgo (4.9379) tiene escasa presión demográfica; Angola (1.7885) tiene tierra cultivable disponible pero sin transformación agrícola.

4.3.3 Caracteristicas de los clusters

El análisis de clusterización jerárquica mediante el método de Ward identificó tres grupos coherentes de países que trascienden clasificaciones geográficas tradicionales. La segmentación produjo una distribución desigual: el Cluster 1 agrupa 84 países (61.8% del total), el Cluster 2 agrupa 32 países (23.5%), y el Cluster 3 agrupa 20 países (14.7%).

Cluster 1: Calidad de vida y Conectividad Digital Consolidada (61.8% de países) Este grupo se caracteriza por valores extremadamente altos en indicadores de desarrollo humano e infraestructura tecnológica. La esperanza de vida promedio es de 77.44 años, el nivel más alto entre los tres clusters, indicando sistemas sanitarios consolidados, nutrición adecuada y estabilidad sociopolítica. El acceso a electricidad alcanza 99.16%, reflejando electrificación prácticamente universal que define a economías desarrolladas. El uso de internet es 86.05%, el más elevado, confirmando que la conectividad digital es característica definitoria de este grupo.

La mortalidad infantil es apenas 7.85 por cada 1,000 nacidos vivos, la más baja entre los clusters, reflejando que los sistemas de salud materno-infantil funcionan eficientemente. El PIB per cápita promedio es 26,489.97 USD, demostrando riqueza económica consolidada. El gasto en salud representa 7.62% del PIB, el más alto, validando inversión sustancial en sistemas de salud universales.

Desde la perspectiva económica, las exportaciones representan 55.30% del PIB e importaciones 54.55%, indicando que estos países son hubs comerciales internacionales. La industria representa 28.53% del PIB, confirmando que aunque estas economías son postindustriales basadas en servicios, mantienen capacidad manufacturera significativa. La inversión extranjera directa es 5.08% del PIB, indicando que son destinos atractivos para capitales internacionales. El crecimiento poblacional es apenas 0.73% anual, reflejando que han completado transiciones demográficas con poblaciones envejecidas.

Composición geográfica: Incluye principalmente naciones europeas desarrolladas (Alemania, Francia, Italia, España, Reino Unido, Suecia, Dinamarca, Finlandia, Noruega, Países Bajos), naciones norteamericanas (Estados Unidos, Canadá), economías asiáticas avanzadas (Japón, Corea del Sur, Singapur, Hong Kong), y destinos de desarrollo consolidado (Australia, Nueva Zelanda, Israel).

Cluster 2: Economias de transición con vulnerabilidades persistentes (23.5% de países)

Este grupo representa países con desarrollo humano intermedio pero altamente heterogéneo internamente. La esperanza de vida promedio es de 64.29 años, sustancialmente menor que Cluster 1 (13 años de diferencia), indicando que estos países han logrado avances en salud básica pero enfrentan desafíos significativos. El acceso a electricidad es 54.59%, apenas por encima de la mitad, reflejando que la electrificación es incompleta, especialmente en zonas rurales. El uso de internet es 35.04%, menos de la mitad de Cluster 1, confirmando que la brecha digital es significativa.

La mortalidad infantil es 40.97 por cada 1,000, aproximadamente 5 veces mayor que Cluster 1, indicando que los sistemas de salud materno-infantil enfrentan capacidades limitadas. El PIB per cápita promedio es 1,578.46 USD, dramáticamente menor que Cluster 1 (95% de diferencia), confirmando que estos son países de ingresos medios-bajos a medios. El crecimiento poblacional es 2.31% anual, significativamente más alto que Cluster 1, reflejando que están en transiciones demográficas incompletas donde la natalidad sigue siendo elevada.

Las remesas recibidas representan 4.94% del PIB, indicando dependencia moderada de transferencias de migrantes. La inversión extranjera es 3.65% del PIB, inferior a Cluster 1, sugiriendo que son menos atractivos para capitales internacionales. El gasto en salud es 5.10% del PIB, menor que Cluster 1, limitando recursos disponibles para sistemas de salud. La tierra cultivable es 20.60%, la más alta entre clusters, reflejando que muchos son economías donde la agricultura sigue siendo importante.

Composición geográfica: Incluye principalmente economías latinoamericanas emergentes (Brasil, México, Colombia, Argentina, Chile, Perú), economías asiáticas en transición (Vietnam, Tailandia, Indonesia, Filipinas, India en su mayoría), economías africanas moderadamente desarrolladas (Botswana, Mauricio, Sudáfrica), y países del Oriente Medio con ingresos medios (Turquía, Jordania, Líbano).

Cluster 3: Rezago Extremo y Vulnerabilidad Multidimensional (14.7% de países) Este grupo presenta características paradójicas que requieren interpretación cuidadosa. La esperanza de vida promedio es 71.59 años, aparentemente intermedia, pero esta cifra oculta volatilidad extrema: mientras algunos países tienen 75 años, otros tienen 55-58 años, con mortalidad adulta severamente elevada por VIH, conflictos armados y enfermedades tropicales. El acceso a electricidad es 96.42%, aparentemente alto, pero esta cifra promedio se distorsiona porque algunos países tienen cobertura urbana buena mientras zonas rurales están completamente sin electricidad.

La mortalidad infantil es 18.11 por cada 1,000, intermedia entre Cluster 1 (7.85) y Cluster 2 (40.97), sugiriendo que este cluster contiene algunos países que han logrado mejoras en salud infantil. El uso de internet es 61.08%, sorprendentemente alto comparado con Cluster 2 (35.04%), pero se explica porque algunos países han adoptado tecnología móvil masivamente sin infraestructura de electricidad o salud consolidada.

El PIB per cápita es 3,776.68 USD, intermedio entre Cluster 2 (1,578) y Cluster 1 (26,489), contradictorio con la caracterización de rezago extremo, pero refleja que algunos países tienen petróleo (Angola) o recursos (Zambia) que generan ingresos nominales sin beneficios distributivos amplios. Las remesas recibidas son 22.09% del PIB, el porcentaje más alto, reflejando que estas economías están severamente dependientes de transferencias de diásporas en el exterior. El gasto en salud es 7.44% del PIB, similar a Cluster 1, pero esta cifra es engañosa porque presupuestos limitados resultan en servicios muy deficientes.

La paradoja del Cluster 3: Algunas métricas (esperanza de vida 71.59, acceso electricidad 96.42, gasto salud 7.44%) parecen intermedias, no rezagadas. Esto refleja que el cluster contiene mezcla heterogénea: países como Angola (productor petrolero con ingresos altos nominales pero servicios colapsados) coexisten con países como Etiopía o Uganda. La vulnerabilidad real radica en fragilidad institucional, volatilidad, dependencia de remesas (22.09% vs. 2.47% en Cluster 1), y que indicadores altos coexisten con servicios públicos disfuncionales.

4.3.4 Patrones interesantes

El análisis revela múltiples patrones fascinantes que trascienden clasificaciones geográficas tradicionales y desafían expectativas convencionales sobre desarrollo internacional.

Patrones que Trascienden Fronteras Geográficas El hallazgo más sorprendente es que la geografía no determina el desarrollo. Uruguay y Chile en Sudamérica comparten características similares en desarrollo humano con países europeos orientales como Estonia y Polonia, mientras que economías asiáticas como Malasia y Tailandia exhiben perfiles comparables a países latinoamericanos de renta media alta como México y Colombia. Este patrón confirma que existen perfiles globales de desarrollo que operan independientemente de proximidad territorial o herencia cultural compartida.

Vietnam en Asia comparte características similares con Colombia en Sudamérica en términos de industrialización y conectividad digital, a pesar de estar separados por océanos y tener historias completamente diferentes. Botswana en África muestra indicadores comparables a algunos países de Europa del Este, demostrando que países africanos pueden alcanzar desarrollo intermedio cuando implementan políticas correctas.

La Paradoja de Costa Rica: Alto Desarrollo con Recursos Limitados Costa Rica emerge como caso emblemático de desarrollo inteligente. Este país tiene esperanza de vida de 80 años (comparable a Alemania o Japón), mortalidad infantil de 7.4 por cada 1,000 nacidos (similar a países europeos), y cobertura forestal del 52% (una de las más altas del mundo). Sin embargo, su PIB per cápita es apenas 12,500 USD, dramáticamente menor que los 40,000+ USD de Europa Occidental.

¿Cómo logra Costa Rica esto? Inversión estratégica sostenida en salud pública, educación universal, y conservación ambiental durante décadas, incluso cuando no era el país más rico de la región. Este patrón demuestra empíricamente que desarrollo humano alto no requiere riqueza económica absoluta, sino decisiones políticas deliberadas sobre priorización de gasto público.

Qatar, Kuwait y Emiratos Árabes Unidos tienen PIB per cápita entre los más altos del mundo (40,000-100,000 USD), superando dramáticamente a economías europeas consolidadas. Sin embargo, el análisis revela fragilidad estructural profunda: dependencia crítica de un único sector (petróleo representa 50-70% del PIB), estructuras demográficas distorsionadas (90% de población son migrantes temporales sin ciudadanía), y nula diversificación productiva.

Cuando los precios del petróleo caen, estas economías enfrentan crisis severas porque carecen de sectores alternativos. En contraste, Singapur y Corea del Sur—que carecen completamente de petróleo—han construido economías mucho más resilientes mediante diversificación industrial, educación masiva, y exportaciones de alta tecnología.

El análisis identifica un cluster de países cuyas economías dependen críticamente de remesas enviadas por ciudadanos trabajando en el exterior: Tonga (40% del PIB), Tayikistán (35%), Kirguistán (30%), Haití (25%), Honduras (20%). Estas transferencias superan ampliamente la ayuda externa y la inversión extranjera directa combinadas.

Este patrón revela una realidad invisible en estadísticas convencionales: millones de familias sobreviven porque algún miembro emigró y envía dinero mensualmente. Moldavia, una de las naciones más pobres de Europa, tiene 25% de su población trabajando en Rusia o Italia, con remesas representando 16% del PIB como principal fuente de divisas. La vulnerabilidad es evidente: cuando países receptores (Estados Unidos, Europa, Golfo Pérsico) enfrentan recesiones, los flujos de remesas colapsan instantáneamente.

poblacional han sacrificado sistemáticamente bosques por tierra cultivable para seguridad alimentaria. India lidera este extremo con 1,400 millones de habitantes en 3.3 millones de km² (densidad 420 hab/km²), habiendo convertido 60% del territorio en tierra cultivable y reducido bosques a apenas 23%.

Bangladesh presenta el caso más extremo: densidad de 1,250 hab/km², 70% de tierra cultivable, y bosques reducidos a 11%. China, aunque menos densamente poblada (145 hab/km²), tiene 1,400 millones de habitantes que han transformado casi toda tierra disponible en agricultura intensiva.

En contraste, países con baja densidad poblacional preservan naturaleza: Finlandia (73% bosques, 5.5 millones de habitantes), Surinam (93% bosques), Guyana (84% bosques). Este patrón no es coincidencia sino evidencia de que presión demográfica extrema obliga sacrificar ecosistemas por supervivencia.

Malta, Luxemburgo, Singapur e Irlanda exhiben comercio exterior superior al 200-300% del PIB—es decir, importan y exportan valores que duplican o triplican su economía completa. Malta alcanza 260% del PIB en comercio total, funcionando como hub financiero offshore, centro de servicios digitales (iGaming, blockchain), y base logística regional.

En el extremo opuesto, China e India—los mayores exportadores absolutos del mundo—tienen comercio exterior representando apenas 37% y 22% de sus PIB respectivamente, porque sus economías internas son tan masivas que absorben la mayor parte de la producción doméstica. Este patrón revela la paradoja de la globalización: los más globalizados son los más pequeños y vulnerables; los más grandes pueden permitirse mayor independencia.

Europa muestra patrones mixtos: Europa Occidental aparece consolidada en Cluster 1 (desarrollo avanzado), mientras Europa del Este está en transición entre Cluster 1 y Cluster 2, reflejando cicatrices del comunismo soviético que persisten 35 años después del colapso.

América Latina exhibe heterogeneidad extrema: Uruguay, Chile y Costa Rica aparecen con indicadores cercanos a países europeos; Brasil, México, Argentina y Colombia ocupan posiciones intermedias; mientras Honduras, Nicaragua y Haití permanecen rezagados severamente.

Asia muestra la mayor diversidad del planeta: Japón y Corea del Sur están en la élite global; China e India son gigantes emergentes con desarrollo intermedio; mientras Bangladesh, Myanmar y Afganistán enfrentan rezagos críticos.

África Subsahariana permanece concentrada en Cluster 3 (rezago extremo), con excepciones notables: Botswana, Mauricio y Sudáfrica han logrado desarrollo intermedio mediante políticas de gobernanza relativamente sólidas y diversificación económica.


5 Concluciones

El principal hallazgo es que el desarrollo mundial no funciona de manera lineal ni se puede reducir a una sola característica. Por el contrario, existe un orden invisible que organiza a los países según cuatro dimensiones principales que explican más de la mitad de las diferencias que observamos entre ellos.

Estas cuatro dimensiones son: primero, acceso a salud, educación y tecnología (esperanza de vida, acceso a internet, mortalidad infantil); segundo, tipo de economía que tiene cada país (si depende del petróleo, de la agricultura o de múltiples industrias); tercero, qué tan abierto está el país al comercio internacional; y cuarto, el equilibrio entre población y naturaleza (cuántos bosques quedan, cuánta presión hay sobre los recursos naturales).

El análisis identificó tres grupos claros de países: un grupo de países ricos con indicadores muy buenos en salud, educación y tecnología (Europa, América del Norte, Japón, Corea del Sur); un grupo intermedio de países emergentes que están mejorando pero aún tienen brechas (Brasil, México, Tailandia, Sudáfrica); y un tercer grupo de países con desafíos estructurales profundos, principalmente en África, donde la salud, educación y acceso a tecnología aún son limitados.

Sí, el análisis permitió identificar patrones claros y sorprendentes. Lo más importante es que estos patrones no siguen las líneas geográficas que esperaríamos. Por ejemplo, Uruguay (en Sudamérica) se parece más a países europeos del este como Polonia en cómo está organizado su desarrollo, mientras que Vietnam (en Asia) comparte características similares con Colombia (en Sudamérica). Esto muestra que la geografía no es destino.

Un caso muy revelador es Costa Rica: este país tiene una esperanza de vida de 80 años (igual que Alemania o Japón), pero su PIB per cápita es mucho menor. ¿Cómo es posible? Porque Costa Rica invirtió fuertemente en salud y educación pública aunque no fuera el país más rico. Esto demuestra que no hay una única forma de desarrollarse. Algunos países ricos lo lograron por industria, otros por finanzas, otros por turismo y agricultura sostenible.

También descubrimos que algunos países aparentemente exitosos (como Qatar) tienen una fragilidad oculta: sus economías dependen casi completamente del petróleo. Cuando bajan los precios del petróleo, estos países se hunden. En cambio, países como Singapur o Corea del Sur diversificaron sus economías y por eso son más estables.

El patrón fundamental que emerge es que los países que logran buen desarrollo son aquellos que invierten simultáneamente en tres cosas: salud, educación, y diversificación económica. Puede hacerse en diferentes órdenes y con diferentes estrategias, pero estos tres pilares aparecen una y otra vez en los países exitosos del análisis.

Este tipo de análisis tiene aplicaciones concretas y muy prácticas para los gobiernos y organismos internacionales:

Primero, diseñar políticas adaptadas a cada tipo de país. En lugar de que organismos como el Banco Mundial digan a todos los países lo mismo (por ejemplo “reduzcan el gasto público”), podrían identificar qué tipo de problema tiene cada país específicamente y diseñar soluciones adaptadas. Un país con crisis de salud infantil necesita expandir hospitales, no reducir gasto. Un país que depende solo del petróleo necesita crear nuevas industrias, no seguir extrayendo más petróleo

Segundo, aprender de pares exitosos en tu propia situación. Si Bolivia quiere mejorar su sistema de salud, en lugar de escuchar a expertos europeos, podría estudiar cómo Costa Rica o Cuba lo hicieron con presupuestos similares. Si Sudáfrica quiere reducir la corrupción, podría aprender de Uruguay que lo logró en contexto latinoamericano similar. Este tipo de aprendizaje entre pares funciona mejor que imposiciones externas.

Tercero, identificar riesgos ocultos antes de que se conviertan en crisis. Los gobiernos y bancos multilaterales podrían usar este análisis para detectar que un país se está volviendo muy dependiente de una sola industria, o que aunque tenga números macroeconómicos buenos, su sistema de salud se está colapsando. Con esta información temprana, podrían actuar preventivamente.

Cuarto, priorizar inversiones de forma inteligente. Cuando un país tiene presupuesto limitado, necesita saber dónde invertir para obtener máximos beneficios. Este análisis muestra que invertir en educación y salud simultáneamente genera un efecto multiplicador: gente más sana estudia mejor, gente educada hace mejores decisiones sobre salud. Así que gastar en ambas cosas a la vez genera más impacto que gastar en una sola.

Quinto, monitorear el progreso hacia objetivos globales. Las Naciones Unidas tienen un conjunto de 17 Objetivos de Desarrollo Sostenible que todos los países deberían alcanzar (acabar pobreza, garantizar salud, educación, etc.). Este análisis permite ver objetivamente si un país está avanzando hacia estos objetivos o se está alejando, y cuáles son sus mayores brechas comparado con países similares.

En conclusión, este ejercicio académico prueba que el desarrollo de las naciones es un fenómeno complejo que requiere análisis sofisticados, pero una vez que lo entendemos, podemos actuar de manera mucho más efectiva. No existe una sola receta para el éxito, pero sí existen patrones que se repiten. Los países que tienen éxito son los que invierten equilibradamente en su gente (salud y educación), diversifican su economía, y toman decisiones conscientes sobre cuánto comerciar con el mundo y cómo proteger su ambiente.

Para gobiernos, este análisis es útil porque les muestra en qué están bien y en qué deben mejorar comparados con países similares. Para organismos internacionales, es útil porque permite diseñar ayuda realmente adaptada a necesidades específicas. Y para la sociedad en general, es útil porque explica por qué algunos países prosperan y otros no—no es misterio ni destino, sino resultado de decisiones políticas concretas que otros países ya han tomado exitosamente.


6 Bibliografia

Acemoglu, D., & Robinson, J. A. (2012). Why nations fail: The origins of power, prosperity, and poverty. Crown Publishers.

Agencia Presidencial de Cooperación Internacional de Colombia. (2023). Estrategia Nacional de Cooperación Internacional. https://www.apccolombia.gov.co

Andini, M., Ciani, E., de Blasio, G., D’Ignazio, A., & Salvestrini, V. (2018a). Targeting with machine learning: An application to a tax rebate program in Italy. Journal of Economic Behavior & Organization, 156, 86-102.

Andini, M., Ciani, E., de Blasio, G., D’Ignazio, A., & Salvestrini, V. (2018b). Targeting policy with machine learning. VoxEU CEPR. https://voxeu.org/article/targeting-policy-machine-learning

ArcGIS. (2024). Distancia euclidiana: Cómo funciona. Environmental Systems Research Institute. https://pro.arcgis.com

Athey, S. (2017). Beyond prediction: Using big data for policy problems. Science, 355(6324), 483-485.

Athey, S., & Imbens, G. W. (2016). Recursive partitioning for heterogeneous causal effects. Proceedings of the National Academy of Sciences, 113(27), 7353-7360.

Banco Interamericano de Desarrollo. (2022). Informe macroeconómico de América Latina y el Caribe 2022: El sendero hacia la recuperación. BID.

Banco Mundial. (2022). Perspectivas económicas mundiales 2022: Crisis superpuestas. Grupo Banco Mundial.

Behar, A., & Mok, J. (2024). The World Development Indicators database: Structure, coverage, and quality assurance. World Bank Technical Paper.

Brookings Institution. (2016). Making sense of clusters: Regional competitiveness and economic development. Metropolitan Policy Program.

Centro de Documentación de Barcelona. (2022). Economía global 2022: Perspectivas post-pandemia. CIDOB.

Cervellati, M., Esposito, E., Sunde, U., & Valmori, S. (2022). Long-term growth and demographic change. CEPR Discussion Paper, DP17385.

Charrad, M., Ghazzali, N., Boiteau, V., & Niknafs, A. (2014). NbClust: An R package for determining the relevant number of clusters in a data set. Journal of Statistical Software, 61(6), 1-36.

Ciencia de Datos. (2016). Estandarización de variables: Importancia en machine learning. https://www.cienciadedatos.net

Comisión Económica para América Latina y el Caribe. (2023). Balance preliminar de las economías de América Latina y el Caribe 2023. CEPAL.

European Central Bank. (2018). Foreign direct investment and economic growth. ECB Economic Bulletin, Issue 4/2018.

Fondo Monetario Internacional. (2023). Perspectivas de la economía mundial: Resiliencia en tiempos de incertidumbre. FMI.

Fritz, M., & Koch, M. (2016). Economic development and prosperity patterns around the world: Structural challenges for a global steady-state economy. Global Environmental Change, 38, 41-48.

Hastie, T., Tibshirani, R., & Friedman, J. (2009). The elements of statistical learning: Data mining, inference, and prediction (2nd ed.). Springer.

Hidalgo, C. A. (2022). The policy implications of economic complexity. arXiv preprint arXiv:2205.02164.

Jeanty, P. W. (2010). A guide to interpreting the World Development Indicators. World Bank Data Group Working Paper.

Jolliffe, I. T. (2002). Principal component analysis (2nd ed.). Springer.

KeepCoding. (2025). ¿Qué es el análisis de componentes principales (PCA)? https://keepcoding.io/blog/que-es-pca/

Kim, Y. K. (2017). Patterns of economic development: Correlations affecting economic growth. Korean Journal of Policy Studies, 32(2), 1-24.

Kleinberg, J., Ludwig, J., Mullainathan, S., & Obermeyer, Z. (2015). Prediction policy problems. American Economic Review, 105(5), 491-495.

LinkedIn Learning. (2023). Estandarización y normalización en análisis de datos. https://www.linkedin.com/learning

Mullainathan, S., & Spiess, J. (2017). Machine learning: An applied econometric approach. Journal of Economic Perspectives, 31(2), 87-106.

OpenWebinars. (2025). Tutorial de análisis de componentes principales en R. https://openwebinars.net

Organización para la Cooperación y el Desarrollo Económicos. (2024). Health at a Glance 2024: OECD indicators. OECD Publishing.

Piketty, T. (2022). Una breve historia de la igualdad. Editorial Planeta.

Programa de las Naciones Unidas para el Desarrollo. (2023). Informe sobre Desarrollo Humano 2023-2024. PNUD.

Sachs, J. D., Lafortune, G., Fuller, G., & Drumm, E. (2022). Sustainable Development Report 2022. Cambridge University Press.

Saraiva, M. V., Ferreira, F. A., Pais, M. C., & Ferreira, N. C. (2025). Clustering analysis on Sustainable Development Goal indicators for forty-five Asian countries. Sustainability, 15(7), 5728.

Shkolnikov, V. M., Andreev, E. M., McKee, M., & Leon, D. A. (2019). Components and possible determinants of the decrease in Russian mortality in 2004-2010. Demographic Research, 28, 917-950.

TIBCO Software. (2024). Ward’s hierarchical clustering method. Statistica Documentation. https://docs.tibco.com

Conferencia de las Naciones Unidas sobre Comercio y Desarrollo. (2021). Technology and Innovation Report 2021: Catching technological waves. UNCTAD.

Universidad de Granada. (2016). Medidas de similitud y distancia en análisis multivariante. Departamento de Estadística e Investigación Operativa.

Ward, J. H. (1963). Hierarchical grouping to optimize an objective function. Journal of the American Statistical Association, 58(301), 236-244.

Wikipedia. (2013). Ward’s method. https://en.wikipedia.org/wiki/Ward%27s_method

Wolman, H., & Hincapie, D. (2014). Clusters and cluster-based development policy. Economic Development Quarterly, 29(2), 135-149.

World Bank. (2015). World Development Report 2015: Mind, society, and behavior. World Bank Publications.

World Bank. (2019). World Development Indicators: Methodology and compilation practices. World Bank Data Group.

World Bank. (2023). World Development Indicators 2023. World Bank Open Data. https://data.worldbank.org

World Health Organization. (2020). World Health Statistics 2020: Monitoring health for the SDGs. WHO Press.