El análisis de conglomerados constituye una de las técnicas más importantes dentro de la estadística multivariada cuando se desea clasificar unidades de análisis en grupos homogéneos a partir de un conjunto de variables observadas. A diferencia de otros métodos, no parte de una variable dependiente, sino que busca descubrir estructuras subyacentes en los datos.
En esta clase se desarrolla el clúster jerárquico, una técnica que permite agrupar observaciones según su semejanza, representando visualmente el proceso de agrupación mediante un dendrograma. La aplicación práctica se realiza sobre indicadores laborales departamentales, con el propósito de identificar perfiles territoriales similares en términos de inserción ocupacional y vulnerabilidad laboral.
Al finalizar la clase, serás capaz de:
El análisis de conglomerados o cluster analysis es una técnica de estadística multivariada cuyo objetivo es agrupar unidades de análisis de manera que las observaciones dentro de cada grupo sean lo más semejantes posible entre sí, y al mismo tiempo, lo más diferentes posible respecto de las observaciones pertenecientes a otros grupos.
En este documento se desarrolla la técnica de clúster jerárquico, aplicada a un conjunto de indicadores laborales departamentales simulados. El propósito es identificar grupos de departamentos con perfiles similares en términos de precariedad laboral, ingresos bajos y estructura ocupacional.
El objetivo es clasificar los departamentos en conglomerados homogéneos a partir de un conjunto de variables seleccionadas, utilizando:
Sea un conjunto de unidades \(i = 1,2,\dots,n\), descritas por \(p\) variables. El análisis de conglomerados busca formar grupos tales que:
A diferencia de otras técnicas multivariadas, el clustering no requiere definir previamente una variable dependiente, por lo que se trata de una técnica de carácter exploratorio.
Una medida habitual de disimilitud entre dos observaciones \(i\) y \(j\) es la distancia euclidiana, definida como:
\[ d(i,j) = \sqrt{\sum_{h=1}^{p}(x_{ih} - x_{jh})^2} \]
Esta distancia resume cuán diferentes son dos observaciones considerando simultáneamente todas las variables.
Cuando las variables tienen escalas distintas, o aun teniendo la misma unidad presentan distinta dispersión, es recomendable estandarizarlas. La transformación utilizada es:
\[ z_{ih} = \frac{x_{ih} - \bar{x}_h}{s_h} \]
donde:
De esta manera, cada variable queda expresada con media 0 y desviación estándar 1.
En el método jerárquico aglomerativo, inicialmente cada unidad constituye su propio grupo. Luego, en cada etapa, se fusionan los dos grupos más próximos, hasta llegar a un único conglomerado final que contiene a todas las observaciones.
El resultado se representa mediante un dendrograma, que permite visualizar la secuencia de agrupaciones.
El método de Ward selecciona en cada paso la fusión que produce el menor incremento posible en la variabilidad interna de los grupos. En consecuencia, suele generar conglomerados relativamente homogéneos y compactos.
El coeficiente de silhouette permite evaluar la calidad de una partición.
Para cada observación, el índice compara:
Sus valores oscilan entre \(-1\) y \(1\):
Como criterio de selección, puede elegirse el número de clústeres \(k\) que maximiza la silhouette promedio.
# Instalar paquetes solo si fuera necesario
# install.packages(c("readxl","cluster","openxlsx"), dependencies = TRUE)
library(cluster)
library(readxl)
library(openxlsx)
df <- read_excel("cluster_departamentos_paraguay_ficticios_reducido.xlsx")
Comentario
La base de datos utilizada en esta práctica contiene información correspondiente a los departamentos del país y un conjunto de indicadores del mercado laboral simulada. Cada fila representa un departamento, mientras que cada columna corresponde a una variable que será empleada en el análisis de conglomerados.
Antes de iniciar, es importante definir correctamente la carpeta de trabajo y verificar que en dicha ubicación se encuentre almacenada la base de datos proporcionada para la clase, ya que esto permitirá importar el archivo sin inconvenientes.
vars <- c("dependencia_total_pct",
"familiar_no_remunerado_pct",
"subocupacion_pct",
"ingresos_bajos_pct",
"trabajadores_pobres_pct",
"industria_pct")
X <- df[, vars]
Comentario
Las variables seleccionadas recogen distintas dimensiones del mercado de trabajo:
Estas variables permiten construir una tipología de departamentos según su estructura ocupacional y nivel de vulnerabilidad laboral.
summary(X)
## dependencia_total_pct familiar_no_remunerado_pct subocupacion_pct
## Min. :59.90 Min. : 4.300 Min. : 6.1
## 1st Qu.:62.75 1st Qu.: 6.700 1st Qu.:10.3
## Median :67.45 Median : 7.900 Median :11.8
## Mean :68.29 Mean : 8.488 Mean :11.2
## 3rd Qu.:73.17 3rd Qu.:10.600 3rd Qu.:12.3
## Max. :80.70 Max. :12.200 Max. :15.5
## ingresos_bajos_pct trabajadores_pobres_pct industria_pct
## Min. :25.10 Min. : 8.40 Min. :12.20
## 1st Qu.:39.20 1st Qu.:19.77 1st Qu.:15.65
## Median :45.10 Median :24.95 Median :17.30
## Mean :42.85 Mean :24.04 Mean :18.45
## 3rd Qu.:47.88 3rd Qu.:29.75 3rd Qu.:21.75
## Max. :52.00 Max. :32.50 Max. :27.00
Interpretación
Antes de realizar el agrupamiento, resulta conveniente examinar las estadísticas descriptivas de las variables para identificar:
Aunque todas las variables se expresen como porcentajes, ello no implica necesariamente que tengan comportamientos comparables, razón por la cual la estandarización sigue siendo recomendable.
Xz <- scale(X)
summary(Xz)
## dependencia_total_pct familiar_no_remunerado_pct subocupacion_pct
## Min. :-1.3490 Min. :-1.6839 Min. :-2.2799
## 1st Qu.:-0.8910 1st Qu.:-0.7188 1st Qu.:-0.4023
## Median :-0.1356 Median :-0.2363 Median : 0.2682
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.7845 3rd Qu.: 0.8495 3rd Qu.: 0.4917
## Max. : 1.9938 Max. : 1.4929 Max. : 1.9222
## ingresos_bajos_pct trabajadores_pobres_pct industria_pct
## Min. :-2.2063 Min. :-2.1158 Min. :-1.5212
## 1st Qu.:-0.4537 1st Qu.:-0.5773 1st Qu.:-0.6815
## Median : 0.2797 Median : 0.1226 Median :-0.2799
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.6246 3rd Qu.: 0.7718 3rd Qu.: 0.8032
## Max. : 1.1373 Max. : 1.1437 Max. : 2.0810
Interpretación
La estandarización permite que todas las variables contribuyan de manera equilibrada al cálculo de distancias. Así, ninguna variable domina el análisis únicamente por presentar una mayor dispersión.
d <- dist(Xz, method = "euclidean")
Interpretación
La matriz de distancias resume el grado de disimilitud entre cada par de departamentos. Distancias pequeñas indican perfiles más semejantes; distancias mayores reflejan perfiles más diferenciados.
hc <- hclust(d, method = "ward.D2")
Interpretación
A partir de la matriz de distancias, el algoritmo jerárquico va fusionando observaciones o grupos de observaciones según el criterio de Ward. El resultado es una estructura jerárquica de agrupación.
plot(hc,
labels = df$departamento,
cex = 0.9,
main = "Clúster jerárquico (Ward.D2)",
xlab = "",
sub = "")
Interpretación del dendrograma
El dendrograma muestra visualmente el proceso de agrupación.
Fusiones a baja altura reflejan unidades más similares; fusiones a mayor altura reflejan grupos más distintos.
k_candidates <- 3:6
sil <- sapply(k_candidates, function(k){
cl <- cutree(hc, k = k)
mean(silhouette(cl, d)[, 3])
})
tabla_k <- data.frame(
k = k_candidates,
silhouette_prom = round(sil, 3)
)
tabla_k
## k silhouette_prom
## 1 3 0.384
## 2 4 0.327
## 3 5 0.294
## 4 6 0.264
Interpretación
La tabla muestra la silhouette promedio para distintos valores de \(k\). El valor de \(k\) que presenta la mayor silhouette promedio se considera, en principio, la mejor partición desde el punto de vista de la cohesión interna y la separación entre grupos.
k_opt <- tabla_k$k[which.max(tabla_k$silhouette_prom)]
cat(">>> k óptimo según silhouette promedio:", k_opt, "\n")
## >>> k óptimo según silhouette promedio: 3
Comentario
En este ejemplo se evalúan particiones entre 3 y 6 conglomerados. Este rango puede modificarse según el tamaño de la base de datos y el objetivo del análisis. En la práctica, la elección de \(k\) también debe considerar la interpretabilidad sustantiva de los grupos obtenidos.
plot(tabla_k$k, tabla_k$silhouette_prom,
type = "b", pch = 19,
xlab = "Número de clústeres (k)",
ylab = "Silhouette promedio",
main = "Selección del número óptimo de clústeres")
abline(v = k_opt, lty = 2)
Interpretación
El gráfico permite visualizar de forma sencilla qué número de conglomerados presenta la mejor silhouette promedio. La línea vertical marca el valor de \(k\) finalmente seleccionado.
df$cluster <- cutree(hc, k = k_opt)
df[, c("departamento", "cluster")]
## # A tibble: 16 × 2
## departamento cluster
## <chr> <int>
## 1 Asunción 1
## 2 Concepción 2
## 3 San Pedro 3
## 4 Cordillera 2
## 5 Guairá 2
## 6 Caaguazú 3
## 7 Caazapá 3
## 8 Itapúa 2
## 9 Misiones 2
## 10 Paraguarí 2
## 11 Alto Paraná 2
## 12 Central 1
## 13 Ñeembucú 3
## 14 Amambay 2
## 15 Canindeyú 3
## 16 Presidente Hayes 3
Interpretación
Cada departamento queda clasificado en uno de los conglomerados finales. Esta nueva variable puede utilizarse para describir perfiles territoriales o para realizar análisis comparativos entre grupos.
plot(hc,
labels = df$departamento,
cex = 0.9,
main = paste("Clúster jerárquico con", k_opt, "grupos"),
xlab = "",
sub = "")
rect.hclust(hc, k = k_opt, border = 2:(k_opt + 1))
Interpretación
Los rectángulos permiten visualizar los conglomerados finales identificados sobre el dendrograma. Esto facilita reconocer qué departamentos conforman cada grupo dentro de la estructura jerárquica.
perfil <- aggregate(df[, vars], by = list(cluster = df$cluster), FUN = mean)
round(perfil, 1)
## cluster dependencia_total_pct familiar_no_remunerado_pct subocupacion_pct
## 1 1 78.7 5.5 6.6
## 2 2 68.7 7.3 11.3
## 3 3 64.3 11.0 12.6
## ingresos_bajos_pct trabajadores_pobres_pct industria_pct
## 1 25.7 10.2 25.6
## 2 42.2 22.3 19.5
## 3 49.4 30.9 14.7
Interpretación
El perfilamiento consiste en calcular las medias de las variables para cada conglomerado, con el fin de caracterizar sustantivamente a los grupos.
Por ejemplo:
dept_por_cluster <- split(df$departamento, df$cluster)
dept_por_cluster
## $`1`
## [1] "Asunción" "Central"
##
## $`2`
## [1] "Concepción" "Cordillera" "Guairá" "Itapúa" "Misiones"
## [6] "Paraguarí" "Alto Paraná" "Amambay"
##
## $`3`
## [1] "San Pedro" "Caaguazú" "Caazapá" "Ñeembucú"
## [5] "Canindeyú" "Presidente Hayes"
Interpretación
Este resultado permite identificar concretamente qué departamentos integran cada conglomerado. Es especialmente útil cuando el objetivo es construir tipologías territoriales o diseñar estrategias diferenciadas de política pública.
write.xlsx(list(
"tabla_k" = tabla_k,
"departamentos_con_cluster" = df,
"perfil_cluster" = perfil
), file = "resultado_cluster_departamentos.xlsx", overwrite = TRUE)
Comentario
La exportación genera un archivo Excel con tres hojas:
El análisis de conglomerados jerárquicos constituye una herramienta útil para identificar grupos de departamentos con características laborales similares. Su aplicación permite:
No obstante, debe recordarse que los resultados dependen de:
Por tanto, el análisis de conglomerados debe entenderse como una herramienta exploratoria que requiere interpretación sustantiva complementaria.
Una vez obtenidos los conglomerados, es conveniente analizar:
Nota metodológica: La presente guía fue elaborada con apoyo de herramientas de inteligencia artificial generativa, específicamente ChatGPT de OpenAI, como asistencia en la estructuración y redacción del material. La selección de contenidos, la validación conceptual y la revisión final son responsabilidad del docente.
Alaminos Chica, A., Francés García, F. J., Penalva Verdú, C., & Santacreu Fernández, Ó. A. (2015). Análisis multivariante para las Ciencias Sociales I: Índices de distancia, conglomerados y análisis factorial. Universidad de Cuenca.
Hair, J. F., Anderson, R. E., Tatham, R. L., & Black, W. C. (1999). Análisis multivariante (5.ª ed.). Pearson Prentice Hall.
Pérez López, C. (2004). Técnicas de análisis multivariante de datos: Aplicaciones con SPSS. Pearson Educación.
R Core Team. (2025). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/
Maechler, M., Rousseeuw, P., Struyf, A., Hubert, M., & Hornik, K. (2026). cluster: Cluster analysis basics and extensions (R package version 2.1.8.2). https://CRAN.R-project.org/package=cluster
Wickham, H., & Bryan, J. (2025). readxl: Read Excel files (R package version 1.4.5). https://CRAN.R-project.org/package=readxl
Schauberger, P., Walker, A., Braglia, L., Sturm, J., Garbuszus, J. M., Barbone, J. M., Zimmermann, D., & Kainhofer, R. (2025). openxlsx: Read, write and edit xlsx files (R package version 4.2.8.1). https://CRAN.R-project.org/package=openxlsx
Xie, Y. (2025). knitr: A general-purpose package for dynamic report generation in R (R package version 1.51). https://yihui.org/knitr/