Un Análisis de Indicadores del Banco Mundial, 2022.
El desarrollo de los países es un fenómeno multidimensional que no puede explicarse únicamente a partir de su crecimiento económico o nivel de ingresos. Aunque estos indicadores permiten evaluar aspectos importantes de la actividad productiva, existen otras condiciones relacionadas con la salud, el acceso a servicios básicos, la conectividad tecnológica, los recursos naturales y las características demográficas que también influyen en las diferencias entre países. Por esta razón, comprender el desarrollo mundial requiere analizar conjuntamente distintas variables que reflejen estas dimensiones.
En este contexto, los indicadores del Banco Mundial permiten comparar las condiciones de los países mediante información estadística internacional. Sin embargo, el análisis simultáneo de numerosas variables presenta una dificultad: algunos indicadores pueden estar relacionados entre sí, mientras que otros reflejan características diferentes. Esto dificulta identificar cuáles son los principales factores que distinguen a los países y reconocer aquellos que presentan condiciones similares.
A partir de esta problemática, el presente estudio busca responder la siguiente pregunta de investigación: ¿Qué patrones permiten diferenciar a los países según sus características económicas, sociales, tecnológicas, ambientales y demográficas en 2022, y cómo pueden identificarse grupos de países con perfiles similares mediante técnicas de aprendizaje no supervisado?
Para responderla, se utilizan 16 indicadores de los World Development Indicators (WDI) del Banco Mundial, correspondientes al año 2022. El análisis se desarrolla mediante dos técnicas complementarias: el Análisis de Componentes Principales (ACP), que permite reducir la dimensionalidad de los datos e identificar las principales fuentes de variación entre países, y el agrupamiento jerárquico aglomerativo mediante el método de Ward, que permite formar grupos de países con características semejantes. (James et al., 2021)
El objetivo general es identificar y caracterizar patrones de desarrollo entre países a partir de indicadores multidimensionales, utilizando ACP y agrupamiento jerárquico. Específicamente, se busca describir las diferencias entre los indicadores seleccionados, determinar las principales dimensiones que resumen su variabilidad, identificar grupos de países con perfiles similares e interpretar las características que distinguen a cada conglomerado. Adicionalmente, se examina la ubicación de Colombia dentro de la clasificación obtenida, con el propósito de contextualizar sus características frente a las de otros países.
Para el desarrollo de este estudio se utilizaron datos de los World Development Indicators (WDI) del Banco Mundial, una base de información estadística internacional que reúne indicadores económicos, sociales, demográficos, tecnológicos y ambientales. Esta fuente permite realizar comparaciones entre países a partir de indicadores definidos bajo criterios metodológicos comunes, lo que resulta adecuado para identificar patrones y diferencias en sus condiciones de desarrollo.
La información se obtuvo mediante la plataforma DataBank del Banco Mundial, disponible en https://databank.worldbank.org/reports.aspx?source=world-development-indicators. Se seleccionó el año 2022 para realizar un análisis de corte transversal, es decir, comparar las características de diferentes países durante un mismo período. Esta elección permite estudiar las diferencias internacionales sin incorporar cambios a lo largo del tiempo.
Además, se seleccionó el año 2022 por la disponibilidad y comparabilidad de los indicadores económicos, sociales, demográficos y ambientales utilizados, lo que permitió construir una base consistente para el análisis . Durante la revisión de datos faltantes se descartaron dos variables de la propuesta inicial, el consumo de energía renovable y la matrícula secundaria, porque en 2022 solo tenían información para 71 y 140 economías, respectivamente; en su lugar se incluyeron el acceso a agua potable y la superficie agrícola. También se tuvo en cuenta que 2022 estuvo marcado por choques coyunturales, como la guerra en Ucrania y la inflación alta en varios países, lo que justifica el tratamiento de valores extremos descrito en la sección 2.4.1.
La unidad de análisis es el país, por lo que cada observación representa una economía nacional y sus respectivos indicadores para 2022. Se seleccionaron 16 variables cuantitativas distribuidas en cinco dimensiones: económica, salud y bienestar, tecnológica y de conectividad, ambiental y de recursos naturales, y demográfica. Esta selección permite abordar el desarrollo desde una perspectiva multidimensional, sin limitar la comparación al desempeño económico.
Para construir la base de estudio se consideraron países con información disponible en los indicadores seleccionados, excluyendo agregados regionales, territorios definidos fuera del alcance del análisis y observaciones con datos incompletos. Después del proceso de depuración, se obtuvo una muestra final de 144 países, que constituye la base utilizada para el análisis descriptivo, el Análisis de Componentes Principales (ACP) y el agrupamiento jerárquico mediante el método de Ward.
Para analizar las diferencias en las condiciones de desarrollo entre países, se seleccionaron 16 indicadores cuantitativos de los World Development Indicators (WDI) del Banco Mundial, correspondientes al año 2022. Estas variables permiten examinar distintas características de los países y establecer comparaciones desde una perspectiva multidimensional.
La selección se realizó considerando tres criterios principales: pertinencia, para incluir indicadores relacionados con aspectos relevantes del desarrollo; comparabilidad, para utilizar medidas que permitan contrastar países con diferentes tamaños y características; y disponibilidad de información, para conservar una muestra suficientemente amplia después de la depuración de los datos.
Los indicadores se organizaron en cinco dimensiones: económica, salud y bienestar, tecnológica y de conectividad, ambiental y de recursos naturales, y demográfica. Esta clasificación facilita su descripción e interpretación, aunque todas las variables se analizarán conjuntamente mediante el Análisis de Componentes Principales (ACP) y el agrupamiento jerárquico.
A continuación, se describen las variables que conforman cada dimensión, su significado y su importancia para el análisis.
La dimensión económica comprende cinco indicadores que permiten analizar las diferencias en el desempeño productivo, la estabilidad económica y la participación de los países en el comercio internacional. Estas variables proporcionan una visión general de sus condiciones económicas y permiten identificar características que pueden influir en sus niveles de desarrollo.
El Producto Interno Bruto (PIB) per cápita ajustado por paridad de poder adquisitivo (PPA) representa el valor de la producción económica por habitante, considerando las diferencias en los niveles de precios entre países. Por su parte, el crecimiento anual del PIB mide la variación porcentual de la producción respecto al año anterior, lo que permite identificar economías en expansión o contracción.
La inflación anual refleja la variación de los precios de los bienes y servicios de consumo, proporcionando información sobre la estabilidad de precios. El comercio internacional, medido como la suma de exportaciones e importaciones en porcentaje del PIB, permite examinar el grado de apertura comercial de cada economía.
Finalmente, el valor agregado de la agricultura como porcentaje del PIB indica la participación de las actividades agrícolas en la producción nacional, lo que permite reconocer diferencias en la estructura productiva de los países.
En conjunto, estos indicadores permiten comparar el nivel de producción por habitante, la dinámica económica, la estabilidad de precios y la composición de las economías, aportando información relevante para identificar patrones de desarrollo entre países.
La dimensión de salud y bienestar comprende tres indicadores que permiten examinar las condiciones sanitarias y el acceso a servicios esenciales de la población. Estas variables reflejan aspectos importantes de la calidad de vida y permiten identificar diferencias en las condiciones sociales de los países.
La esperanza de vida al nacer representa el número promedio de años que se espera que viva una persona recién nacida, considerando las condiciones de mortalidad del período analizado. Por su parte, la mortalidad infantil mide el número de fallecimientos de menores de un año por cada 1.000 nacidos vivos, proporcionando información sobre las condiciones de salud y supervivencia durante el primer año de vida.
Finalmente, el acceso a servicios básicos de agua potable indica el porcentaje de la población que utiliza servicios básicos de agua potable para consumo que cumplen los criterios de accesibilidad establecidos por el indicador del Banco Mundial. Este indicador permite aproximarse a la cobertura de un servicio esencial para la salud y el bienestar de la población.
En conjunto, estas variables permiten comparar las condiciones de salud, supervivencia y acceso a servicios básicos entre países, complementando la información proporcionada por los indicadores económicos.
La dimensión tecnológica y de conectividad comprende dos indicadores que permiten examinar el acceso de la población a servicios de infraestructura básica y tecnologías de la información. Estas variables son relevantes para identificar diferencias en las condiciones que facilitan las actividades productivas, educativas y de comunicación entre países.
El acceso a electricidad representa el porcentaje de la población que dispone de suministro eléctrico, un servicio esencial para el funcionamiento de los hogares, las empresas y diversas actividades económicas. Por su parte, los usuarios de internet indican el porcentaje de personas que utilizan este servicio, proporcionando una aproximación al nivel de conectividad digital de cada país.
En conjunto, estos indicadores permiten identificar brechas en el acceso a infraestructura eléctrica y tecnologías digitales, complementando el análisis de las condiciones económicas y sociales de los países.
La dimensión ambiental y de recursos naturales comprende tres indicadores que permiten examinar las características del territorio y la distribución de los recursos naturales entre países. Estas variables proporcionan información sobre el uso del suelo, la presencia de ecosistemas forestales y la protección de espacios naturales.
La superficie agrícola representa el porcentaje del territorio destinado a actividades agrícolas, incluyendo tierras cultivables, cultivos permanentes y pastizales. Por su parte, la superficie forestal indica la proporción del territorio cubierta por bosques, lo que permite identificar diferencias en la cobertura forestal de los países.
Finalmente, las áreas protegidas terrestres y marinas representan la proporción de superficie comprendida dentro de espacios destinados a la conservación de la biodiversidad y los ecosistemas naturales. Este indicador permite aproximarse a la extensión territorial bajo protección ambiental.
En conjunto, estas variables permiten comparar los patrones de uso del territorio, la disponibilidad de cobertura forestal y la extensión de las áreas protegidas, incorporando una perspectiva ambiental al análisis multidimensional del desarrollo.
La dimensión demográfica comprende tres indicadores que permiten examinar las características y dinámicas de la población de los países. Estas variables proporcionan información sobre los patrones de fecundidad, la distribución territorial de los habitantes y los cambios en el tamaño de la población.
La tasa de fecundidad representa el número promedio de hijos que tendría una mujer durante su vida reproductiva, considerando las tasas de fecundidad por edad del período analizado. Por su parte, la población urbana indica el porcentaje de habitantes que reside en áreas urbanas, lo que permite comparar los niveles de urbanización entre países.
Finalmente, el crecimiento poblacional anual mide la variación porcentual de la población respecto al año anterior, reflejando los cambios asociados con los nacimientos, las defunciones y los movimientos migratorios.
En conjunto, estos indicadores permiten identificar diferencias en las dinámicas demográficas y los niveles de urbanización de los países, complementando el análisis de sus características económicas, sociales, tecnológicas y ambientales.
indicadores <- data.frame(
Dimension = c(
rep("Económica", 5),
rep("Salud y bienestar", 3),
rep("Tecnológica y conectividad", 2),
rep("Ambiental y recursos naturales", 3),
rep("Demográfica", 3)
),
Indicador = c(
"PIB per cápita (PPA)",
"Crecimiento del PIB",
"Inflación",
"Comercio internacional",
"Agricultura (% del PIB)",
"Esperanza de vida",
"Mortalidad infantil",
"Acceso a agua potable",
"Acceso a electricidad",
"Usuarios de internet",
"Superficie agrícola",
"Superficie forestal",
"Áreas protegidas",
"Tasa de fecundidad",
"Población urbana",
"Crecimiento poblacional"
),
Codigo = c(
"NY.GDP.PCAP.PP.KD",
"NY.GDP.MKTP.KD.ZG",
"FP.CPI.TOTL.ZG",
"NE.TRD.GNFS.ZS",
"NV.AGR.TOTL.ZS",
"SP.DYN.LE00.IN",
"SP.DYN.IMRT.IN",
"SH.H2O.BASW.ZS",
"EG.ELC.ACCS.ZS",
"IT.NET.USER.ZS",
"AG.LND.AGRI.ZS",
"AG.LND.FRST.ZS",
"ER.PTD.TOTL.ZS",
"SP.DYN.TFRT.IN",
"SP.URB.TOTL.IN.ZS",
"SP.POP.GROW"
),
Descripcion = c(
"Producción por habitante ajustada por diferencias de precios.",
"Variación anual del PIB real (%).",
"Variación anual de precios al consumidor (%).",
"Exportaciones e importaciones como porcentaje del PIB.",
"Participación de la agricultura en el PIB (%).",
"Años esperados de vida al nacer.",
"Muertes antes del primer año por cada 1.000 nacidos vivos.",
"Población que utiliza al menos servicios básicos de agua potable (%).",
"Población con acceso a electricidad (%).",
"Personas que utilizan internet (%).",
"Tierras agrícolas como porcentaje de la superficie terrestre.",
"Bosques como porcentaje de la superficie terrestre.",
"Cobertura de áreas protegidas terrestres y marinas (%).",
"Número promedio de hijos por mujer.",
"Población residente en áreas urbanas (%).",
"Variación anual de la población (%)."
),
Interpretacion = c(
"Aproxima el nivel de producción económica por habitante.",
"Identifica economías en expansión o contracción.",
"Refleja la dinámica de los precios y su estabilidad.",
"Aproxima el grado de apertura comercial.",
"Muestra el peso del sector agrícola en la economía.",
"Resume las condiciones generales de supervivencia.",
"Permite comparar la supervivencia infantil.",
"Refleja la cobertura de un servicio básico esencial.",
"Identifica diferencias en infraestructura eléctrica.",
"Permite comparar la conectividad digital.",
"Describe la proporción del territorio de uso agrícola.",
"Permite comparar la cobertura de ecosistemas forestales.",
"Aproxima la extensión de la protección ambiental.",
"Refleja diferencias en los patrones reproductivos.",
"Permite comparar los niveles de urbanización.",
"Identifica poblaciones en crecimiento o disminución."
),
stringsAsFactors = FALSE
)
indicadores$Dimension[
duplicated(indicadores$Dimension)
] <- ""
estilo_indicadores <- '
.cocoa-indicadores {
font-family: "Satoshi", Arial, sans-serif;
background: #FFFCF7;
border: 1px solid #DCC8B2;
border-radius: 16px;
padding: 22px;
margin: 25px 0;
box-shadow: 0 8px 26px rgba(91,58,40,.09);
}
.cocoa-indicadores .cocoa-dataset-head {
background: linear-gradient(110deg,#493429,#72503D,#997051);
border-radius: 11px;
padding: 22px 25px;
margin-bottom: 20px;
border-bottom: 3px solid #D8AF70;
}
.cocoa-indicadores .cocoa-dataset-label {
font-size: 10px;
letter-spacing: 2px;
text-transform: uppercase;
font-weight: 700;
color: #E7C18B;
margin-bottom: 7px;
}
.cocoa-indicadores .cocoa-dataset-title {
font-family: "Fraunces", Georgia, serif;
font-size: 24px;
font-weight: 500;
color: #FFF9F0;
margin-bottom: 6px;
}
.cocoa-indicadores .cocoa-dataset-subtitle {
color: #F1DFCC;
font-size: 12px;
}
.cocoa-indicadores-wrap {
width: 100%;
overflow-x: auto;
}
.cocoa-indicadores-table {
width: 100%;
min-width: 980px;
border-collapse: collapse;
font-size: 11.5px;
line-height: 1.6;
border: 1px solid #DDC9B4;
}
.cocoa-indicadores-table thead th {
background: #624634;
color: #FFF8ED;
font-weight: 700;
font-size: 11px;
padding: 13px 14px;
text-align: left;
border-bottom: 3px solid #D4A66C;
border-right: 1px solid #82614B;
}
.cocoa-indicadores-table tbody td {
color: #514237;
padding: 12px 13px;
border-bottom: 1px solid #EAD9C7;
vertical-align: top;
}
.cocoa-indicadores-table tbody tr:nth-child(odd) td {
background: #FFFCF7;
}
.cocoa-indicadores-table tbody tr:nth-child(even) td {
background: #F5EADF;
}
.cocoa-indicadores-table tbody tr:hover td {
background: #EBD3BD;
}
.cocoa-indicadores-table tbody tr.grupo td {
border-top: 2px solid #C59665;
}
.cocoa-indicadores-table tbody td:first-child {
width: 15%;
font-weight: 700;
color: #985E40;
border-left: 3px solid #D2A06F;
}
.cocoa-indicadores-table tbody td:nth-child(2) {
width: 18%;
font-weight: 700;
color: #624634;
}
.cocoa-indicadores-table tbody td:nth-child(3) {
width: 17%;
font-family: Consolas, monospace;
font-size: 10px;
color: #906846;
white-space: nowrap;
}
.cocoa-indicadores-table tbody td:nth-child(4) {
width: 25%;
}
.cocoa-indicadores-table tbody td:nth-child(5) {
width: 25%;
}
.cocoa-indicadores .cocoa-dataset-source {
background: #F4E8D9;
border-left: 3px solid #C59665;
padding: 12px 15px;
margin-top: 19px;
border-radius: 0 7px 7px 0;
font-size: 11px;
color: #755942;
}
'
filas_indicadores <- lapply(
seq_len(nrow(indicadores)),
function(i) {
htmltools::tags$tr(
class = if (i %in% c(1, 6, 9, 11, 14)) "grupo" else NULL,
lapply(
indicadores[i, ],
function(valor) {
htmltools::tags$td(as.character(valor))
}
)
)
}
)
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(estilo_indicadores)
),
htmltools::tags$div(
class = "cocoa-indicadores",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"02 / Metodología · Banco Mundial 2022"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Indicadores seleccionados"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"16 indicadores · 5 dimensiones de análisis"
)
),
htmltools::tags$div(
class = "cocoa-indicadores-wrap",
htmltools::tags$table(
class = "cocoa-indicadores-table",
htmltools::tags$thead(
htmltools::tags$tr(
htmltools::tags$th("Dimensión"),
htmltools::tags$th("Indicador"),
htmltools::tags$th("Código WDI"),
htmltools::tags$th("Descripción"),
htmltools::tags$th("Interpretación")
)
),
htmltools::tags$tbody(filas_indicadores)
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$strong("Fuente: "),
"Elaboración propia con base en World Development Indicators (Banco Mundial), 2022."
)
)
)
)
| Dimensión | Indicador | Código WDI | Descripción | Interpretación |
|---|---|---|---|---|
| Económica | PIB per cápita (PPA) | NY.GDP.PCAP.PP.KD | Producción por habitante ajustada por diferencias de precios. | Aproxima el nivel de producción económica por habitante. |
| Crecimiento del PIB | NY.GDP.MKTP.KD.ZG | Variación anual del PIB real (%). | Identifica economías en expansión o contracción. | |
| Inflación | FP.CPI.TOTL.ZG | Variación anual de precios al consumidor (%). | Refleja la dinámica de los precios y su estabilidad. | |
| Comercio internacional | NE.TRD.GNFS.ZS | Exportaciones e importaciones como porcentaje del PIB. | Aproxima el grado de apertura comercial. | |
| Agricultura (% del PIB) | NV.AGR.TOTL.ZS | Participación de la agricultura en el PIB (%). | Muestra el peso del sector agrícola en la economía. | |
| Salud y bienestar | Esperanza de vida | SP.DYN.LE00.IN | Años esperados de vida al nacer. | Resume las condiciones generales de supervivencia. |
| Mortalidad infantil | SP.DYN.IMRT.IN | Muertes antes del primer año por cada 1.000 nacidos vivos. | Permite comparar la supervivencia infantil. | |
| Acceso a agua potable | SH.H2O.BASW.ZS | Población que utiliza al menos servicios básicos de agua potable (%). | Refleja la cobertura de un servicio básico esencial. | |
| Tecnológica y conectividad | Acceso a electricidad | EG.ELC.ACCS.ZS | Población con acceso a electricidad (%). | Identifica diferencias en infraestructura eléctrica. |
| Usuarios de internet | IT.NET.USER.ZS | Personas que utilizan internet (%). | Permite comparar la conectividad digital. | |
| Ambiental y recursos naturales | Superficie agrícola | AG.LND.AGRI.ZS | Tierras agrícolas como porcentaje de la superficie terrestre. | Describe la proporción del territorio de uso agrícola. |
| Superficie forestal | AG.LND.FRST.ZS | Bosques como porcentaje de la superficie terrestre. | Permite comparar la cobertura de ecosistemas forestales. | |
| Áreas protegidas | ER.PTD.TOTL.ZS | Cobertura de áreas protegidas terrestres y marinas (%). | Aproxima la extensión de la protección ambiental. | |
| Demográfica | Tasa de fecundidad | SP.DYN.TFRT.IN | Número promedio de hijos por mujer. | Refleja diferencias en los patrones reproductivos. |
| Población urbana | SP.URB.TOTL.IN.ZS | Población residente en áreas urbanas (%). | Permite comparar los niveles de urbanización. | |
| Crecimiento poblacional | SP.POP.GROW | Variación anual de la población (%). | Identifica poblaciones en crecimiento o disminución. |
La base de datos del modelo se construyó a partir de los indicadores descargados de World Development Indicators (WDI) del Banco Mundial para el año 2022. El procesamiento se realizó en R, con el propósito de organizar la información, verificar su integridad y obtener una matriz adecuada para aplicar las técnicas de aprendizaje no supervisado.
Inicialmente, los datos se encontraban en formato largo, donde cada registro correspondía a un indicador de un país. Mediante una transformación a formato ancho, se reorganizó la información para que cada fila representara un país y cada columna correspondiera a una de las 16 variables seleccionadas.
Posteriormente, se excluyeron los agregados regionales y económicos, así como los territorios dependientes definidos fuera del alcance del estudio. También se identificaron los valores faltantes y se eliminaron las observaciones que no contaban con información completa en los indicadores seleccionados. Este procedimiento permitió trabajar con una misma muestra de países en todas las etapas del análisis.
Como resultado, se obtuvo una base depurada de 144 países y 16 variables cuantitativas, sin valores faltantes. Además, se conservaron el nombre y el código de cada país como identificadores, aunque estas columnas no participan en los cálculos estadísticos.
La base final constituye el punto de partida para el análisis descriptivo, la reducción de dimensionalidad mediante ACP y la identificación de conglomerados mediante el método de Ward. Antes de aplicar estas técnicas, las variables serán transformadas y estandarizadas para evitar que las diferencias en sus escalas de medición condicionen los resultados. (Banco Mundial, 2026)
resumen_base <- data.frame(
Caracteristica = c(
"Fuente de información",
"Período de estudio",
"Unidad de análisis",
"Países seleccionados",
"Indicadores cuantitativos",
"Dimensiones de análisis",
"Valores faltantes",
"Variables de identificación",
"Técnicas de modelación"
),
Resultado = c(
"World Development Indicators (Banco Mundial)",
"2022",
"País",
"144",
"16",
"5",
"0",
"Nombre y código del país",
"ACP y agrupamiento jerárquico de Ward"
),
stringsAsFactors = FALSE
)
estilo_resumen <- '
.cocoa-resumen {
font-family: "Satoshi", Arial, sans-serif;
background: #FFFCF7;
border: 1px solid #DCC8B2;
border-radius: 16px;
padding: 22px;
margin: 25px 0;
box-shadow: 0 8px 26px rgba(91,58,40,.09);
}
.cocoa-resumen .cocoa-dataset-head {
background: linear-gradient(110deg,#493429,#72503D,#997051);
border-radius: 11px;
padding: 22px 25px;
margin-bottom: 20px;
border-bottom: 3px solid #D8AF70;
}
.cocoa-resumen .cocoa-dataset-label {
font-size: 10px;
letter-spacing: 2px;
text-transform: uppercase;
font-weight: 700;
color: #E7C18B;
margin-bottom: 7px;
}
.cocoa-resumen .cocoa-dataset-title {
font-family: "Fraunces", Georgia, serif;
font-size: 24px;
font-weight: 500;
color: #FFF9F0;
margin-bottom: 6px;
}
.cocoa-resumen .cocoa-dataset-subtitle {
color: #F1DFCC;
font-size: 12px;
}
.cocoa-resumen-table {
width: 100%;
border-collapse: collapse;
font-size: 11.5px;
line-height: 1.6;
border: 1px solid #DDC9B4;
}
.cocoa-resumen-table thead th {
background: #624634;
color: #FFF8ED;
font-weight: 700;
font-size: 11px;
padding: 13px 16px;
text-align: left;
border-bottom: 3px solid #D4A66C;
border-right: 1px solid #82614B;
}
.cocoa-resumen-table tbody td {
color: #514237;
padding: 12px 15px;
border-bottom: 1px solid #EAD9C7;
}
.cocoa-resumen-table tbody tr:nth-child(odd) td {
background: #FFFCF7;
}
.cocoa-resumen-table tbody tr:nth-child(even) td {
background: #F5EADF;
}
.cocoa-resumen-table tbody tr:hover td {
background: #EBD3BD;
}
.cocoa-resumen-table tbody td:first-child {
width: 42%;
font-weight: 700;
color: #985E40;
border-left: 3px solid #D2A06F;
}
.cocoa-resumen-table tbody td:nth-child(2) {
color: #74563E;
font-weight: 600;
}
.cocoa-resumen .cocoa-dataset-source {
background: #F4E8D9;
border-left: 3px solid #C59665;
padding: 12px 15px;
margin-top: 19px;
border-radius: 0 7px 7px 0;
font-size: 11px;
color: #755942;
}
'
filas_resumen <- lapply(
seq_len(nrow(resumen_base)),
function(i) {
htmltools::tags$tr(
htmltools::tags$td(resumen_base$Caracteristica[i]),
htmltools::tags$td(resumen_base$Resultado[i])
)
}
)
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(estilo_resumen)
),
htmltools::tags$div(
class = "cocoa-resumen",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"02 / Metodología · Banco Mundial 2022"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Resumen de la base de datos"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"9 características generales · 144 países · 16 indicadores"
)
),
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
htmltools::tags$th("Característica"),
htmltools::tags$th("Resultado")
)
),
htmltools::tags$tbody(filas_resumen)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$strong("Fuente: "),
"Elaboración propia con base en World Development Indicators (Banco Mundial), 2022."
)
)
)
)
| Característica | Resultado |
|---|---|
| Fuente de información | World Development Indicators (Banco Mundial) |
| Período de estudio | 2022 |
| Unidad de análisis | País |
| Países seleccionados | 144 |
| Indicadores cuantitativos | 16 |
| Dimensiones de análisis | 5 |
| Valores faltantes | 0 |
| Variables de identificación | Nombre y código del país |
| Técnicas de modelación | ACP y agrupamiento jerárquico de Ward |
Con el proceso de depuración finalizado, se obtuvo la base de datos que se utilizará en el desarrollo del modelo. La Tabla 3 presenta los 144 países seleccionados y sus respectivos valores para los 16 indicadores de desarrollo correspondientes al año 2022. Esta información constituye la base para el análisis descriptivo y la posterior aplicación de las técnicas de aprendizaje no supervisado.
library(DT)
library(dplyr)
library(htmltools)
base_final <- read.csv2(
"base_depurada_2022.csv",
stringsAsFactors = FALSE,
check.names = FALSE
)
tabla_modelo <- base_final %>%
select(
Pais, Codigo_pais,
PIB_per_capita, Crecimiento_PIB, Inflacion,
Comercio_internacional, Agricultura_PIB,
Esperanza_vida, Mortalidad_infantil, Acceso_agua,
Acceso_electricidad, Usuarios_internet,
Superficie_agricola, Superficie_forestal, Areas_protegidas,
Fecundidad, Poblacion_urbana, Crecimiento_poblacional
)
tabla_modelo$Pais <- dplyr::coalesce(
tryCatch(suppressWarnings(countrycode::countrycode(tabla_modelo$Codigo_pais, "iso3c", "cldr.short.es")),
error = function(e) rep(NA_character_, nrow(tabla_modelo))),
tabla_modelo$Pais
)
nombres_columnas <- c(
"País", "Código", "PIB per cápita",
"Crecimiento PIB", "Inflación",
"Comercio internacional", "Agricultura (% PIB)",
"Esperanza de vida", "Mortalidad infantil",
"Acceso a agua", "Acceso a electricidad",
"Usuarios de internet", "Superficie agrícola",
"Superficie forestal", "Áreas protegidas",
"Fecundidad", "Población urbana",
"Crecimiento poblacional"
)
estilo_tabla <- '
<style>
.cocoa-dataset {
font-family: "Satoshi", Arial, sans-serif;
background: #FFFCF7;
border: 1px solid #DCC8B2;
border-radius: 16px;
padding: 22px;
margin: 25px 0;
box-shadow: 0 8px 26px rgba(91,58,40,.09);
}
.cocoa-dataset-head {
background: linear-gradient(110deg,#493429,#72503D,#997051);
border-radius: 11px;
padding: 22px 25px;
margin-bottom: 20px;
border-bottom: 3px solid #D8AF70;
}
.cocoa-dataset-label {
font-size: 10px;
letter-spacing: 2px;
text-transform: uppercase;
font-weight: 700;
color: #E7C18B;
margin-bottom: 7px;
}
.cocoa-dataset-title {
font-family: "Fraunces", Georgia, serif;
font-size: 24px;
font-weight: 500;
color: #FFF9F0;
margin-bottom: 6px;
}
.cocoa-dataset-subtitle {
color: #F1DFCC;
font-size: 12px;
}
.cocoa-dataset .dt-buttons {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 17px;
}
.cocoa-dataset .dt-button {
background: #E9D3B5 !important;
background-image: none !important;
color: #62442F !important;
border: 1px solid #D5B28A !important;
border-radius: 7px !important;
padding: 8px 14px !important;
font-size: 11px !important;
font-weight: 700 !important;
box-shadow: none !important;
margin: 0 !important;
}
.cocoa-dataset .dt-button:hover {
background: #C99067 !important;
background-image: none !important;
color: #FFFFFF !important;
border-color: #B67A52 !important;
}
.cocoa-dataset .dataTables_filter input {
background: #FFFFFF;
border: 1px solid #CFAE8D;
border-radius: 7px;
padding: 8px 12px;
color: #493429;
outline: none;
}
.cocoa-dataset .dataTables_filter input:focus {
border-color: #B57D50;
box-shadow: 0 0 0 3px rgba(181,125,80,.12);
}
.cocoa-dataset .dataTables_length,
.cocoa-dataset .dataTables_filter,
.cocoa-dataset .dataTables_info,
.cocoa-dataset .dataTables_paginate {
font-size: 11px;
color: #80634E;
}
.cocoa-dataset .dataTables_length select {
background: #FFF9F0;
border: 1px solid #D9BDA0;
border-radius: 6px;
padding: 6px;
color: #62442F;
}
.cocoa-dataset table.dataTable {
width: 100% !important;
border-collapse: collapse !important;
font-size: 11.5px;
border: 1px solid #DDC9B4;
}
.cocoa-dataset table.dataTable thead th {
background: #624634 !important;
color: #FFF8ED !important;
font-weight: 700;
font-size: 11px;
padding: 13px 16px !important;
border-bottom: 3px solid #D4A66C !important;
border-right: 1px solid #82614B;
white-space: nowrap;
}
.cocoa-dataset table.dataTable tbody td {
color: #514237;
padding: 11px 15px !important;
border-bottom: 1px solid #EAD9C7;
white-space: nowrap;
}
.cocoa-dataset table.dataTable tbody tr:nth-child(odd) td {
background: #FFFCF7 !important;
}
.cocoa-dataset table.dataTable tbody tr:nth-child(even) td {
background: #F5EADF !important;
}
.cocoa-dataset table.dataTable tbody tr:hover td {
background: #EBD3BD !important;
}
.cocoa-dataset table.dataTable tbody td:first-child {
font-weight: 700;
color: #985E40;
border-left: 3px solid #D2A06F;
}
.cocoa-dataset table.dataTable tbody td:nth-child(2) {
color: #A07855;
font-weight: 600;
}
.cocoa-dataset .dataTables_paginate .paginate_button.current,
.cocoa-dataset .dataTables_paginate .paginate_button.current:hover {
background: #B9845E !important;
background-image: none !important;
color: #FFFFFF !important;
border: 1px solid #B9845E !important;
border-radius: 6px;
}
.cocoa-dataset .dataTables_paginate .paginate_button:hover {
background: #EAD3BC !important;
background-image: none !important;
color: #493429 !important;
border: 1px solid #D5B28A !important;
border-radius: 6px;
}
.cocoa-dataset .dataTables_scrollBody {
border-bottom: 1px solid #DDC9B4 !important;
}
.cocoa-dataset-source {
background: #F4E8D9;
border-left: 3px solid #C59665;
padding: 12px 15px;
margin-top: 19px;
border-radius: 0 7px 7px 0;
font-size: 11px;
color: #755942;
}
</style>
'
tabla_interactiva <- datatable(
tabla_modelo,
extensions = c("Buttons", "Scroller"),
rownames = FALSE,
colnames = nombres_columnas,
class = "display compact hover nowrap",
options = list(
dom = "Bflrtip",
buttons = list(
list(extend = "copy", text = "Copiar"),
list(extend = "csv", text = "CSV"),
list(extend = "excel", text = "Excel"),
list(extend = "pdf", text = "PDF"),
list(extend = "print", text = "Imprimir")
),
pageLength = 10,
lengthMenu = list(
c(10, 20, 50, -1),
c("10", "20", "50", "Todos")
),
scrollX = TRUE,
scrollY = "430px",
scroller = TRUE,
deferRender = TRUE,
autoWidth = FALSE,
language = list(
search = "Buscar país:",
lengthMenu = "Mostrar _MENU_ registros",
info = "Mostrando _START_ a _END_ de _TOTAL_ países",
infoEmpty = "Sin registros",
zeroRecords = "No se encontraron resultados",
paginate = list(
previous = "Anterior",
`next` = "Siguiente"
)
)
)
) %>%
formatRound(
columns = names(tabla_modelo)[
sapply(tabla_modelo, is.numeric)
],
digits = 2,
mark = ".",
dec.mark = ","
)
browsable(
tagList(
HTML(estilo_tabla),
tags$div(
class = "cocoa-dataset",
tags$div(
class = "cocoa-dataset-head",
tags$div(
class = "cocoa-dataset-label",
"03 / Metodología · Banco Mundial 2022"
),
tags$div(
class = "cocoa-dataset-title",
"Base de datos depurada"
),
tags$div(
class = "cocoa-dataset-subtitle",
paste0(
nrow(tabla_modelo),
" países · 16 indicadores · 5 dimensiones"
)
)
),
tabla_interactiva,
tags$div(
class = "cocoa-dataset-source",
tags$b("Fuente: "),
"elaboración propia con base en World Development Indicators (Banco Mundial), 2022."
)
)
)
)
Para construir la base final del estudio, se realizó un proceso de depuración que permitió seleccionar las observaciones adecuadas para el análisis. Durante este procedimiento se excluyeron agregados regionales y económicos, territorios fuera del alcance del estudio y países con información incompleta en alguno de los 16 indicadores.
Con el propósito de presentar este proceso de manera transparente, se identificaron las observaciones excluidas y sus respectivos motivos, como se muestra en la Tabla 4. De las 217 observaciones iniciales, se excluyeron 73, obteniendo una muestra final de 144 países para la aplicación del modelo.
library(dplyr)
library(DT)
library(htmltools)
codigos_territorios <- c(
"ABW", "ASM", "BMU", "VGB", "CYM", "CHI",
"CUW", "FRO", "PYF", "GIB", "GRL", "GUM",
"HKG", "IMN", "MAC", "NCL", "MNP", "PRI",
"SXM", "MAF", "TCA", "VIR", "PSE", "XKX"
)
tabla_excluidos <- base_organizada %>%
filter(!(`Country Code` %in% base_final$Codigo_pais)) %>%
mutate(
Faltantes = rowSums(
is.na(select(., all_of(indicadores_codigo)))
),
Motivo = case_when(
`Country Code` %in% codigos_territorios ~
"Territorio excluido del estudio",
Faltantes > 0 ~
"Información incompleta",
TRUE ~
"Requiere verificar criterio de exclusión"
)
) %>%
transmute(
`País o territorio` = `Country Name`,
`Código` = `Country Code`,
`Indicadores faltantes` = Faltantes,
`Motivo de exclusión` = Motivo
) %>%
arrange(`Motivo de exclusión`, `País o territorio`)
estilo_excluidos <- '
<style>
.cocoa-excluidos {
background: #FFFCF7;
border: 1px solid #DCC8B2;
border-radius: 16px;
padding: 22px;
margin: 25px 0;
font-family: "Satoshi", Arial, sans-serif;
box-shadow: 0 8px 26px rgba(91,58,40,.08);
}
.cocoa-excluidos-head {
background: linear-gradient(110deg,#493429,#72503D,#997051);
padding: 22px 25px;
border-radius: 11px;
border-bottom: 3px solid #D8AF70;
margin-bottom: 20px;
}
.cocoa-excluidos-title {
font-family: "Fraunces", Georgia, serif;
color: #FFF9F0;
font-size: 23px;
}
.cocoa-excluidos-sub {
color: #F1DFCC;
font-size: 12px;
margin-top: 6px;
}
.cocoa-excluidos table.dataTable thead th {
background: #624634 !important;
color: #FFF8ED !important;
border-bottom: 3px solid #D4A66C !important;
padding: 12px !important;
}
.cocoa-excluidos table.dataTable tbody td {
color: #514237;
padding: 11px !important;
}
.cocoa-excluidos table.dataTable tbody tr:nth-child(even) td {
background: #F5EADF !important;
}
.cocoa-excluidos table.dataTable tbody tr:hover td {
background: #EBD3BD !important;
}
.cocoa-excluidos .dataTables_filter input {
border: 1px solid #CFAE8D;
border-radius: 7px;
padding: 7px 11px;
}
.cocoa-excluidos .dataTables_info,
.cocoa-excluidos .dataTables_paginate,
.cocoa-excluidos .dataTables_filter {
color: #80634E;
font-size: 12px;
}
.cocoa-excluidos-fuente {
background: #F4E8D9;
padding: 12px 15px;
margin-top: 18px;
border-left: 3px solid #C59665;
font-size: 11px;
color: #755942;
}
</style>
'
tabla_interactiva_excluidos <- datatable(
tabla_excluidos,
rownames = FALSE,
options = list(
pageLength = 10,
scrollX = TRUE,
dom = "frtip",
language = list(
search = "Buscar país:",
info = "Mostrando _START_ a _END_ de _TOTAL_ observaciones",
zeroRecords = "No se encontraron resultados",
paginate = list(
previous = "Anterior",
`next` = "Siguiente"
)
)
)
)
browsable(
tagList(
HTML(estilo_excluidos),
tags$div(
class = "cocoa-excluidos",
tags$div(
class = "cocoa-excluidos-head",
tags$div(
class = "cocoa-excluidos-title",
"Observaciones excluidas"
),
tags$div(
class = "cocoa-excluidos-sub",
paste0(
nrow(tabla_excluidos),
" observaciones no incluidas en la base final"
)
)
),
tabla_interactiva_excluidos,
tags$div(
class = "cocoa-excluidos-fuente",
tags$b("Fuente: "),
"elaboración propia con base en World Development Indicators (Banco Mundial), 2022."
)
)
)
)
Tratamiento de República Centroafricana. Este país reporta en 2022 una esperanza de vida de 18,8 años y una mortalidad infantil de 206,8 por cada 1.000 nacidos vivos, valores muy alejados del resto de la muestra. Además, su serie de esperanza de vida en el Banco Mundial es inestable (52,3 años en 2018, 31,5 en 2019, 50,6 en 2020, 40,3 en 2021 y 57,4 en 2023), lo que sugiere un problema de estimación en la fuente. Aun así, se decidió conservarlo porque, con cuatro clusters, se integra al grupo de bajo desarrollo y no forma un grupo propio. No obstante, sus valores de esperanza de vida y mortalidad infantil son inconsistentes e influyen en el CP1 y en las estadísticas descriptivas. Por ello se contrastan los resultados con un análisis sin este país, en el que el 86,0 % de los países conserva su grupo. El análisis de sensibilidad de la sección 4.2.1 compara los resultados con y sin este país.
Antes de aplicar el Análisis de Componentes Principales (ACP), se prepararon los 16 indicadores correspondientes a los 144 países seleccionados. Este procedimiento permitió reducir la influencia de valores extremos y facilitar la comparación entre variables expresadas en diferentes unidades de medida.
Se aplicó la transformación logarítmica \(\ln(1+x)\) al PIB per cápita y al comercio internacional, mientras que para la inflación se utilizó la función seno hiperbólico inverso, que admite valores positivos y negativos. Adicionalmente, se aplicó winsorización en los percentiles 1 y 99 al crecimiento del PIB y al crecimiento poblacional, limitando la influencia de valores extremos sin eliminar observaciones.
Posteriormente, las variables se estandarizaron mediante:
\[ Z_{ij}=\frac{X_{ij}-\bar X_j}{s_j} \]
Donde:
La estandarización se realiza durante la ejecución del ACP,
utilizando los argumentos center = TRUE y
scale. = TRUE de la función prcomp(). De esta
manera, se evita que las diferencias de escala entre indicadores dominen
el análisis.(Husson, Lê y Pagès, 2017)
library(dplyr)
library(htmltools)
datos_acp <- base_final %>%
select(-Pais, -Codigo_pais)
datos_acp <- datos_acp %>%
mutate(
PIB_per_capita = log1p(PIB_per_capita),
Comercio_internacional = log1p(Comercio_internacional),
Inflacion = asinh(Inflacion)
)
winsorizar <- function(x) {
limites <- quantile(x, c(0.01, 0.99), na.rm = TRUE)
pmin(pmax(x, limites[1]), limites[2])
}
datos_acp <- datos_acp %>%
mutate(
Crecimiento_PIB = winsorizar(Crecimiento_PIB),
Crecimiento_poblacional = winsorizar(Crecimiento_poblacional)
)
paises_preparados <- nrow(datos_acp)
indicadores_preparados <- ncol(datos_acp)
valores_faltantes <- sum(is.na(datos_acp))
tarjeta_preparacion <- tags$div(
style = "
background:#FFFCF7;
border:1px solid #E4D4C2;
border-radius:18px;
padding:28px;
margin:25px 0;
font-family:'Satoshi',Arial,sans-serif;
box-shadow:0 8px 28px rgba(91,58,40,0.08);
",
tags$div(
style = "
font-family:'Fraunces',Georgia,serif;
font-size:24px;
font-weight:600;
color:#51382C;
margin-bottom:8px;
",
"Resumen de la Preparación de Datos"
),
tags$p(
style = "
color:#937661;
font-size:13px;
margin-bottom:24px;
",
"Indicadores preparados para el Análisis de Componentes Principales"
),
tags$div(
style = "
display:flex;
flex-wrap:wrap;
gap:15px;
",
tags$div(
style = "
flex:1;
min-width:150px;
background:#F5EADF;
border:1px solid #E9D8C5;
border-radius:13px;
padding:24px 15px;
text-align:center;
",
tags$div(
style = "
font-size:36px;
font-weight:700;
color:#684634;
margin-bottom:8px;
",
paises_preparados
),
tags$div(
style = "
font-size:12px;
color:#806653;
",
"Países preparados"
)
),
tags$div(
style = "
flex:1;
min-width:150px;
background:#F5EADF;
border:1px solid #E9D8C5;
border-radius:13px;
padding:24px 15px;
text-align:center;
",
tags$div(
style = "
font-size:36px;
font-weight:700;
color:#684634;
margin-bottom:8px;
",
indicadores_preparados
),
tags$div(
style = "
font-size:12px;
color:#806653;
",
"Indicadores preparados"
)
),
tags$div(
style = "
flex:1;
min-width:150px;
background:#F5EADF;
border:1px solid #E9D8C5;
border-radius:13px;
padding:24px 15px;
text-align:center;
",
tags$div(
style = "
font-size:36px;
font-weight:700;
color:#B77A4D;
margin-bottom:8px;
",
valores_faltantes
),
tags$div(
style = "
font-size:12px;
color:#806653;
",
"Valores faltantes"
)
)
),
tags$div(
style = "
margin-top:22px;
padding-top:14px;
border-top:1px solid #E4D4C2;
font-size:11px;
color:#92745F;
",
"Fuente: elaboración propia con datos de World Development Indicators (Banco Mundial), 2022."
)
)
browsable(tarjeta_preparacion)
Indicadores preparados para el Análisis de Componentes Principales
Se aplicó el Análisis de Componentes Principales (ACP) para reducir la dimensionalidad de los 16 indicadores y sintetizar la información en un número menor de componentes que conservaran una proporción importante de la variabilidad original.
El ACP construye nuevas variables, denominadas componentes principales, mediante combinaciones lineales de los indicadores estandarizados. Estas componentes son ortogonales entre sí y se ordenan según la cantidad de varianza que explican. (Jolliffe y Cadima, 2016)
Matemáticamente, cada componente principal se expresa como:
\[ CP_k=a_{1k}Z_1+a_{2k}Z_2+\cdots+a_{16k}Z_{16} \]
Donde:
El modelo se estimó mediante la función prcomp() de R,
utilizando centrado y escalamiento de las variables. Posteriormente, se
calculó el porcentaje de varianza explicada y acumulada por cada
componente, con el fin de determinar cuántas componentes conservar para
el agrupamiento jerárquico.
library(dplyr)
library(htmltools)
modelo_acp <- prcomp(
datos_acp,
center = TRUE,
scale. = TRUE
)
varianza_acp <- modelo_acp$sdev^2
porcentaje_varianza <- 100 *
varianza_acp / sum(varianza_acp)
tabla_varianza <- data.frame(
Componente = paste0("CP", seq_along(porcentaje_varianza)),
Valor_propio = round(varianza_acp, 3),
Varianza_explicada = round(porcentaje_varianza, 2),
Varianza_acumulada = round(cumsum(porcentaje_varianza), 2)
)
paises <- nrow(modelo_acp$x)
componentes <- ncol(modelo_acp$x)
varianza_cuatro <- round(sum(porcentaje_varianza[1:4]), 2)
tarjeta_acp <- tags$div(
style = "
background:#FFFCF7;
border:1px solid #E4D4C2;
border-radius:18px;
padding:28px;
margin:25px 0;
font-family:'Satoshi',Arial,sans-serif;
box-shadow:0 8px 28px rgba(91,58,40,0.08);
",
tags$div(
style = "
font-family:'Fraunces',Georgia,serif;
font-size:24px;
font-weight:600;
color:#51382C;
margin-bottom:8px;
",
"Resumen del Análisis de Componentes Principales"
),
tags$p(
style = "
color:#937661;
font-size:13px;
margin-bottom:24px;
",
"Modelo estimado con indicadores del Banco Mundial, 2022"
),
tags$div(
style = "
display:flex;
flex-wrap:wrap;
gap:15px;
",
tags$div(
style = "
flex:1;
min-width:150px;
background:#F5EADF;
border:1px solid #E9D8C5;
border-radius:13px;
padding:24px 15px;
text-align:center;
",
tags$div(
style = "
font-size:36px;
font-weight:700;
color:#684634;
margin-bottom:8px;
",
paises
),
tags$div(
style = "
font-size:12px;
color:#806653;
",
"Países analizados"
)
),
tags$div(
style = "
flex:1;
min-width:150px;
background:#F5EADF;
border:1px solid #E9D8C5;
border-radius:13px;
padding:24px 15px;
text-align:center;
",
tags$div(
style = "
font-size:36px;
font-weight:700;
color:#684634;
margin-bottom:8px;
",
componentes
),
tags$div(
style = "
font-size:12px;
color:#806653;
",
"Componentes calculadas"
)
),
tags$div(
style = "
flex:1;
min-width:150px;
background:#F5EADF;
border:1px solid #E9D8C5;
border-radius:13px;
padding:24px 15px;
text-align:center;
",
tags$div(
style = "
font-size:36px;
font-weight:700;
color:#B77A4D;
margin-bottom:8px;
",
paste0(
format(varianza_cuatro, decimal.mark=","),
"%"
)
),
tags$div(
style = "
font-size:12px;
color:#806653;
",
"Varianza explicada por CP1–CP4"
)
)
),
tags$div(
style = "
margin-top:22px;
padding-top:14px;
border-top:1px solid #E4D4C2;
font-size:11px;
color:#92745F;
",
"Fuente: elaboración propia con datos de World Development Indicators (Banco Mundial), 2022."
)
)
browsable(tarjeta_acp)
Modelo estimado con indicadores del Banco Mundial, 2022
Una vez realizado el Análisis de Componentes Principales, se seleccionaron las primeras cuatro componentes para representar a los países en un espacio de menor dimensionalidad. Estas componentes permiten conservar una proporción importante de la variabilidad de los 16 indicadores originales.
Para cuantificar la similitud entre países, se calculó la distancia euclidiana utilizando las puntuaciones obtenidas en las cuatro componentes seleccionadas.
La distancia entre dos países \(i\) y \(j\) se define como:
\[ d(i,j)=\sqrt{\sum_{k=1}^{4}(CP_{ik}-CP_{jk})^2} \]
Donde:
Una distancia menor indica que dos países presentan características más similares en el espacio de componentes principales, mientras que una distancia mayor refleja diferencias más pronunciadas.
La matriz de distancias obtenida constituye la base para aplicar posteriormente el método de agrupamiento jerárquico de Ward.
library(htmltools)
datos_ward <- as.data.frame(modelo_acp$x[, 1:4])
rownames(datos_ward) <- base_final$Codigo_pais
distancias_ward <- dist(
datos_ward,
method = "euclidean"
)
numero_paises <- nrow(datos_ward)
numero_componentes <- ncol(datos_ward)
numero_distancias <- length(distancias_ward)
crear_indicador <- function(valor, etiqueta) {
tags$div(
style = "
flex:1;
min-width:150px;
background:#F5EADF;
border:1px solid #E9D8C5;
border-radius:13px;
padding:24px 15px;
text-align:center;
",
tags$div(
style = "
font-size:36px;
font-weight:700;
color:#684634;
margin-bottom:8px;
",
valor
),
tags$div(
style = "
font-size:12px;
color:#806653;
",
etiqueta
)
)
}
tarjeta_distancias <- tags$div(
style = "
background:#FFFCF7;
border:1px solid #E4D4C2;
border-radius:18px;
padding:28px;
margin:25px 0;
font-family:'Satoshi',Arial,sans-serif;
box-shadow:0 8px 28px rgba(91,58,40,0.08);
",
tags$div(
style = "
font-family:'Fraunces',Georgia,serif;
font-size:24px;
font-weight:600;
color:#51382C;
margin-bottom:8px;
",
"Resumen del Cálculo de Distancias"
),
tags$p(
style = "
color:#937661;
font-size:13px;
margin-bottom:24px;
",
"Distancias euclidianas calculadas sobre las primeras cuatro componentes principales"
),
tags$div(
style = "
display:flex;
flex-wrap:wrap;
gap:15px;
",
crear_indicador(numero_paises, "Países analizados"),
crear_indicador(numero_componentes, "Componentes utilizadas"),
crear_indicador(
format(numero_distancias, big.mark=".", scientific=FALSE),
"Distancias entre pares de países"
)
),
tags$div(
style = "
margin-top:22px;
padding-top:14px;
border-top:1px solid #E4D4C2;
font-size:11px;
color:#92745F;
",
"Fuente: elaboración propia con datos de World Development Indicators (Banco Mundial), 2022."
)
)
browsable(tarjeta_distancias)
Distancias euclidianas calculadas sobre las primeras cuatro componentes principales
Para identificar grupos de países con características similares, se aplicó el método de agrupamiento jerárquico aglomerativo de Ward, utilizando las distancias euclidianas calculadas a partir de las primeras cuatro componentes principales.
Este procedimiento comienza considerando cada país como un conglomerado independiente. Posteriormente, fusiona progresivamente los grupos cuya unión genera el menor incremento en la variabilidad interna, hasta construir una estructura jerárquica representada mediante un dendrograma. (Ward, 1963)
El criterio de Ward busca minimizar el incremento de la suma de cuadrados dentro de los conglomerados:
\[ \Delta(A,B)=\frac{n_A n_B}{n_A+n_B} \left\|\bar{x}_A-\bar{x}_B\right\|^2 \]
Donde:
El modelo se construyó mediante la función hclust() de
R, utilizando el método ward.D2. Para evaluar distintas
alternativas de agrupamiento, se calculó el coeficiente promedio de
silueta para valores de \(k\) entre 2 y
10.
Finalmente, se seleccionó una solución de cuatro conglomerados para facilitar la caracterización e interpretación de los diferentes perfiles de países. Esta selección se evaluará considerando tanto la separación entre grupos como su utilidad para el análisis.
library(cluster)
library(htmltools)
modelo_ward <- hclust(
distancias_ward,
method = "ward.D2"
)
valores_k <- 2:10
siluetas <- sapply(valores_k, function(k) {
grupos <- cutree(modelo_ward, k = k)
mean(silhouette(grupos, distancias_ward)[, "sil_width"])
})
tabla_silueta <- data.frame(
Clusters = valores_k,
Silueta_promedio = round(siluetas, 4)
)
k_optimo <- 4
grupos_ward <- cutree(modelo_ward, k = k_optimo)
base_clusters <- base_final %>%
mutate(
Cluster = grupos_ward[Codigo_pais]
)
numero_clusters <- length(unique(base_clusters$Cluster))
numero_paises <- nrow(base_clusters)
silueta_cuatro <- round(
siluetas[valores_k == k_optimo], 4
)
crear_indicador_ward <- function(valor, etiqueta) {
tags$div(
style = "
flex:1;
min-width:150px;
background:#F5EADF;
border:1px solid #E9D8C5;
border-radius:13px;
padding:24px 15px;
text-align:center;
",
tags$div(
style = "
font-size:36px;
font-weight:700;
color:#684634;
margin-bottom:8px;
",
valor
),
tags$div(
style = "
font-size:12px;
color:#806653;
",
etiqueta
)
)
}
tarjeta_ward <- tags$div(
style = "
background:#FFFCF7;
border:1px solid #E4D4C2;
border-radius:18px;
padding:28px;
margin:25px 0;
font-family:'Satoshi',Arial,sans-serif;
box-shadow:0 8px 28px rgba(91,58,40,0.08);
",
tags$div(
style = "
font-family:'Fraunces',Georgia,serif;
font-size:24px;
font-weight:600;
color:#51382C;
margin-bottom:8px;
",
"Resumen del Agrupamiento Jerárquico de Ward"
),
tags$p(
style = "
color:#937661;
font-size:13px;
margin-bottom:24px;
",
"Clasificación de países mediante el método Ward"
),
tags$div(
style = "
display:flex;
flex-wrap:wrap;
gap:15px;
",
crear_indicador_ward(
numero_paises,
"Países clasificados"
),
crear_indicador_ward(
numero_clusters,
"Conglomerados seleccionados"
),
crear_indicador_ward(
format(silueta_cuatro, decimal.mark=","),
"Silueta promedio para k = 4"
)
),
tags$div(
style = "
margin-top:22px;
padding-top:14px;
border-top:1px solid #E4D4C2;
font-size:11px;
color:#92745F;
",
"Fuente: elaboración propia con datos de World Development Indicators (Banco Mundial), 2022."
)
)
browsable(tarjeta_ward)
Clasificación de países mediante el método Ward
Antes de aplicar el Análisis de Componentes Principales (ACP) y la clusterización jerárquica de Ward, fue necesario explorar cómo se distribuyen y se relacionan los indicadores seleccionados. El análisis descriptivo nos permite identificar relaciones preliminares, diferencias entre países y valores atípicos en cada dimensión posterior.
Los 16 indicadores del Banco Mundial para 2022 se examinarán en cuatro dimensiones, en donde cada enfoque nos mostrará que el desarrollo no es una variable única sino un fenómeno multifacético, es decir que un país puede destacar en un área y quedar rezagado en otra y eso es precisamente la complejidad que justifica un análisis multivariado integrado. Para facilitar la lectura, en esta sección las dimensiones de salud y bienestar y demográfica, descritas por separado en la metodología, se analizan conjuntamente como dimensión social y demográfica, ya que sus seis indicadores describen en conjunto las condiciones de vida y la etapa de la transición demográfica de cada país.
Para entender la economía de un país es insuficiente mirar un solo dato; es vital desglosarla en métricas.Por esa razón, tomamos al PIB per cápita, que aproxima el nivel de producción económica por habitante, ajustado por paridad de poder adquisitivo, el crecimiento del PIB nos revela las economías en expansión o contracción mediante la variación anual de la actividad económica; la inflación indica la estabilidad de los precios, el comercio internacional captura el grado de apertura e integración con los mercados globales y el valor agregado agrícola muestra el peso del sector primario en la estructura productiva. Estos cinco indicadores de manera conjunta, nos ofrecen una perspectiva más completa que cada uno por separado.
El explorador interactivo a continuación nos permite comparar cómo cambian los países en los extremos según cada indicador. Al seleccionar el menú desplegable, encontramos para cada variable el ranking de los 10 países con los valores más altos y los más bajos, también sus estadísticas globales y cuánto se desvía cada uno de la media mundial.Con esto podemos observar que quien lidera en una métrica no necesariamente lidera en otra.
explorador_tablas(dimensiones$economica)
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 27.515,62 |
| Mediana | 18.172,45 |
| Desv. estándar | 27.383,62 |
| Coef. de variación (%) | 99,52 |
| Mínimo | 1.136,80 |
| Percentil 10 | 2.884,65 |
| Q1 (percentil 25) | 6.332,51 |
| Q3 (percentil 75) | 41.584,30 |
| Percentil 90 | 62.585,40 |
| Máximo | 134.828,00 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Singapur | 134.828,00 | +390.0% |
| 2 | Luxemburgo | 132.570,83 | +381.8% |
| 3 | Irlanda | 123.007,48 | +347.0% |
| 4 | Catar | 114.740,12 | +317.0% |
| 5 | Noruega | 95.109,82 | +245.7% |
| 6 | Suiza | 85.762,28 | +211.7% |
| 7 | Brunéi | 76.357,83 | +177.5% |
| 8 | Países Bajos | 71.324,04 | +159.2% |
| 9 | Emiratos Árabes Unidos | 70.075,64 | +154.7% |
| 10 | Dinamarca | 69.089,47 | +151.1% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | República Centroafricana | 1.136,80 | -95.9% |
| 2 | Mozambique | 1.476,73 | -94.6% |
| 3 | Madagascar | 1.602,43 | -94.2% |
| 4 | Malaui | 1.659,96 | -94.0% |
| 5 | Níger | 1.724,90 | -93.7% |
| 6 | Afganistán | 1.981,71 | -92.8% |
| 7 | Islas Salomón | 2.330,40 | -91.5% |
| 8 | Chad | 2.449,48 | -91.1% |
| 9 | Burkina Faso | 2.469,20 | -91.0% |
| 10 | Lesoto | 2.577,55 | -90.6% |
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 4,18 |
| Mediana | 4,36 |
| Desv. estándar | 4,76 |
| Coef. de variación (%) | 113,86 |
| Mínimo | -28,76 |
| Percentil 10 | -0,33 |
| Q1 (percentil 25) | 2,69 |
| Q3 (percentil 75) | 6,26 |
| Percentil 90 | 8,53 |
| Máximo | 17,75 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Fiyi | 17,75 | +324.6% |
| 2 | Cabo Verde | 15,84 | +279.1% |
| 3 | Maldivas | 13,83 | +230.8% |
| 4 | Armenia | 12,60 | +201.5% |
| 5 | Níger | 12,22 | +192.4% |
| 6 | Arabia Saudí | 12,00 | +187.1% |
| 7 | Panamá | 11,04 | +164.1% |
| 8 | Georgia | 10,96 | +162.2% |
| 9 | Ruanda | 9,82 | +135.1% |
| 10 | Belice | 9,25 | +121.3% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Ucrania | -28,76 | -788.1% |
| 2 | Libia | -8,30 | -298.6% |
| 3 | Sri Lanka | -7,35 | -275.8% |
| 4 | Afganistán | -6,24 | -249.3% |
| 5 | Bielorrusia | -4,66 | -211.5% |
| 6 | Moldavia | -4,65 | -211.2% |
| 7 | Islas Salomón | -2,58 | -161.8% |
| 8 | Tonga | -2,13 | -150.9% |
| 9 | Haití | -1,68 | -140.2% |
| 10 | Brunéi | -1,63 | -139.0% |
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 12,32 |
| Mediana | 8,29 |
| Desv. estándar | 17,88 |
| Coef. de variación (%) | 145,19 |
| Mínimo | 1,35 |
| Percentil 10 | 4,05 |
| Q1 (percentil 25) | 6,01 |
| Q3 (percentil 75) | 12,59 |
| Percentil 90 | 18,98 |
| Máximo | 171,21 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Líbano | 171,21 | +1290.1% |
| 2 | Zimbabue | 104,71 | +750.2% |
| 3 | Turquía | 72,31 | +487.1% |
| 4 | Sri Lanka | 49,72 | +303.7% |
| 5 | Irán | 43,49 | +253.1% |
| 6 | Haití | 33,98 | +175.9% |
| 7 | Etiopía | 33,89 | +175.2% |
| 8 | Ghana | 31,26 | +153.8% |
| 9 | Moldavia | 28,74 | +133.3% |
| 10 | Sierra Leona | 27,21 | +120.9% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Benín | 1,35 | -89.0% |
| 2 | Bolivia | 1,75 | -85.8% |
| 3 | China | 1,97 | -84.0% |
| 4 | Maldivas | 2,33 | -81.1% |
| 5 | Japón | 2,50 | -79.7% |
| 6 | Omán | 2,51 | -79.7% |
| 7 | Arabia Saudí | 2,54 | -79.3% |
| 8 | Suiza | 2,84 | -77.0% |
| 9 | Panamá | 2,86 | -76.8% |
| 10 | Vietnam | 3,16 | -74.4% |
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 98,94 |
| Mediana | 86,53 |
| Desv. estándar | 59,32 |
| Coef. de variación (%) | 59,96 |
| Mínimo | 26,60 |
| Percentil 10 | 44,48 |
| Q1 (percentil 25) | 57,16 |
| Q3 (percentil 75) | 124,04 |
| Percentil 90 | 173,12 |
| Máximo | 412,18 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Luxemburgo | 412,18 | +316.6% |
| 2 | Singapur | 330,25 | +233.8% |
| 3 | Yibuti | 302,29 | +205.5% |
| 4 | Malta | 244,58 | +147.2% |
| 5 | Irlanda | 237,76 | +140.3% |
| 6 | Chipre | 205,75 | +108.0% |
| 7 | Eslovaquia | 204,06 | +106.2% |
| 8 | Bélgica | 191,05 | +93.1% |
| 9 | Eslovenia | 186,65 | +88.7% |
| 10 | Emiratos Árabes Unidos | 185,74 | +87.7% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Etiopía | 26,60 | -73.1% |
| 2 | Haití | 29,77 | -69.9% |
| 3 | Bangladés | 33,78 | -65.9% |
| 4 | Uganda | 34,51 | -65.1% |
| 5 | Tanzania | 35,00 | -64.6% |
| 6 | Egipto | 36,98 | -62.6% |
| 7 | Níger | 37,15 | -62.5% |
| 8 | China | 37,51 | -62.1% |
| 9 | Brasil | 38,82 | -60.8% |
| 10 | Kenia | 40,28 | -59.3% |
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 10,21 |
| Mediana | 6,57 |
| Desv. estándar | 10,21 |
| Coef. de variación (%) | 100,08 |
| Mínimo | 0,03 |
| Percentil 10 | 1,18 |
| Q1 (percentil 25) | 2,23 |
| Q3 (percentil 75) | 16,54 |
| Percentil 90 | 25,22 |
| Máximo | 41,46 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Níger | 41,46 | +306.2% |
| 2 | Guinea-Bisáu | 39,67 | +288.7% |
| 3 | Etiopía | 37,64 | +268.9% |
| 4 | República Centroafricana | 36,22 | +254.9% |
| 5 | Chad | 35,23 | +245.2% |
| 6 | Comoras | 35,16 | +244.6% |
| 7 | Sierra Leona | 33,76 | +230.8% |
| 8 | Afganistán | 33,70 | +230.2% |
| 9 | Mali | 32,72 | +220.6% |
| 10 | Islas Salomón | 31,97 | +213.3% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Singapur | 0,03 | -99.7% |
| 2 | Luxemburgo | 0,24 | -97.6% |
| 3 | Baréin | 0,25 | -97.6% |
| 4 | Catar | 0,26 | -97.5% |
| 5 | Kuwait | 0,40 | -96.1% |
| 6 | Suiza | 0,60 | -94.1% |
| 7 | Bélgica | 0,67 | -93.4% |
| 8 | RU | 0,68 | -93.3% |
| 9 | Emiratos Árabes Unidos | 0,74 | -92.7% |
| 10 | Malta | 0,83 | -91.8% |
fig_ranking(dimensiones$economica)
El ranking de las variables de dimensión económica muestra los 10 países con los valores más altos en cada indicador. Este análisis nos manifestó que quienes lideran en una métrica no necesariamente mantienen posiciones similares en otras. Por ejemplo, Singapur encabeza el PIB per cápita, mientras que en el crecimiento económico destaca Fiyi; Líbano sobresale en inflación, Luxemburgo en apertura comercial y Níger en el peso de la agricultura dentro de la economía.
Las economías de ingreso alto, como Singapur, Luxemburgo, Irlanda, Catar y Noruega, dominan el PIB per cápita, pero en crecimiento,inflación o peso agrícola surgen países de otras regiones y de niveles de ingreso mucho más bajos. Además, las magnitudes y dispersiones difieren entre variables, la inflación es más heterogénea, mientras que el comercio internacional es la más homogénea. Sugiriendo que cada indicador refleja un aspecto particular del desempeño ecónomico de una país.
fig_variabilidad(dimensiones$economica)
En los cinco indicadores económicos, la mayoría de los países se concentra cerca de la media o por debajo de ella, pero a la vez unos pocos se alejan mucho hacia arriba. En el PIB per cápita, la inflación y la agricultura se disparan hacia arriba en el final, lo que refleja el impacto de los valores atípicos que elevan el promedio. Las desviaciones más grandes se dan en la inflación con el Líbano (+1.290%) y en crecimiento económico con Ucrania (-788%), mientras que el comercio internacional es el indicador más homogéneo, con solo un 5% de países que se desvían más de un 100% de la media.
Colombia, se encuentra de un color distinto dentro de las graficas. La nación andina no se ubica en ningún extremo, está por debajo de la media en PIB per cápita con -33%, en comercio internacional con -51%, en inflación con -17% y peso agrícola con -14%; y solo supera la media en crecimiento del PIB (+75%). Esto nos sugiere que Colombia es un país de ingreso intermedio, relativamente cerrado al comercio y con crecimiento alto en 2022.
La dimensión tecnológica se analiza a partir de dos indicadores de infraestructura: el acceso a electricidad, que mide la cobertura de un servicio básico para la vida cotidiana y la producción, y los usuarios de internet, que reflejan el grado de conectividad digital de la población. Ambos se expresan como porcentaje de la población, por lo que su valor máximo posible es 100 %. Esto significa que, a diferencia de las variables económicas, aquí no hay países que se disparen hacia arriba: las diferencias están en qué tan lejos quedan los rezagados.
En la siguiente tabla se presentan, para cada indicador, las estadísticas globales, los 10 países con los valores más altos y los 10 con los valores más bajos, junto con su desviación porcentual respecto a la media y la posición de Colombia.
explorador_tablas(dimensiones$tecnologica)
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 87,34 |
| Mediana | 100,00 |
| Desv. estándar | 22,96 |
| Coef. de variación (%) | 26,28 |
| Mínimo | 11,70 |
| Percentil 10 | 49,09 |
| Q1 (percentil 25) | 86,20 |
| Q3 (percentil 75) | 100,00 |
| Percentil 90 | 100,00 |
| Máximo | 100,00 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Albania | 100,00 | +14.5% |
| 2 | Argelia | 100,00 | +14.5% |
| 3 | Antigua y Barbuda | 100,00 | +14.5% |
| 4 | Armenia | 100,00 | +14.5% |
| 5 | Australia | 100,00 | +14.5% |
| 6 | Austria | 100,00 | +14.5% |
| 7 | Azerbaiyán | 100,00 | +14.5% |
| 8 | Baréin | 100,00 | +14.5% |
| 9 | Bielorrusia | 100,00 | +14.5% |
| 10 | Bélgica | 100,00 | +14.5% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Chad | 11,70 | -86.6% |
| 2 | Malaui | 14,00 | -84.0% |
| 3 | República Centroafricana | 15,70 | -82.0% |
| 4 | Burkina Faso | 19,50 | -77.7% |
| 5 | Níger | 19,50 | -77.7% |
| 6 | Sierra Leona | 29,40 | -66.3% |
| 7 | Mozambique | 33,20 | -62.0% |
| 8 | Madagascar | 36,10 | -58.7% |
| 9 | Guinea-Bisáu | 37,40 | -57.2% |
| 10 | Tanzania | 45,80 | -47.6% |
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 70,49 |
| Mediana | 79,80 |
| Desv. estándar | 25,41 |
| Coef. de variación (%) | 36,04 |
| Mínimo | 9,64 |
| Percentil 10 | 28,02 |
| Q1 (percentil 25) | 56,60 |
| Q3 (percentil 75) | 89,67 |
| Percentil 90 | 95,81 |
| Máximo | 100,00 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Baréin | 100,00 | +41.9% |
| 2 | Arabia Saudí | 100,00 | +41.9% |
| 3 | Emiratos Árabes Unidos | 100,00 | +41.9% |
| 4 | Kuwait | 99,75 | +41.5% |
| 5 | Noruega | 99,00 | +40.5% |
| 6 | Brunéi | 98,97 | +40.4% |
| 7 | Luxemburgo | 98,24 | +39.4% |
| 8 | Catar | 98,04 | +39.1% |
| 9 | Dinamarca | 97,86 | +38.8% |
| 10 | Islandia | 97,58 | +38.4% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Uganda | 9,64 | -86.3% |
| 2 | Chad | 11,17 | -84.2% |
| 3 | Níger | 13,09 | -81.4% |
| 4 | República Centroafricana | 13,75 | -80.5% |
| 5 | Zambia | 15,00 | -78.7% |
| 6 | Afganistán | 15,87 | -77.5% |
| 7 | Malaui | 16,85 | -76.1% |
| 8 | Madagascar | 17,81 | -74.7% |
| 9 | Etiopía | 17,98 | -74.5% |
| 10 | Mozambique | 18,96 | -73.1% |
La electricidad es el indicador con mayor concentración en el valor máximo: 88 de los 144 países (61 %) reportan una cobertura del 100 %, por lo que la mediana es 100 y la media (87,3 %) queda por debajo de ella. Por esta razón, el top 10 de valores más altos no establece un orden real entre países, ya que todos empatan en 100 %; lo relevante de esta variable está en la cola inferior. Allí, 16 países tienen menos de la mitad de su población con electricidad, todos de África subsahariana salvo Haití, con Chad (11,7 %), Malawi (14 %) y República Centroafricana (15,7 %) en los últimos lugares.
En internet la distribución es más dispersa (coeficiente de variación de 36 % frente a 26,3 % en electricidad). La media es 70,5 % y la mediana 79,8 %, lo que indica que la mayoría de países ya supera el 70 % de usuarios, pero un grupo rezagado baja el promedio. Los valores más altos los tienen los países del Golfo (Baréin, Arabia Saudita, Emiratos Árabes y Kuwait, cercanos al 100 %) junto con Noruega, Luxemburgo y Dinamarca, mientras que en el otro extremo Uganda (9,6 %), Chad (11,2 %) y Níger (13,1 %) no alcanzan siquiera el 15 %.
fig_histograma(dimensiones$tecnologica, color = "#B77A4D")
La distribución de los países en la dimensión tecnológica nos muestra que ambas variables están muy cerca del 100% pero con formas muy distintas.En usuarios de internet encontramos que 93 de los 144 países (64,6 %) superan el 70 % de población conectada, mientras que solo 22 países se encuentran entre el 80 % y el 85 %. Esto contrasta con países como Uganda, Chad y Níger, que presentan niveles considerablemente más bajos de conectividad. Adicionalmente, la mitad de los países tiene al menos un 79,8 % de su población conectada. En cuanto a acceso a electricidad, el 61% de los países tienen cobertura total, encontrando que solo que 16 países tienen menos de la mitad de su población conectada. Por eso, podemos afirmar que la electricidad es una barrera que la mayoría de los países ya superó, mientras que la conectividad digital todavía separa a unos países de otros.Es decir, la electricidad es una condición necesaria pero no suficiente para el acceso digital, que depende además del ingreso, el costo de los dispositivos y la infraestructura de telecomunicaciones.
fig_variabilidad(dimensiones$tecnologica)
En ambos indicadores la variabilidad es asimétrica hacia abajo: ningún país supera la media en más de +14,5 % en electricidad ni en más de +41,9 % en internet, mientras que los más rezagados se ubican por debajo del −80 %. En electricidad solo 9 países se alejan más de un 50 % por debajo de la media, y en internet son 21. Esto confirma que la brecha tecnológica no está en los líderes sino en un grupo concentrado de países de bajo ingreso, que coincide en gran parte con los que presentan alta mortalidad infantil y fecundidad. De hecho, ambos indicadores tienen correlaciones fuertes con el acceso al agua (0,91 y 0,89) y negativas con la fecundidad (−0,83 y −0,85), lo que anticipa que en el ACP esta dimensión se agrupará con las variables sociales en un mismo eje de desarrollo.
Colombia, marcada en naranja, tiene cobertura eléctrica total (100 %, +14,5 % sobre la media) y 72,8 % de usuarios de internet, apenas +3,3 % por encima de la media y por debajo de la mediana mundial (79,8 %). En internet ocupa el puesto 89 de 144 y queda por detrás de vecinos como Chile (92,3 %), Uruguay (89,9 %), Costa Rica (82,6 %) y Brasil (80,5 %). Esto sugiere que Colombia ya resolvió la cobertura eléctrica, pero en conectividad digital todavía está en un nivel intermedio, con una brecha de 27 puntos entre ambos indicadores.
La dimensión ambiental describe cómo se usa y se conserva el territorio de cada país mediante tres indicadores: la superficie agrícola, que mide la proporción del suelo destinada a cultivos y ganadería; la superficie forestal, que refleja la cobertura boscosa; y las áreas protegidas, que indican qué parte del territorio está bajo alguna figura legal de conservación. A diferencia de las demás dimensiones, aquí un valor alto no significa mayor o menor desarrollo, sino que depende en buena medida de la geografía y el clima de cada país, por lo que los rankings se deben leer como características del territorio y no como mejores o peores desempeños.
explorador_tablas(dimensiones$ambiental)
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 40,48 |
| Mediana | 41,55 |
| Desv. estándar | 21,97 |
| Coef. de variación (%) | 54,28 |
| Mínimo | 0,91 |
| Percentil 10 | 8,82 |
| Q1 (percentil 25) | 23,85 |
| Q3 (percentil 75) | 55,14 |
| Percentil 90 | 71,91 |
| Máximo | 92,85 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Lesoto | 92,85 | +129.4% |
| 2 | Uruguay | 87,64 | +116.5% |
| 3 | Côte d’Ivoire | 83,61 | +106.6% |
| 4 | Arabia Saudí | 80,79 | +99.6% |
| 5 | Uganda | 80,28 | +98.3% |
| 6 | Kazajistán | 79,60 | +96.7% |
| 7 | Sudáfrica | 79,42 | +96.2% |
| 8 | Comoras | 78,37 | +93.6% |
| 9 | Ruanda | 78,32 | +93.5% |
| 10 | Gambia | 75,20 | +85.8% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Singapur | 0,91 | -97.7% |
| 2 | Noruega | 2,70 | -93.3% |
| 3 | Brunéi | 2,90 | -92.8% |
| 4 | Islas Salomón | 3,97 | -90.2% |
| 5 | Egipto | 4,08 | -89.9% |
| 6 | Omán | 4,74 | -88.3% |
| 7 | Emiratos Árabes Unidos | 5,52 | -86.4% |
| 8 | Catar | 6,44 | -84.1% |
| 9 | Canadá | 6,49 | -84.0% |
| 10 | Gabón | 6,88 | -83.0% |
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 30,65 |
| Mediana | 30,35 |
| Desv. estándar | 22,25 |
| Coef. de variación (%) | 72,60 |
| Mínimo | 0,00 |
| Percentil 10 | 1,51 |
| Q1 (percentil 25) | 12,22 |
| Q3 (percentil 75) | 44,76 |
| Percentil 90 | 61,24 |
| Máximo | 91,49 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Gabón | 91,49 | +198.6% |
| 2 | Palaos | 90,63 | +195.7% |
| 3 | Islas Salomón | 89,89 | +193.3% |
| 4 | Guinea-Bisáu | 75,12 | +145.1% |
| 5 | Finlandia | 74,17 | +142.0% |
| 6 | República Centroafricana | 72,61 | +136.9% |
| 7 | Brunéi | 72,11 | +135.3% |
| 8 | Bután | 70,80 | +131.0% |
| 9 | Suecia | 68,59 | +123.8% |
| 10 | Japón | 68,35 | +123.0% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Egipto | 0,00 | -100.0% |
| 2 | Omán | 0,01 | -100.0% |
| 3 | Libia | 0,12 | -99.6% |
| 4 | Catar | 0,12 | -99.6% |
| 5 | Yibuti | 0,25 | -99.2% |
| 6 | Kuwait | 0,35 | -98.8% |
| 7 | Islandia | 0,58 | -98.1% |
| 8 | Argelia | 0,71 | -97.7% |
| 9 | Níger | 0,84 | -97.2% |
| 10 | Mauritania | 0,98 | -96.8% |
| Métrica | Valor |
|---|---|
| Total países | 144 |
| Media | 15,45 |
| Mediana | 13,35 |
| Desv. estándar | 13,50 |
| Coef. de variación (%) | 87,38 |
| Mínimo | 0,00 |
| Percentil 10 | 1,50 |
| Q1 (percentil 25) | 5,25 |
| Q3 (percentil 75) | 22,13 |
| Percentil 90 | 31,11 |
| Máximo | 100,00 |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Palaos | 100,00 | +547.3% |
| 2 | Luxemburgo | 55,80 | +261.2% |
| 3 | Bután | 49,70 | +221.7% |
| 4 | Zambia | 41,30 | +167.3% |
| 5 | Eslovenia | 40,10 | +159.6% |
| 6 | RU | 39,90 | +158.3% |
| 7 | Alemania | 38,70 | +150.5% |
| 8 | Polonia | 38,00 | +146.0% |
| 9 | Chile | 37,90 | +145.3% |
| 10 | Eslovaquia | 37,60 | +143.4% |
| # | País | Valor | % vs media |
|---|---|---|---|
| 1 | Cabo Verde | 0,00 | -100.0% |
| 2 | Mauricio | 0,00 | -100.0% |
| 3 | Maldivas | 0,10 | -99.4% |
| 4 | Tonga | 0,10 | -99.4% |
| 5 | Libia | 0,20 | -98.7% |
| 6 | Santo Tomé y Príncipe | 0,20 | -98.7% |
| 7 | Islas Salomón | 0,20 | -98.7% |
| 8 | Antigua y Barbuda | 0,40 | -97.4% |
| 9 | Lesoto | 0,50 | -96.8% |
| 10 | Comoras | 0,70 | -95.5% |
La superficie agrícola es el indicador más equilibrado de la dimensión: su media (40,5 %) y mediana (41,6 %) son casi iguales y la distribución es prácticamente simétrica. En los valores más altos aparecen países con tradición ganadera o de pastizales como Lesoto (92,9 %), Uruguay (87,6 %), Costa de Marfil (83,6 %), Arabia Saudita (80,8 %, donde buena parte del territorio se clasifica como pastizal permanente) y Uganda (80,3 %), y en los más bajos, países pequeños y urbanos como Singapur (0,9 %) o con territorios desérticos o boscosos como Noruega, Brunéi, Egipto y Omán.
La superficie forestal presenta mayor dispersión (coeficiente de variación de 72,6 %). Los países más boscosos son Gabón (91,5 %), Palaos (90,6 %) e Islas Salomón (89,9 %), seguidos de Guinea-Bisáu (75,1 %), Finlandia (74,2 %), República Centroafricana (72,6 %), Brunéi (72,1 %) y Bután (70,8 %), mientras que en el extremo opuesto están Egipto, Omán, Libia, Catar y Kuwait, con prácticamente 0 % de bosque. Ambas variables tienen una relación inversa (correlación de −0,41): donde se expande la frontera agrícola tiende a haber menos bosque.
Las áreas protegidas son el indicador más heterogéneo de la dimensión (coeficiente de variación de 87,4 %) y el más afectado por un valor atípico: Palaos tiene el 100 % de su territorio protegido (+547 % sobre la media). En segundo lugar aparece Luxemburgo con 55,8 %, y luego un grupo de países europeos (Eslovenia, Reino Unido, Alemania, Polonia, Eslovaquia) junto con Bután, Zambia y Chile, todos por encima del 37 %. En el otro extremo, 34 países protegen menos del 5 % de su territorio, entre ellos Cabo Verde y Mauricio con 0 %.
fig_ranking(dimensiones$ambiental)
El ranking evidencia que, a diferencia de la dimensión tecnológica, los líderes ambientales no coinciden con los países de mayor ingreso. En superficie forestal comparten el top 10 países africanos (Gabón, República Centroafricana, Guinea-Bisáu), insulares (Palaos, Islas Salomón) y nórdicos (Finlandia, Suecia). En áreas protegidas, Europa tiene un peso importante por las políticas de conservación de la Unión Europea, pero también aparecen Bután, Zambia y Chile. Esto se confirma en las correlaciones: los indicadores ambientales tienen relaciones casi nulas con el PIB per cápita (entre −0,31 y 0,16, según la matriz de correlaciones de la Figura 12) y con las variables sociales, por lo que aportan información distinta a la del resto de dimensiones y probablemente formarán un componente propio en el ACP.
fig_variabilidad(dimensiones$ambiental)
Esta es la dimensión con desviaciones más extremas en ambos sentidos. En superficie forestal, 15 países superan la media en más del 100 % y 46 quedan por debajo del −50 %; en áreas protegidas, 16 superan el +100 % y 47 caen por debajo del −50 %. En las dos variables hay países con desviaciones de −100 %, es decir, sin bosque o sin territorio protegido. Las áreas protegidas muestran además una media (15,5 %) mayor que la mediana (13,4 %), lo que refleja que unos pocos países, especialmente Palaos, elevan el promedio. La superficie agrícola, en cambio, es más homogénea: solo 3 países la superan en más del 100 %.
Colombia, marcada en naranja, se destaca en superficie forestal: con 53,9 % de su territorio cubierto por bosques está +76 % por encima de la media y ocupa el puesto 24 de 144, lo que la ubica entre los países más boscosos del mundo. En superficie agrícola (37,6 %, −7 %) y áreas protegidas (16,7 %, +8,1 %) se encuentra cerca del promedio mundial. Frente a la región, Colombia tiene una cobertura forestal similar a la de Brasil, Perú y Costa Rica, pero protege una proporción menor de su territorio que Chile (37,9 %), Bolivia (30,9 %), Brasil (29,3 %) o Costa Rica (28,8 %). Esto sugiere que su principal característica ambiental es la riqueza forestal, más que la extensión de sus áreas bajo protección.
indicadores <- data.frame(
var = unlist(dimensiones, use.names = FALSE),
dimension = rep(nombres_dim, lengths(dimensiones)),
stringsAsFactors = FALSE
)
indicadores$etiqueta <- unname(etiquetas[indicadores$var])
indicadores$cv <- sapply(
indicadores$var,
function(v) sd(base[[v]]) / abs(mean(base[[v]])) * 100
)
colores_dim <- setNames(
c("#B77A4D", "#8B6B54", "#D4A66C", "#789184"),
nombres_dim
)
plot_ly(
indicadores,
x = ~cv,
y = ~etiqueta,
color = ~dimension,
colors = colores_dim,
type = "bar",
orientation = "h",
height = 580,
hovertemplate = paste0(
"<b>%{y}</b>",
"<br>Coeficiente de variación: %{x:.2f}%",
"<extra></extra>"
),
marker = list(
line = list(
color = "#FFFCF7",
width = 1
)
)
) %>%
layout(
title = list(
text = "<b>Coeficiente de variación por indicador</b>",
x = 0.5,
xanchor = "center",
font = list(
family = "Fraunces, Georgia, serif",
size = 21,
color = "#51382C"
)
),
paper_bgcolor = "#FFFCF7",
plot_bgcolor = "#FFFCF7",
font = list(
family = "Satoshi, Arial, sans-serif",
size = 12,
color = "#624A3B"
),
margin = list(
t = 85,
l = 285,
r = 35,
b = 105
),
xaxis = list(
title = list(
text = "Coeficiente de variación (%)",
font = list(
size = 12,
color = "#51382C"
)
),
gridcolor = "#EADFD3",
zerolinecolor = "#CDB8A5",
tickfont = list(
size = 11,
color = "#806653"
)
),
yaxis = list(
title = "",
tickfont = list(
size = 11,
color = "#624A3B"
),
categoryorder = "array",
categoryarray = indicadores$etiqueta[
order(indicadores$cv)
],
automargin = TRUE
),
legend = list(
title = list(text = ""),
orientation = "h",
x = 0.5,
xanchor = "center",
y = -0.15,
font = list(
family = "Satoshi, Arial, sans-serif",
size = 11,
color = "#51382C"
),
bgcolor = "rgba(0,0,0,0)"
),
bargap = 0.25,
hoverlabel = list(
bgcolor = "#51382C",
bordercolor = "#D4A66C",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#FFFCF7"
)
)
)
El coeficiente de variación permite comparar la dispersión entre variables con unidades distintas: cuanto mayor es, más heterogéneos son los países en ese indicador. Los indicadores más dispersos son la inflación (145 %), el crecimiento poblacional (133 %), la mortalidad infantil (123 %) y el crecimiento del PIB (114 %), mientras que los más homogéneos son la esperanza de vida (11 %), el acceso al agua (16 %) y el acceso a electricidad (26 %). Las variables de cobertura básica (agua, electricidad, internet) tienen poca dispersión porque tienen un techo del 100 % que la mayoría de países ya alcanzó o está cerca de alcanzar. Las variables ambientales se ubican en un punto intermedio-alto (áreas protegidas 87 %, superficie forestal 73 %, superficie agrícola 54 %), lo que refleja la diversidad geográfica de los países.
Estas diferencias de escala y dispersión justifican estandarizar las variables antes de aplicar el ACP, para que ningún indicador domine los componentes solo por tener valores o varianzas más grandes.
Nota: El coeficiente de variación permite comparar la dispersión relativa de los indicadores. Sin embargo, debe interpretarse con cautela en variables que pueden presentar valores negativos o promedios cercanos a cero, como las tasas de crecimiento económico y poblacional.
En el análisis dimensional anterior se examinaron los indicadores a escada mundial, sin embargo, un promedio global puede ocultar grandes diferencias entre regiones. Por eso fue necesario preguntarnos dos cosas: ¿ son los continentes grupos homogéneos o existen disparidades importantes dentro de cada uno? y ¿ que países se alejan del patrón de su región y por qué?
En la figura 10 se puede explorar la distribución de los 16 indicadores en los cinco continentes; en donde, cada indicador y continente muestran: el diagrama de caja, resumiendo la distribución central de los países; los puntos individuales que representan a cada país y los valores atípicos, que son los países que quedan por fuera de los esperado para cada región.
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.
Seleccionando cualquier indicador con el menú desplegable se puede explorar cómo varían las diferencias regionales según la dimensión analizada.
cont_codigos <- list(
"África" = c("DZA","AGO","BEN","BWA","BFA","CPV","CMR","CAF","TCD","COM","CIV",
"DJI","EGY","ETH","GAB","GMB","GHA","GIN","GNB","KEN","LSO","LBY",
"MDG","MWI","MLI","MRT","MUS","MAR","MOZ","NAM","NER","RWA","STP",
"SEN","SLE","ZAF","TZA","TGO","UGA","ZMB","ZWE"),
"América" = c("ATG","BLZ","BOL","BRA","CAN","CHL","COL","CRI","DOM","ECU","SLV",
"GTM","HTI","HND","MEX","PAN","PRY","PER","URY"),
"Asia" = c("AFG","ARM","AZE","BHR","BGD","BTN","BRN","KHM","CHN","GEO","IND",
"IDN","IRN","IRQ","ISR","JPN","KAZ","KOR","KWT","KGZ","LBN","MYS",
"MDV","MNG","NPL","OMN","PHL","QAT","SAU","SGP","LKA","TJK","THA",
"TUR","UZB","VNM","ARE"),
"Europa" = c("ALB","AUT","BLR","BEL","BIH","BGR","HRV","CYP","CZE","DNK","EST",
"FIN","FRA","DEU","GRC","HUN","ISL","IRL","ITA","LVA","LTU","LUX",
"MLT","MDA","MNE","MKD","NLD","NOR","POL","PRT","ROU","RUS","SRB",
"SVK","SVN","ESP","SWE","CHE","UKR","GBR"),
"Oceanía" = c("AUS","FJI","KIR","NZL","PLW","SLB","TON")
)
orden_cont <- names(cont_codigos)
base$Continente <- NA_character_
for (k in orden_cont) {
base$Continente[base$Codigo_pais %in% cont_codigos[[k]]] <- k
}
base$Continente <- factor(
base$Continente,
levels = orden_cont
)
marcar_atipicos <- function(data, var, grupo = "Continente") {
data %>%
group_by(across(all_of(grupo))) %>%
mutate(
Q1 = quantile(.data[[var]], .25),
Q3 = quantile(.data[[var]], .75),
RI = Q3 - Q1,
lim_inf = Q1 - 1.5 * RI,
lim_sup = Q3 + 1.5 * RI,
es_atipico = .data[[var]] < lim_inf | .data[[var]] > lim_sup,
posicion = case_when(
.data[[var]] < lim_inf ~ "Bajo",
.data[[var]] > lim_sup ~ "Alto",
TRUE ~ "Normal"
)
) %>%
ungroup()
}
col_dim <- c(
economica = "#B77A4D",
social = "#8B6B54",
tecnologica = "#D4A66C",
ambiental = "#789184"
)
col_var <- setNames(
rep(col_dim, lengths(dimensiones)),
unlist(dimensiones)
)
fig_cajas <- function(vars) {
p <- plot_ly(height = 680)
for (i in seq_along(vars)) {
v <- vars[i]
col <- unname(col_var[v])
d <- base %>%
transmute(
Pais,
Codigo_pais,
Continente = as.character(Continente),
Valor = .data[[v]]
) %>%
marcar_atipicos("Valor") %>%
mutate(
texto = paste0(
"<b>", Pais, "</b><br>",
"<span style='color:#D4A66C'>", Continente, "</span><br>",
"<b>", etiquetas[[v]], ":</b> ",
round(Valor, 2), "<br>",
ifelse(
es_atipico,
paste0(
"<span style='color:#F0C38A'>◆ Atípico (",
posicion, ")</span>"
),
"<span style='color:#E8D7C5'>● Normal</span>"
)
)
)
dc <- d %>%
filter(Codigo_pais == "COL")
p <- p %>%
add_boxplot(
x = d$Continente,
y = d$Valor,
name = "Distribución",
boxpoints = FALSE,
boxmean = TRUE,
fillcolor = paste0(col, "33"),
line = list(
color = col,
width = 2
),
hoverinfo = "y",
visible = (i == 1),
showlegend = FALSE
) %>%
add_markers(
x = d$Continente,
y = d$Valor,
text = d$texto,
hovertemplate = "%{text}<extra></extra>",
marker = list(
color = col,
size = ifelse(d$es_atipico, 11, 5),
opacity = ifelse(d$es_atipico, 0.95, 0.35),
symbol = ifelse(
d$es_atipico,
"diamond",
"circle"
),
line = list(
color = ifelse(
d$es_atipico,
"#FFFCF7",
"rgba(255,255,255,0)"
),
width = ifelse(d$es_atipico, 1, 0)
)
),
visible = (i == 1),
showlegend = FALSE
) %>%
add_markers(
x = dc$Continente,
y = dc$Valor,
hovertemplate = sprintf(
"<b>Colombia</b><br>%s: %.2f<extra></extra>",
etiquetas[[v]],
dc$Valor
),
marker = list(
color = "#C47758",
size = 16,
symbol = "diamond",
line = list(
color = "#51382C",
width = 1.5
)
),
visible = (i == 1),
showlegend = FALSE
)
}
botones <- lapply(seq_along(vars), function(i) {
list(
method = "update",
label = etiquetas[[vars[i]]],
args = list(
list(
visible = as.list(
rep(seq_along(vars) == i, each = 3)
)
),
list(
"title.text" = paste0(
"<b>", etiquetas[[vars[i]]], "</b>"
)
)
)
)
})
p %>%
layout(
title = list(
text = paste0(
"<b>", etiquetas[[vars[1]]], "</b>"
),
x = 0.5,
xanchor = "center",
y = 0.97,
yref = "container",
yanchor = "top",
font = list(
family = "Fraunces, Georgia, serif",
color = "#51382C",
size = 21
)
),
updatemenus = list(
list(
buttons = botones,
type = "dropdown",
direction = "down",
x = 0,
xanchor = "left",
y = 1.13,
yanchor = "top",
bgcolor = "#F5EADF",
bordercolor = "#D4A66C",
borderwidth = 1,
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C",
size = 12
)
)
),
xaxis = list(
title = "",
categoryorder = "array",
categoryarray = orden_cont,
tickfont = list(
family = "Satoshi, Arial, sans-serif",
color = "#624A3B",
size = 12
),
showgrid = FALSE,
showline = TRUE,
linecolor = "#D9C7B6"
),
yaxis = list(
title = list(
text = "Valor del indicador",
font = list(
color = "#51382C",
size = 12
)
),
tickfont = list(
color = "#806653",
size = 11
),
gridcolor = "#EADFD3",
zeroline = FALSE
),
paper_bgcolor = "#FFFCF7",
plot_bgcolor = "#FFFCF7",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C"
),
hoverlabel = list(
bgcolor = "#51382C",
bordercolor = "#D4A66C",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#FFFCF7",
size = 12
),
align = "left"
),
annotations = list(
list(
text = paste0(
"◆ Rombo = valor atípico",
" · ◆ Terracota = Colombia",
" · Línea de la caja = mediana"
),
x = 0.5,
xref = "paper",
y = -0.12,
yref = "paper",
showarrow = FALSE,
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#806653",
size = 11
)
)
),
margin = list(
t = 175,
b = 105,
l = 85,
r = 35
),
height = 680
)
}
fig_cajas(unname(unlist(dimensiones)))
La figura 10 revela una disparidad importante dentro de los continentes. En África, por ejemplo la dispersión más alta se presenta en los indicadores sociales, con países con alta mortalidad infantil y poca esperanza de vida, frente a otros del mismo que estan más cerca del promedio mundial.Además, en este continente la mayoria de la población sigue viviendo en zonas rurales. En América, la distribución es más unida, pero hay contrastes en variables como el PIB per cápita. Colombia por ejemplo se ubica dentro de las cajas en la mayoria de los indicadores, mostrando que es un país típico del continente.Asia, por su parte presenta heterogeniedad extrema, en indicadores de PIB per cápita, y crecimiento poblacional respecto a otras naciones del mismo. Europa mantiene una homogeneidad relativa en los indicadores de bienestar, aunque Luxemburgo e Irlanda son atípicos en PIB per cápita, esto se debe a su economía pequeña y fuerte peso financiero. En Oceanía, el diagrama refleja que la caja más amplia es en población urbana y PIB per cápita, donde Australia se aleja del resto. 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.
El mapa de la figura 11, nos permite ver donde esta ubicados los valores altos y bajos dentro de cada continente, dentro del mapa se pinta a cada país según su posición en cada uno de los 16 indicadores y con ello podemos ver que patrones geográficos se repiten de un indicador a otro. El color de cada país indica su percentil, es decir, su posición entre todos los países dela base de datos. Los países en gris no tienen datos en la base. Ademas, en el gráfico podemos encontrar el menu, para el elegir el indicador que queremos visualizar su distribución.
col_mapa <- c("#E9D9CA", "#D4B99E", "#B77A4D", "#8B6B54", "#51382C")
escala_cocoa <- lapply(seq_along(col_mapa), function(k) {
list((k - 1) / (length(col_mapa) - 1), col_mapa[k])
})
vars_mapa <- unname(unlist(dimensiones))
nom_dim <- rep(nombres_dim, lengths(dimensiones))
lab_menu <- paste0(nom_dim, " · ", unname(etiquetas[vars_mapa]))
# Percentil y texto emergente de cada indicador
z_lista <- lapply(vars_mapa, function(v) percent_rank(base[[v]]))
txt_lista <- lapply(vars_mapa, function(v) {
sprintf("<b>%s</b><br>%s: %.2f<br>Percentil: %.0f%%",
base$Pais, etiquetas[[v]], base[[v]], 100 * percent_rank(base[[v]]))
})
titulo_mapa <- function(i) {
paste0("<b>", etiquetas[[vars_mapa[i]]], "</b><br>",
"<sup>Dimensión: ", nom_dim[i],
" · Crema = valores más bajos · Chocolate = valores más altos</sup>")
}
botones_mapa <- lapply(seq_along(vars_mapa), function(i) {
list(
method = "update",
label = lab_menu[i],
args = list(
list(z = list(z_lista[[i]]), text = list(txt_lista[[i]])),
list(title.text = titulo_mapa(i))
)
)
})
plot_ly(
type = "choropleth",
locations = base$Codigo_pais, # códigos ISO3
z = z_lista[[1]],
text = txt_lista[[1]],
hoverinfo = "text",
zmin = 0,
zmax = 1,
colorscale = escala_cocoa,
marker = list(line = list(color = "#FFFCF7", width = 0.5)),
colorbar = list(
title = list(text = "<b>Posición relativa</b><br>del país",
font = list(family = "Satoshi, Arial, sans-serif", size = 12, color = "#51382C")),
tickvals = c(0, 1),
ticktext = c("Más bajo", "Más alto"),
tickfont = list(family = "Satoshi, Arial, sans-serif", size = 11, color = "#806653"),
len = 0.55, thickness = 18, outlinewidth = 0
),
height = 680
) %>%
layout(
title = list(
text = titulo_mapa(1), x = 0.5, xanchor = "center", y = 0.96,
font = list(family = "Fraunces, Georgia, serif", size = 20, color = "#51382C")
),
updatemenus = list(list(
buttons = botones_mapa, type = "dropdown", direction = "down",
x = 0, xanchor = "left", y = 1.02, yanchor = "top",
bgcolor = "#F5EADF", bordercolor = "#D4A66C", borderwidth = 1,
font = list(family = "Satoshi, Arial, sans-serif", size = 12, color = "#51382C")
)),
geo = list(
showframe = FALSE, showcoastlines = FALSE,
showcountries = TRUE, countrycolor = "#FFFCF7",
showland = TRUE, landcolor = "#EAE5DF", # gris = países sin dato
showocean = FALSE, bgcolor = "#FFFCF7",
projection = list(type = "natural earth"),
lataxis = list(range = c(-58, 85))
),
paper_bgcolor = "#FFFCF7",
font = list(family = "Satoshi, Arial, sans-serif", color = "#51382C"),
hoverlabel = list(bgcolor = "#51382C", bordercolor = "#D4A66C",
font = list(family = "Satoshi, Arial, sans-serif", size = 12, color = "#FFFCF7"),
align = "left"),
margin = list(t = 120, b = 10, l = 10, r = 10)
) %>%
config(displaylogo = FALSE)
Con el propósito de identificar las relaciones existentes entre los indicadores de desarrollo de los países, se construyó una matriz de correlaciones de Pearson a partir de las 16 variables cuantitativas seleccionadas para el análisis. Es importante aclarar que las correlaciones se calcularon utilizando las variables transformadas para el ACP. En particular, el PIB per cápita fue transformado mediante la función logarítmica ln(1 + PIB), por lo que sus coeficientes de correlación corresponden a esta transformación y no a los valores originales del indicador.
Este análisis permite examinar la dirección e intensidad de las asociaciones entre las variables e identificar aquellas que presentan comportamientos similares. La presencia de correlaciones importantes resulta relevante para el ACP, ya que este método busca sintetizar la información compartida entre múltiples indicadores en un número reducido de componentes.
La matriz presenta las correlaciones de Pearson entre los 16 indicadores de desarrollo. Los tonos caramelos representan relaciones positivas, los tonos chocolate relaciones negativas y los tonos claros indican correlaciones cercanas a cero. Los valores dentro de cada celda permiten identificar la intensidad de estas asociaciones.
library(plotly)
# Matriz de correlaciones de los datos utilizados en el ACP
matriz_cor <- cor(datos_acp, method = "pearson")
nombres_completos <- c(
"PIB_per_capita" = "PIB per cápita",
"Crecimiento_PIB" = "Crecimiento del PIB",
"Inflacion" = "Inflación",
"Comercio_internacional" = "Comercio internacional",
"Agricultura_PIB" = "Agricultura (% PIB)",
"Esperanza_vida" = "Esperanza de vida",
"Fecundidad" = "Fecundidad",
"Mortalidad_infantil" = "Mortalidad infantil",
"Acceso_agua" = "Acceso al agua",
"Poblacion_urbana" = "Población urbana",
"Crecimiento_poblacional" = "Crecimiento poblacional",
"Acceso_electricidad" = "Acceso a electricidad",
"Usuarios_internet" = "Usuarios de internet",
"Superficie_agricola" = "Superficie agrícola",
"Superficie_forestal" = "Superficie forestal",
"Areas_protegidas" = "Áreas protegidas"
)
matriz_grafica <- matriz_cor
rownames(matriz_grafica) <-
nombres_completos[rownames(matriz_cor)]
colnames(matriz_grafica) <-
nombres_completos[colnames(matriz_cor)]
texto_hover <- matrix(
paste0(
"<b>",
rep(colnames(matriz_grafica), each = nrow(matriz_grafica)),
"</b><br>vs. <b>",
rep(rownames(matriz_grafica), times = ncol(matriz_grafica)),
"</b><br>Correlación: <b>",
sprintf("%.3f", as.vector(matriz_grafica)),
"</b>"
),
nrow = nrow(matriz_grafica),
ncol = ncol(matriz_grafica)
)
heatmap_interactivo <- plot_ly(
x = colnames(matriz_grafica),
y = rownames(matriz_grafica),
z = matriz_grafica,
type = "heatmap",
zmin = -1,
zmax = 1,
zmid = 0,
colorscale = list(
list(0, "#51382C"),
list(0.5, "#F8F4EF"),
list(1, "#B77A4D")
),
hoverinfo = "text",
text = texto_hover,
texttemplate = "%{z:.2f}",
textfont = list(
size = 9
),
colorbar = list(
title = list(
text = "<b>Correlación</b>",
font = list(
color = "#51382C",
size = 12
)
),
tickfont = list(
color = "#765C4D",
size = 11
),
thickness = 15,
len = 0.8
)
) %>%
layout(
title = list(
text = paste0(
"<b>Matriz de correlaciones</b>",
"<br><span style='font-size:13px;'>",
"16 indicadores de desarrollo | ",
"144 países | Banco Mundial, 2022",
"</span>"
),
x = 0.5,
y = 0.97,
xanchor = "center",
font = list(
family = "Fraunces, Georgia, serif",
size = 20,
color = "#51382C"
)
),
xaxis = list(
title = "",
tickangle = -45,
tickfont = list(
size = 10,
color = "#51382C"
),
showgrid = FALSE,
zeroline = FALSE,
automargin = TRUE
),
yaxis = list(
title = "",
autorange = "reversed",
tickfont = list(
size = 10,
color = "#51382C"
),
showgrid = FALSE,
zeroline = FALSE,
automargin = TRUE
),
plot_bgcolor = "#FFFFFF",
paper_bgcolor = "#FFFFFF",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C"
),
margin = list(
l = 195,
r = 65,
b = 185,
t = 115
),
hoverlabel = list(
bgcolor = "#51382C",
bordercolor = "#B77A4D",
font = list(
color = "#FFFFFF",
size = 12,
family = "Arial"
)
),
annotations = list(
list(
x = 0.5,
y = -0.25,
text = paste0(
"Pasa el cursor sobre las celdas ",
"para consultar los valores exactos"
),
showarrow = FALSE,
xref = "paper",
yref = "paper",
font = list(
size = 11,
color = "#765C4D"
)
)
)
) %>%
config(
responsive = TRUE,
displayModeBar = TRUE,
displaylogo = FALSE,
modeBarButtonsToRemove = list(
"lasso2d",
"select2d"
),
toImageButtonOptions = list(
format = "png",
filename = "matriz_correlaciones_2022",
width = 1400,
height = 1100
)
)
heatmap_interactivo
La matriz de correlaciones evidencia asociaciones importantes entre los indicadores de desarrollo de los 144 países analizados. Entre las relaciones positivas más fuertes se encuentran el acceso al agua y el acceso a la electricidad (r = 0,91), así como el PIB per cápita y el uso de internet (r = 0,90). Estas asociaciones indican que los países con mejores condiciones económicas tienden a presentar mayores niveles de conectividad y acceso a servicios básicos.
Por otra parte, la relación negativa más fuerte se presenta entre la mortalidad infantil y la esperanza de vida (r = −0,93). Asimismo, se observa una correlación negativa entre el PIB per cápita y la participación de la agricultura en la economía (r = −0,86), lo que refleja diferencias en las estructuras productivas de los países.
En conjunto, estos resultados muestran que varios indicadores comparten información relevante, especialmente los relacionados con las condiciones de vida, el desarrollo económico y el acceso a servicios. Esto respalda la aplicación del ACP para sintetizar las relaciones entre las variables e identificar las principales dimensiones del desarrollo de los países.
La siguiente tabla presenta los 120 pares únicos de indicadores, ordenados de mayor a menor según el valor absoluto de su coeficiente de correlación de Pearson (|r|). Esta clasificación permite identificar las relaciones más fuertes entre las variables, independientemente de su dirección. Los valores positivos indican asociaciones directas, mientras que los negativos representan asociaciones inversas.
indices <- which(
upper.tri(matriz_grafica),
arr.ind = TRUE
)
pares_correlacionados <- data.frame(
`Variable A` = rownames(matriz_grafica)[indices[, 1]],
`Variable B` = colnames(matriz_grafica)[indices[, 2]],
r = matriz_grafica[indices],
check.names = FALSE
) %>%
mutate(
`|r|` = abs(r)
) %>%
arrange(desc(`|r|`))
tabla_pares <- DT::datatable(
pares_correlacionados,
extensions = "Buttons",
rownames = FALSE,
class = "display compact hover nowrap",
options = list(
dom = "Bflrtip",
buttons = list(
list(extend = "copy", text = "Copiar"),
list(extend = "csv", text = "CSV"),
list(extend = "excel", text = "Excel"),
list(extend = "pdf", text = "PDF"),
list(extend = "print", text = "Imprimir")
),
pageLength = 10,
lengthMenu = list(
c(10, 20, 50, -1),
c("10", "20", "50", "Todos")
),
scrollX = TRUE,
autoWidth = FALSE,
order = list(list(3, "desc")),
language = list(
search = "Buscar variable:",
lengthMenu = "Mostrar _MENU_ registros",
info = "Mostrando _START_ a _END_ de _TOTAL_ pares",
infoEmpty = "Sin registros",
zeroRecords = "No se encontraron resultados",
paginate = list(
previous = "Anterior",
`next` = "Siguiente"
)
)
)
) %>%
DT::formatRound(
columns = c("r", "|r|"),
digits = 2,
mark = ".",
dec.mark = ","
)
htmltools::browsable(
htmltools::tagList(
htmltools::HTML(estilo_tabla),
htmltools::tags$div(
class = "cocoa-dataset",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados del modelo · ACP"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Pares más correlacionados"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"120 pares de indicadores | Banco Mundial, 2022"
)
),
tabla_pares,
htmltools::tags$div(
class = "cocoa-dataset-source",
"Fuente: elaboración propia con datos del Banco Mundial (2022)."
)
)
)
)
La tabla permite identificar las asociaciones de mayor magnitud entre los indicadores analizados. La relación más fuerte corresponde a la mortalidad infantil y la esperanza de vida (r = −0,93), seguida por el acceso al agua y la electricidad (r = 0,91) y el PIB per cápita y el uso de internet (r = 0,90).
Estos resultados muestran que las relaciones más intensas se concentran en variables relacionadas con la salud, el acceso a servicios básicos y las condiciones económicas. Además, el ordenamiento por valor absoluto permite comparar tanto las asociaciones positivas como las negativas, facilitando la identificación de los indicadores que comparten mayor información.
El Análisis de Componentes Principales (ACP) se aplicó a los 16 indicadores cuantitativos correspondientes a los 144 países seleccionados, con el propósito de identificar las principales dimensiones de variabilidad y reducir la cantidad de variables utilizadas en el análisis.
Para ello, se emplearon variables transformadas y estandarizadas,
mediante el método prcomp() de R. Este procedimiento
permite obtener componentes principales no correlacionados entre sí,
ordenados según la proporción de varianza que explican.
La siguiente tabla presenta los valores propios, el porcentaje de varianza explicada y la varianza acumulada de los 16 componentes principales obtenidos.
modelo_acp <- prcomp(datos_acp, center = TRUE, scale. = TRUE)
varianza_acp <- modelo_acp$sdev^2
porcentaje_varianza <- 100 * varianza_acp / sum(varianza_acp)
tabla_varianza <- data.frame(
Componente = paste0("CP", seq_along(porcentaje_varianza)),
Valor_propio = round(varianza_acp, 3),
Varianza_explicada = round(porcentaje_varianza, 2),
Varianza_acumulada = round(cumsum(porcentaje_varianza), 2)
)
tabla_acp <- DT::datatable(
tabla_varianza,
extensions = "Buttons",
rownames = FALSE,
colnames = c(
"Componente",
"Valor propio",
"Varianza explicada (%)",
"Varianza acumulada (%)"
),
class = "display compact hover nowrap",
options = list(
dom = "Bft",
buttons = list(
list(extend = "copy", text = "Copiar"),
list(extend = "csv", text = "CSV"),
list(extend = "excel", text = "Excel"),
list(extend = "pdf", text = "PDF"),
list(extend = "print", text = "Imprimir")
),
paging = FALSE,
ordering = FALSE,
scrollX = TRUE,
autoWidth = FALSE,
language = list(
search = "Buscar componente:",
zeroRecords = "No se encontraron resultados"
)
)
) %>%
DT::formatRound(
columns = "Valor_propio",
digits = 3,
mark = ".",
dec.mark = ","
) %>%
DT::formatRound(
columns = c("Varianza_explicada", "Varianza_acumulada"),
digits = 2,
mark = ".",
dec.mark = ","
)
htmltools::browsable(
htmltools::tagList(
htmltools::HTML(estilo_tabla),
htmltools::tags$div(
class = "cocoa-dataset",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados del modelo · ACP"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Varianza explicada por los componentes principales"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"16 componentes | 144 países | Banco Mundial, 2022"
)
),
tabla_acp,
htmltools::tags$div(
class = "cocoa-dataset-source",
"Fuente: elaboración propia a partir de los resultados del ACP."
)
)
)
)
Los resultados muestran que el primer componente principal (CP1) explica el 48,11 % de la variabilidad total de los indicadores, concentrando casi la mitad de la información original. El segundo componente (CP2) aporta un 10,75 % y el tercero (CP3) un 10,08 %, alcanzando una varianza acumulada del 68,93 %.
Al incorporar el cuarto componente (CP4), la varianza acumulada aumenta hasta el 74,65 %. Esto indica que es posible representar aproximadamente tres cuartas partes de la variabilidad de los 16 indicadores mediante cuatro componentes principales, reduciendo considerablemente la dimensionalidad de los datos.
Aunque los tres primeros componentes cumplen con el criterio de Kaiser, al presentar valores propios superiores a uno, se conserva también el cuarto componente para superar el 70 % de varianza acumulada. Esta selección permite mantener una mayor proporción de información para el posterior agrupamiento de los países mediante el método de Ward.
El gráfico de sedimentación permite visualizar los valores propios obtenidos mediante el Análisis de Componentes Principales (ACP), ordenados de mayor a menor. Su propósito es identificar los componentes que concentran la mayor variabilidad y observar cómo disminuye la información adicional aportada por cada uno.
Como referencia, se incorpora el criterio de Kaiser, según el cual se recomienda conservar los componentes cuyos valores propios sean superiores a uno. Esta representación complementa el análisis de la varianza acumulada presentado anteriormente. (Kaiser, 1960)
sc <- tabla_varianza %>%
dplyr::slice(1:8) %>%
dplyr::transmute(
comp = factor(Componente, levels = Componente),
pct = Varianza_explicada
)
kais <- 100 / nrow(tabla_varianza)
sc$kaiser <- rep(kais, nrow(sc))
plotly::plot_ly(
data = sc,
x = ~comp,
height = 520
) %>%
plotly::add_bars(
y = ~pct,
name = "Varianza explicada",
marker = list(
color = "#B77A4D",
line = list(color = "#8F5E3C", width = 1)
),
text = ~paste0(
format(round(pct, 2), nsmall = 2),
" %"
),
textposition = "outside",
textfont = list(
family = "Satoshi, Arial, sans-serif",
size = 12,
color = "#51382C"
),
cliponaxis = FALSE,
hovertemplate = paste0(
"<b>%{x}</b><br>",
"Varianza explicada: %{y:.2f} %",
"<extra></extra>"
)
) %>%
plotly::add_trace(
y = ~pct,
type = "scatter",
mode = "lines+markers",
name = "Perfil de sedimentación",
line = list(
color = "#51382C",
width = 2.5
),
marker = list(
color = "#51382C",
size = 9
),
hoverinfo = "skip"
) %>%
plotly::add_trace(
y = ~kaiser,
type = "scatter",
mode = "lines",
name = "Criterio de Kaiser (λ = 1)",
line = list(
color = "#A88A65",
dash = "dash",
width = 2.5
),
hovertemplate = paste0(
"Criterio de Kaiser: %{y:.2f} %",
"<extra></extra>"
)
) %>%
plotly::layout(
title = list(
text = "<b>Gráfico de sedimentación del ACP</b>",
font = list(
family = "Fraunces, Georgia, serif",
size = 19,
color = "#51382C"
),
x = 0.03
),
xaxis = list(
title = "Componente principal",
showgrid = FALSE,
tickfont = list(color = "#624634", size = 12),
titlefont = list(color = "#51382C", size = 13)
),
yaxis = list(
title = "Varianza explicada (%)",
range = c(0, max(sc$pct) * 1.18),
gridcolor = "#E8DED3",
zeroline = FALSE,
tickfont = list(color = "#624634"),
titlefont = list(color = "#51382C")
),
legend = list(
orientation = "h",
x = 0.5,
xanchor = "center",
y = -0.28,
font = list(
family = "Satoshi, Arial, sans-serif",
size = 11,
color = "#51382C"
)
),
paper_bgcolor = "#FFFCF7",
plot_bgcolor = "#FFFCF7",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C"
),
margin = list(
l = 70,
r = 30,
t = 90,
b = 125
),
bargap = 0.35,
hoverlabel = list(
bgcolor = "#FFFCF7",
font = list(color = "#51382C")
)
)
El gráfico de sedimentación muestra que el primer componente principal (CP1) explica el 48,11 % de la variabilidad total, seguido del segundo (CP2) con el 10,75 % y el tercero (CP3) con el 10,08 %. La disminución más pronunciada ocurre entre CP1 y CP2, mientras que los componentes posteriores presentan aportes progresivamente menores.
De acuerdo con el criterio de Kaiser, representado por la línea horizontal del 6,25 %, únicamente los tres primeros componentes presentan valores propios superiores a uno. Sin embargo, estos acumulan el 68,93 % de la varianza total. Por ello se incorpora también el CP4, cuyo valor propio (0,915) está muy cerca de uno y que eleva la varianza acumulada al 74,65 %. A partir del quinto componente, cada dimensión explica individualmente menos del 5,3 % de la variabilidad total. Por ello, se seleccionaron los cuatro primeros componentes, que acumulan el 74,65 % de la varianza, permitiendo reducir la dimensionalidad sin descartar una proporción excesiva de la información original.
Al incorporar el cuarto componente (CP4), la varianza acumulada alcanza el 74,65 %, superando el umbral del 70 % establecido para este análisis. Por esta razón, se seleccionan los cuatro primeros componentes para el posterior agrupamiento de países mediante el método de Ward, conservando una proporción considerable de la información original.
La contribución de las variables permite identificar qué indicadores tienen mayor importancia en la construcción de cada componente principal. Para este análisis se consideran los cuatro componentes seleccionados, que explican conjuntamente el 74,65 % de la variabilidad total de los 16 indicadores.
Las siguientes tablas presentan las cargas factoriales (Loading), la calidad de representación (Cos²) y la contribución porcentual de cada indicador. Las cargas muestran la dirección e intensidad de la relación con el componente, mientras que el Cos² indica qué tan bien está representada la variable. La contribución porcentual permite identificar cuáles indicadores tienen mayor peso relativo en cada componente.
tabla_cp_cocoa <- function(k) {
variables <- rownames(modelo_acp$rotation)
cargas <- modelo_acp$rotation[, k] * modelo_acp$sdev[k]
cos2 <- cargas^2
contribucion <- 100 * modelo_acp$rotation[, k]^2
nombres <- unname(etiquetas[variables])
nombres[is.na(nombres)] <- variables[is.na(nombres)]
tabla <- data.frame(
Variable = nombres,
Loading = cargas,
Cos2 = cos2,
Contribucion = contribucion
)
tabla <- tabla[order(-tabla$Contribucion), ]
formato <- function(x, decimales) {
formatC(x, format = "f", digits = decimales, decimal.mark = ",")
}
filas <- lapply(seq_len(nrow(tabla)), function(i) {
htmltools::tags$tr(
htmltools::tags$td(tabla$Variable[i]),
htmltools::tags$td(formato(tabla$Loading[i], 4), style = "text-align:right;"),
htmltools::tags$td(formato(tabla$Cos2[i], 4), style = "text-align:right;"),
htmltools::tags$td(formato(tabla$Contribucion[i], 2), style = "text-align:right;")
)
})
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(htmltools::HTML(estilo_resumen)),
htmltools::tags$div(
class = "cocoa-resumen",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / RESULTADOS DEL MODELO · ACP"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
paste0("Contribución de Variables al Componente Principal ", k)
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
paste0(
"CP", k, " · ",
formato(porcentaje_varianza[k], 2),
" % de varianza explicada · 16 indicadores"
)
)
),
htmltools::tags$div(
style = "overflow-x:auto;",
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
htmltools::tags$th("Variable"),
htmltools::tags$th("Loading"),
htmltools::tags$th("Cos²"),
htmltools::tags$th("Contribución (%)")
)
),
htmltools::tags$tbody(filas)
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
"Fuente: elaboración propia a partir de los resultados del ACP."
)
)
)
)
}
tabla_cp_cocoa(1)
| Variable | Loading | Cos² | Contribución (%) |
|---|---|---|---|
| Usuarios de internet (%) | 0,9457 | 0,8943 | 11,62 |
| Acceso básico al agua (%) | 0,9336 | 0,8715 | 11,32 |
| PIB per cápita (US$ PPA) | 0,9285 | 0,8621 | 11,20 |
| Fecundidad (hijos por mujer) | -0,9224 | 0,8508 | 11,05 |
| Agricultura (% PIB) | -0,8954 | 0,8017 | 10,42 |
| Acceso a electricidad (%) | 0,8889 | 0,7901 | 10,27 |
| Esperanza de vida (años) | 0,8855 | 0,7842 | 10,19 |
| Mortalidad infantil (por 1.000 nacidos vivos) | -0,8516 | 0,7253 | 9,42 |
| Población urbana (%) | 0,7317 | 0,5353 | 6,96 |
| Comercio internacional (% PIB) | 0,5422 | 0,2940 | 3,82 |
| Crecimiento poblacional (%) | -0,3844 | 0,1478 | 1,92 |
| Superficie agrícola (%) | -0,3083 | 0,0951 | 1,24 |
| Inflación (%) | -0,1357 | 0,0184 | 0,24 |
| Áreas protegidas (%) | 0,1268 | 0,0161 | 0,21 |
| Superficie forestal (%) | 0,1014 | 0,0103 | 0,13 |
| Crecimiento del PIB (%) | -0,0010 | 0,0000 | 0,00 |
grafico_contribucion_cp <- function(i) {
contribucion <- 100 * modelo_acp$rotation[, i]^2
variables <- names(contribucion)
nombres <- unname(etiquetas[variables])
nombres[is.na(nombres)] <- variables[is.na(nombres)]
d <- data.frame(
Variable = nombres,
Contribucion = as.numeric(contribucion)
)
d <- d[order(d$Contribucion), ]
d$Variable <- factor(
d$Variable,
levels = d$Variable
)
referencia <- 100 / nrow(d)
colores <- ifelse(
d$Contribucion > referencia,
"#8C543A",
"#D8BDA3"
)
plotly::plot_ly(
data = d,
x = ~Contribucion,
y = ~Variable,
type = "bar",
orientation = "h",
height = 620,
marker = list(
color = colores,
line = list(
color = "#FFFCF7",
width = 1
)
),
hovertemplate = paste0(
"<b>%{y}</b>",
"<br>Contribución: %{x:.2f} %",
"<extra></extra>"
)
) %>%
plotly::layout(
title = list(
text = paste0(
"<b>Contribución de las variables al CP",
i, "</b>"
),
x = 0.5,
xanchor = "center",
font = list(
family = "Fraunces, Georgia, serif",
size = 19,
color = "#51382C"
)
),
xaxis = list(
title = "Contribución al componente (%)",
range = c(0, max(d$Contribucion) * 1.12),
gridcolor = "#EADFD3",
zeroline = FALSE,
tickfont = list(color = "#624634"),
titlefont = list(color = "#51382C")
),
yaxis = list(
title = "",
automargin = TRUE,
tickfont = list(
family = "Satoshi, Arial, sans-serif",
color = "#624634",
size = 11
)
),
shapes = list(
list(
type = "line",
x0 = referencia,
x1 = referencia,
y0 = 0,
y1 = 1,
yref = "paper",
line = list(
color = "#D4A66C",
dash = "dash",
width = 2.5
)
)
),
annotations = list(
list(
x = referencia,
y = 1.05,
yref = "paper",
text = "Referencia: 6,25 %",
showarrow = FALSE,
font = list(
color = "#A7784D",
size = 11
)
)
),
paper_bgcolor = "#FFFCF7",
plot_bgcolor = "#FFFCF7",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C"
),
margin = list(
l = 245,
r = 35,
t = 110,
b = 80
),
bargap = 0.3
) %>%
plotly::config(
displaylogo = FALSE,
responsive = TRUE
)
}
grafico_contribucion_cp(1)
El primer componente principal (CP1) explica el 48,11 % de la variabilidad total y está asociado principalmente con las condiciones de desarrollo socioeconómico y bienestar de los países. Las mayores contribuciones corresponden al uso de internet (11,62 %), el acceso básico al agua (11,32 %) y el PIB per cápita (11,20 %), seguidos de la fecundidad (11,05 %), la participación de la agricultura en el PIB (10,42 %) y el acceso a electricidad (10,27 %).
Las cargas positivas del acceso a servicios básicos, el ingreso por habitante y la esperanza de vida contrastan con las cargas negativas de la fecundidad, la mortalidad infantil y la participación agrícola en el PIB. Esto indica que los países con puntuaciones altas en el CP1 tienden a presentar mejores condiciones económicas, mayor cobertura de servicios y mejores indicadores de salud, mientras que las puntuaciones bajas se asocian con mayores niveles de fecundidad y mortalidad infantil.
En conjunto, nueve indicadores superan la contribución media del 6,25 % y concentran el 92,45 % de la contribución al componente. Por tanto, el CP1 sintetiza principalmente las diferencias estructurales en el nivel de desarrollo de los países, constituyendo la dimensión más representativa del análisis.
tabla_cp_cocoa(2)
| Variable | Loading | Cos² | Contribución (%) |
|---|---|---|---|
| Crecimiento poblacional (%) | 0,7065 | 0,4992 | 29,04 |
| Crecimiento del PIB (%) | 0,6849 | 0,4691 | 27,28 |
| Inflación (%) | -0,5914 | 0,3497 | 20,34 |
| Superficie forestal (%) | -0,4506 | 0,2030 | 11,81 |
| Áreas protegidas (%) | -0,3188 | 0,1016 | 5,91 |
| Superficie agrícola (%) | -0,1914 | 0,0366 | 2,13 |
| Fecundidad (hijos por mujer) | 0,1327 | 0,0176 | 1,02 |
| Población urbana (%) | 0,1193 | 0,0142 | 0,83 |
| Esperanza de vida (años) | 0,1120 | 0,0125 | 0,73 |
| PIB per cápita (US$ PPA) | 0,0866 | 0,0075 | 0,44 |
| Usuarios de internet (%) | 0,0561 | 0,0031 | 0,18 |
| Comercio internacional (% PIB) | 0,0502 | 0,0025 | 0,15 |
| Acceso a electricidad (%) | -0,0379 | 0,0014 | 0,08 |
| Mortalidad infantil (por 1.000 nacidos vivos) | -0,0250 | 0,0006 | 0,04 |
| Agricultura (% PIB) | -0,0159 | 0,0003 | 0,01 |
| Acceso básico al agua (%) | -0,0079 | 0,0001 | 0,00 |
grafico_contribucion_cp(2)
El segundo componente principal (CP2) explica el 10,75 % de la variabilidad total y está relacionado principalmente con la dinámica demográfica y económica de los países. Las mayores contribuciones corresponden al crecimiento poblacional (29,04 %), el crecimiento del PIB (27,28 %), la inflación (20,34 %) y la superficie forestal (11,81 %), que conjuntamente representan el 88,47 % de la contribución al componente.
Las cargas positivas del crecimiento poblacional (0,7065) y del crecimiento del PIB (0,6849) contrastan con las cargas negativas de la inflación (-0,5914) y la superficie forestal (-0,4506). Esto indica que los países con puntuaciones altas en el CP2 tienden a presentar un mayor crecimiento económico y poblacional, asociado con menores niveles de inflación y cobertura forestal.
En conjunto, cuatro indicadores superan la contribución media del 6,25 %, mientras que las demás variables presentan aportes considerablemente menores. Por tanto, el CP2 permite identificar diferencias en la dinámica económica y demográfica de los países, complementando la dimensión de desarrollo socioeconómico representada por el CP1.
tabla_cp_cocoa(3)
| Variable | Loading | Cos² | Contribución (%) |
|---|---|---|---|
| Superficie forestal (%) | -0,7465 | 0,5572 | 34,55 |
| Superficie agrícola (%) | 0,6920 | 0,4788 | 29,69 |
| Áreas protegidas (%) | -0,5287 | 0,2795 | 17,33 |
| Inflación (%) | 0,4620 | 0,2134 | 13,23 |
| Mortalidad infantil (por 1.000 nacidos vivos) | -0,1577 | 0,0249 | 1,54 |
| Esperanza de vida (años) | 0,1202 | 0,0144 | 0,90 |
| Población urbana (%) | -0,1170 | 0,0137 | 0,85 |
| Acceso a electricidad (%) | 0,0809 | 0,0065 | 0,41 |
| Acceso básico al agua (%) | 0,0769 | 0,0059 | 0,37 |
| Crecimiento poblacional (%) | -0,0698 | 0,0049 | 0,30 |
| Fecundidad (hijos por mujer) | -0,0620 | 0,0038 | 0,24 |
| Crecimiento del PIB (%) | -0,0616 | 0,0038 | 0,23 |
| Comercio internacional (% PIB) | 0,0466 | 0,0022 | 0,13 |
| PIB per cápita (US$ PPA) | -0,0451 | 0,0020 | 0,13 |
| Usuarios de internet (%) | 0,0346 | 0,0012 | 0,07 |
| Agricultura (% PIB) | -0,0219 | 0,0005 | 0,03 |
grafico_contribucion_cp(3)
El tercer componente principal (CP3) explica el 10,08 % de la variabilidad total y está relacionado principalmente con las características ambientales y el uso del territorio de los países. Las mayores contribuciones corresponden a la superficie forestal (34,55 %), la superficie agrícola (29,69 %), las áreas protegidas (17,33 %) y la inflación (13,23 %), que conjuntamente representan el 94,80 % de la contribución al componente.
Las cargas positivas de la superficie agrícola (0,6920) y la inflación (0,4620) contrastan con las cargas negativas de la superficie forestal (-0,7465) y las áreas protegidas (-0,5287). Esto indica que los países con puntuaciones altas en el CP3 tienden a presentar una mayor proporción de superficie agrícola y mayores niveles de inflación, mientras que las puntuaciones bajas se asocian con una mayor cobertura forestal y de áreas protegidas.
En conjunto, cuatro indicadores superan la contribución media del 6,25 %, mientras que las demás variables presentan aportes inferiores al 2 %. Por tanto, el CP3 permite identificar principalmente diferencias en la distribución y utilización del territorio, incorporando también una dimensión económica asociada con la inflación. Así, complementa los componentes anteriores al representar características que no se explican principalmente por el nivel de desarrollo socioeconómico ni por la dinámica de crecimiento de los países.
tabla_cp_cocoa(4)
| Variable | Loading | Cos² | Contribución (%) |
|---|---|---|---|
| Áreas protegidas (%) | 0,4934 | 0,2435 | 26,61 |
| Comercio internacional (% PIB) | 0,3774 | 0,1424 | 15,56 |
| Crecimiento poblacional (%) | 0,3345 | 0,1119 | 12,23 |
| Población urbana (%) | 0,3139 | 0,0985 | 10,77 |
| Crecimiento del PIB (%) | -0,2635 | 0,0694 | 7,59 |
| Acceso a electricidad (%) | -0,2389 | 0,0571 | 6,24 |
| Superficie forestal (%) | -0,2199 | 0,0483 | 5,28 |
| Superficie agrícola (%) | 0,2143 | 0,0459 | 5,02 |
| Agricultura (% PIB) | -0,1523 | 0,0232 | 2,53 |
| PIB per cápita (US$ PPA) | 0,1359 | 0,0185 | 2,02 |
| Fecundidad (hijos por mujer) | 0,1218 | 0,0148 | 1,62 |
| Acceso básico al agua (%) | -0,1208 | 0,0146 | 1,59 |
| Mortalidad infantil (por 1.000 nacidos vivos) | 0,1164 | 0,0135 | 1,48 |
| Inflación (%) | 0,0799 | 0,0064 | 0,70 |
| Usuarios de internet (%) | 0,0596 | 0,0036 | 0,39 |
| Esperanza de vida (años) | -0,0583 | 0,0034 | 0,37 |
grafico_contribucion_cp(4)
El cuarto componente principal (CP4) explica el 5,72 % de la variabilidad total y está relacionado principalmente con características ambientales, comerciales y demográficas de los países. Las mayores contribuciones corresponden a las áreas protegidas (26,61 %), el comercio internacional (15,56 %), el crecimiento poblacional (12,23 %), la población urbana (10,77 %) y el crecimiento del PIB (7,59 %), que conjuntamente representan el 72,76 % de la contribución al componente.
Las cargas positivas de las áreas protegidas (0,4934), el comercio internacional (0,3774), el crecimiento poblacional (0,3345) y la población urbana (0,3139) contrastan con la carga negativa del crecimiento del PIB (-0,2635). Esto indica que los países con puntuaciones altas en el CP4 tienden a presentar mayores proporciones de áreas protegidas, mayor apertura comercial y mayores niveles de crecimiento poblacional y urbanización, mientras que el crecimiento económico presenta una asociación inversa.
En conjunto, cinco indicadores superan la contribución media del 6,25 %, aunque sus cargas y valores de Cos² son relativamente moderados o bajos. Por tanto, el CP4 constituye una dimensión complementaria del ACP, que recoge diferencias territoriales, comerciales y demográficas no sintetizadas por los componentes anteriores. Su interpretación debe realizarse con mayor cautela, dado que explica una proporción menor de la variabilidad total y no presenta una estructura tan definida como los primeros componentes.
El análisis de las puntuaciones obtenidas mediante el ACP permite examinar cómo se distribuyen los 144 países en las dimensiones identificadas. Cada país tiene una puntuación en cada componente principal, que resume su posición respecto a las características económicas, sociales, tecnológicas, ambientales y demográficas consideradas.
Para visualizar estas relaciones, se utilizan gráficos de dispersión en los planos CP1–CP2 y CP3–CP4. Estas representaciones permiten identificar similitudes, diferencias y países con puntuaciones extremas, complementando la interpretación de las contribuciones realizada anteriormente.
coordenadas_paises <- as.matrix(modelo_acp$x)
contribuciones_paises <- sweep(
coordenadas_paises^2,
2,
colSums(coordenadas_paises^2),
"/"
) * 100
cos2_paises <- sweep(
coordenadas_paises^2,
1,
pmax(rowSums(coordenadas_paises^2), .Machine$double.eps),
"/"
)
grafico_paises_acp <- function(a, b) {
d <- data.frame(
Pais = base_final$Pais,
Codigo_pais = base_final$Codigo_pais,
X = coordenadas_paises[, a],
Y = coordenadas_paises[, b],
ContribX = contribuciones_paises[, a],
ContribY = contribuciones_paises[, b],
Cos2X = cos2_paises[, a],
Cos2Y = cos2_paises[, b]
)
formato <- function(x, n = 2) {
formatC(x, format = "f", digits = n, decimal.mark = ",")
}
d$Detalle <- paste0(
"<b>", d$Pais, "</b>",
"<br><br>COORDENADAS DEL ACP",
"<br>CP", a, ": ", formato(d$X),
"<br>CP", b, ": ", formato(d$Y),
"<br><br>CONTRIBUCIÓN INDIVIDUAL",
"<br>CP", a, ": ", formato(d$ContribX), " %",
"<br>CP", b, ": ", formato(d$ContribY), " %",
"<br><br>CALIDAD DE REPRESENTACIÓN",
"<br>Cos² CP", a, ": ", formato(d$Cos2X, 3),
"<br>Cos² CP", b, ": ", formato(d$Cos2Y, 3)
)
otros <- d[d$Codigo_pais != "COL", , drop = FALSE]
colombia <- d[d$Codigo_pais == "COL", , drop = FALSE]
escala_cocoa <- list(
list(0, "#F0DCC4"),
list(0.25, "#D4A66C"),
list(0.55, "#B77A4D"),
list(1, "#51382C")
)
fig <- plotly::plot_ly(
data = otros,
x = ~X,
y = ~Y,
text = ~Detalle,
type = "scatter",
mode = "markers",
name = "Países",
hovertemplate = "%{text}<extra></extra>",
marker = list(
size = 11,
opacity = 0.88,
color = otros$ContribX,
colorscale = escala_cocoa,
cmin = 0,
cmax = max(d$ContribX),
showscale = TRUE,
colorbar = list(
title = list(
text = paste0("Contribución CP", a, " (%)")
),
thickness = 15,
len = 0.75,
tickfont = list(color = "#624634")
),
line = list(
color = "#FFFCF7",
width = 1.2
)
)
)
if (nrow(colombia) > 0) {
fig <- fig %>%
plotly::add_trace(
data = colombia,
x = ~X,
y = ~Y,
text = ~Pais,
customdata = ~Detalle,
type = "scatter",
mode = "markers+text",
name = "Colombia",
textposition = "top center",
textfont = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C",
size = 12
),
marker = list(
size = 17,
color = "#C47758",
symbol = "diamond",
line = list(
color = "#51382C",
width = 2
)
),
hovertemplate = "%{customdata}<extra></extra>",
inherit = FALSE
)
}
fig %>%
plotly::layout(
title = list(
text = paste0(
"<b>Distribución de países · CP",
a, " y CP", b, "</b>"
),
x = 0.5,
xanchor = "center",
font = list(
family = "Fraunces, Georgia, serif",
size = 20,
color = "#51382C"
)
),
xaxis = list(
title = paste0(
"CP", a, " (",
formato(porcentaje_varianza[a]), " %)"
),
gridcolor = "#E9DED2",
zeroline = TRUE,
zerolinecolor = "#BFA58C",
zerolinewidth = 1.5
),
yaxis = list(
title = paste0(
"CP", b, " (",
formato(porcentaje_varianza[b]), " %)"
),
gridcolor = "#E9DED2",
zeroline = TRUE,
zerolinecolor = "#BFA58C",
zerolinewidth = 1.5
),
paper_bgcolor = "#FFFCF7",
plot_bgcolor = "#FFFCF7",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C",
size = 12
),
hoverlabel = list(
bgcolor = "#FFFCF7",
bordercolor = "#D4A66C",
font = list(
color = "#51382C",
size = 12
)
),
legend = list(
orientation = "h",
x = 0.5,
xanchor = "center",
y = -0.18
),
margin = list(
l = 75,
r = 60,
b = 100,
t = 90
),
height = 620,
hovermode = "closest"
) %>%
plotly::config(
responsive = TRUE,
displaylogo = FALSE,
toImageButtonOptions = list(
format = "png",
filename = paste0("ACP_Paises_CP", a, "_CP", b),
width = 1200,
height = 800
)
)
}
grafico_paises_acp(1, 2)
El plano formado por los componentes CP1 y CP2 explica conjuntamente el 58,86 % de la variabilidad total y permite identificar diferencias entre los países en términos de desarrollo socioeconómico y dinámica económica-demográfica.
En el CP1, la República Centroafricana (-10,29), Níger (-7,46) y Chad (-7,28) presentan las puntuaciones más negativas, mientras que Luxemburgo (3,64), Singapur (3,60) y Suiza (3,02) se ubican en el extremo positivo. Esta separación es coherente con la interpretación del CP1 como una dimensión de desarrollo socioeconómico, asociada positivamente con el acceso a servicios básicos, el ingreso por habitante y la esperanza de vida, y negativamente con la fecundidad y la mortalidad infantil.
Por su parte, el CP2 distingue a Omán (3,94), Arabia Saudita (3,65) y Kuwait (3,40), con las puntuaciones positivas más altas, de Ucrania (-3,65), Palaos (-3,60) y Moldavia (-3,42), situados en el extremo negativo. Estas diferencias corresponden a una dimensión vinculada principalmente con el crecimiento económico y poblacional, en contraste con la inflación y la superficie forestal.
Colombia se ubica cerca del origen, con puntuaciones de 0,94 en CP1 y -0,10 en CP2, sin presentar un comportamiento extremo en ninguna de las dos dimensiones. En conjunto, el gráfico evidencia diferencias importantes entre los países, especialmente en el componente asociado con el desarrollo socioeconómico. No obstante, la interpretación de las distancias debe limitarse a las dimensiones representadas.
grafico_paises_acp(3, 4)
El plano formado por los componentes CP3 y CP4 explica conjuntamente el 15,80 % de la variabilidad total, permitiendo examinar diferencias complementarias relacionadas con las características ambientales, territoriales, comerciales y demográficas de los países.
En el CP3, Palaos (-4,67), la República Centroafricana (-4,30) y Gabón (-3,41) presentan las puntuaciones más negativas, mientras que Líbano (3,22), Moldavia (2,55) y Kazajistán (2,24) registran las más positivas. Esta distribución refleja el contraste representado por el componente entre la superficie agrícola, con carga positiva, y la cobertura forestal y las áreas protegidas, con cargas negativas. La inflación también participa en esta dimensión, aunque con una contribución menor.
En el CP4, Luxemburgo (3,82), Palaos (2,63) y Yibuti (1,69) presentan las puntuaciones positivas más elevadas, mientras que Fiyi (-2,08), Indonesia (-1,75) e India (-1,74) se encuentran en el extremo negativo. Este componente sintetiza principalmente diferencias relacionadas con las áreas protegidas, el comercio internacional, el crecimiento poblacional y la urbanización, aunque su interpretación es menos definida que la de los componentes anteriores.
Colombia presenta puntuaciones negativas en ambos componentes, con -0,62 en CP3 y -0,93 en CP4, ubicándose en el cuadrante inferior izquierdo. En conjunto, el plano permite identificar diferencias adicionales entre los países que no se aprecian en las dos primeras dimensiones. Sin embargo, debido a su menor porcentaje de varianza explicada, estos resultados deben considerarse complementarios al análisis del plano CP1–CP2.
tabla_extremos <- do.call(
rbind,
lapply(1:4, function(i) {
d <- data.frame(
Pais = base_final$Pais,
Puntaje = modelo_acp$x[, i]
)
bajos <- head(d[order(d$Puntaje), ], 3)
altos <- head(d[order(-d$Puntaje), ], 3)
presentar <- function(x) {
paste0(
x$Pais,
" (",
formatC(
x$Puntaje,
format = "f",
digits = 2,
decimal.mark = ","
),
")",
collapse = "; "
)
}
data.frame(
Componente = c(
"CP1 · Desarrollo socioeconómico",
"CP2 · Dinámica económica y demográfica",
"CP3 · Uso agrícola frente a conservación ambiental",
"CP4 · Protección territorial y apertura comercial"
)[i],
Bajos = presentar(bajos),
Altos = presentar(altos)
)
})
)
filas <- lapply(seq_len(nrow(tabla_extremos)), function(i) {
htmltools::tags$tr(
htmltools::tags$td(tabla_extremos$Componente[i]),
htmltools::tags$td(tabla_extremos$Bajos[i]),
htmltools::tags$td(tabla_extremos$Altos[i])
)
})
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(estilo_resumen)
),
htmltools::tags$div(
class = "cocoa-resumen",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / RESULTADOS DEL MODELO · ACP"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Países con puntuaciones extremas"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"Tres valores más bajos y más altos por componente"
)
),
htmltools::tags$div(
style = "overflow-x:auto;",
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
htmltools::tags$th("Componente"),
htmltools::tags$th("Puntuaciones más bajas"),
htmltools::tags$th("Puntuaciones más altas")
)
),
htmltools::tags$tbody(filas)
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
"Fuente: elaboración propia a partir de las puntuaciones del ACP."
)
)
)
)
| Componente | Puntuaciones más bajas | Puntuaciones más altas |
|---|---|---|
| CP1 · Desarrollo socioeconómico | República Centroafricana (-10,29); Níger (-7,46); Chad (-7,28) | Luxemburgo (3,64); Singapur (3,60); Suiza (3,02) |
| CP2 · Dinámica económica y demográfica | Ucrania (-3,65); Palaos (-3,60); Moldavia (-3,42) | Omán (3,94); Arabia Saudí (3,65); Kuwait (3,40) |
| CP3 · Uso agrícola frente a conservación ambiental | Palaos (-4,67); República Centroafricana (-4,30); Gabón (-3,41) | Líbano (3,22); Moldavia (2,55); Kazajistán (2,24) |
| CP4 · Protección territorial y apertura comercial | Fiyi (-2,08); Indonesia (-1,75); India (-1,74) | Luxemburgo (3,82); Palaos (2,63); Yibuti (1,69) |
La tabla permite identificar los países con las puntuaciones más extremas en cada uno de los cuatro componentes principales. En el CP1 se observa una marcada separación entre la República Centroafricana, Níger y Chad, con puntuaciones negativas, y Luxemburgo, Singapur y Suiza, con puntuaciones positivas, lo que evidencia diferencias en las condiciones de desarrollo socioeconómico.
En los componentes restantes destacan países con perfiles particulares en las dimensiones económicas, demográficas y ambientales. Estos resultados complementan los gráficos de dispersión y permiten reconocer las observaciones más alejadas del centro de cada componente. No obstante, las puntuaciones extremas reflejan posiciones relativas dentro del ACP y no deben interpretarse como una clasificación general de los países.
El círculo de correlaciones permite analizar las relaciones entre los indicadores originales y los componentes principales obtenidos mediante el ACP. Cada variable se representa mediante una flecha cuya dirección indica el signo de su correlación con los componentes, mientras que su longitud refleja qué tan bien está representada en el plano.
Las variables que apuntan en direcciones similares presentan correlaciones positivas entre sí, mientras que aquellas que apuntan en direcciones opuestas tienden a presentar correlaciones negativas. Por su parte, las flechas aproximadamente perpendiculares indican relaciones lineales débiles. (Kassambara y Mundt, 2020)
Para este análisis se presentan los círculos correspondientes a los planos CP1–CP2 y CP3–CP4, que permiten examinar las relaciones entre los 16 indicadores desde distintas dimensiones del desarrollo.
circulo_correlaciones(
colnames(correl_var)[1],
colnames(correl_var)[2]
)
El primer plano factorial, conformado por CP1 y CP2, explica conjuntamente el 58,86 % de la variabilidad total de los 16 indicadores analizados. En el CP1 se observa una separación clara entre las variables asociadas con mejores condiciones socioeconómicas y aquellas relacionadas con mayores limitaciones estructurales. Hacia el extremo positivo se agrupan el acceso a internet, el agua potable, el PIB per cápita, la electricidad y la esperanza de vida, cuyas flechas presentan direcciones similares y elevadas correlaciones con este componente. En sentido contrario se encuentran la fecundidad, la mortalidad infantil y la participación de la agricultura en el PIB, evidenciando una asociación negativa con los indicadores anteriores.
Por su parte, el CP2 permite distinguir una dimensión de dinamismo económico y demográfico. El crecimiento del PIB y el crecimiento poblacional presentan correlaciones positivas, mientras que la inflación se orienta hacia el extremo negativo, lo que refleja comportamientos contrapuestos dentro de este componente.
En conjunto, el plano muestra que el CP1 sintetiza principalmente las diferencias estructurales de desarrollo entre países, mientras que el CP2 incorpora variaciones relacionadas con el crecimiento y la presión inflacionaria. Las variables ambientales, en general, presentan una representación menos destacada en este plano, lo que sugiere que parte de su variabilidad se explica mediante componentes posteriores.
circulo_correlaciones(
colnames(correl_var)[3],
colnames(correl_var)[4]
)
El segundo plano factorial, integrado por CP3 y CP4, explica conjuntamente el 15,80 % de la variabilidad total y permite identificar relaciones que no se encuentran suficientemente representadas en los dos primeros componentes, especialmente aquellas vinculadas con las características ambientales y territoriales de los países.
En el CP3 destaca la oposición entre la superficie agrícola, ubicada en el extremo positivo, y la superficie forestal y las áreas protegidas, orientadas hacia el extremo negativo. Esta distribución refleja un contraste entre el uso agrícola del territorio y la presencia de superficies forestales y espacios de conservación. La inflación también presenta una correlación positiva con este componente, aunque corresponde a una dimensión económica diferente de las variables ambientales.
En el CP4 sobresalen las correlaciones positivas de las áreas protegidas y el comercio internacional, acompañadas, en menor medida, por el crecimiento poblacional y la población urbana. En contraste, el crecimiento del PIB y el acceso a electricidad presentan correlaciones negativas de menor magnitud.
Por tanto, el CP3 permite interpretar principalmente las diferencias en el uso y la conservación del territorio, mientras que el CP4 recoge una combinación de características ambientales, comerciales y demográficas. Aunque ambos componentes explican una proporción menor de la variabilidad total, complementan el análisis al revelar patrones que no quedan reflejados en la dimensión principal del desarrollo socioeconómico.
Con el propósito de integrar los resultados del Análisis de Componentes Principales, se presenta una exploración multivariada de los países y los indicadores estudiados. A diferencia de las representaciones bidimensionales anteriores, este análisis incorpora simultáneamente los tres primeros componentes principales, que en conjunto explican el 68,93 % de la variabilidad, lo que permite examinar patrones y diferencias entre países desde una perspectiva más amplia.
Para ello, se construye un atlas interactivo que combina la distribución tridimensional de los países, las relaciones entre las variables originales y la comparación de perfiles nacionales. Se destaca especialmente la posición de Colombia, con el fin de contextualizar sus características frente al conjunto de países analizados. (Sievert, 2020)
library(plotly)
library(htmltools)
atlas <- data.frame(
Pais = base$Pais,
Codigo = base$Codigo_pais,
Continente = as.character(base$Continente),
CP1 = modelo_acp$x[, 1],
CP2 = modelo_acp$x[, 2],
CP3 = modelo_acp$x[, 3],
CP4 = modelo_acp$x[, 4]
)
r_atlas <- sweep(modelo_acp$rotation[, 1:3], 2, modelo_acp$sdev[1:3], "*")
# Correlación con el CP4 (orientado para que valores altos = más áreas protegidas)
r4_atlas <- modelo_acp$rotation[, 4] * modelo_acp$sdev[4]
if (r4_atlas["Areas_protegidas"] < 0) {
r4_atlas <- -r4_atlas
atlas$CP4 <- -atlas$CP4
}
etq_atlas <- c(
PIB_per_capita = "PIB per cápita", Crecimiento_PIB = "Crec. PIB",
Inflacion = "Inflación", Comercio_internacional = "Comercio",
Agricultura_PIB = "Agricultura", Esperanza_vida = "Esperanza de vida",
Fecundidad = "Fecundidad", Mortalidad_infantil = "Mortalidad infantil",
Acceso_agua = "Agua potable", Poblacion_urbana = "Pob. urbana",
Crecimiento_poblacional = "Crec. poblacional", Acceso_electricidad = "Electricidad",
Usuarios_internet = "Internet", Superficie_agricola = "Sup. agrícola",
Superficie_forestal = "Sup. forestal", Areas_protegidas = "Áreas protegidas"
)
dim_atlas <- setNames(rep(nombres_dim, lengths(dimensiones)), unlist(dimensiones))
col_dim_atlas <- setNames(c("#B77A4D", "#8B6B54", "#C9953F", "#5F7F6E"), nombres_dim)
pal_cont <- c("África" = "#C47758", "América" = "#D4A66C", "Asia" = "#789184",
"Europa" = "#51382C", "Oceanía" = "#7C93A6")
fmt2 <- function(x) formatC(x, format = "f", digits = 2, decimal.mark = ",")
pct <- function(j) formatC(porcentaje_varianza[j], format = "f", digits = 2, decimal.mark = ",")
esc <- 0.95 * max(abs(as.matrix(atlas[, c("CP1", "CP2", "CP3")])))
unit <- r_atlas / sqrt(rowSums(r_atlas^2))
grupo <- rep(NA_integer_, nrow(unit))
g <- 0
for (i in seq_len(nrow(unit))) {
if (is.na(grupo[i])) {
g <- g + 1
cerca <- is.na(grupo) & sqrt(rowSums(sweep(unit, 2, unit[i, ])^2)) < 0.6
grupo[cerca] <- g
}
}
etq_3d <- do.call(rbind, lapply(split(seq_len(nrow(r_atlas)), grupo), function(idx) {
sub_r <- r_atlas[idx, , drop = FALSE]
m <- colMeans(sub_r)
f <- esc * (max(sqrt(rowSums(sub_r^2))) + 0.30) / sqrt(sum(m^2))
data.frame(x = m[1] * f, y = m[2] * f, z = m[3] * f,
texto = paste(etq_atlas[rownames(sub_r)], collapse = "<br>"))
}))
p <- plot_ly(height = 760)
for (k in names(pal_cont)) {
d <- atlas[atlas$Continente == k & atlas$Codigo != "COL", ]
p <- add_trace(
p, type = "scatter3d", mode = "markers", name = k, inherit = FALSE,
x = d$CP1, y = d$CP2, z = d$CP3,
text = paste0("<b>", d$Pais, "</b><br>", k,
"<br>CP1: ", fmt2(d$CP1),
"<br>CP2: ", fmt2(d$CP2),
"<br>CP3: ", fmt2(d$CP3),
"<br>CP4: ", fmt2(d$CP4)),
hoverinfo = "text",
marker = list(size = 5.5, color = pal_cont[[k]], opacity = 0.82,
line = list(color = "#FFFCF7", width = 0.5))
)
}
# CP4: los mismos países coloreados según su puntuación en el CP4
# (oculta al inicio; se activa desde el menú con "④ Color según CP4")
d4 <- atlas[atlas$Codigo != "COL", ]
p <- add_trace(
p, type = "scatter3d", mode = "markers", name = "CP4", inherit = FALSE,
visible = FALSE, showlegend = FALSE,
x = d4$CP1, y = d4$CP2, z = d4$CP3,
text = paste0("<b>", d4$Pais, "</b><br>", d4$Continente,
"<br><b>CP4: ", fmt2(d4$CP4), "</b>",
"<br>CP1: ", fmt2(d4$CP1),
"<br>CP2: ", fmt2(d4$CP2),
"<br>CP3: ", fmt2(d4$CP3)),
hoverinfo = "text",
marker = list(
size = 6.5, color = d4$CP4, cmin = -2, cmax = 2,
colorscale = list(list(0, "#2F5C4A"), list(0.25, "#7FA08F"), list(0.5, "#EADFD2"),
list(0.75, "#C98A62"), list(1, "#8E3B1E")),
line = list(color = "#51382C", width = 0.6),
colorbar = list(title = list(text = "<b>CP4</b><br>Protección territorial<br>y apertura",
font = list(size = 11, color = "#51382C")),
len = 0.5, thickness = 14, x = 0.98, outlinewidth = 0,
tickfont = list(size = 10, color = "#806653"))
)
)
for (dmn in nombres_dim) {
vs <- names(dim_atlas)[dim_atlas == dmn]
X <- as.vector(rbind(0, esc * r_atlas[vs, 1], NA))
Y <- as.vector(rbind(0, esc * r_atlas[vs, 2], NA))
Z <- as.vector(rbind(0, esc * r_atlas[vs, 3], NA))
p <- add_trace(
p, type = "scatter3d", mode = "lines", name = paste("Flechas", dmn), inherit = FALSE,
x = X, y = Y, z = Z, line = list(color = col_dim_atlas[[dmn]], width = 6),
hoverinfo = "skip", showlegend = FALSE
)
p <- add_trace(
p, type = "scatter3d", mode = "markers", name = paste("Puntas", dmn), inherit = FALSE,
x = esc * r_atlas[vs, 1], y = esc * r_atlas[vs, 2], z = esc * r_atlas[vs, 3],
text = paste0("<b>", etq_atlas[vs], "</b><br>Dimensión ", tolower(dmn),
"<br>r con CP1: ", fmt2(r_atlas[vs, 1]),
"<br>r con CP2: ", fmt2(r_atlas[vs, 2]),
"<br>r con CP3: ", fmt2(r_atlas[vs, 3]),
"<br>r con CP4: ", fmt2(r4_atlas[vs])),
hoverinfo = "text",
marker = list(size = 4.5, color = col_dim_atlas[[dmn]], symbol = "diamond"),
showlegend = FALSE
)
}
p <- add_trace(
p, type = "scatter3d", mode = "text", name = "Variables", inherit = FALSE,
x = etq_3d$x, y = etq_3d$y, z = etq_3d$z, text = etq_3d$texto,
textfont = list(size = 11.5, color = "#3B2A22"),
hoverinfo = "skip", showlegend = FALSE
)
col_p <- atlas[atlas$Codigo == "COL", ]
z_piso <- min(atlas$CP3)
z_rot <- col_p$CP3 + 5.2
p <- add_trace(p, type = "scatter3d", mode = "lines", name = "Colombia piso", inherit = FALSE,
x = rep(col_p$CP1, 2), y = rep(col_p$CP2, 2), z = c(z_piso, col_p$CP3),
line = list(color = "#C47758", width = 4, dash = "dash"),
hoverinfo = "skip", showlegend = FALSE)
p <- add_trace(p, type = "scatter3d", mode = "lines", name = "Colombia tallo", inherit = FALSE,
x = rep(col_p$CP1, 2), y = rep(col_p$CP2, 2), z = c(col_p$CP3, z_rot - 0.5),
line = list(color = "#C47758", width = 3),
hoverinfo = "skip", showlegend = FALSE)
p <- add_trace(p, type = "scatter3d", mode = "markers", name = "Colombia halo", inherit = FALSE,
x = col_p$CP1, y = col_p$CP2, z = col_p$CP3,
marker = list(size = 22, color = "rgba(196,119,88,0.18)"),
hoverinfo = "skip", showlegend = FALSE)
p <- add_trace(p, type = "scatter3d", mode = "text", name = "Colombia rótulo", inherit = FALSE,
x = col_p$CP1, y = col_p$CP2, z = z_rot, text = "<b>COLOMBIA</b>",
textfont = list(size = 14, color = "#A85D3F"),
hoverinfo = "skip", showlegend = FALSE)
p <- add_trace(p, type = "scatter3d", mode = "markers", name = "Colombia", inherit = FALSE,
x = col_p$CP1, y = col_p$CP2, z = col_p$CP3,
text = paste0("<b>Colombia</b><br>CP1: ", fmt2(col_p$CP1),
"<br>CP2: ", fmt2(col_p$CP2), "<br>CP3: ", fmt2(col_p$CP3),
"<br>CP4: ", fmt2(col_p$CP4)),
hoverinfo = "text",
marker = list(size = 9, color = "#C47758", symbol = "diamond",
line = list(color = "#51382C", width = 2)))
todo <- list(
x = c(atlas$CP1, esc * r_atlas[, 1], etq_3d$x),
y = c(atlas$CP2, esc * r_atlas[, 2], etq_3d$y),
z = c(atlas$CP3, esc * r_atlas[, 3], etq_3d$z, z_rot)
)
rango <- lapply(todo, function(v) { m <- 0.22 * diff(range(v)); range(v) + c(-m, m) })
eje <- function(titulo, r) list(
title = list(text = titulo, font = list(size = 12, color = "#51382C")),
range = r, backgroundcolor = "#FBF6EF", showbackground = TRUE,
gridcolor = "#E9DDD0", zerolinecolor = "#C9A27E", zerolinewidth = 5,
tickfont = list(size = 9, color = "#A08A78"), showspikes = FALSE
)
camara <- function(ex, ey, ez, up = c(0, 0, 1), centro = c(0, 0, 0)) list(
eye = list(x = ex, y = ey, z = ez),
up = list(x = up[1], y = up[2], z = up[3]),
center = list(x = centro[1], y = centro[2], z = centro[3])
)
camaras <- list(
"◉ Vista general" = camara(1.15, -1.25, 0.70),
"① Eje del desarrollo" = camara(0.05, -2.30, 0.15),
"② Coyuntura 2022" = camara(2.30, 0.05, 0.15),
"③ Dimensión ambiental" = camara(0.10, 0.10, 2.40, up = c(0, 1, 0)),
"★ Colombia" = camara(0.75, -0.85, 0.45, centro = c(0.1, 0, -0.05))
)
p <- plotly_build(p)
p$x$data <- Filter(function(t) identical(t$type, "scatter3d"), p$x$data)
nombres_traza <- vapply(p$x$data, function(t) if (is.null(t$name)) "" else t$name, "")
es_pais <- nombres_traza %in% names(pal_cont)
es_cp4 <- nombres_traza == "CP4"
visible_si <- function(k) {
if (k == "CP4") return(!es_pais) # países coloreados por CP4
if (k == "Todos") return(!es_cp4) # países por continente
!es_cp4 & (!es_pais | nombres_traza == k) # un solo continente
}
p$x$layout <- modifyList(p$x$layout, list(
paper_bgcolor = "#FFFCF7",
font = list(family = "Satoshi, Arial, sans-serif", color = "#51382C"),
margin = list(l = 0, r = 0, t = 60, b = 0),
showlegend = TRUE,
legend = list(x = 0.99, xanchor = "right", y = 0.5, yanchor = "middle",
bgcolor = "rgba(255,252,247,0.85)", bordercolor = "#E8DED1",
borderwidth = 1, font = list(size = 11)),
hoverlabel = list(bgcolor = "#51382C", bordercolor = "#D4A66C",
font = list(color = "#FFFCF7", size = 12), align = "left"),
scene = list(
xaxis = eje(paste0("CP1 · Desarrollo (", pct(1), " %)"), rango$x),
yaxis = eje(paste0("CP2 · Dinamismo vs. inflación (", pct(2), " %)"), rango$y),
zaxis = eje(paste0("CP3 · Agro vs. conservación (", pct(3), " %)"), rango$z),
aspectmode = "cube",
camera = camaras[[1]]
),
updatemenus = list(
list(type = "buttons", direction = "right", showactive = TRUE, active = 0,
x = 0.01, xanchor = "left", y = 1, yanchor = "top",
pad = list(t = 8, l = 8), bgcolor = "#F5EADF", bordercolor = "#E4D4C2",
font = list(size = 12, color = "#51382C"),
buttons = unname(Map(function(lab, cam)
list(label = lab, method = "relayout", args = list("scene.camera", cam)),
names(camaras), camaras))),
list(type = "dropdown", x = 0.99, xanchor = "right", y = 1, yanchor = "top",
pad = list(t = 8, r = 8), bgcolor = "#FFFCF7", bordercolor = "#D4A66C",
font = list(size = 12, color = "#51382C"),
buttons = lapply(c("Todos", names(pal_cont)), function(k)
list(label = if (k == "Todos") "Todos los continentes" else k,
method = "restyle", args = list("visible", visible_si(k))))),
list(type = "buttons", showactive = TRUE, active = -1,
x = 0.99, xanchor = "right", y = 0.93, yanchor = "top",
pad = list(r = 8), bgcolor = "#F5EADF", bordercolor = "#D4A66C",
font = list(size = 12, color = "#51382C"),
buttons = list(list(
label = "④ Protección territorial y apertura",
method = "restyle",
args = list("visible", visible_si("CP4")), # primer clic: color según CP4
args2 = list("visible", visible_si("Todos")) # segundo clic: vuelve a continentes
)))
)
))
p <- config(p, displaylogo = FALSE, responsive = TRUE)
cps <- paste0("CP", 1:4)
nom_cps <- c("CP1 · Desarrollo", "CP2 · Dinamismo vs. inflación",
"CP3 · Agro vs. conservación", "CP4 · Protección y apertura")
filas <- lapply(1:4, function(j) {
v <- atlas[[cps[j]]]
pos <- 100 * (col_p[[cps[j]]] - min(v)) / diff(range(v))
cero <- 100 * (0 - min(v)) / diff(range(v))
supera <- round(100 * mean(v < col_p[[cps[j]]]))
tags$div(class = "atl-cp",
tags$span(nom_cps[j]),
tags$div(class = "atl-track",
tags$b(style = paste0("left:", round(cero, 1), "%")),
tags$i(style = paste0("left:", round(pos, 1), "%"),
title = paste0("Supera al ", supera, " % de los países"))),
tags$span(tags$strong(fmt2(col_p[[cps[j]]]))))
})
dist_col <- sqrt(rowSums(sweep(as.matrix(atlas[, cps]), 2, unlist(col_p[cps]))^2))
vecinos <- atlas[atlas$Codigo != "COL", ]
vecinos$d <- dist_col[atlas$Codigo != "COL"]
vecinos <- head(vecinos[order(vecinos$d), ], 6)
chips <- lapply(seq_len(nrow(vecinos)), function(i)
tags$div(class = "atl-chip", paste0(i, ". ", vecinos$Pais[i]),
tags$span(fmt2(vecinos$d[i]))))
estilo_atlas <- tags$style(HTML("
.atl-head{background:linear-gradient(120deg,#2E211B,#51382C 60%,#6B4A38);border-radius:18px 18px 0 0;padding:22px 28px;color:#FFFCF7;margin-top:10px}
.atl-head small{font:700 10px 'Satoshi',Arial,sans-serif;letter-spacing:2px;color:#D4A66C;text-transform:uppercase}
.atl-head h3{font:400 26px 'Fraunces',Georgia,serif;margin:6px 0 4px;color:#FFFCF7;border:none;padding:0}
.atl-head p{margin:0;color:#E9D8C5;font-size:13px}
.atl-body{background:#FFFCF7;border:1px solid #E8DED1;border-top:none;border-radius:0 0 18px 18px;box-shadow:0 14px 40px rgba(91,58,40,.10);overflow:hidden}
.atl-body .html-widget.plotly{border:none!important;box-shadow:none!important;margin:0!important;border-radius:0!important}
.atl-ficha{display:grid;grid-template-columns:1.1fr 1fr;gap:18px;margin:22px 0 30px}
.atl-card{background:#FFFCF7;border:1px solid #E8DED1;border-radius:16px;padding:18px 20px;box-shadow:0 8px 24px rgba(91,58,40,.06)}
.atl-card small{font:700 10px 'Satoshi',Arial,sans-serif;letter-spacing:1.8px;text-transform:uppercase;color:#B77A4D}
.atl-card h4{font:400 22px 'Fraunces',Georgia,serif;margin:4px 0 12px;color:#40352E}
.atl-cp{display:grid;grid-template-columns:150px 1fr 48px;gap:10px;align-items:center;margin:9px 0;font-size:12.5px}
.atl-track{position:relative;height:10px;background:#F1E7DC;border-radius:6px}
.atl-track i{position:absolute;top:-4px;width:18px;height:18px;border-radius:50%;background:#C47758;border:3px solid #FFFCF7;box-shadow:0 2px 6px rgba(81,56,44,.3);transform:translateX(-50%)}
.atl-track b{position:absolute;top:-3px;width:2px;height:16px;background:#D9C7B6}
.atl-chips{display:flex;flex-wrap:wrap;gap:8px}
.atl-chip{background:#F5EADF;border:1px solid #E4D4C2;border-radius:30px;padding:7px 13px;font-size:12.5px;color:#51382C}
.atl-chip span{color:#B77A4D;font-weight:700;margin-left:6px}
.atl-nota{font-size:11.5px;color:#937661;margin-top:10px}
@media(max-width:760px){.atl-ficha{grid-template-columns:1fr}.atl-cp{grid-template-columns:110px 1fr 44px}}
"))
tagList(
estilo_atlas,
tags$div(class = "atl-head",
tags$small("Atlas del desarrollo mundial"),
tags$h3(paste(nrow(atlas), "países y", nrow(r_atlas), "indicadores en un mismo espacio"))),
tags$div(class = "atl-body", p),
tags$div(class = "atl-ficha",
tags$div(class = "atl-card",
tags$small("Ficha de Colombia"),
tags$h4("Posición en los cuatro componentes"),
filas,
tags$div(class = "atl-nota",
"La línea gris marca el cero; el punto, la posición de Colombia entre el país con menor y el de mayor puntuación.")),
tags$div(class = "atl-card",
tags$small("Vecinos estadísticos"),
tags$h4("Los países más parecidos a Colombia"),
tags$div(class = "atl-chips", chips),
tags$div(class = "atl-nota",
"Distancia euclidiana en el espacio de los cuatro componentes (menor = más parecido).")))
)
El Atlas Interactivo del Desarrollo Mundial permite analizar simultáneamente la distribución de los 144 países y las relaciones entre los 16 indicadores, utilizando los tres primeros componentes principales, que explican conjuntamente el 68,93 % de la variabilidad total. La representación tridimensional complementa los gráficos anteriores al incorporar una dimensión adicional y facilitar la identificación de países con perfiles similares, diferencias estructurales y observaciones alejadas del conjunto.
Distribución de los países y patrones regionales. La separación más evidente se presenta sobre el CP1, asociado con el desarrollo socioeconómico. En su extremo negativo se encuentran países como República Centroafricana, Níger y Chad, caracterizados por puntuaciones vinculadas con mayores limitaciones en los indicadores de desarrollo. En contraste, países como Luxemburgo, Singapur y Suiza presentan puntuaciones positivas elevadas. Aunque se observan ciertas tendencias regionales, los continentes no forman grupos completamente separados: dentro de una misma región existen diferencias importantes, especialmente en Asia y América. Esto demuestra que la ubicación geográfica no determina por sí sola el perfil multivariado de un país.
Relaciones entre las variables. Las flechas incorporadas al espacio tridimensional permiten identificar los indicadores asociados con cada dirección. El acceso a internet, el agua potable, el PIB per cápita, la electricidad y la esperanza de vida se orientan principalmente hacia el extremo positivo del CP1, mientras que la fecundidad, la mortalidad infantil y la participación de la agricultura en el PIB apuntan en sentido contrario. En el CP2 destacan el crecimiento económico y poblacional frente a la inflación, mientras que el CP3 refleja el contraste entre la superficie agrícola y las variables relacionadas con la cobertura forestal y las áreas protegidas. De esta manera, el atlas muestra que las diferencias entre países responden a una combinación de características económicas, sociales, demográficas, tecnológicas y ambientales.
Posición de Colombia. Colombia presenta puntuaciones de 0,94 en CP1, −0,10 en CP2, −0,62 en CP3 y −0,93 en CP4. Su posición ligeramente positiva en el primer componente indica un perfil socioeconómico superior al promedio de las puntuaciones de la muestra, aunque distante de los países ubicados en el extremo de mayor desarrollo. En el CP2, su valor cercano a cero señala una posición intermedia respecto al dinamismo económico, demográfico y la presión inflacionaria. La puntuación negativa del CP3 la sitúa hacia el lado relacionado con la cobertura forestal y la conservación territorial, mientras que su valor negativo en el CP4 refleja una posición opuesta al extremo positivo que combina protección territorial, apertura comercial y otras características demográficas. Estas puntuaciones representan posiciones relativas dentro del ACP y no deben interpretarse como evaluaciones individuales de cada indicador.
Países estadísticamente cercanos a Colombia. El análisis de distancias euclidianas, calculadas a partir de los cuatro componentes principales seleccionados, identifica a China (0,71), Perú (0,74), Georgia (0,80), República Dominicana (0,81), Ecuador (0,97) y Montenegro (1,09) como los países más próximos a Colombia en el espacio factorial. La presencia de países de distintas regiones evidencia que es posible encontrar perfiles multivariados semejantes sin compartir necesariamente una ubicación geográfica. Sin embargo, esta proximidad no implica igualdad en los niveles de ingreso, bienestar o desarrollo, sino similitud en la combinación de características sintetizadas por los componentes.
Integración de los resultados. La exploración interactiva permite examinar los componentes desde diferentes perspectivas, filtrar países por continente y visualizar el CP4 mediante una escala de colores, sin modificar los tres ejes principales. En conjunto, los resultados evidencian que el desarrollo mundial presenta diferencias estructurales marcadas, pero también patrones compartidos entre países geográficamente distantes. Por tanto, el ACP proporciona una representación resumida de las principales dimensiones del desarrollo y constituye una base útil para la siguiente etapa del análisis, en la que se buscará identificar grupos de países con perfiles estadísticos similares mediante técnicas de agrupamiento jerárquico.
Con el propósito de identificar grupos de países con características similares, se aplicó el método de agrupamiento jerárquico aglomerativo de Ward sobre las puntuaciones de los cuatro componentes principales seleccionados mediante el ACP. Estos componentes explican conjuntamente el 74,65 % de la variabilidad de los 16 indicadores originales.
El método de Ward agrupa progresivamente los países buscando minimizar el incremento de la variabilidad interna de los conglomerados. De esta manera, se pretende obtener grupos relativamente homogéneos que permitan reconocer similitudes y diferencias en las condiciones económicas, sociales, demográficas, tecnológicas y ambientales de los 144 países estudiados.
La suma de cuadrados dentro de los conglomerados (Within-Cluster Sum of Squares, WCSS) se define como:
\[ WCSS=\sum_{g=1}^{K}\sum_{i\in C_g} \left\|\mathbf{z}_i-\bar{\mathbf{z}}_g\right\|^2 \]
Donde \(K\) representa el número de conglomerados, \(C_g\) el conjunto de países pertenecientes al conglomerado \(g\), \(\mathbf{z}_i\) las puntuaciones factoriales del país \(i\) y \(\bar{\mathbf{z}}_g\) el centroide correspondiente.
Para seleccionar una partición adecuada, se analizarán tres criterios complementarios: el dendrograma jerárquico, el método del codo y el coeficiente promedio de silueta. La decisión final también considerará la interpretación de los perfiles de desarrollo obtenidos.
La elección del número de conglomerados constituye una etapa fundamental del análisis, pues determina el nivel de detalle con el que se clasifican los países.
En primer lugar, se examina el dendrograma del método Ward, que representa gráficamente las fusiones realizadas durante el agrupamiento jerárquico. Posteriormente, se evalúa la reducción de la variabilidad interna mediante el método del codo y la separación entre grupos a través del coeficiente promedio de silueta.
La comparación de estos criterios permitirá evaluar si una clasificación más general o una segmentación más detallada representa adecuadamente las diferencias observadas entre países.
n <- length(modelo_ward$order)
grupos4 <- unname(cutree(modelo_ward, k = 4))
altura_corte <- mean(modelo_ward$height[c(n - 4, n - 3)])
altura_max <- max(modelo_ward$height)
paleta_ward <- c("#B77A4D", "#789184", "#D4A66C", "#8B6B54")
color_arriba <- "#BFAE9F" # ramas por encima del corte
# ---- Coordenadas de las ramas, separadas por cluster ----
posiciones <- numeric(n)
posiciones[modelo_ward$order] <- seq_len(n)
centros <- numeric(n - 1)
grupo_nodo <- integer(n - 1) # 0 = rama por encima del corte
x_seg <- rep(list(numeric(0)), 5) # 1 = arriba del corte, 2 a 5 = clusters
y_seg <- rep(list(numeric(0)), 5)
for (i in seq_len(n - 1)) {
a <- modelo_ward$merge[i, 1]
b <- modelo_ward$merge[i, 2]
xa <- if (a < 0) posiciones[-a] else centros[a]
xb <- if (b < 0) posiciones[-b] else centros[b]
ya <- if (a < 0) 0 else modelo_ward$height[a]
yb <- if (b < 0) 0 else modelo_ward$height[b]
h <- modelo_ward$height[i]
ga <- if (a < 0) grupos4[-a] else grupo_nodo[a]
gb <- if (b < 0) grupos4[-b] else grupo_nodo[b]
grupo_nodo[i] <- if (ga == gb && ga > 0) ga else 0L
j <- grupo_nodo[i] + 1
x_seg[[j]] <- c(x_seg[[j]], xa, xa, NA, xa, xb, NA, xb, xb, NA)
y_seg[[j]] <- c(y_seg[[j]], ya, h, NA, h, h, NA, h, yb, NA)
centros[i] <- (xa + xb) / 2
}
# ---- Hojas (países) ----
hojas <- data.frame(
x = seq_len(n),
Codigo = modelo_ward$labels[modelo_ward$order],
Cluster = grupos4[modelo_ward$order]
)
hojas$Pais <- base_final$Pais[match(hojas$Codigo, base_final$Codigo_pais)]
# ---- Gráfico ----
p <- plotly::plot_ly(height = 600)
for (j in 1:5) {
p <- plotly::add_trace(
p, x = x_seg[[j]], y = y_seg[[j]],
type = "scatter", mode = "lines", connectgaps = FALSE,
line = list(color = if (j == 1) color_arriba else paleta_ward[j - 1],
width = if (j == 1) 1.8 else 1.5),
hoverinfo = "skip", showlegend = FALSE
)
}
franjas <- list()
etiquetas_cluster <- list()
for (g in 1:4) {
sub <- hojas[hojas$Cluster == g, ]
p <- plotly::add_trace(
p, x = sub$x, y = rep(0, nrow(sub)),
type = "scatter", mode = "markers",
marker = list(size = 6, color = paleta_ward[g],
line = list(color = "#FFFCF7", width = 1)),
text = paste0("<b>", sub$Pais, "</b><br>Cluster ", g),
hovertemplate = "%{text}<extra></extra>",
showlegend = FALSE
)
x0 <- min(sub$x) - 0.5
x1 <- max(sub$x) + 0.5
franjas[[g]] <- list(
type = "rect", x0 = x0, x1 = x1, y0 = 0, y1 = altura_corte,
fillcolor = paleta_ward[g], opacity = 0.08,
line = list(width = 0), layer = "below"
)
etiquetas_cluster[[g]] <- list(
x = (x0 + x1) / 2, y = -0.03 * altura_max, yanchor = "top",
showarrow = FALSE, align = "center",
text = paste0("<b>Cluster ", g, "</b><br>", nrow(sub), " países"),
font = list(size = 12, color = paleta_ward[g])
)
}
linea_corte <- list(
type = "line", x0 = 0, x1 = n + 1, y0 = altura_corte, y1 = altura_corte,
line = list(color = "#C47758", width = 2, dash = "dash")
)
texto_corte <- list(
x = n + 1, y = altura_corte, xanchor = "right", yanchor = "bottom",
showarrow = FALSE, text = "<b>Corte: k = 4</b>",
font = list(size = 12, color = "#C47758")
)
p <- plotly::layout(
p,
title = list(
text = paste0(
"<b>Dendrograma jerárquico de Ward.D2</b>",
"<br><span style='font-size:12px;color:#937661'>",
n, " países · 4 componentes principales · Pasa el mouse por las hojas para ver cada país",
"</span>"
),
x = 0.5, xanchor = "center", y = 0.96,
font = list(family = "Fraunces, Georgia, serif", size = 19, color = "#51382C")
),
xaxis = list(title = "", showticklabels = FALSE, showgrid = FALSE,
zeroline = FALSE, range = c(0, n + 1)),
yaxis = list(title = "Altura de fusión", gridcolor = "#EFE6DC", zeroline = FALSE,
range = c(-0.13 * altura_max, 1.08 * altura_max)),
shapes = c(franjas, list(linea_corte)),
annotations = c(etiquetas_cluster, list(texto_corte)),
paper_bgcolor = "#FFFCF7",
plot_bgcolor = "#FFFCF7",
font = list(family = "Satoshi, Arial, sans-serif", color = "#51382C"),
hoverlabel = list(bgcolor = "#51382C", bordercolor = "#D4A66C",
font = list(color = "#FFFCF7", size = 12)),
margin = list(l = 70, r = 30, t = 80, b = 20),
showlegend = FALSE,
hovermode = "closest"
)
plotly::config(p, displaylogo = FALSE, responsive = TRUE)
El dendrograma obtenido mediante Ward muestra una separación marcada entre dos grandes conjuntos de países, cuya fusión ocurre aproximadamente a una altura de 40,7. Esto evidencia diferencias importantes en sus perfiles multidimensionales de desarrollo.
Al realizar un corte exploratorio alrededor de la altura 13, se identifican cuatro conglomerados de 30, 58, 42 y 14 países, lo que permite distinguir perfiles más específicos que una clasificación de solo dos grupos. Sin embargo, esta elección debe complementarse con el método del codo y el coeficiente de silueta para evaluar su pertinencia estadística.
El método del codo permite evaluar cómo disminuye la variabilidad interna de los conglomerados (WCSS) al aumentar el número de grupos. Para ello, se analizaron las particiones obtenidas mediante Ward, considerando soluciones de uno a diez clusters. Se busca identificar el punto a partir del cual las reducciones de la WCSS comienzan a ser menos pronunciadas.
coordenadas_ward <- as.matrix(datos_ward)
calcular_wcss <- function(k) {
grupos <- cutree(modelo_ward, k = k)
sum(vapply(
split(seq_len(nrow(coordenadas_ward)), grupos),
function(ids) {
bloque <- coordenadas_ward[ids, , drop = FALSE]
sum(sweep(bloque, 2, colMeans(bloque), "-")^2)
},
numeric(1)
))
}
tabla_codo <- data.frame(
Clusters = 1:10,
WCSS = vapply(1:10, calcular_wcss, numeric(1))
)
elegido <- tabla_codo$Clusters == k_optimo
grafico_codo <- ggplot(tabla_codo, aes(x = Clusters, y = WCSS)) +
geom_vline(xintercept = k_optimo, linetype = "dashed",
color = "#C47758", linewidth = 0.8) +
geom_line(color = "#8B6B54", linewidth = 1.4) +
geom_point(
aes(text = paste0(
"<b>k = ", Clusters, "</b>",
"<br>WCSS: ", formatC(WCSS, format = "f", digits = 1,
decimal.mark = ",", big.mark = ".")
)),
color = ifelse(elegido, "#C47758", "#8B6B54"),
size = ifelse(elegido, 6, 3.5)
) +
scale_x_continuous(breaks = 1:10) +
scale_y_continuous(expand = expansion(mult = c(0.05, 0.10))) +
labs(x = "Número de clusters (k)",
y = "Suma de cuadrados dentro de los grupos (WCSS)") +
tema_cocoa()
plotly::ggplotly(grafico_codo, tooltip = "text", height = 520) %>%
estilo_plotly("Método del codo · Ward.D2",
"Suma de cuadrados dentro de los grupos (más bajo es mejor) · Línea punteada: k = 4",
leyenda = FALSE) %>%
plotly::config(displaylogo = FALSE, responsive = TRUE)
La suma de cuadrados dentro de los grupos (WCSS) disminuye bruscamente al pasar de uno a dos clusters, en concordancia con la separación principal observada en el dendrograma. Posteriormente, la curva presenta una moderación de su pendiente alrededor de k = 4: al pasar de tres a cuatro grupos, la WCSS se reduce en 112,8 unidades, mientras que de cuatro a cinco disminuye únicamente en 57,4.
Esta reducción de las ganancias adicionales sugiere que cuatro conglomerados constituyen una alternativa razonable para obtener una segmentación más detallada sin incrementar excesivamente el número de grupos. No obstante, su elección se contrastará con el coeficiente promedio de silueta.
El coeficiente de silueta mide qué tan bien asignado está cada país a su conglomerado, comparando su distancia promedio con los países de su propio grupo frente a la del grupo más cercano. Toma valores entre −1 y 1: cuanto más alto, más compactos y mejor separados están los grupos. Se calculó la silueta promedio para soluciones de dos a diez clusters.
tabla_sil <- data.frame(Clusters = valores_k, Silueta = siluetas)
elegido_s <- tabla_sil$Clusters == k_optimo
grafico_sil <- ggplot(tabla_sil, aes(x = Clusters, y = Silueta)) +
geom_vline(xintercept = k_optimo, linetype = "dashed",
color = "#C47758", linewidth = 0.8) +
geom_line(color = "#8B6B54", linewidth = 1.4) +
geom_point(
aes(text = paste0(
"<b>k = ", Clusters, "</b>",
"<br>Silueta promedio: ", formatC(Silueta, format = "f", digits = 3,
decimal.mark = ",")
)),
color = ifelse(elegido_s, "#C47758", "#8B6B54"),
size = ifelse(elegido_s, 6, 3.5)
) +
scale_x_continuous(breaks = valores_k) +
scale_y_continuous(expand = expansion(mult = c(0.08, 0.12))) +
labs(x = "Número de clusters (k)", y = "Silueta promedio") +
tema_cocoa()
plotly::ggplotly(grafico_sil, tooltip = "text", height = 520) %>%
estilo_plotly("Coeficiente de silueta · Ward.D2",
"Silueta promedio según el número de clusters (más alto es mejor) · Línea punteada: k = 4",
leyenda = FALSE) %>%
plotly::config(displaylogo = FALSE, responsive = TRUE)
La silueta más alta corresponde a k = 2 (0,490), lo que indica una mejor separación estadística. Sin embargo, esta solución reúne 114 países en un mismo conglomerado, limitando la identificación de perfiles más específicos. Con tres grupos, la silueta disminuye a 0,250, mientras que con cuatro aumenta a 0,278, el valor más alto entre las soluciones de tres a diez clusters. A partir de cinco grupos, la silueta presenta una tendencia general decreciente.
tabla_k <- data.frame(
k = valores_k,
Silueta = siluetas,
SC = tabla_codo$WCSS[match(valores_k, tabla_codo$Clusters)],
Menor = sapply(valores_k, function(k)
min(table(cutree(modelo_ward, k)))),
Tamanos = sapply(valores_k, function(k)
paste(sort(table(cutree(modelo_ward, k)), decreasing = TRUE),
collapse = " · "))
)
tabla_k_mostrar <- tabla_k %>%
transmute(
`N.º de clusters` = k,
`Silueta promedio` = f1(Silueta, 4),
`SC dentro de los grupos` = f1(SC, 1),
`Grupo más pequeño` = Menor,
`Tamaño de los grupos` = Tamanos
)
estilo_k <- '
.cocoa-resumen-k .cocoa-tabla-contenedor {
overflow-x: auto;
}
.cocoa-resumen-k .cocoa-resumen-table {
min-width: 690px;
}
.cocoa-resumen-k .cocoa-resumen-table thead th {
text-align: center;
white-space: nowrap;
}
.cocoa-resumen-k .cocoa-resumen-table thead th:last-child {
text-align: left;
}
.cocoa-resumen-k .cocoa-resumen-table tbody td {
text-align: center;
font-variant-numeric: tabular-nums;
}
.cocoa-resumen-k .cocoa-resumen-table tbody td:first-child {
width: auto;
color: #985E40;
font-weight: 700;
}
.cocoa-resumen-k .cocoa-resumen-table tbody td:last-child {
text-align: left;
white-space: nowrap;
}
.cocoa-resumen-k .cocoa-resumen-table tbody tr.cocoa-k-selected td {
background: #EBD8C4;
color: #51382C;
font-weight: 700;
border-top: 2px solid #C59665;
border-bottom: 2px solid #C59665;
}
.cocoa-resumen-k .cocoa-resumen-table tbody tr.cocoa-k-selected:hover td {
background: #E5CCB3;
}
'
filas_k <- lapply(seq_len(nrow(tabla_k_mostrar)), function(i) {
htmltools::tags$tr(
class = if (tabla_k$k[i] == k_optimo)
"cocoa-k-selected" else NULL,
lapply(seq_len(ncol(tabla_k_mostrar)), function(j) {
htmltools::tags$td(as.character(tabla_k_mostrar[i, j]))
})
)
})
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(paste0(estilo_resumen, estilo_k))
),
htmltools::tags$div(
class = "cocoa-resumen cocoa-resumen-k",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados · Clusterización"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Tabla 15. Criterios para seleccionar el número de clusters"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"Método Ward · 144 países · Soluciones de 2 a 10 clusters"
)
),
htmltools::tags$div(
class = "cocoa-tabla-contenedor",
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
lapply(names(tabla_k_mostrar), htmltools::tags$th)
)
),
htmltools::tags$tbody(filas_k)
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$strong("Nota: "),
"La fila resaltada corresponde a la solución seleccionada ",
"de cuatro conglomerados. WCSS representa la suma de ",
"cuadrados dentro de los grupos. Fuente: Elaboración propia ",
"con datos del Banco Mundial (2022)."
)
)
)
)
| N.º de clusters | Silueta promedio | SC dentro de los grupos | Grupo más pequeño | Tamaño de los grupos |
|---|---|---|---|---|
| 2 | 0,4898 | 878,0 | 30 | 114 · 30 |
| 3 | 0,2504 | 720,6 | 30 | 72 · 42 · 30 |
| 4 | 0,2785 | 607,8 | 14 | 58 · 42 · 30 · 14 |
| 5 | 0,2713 | 550,4 | 3 | 58 · 42 · 27 · 14 · 3 |
| 6 | 0,2387 | 495,9 | 3 | 42 · 35 · 27 · 23 · 14 · 3 |
| 7 | 0,2564 | 445,3 | 3 | 37 · 35 · 27 · 23 · 14 · 5 · 3 |
| 8 | 0,2406 | 411,7 | 3 | 37 · 35 · 23 · 21 · 14 · 6 · 5 · 3 |
| 9 | 0,2303 | 379,4 | 3 | 35 · 26 · 23 · 21 · 14 · 11 · 6 · 5 · 3 |
| 10 | 0,2276 | 347,9 | 1 | 35 · 26 · 22 · 21 · 14 · 11 · 6 · 5 · 3 · 1 |
La tabla reúne los dos criterios y el tamaño de los grupos que produce cada solución. Además de tener la mejor silueta después de k = 2, la solución de cuatro clusters es la última sin grupos muy pequeños: con cinco se separa un grupo de solo 3 países (República Centroafricana, Chad y Níger), demasiado reducido para describir un perfil propio.
En consecuencia, ** se selccionan cuatro clusters**, considerando conjuntamente el cambio de pendiente observado en el método del codo, la estructura del dendrograma y la mejora relativa de la silueta frente a otras soluciones de mayor detalle. Esta partición genera grupos de 58, 42, 30, 14 países, cuya diferenciación se examinará mediante la caracterización de sus indicadores económicos, sociales, tecnológicos y ambientales.
Como República Centroafricana tiene valores atípicos en esperanza de vida y mortalidad infantil, se repitió todo el procedimiento sin este país para comprobar qué tanto influye en los resultados.
vars_modelo <- colnames(datos_acp)
base_sin <- base_final %>%
filter(Codigo_pais != "CAF")
datos_sin <- base_sin %>%
select(all_of(vars_modelo)) %>%
mutate(
PIB_per_capita = log1p(PIB_per_capita),
Comercio_internacional = log1p(Comercio_internacional),
Inflacion = asinh(Inflacion),
Crecimiento_PIB = winsorizar(Crecimiento_PIB),
Crecimiento_poblacional = winsorizar(Crecimiento_poblacional)
)
acp_sin <- prcomp(datos_sin, center = TRUE, scale. = TRUE)
pv_sin <- 100 * acp_sin$sdev^2 / sum(acp_sin$sdev^2)
dist_sin <- dist(acp_sin$x[, 1:4])
ward_sin <- hclust(dist_sin, method = "ward.D2")
grupo_sin <- cutree(ward_sin, k = k_optimo)
coincidencia <- table(
factor(grupos_ward[base_sin$Codigo_pais], levels = 1:k_optimo),
factor(grupo_sin, levels = 1:k_optimo)
)
permutaciones <- as.matrix(
expand.grid(rep(list(1:k_optimo), k_optimo))
)
permutaciones <- permutaciones[
apply(permutaciones, 1, function(x)
length(unique(x)) == k_optimo),
, drop = FALSE
]
pct_coincide <- 100 * max(
apply(permutaciones, 1, function(p)
sum(coincidencia[cbind(seq_len(k_optimo), p)]))
) / sum(coincidencia)
sensibilidad <- data.frame(
Indicador = c(
"Países",
"Varianza explicada por el CP1 (%)",
"Varianza acumulada con 4 CP (%)",
"Silueta con k = 4",
"Tamaño de los grupos (k = 4)",
"Países que conservan su grupo (%)"
),
`Con República Centroafricana` = c(
nrow(base_final),
f1(porcentaje_varianza[1], 2),
f1(sum(porcentaje_varianza[1:4]), 2),
f1(siluetas[valores_k == 4], 4),
tabla_k$Tamanos[tabla_k$k == 4],
"—"
),
`Sin República Centroafricana` = c(
nrow(base_sin),
f1(pv_sin[1], 2),
f1(sum(pv_sin[1:4]), 2),
f1(mean(cluster::silhouette(grupo_sin, dist_sin)[, "sil_width"]), 4),
paste(
sort(table(grupo_sin), decreasing = TRUE),
collapse = " · "
),
f1(pct_coincide, 1)
),
check.names = FALSE
)
estilo_sensibilidad <- '
.cocoa-resumen-sensibilidad .cocoa-tabla-contenedor {
overflow-x: auto;
}
.cocoa-resumen-sensibilidad .cocoa-resumen-table {
width: 100%;
min-width: 720px;
}
.cocoa-resumen-sensibilidad .cocoa-resumen-table th {
text-align: center;
vertical-align: middle;
}
.cocoa-resumen-sensibilidad .cocoa-resumen-table th:first-child {
text-align: left;
width: 42%;
}
.cocoa-resumen-sensibilidad .cocoa-resumen-table td {
text-align: center;
vertical-align: middle;
font-variant-numeric: tabular-nums;
}
.cocoa-resumen-sensibilidad .cocoa-resumen-table td:first-child {
text-align: left;
color: #51382C;
font-weight: 600;
}
.cocoa-resumen-sensibilidad .cocoa-resumen-table tbody tr:nth-child(even) td {
background: #F5EFE6;
}
.cocoa-resumen-sensibilidad .cocoa-resumen-table tbody tr:last-child td {
background: #EBD8C4;
color: #51382C;
font-weight: 700;
border-top: 2px solid #C59665;
border-bottom: 2px solid #C59665;
}
'
filas_sensibilidad <- lapply(
seq_len(nrow(sensibilidad)),
function(i) {
htmltools::tags$tr(
lapply(seq_len(ncol(sensibilidad)), function(j) {
htmltools::tags$td(
as.character(sensibilidad[i, j])
)
})
)
}
)
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(
paste0(estilo_resumen, estilo_sensibilidad)
)
),
htmltools::tags$div(
class = "cocoa-resumen cocoa-resumen-sensibilidad",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados · Análisis de sensibilidad"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Tabla 16. Análisis de sensibilidad"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"Comparación del ACP y Ward con y sin República Centroafricana"
)
),
htmltools::tags$div(
class = "cocoa-tabla-contenedor",
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
lapply(
names(sensibilidad),
htmltools::tags$th
)
)
),
htmltools::tags$tbody(
filas_sensibilidad
)
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$strong("Nota: "),
"La estabilidad corresponde al porcentaje de países ",
"que conservan su conglomerado tras excluir a República ",
"Centroafricana, considerando posibles cambios en la ",
"numeración de los grupos. Fuente: Elaboración propia ",
"con datos del Banco Mundial (2022)."
)
)
)
)
| Indicador | Con República Centroafricana | Sin República Centroafricana |
|---|---|---|
| Países | 144 | 143 |
| Varianza explicada por el CP1 (%) | 48,11 | 49,76 |
| Varianza acumulada con 4 CP (%) | 74,65 | 75,88 |
| Silueta con k = 4 | 0,2785 | 0,2801 |
| Tamaño de los grupos (k = 4) | 58 · 42 · 30 · 14 | 74 · 29 · 24 · 16 |
| Países que conservan su grupo (%) | — | 86,0 |
Sin República Centroafricana, el ACP cambia muy poco: el primer componente pasa de 48,11 % a 49,76 % de varianza explicada. En la segmentación, el 86,0 % de los países conserva su grupo. Los grupos de bajo desarrollo y de altos ingresos sin bosques se mantienen prácticamente iguales; el cambio se concentra en la frontera entre los grupos de desarrollo medio y desarrollo alto, donde 18 de los 42 países inicialmente asignados al grupo de desarrollo medio (42,9 %) pasan al grupo alto al excluir a República Centroafricana. Aunque el 86,0 % de los países comparables conserva su clasificación, esta variación evidencia que la frontera entre ambos perfiles es sensible a la composición de la muestra. Por lo tanto, se decidió conservar a República Centroafricana, ya que se integra al grupo de bajo desarrollo y no forma un conglomerado independiente. Sin embargo, los cambios observados muestran que la separación entre los grupos de desarrollo medio y alto es la parte menos estable de la segmentación.
Una vez definidos los cuatro conglomerados, se describe el perfil de cada uno a partir de sus puntuaciones en los componentes principales y de los valores originales de los 16 indicadores. Para comparar los grupos se utiliza principalmente la mediana, porque los indicadores económicos y de desarrollo presentan valores extremos que afectan al promedio; en las estadísticas descriptivas se reportan también la media, la desviación estándar y los valores mínimo y máximo. Además, el coeficiente de silueta de cada país permite identificar cuáles representan mejor a su grupo y cuáles están en la frontera con otro. Los nombres de los grupos se asignaron después de revisar esos indicadores en la base del estudio, y se justifican al final de la sección.
rasgos <- c(
"Bajo desarrollo y base agrícola" =
"Menor ingreso y esperanza de vida; mortalidad infantil y fecundidad más altas; la agricultura aporta cerca de una cuarta parte del PIB y menos de la mitad de la población tiene electricidad.",
"Desarrollo medio en transición" =
"Servicios básicos casi universales e ingreso intermedio; la agricultura todavía ocupa la mitad del territorio, con poca superficie forestal y pocas áreas protegidas.",
"Desarrollo alto con riqueza natural" =
"Buenos indicadores de salud, ingreso y conectividad, combinados con la mayor superficie forestal y la mayor proporción de áreas protegidas.",
"Altos ingresos urbanos sin bosques" =
"Mayor ingreso y urbanización, casi sin bosques; en 2022 tuvo el mayor crecimiento económico y la menor inflación, y su crecimiento poblacional."
)
cantidades <- as.integer(table(base_clusters$Grupo)[niveles_cl])
sintesis <- data.frame(
Cluster = paste("Cluster", orden_cl),
`Perfil de desarrollo` = niveles_cl,
`Países` = cantidades,
`%` = f1(100 * cantidades / nrow(base_clusters), 1),
`Características principales` = unname(rasgos[niveles_cl]),
`Países representativos` = vapply(niveles_cl, function(g) {
d <- base_clusters %>%
filter(Grupo == g) %>%
arrange(desc(Silueta))
paste(head(d$Pais, 5), collapse = ", ")
}, character(1)),
check.names = FALSE,
row.names = NULL
)
estilo_sintesis <- '
.cocoa-sintesis .cocoa-tabla-contenedor {
width: 100%;
overflow-x: auto;
border-radius: 10px;
}
.cocoa-sintesis .cocoa-resumen-table {
width: 100%;
min-width: 1100px;
border-collapse: collapse;
font-family: "Satoshi", Arial, sans-serif;
font-size: 13px;
}
.cocoa-sintesis .cocoa-resumen-table thead th {
background: #624634;
color: #FFFCF7;
text-align: left;
padding: 15px 13px;
font-weight: 700;
border-bottom: 3px solid #D4A66C;
}
.cocoa-sintesis .cocoa-resumen-table tbody td {
padding: 17px 13px;
vertical-align: middle;
color: #51382C;
line-height: 1.65;
border-bottom: 1px solid #E8DCD0;
}
.cocoa-sintesis .cocoa-resumen-table tbody tr:nth-child(odd) td {
background: #FFFCF7;
}
.cocoa-sintesis .cocoa-resumen-table tbody tr:nth-child(even) td {
background: #F5EFE6;
}
.cocoa-sintesis .cocoa-resumen-table tbody tr:hover td {
background: #EBD8C4;
}
.cocoa-sintesis .cocoa-resumen-table th:nth-child(1) {
min-width: 105px;
}
.cocoa-sintesis .cocoa-resumen-table th:nth-child(2) {
min-width: 175px;
}
.cocoa-sintesis .cocoa-resumen-table th:nth-child(3),
.cocoa-sintesis .cocoa-resumen-table th:nth-child(4) {
text-align: center;
min-width: 65px;
}
.cocoa-sintesis .cocoa-resumen-table td:nth-child(3),
.cocoa-sintesis .cocoa-resumen-table td:nth-child(4) {
text-align: center;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.cocoa-sintesis .cocoa-resumen-table th:nth-child(5) {
min-width: 330px;
}
.cocoa-sintesis .cocoa-resumen-table th:nth-child(6) {
min-width: 225px;
}
.cocoa-sintesis .cocoa-resumen-table td:nth-child(2) {
color: #985E40;
font-weight: 700;
}
.cocoa-sintesis .cocoa-resumen-table td:nth-child(6) {
font-size: 12px;
}
.cocoa-sintesis .cluster-chip {
display: inline-block;
padding: 7px 11px;
border-radius: 8px;
color: #FFFCF7;
font-weight: 700;
white-space: nowrap;
}
'
filas_sintesis <- lapply(seq_len(nrow(sintesis)), function(i) {
htmltools::tags$tr(
lapply(seq_len(ncol(sintesis)), function(j) {
if (j == 1) {
htmltools::tags$td(
htmltools::tags$span(
sintesis[i, j],
class = "cluster-chip",
style = paste0(
"background:",
unname(paleta_grupo[niveles_cl[i]]),
";"
)
)
)
} else {
htmltools::tags$td(
as.character(sintesis[i, j])
)
}
})
)
})
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(
paste0(estilo_resumen, estilo_sintesis)
)
),
htmltools::tags$div(
class = "cocoa-resumen cocoa-sintesis",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados · Perfiles de desarrollo"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Caracterización general de los conglomerados"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"Ward · 144 países · Cuatro perfiles de desarrollo"
)
),
htmltools::tags$div(
class = "cocoa-tabla-contenedor",
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
lapply(
names(sintesis),
htmltools::tags$th
)
)
),
htmltools::tags$tbody(
filas_sintesis
)
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$strong("Nota: "),
"La numeración corresponde al dendrograma Ward.D2. ",
"Los países representativos son los cinco con mayor ",
"coeficiente de silueta dentro de cada conglomerado. ",
"Fuente: Elaboración propia con datos del Banco Mundial (2022)."
)
)
)
)
| Cluster | Perfil de desarrollo | Países | % | Características principales | Países representativos |
|---|---|---|---|---|---|
| Cluster 1 | Bajo desarrollo y base agrícola | 30 | 20,8 | Menor ingreso y esperanza de vida; mortalidad infantil y fecundidad más altas; la agricultura aporta cerca de una cuarta parte del PIB y menos de la mitad de la población tiene electricidad. | Sierra Leone, Madagascar, Mozambique, Uganda, Mali |
| Cluster 3 | Desarrollo medio en transición | 42 | 29,2 | Servicios básicos casi universales e ingreso intermedio; la agricultura todavía ocupa la mitad del territorio, con poca superficie forestal y pocas áreas protegidas. | Uzbekistan, Bangladesh, India, Kyrgyz Republic, South Africa |
| Cluster 2 | Desarrollo alto con riqueza natural | 58 | 40,3 | Buenos indicadores de salud, ingreso y conectividad, combinados con la mayor superficie forestal y la mayor proporción de áreas protegidas. | New Zealand, Chile, Slovenia, Costa Rica, Sweden |
| Cluster 4 | Altos ingresos urbanos sin bosques | 14 | 9,7 | Mayor ingreso y urbanización, casi sin bosques; en 2022 tuvo el mayor crecimiento económico y la menor inflación, y su crecimiento poblacional. | Qatar, Kuwait, United Arab Emirates, Oman, Iceland |
La clasificación mediante Ward permitió identificar cuatro perfiles de desarrollo diferenciados. El cluster 1 agrupa 30 países (20,8 %) y presenta las mayores limitaciones socioeconómicas, con un PIB per cápita mediano de 2.899,0, menor acceso a servicios básicos y mayores niveles de mortalidad infantil. Por su parte, el cluster 3 reúne 42 países (29,2 %) con un desarrollo intermedio, mayor cobertura de servicios y un PIB per cápita mediano de 13.114,4.
El cluster 2 concentra 58 países (40,3 %) y combina mejores condiciones económicas, sociales y tecnológicas con una mayor cobertura forestal y de áreas protegidas. Finalmente, el cluster 4, integrado por 14 países (9,7 %), presenta el mayor ingreso mediano (57.223,7), elevada urbanización y una superficie forestal reducida. Estas diferencias permiten reconocer cuatro perfiles de desarrollo que no dependen exclusivamente del nivel de ingreso.
cp_cl <- data.frame(
Grupo = as.character(base_clusters$Grupo),
modelo_acp$x[, 1:4]
) %>%
group_by(Grupo) %>%
summarise(
across(PC1:PC4, mean),
.groups = "drop"
) %>%
mutate(Grupo = factor(Grupo, levels = niveles_cl)) %>%
arrange(Grupo) %>%
mutate(Grupo = as.character(Grupo))
cp_col <- modelo_acp$x[
match("COL", base_clusters$Codigo_pais),
1:4
]
cp_cl <- bind_rows(
cp_cl,
data.frame(
Grupo = "Colombia",
PC1 = unname(cp_col[1]),
PC2 = unname(cp_col[2]),
PC3 = unname(cp_col[3]),
PC4 = unname(cp_col[4])
)
)
color_cp <- function(x) {
clase <- if (abs(x) < 0.5) {
"cocoa-cp-neutro"
} else if (x > 0) {
"cocoa-cp-positivo"
} else {
"cocoa-cp-negativo"
}
htmltools::tags$span(
f1(x, 2),
class = paste("cocoa-cp-valor", clase)
)
}
estilo_cp_clusters <- '
.cocoa-cp-clusters .cocoa-tabla-contenedor {
overflow-x: auto;
border-radius: 10px;
}
.cocoa-cp-clusters .cocoa-resumen-table {
width: 100%;
min-width: 920px;
font-family: "Satoshi", Arial, sans-serif;
}
.cocoa-cp-clusters .cocoa-resumen-table thead th {
background: #624634;
color: #FFFCF7;
padding: 16px 14px;
text-align: center;
vertical-align: middle;
border-bottom: 3px solid #D4A66C;
font-size: 12px;
line-height: 1.5;
}
.cocoa-cp-clusters .cocoa-resumen-table thead th:first-child {
text-align: left;
min-width: 230px;
}
.cocoa-cp-clusters .cocoa-resumen-table tbody td {
padding: 15px 14px;
text-align: center;
vertical-align: middle;
color: #51382C;
border-bottom: 1px solid #E8DCD0;
}
.cocoa-cp-clusters .cocoa-resumen-table tbody td:first-child {
text-align: left;
font-weight: 600;
}
.cocoa-cp-clusters .cocoa-resumen-table tbody tr:nth-child(odd) td {
background: #FFFCF7;
}
.cocoa-cp-clusters .cocoa-resumen-table tbody tr:nth-child(even) td {
background: #F5EFE6;
}
.cocoa-cp-clusters .cocoa-resumen-table tbody tr:hover td {
background: #EBD8C4;
}
.cocoa-cp-clusters .cocoa-cp-etiqueta {
display: inline-block;
padding: 8px 12px;
border-radius: 8px;
color: #FFFCF7;
font-weight: 700;
font-size: 12px;
line-height: 1.5;
}
.cocoa-cp-clusters .cocoa-cp-valor {
display: inline-block;
min-width: 62px;
padding: 8px 12px;
border-radius: 8px;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.cocoa-cp-clusters .cocoa-cp-positivo {
background: #B77A4D;
color: #FFFCF7;
}
.cocoa-cp-clusters .cocoa-cp-negativo {
background: #51382C;
color: #FFFCF7;
}
.cocoa-cp-clusters .cocoa-cp-neutro {
background: #F0E6DA;
color: #624A3B;
}
.cocoa-cp-clusters .cocoa-resumen-table tbody tr.cocoa-cp-colombia td {
background: #F8EFE6;
border-top: 2px solid #D4A66C;
font-weight: 700;
}
.cocoa-cp-clusters .cocoa-resumen-table tbody tr.cocoa-cp-colombia:hover td {
background: #F2E3D3;
}
'
filas_cp <- lapply(seq_len(nrow(cp_cl)), function(i) {
g <- cp_cl$Grupo[i]
etiqueta <- if (g == "Colombia") {
htmltools::tags$strong("Colombia")
} else {
htmltools::tags$span(
g,
class = "cocoa-cp-etiqueta",
style = paste0(
"background: ",
unname(paleta_grupo[g]),
";"
)
)
}
htmltools::tags$tr(
class = if (g == "Colombia") "cocoa-cp-colombia" else NULL,
htmltools::tags$td(etiqueta),
lapply(1:4, function(j) {
htmltools::tags$td(
color_cp(as.numeric(cp_cl[i, j + 1]))
)
})
)
})
encabezados_cp <- c(
"Cluster",
"CP1 · Desarrollo",
"CP2 · Dinamismo vs. inflación",
"CP3 · Agro vs. conservación",
"CP4 · Protección y apertura"
)
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(
paste0(estilo_resumen, estilo_cp_clusters)
)
),
htmltools::tags$div(
class = "cocoa-resumen cocoa-cp-clusters",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados · Componentes principales"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Tabla 18. Puntuaciones promedio por conglomerado"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"Cuatro componentes principales · Comparación de perfiles y Colombia"
)
),
htmltools::tags$div(
class = "cocoa-tabla-contenedor",
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
lapply(encabezados_cp, htmltools::tags$th)
)
),
htmltools::tags$tbody(filas_cp)
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$strong("Nota: "),
"Se presentan las puntuaciones factoriales promedio ",
"de los países de cada conglomerado. La fila de Colombia ",
"corresponde a su puntuación individual. Los valores con ",
"|puntuación| ≥ 0,5 se resaltan en caramelo (positivos) ",
"y chocolate (negativos). Fuente: Elaboración propia ",
"con datos del Banco Mundial (2022)."
)
)
)
)
| Cluster | CP1 · Desarrollo | CP2 · Dinamismo vs. inflación | CP3 · Agro vs. conservación | CP4 · Protección y apertura |
|---|---|---|---|---|
| Bajo desarrollo y base agrícola | -4,67 | 0,05 | -0,06 | 0,24 |
| Desarrollo medio en transición | -0,05 | -0,18 | 0,82 | -0,33 |
| Desarrollo alto con riqueza natural | 1,93 | -0,50 | -0,62 | 0,01 |
| Altos ingresos urbanos sin bosques | 2,15 | 2,51 | 0,24 | 0,42 |
| Colombia | 0,94 | -0,10 | -0,62 | -0,93 |
Las puntuaciones factoriales muestran que el CP1 es el principal componente que diferencia a los conglomerados. El cluster 1: Bajo desarrollo y base agrícola presenta el valor más negativo (−4,67), mientras que el cluster 2: Desarrollo alto con riqueza natural (1,93) y el cluster 4: Altos ingresos urbanos sin bosques (2,15) registran valores positivos. Por su parte, el cluster 3: Desarrollo medio en transición se sitúa cerca del centro (−0,05). El CP2 destaca especialmente al cluster 4 (2,51), mientras que el CP3 diferencia al cluster 3 (0,82) del cluster 2 (−0,62), reflejando contrastes en el uso agrícola del territorio y la conservación ambiental.
Colombia pertenece al cluster 2: Desarrollo alto con riqueza natural y presenta una puntuación positiva en CP1 (0,94), aunque inferior al promedio de su conglomerado. Su CP3 (−0,62) coincide con el promedio del grupo, mientras que su CP4 (−0,93) indica diferencias respecto a este en los aspectos asociados con la protección ambiental y la apertura comercial.
plano <- data.frame(
base_clusters[, c("Pais", "Codigo_pais", "Grupo")],
CP1 = modelo_acp$x[, 1],
CP2 = modelo_acp$x[, 2]
)
centros_cl <- plano %>%
group_by(Grupo) %>%
summarise(
CP1 = mean(CP1),
CP2 = mean(CP2),
.groups = "drop"
)
p_plano <- plotly::plot_ly(height = 630)
for (g in niveles_cl) {
d <- plano %>%
filter(Grupo == g, Codigo_pais != "COL")
p_plano <- p_plano %>%
plotly::add_trace(
x = d$CP1,
y = d$CP2,
type = "scatter",
mode = "markers",
name = g,
legendgroup = g,
showlegend = TRUE,
marker = list(
size = 10,
color = unname(paleta_grupo[g]),
opacity = 0.83,
line = list(
color = "#FFFCF7",
width = 1.3
)
),
text = paste0(
"<b>", d$Pais, "</b>",
"<br>", g,
"<br>CP1: ", f1(d$CP1, 2),
"<br>CP2: ", f1(d$CP2, 2)
),
hovertemplate = "%{text}<extra></extra>"
)
}
p_plano <- p_plano %>%
plotly::add_trace(
x = centros_cl$CP1,
y = centros_cl$CP2,
type = "scatter",
mode = "markers",
name = "Centroides",
showlegend = TRUE,
marker = list(
size = 19,
symbol = "x",
color = unname(
paleta_grupo[as.character(centros_cl$Grupo)]
),
line = list(
color = "#51382C",
width = 2.5
)
),
text = paste0(
"<b>Centroide</b>",
"<br>", centros_cl$Grupo,
"<br>CP1: ", f1(centros_cl$CP1, 2),
"<br>CP2: ", f1(centros_cl$CP2, 2)
),
hovertemplate = "%{text}<extra></extra>"
)
col_pl <- plano %>%
filter(Codigo_pais == "COL")
p_plano <- p_plano %>%
plotly::add_trace(
x = col_pl$CP1,
y = col_pl$CP2,
type = "scatter",
mode = "markers+text",
name = "Colombia",
showlegend = TRUE,
text = "Colombia",
textposition = "top center",
textfont = list(
family = "Satoshi, Arial, sans-serif",
size = 13,
color = "#A85D3F"
),
marker = list(
size = 17,
symbol = "diamond",
color = "#C47758",
line = list(
color = "#51382C",
width = 2
)
),
hovertemplate = paste0(
"<b>Colombia</b>",
"<br>", col_pl$Grupo,
"<br>CP1: ", f1(col_pl$CP1, 2),
"<br>CP2: ", f1(col_pl$CP2, 2),
"<extra></extra>"
)
)
p_plano %>%
plotly::layout(
title = list(
text = paste0(
"<b>Los cuatro clusters en el plano CP1–CP2</b>",
"<br><span style='font-size:12px;color:#937661'>",
"144 países · Las X indican los centroides de cada grupo",
"</span>"
),
x = 0.5,
xanchor = "center",
font = list(
family = "Fraunces, Georgia, serif",
size = 21,
color = "#51382C"
)
),
xaxis = list(
title = paste0(
"CP1 · Desarrollo (",
f1(porcentaje_varianza[1], 2),
" %)"
),
titlefont = list(size = 13),
tickfont = list(size = 12),
gridcolor = "#EFE6DC",
zeroline = TRUE,
zerolinecolor = "#C9A27E",
zerolinewidth = 1.5,
showline = TRUE,
linecolor = "#D8C8B8"
),
yaxis = list(
title = paste0(
"CP2 · Dinamismo vs. inflación (",
f1(porcentaje_varianza[2], 2),
" %)"
),
titlefont = list(size = 13),
tickfont = list(size = 12),
gridcolor = "#EFE6DC",
zeroline = TRUE,
zerolinecolor = "#C9A27E",
zerolinewidth = 1.5,
showline = TRUE,
linecolor = "#D8C8B8"
),
legend = list(
orientation = "v",
x = 1.02,
xanchor = "left",
y = 0.97,
yanchor = "top",
font = list(
family = "Satoshi, Arial, sans-serif",
size = 11,
color = "#51382C"
),
bgcolor = "rgba(255,252,247,0)",
borderwidth = 0,
itemsizing = "constant"
),
paper_bgcolor = "#FFFCF7",
plot_bgcolor = "#FFFCF7",
font = list(
family = "Satoshi, Arial, sans-serif",
size = 12,
color = "#51382C"
),
margin = list(
l = 85,
r = 285,
t = 125,
b = 85
),
hovermode = "closest",
height = 630
) %>%
plotly::config(
displaylogo = FALSE,
responsive = TRUE,
scrollZoom = FALSE
)
La Figura 26 muestra que el cluster 1: Bajo desarrollo y base agrícola se concentra en los valores negativos del CP1, diferenciándose claramente de los demás conglomerados por sus menores niveles de desarrollo socioeconómico. El cluster 3: Desarrollo medio en transición ocupa principalmente posiciones intermedias, mientras que el cluster 2: Desarrollo alto con riqueza natural se ubica hacia los valores positivos del CP1. Por su parte, el cluster 4: Altos ingresos urbanos sin bosques se distingue por sus puntuaciones elevadas en el CP2, asociadas con su dinámica económica y demográfica.
Aunque existe cierta superposición entre los conglomerados, especialmente entre los clusters 2 y 3, esto no implica una clasificación incorrecta, ya que el agrupamiento se realizó utilizando los cuatro primeros componentes principales. Colombia, ubicada en el cluster 2, presenta puntuaciones de 0,94 en CP1 y −0,10 en CP2, lo que refleja una posición socioeconómica positiva, aunque inferior al promedio de su conglomerado en el primer componente.
continentes <- if (is.factor(base$Continente)) {
levels(base$Continente)
} else {
sort(unique(na.omit(as.character(base$Continente))))
}
comp <- addmargins(
table(
factor(base_clusters$Grupo, levels = niveles_cl),
factor(base_clusters$Continente, levels = continentes)
)
)
comp_df <- as.data.frame.matrix(comp)
names(comp_df)[ncol(comp_df)] <- "Total"
comp_df <- data.frame(
Cluster = c(niveles_cl, "Total"),
comp_df,
check.names = FALSE,
row.names = NULL
)
estilo_composicion <- '
.cocoa-composicion .cocoa-tabla-contenedor {
width: 100%;
overflow-x: auto;
border-radius: 10px;
}
.cocoa-composicion .cocoa-resumen-table {
width: 100%;
min-width: 780px;
font-family: "Satoshi", Arial, sans-serif;
font-size: 13px;
}
.cocoa-composicion .cocoa-resumen-table thead th {
background: #624634;
color: #FFFCF7;
padding: 16px 14px;
text-align: center;
border-bottom: 3px solid #D4A66C;
font-weight: 700;
}
.cocoa-composicion .cocoa-resumen-table thead th:first-child {
text-align: left;
min-width: 240px;
}
.cocoa-composicion .cocoa-resumen-table tbody td {
padding: 15px 14px;
text-align: center;
vertical-align: middle;
color: #51382C;
border-bottom: 1px solid #E8DCD0;
font-variant-numeric: tabular-nums;
}
.cocoa-composicion .cocoa-resumen-table tbody td:first-child {
text-align: left;
font-weight: 600;
}
.cocoa-composicion .cocoa-resumen-table tbody tr:nth-child(odd) td {
background: #FFFCF7;
}
.cocoa-composicion .cocoa-resumen-table tbody tr:nth-child(even) td {
background: #F5EFE6;
}
.cocoa-composicion .cocoa-resumen-table tbody tr:hover td {
background: #EBD8C4;
}
.cocoa-composicion .cocoa-resumen-table tbody td:last-child {
font-weight: 700;
color: #985E40;
}
.cocoa-composicion .cocoa-resumen-table tbody tr.cocoa-total td {
background: #EBD8C4;
color: #51382C;
font-weight: 700;
border-top: 2px solid #C59665;
border-bottom: 2px solid #C59665;
}
.cocoa-composicion .cocoa-cluster-chip {
display: inline-block;
padding: 8px 12px;
border-radius: 8px;
color: #FFFCF7;
font-weight: 700;
font-size: 12px;
}
'
filas_composicion <- lapply(seq_len(nrow(comp_df)), function(i) {
g <- as.character(comp_df$Cluster[i])
es_total <- g == "Total"
htmltools::tags$tr(
class = if (es_total) "cocoa-total" else NULL,
htmltools::tags$td(
if (es_total) {
htmltools::tags$strong("Total")
} else {
htmltools::tags$span(
g,
class = "cocoa-cluster-chip",
style = paste0(
"background: ",
unname(paleta_grupo[g]),
";"
)
)
}
),
lapply(seq.int(2, ncol(comp_df)), function(j) {
htmltools::tags$td(
as.character(comp_df[i, j])
)
})
)
})
htmltools::browsable(
htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(
paste0(estilo_resumen, estilo_composicion)
)
),
htmltools::tags$div(
class = "cocoa-resumen cocoa-composicion",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados · Composición geográfica"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Composición geográfica de los conglomerados"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"Distribución de los 144 países por continente y perfil de desarrollo"
)
),
htmltools::tags$div(
class = "cocoa-tabla-contenedor",
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
lapply(
names(comp_df),
htmltools::tags$th
)
)
),
htmltools::tags$tbody(
filas_composicion
)
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$strong("Nota: "),
"Los valores representan el número de países de cada ",
"continente pertenecientes a cada conglomerado. ",
"La última fila y columna muestran los totales. ",
"Fuente: Elaboración propia con datos del Banco Mundial (2022)."
)
)
)
)
| Cluster | África | América | Asia | Europa | Oceanía | Total |
|---|---|---|---|---|---|---|
| Bajo desarrollo y base agrícola | 27 | 1 | 1 | 0 | 1 | 30 |
| Desarrollo medio en transición | 11 | 8 | 19 | 2 | 2 | 42 |
| Desarrollo alto con riqueza natural | 2 | 10 | 7 | 35 | 4 | 58 |
| Altos ingresos urbanos sin bosques | 1 | 0 | 10 | 3 | 0 | 14 |
| Total | 41 | 19 | 37 | 40 | 7 | 144 |
La distribución geográfica evidencia diferencias entre los cuatro conglomerados. El cluster 1: Bajo desarrollo y base agrícola se concentra principalmente en África, donde se ubican 27 de sus 30 países. El cluster 3: Desarrollo medio en transición presenta una composición más diversa, con predominio de Asia (19 países), seguido de África (11) y América (8).
Por su parte, el cluster 2: Desarrollo alto con riqueza natural tiene una fuerte presencia europea, con 35 de sus 58 países, además de incluir países de América, Asia y Oceanía. Finalmente, el cluster 4: Altos ingresos urbanos sin bosques se concentra principalmente en Asia (10 de 14 países). Estos resultados muestran una relación entre la ubicación geográfica y los perfiles de desarrollo, aunque ningún continente presenta una composición completamente homogénea.
estilo_descriptivas <- '
.cocoa-estadisticas .cocoa-desc-tabs {
position: relative;
padding: 20px;
}
.cocoa-estadisticas .cocoa-desc-radio {
position: absolute;
opacity: 0;
pointer-events: none;
}
.cocoa-estadisticas .cocoa-desc-nav {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 24px;
}
.cocoa-estadisticas .cocoa-desc-nav label {
padding: 11px 19px;
border: 1px solid #E1D2C2;
border-radius: 10px;
background: #F5EFE6;
color: #51382C;
font-family: "Satoshi", Arial, sans-serif;
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: all 0.2s ease;
}
.cocoa-estadisticas .cocoa-desc-nav label:hover {
background: #EBD8C4;
border-color: #C59665;
}
.cocoa-estadisticas .cocoa-desc-panel {
display: none;
}
.cocoa-estadisticas .cocoa-desc-titulo {
font-family: "Fraunces", Georgia, serif;
font-size: 21px;
color: #51382C;
margin-bottom: 6px;
}
.cocoa-estadisticas .cocoa-desc-subtitulo {
color: #937661;
font-size: 13px;
margin-bottom: 18px;
}
.cocoa-estadisticas .cocoa-tabla-contenedor {
overflow-x: auto;
border-radius: 10px;
}
.cocoa-estadisticas .cocoa-resumen-table {
width: 100%;
min-width: 1120px;
font-family: "Satoshi", Arial, sans-serif;
font-size: 12px;
}
.cocoa-estadisticas .cocoa-resumen-table thead th {
background: #624634;
color: #FFFCF7;
padding: 14px 12px;
text-align: center;
vertical-align: middle;
font-weight: 700;
border-bottom: 3px solid #D4A66C;
}
.cocoa-estadisticas .cocoa-resumen-table thead th:nth-child(-n+2) {
text-align: left;
}
.cocoa-estadisticas .cocoa-resumen-table tbody td {
padding: 12px 11px;
color: #51382C;
text-align: center;
vertical-align: middle;
border-bottom: 1px solid #E8DCD0;
font-variant-numeric: tabular-nums;
}
.cocoa-estadisticas .cocoa-resumen-table tbody td:nth-child(2) {
text-align: left;
min-width: 180px;
font-weight: 600;
}
.cocoa-estadisticas .cocoa-resumen-table tbody td:nth-child(n+6) {
text-align: left;
min-width: 175px;
}
.cocoa-estadisticas .cocoa-resumen-table tbody tr:nth-child(odd) td {
background: #FFFCF7;
}
.cocoa-estadisticas .cocoa-resumen-table tbody tr:nth-child(even) td {
background: #F5EFE6;
}
.cocoa-estadisticas .cocoa-resumen-table tbody tr:hover td {
background: #EBD8C4;
}
.cocoa-estadisticas .cocoa-resumen-table td.cocoa-dimension {
background: #EBD8C4 !important;
color: #744C35;
font-weight: 700;
text-align: left;
vertical-align: middle;
min-width: 125px;
border-right: 2px solid #D4A66C;
}
.cocoa-estadisticas .cocoa-dataset-source {
margin: 0 20px 20px;
}
'
estilo_tabs <- paste(
vapply(seq_along(niveles_cl), function(i) {
paste0(
".cocoa-estadisticas #cocoa-desc-", i,
":checked ~ .cocoa-desc-paneles .cocoa-desc-panel:nth-child(", i,
") {display:block;}",
".cocoa-estadisticas #cocoa-desc-", i,
":checked ~ .cocoa-desc-nav label:nth-child(", i,
") {background:", unname(paleta_grupo[niveles_cl[i]]),
";color:#FFFCF7;border-color:",
unname(paleta_grupo[niveles_cl[i]]), ";}"
)
}, character(1)),
collapse = "\n"
)
tablas_descriptivas <- lapply(seq_along(niveles_cl), function(i) {
g <- niveles_cl[i]
d <- base_clusters %>%
filter(Grupo == g)
est <- data.frame(
`Dimensión` = rep(nombres_dim, lengths(dimensiones)),
Indicador = unname(etiquetas[vars_perfil]),
Media = sapply(vars_perfil, function(v)
f1(mean(d[[v]], na.rm = TRUE))),
Mediana = sapply(vars_perfil, function(v)
f1(median(d[[v]], na.rm = TRUE))),
`Desv. estándar` = sapply(vars_perfil, function(v)
f1(sd(d[[v]], na.rm = TRUE))),
`Mínimo (país)` = sapply(vars_perfil, function(v) {
x <- d[[v]]
j <- which.min(x)
paste0(f1(x[j]), " (", d$Pais[j], ")")
}),
`Máximo (país)` = sapply(vars_perfil, function(v) {
x <- d[[v]]
j <- which.max(x)
paste0(f1(x[j]), " (", d$Pais[j], ")")
}),
check.names = FALSE,
row.names = NULL
)
filas <- lapply(seq_len(nrow(est)), function(j) {
primera <- j == 1 || est$Dimensión[j] != est$Dimensión[j - 1]
htmltools::tags$tr(
if (primera) {
htmltools::tags$td(
est$Dimensión[j],
rowspan = sum(est$Dimensión == est$Dimensión[j]),
class = "cocoa-dimension"
)
},
lapply(2:ncol(est), function(k) {
htmltools::tags$td(
as.character(est[j, k])
)
})
)
})
htmltools::tags$div(
class = "cocoa-desc-panel",
htmltools::tags$div(
class = "cocoa-desc-titulo",
g
),
htmltools::tags$div(
class = "cocoa-desc-subtitulo",
paste0(
"Cluster ", orden_cl[i],
" · ", nrow(d),
" países · 16 indicadores"
)
),
htmltools::tags$div(
class = "cocoa-tabla-contenedor",
htmltools::tags$table(
class = "cocoa-resumen-table",
htmltools::tags$thead(
htmltools::tags$tr(
lapply(names(est), htmltools::tags$th)
)
),
htmltools::tags$tbody(filas)
)
)
)
})
contenido_descriptivas <- htmltools::tagList(
htmltools::tags$style(
htmltools::HTML(
paste0(estilo_resumen, estilo_descriptivas, estilo_tabs)
)
),
htmltools::tags$div(
class = "cocoa-resumen cocoa-estadisticas",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados · Estadísticas descriptivas"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Estadísticas descriptivas por cluster"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
"Medias, medianas, desviaciones estándar y rangos · 16 indicadores"
)
),
htmltools::tags$div(
class = "cocoa-desc-tabs",
lapply(seq_along(niveles_cl), function(i) {
htmltools::tags$input(
type = "radio",
name = "cocoa-estadisticas-grupo",
id = paste0("cocoa-desc-", i),
class = "cocoa-desc-radio",
checked = if (i == 1) "checked" else NULL
)
}),
htmltools::tags$div(
class = "cocoa-desc-nav",
lapply(seq_along(niveles_cl), function(i) {
htmltools::tags$label(
`for` = paste0("cocoa-desc-", i),
paste("Cluster", orden_cl[i])
)
})
),
htmltools::tags$div(
class = "cocoa-desc-paneles",
tablas_descriptivas
)
),
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$strong("Nota: "),
"Las estadísticas se calcularon con los valores originales ",
"de los indicadores para cada conglomerado. Los valores ",
"mínimos y máximos incluyen el país correspondiente. ",
"Fuente: Elaboración propia con datos del Banco Mundial (2022)."
)
)
)
htmltools::browsable(contenido_descriptivas)
| Dimensión | Indicador | Media | Mediana | Desv. estándar | Mínimo (país) | Máximo (país) |
|---|---|---|---|---|---|---|
| Económica | PIB per cápita (US$ PPA) | 3.317,6 | 2.899,0 | 1.655,7 | 1.136,8 (Central African Republic) | 8.751,0 (Angola) |
| Crecimiento del PIB (%) | 4,0 | 4,5 | 3,5 | -6,2 (Afghanistan) | 12,2 (Niger) | |
| Inflación (%) | 15,0 | 9,6 | 18,8 | 1,4 (Benin) | 104,7 (Zimbabwe) | |
| Comercio internacional (% PIB) | 59,3 | 49,2 | 27,9 | 26,6 (Ethiopia) | 142,4 (Lesotho) | |
| Agricultura (% PIB) | 25,5 | 24,1 | 9,2 | 3,1 (Zambia) | 41,5 (Niger) | |
| Social y demográfica | Esperanza de vida (años) | 62,0 | 63,3 | 8,8 | 18,8 (Central African Republic) | 70,4 (Solomon Islands) |
| Fecundidad (hijos por mujer) | 4,4 | 4,3 | 0,9 | 2,7 (Haiti) | 6,2 (Chad) | |
| Mortalidad infantil (por 1.000 nacidos vivos) | 49,6 | 44,4 | 31,8 | 17,4 (Solomon Islands) | 206,8 (Central African Republic) | |
| Acceso básico al agua (%) | 66,2 | 66,8 | 11,3 | 36,3 (Central African Republic) | 86,3 (Gambia, The) | |
| Población urbana (%) | 38,7 | 36,1 | 13,3 | 16,7 (Malawi) | 69,1 (Angola) | |
| Crecimiento poblacional (%) | 2,3 | 2,5 | 0,8 | -0,3 (Central African Republic) | 3,5 (Chad) | |
| Tecnológica | Acceso a electricidad (%) | 48,6 | 49,1 | 20,6 | 11,7 (Chad) | 89,9 (Comoros) |
| Usuarios de internet (%) | 27,9 | 28,0 | 11,4 | 9,6 (Uganda) | 48,2 (Gambia, The) | |
| Ambiental | Superficie agrícola (%) | 52,1 | 52,1 | 22,4 | 4,0 (Solomon Islands) | 92,9 (Lesotho) |
| Superficie forestal (%) | 27,7 | 22,5 | 23,7 | 0,8 (Niger) | 89,9 (Solomon Islands) | |
| Áreas protegidas (%) | 13,7 | 14,2 | 10,4 | 0,2 (Solomon Islands) | 41,3 (Zambia) |
| Dimensión | Indicador | Media | Mediana | Desv. estándar | Mínimo (país) | Máximo (país) |
|---|---|---|---|---|---|---|
| Económica | PIB per cápita (US$ PPA) | 14.096,3 | 13.114,4 | 8.080,1 | 3.127,2 (Kiribati) | 33.520,8 (Turkiye) |
| Crecimiento del PIB (%) | 3,7 | 4,9 | 6,4 | -28,8 (Ukraine) | 12,6 (Armenia) | |
| Inflación (%) | 17,4 | 9,2 | 27,8 | 2,0 (China) | 171,2 (Lebanon) | |
| Comercio internacional (% PIB) | 89,6 | 79,6 | 47,7 | 33,8 (Bangladesh) | 302,3 (Djibouti) | |
| Agricultura (% PIB) | 10,3 | 9,7 | 6,3 | 1,2 (Lebanon) | 28,0 (Kiribati) | |
| Social y demográfica | Esperanza de vida (años) | 72,3 | 72,5 | 3,7 | 64,2 (Namibia) | 78,2 (China) |
| Fecundidad (hijos por mujer) | 2,3 | 2,3 | 0,7 | 0,9 (Ukraine) | 3,9 (Senegal) | |
| Mortalidad infantil (por 1.000 nacidos vivos) | 17,7 | 14,4 | 10,1 | 4,8 (China) | 45,8 (Djibouti) | |
| Acceso básico al agua (%) | 92,8 | 94,1 | 6,1 | 77,6 (Sao Tome and Principe) | 99,9 (Armenia) | |
| Población urbana (%) | 57,2 | 60,3 | 18,7 | 20,0 (Sri Lanka) | 95,5 (Uruguay) | |
| Crecimiento poblacional (%) | 0,8 | 1,0 | 1,6 | -7,6 (Ukraine) | 2,8 (Namibia) | |
| Tecnológica | Acceso a electricidad (%) | 94,7 | 100,0 | 10,7 | 56,2 (Namibia) | 100,0 (Algeria) |
| Usuarios de internet (%) | 71,4 | 75,4 | 13,2 | 41,6 (Bangladesh) | 92,3 (Kazakhstan) | |
| Ambiental | Superficie agrícola (%) | 50,2 | 49,5 | 18,3 | 4,1 (Egypt, Arab Rep.) | 87,6 (Uruguay) |
| Superficie forestal (%) | 22,2 | 18,4 | 16,1 | 0,0 (Egypt, Arab Rep.) | 57,5 (Sao Tome and Principe) | |
| Áreas protegidas (%) | 10,2 | 8,1 | 8,5 | 0,0 (Mauritius) | 31,8 (Cambodia) |
| Dimensión | Indicador | Media | Mediana | Desv. estándar | Mínimo (país) | Máximo (país) |
|---|---|---|---|---|---|---|
| Económica | PIB per cápita (US$ PPA) | 41.325,6 | 39.560,4 | 23.558,3 | 11.450,1 (Libya) | 132.570,8 (Luxembourg) |
| Crecimiento del PIB (%) | 3,7 | 3,9 | 3,8 | -8,3 (Libya) | 17,7 (Fiji) | |
| Inflación (%) | 9,0 | 8,3 | 4,3 | 1,7 (Bolivia) | 19,7 (Lithuania) | |
| Comercio internacional (% PIB) | 115,6 | 107,5 | 60,1 | 38,8 (Brazil) | 412,2 (Luxembourg) | |
| Agricultura (% PIB) | 4,3 | 3,2 | 3,7 | 0,2 (Luxembourg) | 17,0 (Albania) | |
| Social y demográfica | Esperanza de vida (años) | 77,7 | 77,7 | 4,4 | 67,1 (Fiji) | 84,0 (Japan) |
| Fecundidad (hijos por mujer) | 1,6 | 1,5 | 0,4 | 0,8 (Korea, Rep.) | 3,7 (Gabon) | |
| Mortalidad infantil (por 1.000 nacidos vivos) | 6,3 | 3,8 | 5,6 | 1,7 (Estonia) | 27,5 (Gabon) | |
| Acceso básico al agua (%) | 98,2 | 99,6 | 2,9 | 88,2 (Gabon) | 100,0 (Belgium) | |
| Población urbana (%) | 72,9 | 74,2 | 13,2 | 40,9 (Bhutan) | 95,0 (Netherlands) | |
| Crecimiento poblacional (%) | 0,4 | 0,6 | 0,9 | -2,5 (Serbia) | 2,2 (Gabon) | |
| Tecnológica | Acceso a electricidad (%) | 99,1 | 100,0 | 4,2 | 70,0 (Libya) | 100,0 (Albania) |
| Usuarios de internet (%) | 86,4 | 88,1 | 8,7 | 66,5 (Indonesia) | 99,0 (Norway) | |
| Ambiental | Superficie agrícola (%) | 31,7 | 31,6 | 17,3 | 2,7 (Norway) | 72,0 (United Kingdom) |
| Superficie forestal (%) | 44,3 | 40,7 | 18,9 | 0,1 (Libya) | 91,5 (Gabon) | |
| Áreas protegidas (%) | 22,4 | 17,9 | 15,8 | 0,2 (Libya) | 100,0 (Palau) |
| Dimensión | Indicador | Media | Mediana | Desv. estándar | Mínimo (país) | Máximo (país) |
|---|---|---|---|---|---|---|
| Económica | PIB per cápita (US$ PPA) | 62.413,7 | 57.223,7 | 38.827,1 | 8.850,1 (Cabo Verde) | 134.828,0 (Singapore) |
| Crecimiento del PIB (%) | 8,0 | 7,5 | 3,7 | 2,6 (Malta) | 15,8 (Cabo Verde) | |
| Inflación (%) | 5,1 | 5,0 | 2,0 | 2,3 (Maldives) | 8,3 (Iceland) | |
| Comercio internacional (% PIB) | 142,9 | 103,0 | 82,0 | 56,8 (Saudi Arabia) | 330,2 (Singapore) | |
| Agricultura (% PIB) | 1,8 | 1,2 | 1,7 | 0,0 (Singapore) | 5,1 (Maldives) | |
| Social y demográfica | Esperanza de vida (años) | 80,0 | 80,9 | 3,2 | 72,0 (Iraq) | 82,9 (Singapore) |
| Fecundidad (hijos por mujer) | 1,8 | 1,6 | 0,7 | 1,0 (Singapore) | 3,3 (Iraq) | |
| Mortalidad infantil (por 1.000 nacidos vivos) | 6,5 | 5,0 | 5,0 | 2,0 (Singapore) | 21,4 (Iraq) | |
| Acceso básico al agua (%) | 98,3 | 100,0 | 3,2 | 90,0 (Cabo Verde) | 100,0 (Israel) | |
| Población urbana (%) | 84,3 | 88,5 | 17,2 | 41,1 (Maldives) | 100,0 (Bahrain) | |
| Crecimiento poblacional (%) | 3,1 | 2,5 | 1,7 | 0,6 (Cabo Verde) | 5,9 (Qatar) | |
| Tecnológica | Acceso a electricidad (%) | 99,8 | 100,0 | 0,8 | 97,1 (Cabo Verde) | 100,0 (Bahrain) |
| Usuarios de internet (%) | 92,9 | 95,6 | 8,5 | 73,3 (Cabo Verde) | 100,0 (Bahrain) | |
| Ambiental | Superficie agrícola (%) | 22,7 | 19,1 | 22,8 | 0,9 (Singapore) | 80,8 (Saudi Arabia) |
| Superficie forestal (%) | 5,6 | 2,7 | 6,6 | 0,0 (Oman) | 21,9 (Singapore) | |
| Áreas protegidas (%) | 6,3 | 4,2 | 6,1 | 0,0 (Cabo Verde) | 20,5 (Bahrain) |
Las estadísticas descriptivas confirman diferencias importantes entre los cuatro conglomerados. El cluster 1: Bajo desarrollo y base agrícola presenta las condiciones más desfavorables, con un PIB per cápita mediano de 2.899,0, esperanza de vida de 63,3 años y mortalidad infantil de 44,4 por cada 1.000 nacidos vivos. En contraste, el cluster 3: Desarrollo medio en transición registra un ingreso mediano de 13.114,4, una esperanza de vida de 72,5 años y una cobertura eléctrica mediana del 100 %.
El cluster 2: Desarrollo alto con riqueza natural alcanza un PIB per cápita mediano de 39.560,4, una mortalidad infantil de 3,8 y una superficie forestal del 40,7 %, la más elevada entre los grupos. Por su parte, el cluster 4: Altos ingresos urbanos sin bosques presenta el mayor ingreso mediano (57.223,7), urbanización (88,5 %) y uso de internet (95,6 %), pero la menor superficie forestal (2,7 %). Estas diferencias evidencian que los conglomerados no solo se distinguen por sus condiciones económicas y sociales, sino también por sus características tecnológicas y ambientales.
z_std <- scale(datos_acp[, vars_perfil])
z_cl <- sapply(niveles_cl, function(g)
apply(z_std[base_clusters$Grupo == g, , drop = FALSE], 2, median))
etq_filas <- unname(etq_atlas[vars_perfil])
# Valor escrito dentro de cada celda
valores_celda <- list()
for (j in seq_along(niveles_cl)) for (i in seq_along(vars_perfil)) {
valores_celda[[length(valores_celda) + 1]] <- list(
x = nombres_br[j], y = etq_filas[i], text = f1(z_cl[i, j], 1), showarrow = FALSE,
font = list(size = 11, color = if (abs(z_cl[i, j]) > 1.1) "#FFFCF7" else "#51382C")
)
}
texto_hover <- matrix(paste0(
"<b>", rep(unname(etiquetas[vars_perfil]), 4), "</b>",
"<br>", rep(niveles_cl, each = length(vars_perfil)),
"<br>Mediana: ", as.vector(f1(med_cl)),
"<br>Posición frente al promedio: ", as.vector(f1(z_cl, 2)), " desv. estándar"
), nrow = length(vars_perfil))
plotly::plot_ly(
x = nombres_br, y = etq_filas, z = z_cl,
type = "heatmap", zmin = -2, zmax = 2,
colorscale = list(list(0, "#3F6656"), list(0.25, "#8FAE9E"), list(0.5, "#F6EFE6"),
list(0.75, "#D49A73"), list(1, "#8E3B1E")),
text = texto_hover, hoverinfo = "text", xgap = 3, ygap = 3,
colorbar = list(title = list(text = "Frente al<br>promedio"), len = 0.6, thickness = 14,
outlinewidth = 0, tickvals = c(-2, -1, 0, 1, 2),
ticktext = c("Muy por debajo", "", "Promedio", "", "Muy por encima")),
height = 680
) %>%
estilo_plotly("¿En qué se distingue cada cluster?",
"Mediana de los indicadores estandarizados: terracota = por encima del promedio, verde = por debajo",
leyenda = FALSE, margen_sup = 110) %>%
plotly::layout(
xaxis = list(side = "top", tickfont = list(size = 12), title = ""),
yaxis = list(autorange = "reversed", title = "", tickfont = list(size = 12)),
margin = list(l = 140, r = 30, t = 160, b = 20),
annotations = valores_celda
)
El mapa de calor permite identificar las diferencias entre los cuatro conglomerados mediante los valores estandarizados de los 16 indicadores. El cluster 1: Bajo desarrollo y base agrícola presenta valores inferiores al promedio en ingreso, acceso al agua, electricidad e internet, junto con mayores niveles de fecundidad, mortalidad infantil y participación agrícola en el PIB. El cluster 3: Desarrollo medio en transición muestra valores generalmente cercanos al promedio, reflejando condiciones intermedias de desarrollo.
Por su parte, el cluster 2: Desarrollo alto con riqueza natural destaca por sus mejores condiciones económicas, sociales y tecnológicas, además de una mayor superficie forestal. Finalmente, el cluster 4: Altos ingresos urbanos sin bosques presenta valores elevados en ingreso, urbanización y uso de internet, pero registra los niveles relativos más bajos de superficie forestal y áreas protegidas. En conjunto, el mapa confirma que los conglomerados presentan diferencias no solo socioeconómicas, sino también demográficas y ambientales.
tabla_cluster(niveles_cl[1])
| País | Continente | PIB per cápita (US$ PPA) | Esperanza de vida | Mortalidad infantil | Internet (%) | Sup. forestal (%) | Silueta |
|---|---|---|---|---|---|---|---|
| Sierra Leone | África | 2.935 | 61,3 | 58,1 | 21,5 | 34,6 | 0,57 |
| Madagascar | África | 1.602 | 63,1 | 44,1 | 17,8 | 17,7 | 0,57 |
| Mozambique | África | 1.477 | 63,0 | 45,9 | 19,0 | 42,0 | 0,56 |
| Uganda | África | 2.725 | 67,7 | 36,5 | 9,6 | 12,2 | 0,56 |
| Mali | África | 2.814 | 60,0 | 51,2 | 35,2 | 8,8 | 0,56 |
| Burkina Faso | África | 2.469 | 60,7 | 46,1 | 25,4 | 13,1 | 0,55 |
| Ethiopia | África | 2.656 | 66,9 | 48,3 | 18,0 | 23,8 | 0,55 |
| Malawi | África | 1.660 | 66,0 | 38,6 | 16,8 | 22,9 | 0,54 |
El cluster 1: Bajo desarrollo y base agrícola agrupa 30 países caracterizados por importantes limitaciones económicas, sociales y tecnológicas. Presenta un PIB per cápita mediano de 2.899,0 dólares PPA, el más bajo entre los cuatro conglomerados. Su esperanza de vida es de 63,3 años y la mortalidad infantil alcanza 44,4 por cada 1.000 nacidos vivos, evidenciando condiciones de desarrollo humano menos favorables. Asimismo, el acceso mediano a electricidad es de apenas 49,1 %, al agua básica de 66,8 % y el uso de internet de 28,0 %, lo que refleja importantes brechas de infraestructura y conectividad.
En el ámbito económico, la agricultura representa una mediana del 24,1 % del PIB, la mayor participación entre los grupos, mientras que la población urbana alcanza solamente el 36,1 %. Además, presenta una fecundidad de 4,3 hijos por mujer y un crecimiento poblacional del 2,5 % anual, características que lo diferencian de los conglomerados con mayor desarrollo.
Geográficamente, 27 de sus 30 países pertenecen a África. Entre sus integrantes más representativos destacan Sierra Leona, Madagascar y Mozambique, con coeficientes de silueta entre 0,56 y 0,57. Aunque existen diferencias internas, especialmente en superficie forestal y acceso a servicios, el conglomerado mantiene un perfil marcado por bajos ingresos, elevada participación agrícola y mayores limitaciones sociales y tecnológicas.
tabla_cluster(niveles_cl[2])
| País | Continente | PIB per cápita (US$ PPA) | Esperanza de vida | Mortalidad infantil | Internet (%) | Sup. forestal (%) | Silueta |
|---|---|---|---|---|---|---|---|
| Uzbekistan | Asia | 10.091 | 72,1 | 13,5 | 83,9 | 8,6 | 0,42 |
| Bangladesh | Asia | 7.888 | 74,3 | 24,4 | 41,6 | 14,4 | 0,40 |
| India | Asia | 8.347 | 71,7 | 25,7 | 55,9 | 24,4 | 0,38 |
| Kyrgyz Republic | Asia | 6.140 | 72,0 | 15,1 | 84,2 | 6,5 | 0,36 |
| South Africa | África | 13.767 | 65,5 | 24,3 | 78,3 | 18,6 | 0,36 |
| Morocco | África | 8.690 | 75,2 | 15,9 | 89,9 | 12,8 | 0,35 |
| Tonga | Oceanía | 6.811 | 72,6 | 8,2 | 61,6 | 12,1 | 0,35 |
| Guatemala | América | 12.144 | 71,2 | 18,3 | 54,4 | 33,4 | 0,33 |
El cluster 3: Desarrollo medio en transición reúne 42 países que presentan condiciones socioeconómicas intermedias y una considerable diversidad interna. Su PIB per cápita mediano alcanza 13.114,4 dólares PPA, superior al del cluster 1, pero considerablemente inferior al de los conglomerados de desarrollo alto. La esperanza de vida es de 72,5 años y la mortalidad infantil de 14,4 por cada 1.000 nacidos vivos, mostrando mejores condiciones sociales respecto al grupo de bajo desarrollo.
En infraestructura y tecnología, la cobertura eléctrica presenta una mediana del 100 %, el acceso básico al agua alcanza el 94,1 % y el uso de internet el 75,4 %. Sin embargo, estos avances no son uniformes entre los países. En el ámbito económico, la agricultura representa el 9,7 % del PIB, mientras que la población urbana alcanza el 60,3 %. Su superficie forestal mediana es del 18,4 % y las áreas protegidas representan el 8,1 %, valores inferiores a los del cluster 2.
Geográficamente, predomina Asia con 19 países, seguida de África con 11 y América con 8. Entre los países más representativos se encuentran Uzbekistán, Bangladesh e India, con coeficientes de silueta entre 0,38 y 0,42. La heterogeneidad del conglomerado se observa en las diferencias de ingresos, conectividad y condiciones sociales de sus integrantes. Por ello, representa un perfil de desarrollo intermedio, con avances importantes, pero también con desigualdades entre países.
tabla_cluster(niveles_cl[3])
| País | Continente | PIB per cápita (US$ PPA) | Esperanza de vida | Mortalidad infantil | Internet (%) | Sup. forestal (%) | Silueta |
|---|---|---|---|---|---|---|---|
| New Zealand | Oceanía | 49.843 | 82,0 | 4,2 | 93,1 | 38,4 | 0,46 |
| Chile | América | 29.560 | 79,2 | 5,9 | 92,3 | 24,5 | 0,46 |
| Slovenia | Europa | 47.059 | 81,3 | 1,9 | 88,9 | 61,8 | 0,44 |
| Costa Rica | América | 25.290 | 79,3 | 8,6 | 82,6 | 58,9 | 0,44 |
| Sweden | Europa | 62.545 | 83,1 | 2,0 | 95,0 | 68,6 | 0,44 |
| Finland | Europa | 57.068 | 81,2 | 1,9 | 93,0 | 74,2 | 0,44 |
| Germany | Europa | 63.778 | 80,6 | 3,1 | 91,6 | 32,8 | 0,44 |
| Estonia | Europa | 43.125 | 77,8 | 1,7 | 91,5 | 57,2 | 0,43 |
El cluster 2: Desarrollo alto con riqueza natural está conformado por 58 países que combinan condiciones económicas y sociales favorables con una importante cobertura de recursos naturales. Presenta un PIB per cápita mediano de 39.560,4 dólares PPA, una esperanza de vida de 77,7 años y una mortalidad infantil de apenas 3,8 por cada 1.000 nacidos vivos. Además, la cobertura eléctrica presenta una mediana del 100 %, el acceso básico al agua alcanza el 99,6 % y el uso de internet el 88,1 %, reflejando niveles elevados de infraestructura y conectividad.
En el ámbito demográfico, presenta una fecundidad mediana de 1,5 hijos por mujer, un crecimiento poblacional del 0,6 % anual y una población urbana del 74,2 %. Su principal característica ambiental es la superficie forestal mediana del 40,7 %, la más elevada entre los conglomerados, acompañada de un 17,9 % de áreas protegidas. Estos indicadores justifican su denominación al combinar mejores condiciones de desarrollo con una mayor cobertura forestal.
Geográficamente, predominan los países europeos, con 35 de los 58 integrantes. Entre sus representantes destacan Nueva Zelanda, Chile, Eslovenia y Costa Rica, con coeficientes de silueta entre 0,44 y 0,46. Aunque existen diferencias en ingreso y cobertura forestal, comparten condiciones socioeconómicas relativamente favorables. Colombia también pertenece a este conglomerado, aunque su puntuación en el CP1 (0,94) es inferior al promedio del grupo (1,93), lo que evidencia diferencias de desarrollo dentro de una misma clasificación.
tabla_cluster(niveles_cl[4])
| País | Continente | PIB per cápita (US$ PPA) | Esperanza de vida | Mortalidad infantil | Internet (%) | Sup. forestal (%) | Silueta |
|---|---|---|---|---|---|---|---|
| Qatar | Asia | 114.740 | 81,9 | 5,0 | 98,0 | 0,1 | 0,55 |
| Kuwait | Asia | 51.380 | 80,6 | 7,4 | 99,7 | 0,4 | 0,55 |
| United Arab Emirates | Asia | 70.076 | 80,5 | 4,2 | 100,0 | 4,6 | 0,52 |
| Oman | Asia | 39.780 | 77,9 | 8,5 | 95,2 | 0,0 | 0,51 |
| Iceland | Europa | 66.581 | 82,1 | 2,2 | 97,6 | 0,6 | 0,48 |
| Saudi Arabia | Asia | 67.179 | 77,3 | 5,0 | 100,0 | 1,3 | 0,47 |
| Israel | Asia | 48.132 | 82,7 | 2,7 | 91,9 | 6,7 | 0,39 |
| Singapore | Asia | 134.828 | 82,9 | 2,0 | 96,0 | 21,9 | 0,36 |
El cluster 4: Altos ingresos urbanos sin bosques reúne 14 países y se caracteriza por presentar los mayores niveles de ingreso, urbanización y conectividad digital. Su PIB per cápita mediano alcanza 57.223,7 dólares PPA, el más elevado entre los cuatro conglomerados. La esperanza de vida es de 80,9 años, la mortalidad infantil de 5,0 por cada 1.000 nacidos vivos y el acceso básico al agua y a la electricidad presenta medianas del 100 %. Asimismo, el uso de internet alcanza el 95,6 %, reflejando una amplia conectividad.
En el ámbito económico y demográfico, destaca por una población urbana mediana del 88,5 %, una participación agrícola de apenas 1,2 % del PIB y un crecimiento poblacional del 2,5 % anual. Su principal diferencia ambiental respecto al cluster 2 es la reducida superficie forestal, con una mediana del 2,7 %, y una cobertura de áreas protegidas del 4,2 %. Esto indica que su elevado desarrollo económico y tecnológico coexiste con una menor presencia relativa de bosques, aunque no significa que todos sus países carezcan completamente de ellos.
Geográficamente, 10 de sus 14 integrantes pertenecen a Asia. Entre los países más representativos destacan Catar, Kuwait, Emiratos Árabes Unidos y Omán, con coeficientes de silueta entre 0,51 y 0,55. Sin embargo, existen diferencias internas importantes, especialmente en ingreso, como muestran los casos de Cabo Verde y Singapur. En conjunto, este conglomerado representa un perfil de elevada urbanización y conectividad, con condiciones ambientales diferentes a las del cluster 2.
sil_df <- base_clusters %>%
arrange(Grupo, desc(Silueta)) %>%
mutate(pos = row_number())
pos_col <- sil_df$pos[sil_df$Codigo_pais == "COL"]
plotly::plot_ly(
sil_df, x = ~pos, y = ~Silueta, type = "bar",
color = ~Grupo, colors = paleta_grupo,
text = ~paste0("<b>", Pais, "</b><br>", Grupo, "<br>Silueta: ", f1(Silueta, 2)),
hoverinfo = "text", textposition = "none",
height = 520
) %>%
plotly::add_annotations(
x = pos_col, y = sil_df$Silueta[sil_df$pos == pos_col],
text = "<b>Colombia</b>", showarrow = TRUE, arrowhead = 0, ax = 0, ay = -45,
font = list(color = "#A85D3F", size = 12), arrowcolor = "#A85D3F"
) %>%
estilo_plotly("Silueta de los 144 países",
"Cada barra es un país; las barras negativas indican países más parecidos a otro grupo") %>%
plotly::layout(
bargap = 0.15,
xaxis = list(title = "", showticklabels = FALSE, showgrid = FALSE, zeroline = FALSE),
yaxis = list(title = "Coeficiente de silueta", gridcolor = "#EFE6DC",
zeroline = TRUE, zerolinecolor = "#C9A27E"),
shapes = list(list(type = "line", xref = "paper", x0 = 0, x1 = 1,
y0 = mean(sil_df$Silueta), y1 = mean(sil_df$Silueta),
line = list(color = "#C47758", width = 1.5, dash = "dash")))
)
La Figura 28 permite evaluar qué tan bien se encuentran agrupados los 144 países mediante sus coeficientes individuales de silueta. El cluster 1: Bajo desarrollo y base agrícola presenta la mayor silueta promedio (0,417), seguido del cluster 4: Altos ingresos urbanos sin bosques (0,380), lo que indica una mayor separación respecto a los demás grupos. En contraste, el cluster 3: Desarrollo medio en transición registra el promedio más bajo (0,192), seguido del cluster 2: Desarrollo alto con riqueza natural (0,245), evidenciando una mayor proximidad entre algunos de sus integrantes y otros conglomerados.
De los 144 países, siete presentan coeficientes negativos: México, China, República Dominicana y Georgia, pertenecientes al cluster 3; y Chipre, Indonesia y Fiyi, del cluster 2. Esto indica que, según las distancias utilizadas, estos países se encuentran más próximos a otro conglomerado que al propio. Colombia, clasificada en el cluster 2, presenta una silueta de 0,115, lo que refleja una pertenencia relativamente débil al grupo.
En conjunto, la silueta promedio de 0,2785 muestra una estructura de agrupamiento debil, con cierto solapamiento entre los cuatro conglomerados. Aunque existen países fronterizos, la clasificación permite identificar perfiles diferenciados de desarrollo económico, social, tecnológico y ambiental.
Los cuatro conglomerados presentan características compatibles con la teoría del cambio estructural de Lewis (1954) y Chenery y Syrquin (1975). Del cluster 1: Bajo desarrollo y base agrícola al cluster 4: Altos ingresos urbanos sin bosques, el PIB per cápita mediano aumenta de 2.899 a 57.224 dólares PPA, la participación agrícola disminuye de 24,1 % a 1,2 % del PIB y la urbanización crece de 36,1 % a 88,5 %. Estas diferencias respaldan los nombres asignados a los perfiles.
La dimensión ambiental también resulta importante: el cluster 2: Desarrollo alto con riqueza natural presenta una superficie forestal mediana del 40,7 %, frente al 2,7 % del cluster 4: Altos ingresos urbanos sin bosques. La variación de cobertura forestal entre los grupos muestra que el desarrollo económico no implica necesariamente una mayor presencia de bosques. Además, el cluster 4 incluye economías petroleras del Golfo, con características compatibles con la teoría de los Estados rentistas de Beblawi y Luciani (1987).
Colombia pertenece al cluster 2: Desarrollo alto con riqueza natural, aunque su silueta de 0,11 indica una pertenencia relativamente débil. Comparte características ambientales con este grupo, como una superficie forestal del 53,9 %, pero presenta un PIB per cápita de 18.459 dólares PPA y una puntuación en CP1 de 0,94, inferior al promedio del conglomerado (1,93). Estos resultados muestran que los clusters representan perfiles multidimensionales y no categorías rígidas de desarrollo.
Esta sección presenta la distribución de los 144 países entre los cuatro conglomerados. Primero se examina su ubicación geográfica mediante el mapa mundial; posteriormente, se analiza su distribución en el espacio tridimensional CP1–CP2–CP3 y en el plano CP3–CP4. Finalmente, una tabla interactiva permite consultar la clasificación y los principales indicadores de cada país.
z_cl_mapa <- as.integer(base_clusters$Grupo)
escala_cl <- list()
for (k in seq_along(niveles_cl)) {
escala_cl[[length(escala_cl) + 1]] <- list((k - 1) / 4, unname(paleta_grupo[k]))
escala_cl[[length(escala_cl) + 1]] <- list(k / 4, unname(paleta_grupo[k]))
}
plotly::plot_ly(
type = "choropleth",
locations = base_clusters$Codigo_pais,
z = z_cl_mapa,
zmin = 0.5,
zmax = 4.5,
colorscale = escala_cl,
text = paste0("<b>", base_clusters$Pais, "</b>",
"<br>", base_clusters$Grupo,
"<br>Continente: ", base_clusters$Continente,
"<br>Silueta: ", f1(base_clusters$Silueta, 2)),
hoverinfo = "text",
marker = list(line = list(color = "#FFFCF7", width = 0.6)),
colorbar = list(
title = list(text = ""),
tickvals = 1:4, ticktext = nombres_br,
tickfont = list(family = "Satoshi, Arial, sans-serif", size = 11, color = "#51382C"),
len = 0.7, thickness = 16, outlinewidth = 0
),
height = 600
) %>%
estilo_plotly("Los cuatro conglomerados en el mapa",
"Los países en gris no forman parte del estudio por falta de datos",
leyenda = FALSE) %>%
plotly::layout(
geo = list(
showframe = FALSE, showcoastlines = FALSE,
showcountries = TRUE, countrycolor = "#FFFCF7",
showland = TRUE, landcolor = "#EAE5DF",
showocean = FALSE, bgcolor = "#FFFCF7",
projection = list(type = "natural earth"),
lataxis = list(range = c(-58, 85))
),
margin = list(t = 90, b = 10, l = 10, r = 10)
)
El mapa muestra una marcada concentración geográfica de los conglomerados, aunque también presenta excepciones. El cluster 1: Bajo desarrollo y base agrícola predomina en gran parte del África subsahariana, mientras que algunos países, como Sudáfrica, Ghana y Senegal, pertenecen al cluster 3: Desarrollo medio en transición. Europa se concentra principalmente en el cluster 2: Desarrollo alto con riqueza natural, mientras que el cluster 4: Altos ingresos urbanos sin bosques tiene una presencia destacada en la península arábiga.
Las mayores diferencias regionales se observan en América Latina y Asia. En América, Colombia, Ecuador, Perú, Bolivia, Brasil, Chile, Costa Rica y Panamá pertenecen al cluster 2, mientras que México, Guatemala, Honduras, El Salvador, República Dominicana, Paraguay y Uruguay forman parte del cluster 3. En Asia, Japón, Corea del Sur, Malasia, Tailandia e Indonesia se agrupan en el cluster 2, mientras que China, India y varios países de Asia central pertenecen al cluster 3. Estas diferencias evidencian que la proximidad geográfica no determina por sí sola la clasificación, pues los conglomerados responden a características económicas, sociales, tecnológicas y ambientales.
Para complementar la distribución geográfica, se representan los 144 países en el espacio formado por los tres primeros componentes principales, que explican conjuntamente el 68,93 % de la variabilidad. Los colores identifican los cuatro conglomerados obtenidos mediante Ward, mientras que los centroides permiten visualizar sus posiciones centrales. Se destaca Colombia para examinar su ubicación respecto a los demás países y grupos. Esta representación permite explorar la separación y el solapamiento entre los perfiles de desarrollo.
library(dplyr)
library(plotly)
colores_3d <- c(
"Bajo desarrollo y base agrícola" = "#B77A4D",
"Desarrollo medio en transición" = "#D4A66C",
"Desarrollo alto con riqueza natural" = "#789184",
"Altos ingresos urbanos sin bosques" = "#8B6B54"
)
datos_3d <- data.frame(
Codigo_pais = rownames(datos_ward),
CP1 = datos_ward[[1]],
CP2 = datos_ward[[2]],
CP3 = datos_ward[[3]]
) %>%
left_join(
base_clusters %>%
select(Codigo_pais, Pais, Grupo),
by = "Codigo_pais"
) %>%
mutate(
Grupo = factor(
as.character(Grupo),
levels = names(colores_3d)
),
Etiqueta = paste0(
"<b>", Pais, "</b>",
"<br>", Grupo,
"<br>CP1: ", formatC(CP1, digits = 2, format = "f", decimal.mark = ","),
"<br>CP2: ", formatC(CP2, digits = 2, format = "f", decimal.mark = ","),
"<br>CP3: ", formatC(CP3, digits = 2, format = "f", decimal.mark = ",")
)
)
centroides_3d <- datos_3d %>%
group_by(Grupo) %>%
summarise(
CP1 = mean(CP1),
CP2 = mean(CP2),
CP3 = mean(CP3),
.groups = "drop"
) %>%
mutate(
Etiqueta = paste0(
"<b>Centroide</b>",
"<br>", Grupo,
"<br>CP1: ", round(CP1, 2),
"<br>CP2: ", round(CP2, 2),
"<br>CP3: ", round(CP3, 2)
)
)
grafico_clusters_3d <- plotly::plot_ly()
for (grupo in names(colores_3d)) {
datos_grupo <- datos_3d %>%
filter(
as.character(Grupo) == grupo,
Codigo_pais != "COL"
)
grafico_clusters_3d <- grafico_clusters_3d %>%
plotly::add_trace(
data = datos_grupo,
x = ~CP1,
y = ~CP2,
z = ~CP3,
type = "scatter3d",
mode = "markers",
name = grupo,
text = ~Etiqueta,
hoverinfo = "text",
marker = list(
size = 5,
color = unname(colores_3d[grupo]),
opacity = 0.80,
line = list(
color = "#FFFCF7",
width = 0.5
)
),
showlegend = TRUE
)
}
for (grupo in names(colores_3d)) {
centro <- centroides_3d %>%
filter(as.character(Grupo) == grupo)
grafico_clusters_3d <- grafico_clusters_3d %>%
plotly::add_trace(
data = centro,
x = ~CP1,
y = ~CP2,
z = ~CP3,
type = "scatter3d",
mode = "markers",
text = ~Etiqueta,
hoverinfo = "text",
marker = list(
size = 9,
symbol = "cross",
color = unname(colores_3d[grupo]),
line = list(
color = "#51382C",
width = 2
)
),
showlegend = FALSE
)
}
colombia_3d <- datos_3d %>%
filter(Codigo_pais == "COL")
grafico_clusters_3d <- grafico_clusters_3d %>%
plotly::add_trace(
data = colombia_3d,
x = ~CP1,
y = ~CP2,
z = ~CP3,
type = "scatter3d",
mode = "markers",
name = "Colombia",
text = ~Etiqueta,
hoverinfo = "text",
marker = list(
size = 11,
symbol = "diamond",
color = "#51382C",
line = list(
color = "#FFFCF7",
width = 3
)
),
showlegend = TRUE
) %>%
plotly::layout(
scene = list(
xaxis = list(
title = "CP1 · Desarrollo socioeconómico",
backgroundcolor = "#FFFCF7",
gridcolor = "#E5D8C9",
zerolinecolor = "#B77A4D",
showbackground = TRUE
),
yaxis = list(
title = "CP2 · Dinámica económica",
backgroundcolor = "#FFFCF7",
gridcolor = "#E5D8C9",
zerolinecolor = "#B77A4D",
showbackground = TRUE
),
zaxis = list(
title = "CP3 · Dimensión ambiental",
backgroundcolor = "#FFFCF7",
gridcolor = "#E5D8C9",
zerolinecolor = "#B77A4D",
showbackground = TRUE
),
camera = list(
eye = list(x = 1.7, y = 1.5, z = 1.2)
)
),
legend = list(
title = list(text = "<b>Conglomerados</b>"),
x = 1.02,
y = 0.98,
bgcolor = "rgba(255,252,247,0.95)",
font = list(
family = "Satoshi, Arial, sans-serif",
size = 11,
color = "#51382C"
)
),
paper_bgcolor = "#FFFCF7",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C"
),
margin = list(
l = 0,
r = 290,
t = 25,
b = 10
),
height = 650
) %>%
plotly::config(
displaylogo = FALSE,
responsive = TRUE,
toImageButtonOptions = list(
format = "png",
filename = "clusters_3d_ward",
width = 1400,
height = 900
)
)
grafico_clusters_3d
La Figura 30 muestra que la separación de los conglomerados se relaciona principalmente con el CP1, que distingue al cluster 1: Bajo desarrollo y base agrícola por sus puntuaciones negativas. El cluster 3: Desarrollo medio en transición ocupa posiciones intermedias, mientras que el cluster 2: Desarrollo alto con riqueza natural presenta puntuaciones positivas en CP1 y generalmente negativas en CP3. Por su parte, el cluster 4: Altos ingresos urbanos sin bosques se diferencia especialmente por sus valores elevados en CP2. Aunque se observan perfiles distintos, existe cierto solapamiento entre los grupos, especialmente entre los clusters 2 y 3. Colombia, destacada mediante un rombo, se ubica dentro del cluster 2, aunque relativamente cerca de países con características intermedias. La visualización permite reconocer diferencias multidimensionales, sin representar una separación perfecta entre los cuatro grupos.
Para complementar la representación tridimensional, se presenta la distribución de los países según el tercer y cuarto componente principal, que explican conjuntamente el 15,80 % de la variabilidad. Esta visualización permite examinar las diferencias ambientales y otras características complementarias que no se observan directamente en el plano CP1–CP2. Se destacan los centroides de los cuatro conglomerados y la posición de Colombia.
colores_cp34 <- c(
"Bajo desarrollo y base agrícola" = "#B77A4D",
"Desarrollo medio en transición" = "#D4A66C",
"Desarrollo alto con riqueza natural" = "#789184",
"Altos ingresos urbanos sin bosques" = "#8B6B54"
)
datos_cp34 <- data.frame(
Codigo_pais = rownames(datos_ward),
CP3 = datos_ward[[3]],
CP4 = datos_ward[[4]]
) %>%
left_join(
base_clusters %>%
select(Codigo_pais, Pais, Grupo),
by = "Codigo_pais"
) %>%
mutate(
Grupo = factor(
as.character(Grupo),
levels = names(colores_cp34)
),
Etiqueta = paste0(
"<b>", Pais, "</b>",
"<br>", Grupo,
"<br>CP3: ", round(CP3, 2),
"<br>CP4: ", round(CP4, 2)
)
)
centroides_cp34 <- datos_cp34 %>%
group_by(Grupo) %>%
summarise(
CP3 = mean(CP3),
CP4 = mean(CP4),
.groups = "drop"
)
grafico_cp34 <- plotly::plot_ly()
for (grupo in names(colores_cp34)) {
datos_grupo <- datos_cp34 %>%
filter(
as.character(Grupo) == grupo,
Codigo_pais != "COL"
)
grafico_cp34 <- grafico_cp34 %>%
plotly::add_trace(
data = datos_grupo,
x = ~CP3,
y = ~CP4,
type = "scatter",
mode = "markers",
name = grupo,
text = ~Etiqueta,
hoverinfo = "text",
marker = list(
size = 10,
color = unname(colores_cp34[grupo]),
opacity = 0.8,
line = list(
color = "#FFFCF7",
width = 1
)
),
showlegend = TRUE
)
}
for (grupo in names(colores_cp34)) {
centro <- centroides_cp34 %>%
filter(as.character(Grupo) == grupo)
grafico_cp34 <- grafico_cp34 %>%
plotly::add_trace(
data = centro,
x = ~CP3,
y = ~CP4,
type = "scatter",
mode = "markers",
name = paste("Centroide:", grupo),
marker = list(
size = 15,
symbol = "x",
color = unname(colores_cp34[grupo]),
line = list(
color = "#51382C",
width = 2
)
),
hoverinfo = "name",
showlegend = FALSE
)
}
colombia_cp34 <- datos_cp34 %>%
filter(Codigo_pais == "COL")
grafico_cp34 <- grafico_cp34 %>%
plotly::add_trace(
data = colombia_cp34,
x = ~CP3,
y = ~CP4,
type = "scatter",
mode = "markers+text",
name = "Colombia",
text = "Colombia",
textposition = "top center",
hoverinfo = "text",
marker = list(
size = 15,
symbol = "diamond",
color = "#51382C",
line = list(
color = "#FFFCF7",
width = 2
)
),
showlegend = TRUE
) %>%
plotly::layout(
xaxis = list(
title = "CP3 · Dimensión ambiental",
gridcolor = "#E8DCD0",
zerolinecolor = "#B77A4D",
linecolor = "#C7AD94"
),
yaxis = list(
title = "CP4 · Dimensión complementaria",
gridcolor = "#E8DCD0",
zerolinecolor = "#B77A4D",
linecolor = "#C7AD94"
),
plot_bgcolor = "#FFFCF7",
paper_bgcolor = "#FFFCF7",
font = list(
family = "Satoshi, Arial, sans-serif",
color = "#51382C",
size = 12
),
legend = list(
title = list(text = "<b>Conglomerados</b>"),
x = 1.02,
y = 0.98,
bgcolor = "rgba(255,252,247,0.95)",
font = list(size = 10)
),
margin = list(
l = 75,
r = 290,
t = 35,
b = 70
),
height = 570
) %>%
plotly::config(
responsive = TRUE,
displaylogo = FALSE
)
grafico_cp34
La Figura 31 permite examinar las diferencias entre los conglomerados a partir de los componentes CP3 y CP4. El cluster 2: Desarrollo alto con riqueza natural presenta, en promedio, puntuaciones negativas en CP3, mientras que el cluster 3: Desarrollo medio en transición registra puntuaciones positivas, reflejando diferencias en sus características ambientales. Por su parte, el cluster 4: Altos ingresos urbanos sin bosques destaca por sus valores positivos en CP4. Colombia presenta puntuaciones de −0,62 en CP3 y −0,93 en CP4, dentro del perfil del cluster 2. Aunque existe superposición entre los grupos, esta representación complementa las visualizaciones anteriores al incorporar dimensiones que también participaron en la clasificación.
Como complemento del mapa mundial, se presenta una tabla interactiva que permite consultar y comparar la clasificación de los 144 países. A través de sus filtros y buscador, es posible seleccionar países por continente o conglomerado y examinar sus indicadores de PIB per cápita, esperanza de vida, acceso a internet y cobertura forestal. Además, incluye el coeficiente de silueta para evaluar qué tan bien se ajusta cada país al grupo asignado, facilitando la identificación de similitudes, diferencias y casos fronterizos entre los conglomerados.
colores_segmentos <- c(
"Bajo desarrollo y base agrícola" = "#B77A4D",
"Desarrollo medio en transición" = "#D4A66C",
"Desarrollo alto con riqueza natural" = "#789184",
"Altos ingresos urbanos sin bosques" = "#8B6B54"
)
nombres_segmentos <- c(
"1" = "Bajo desarrollo y base agrícola",
"3" = "Desarrollo medio en transición",
"2" = "Desarrollo alto con riqueza natural",
"4" = "Altos ingresos urbanos sin bosques"
)
tabla_seg <- base_clusters %>%
mutate(
Cluster = as.character(Grupo),
Cluster = ifelse(
Cluster %in% names(nombres_segmentos),
unname(nombres_segmentos[Cluster]),
Cluster
),
Cluster = sub(
"^[Cc]luster\\s*[1-4]\\s*[:.-]\\s*",
"",
Cluster
),
Cluster = factor(
Cluster,
levels = names(colores_segmentos)
)
) %>%
arrange(Cluster, Pais) %>%
transmute(
`País` = Pais,
Continente = factor(as.character(Continente)),
Cluster = Cluster,
`PIB per cápita` = PIB_per_capita,
`Esperanza de vida` = Esperanza_vida,
`Internet (%)` = Usuarios_internet,
`Sup. forestal (%)` = Superficie_forestal,
Silueta = Silueta
)
dt_seg <- DT::datatable(
tabla_seg,
rownames = FALSE,
filter = "top",
extensions = "Buttons",
class = "display compact hover nowrap",
options = list(
dom = "Bflrtip",
pageLength = 10,
lengthMenu = list(
c(10, 25, 50, -1),
c("10", "25", "50", "Todos")
),
scrollX = TRUE,
autoWidth = TRUE,
order = list(),
buttons = list(
list(extend = "copy", text = "Copiar"),
list(extend = "csv", text = "CSV"),
list(extend = "excel", text = "Excel")
),
columnDefs = list(
list(
targets = 3:7,
className = "dt-right"
)
),
language = list(
search = "Buscar país:",
lengthMenu = "Mostrar _MENU_ países",
info = "Mostrando _START_ a _END_ de _TOTAL_ países",
infoEmpty = "Sin países disponibles",
infoFiltered = "(filtrados de _MAX_ países)",
zeroRecords = "No se encontraron resultados",
emptyTable = "No hay datos disponibles",
paginate = list(
first = "Primero",
last = "Último",
previous = "Anterior",
`next` = "Siguiente"
)
)
)
) %>%
DT::formatStyle(
"Cluster",
color = DT::styleEqual(
names(colores_segmentos),
unname(colores_segmentos)
),
borderLeft = DT::styleEqual(
names(colores_segmentos),
paste0("4px solid ", unname(colores_segmentos))
),
fontWeight = "bold"
) %>%
DT::formatRound(
"PIB per cápita",
digits = 0,
mark = ".",
dec.mark = ","
) %>%
DT::formatRound(
c(
"Esperanza de vida",
"Internet (%)",
"Sup. forestal (%)"
),
digits = 1,
mark = ".",
dec.mark = ","
) %>%
DT::formatRound(
"Silueta",
digits = 3,
mark = ".",
dec.mark = ","
)
htmltools::browsable(
htmltools::tagList(
htmltools::HTML(estilo_tabla),
htmltools::tags$style(
htmltools::HTML("
.cocoa-segmentos .dataTables_wrapper {
font-family: 'Satoshi', Arial, sans-serif;
color: #51382C;
}
.cocoa-segmentos table.dataTable thead input,
.cocoa-segmentos table.dataTable thead select {
background: #FFF9F0 !important;
border: 1px solid #D8BEA2 !important;
border-radius: 6px !important;
color: #51382C !important;
font-size: 11px !important;
padding: 7px 9px !important;
box-sizing: border-box;
max-width: 100%;
}
.cocoa-segmentos table.dataTable tbody td:nth-child(3) {
min-width: 205px;
padding-left: 12px !important;
}
.cocoa-segmentos .dataTables_wrapper
.dataTables_filter input {
min-width: 180px;
}
.cocoa-segmentos .dataTables_info {
color: #80634E !important;
font-size: 11px !important;
}
.cocoa-segmentos .dataTables_scrollBody {
scrollbar-color: #C9A47F #F5EADF;
scrollbar-width: thin;
}
")
),
htmltools::tags$div(
class = "cocoa-dataset cocoa-segmentos",
htmltools::tags$div(
class = "cocoa-dataset-head",
htmltools::tags$div(
class = "cocoa-dataset-label",
"04 / Resultados del modelo · Ward.D2"
),
htmltools::tags$div(
class = "cocoa-dataset-title",
"Clasificación de los países"
),
htmltools::tags$div(
class = "cocoa-dataset-subtitle",
paste0(
nrow(tabla_seg),
" países · 4 conglomerados · ",
"Banco Mundial, 2022"
)
)
),
dt_seg,
htmltools::tags$div(
class = "cocoa-dataset-source",
htmltools::tags$b("Nota: "),
"La tabla permite consultar los países por ",
"conglomerado, continente e indicadores seleccionados. ",
"La silueta mide la cohesión y separación de cada país ",
"respecto a los conglomerados. ",
htmltools::tags$b("Fuente: "),
"Elaboración propia con datos de World Development ",
"Indicators, Banco Mundial (2022)."
)
)
)
)
El Análisis de Componentes Principales (ACP) permitió reducir los 16 indicadores originales a cuatro componentes que explican conjuntamente el 74,65 % de la variabilidad entre los 144 países. Esto demuestra que una parte importante de las diferencias económicas, sociales, tecnológicas, demográficas y ambientales puede resumirse en un número reducido de dimensiones, sin analizar cada indicador de manera aislada.
El primer componente (CP1) concentra el 48,11 % de la variabilidad y constituye el principal eje de diferenciación entre países. Sus mayores contribuciones provienen del uso de internet, el acceso al agua, el PIB per cápita, la fecundidad, la participación agrícola y el acceso a electricidad. Las puntuaciones positivas se relacionan con mayores ingresos, mejores servicios y mayor esperanza de vida, mientras que las negativas se asocian con mayor fecundidad, mortalidad infantil y dependencia agrícola. Por tanto, el CP1 representa principalmente las diferencias estructurales en desarrollo socioeconómico y bienestar.
Los componentes restantes permiten identificar contrastes que el CP1 no resume. El CP2 (10,75 %) refleja la dinámica económica y demográfica: sus puntuaciones positivas se asocian con mayor crecimiento poblacional y económico, y las negativas, con mayor inflación y cobertura forestal. El CP3 (10,08 %) representa principalmente el uso del territorio, al contraponer la superficie agrícola con la cobertura forestal y las áreas protegidas; también incorpora diferencias relacionadas con la inflación. Finalmente, el CP4 (5,72 %) recoge variaciones complementarias en áreas protegidas, comercio internacional, crecimiento poblacional y urbanización. Su interpretación es menos definida que la de los componentes anteriores, por lo que debe considerarse una dimensión complementaria y no un indicador independiente de desarrollo.
El hallazgo central es que el desarrollo de un país no puede representarse únicamente mediante su ingreso. Aunque el CP1 concentra casi la mitad de la variabilidad, el CP3 muestra que existen diferencias territoriales y ambientales relevantes que no quedan resumidas por el nivel socioeconómico. Así, dos países con condiciones económicas y sociales relativamente semejantes pueden presentar coberturas forestales y usos del suelo muy diferentes. Esta multidimensionalidad justifica utilizar los cuatro componentes en la posterior segmentación.
Mediante el método jerárquico Ward, aplicado a las puntuaciones de los cuatro componentes principales, se identificaron cuatro conglomerados. Esta elección se sustentó en la lectura conjunta del dendrograma, el método del codo y el coeficiente de silueta. Aunque la solución de dos grupos obtuvo la mayor silueta promedio (0,490), reunió 114 países en un mismo conglomerado, limitando la diferenciación de perfiles. En cambio, la solución de cuatro grupos obtuvo una silueta de 0,2785, la más alta entre las alternativas de tres a diez conglomerados, y permitió una clasificación más detallada e interpretable.
La caracterización de los grupos revela diferencias importantes:
Cluster 1. Bajo desarrollo y base agrícola (30 países; 20,8 %): presenta las mayores limitaciones socioeconómicas, con un PIB per cápita mediano de 2.899 dólares PPA, esperanza de vida de 63,3 años y acceso a internet del 28,0 %. La agricultura representa el 24,1 % del PIB y la urbanización alcanza el 36,1 %. Este perfil refleja una combinación de menores ingresos, mayores necesidades de infraestructura y una importante participación de las actividades agrícolas.
Cluster 3. Desarrollo medio en transición (42 países; 29,2 %): presenta condiciones intermedias, con un PIB per cápita mediano de 13.114 dólares PPA, esperanza de vida de 72,5 años y uso de internet del 75,4 %. Sus indicadores muestran avances respecto al cluster 1, aunque con diferencias considerables entre países. Su posición intermedia en CP1 y sus puntuaciones positivas en CP3 reflejan un perfil de transición socioeconómica, con mayor participación relativa de superficies agrícolas frente a la cobertura forestal.
Cluster 2. Desarrollo alto con riqueza natural (58 países; 40,3 %): combina mejores condiciones económicas y sociales con una elevada cobertura forestal. Registra un PIB per cápita mediano de 39.560 dólares PPA, esperanza de vida de 77,7 años y acceso a internet del 88,1 %. Su superficie forestal mediana del 40,7 % y las áreas protegidas del 17,9 % permiten distinguirlo de otros países con niveles elevados de ingreso. No obstante, incluye economías con diferencias importantes de desarrollo, como evidencia el caso colombiano.
Cluster 4. Altos ingresos urbanos sin bosques (14 países; 9,7 %): registra el mayor PIB per cápita mediano, de 57.224 dólares PPA, junto con una urbanización del 88,5 % y un uso de internet del 95,6 %. Sin embargo, su superficie forestal mediana es de apenas 2,7 %, muy inferior a la del cluster 2. Este perfil, que incluye varias economías del Golfo, demuestra que un elevado ingreso y una alta conectividad pueden coexistir con una cobertura forestal reducida.
La principal diferencia entre los grupos no corresponde únicamente al ingreso. Esto se observa especialmente al comparar los clusters 2 y 4: ambos presentan condiciones socioeconómicas relativamente favorables, pero sus coberturas forestales medianas son del 40,7 % y 2,7 %, respectivamente. Por tanto, la segmentación identifica distintas combinaciones de desarrollo y características territoriales, en lugar de establecer una clasificación basada exclusivamente en la riqueza económica.
Sin embargo, los cuatro grupos no presentan una separación perfecta. La silueta promedio de 0,2785 indica una diferenciación moderada, mientras que los clusters 3 y 2 registran las menores siluetas individuales promedio (0,192 y 0,245). Esto evidencia que varios países comparten características con otros conglomerados, especialmente en la frontera entre desarrollo medio y alto. En consecuencia, los clusters deben interpretarse como perfiles estadísticos de comparación, no como categorías rígidas que determinen el nivel de desarrollo de cada país.
Sí. Los resultados permiten identificar tres patrones principales: una relación entre las condiciones económicas y sociales, diferencias ambientales que no siguen necesariamente el nivel de ingreso y una distribución geográfica que muestra concentraciones regionales, pero también excepciones importantes.
En primer lugar, se observa un patrón socioeconómico: los grupos con mayores ingresos medianos presentan, en general, mayor esperanza de vida, conectividad digital y acceso a servicios básicos, acompañados de menores niveles de fecundidad y participación agrícola en el PIB. La comparación entre los cuatro perfiles resulta compatible con distintas etapas de transformación productiva y demográfica. Sin embargo, estas asociaciones no demuestran que una variable cause directamente los cambios en las demás; describen características que aparecen relacionadas en los datos de 2022.
En segundo lugar, destaca el patrón ambiental. El CP3 diferencia a países con mayor participación de superficie agrícola de aquellos con mayor cobertura forestal y de áreas protegidas. Esta dimensión contribuye a explicar por qué los clusters 2 y 3, que presentan cierta proximidad socioeconómica, no comparten necesariamente las mismas características territoriales. Asimismo, el contraste entre los clusters 2 y 4 evidencia que los mayores ingresos no implican una cobertura forestal más elevada. Por tanto, las condiciones ambientales aportan información que se perdería si la comparación se realizara únicamente mediante indicadores económicos.
En tercer lugar, se identifica un patrón geográfico con diferencias dentro de las regiones. El cluster 1 reúne principalmente países africanos (27 de sus 30 integrantes), el cluster 2 presenta una fuerte concentración europea (35 de 58) y el cluster 4 incluye numerosos países asiáticos, especialmente economías de la península arábiga. No obstante, América Latina y Asia muestran una distribución más heterogénea: Colombia, Brasil, Chile y Costa Rica pertenecen al cluster 2, mientras que México, Guatemala y Paraguay se clasifican en el cluster 3. En Asia también se observan contrastes, como la pertenencia de Japón y Corea del Sur al cluster 2 frente a China e India en el cluster 3. Esto demuestra que la ubicación geográfica no determina por sí sola el perfil de un país, pues economías cercanas pueden presentar características diferentes y países distantes pueden compartir perfiles semejantes.
Colombia constituye un ejemplo importante de esta interpretación multidimensional. Aunque pertenece al cluster 2, su PIB per cápita de 18.459 dólares PPA es considerablemente inferior a la mediana del grupo (39.560 dólares PPA). También presenta una menor proporción de usuarios de internet (72,8 % frente a 88,1 %). En contraste, su superficie forestal del 53,9 % supera la mediana del conglomerado (40,7 %), lo que evidencia la importancia de sus características ambientales dentro de su perfil. Además, su puntuación en CP1 (0,94) es inferior al promedio grupal (1,93) y su coeficiente de silueta de 0,115 indica una pertenencia relativamente débil. Por ello, estar clasificada en el grupo denominado «Desarrollo alto con riqueza natural» no significa que Colombia alcance los niveles socioeconómicos de todos sus integrantes, sino que su combinación de indicadores resulta más próxima a ese perfil dentro de la clasificación obtenida.
Finalmente, la interpretación debe considerar la solidez y las limitaciones de la segmentación. El análisis de sensibilidad mostró que, al excluir a República Centroafricana, el 86,0 % de los países conserva su conglomerado, mientras que los principales cambios ocurren entre los grupos de desarrollo medio y alto. Esto sugiere que los perfiles generales son reconocibles, pero algunas asignaciones dependen de la composición de la muestra. Además, los resultados corresponden exclusivamente a 2022 y a los 144 países con información completa para los indicadores seleccionados.
En conjunto, el ACP y Ward permitieron identificar patrones de desarrollo diferenciados, pero no absolutos. Su principal aporte consiste en mostrar que países con ingresos similares pueden tener perfiles ambientales distintos y que la cercanía geográfica no garantiza condiciones de desarrollo semejantes. De esta manera, la segmentación ofrece una base para realizar comparaciones internacionales más pertinentes, identificar países con características compartidas y orientar análisis posteriores sobre necesidades económicas, sociales y ambientales.
El estudio permitió identificar patrones de desarrollo entre países. Trabajamos con 144 países y 16 indicadores del Banco Mundial para 2022, en donde el Análisis de Componentes Principales nos ayudó a resumir la información en cuatro dimensiones que conservan el 74,65% de la variabilidad original. Haciendo uso del método Ward sobre esas dimensiones, se identificaron cuatro perfiles con características económicas, sociales y ambientales diferenciables, aunque con una separación estadística debil; países de bajo desarrollo, países de desarrollo medio en transición, países de desarrollo alto con riqueza forestal y países de altos ingresos urbanos con muy poca superficie forestal. Así, el desarrollo mundial dejó de verse como una carrera en línea recta que cabe en un solo perfil, ni mucho menos que avanza al azar; detrás de cada avance o retroceso hay una realidad con forma propia, marcada por la relación entre la gente, la economía y el entorno de cada país.
Con el análisis se encontró que el desarrollo es multidimensional, pero las dimensiones social, económica y tecnológica avanzan juntas. Casi la mitad de la variabilidad con un 48,11% se concentra en un solo eje, el CP1, el cual reúne ingreso, salud, acceso a servicios, conectividad y transición demográfica. Esto lo confirman las correlaciones, la mortalidad infantil y la esperanza de vida se mueven en sentido contrario; el agua y la electricidad van de la mano, igual que el PIB per cápita y el uso del internet; además, se evidencio que a mayor riqueza por habitante hay un menor peso de la agricultura. Los países, cuando avanzan en una de estas dimensiones también suelen avanzar en las demás, al igual que los que están rezagados tienden a estarlo en todas a la vez. Cabe aclarar que las correlaciones se calcularon utilizando las variables transformadas para el ACP. En particular, el PIB per cápita se transformó mediante ln(1 + PIB), por lo que sus correlaciones con el uso de internet (r = 0,90) y la participación agrícola (r = −0,86) corresponden al PIB transformado y no a sus valores originales. Los demás componentes añaden detalles secundarios; el CP2 contrasta el dinamismo económico y poblacional con la inflación, lo cual en parte refleja el contexto de 2022, con casos como Ucrania, donde la economía se contrajo en un 29%, frente a economías petroleras como Omán o Arabia Saudita. El CP4 con un 5,72% combina áreas protegidas, apertura comercial y urbanización, pero su peso es menor, por eso se debe manejar con cautela.
Se encontró que la dimensión ambiental aporta información, que el ingreso no captura. Tenemos el CP3 con el 10,08%, el cual opone el uso agrícola del suelo a la cobertura forestal y las áreas protegidas, además, no está correlacionado con el nivel de desarrollo. Por eso permite distinguir a países con indicadores sociales parecidos, pero con relaciones muy distintas con su territorio. En la segmentación, el CP3 es justamente el que separa al grupo de desarrollo medio, del lado agrícola, del de desarrollo alto, del lado de los bosques. Además, los dos grupos de mayor ingreso tienen niveles de salud y conectividad parecidos, pero coberturas forestales opuestas (40,7 % frente a 2,7 %). Es decir, dos países pueden estar igual de avanzados socialmente y tener perfiles ambientales opuestos, algo que un indicador basado únicamente en la riqueza no mostraría.
Descubrimos que la geografía influye pero no determina el perfil de un país; los continentes no hacen que los países sean iguales. Ni América, ni Asia, ni África son grupos uniformes; al contrario, en cada uno hay países con realidades totalmente opuestas. Por ejemplo, los vecinos estadísticos de Colombia (China, Perú, Georgia, República Dominicana, Ecuador y Montenegro) pertenecen a tres continentes distintos. Esto nos sugiere que, países lejanos pueden compartir combinaciones parecidas de condiciones y a su vez países cercanos pueden ser muy diferentes.
Colombia tiene un perfil de desarrollo medio-alto sostenido por su riqueza ambiental. Pertenece al grupo de desarrollo alto con riqueza natural, pero en su frontera (silueta de 0,11): lo que la ubica allí es sobre todo su cobertura forestal, del 53,9 % del territorio, que la deja en el puesto 24 de los 144 países. En cambio, su PIB per cápita está 33 % por debajo de la media mundial, su apertura comercial 51 % por debajo, y su conectividad, aunque supera ligeramente el promedio mundial, está lejos de la de su grupo (72,8 % frente a 88,1 %). En 2022 su economía creció 75 % por encima de la media. Esto muestra sus mayores brechas y, al mismo tiempo, deja claro que su patrimonio natural es lo que más la distingue, aunque protege oficialmente una proporción menor de su territorio que vecinos como Brasil o Bolivia.
Posibles usos de este tipo de análisis en economía y políticas públicas:
Primero, focalización de la cooperación internacional. El CP1 mostró que las carencias no vienen aisladas, y que atenderlas con programas separados por sector o por país es menos eficiente que hacerlo por grupos. Al ir identificando conjuntos de países, necesidades similares, los organismos pueden diseñar programas regionales de salud, infraestructura o conectividad que aprovechen la reducción de costo, que facilita el hacer un proyecto a gran escala, en lugar de soluciones país por país.
Segundo, aprender de pares exitosos en la propia situación. Un país de ingresos medio gana poco si se compara con países como Luxemburgo o Singapur. Es por esto que este análisis permite buscar los pares correctos, es decir países que enfrentan condiciones parecidas y que ya lograron avanzar en situaciones que otros siguen rezagados. Por ejemplo, Colombia protege formalmente el 16,7 % de su territorio, mientras que Brasil, con un PIB per cápita prácticamente igual (18.554 frente a 18.459 dólares) y en el mismo grupo, protege el 29,3 %, y Bolivia, con un ingreso menor, el 30,9 %. Ahí hay experiencias reales de cómo ampliar las áreas protegidas sin depender de un nivel de ingreso mayor.
Tercero, es la política ambiental. Teniendo en cuenta el CP3, el ingreso no predice cuánto bosque conserva un país ni cuánta tierra dedica a la agricultura. Por eso, las políticas ambientales no deberían diseñarse solo a partir del nivel de ingreso de los países. Entonces los países con alta cobertura forestal pueden coordinarse para planes de conservación ambiental y los de fuerte presión agrícola sobre el suelo, pueden ser prioritarios para políticas de uso sostenible de la tierra.
Cuarto, el seguimiento en el tiempo y de objetivos globales. Este al ser un análisis del 2022, puede repetirse en varios años, lo cual permitiría observar qué países cambian de grupo. Conectando esto con los 17 Objetivos de Desarrollo Sostenible de las Naciones Unidas, las cuales entre sus metas buscan, garantizar la salud, el acceso al agua y a la energía, la conectividad y la protección de los ecosistemas. En donde justamente este estudio podría servir porque varios de los indicadores miden temas como esos y por tanto tendría la posibilidad servir como resumen para vigilar el avance de cada país y sus mayores brechas frente a países similares.
Limitaciones: En este análisis solo se estudió lo que pasó en el 2022, el cual fue un año atípico por crisis como la guerra en Ucrania y la subida de los precios en todo el mundo. Por eso, los datos muestran apenas un registro de ese año y no nos deja ver cómo cambian y evolucionan los países con el paso del tiempo. También, se excluyeron 73 observaciones de las 217 inicialmente consideradas: 49 por información incompleta y 24 por corresponder a territorios fuera del alcance del estudio. Así, la muestra final quedó conformada por 144 países. Quedaron fuera economías relevantes, como Estados Unidos, Nigeria, Pakistán o Venezuela, por información incompleta, por lo que la muestra tiende a favorecer a los países con mejores datos estadísticos. Además, algunos datos de la fuente presentan inconsistencias, como la esperanza de vida de la República Centroafricana, que se conservó en el análisis tras comprobar que su exclusión no altera la estructura general. Aun así, el análisis de sensibilidad mostró que la frontera entre los grupos de desarrollo medio y alto desarrollo es sensible a pequeños cambios en la muestra. Además, la silueta promedio (0,28) indica que hay una separación debil entre grupos, por eso los clusters deben leerse como una forma de ordenar y comparar, y no como categorías rígidas. Finalmente, se determinó que los 16 indicadores no cubren todas las dimensiones del desarrollo, por ejemplo, podríamos haber usado la matrícula secundaria, pero se descartó por falta de datos, y por cuestiones de este tipo los resultados describen asociaciones y no causa.