EN ESTA SECCIÓ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.
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.
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.
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) | ||
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) | ||
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) | ||
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) | ||
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) | ||
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_inicialLa 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.
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.
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).
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:
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).
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).
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.
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)
}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')
}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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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% |
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.
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.
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
)
)
pLa 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.
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_plotEn Á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.
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
)
)
pEl 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.
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_treemapIndia 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.
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.
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
)