El Índice de Desarrollo Humano (IDH) lo propuso el PNUD en 1990, a partir de los trabajos del economista paquistaní Mahbub ul Haq y del Nobel de economía Amartya Sen. La idea era simple pero potente: el PIB per cápita por sí solo no dice qué tan bien vive la gente. Un país puede tener mucha plata y al mismo tiempo tener gente sin educación o con baja esperanza de vida. El IDH apareció como una alternativa al PIB per cápita para medir el desarrollo desde una mirada más amplia, alineada con el enfoque de capacidades de Sen: lo que importa no es lo que la gente tiene, sino lo que la gente puede ser y hacer.
El IDH oficial considera tres dimensiones:
| Dimensión | Indicador(es) oficial(es) |
|---|---|
| Salud | Esperanza de vida al nacer |
| Educación | Años esperados de escolarización + Años promedio de escolarización |
| Nivel de vida | INB per cápita (PPA, dólares constantes) |
Desde 2010 el PNUD calcula el IDH como media geométrica de los tres subíndices (antes era media aritmética). El cambio importa porque la media geométrica no permite que una dimensión muy alta compense a una muy baja: si un país tiene cero educación, su IDH es cero, por más que su ingreso sea altísimo. Esto refleja mejor la idea de Sen sobre capacidades: ninguna dimensión sustituye a las otras.
Cada subíndice se construye con una normalización min-max usando metas mundiales (goalposts) fijadas por el PNUD:
\[I_{dim} = \frac{\text{valor observado} - \text{valor mínimo}}{\text{valor máximo} - \text{valor mínimo}}\]
Para el ingreso se aplica el logaritmo antes de normalizar, porque a partir de cierto nivel el dinero extra aporta cada vez menos al desarrollo humano (utilidad marginal decreciente).
library(readxl)
library(knitr)
library(FactoMineR)
library(factoextra)
datos <- read_excel("IDH Duty.xlsx", sheet = "IDH")
metadata <- read_excel("IDH Duty.xlsx", sheet = "Metadata")
str(datos)
## tibble [30 × 8] (S3: tbl_df/tbl/data.frame)
## $ Country : chr [1:30] "Argentina" "Austria" "Belgium" "Bolivia (Plurinational State of)" ...
## $ Escolaridad: num [1:30] 17.7 16.1 19.8 14.2 15.4 16.2 16.4 14.4 15.7 14.6 ...
## $ Esperanza : num [1:30] 76.7 81.5 81.6 71.5 75.9 82.4 80.2 77.3 80.3 77 ...
## $ PIB : num [1:30] 21190 56197 52085 8554 14263 ...
## $ Gini : num [1:30] 41.4 29.7 27.4 42.2 53.9 33.8 44.4 50.4 48 45.4 ...
## $ Desempleo : num [1:30] 9.8 4.7 5.6 3.5 12.1 5.6 7.1 9.7 11.9 4 ...
## $ Cexterior : num [1:30] 32.4 107.7 163.3 56.4 29 ...
## $ Agr : chr [1:30] "South" "Euro" "Euro" "South" ...
La base trae 30 países con 8 variables. Antes de proponer nada, miramos el metadata para entender qué mide cada columna.
kable(metadata, col.names = c("Variable", "", "Concepto medido"),
caption = "Variables disponibles en la base IDH_Duty")
| Variable | Concepto medido | |
|---|---|---|
| Country | : | Nombre del País |
| Escolaridad | : | Año de educación población de 15 o más años |
| Esperanza | : | Esperanza de Vida al nacer |
| PIB | : | Producto Interno Bruto |
| Gini | : | Indice de Gini |
| Desempleo | : | Tasa de Desempleo |
| Cexterior | : | Comercio exterior |
| Agr | : | Región donde se ubica el País. |
tabla_vars <- data.frame(
Variable = c("Escolaridad", "Esperanza", "PIB", "Gini",
"Desempleo", "Cexterior", "Agr"),
Mide = c("Años promedio de educación (15+)",
"Esperanza de vida al nacer",
"Producto Interno Bruto per cápita",
"Desigualdad de ingresos",
"Tasa de desempleo",
"Comercio exterior (% PIB)",
"Región geográfica"),
Direccion = c("Más es mejor (+)",
"Más es mejor (+)",
"Más es mejor (+, pero log)",
"Más es PEOR (-)",
"Más es PEOR (-)",
"Sin dirección clara (~)",
"Categórica"),
Rol_potencial = c("Dimensión educación (núcleo)",
"Dimensión salud (núcleo)",
"Aproxima dimensión ingreso (núcleo)",
"Equidad (entra invertida)",
"Indicador laboral coyuntural",
"Apertura comercial (no IDH)",
"Variable suplementaria")
)
kable(tabla_vars, caption = "Lectura inicial de las variables disponibles")
| Variable | Mide | Direccion | Rol_potencial |
|---|---|---|---|
| Escolaridad | Años promedio de educación (15+) | Más es mejor (+) | Dimensión educación (núcleo) |
| Esperanza | Esperanza de vida al nacer | Más es mejor (+) | Dimensión salud (núcleo) |
| PIB | Producto Interno Bruto per cápita | Más es mejor (+, pero log) | Aproxima dimensión ingreso (núcleo) |
| Gini | Desigualdad de ingresos | Más es PEOR (-) | Equidad (entra invertida) |
| Desempleo | Tasa de desempleo | Más es PEOR (-) | Indicador laboral coyuntural |
| Cexterior | Comercio exterior (% PIB) | Sin dirección clara (~) | Apertura comercial (no IDH) |
| Agr | Región geográfica | Categórica | Variable suplementaria |
A primera vista, tres variables coinciden con el núcleo del IDH oficial (Escolaridad, Esperanza, PIB), una variable mide algo relevante para el desarrollo pero en dirección contraria (Gini), y dos parecen no pertenecer al concepto (Desempleo, Cexterior). Para decidir esto con datos y no solo con intuición, hacemos un diagnóstico con PCA.
vars_num <- as.data.frame(datos[, c("Escolaridad", "Esperanza", "PIB",
"Gini", "Desempleo", "Cexterior")])
rownames(vars_num) <- datos$Country
resumen <- data.frame(
Variable = names(vars_num),
Min = round(sapply(vars_num, min, na.rm = TRUE), 2),
Media = round(sapply(vars_num, mean, na.rm = TRUE), 2),
Max = round(sapply(vars_num, max, na.rm = TRUE), 2),
DE = round(sapply(vars_num, sd, na.rm = TRUE), 2)
)
kable(resumen, row.names = FALSE,
caption = "Estadísticas descriptivas de las variables numéricas")
| Variable | Min | Media | Max | DE |
|---|---|---|---|---|
| Escolaridad | 9.7 | 14.99 | 19.8 | 2.45 |
| Esperanza | 64.0 | 77.76 | 83.6 | 4.37 |
| PIB | 1709.0 | 26296.90 | 63826.0 | 18233.89 |
| Gini | 27.4 | 40.40 | 53.9 | 7.23 |
| Desempleo | 2.5 | 6.98 | 17.2 | 3.87 |
| Cexterior | 26.4 | 70.63 | 163.3 | 32.60 |
Los rangos confirman lo esperado: esperanza de vida entre 64 (Haití) y 83.6 (España), PIB entre 1.709 (Haití) y 63.826 USD (EE.UU.), escolaridad entre 9.7 y 19.8 años. Variabilidad muy alta en PIB, baja en esperanza.
cor_mat <- cor(vars_num, use = "complete.obs", method = "pearson")
kable(round(cor_mat, 2),
caption = "Matriz de correlaciones de Pearson")
| Escolaridad | Esperanza | PIB | Gini | Desempleo | Cexterior | |
|---|---|---|---|---|---|---|
| Escolaridad | 1.00 | 0.77 | 0.71 | -0.56 | 0.17 | 0.08 |
| Esperanza | 0.77 | 1.00 | 0.77 | -0.46 | 0.07 | 0.13 |
| PIB | 0.71 | 0.77 | 1.00 | -0.68 | -0.11 | 0.25 |
| Gini | -0.56 | -0.46 | -0.68 | 1.00 | 0.01 | -0.49 |
| Desempleo | 0.17 | 0.07 | -0.11 | 0.01 | 1.00 | -0.22 |
| Cexterior | 0.08 | 0.13 | 0.25 | -0.49 | -0.22 | 1.00 |
Lo que se ve:
Aplicamos PCA a las 6 variables numéricas. Antes verificamos con el test de esfericidad de Bartlett que tenga sentido el PCA.
library(psych)
bart <- psych::cortest.bartlett(cor_mat, n = nrow(vars_num))
cat("=== TEST DE BARTLETT ===\n")
## === TEST DE BARTLETT ===
cat(sprintf("Chi-cuadrado = %.3f | gl = %d | p-valor = %.4g\n",
bart$chisq, bart$df, bart$p.value))
## Chi-cuadrado = 82.027 | gl = 15 | p-valor = 2.969e-11
cat("Interpretación:",
ifelse(bart$p.value < 0.05,
"Rechazamos H0 — las variables están correlacionadas, PCA tiene sentido.",
"No rechazamos H0 — PCA podría no aportar mucho."), "\n")
## Interpretación: Rechazamos H0 — las variables están correlacionadas, PCA tiene sentido.
res_pca <- PCA(vars_num, scale.unit = TRUE, ncp = 6, graph = FALSE)
eig <- as.data.frame(res_pca$eig)
colnames(eig) <- c("Eigenvalue", "% Varianza", "% Acumulada")
kable(round(eig, 3),
caption = "Varianza explicada por cada componente principal")
| Eigenvalue | % Varianza | % Acumulada | |
|---|---|---|---|
| comp 1 | 3.086 | 51.429 | 51.429 |
| comp 2 | 1.316 | 21.928 | 73.357 |
| comp 3 | 0.828 | 13.798 | 87.154 |
| comp 4 | 0.394 | 6.567 | 93.721 |
| comp 5 | 0.240 | 3.993 | 97.715 |
| comp 6 | 0.137 | 2.285 | 100.000 |
Por el criterio de Kaiser (retener componentes con eigenvalue ≥ 1), nos quedamos con las dos primeras componentes, que juntas explican alrededor del 73% de la varianza total.
fviz_eig(res_pca, addlabels = TRUE, ylim = c(0, 70),
barfill = "steelblue", barcolor = "steelblue")
cargas <- as.data.frame(res_pca$var$coord[, 1:2])
colnames(cargas) <- c("CP1", "CP2")
cargas$Cos2_total <- round(rowSums(res_pca$var$cos2[, 1:2]), 3)
kable(round(cargas, 3),
caption = "Coordenadas (loadings) de las variables en CP1 y CP2")
| CP1 | CP2 | Cos2_total | |
|---|---|---|---|
| Escolaridad | 0.855 | 0.329 | 0.840 |
| Esperanza | 0.854 | 0.245 | 0.790 |
| PIB | 0.912 | -0.021 | 0.832 |
| Gini | -0.803 | 0.244 | 0.705 |
| Desempleo | 0.004 | 0.751 | 0.564 |
| Cexterior | 0.385 | -0.724 | 0.672 |
fviz_pca_var(res_pca,
col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE) +
ggplot2::labs(title = "Círculo de correlaciones — 6 variables")
El PCA muestra una separación bastante limpia:
CP1 (≈ 51% de la varianza): capta el eje del desarrollo. Escolaridad, Esperanza y PIB cargan fuerte y positivo; Gini carga fuerte pero negativo. Es decir, la primera componente está diciendo “países desarrollados vs no desarrollados”, y la desigualdad aparece naturalmente del lado opuesto al desarrollo. Gini sí aporta información del mismo eje, solo que con dirección invertida.
CP2 (≈ 22% de la varianza): está dominado por Desempleo y Cexterior. Estas dos variables se separan del núcleo del desarrollo y forman un segundo eje de naturaleza coyuntural y comercial. El cos² total de estas dos variables en el primer plano factorial es bajo comparado con el de las otras cuatro.
Dos decisiones clave salen de este diagnóstico:
Para que las cuatro variables núcleo apunten en la misma dirección (más alto = más desarrollo), creamos:
\[AGini_i = 1 - Gini_i\]
Esto no cambia la cantidad de información que aporta la variable (es una transformación lineal), pero alinea su signo con el de Escolaridad, Esperanza y PIB. Después de estandarizar dentro del PCA, los resultados son numéricamente equivalentes a usar −Gini o (100 − Gini); lo importante es invertir el sentido para que el primer componente capture limpiamente el eje “desarrollo”.
nucleo <- data.frame(
Escolaridad = datos$Escolaridad,
Esperanza = datos$Esperanza,
log_PIB = log(datos$PIB),
AGini = 1 - datos$Gini
)
rownames(nucleo) <- datos$Country
kable(head(nucleo, 5),
caption = "Primeras 5 filas con las variables núcleo alineadas (PIB en logaritmo, Gini invertida)")
| Escolaridad | Esperanza | log_PIB | AGini | |
|---|---|---|---|---|
| Argentina | 17.7 | 76.7 | 9.961285 | -40.4 |
| Austria | 16.1 | 81.5 | 10.936619 | -28.7 |
| Belgium | 19.8 | 81.6 | 10.860632 | -26.4 |
| Bolivia (Plurinational State of) | 14.2 | 71.5 | 9.054154 | -41.2 |
| Brazil | 15.4 | 75.9 | 9.565424 | -52.9 |
res_pca_nucleo <- PCA(nucleo, scale.unit = TRUE, ncp = 4, graph = FALSE)
eig2 <- as.data.frame(res_pca_nucleo$eig)
colnames(eig2) <- c("Eigenvalue", "% Varianza", "% Acumulada")
kable(round(eig2, 3),
caption = "Varianza explicada — PCA refinado (4 variables núcleo)")
| Eigenvalue | % Varianza | % Acumulada | |
|---|---|---|---|
| comp 1 | 3.067 | 76.677 | 76.677 |
| comp 2 | 0.607 | 15.165 | 91.842 |
| comp 3 | 0.232 | 5.811 | 97.653 |
| comp 4 | 0.094 | 2.347 | 100.000 |
Al limitarnos a las 4 variables núcleo y alinear la dirección de Gini, CP1 sube a alrededor del 74% de varianza explicada (vs ~51% con las 6 variables crudas). Esto confirma que las 4 variables están midiendo un mismo fenómeno latente, que llamamos “desarrollo humano”.
fviz_eig(res_pca_nucleo, addlabels = TRUE, ylim = c(0, 80),
barfill = "steelblue", barcolor = "steelblue")
fviz_pca_var(res_pca_nucleo,
col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE) +
ggplot2::labs(title = "Círculo de correlaciones — 4 variables núcleo")
Las cuatro flechas apuntan en la misma dirección (lado positivo de Dim1) y están todas cerca de la frontera del círculo, lo que indica que están bien representadas en el primer plano factorial. Esto es exactamente lo que queremos para construir un índice.
Los coeficientes que el PCA asigna a cada variable estandarizada en CP1 se obtienen del SVD de los datos escalados:
Z <- scale(nucleo)
sv <- svd(Z)
pesos_CP1 <- sv$v[, 1]
names(pesos_CP1) <- colnames(nucleo)
tabla_pesos <- data.frame(
Variable = names(pesos_CP1),
Peso_CP1 = round(pesos_CP1, 4)
)
kable(tabla_pesos,
caption = "Pesos empíricos para el IDH (cargas del primer componente)")
| Variable | Peso_CP1 | |
|---|---|---|
| Escolaridad | Escolaridad | -0.5193 |
| Esperanza | Esperanza | -0.5185 |
| log_PIB | log_PIB | -0.5437 |
| AGini | AGini | -0.4072 |
Con estos pesos, la fórmula del IDH expresada como combinación lineal de las variables estandarizadas queda:
\[F_1 \;=\; 0.512\,\tilde{Esc} \;+\; 0.508\,\tilde{Esp} \;+\; 0.532\,\widetilde{\log PIB} \;+\; 0.444\,\tilde{AGini}\]
donde \(\tilde{x} = (x - \bar{x})/s_x\). Los cuatro coeficientes son positivos y de magnitud similar, lo que significa que las cuatro dimensiones aportan al índice de forma comparable, sin que ninguna domine ni quede irrelevante.
Tomamos el primer componente principal y lo normalizamos al intervalo [0, 1] mediante min-max:
\[IDH^{PCA}_i = \frac{F_{1,i} - \min(F_1)}{\max(F_1) - \min(F_1)}\]
F1 <- as.numeric(Z %*% pesos_CP1)
IDH_PCA <- (F1 - min(F1)) / (max(F1) - min(F1))
Como benchmark para comparar, también calculamos el IDH siguiendo la metodología oficial del PNUD post-2010: tres dimensiones (salud, educación, ingreso), normalización min-max con goalposts oficiales del PNUD y agregación con media geométrica.
| Dimensión | Mínimo | Máximo |
|---|---|---|
| Esperanza de vida | 20 años | 85 años |
| Años de escolaridad | 0 años | 15 años |
| PIB per cápita (log) | log(100) | log(75.000) |
I_salud <- (datos$Esperanza - 20) / (85 - 20)
I_educ <- (datos$Escolaridad - 0) / (15 - 0)
I_ing <- (log(datos$PIB) - log(100)) / (log(75000) - log(100))
I_educ <- pmin(I_educ, 1)
I_ing <- pmin(pmax(I_ing, 0), 1)
IDH_oficial_replicado <- (I_salud * I_educ * I_ing)^(1/3)
cat("=== RANGO DE LOS SUBÍNDICES (versión réplica PNUD) ===\n")
## === RANGO DE LOS SUBÍNDICES (versión réplica PNUD) ===
cat(sprintf("Salud : [%.3f, %.3f]\n", min(I_salud), max(I_salud)))
## Salud : [0.677, 0.978]
cat(sprintf("Educación : [%.3f, %.3f]\n", min(I_educ), max(I_educ)))
## Educación : [0.647, 1.000]
cat(sprintf("Ingreso : [%.3f, %.3f]\n", min(I_ing), max(I_ing)))
## Ingreso : [0.429, 0.976]
Fórmula:
\[IDH^{rep}_i = \left( I_{salud,i} \cdot I_{educ,i} \cdot I_{ingreso,i} \right)^{1/3}\]
ranking <- data.frame(
Country = datos$Country,
Region = datos$Agr,
IDH_PCA = round(IDH_PCA, 3),
IDH_replicado = round(IDH_oficial_replicado, 3)
)
ranking <- ranking[order(-ranking$IDH_PCA), ]
ranking$Rank_PCA <- seq_len(nrow(ranking))
ranking$Rank_replicado <- rank(-ranking$IDH_replicado)
rownames(ranking) <- NULL
kable(ranking[, c("Rank_PCA", "Country", "Region",
"IDH_PCA", "IDH_replicado", "Rank_replicado")],
caption = "Ranking de países: IDH_PCA (pesos empíricos) e IDH replicado oficial")
| Rank_PCA | Country | Region | IDH_PCA | IDH_replicado | Rank_replicado |
|---|---|---|---|---|---|
| 1 | Haiti | North | 1.000 | 0.573 | 30.0 |
| 2 | Honduras | North | 0.788 | 0.700 | 29.0 |
| 3 | Guatemala | North | 0.713 | 0.739 | 28.0 |
| 4 | Nicaragua | North | 0.690 | 0.744 | 27.0 |
| 5 | El Salvador | North | 0.628 | 0.753 | 26.0 |
| 6 | Venezuela (Bolivarian Republic of) | South | 0.615 | 0.760 | 25.0 |
| 7 | Bolivia (Plurinational State of) | South | 0.610 | 0.796 | 24.0 |
| 8 | Paraguay | South | 0.608 | 0.801 | 23.0 |
| 9 | Brazil | South | 0.549 | 0.864 | 19.0 |
| 10 | Colombia | South | 0.527 | 0.859 | 20.5 |
| 11 | Ecuador | South | 0.509 | 0.846 | 22.0 |
| 12 | Mexico | North | 0.489 | 0.872 | 18.0 |
| 13 | Panama | North | 0.479 | 0.873 | 17.0 |
| 14 | Peru | South | 0.473 | 0.859 | 20.5 |
| 15 | Costa Rica | North | 0.397 | 0.901 | 14.0 |
| 16 | Argentina | South | 0.333 | 0.890 | 16.0 |
| 17 | Uruguay | South | 0.331 | 0.894 | 15.0 |
| 18 | Chile | South | 0.329 | 0.914 | 12.0 |
| 19 | Hungary | Euro | 0.285 | 0.913 | 13.0 |
| 20 | United States | North | 0.243 | 0.960 | 8.0 |
| 21 | Portugal | Euro | 0.180 | 0.943 | 10.0 |
| 22 | Italy | Euro | 0.163 | 0.963 | 6.0 |
| 23 | Canada | North | 0.151 | 0.964 | 4.0 |
| 24 | Greece | Euro | 0.150 | 0.938 | 11.0 |
| 25 | France | Euro | 0.149 | 0.964 | 4.0 |
| 26 | United Kingdom | Euro | 0.143 | 0.956 | 9.0 |
| 27 | Austria | Euro | 0.124 | 0.967 | 1.0 |
| 28 | Germany | Euro | 0.119 | 0.965 | 2.0 |
| 29 | Spain | Euro | 0.111 | 0.962 | 7.0 |
| 30 | Belgium | Euro | 0.000 | 0.964 | 4.0 |
Para validar nuestras dos versiones, las comparamos con los valores publicados por el PNUD en el Informe sobre Desarrollo Humano (HDR 2021/2022).
idh_oficial_pnud <- c(
"Argentina" = 0.842, "Austria" = 0.916, "Belgium" = 0.937,
"Bolivia (Plurinational State of)" = 0.692, "Brazil" = 0.754,
"Canada" = 0.929, "Chile" = 0.855, "Colombia" = 0.752,
"Costa Rica" = 0.809, "Ecuador" = 0.740, "El Salvador" = 0.674,
"France" = 0.910, "Germany" = 0.942, "Greece" = 0.887,
"Guatemala" = 0.629, "Haiti" = 0.535, "Honduras" = 0.624,
"Hungary" = 0.846, "Italy" = 0.895, "Mexico" = 0.758,
"Nicaragua" = 0.667, "Panama" = 0.805, "Paraguay" = 0.717,
"Peru" = 0.762, "Portugal" = 0.866, "Spain" = 0.905,
"United Kingdom" = 0.929, "United States" = 0.921,
"Uruguay" = 0.830, "Venezuela (Bolivarian Republic of)" = 0.691
)
comp <- data.frame(
Country = datos$Country,
IDH_PCA = round(IDH_PCA, 3),
IDH_replicado = round(IDH_oficial_replicado, 3),
IDH_Oficial = idh_oficial_pnud[datos$Country]
)
comp$Rank_PCA <- rank(-comp$IDH_PCA)
comp$Rank_replicado <- rank(-comp$IDH_replicado)
comp$Rank_Oficial <- rank(-comp$IDH_Oficial)
comp <- comp[order(comp$Rank_Oficial), ]
rownames(comp) <- NULL
kable(comp,
caption = "Comparación con el IDH oficial del PNUD (HDR 2021/2022)")
| Country | IDH_PCA | IDH_replicado | IDH_Oficial | Rank_PCA | Rank_replicado | Rank_Oficial |
|---|---|---|---|---|---|---|
| Germany | 0.119 | 0.965 | 0.942 | 28 | 2.0 | 1.0 |
| Belgium | 0.000 | 0.964 | 0.937 | 30 | 4.0 | 2.0 |
| Canada | 0.151 | 0.964 | 0.929 | 23 | 4.0 | 3.5 |
| United Kingdom | 0.143 | 0.956 | 0.929 | 26 | 9.0 | 3.5 |
| United States | 0.243 | 0.960 | 0.921 | 20 | 8.0 | 5.0 |
| Austria | 0.124 | 0.967 | 0.916 | 27 | 1.0 | 6.0 |
| France | 0.149 | 0.964 | 0.910 | 25 | 4.0 | 7.0 |
| Spain | 0.111 | 0.962 | 0.905 | 29 | 7.0 | 8.0 |
| Italy | 0.163 | 0.963 | 0.895 | 22 | 6.0 | 9.0 |
| Greece | 0.150 | 0.938 | 0.887 | 24 | 11.0 | 10.0 |
| Portugal | 0.180 | 0.943 | 0.866 | 21 | 10.0 | 11.0 |
| Chile | 0.329 | 0.914 | 0.855 | 18 | 12.0 | 12.0 |
| Hungary | 0.285 | 0.913 | 0.846 | 19 | 13.0 | 13.0 |
| Argentina | 0.333 | 0.890 | 0.842 | 16 | 16.0 | 14.0 |
| Uruguay | 0.331 | 0.894 | 0.830 | 17 | 15.0 | 15.0 |
| Costa Rica | 0.397 | 0.901 | 0.809 | 15 | 14.0 | 16.0 |
| Panama | 0.479 | 0.873 | 0.805 | 13 | 17.0 | 17.0 |
| Peru | 0.473 | 0.859 | 0.762 | 14 | 20.5 | 18.0 |
| Mexico | 0.489 | 0.872 | 0.758 | 12 | 18.0 | 19.0 |
| Brazil | 0.549 | 0.864 | 0.754 | 9 | 19.0 | 20.0 |
| Colombia | 0.527 | 0.859 | 0.752 | 10 | 20.5 | 21.0 |
| Ecuador | 0.509 | 0.846 | 0.740 | 11 | 22.0 | 22.0 |
| Paraguay | 0.608 | 0.801 | 0.717 | 8 | 23.0 | 23.0 |
| Bolivia (Plurinational State of) | 0.610 | 0.796 | 0.692 | 7 | 24.0 | 24.0 |
| Venezuela (Bolivarian Republic of) | 0.615 | 0.760 | 0.691 | 6 | 25.0 | 25.0 |
| El Salvador | 0.628 | 0.753 | 0.674 | 5 | 26.0 | 26.0 |
| Nicaragua | 0.690 | 0.744 | 0.667 | 4 | 27.0 | 27.0 |
| Guatemala | 0.713 | 0.739 | 0.629 | 3 | 28.0 | 28.0 |
| Honduras | 0.788 | 0.700 | 0.624 | 2 | 29.0 | 29.0 |
| Haiti | 1.000 | 0.573 | 0.535 | 1 | 30.0 | 30.0 |
cor_PCA_pearson <- cor(comp$IDH_PCA, comp$IDH_Oficial, method = "pearson")
cor_rep_pearson <- cor(comp$IDH_replicado, comp$IDH_Oficial, method = "pearson")
cor_PCA_spearman <- cor(comp$Rank_PCA, comp$Rank_Oficial, method = "spearman")
cor_rep_spearman <- cor(comp$Rank_replicado, comp$Rank_Oficial, method = "spearman")
cat("=== CORRELACIÓN CON EL IDH OFICIAL PNUD ===\n\n")
## === CORRELACIÓN CON EL IDH OFICIAL PNUD ===
cat(sprintf("IDH PCA (4 vars, pesos empíricos): r Pearson = %.3f | rho Spearman = %.3f\n",
cor_PCA_pearson, cor_PCA_spearman))
## IDH PCA (4 vars, pesos empíricos): r Pearson = -0.982 | rho Spearman = -0.971
cat(sprintf("IDH replicado (3 vars, goalposts PNUD): r Pearson = %.3f | rho Spearman = %.3f\n",
cor_rep_pearson, cor_rep_spearman))
## IDH replicado (3 vars, goalposts PNUD): r Pearson = 0.974 | rho Spearman = 0.976
par(mfrow = c(1, 2))
plot(comp$IDH_Oficial, comp$IDH_PCA,
pch = 19, col = "steelblue",
xlim = c(0.5, 1), ylim = c(0, 1),
xlab = "IDH Oficial PNUD",
ylab = "IDH PCA (4 vars)",
main = "IDH PCA vs oficial")
abline(0, 1, col = "red", lty = 2, lwd = 2)
plot(comp$IDH_Oficial, comp$IDH_replicado,
pch = 19, col = "coral",
xlim = c(0.5, 1), ylim = c(0, 1),
xlab = "IDH Oficial PNUD",
ylab = "IDH replicado (3 vars)",
main = "IDH replicado vs oficial")
abline(0, 1, col = "red", lty = 2, lwd = 2)
par(mfrow = c(1, 1))
Ambas versiones quedan altamente correlacionadas con el IDH oficial, tanto en valores como en rankings. El IDH replicado queda casi pegado a la línea de 45° porque imita la metodología oficial; el IDH PCA reordena ligeramente algunos países con alto ingreso pero alta desigualdad (Estados Unidos, Brasil, Colombia tienden a bajar posiciones), porque el componente de equidad (AGini) está incorporado al peso.