Análisis de Clúster (Conglomerados)

UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
CICLO II-2025


Tema: Análisis de Clúster (Conglomerados)


Asigantura:
Métodos para el Análisis Económico


Grupo Teorico
01


Docente.
MSF. Carlos Ademir Perez Alas.


Integrantes:
Gabriela Guadalupe Leiva Villalta (LV22011)
Andrea Paola Mejia Garcia (MG20044)
Luz Virginia Perez Ramirez (PR18044)


CIUDAD UNIVERSITARIA, 17 DE NOVIEMBRE 2025

1. Explicacíon del Análisis de Conglomerados

El análisis de conglomerados es uno de los métodos más importantes de la minería de datos utilizado para descubrir conocimiento en conjuntos de datos multidimensionales. El objetivo principal es identificar patrones o grupos de objetos similares (clústeres) dentro de un conjunto de datos, de modo que la similaridad entre los objetos dentro de un mismo grupo sea máxima y la similaridad entre objetos de diferentes grupos sea mínima. Esta técnica se clasifica como “aprendizaje automático no supervisado” o “reconocimiento de patrones”. Se le denomina “no supervisado” porque el proceso algorítmico no utiliza etiquetas o categorías predefinidas para guiar el agrupamiento; en su lugar, el algoritmo aprende la estructura de los datos basándose únicamente en medidas de similaridad o distancia entre las observaciones Kassambara (2017).

1.1 Tipos de Análisis de Conglomerados

1.1.1 Agrupamiento por Partición (No Jerárquico)

Estos métodos tienen como característica central que requieren que el analista preespecifique el número de grupos (k) en los que se dividirá el conjunto de datos.

La meta es crear una partición que optimice una función de coste, generalmente minimizando la varianza dentro de los clústeres.

  • Agrupamiento K-means: Este es uno de los métodos más populares. Su objetivo es particionar las observaciones en k grupos buscando minimizar la variación total dentro del clúster. Esta variación se calcula como la suma de las distancias euclidianas al cuadrado entre cada objeto y el centroide (media) de su grupo. Es sensible a la forma de los clústeres y a los outliers.

  • Algoritmo K-Medoids (o PAM - Partitioning Around Medoids): Es una alternativa robusta a K-means. En lugar de usar la media (centroide) como centro del clúster, utiliza el medoide, que es una observación real dentro del clúster. Esto lo hace menos sensible a los valores atípicos (outliers) que pueden distorsionar los centroides basados en la media.

  • Algoritmo CLARA (Clustering Large Applications): Es una extensión del algoritmo PAM diseñada para su aplicación eficiente en grandes conjuntos de datos, donde la complejidad computacional de PAM puede ser prohibitiva.

1.1.2 Agrupamiento Jerárquico (HCA).

Este enfoque se caracteriza por no requerir la especificación previa del número de conglomerados.

La salida es una estructura de árbol que muestra las relaciones de agrupamiento y las distancias de enlace entre los clústeres, conocida como dendrograma.

Los dos tipos principales son:

  • Agrupamiento Aglomerativo (AGNES): Es el método más común (proceso bottom-up). Comienza tratando cada observación como un clúster individual y luego fusiona progresivamente los grupos más cercanos hasta que todos los objetos se combinan en un único grupo grande (raíz). Es especialmente eficaz para identificar grupos pequeños y bien definidos.

  • Agrupamiento por División (DIANA): El proceso inverso (proceso top-down). Comienza con un único grupo con todas las observaciones y luego divide sucesivamente los grupos más heterogéneos hasta que cada observación está en su propio grupo. Es eficaz para identificar grupos grandes. Kassambara (2017).

2. Cuadro Comparativo del Análisis de Conglomerados

Análisis de Clúster

Técnicas Disponibles

Ventajas

Desventajas

Jerárquico

Crea una estructura anidada de clústeres representada por un dendrograma.

  • Aglomerativo (AGNES) (Bottom-up)

  • Divisivo (DIANA) (Top-down)

No requiere especificar k de antemano. Es eficaz para identificar grupos pequeños.

No requiere especificar K. Es eficaz para identificar grupos grandes.

Es un proceso irreversible (una vez unidos dos grupos, no se pueden separar).

El dendrograma puede volverse difícil de interpretar en conjuntos de datos grandes.

No Jerárquico (Partición)

Busca crear una partición directa de las observaciones en k grupos.

  • K-means

  • K-Medoids (PAM)

  • CLARA

Busca minimizar la variación total dentro del grupo.

Menos sensible a outliers y al ruido, ya que utiliza un medoide (observación real) como centro.

Diseñada para conjuntos de datos muy grandes al muestrear los datos para aplicar PAM.

Requiere que el número de grupos (k) sea preespecificado.

El rendimiento se degrada con conjuntos de datos muy grandes.

Dado que opera en muestras aleatorias del dataset, la calidad del resultado final depende de si la muestra seleccionada es representativa de todo el conjunto de datos. Si la muestra no es representativa, los medoide seleccionados pueden no ser óptimos para todo el conjunto de datos, resultando en un agrupamiento subóptimo en comparación con PAM (si este último fuera computable).

Fuente: elaboración propia con base en Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA

3 Técnicas de Análisis de Clúster y su Implementación en R.

3.1 Descripción de Técnicas de Análisis de Conglomerados

El análisis de conglomerados se implementa a través de dos enfoques principales, cada uno con algoritmos específicos que cumplen el objetivo de agrupar observaciones similares.

Análisis Jerárquico (HCA)

Estos métodos construyen una estructura anidada de clústeres, representada en un dendrograma, sin requerir la predefinición del número de grupos Kassambara (2017).

  • Aglomerativo (AGNES): Es el proceso bottom-up (de abajo hacia arriba). Inicia con cada punto como su propio clúster y fusiona progresivamente los clústeres más similares. Es eficaz para identificar grupos pequeños. Se implementa en R con la función hclust() del paquete stats o agnes() del paquete cluster, previa al cálculo de la matriz de distancias Kassambara (2017).

  • Divisivo (DIANA): Es el proceso inverso (top-down). Comienza con un clúster que contiene todas las observaciones y lo divide sucesivamente en subgrupos. Es útil para identificar grupos grandes. Se implementa en R con la función diana() del paquete cluster Kassambara (2017).

  • Métodos de Enlace (Linkage Methods): Son componentes esenciales para la implementación de AGNES y DIANA. Definen la regla para calcular la distancia o disimilitud entre dos clústeres ya formados. La elección del método de enlace (como Ward, completo, o promedio) es crucial, pues afecta directamente la forma del dendrograma y la asignación final Kassambara (2017). Estos métodos se especifican dentro del argumento method de la función hclust() en R.

Análisis No Jerárquico

Estos métodos se basan en la división directa del conjunto de datos en un número de grupos (\(k\)) que debe ser predefinido por el analista Kassambara (2017).

  • K-means: Es el algoritmo de partición más popular. Su principio operativo es encontrar la partición óptima que minimice la suma de las distancias al cuadrado entre cada observación y el centroide (la media) de su clúster asignado. La implementación en R se realiza mediante la función kmeans() del paquete base stats Kassambara (2017).

  • K-Medoids (PAM): Esta técnica es considerada una alternativa más robusta a K-means. En lugar de usar la media, utiliza un medoide (una observación real en el dataset) como punto central del clúster, lo que lo hace menos sensible a los valores atípicos (outliers) Kassambara (2017). La implementación en R se realiza con la función pam() del paquete cluster.

  • CLARA (Clustering Large Applications): Esta técnica fue diseñada para superar la ineficiencia de PAM con grandes volúmenes de datos. CLARA trabaja con muestras aleatorias del dataset, aplica PAM a la muestra y luego asigna el resto de los puntos al medoide más cercano Kassambara (2017). Se implementa en R mediante la función clara() del paquete cluster.

3.2 Librerias y sintaxis para implementacion en R.

Análisis Jerárquico de Conglomerados (HCA).

Los métodos jerárquicos construyen una estructura anidada de clústeres, sin requerir un número final de grupos (\(k\)) predefinido. El resultado se visualiza en un dendrograma.

1. Aglomerativo (AGNES)

Es un proceso bottom-up (de abajo hacia arriba). Comienza con cada observación como su propio clúster y, en cada paso, fusiona los dos clústeres más similares. Es eficaz para identificar grupos pequeños.

matriz_distancia <- dist(datos)
resultado_agnes <- hclust(matriz_distancia, method = "ward.D2")
plot(resultado_agnes)
cutree(resultado_agnes, k = 3)

Explicación de la Sintaxis:

  • matriz_distancia: Variable que almacena la matriz de distancias.

  • dist(): Función para calcular la matriz de disimilitud o distancia.

  • datos: El dataframe o matriz de datos de entrada.

  • resultado_agnes: Variable que almacena el objeto hclust.

  • hclust(): Función para realizar el clustering aglomerativo.

  • method = “ward.D2”: Especifica el método de enlace, común para minimizar la varianza dentro de los clústeres.

  • plot(): Función para graficar el dendrograma.

  • cutree(): Función para cortar el dendrograma en un número fijo de grupos.

  • k = 3: Especifica que se deben crear 3 clústeres finales.

2. Divisivo (DIANA)

Este es el proceso inverso (top-down). Comienza con un solo clúster que contiene todas las observaciones y lo divide iterativamente. En cada paso, divide el clúster más heterogéneo. Es útil para identificar grupos grandes.

resultado_diana <- cluster::diana(datos)

Explicación de la Sintaxis:

  • resultado_diana: Variable que almacena el objeto resultante.

  • cluster::diana(): Función del paquete cluster para el clustering divisivo.

  • datos: El dataframe o matriz de datos de entrada.

Análisis No Jerárquico (Por Partición).

Los métodos de partición buscan dividir el conjunto de datos en un número predefinido de clústeres (\(k\)), optimizando la homogeneidad interna.

1. K-means

Particiona las observaciones en \(k\) clústeres minimizando la distancia entre los puntos y el centroide (la media) de su clúster.

resultado_kmeans <- kmeans(datos, centers = 3, nstart = 25) 

Explicación de la Sintaxis:

  • resultado_kmeans: Variable que almacena el objeto resultante.

  • kmeans(): Función para el algoritmo K-means.

  • datos: El dataframe o matriz de datos de entrada.

  • centers = 3: Define k, el número de clústeres deseado (aquí, 3).

  • nstart = 25: Define el número de ejecuciones con centros iniciales aleatorios (aquí, 25).

2. K-Medoids (PAM)

Alternativa robusta a K-means. Utiliza un objeto real del dataset (el medoide) como centro del clúster, lo que minimiza la suma de las disimilitudes, haciéndola menos sensible a los outliers.

resultado_pam <- cluster::pam(datos, k = 4)

Explicación de la Sintaxis:

  • resultado_pam: Variable que almacena el objeto resultante.

  • cluster::pam(): Función del paquete cluster para el algoritmo PAM.

  • datos: El dataframe o matriz de datos de entrada.

  • k = 4: Especifica el número de clústeres deseado (aquí, 4).

3. CLARA (Clustering Large Applications)

Explicación: Extensión de PAM diseñada para manejar grandes conjuntos de datos. Trabaja seleccionando repetidamente una muestra aleatoria (solucionando la ineficiencia de PAM) y aplica PAM a esa muestra para encontrar los mejores k medoides. Es significativamente más eficiente en tiempo de cómputo para grandes volúmenes de datos.

resultado_clara <- cluster::clara(datos, k = 5, samples = 50)

Explicación de la Sintaxis:

  • resultado_clara: Variable que almacena el objeto resultante.

  • cluster::clara(): Función del paquete cluster para el algoritmo CLARA.

  • datos: El dataframe o matriz de datos de entrada.

  • k = 5: Especifica el número de clústeres deseado (aquí, 5).

  • samples = 50: Argumento que define el número de muestras aleatorias a tomar (aquí, 50).

4. Desarrollo práctico

De los capítulos 4–9 del libro de Kassambara (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA

Capítulo 4

K-Means Clustering

Computing k-means clustering in R

Data

library(knitr)
data("USArrests")
df <- scale(USArrests)
kable(
  head(df, 3),
  caption = "Primeras 3 filas de USArrests escalado",
  digits = 2
)
Primeras 3 filas de USArrests escalado
Murder Assault UrbanPop Rape
Alabama 1.24 0.78 -0.52 0.00
Alaska 0.51 1.11 -1.21 2.48
Arizona 0.07 1.48 1.00 1.04

Estimating the optimal number of clusters

library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2)

Computing k-means clustering

# Compute k-means with k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
# Print the results
print(km.res)
## K-means clustering with 4 clusters of sizes 8, 13, 16, 13
## 
## Cluster means:
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964
## 
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              4              4              1              4 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              4              3              3              4              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              4              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              4 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              4              2              1              4 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              4              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              4              4              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              4              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3 
## 
## Within cluster sum of squares by cluster:
## [1]  8.316061 11.952463 16.212213 19.922437
##  (between_SS / total_SS =  71.2 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

It’s possible to compute the mean of each variables by clusters using the original data:

library(knitr)
library(kableExtra)
tabla <- aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
kable(tabla, digits = 2) %>%
  kable_styling(full_width = FALSE, bootstrap_options = "striped")
cluster Murder Assault UrbanPop Rape
1 13.94 243.62 53.75 21.41
2 3.60 78.54 52.08 12.18
3 5.66 138.88 73.88 18.78
4 10.82 257.38 76.00 33.19
library(knitr)
dd <- cbind(USArrests, cluster = km.res$cluster)
kable(head(dd), digits = 2)
Murder Assault UrbanPop Rape cluster
Alabama 13.2 236 58 21.2 1
Alaska 10.0 263 48 44.5 4
Arizona 8.1 294 80 31.0 4
Arkansas 8.8 190 50 19.5 1
California 9.0 276 91 40.6 4
Colorado 7.9 204 78 38.7 4

Accessing to the results of kmeans() function

# Cluster means
km.res$centers
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964
# Números de clúster (primeros 4)
head(km.res$cluster, 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        4        4        1
# Tamaño de cada clúster
km.res$size
## [1]  8 13 16 13
# Medias de cada clúster
km.res$centers
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964

Visualizing k-means clusters

fviz_cluster(km.res, data = df,
             palette = c("#7A67EE", "#E7B800", "#2E9FDF", "#FF69B4"),
             ellipse.type = "euclid", # Concentration ellipse
             star.plot = TRUE, # Add segments from centroids to items
             repel = TRUE, # Avoid label overplotting (slow)
             ggtheme = theme_minimal()
             )

Capítulo 5

K-Medoids

Computing PAM in R

Data

library(knitr)
data("USArrests")
df <- scale(USArrests)
kable(head(df, 3), digits = 2)
Murder Assault UrbanPop Rape
Alabama 1.24 0.78 -0.52 0.00
Alaska 0.51 1.11 -1.21 2.48
Arizona 0.07 1.48 1.00 1.04

Estimating the optimal number of clusters

library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+
  theme_classic()

Computing PAM clustering

pam.res<-pam(df,2)
print(pam.res)
## Medoids:
##            ID     Murder    Assault   UrbanPop       Rape
## New Mexico 31  0.8292944  1.3708088  0.3081225  1.1603196
## Nebraska   27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              1              1              2              1 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              1              2              2              1              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              2              2              1              2              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              2              2              1              2              1 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              2              1              2              1              1 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              1              2              2 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              1              1              1              2              2 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              2              2              2              2              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              1              2              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              2              2              2              2              2 
## Objective function:
##    build     swap 
## 1.441358 1.368969 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"
library(knitr)
dd <- cbind(USArrests, cluster = pam.res$cluster)
kable(head(dd, 3), digits = 2)
Murder Assault UrbanPop Rape cluster
Alabama 13.2 236 58 21.2 1
Alaska 10.0 263 48 44.5 1
Arizona 8.1 294 80 31.0 1

Accessing to the results of the pam() function

# Cluster medoids: New Mexico, Nebraska
pam.res$medoids
##                Murder    Assault   UrbanPop       Rape
## New Mexico  0.8292944  1.3708088  0.3081225  1.1603196
## Nebraska   -0.8008247 -0.8250772 -0.2445636 -0.5052109
# Cluster numbers
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

Visualizing PAM clusters

fviz_cluster(pam.res,
             palette = c("#8B3626", "#CD6889"), # color palette
             ellipse.type = "t", # Concentration ellipse repel = TRUE, # Avoid label overplotting (slow)
             ggtheme = theme_classic()
             )

Capítulo 6

CLARA- Clustering Large Applications

Computing CLARA in R

Data format and preparation

set.seed(1234) 
# Generate 500 objects, divided into 2 clusters.
df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
            cbind(rnorm(300,50,8), rnorm(300,50,8)))

# Specify column and row names
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))

# Previewing the data 
head(df, nrow = 6)
##             x        y
## S1  -9.656526 3.881815
## S2   2.219434 5.574150
## S3   8.675529 1.484111
## S4 -18.765582 5.605868
## S5   3.432998 2.493448
## S6   4.048447 6.083699

Estimating the optimal number of clusters

library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
  theme_classic()

Computing CLARA

# Compute CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Print components of clara.res
print(clara.res)
## Call:     clara(x = df, k = 2, samples = 50, pamLike = TRUE) 
## Medoids:
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
## Objective function:   9.87862
## Clustering vector:    Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes:            200 300 
## Best sample:
##  [1] S37  S49  S54  S63  S68  S71  S76  S80  S82  S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"

If you want to add the point classifications to the original data, use this:

library(knitr)
dd <- cbind(df, cluster = clara.res$cluster)
kable(head(dd, 4), digits = 2)
x y cluster
S1 -9.66 3.88 1
S2 2.22 5.57 1
S3 8.68 1.48 1
S4 -18.77 5.61 1

You can access to the results returned by clara() as follow:

# Medoids
clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
# Clustering
head(clara.res$clustering,10)
##  S1  S2  S3  S4  S5  S6  S7  S8  S9 S10 
##   1   1   1   1   1   1   1   1   1   1

The medoids are S121, S455

VisualizingCLARAclusters

fviz_cluster(clara.res,
             palette=c("#FF0000","#8B5A2B"),#color palette
             ellipse.type="t",# Concentrationellipse
             geom="point",pointsize=1,
             ggtheme=theme_classic()
             )

Capítulo 7

Agglomerative Clustering

Data

library(knitr)
data("USArrests")
df <- scale(USArrests)
kable(head(df, 6), digits = 2)
Murder Assault UrbanPop Rape
Alabama 1.24 0.78 -0.52 0.00
Alaska 0.51 1.11 -1.21 2.48
Arizona 0.07 1.48 1.00 1.04
Arkansas 0.23 0.23 -1.07 -0.18
California 0.28 1.26 1.76 2.07
Colorado 0.03 0.40 0.86 1.86

Similarity measures

library(knitr)
res.dist <- dist(df, method = "euclidean")
kable(as.matrix(res.dist)[1:6, 1:6], digits = 2)
Alabama Alaska Arizona Arkansas California Colorado
Alabama 0.00 2.70 2.29 1.29 3.26 2.65
Alaska 2.70 0.00 2.70 2.83 3.01 2.33
Arizona 2.29 2.70 0.00 2.72 1.31 1.37
Arkansas 1.29 2.83 2.72 0.00 3.76 2.83
California 3.26 3.01 1.31 3.76 0.00 1.29
Colorado 2.65 2.33 1.37 2.83 1.29 0.00

STEPS TO AGGLOMERATIVE HIERARCHICAL CLUSTERING

res.hc<-hclust(d=res.dist,method="ward.D2")

Dendrogram

# cex:labelsize
library("factoextra")
fviz_dend(res.hc,cex=0.5)

Verify the cluster tree

# Compute cophentic distance
res.coph <- cophenetic(res.hc)

# Correlation between cophenetic distance and
# the original distance
cor(res.dist, res.coph)
## [1] 0.6975266
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

Cut the dendrogram into di erent groups

# Cut tree into 4 groups
grp <- cutree(res.hc, k=4)
head(grp, n=4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Number of members in each cluster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Get the names for the members of cluster 1
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cut in 4 groups and color by groups
fviz_dend(res.hc, k=4, # Cut in four groups
          cex = 0.5, # label size
          k_colors = c("#698B22", "#FF82AB", "#CD5555", "#9B30FF"),
          color_labels_by_k = TRUE, # color labels by groups
          rect = TRUE # Add rectangle around groups
          )

fviz_cluster(list(data=df,cluster=grp),
             palette=c("#698B22","#FF82AB","#CD5555","#9B30FF"),
             ellipse.type="convex",# Concentration ellipse
             repel=TRUE,#Avoid labeloverplotting (slow)
             show.clust.cent=FALSE,ggtheme=theme_minimal()
             )

Cluster R package

library("cluster")
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(x=USArrests, # data matrix
                   stand = TRUE, # Standardize the data
                   metric = "euclidean", # metric for distance matrix
                   method = "ward" # Linkage method
                   )

# DIvisive ANAlysis Clustering
res.diana <- diana(x=USArrests, # data matrix
                   stand = TRUE, # standardize the data
                   metric = "euclidean" # metric for distance matrix
                   )
 
fviz_dend(res.agnes, cex = 0.6, k=4)

Capítulo 8

Comparing Dendrograms

Data preparation

df <- scale(USArrests)
# Subset containing 10 rows
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]

Comparing dendrograms

library(dendextend)
# Compute distance matrix
res.dist <- dist(df, method = "euclidean")
# Compute 2 hierarchical clusterings
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Create two dendrograms
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Create a list to hold dendrograms
dend_list <- dendlist(dend1, dend2)

tanglegram(dend1,dend2)

Customizedthetanglegram

tanglegram(dend1,dend2,
           highlight_distinct_edges=FALSE,# Turn-off dashedlines
           common_subtrees_color_lines=FALSE,#Turn-off line colors
           common_subtrees_color_branches=TRUE,# Colorcommonbranches
           main=paste("entanglement=",round(entanglement(dend_list),2))
           )

Correlation matrix between a list of dendrograms

# Cophenetic correlation matrix
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Baker correlation matrix
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000

The correlation between two trees can be also computed as follow:

# Cophenetic correlation coefficient
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Baker correlation coefficient
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
# Create multiple dendrograms by chaining
dend1 <- df %>% dist %>% hclust("complete")%>%as.dendrogram
dend2 <- df %>% dist %>% hclust("single")%>%as.dendrogram
dend3 <- df %>% dist %>% hclust("average")%>%as.dendrogram
dend4 <- df %>% dist %>% hclust("centroid")%>%as.dendrogram

# Compute correlation matrix
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)

# Print correlation matrix
round(cors, 2)
##          Complete Single Average Centroid
## Complete     1.00   0.46    0.45     0.30
## Single       0.46   1.00    0.23     0.17
## Average      0.45   0.23    1.00     0.31
## Centroid     0.30   0.17    0.31     1.00
# Visualize the correlation matrix using corrplot package
library(corrplot)
corrplot(cors, "pie", "lower")

Capítulo 9

Visualizing Dendrograms

# Load data
data(USArrests)

# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

Visualizing dendrograms

library(factoextra)
fviz_dend(hc, cex = 0.5)

fviz_dend(hc, cex = 0.5,
          main = "Dendrogram- ward.D2",
          xlab = "Objects", ylab = "Distance", sub = "")

fviz_dend(hc, cex = 0.5, horiz = TRUE)

fviz_dend(hc, k = 4, # Cut in four groups
          cex = 0.5, # label size
          k_colors = c("#00688B", "#FF6347", "#A020F0", "#D02090"),
          color_labels_by_k = TRUE, # color labels by groups
          ggtheme = theme_gray() # Change theme
          )

fviz_dend(hc, k=4,  # Cut in four groups
          cex = 0.5,# label size
          k_colors = c("#CD2626", "#00AFBB", "#7A8B8B", "#00CD00"),
          color_labels_by_k = TRUE, # color labels by groups
          ggtheme = theme_gray()# Change theme
          )

fviz_dend(hc, cex = 0.5, k=4, # Cut in four groups
          k_colors = "jco")

fviz_dend(hc,k=4,cex=0.4,horiz=TRUE, k_colors="jco",
          rect=TRUE,rect_border="jco",rect_fill=TRUE)

fviz_dend(hc, cex = 0.5, k=4,
          k_colors = "jco", type = "circular")

require("igraph")
fviz_dend(hc, k=4, k_colors = "jco",
          type = "phylogenic", repel = TRUE)

require("igraph")
fviz_dend(hc, k=4, # Cut in four groups
          k_colors = "jco",
          type = "phylogenic", repel = TRUE,
          phylo_layout = "layout.gem")

Zooming in the dendrogram

fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

The R code is as follow. • Cut the dendrogram and visualize the truncated version:

# Create a plot of the whole dendrogram,
# and extract the dendrogram data
dend_plot <- fviz_dend(hc, k=4, # Cut in four groups
                       cex = 0.5, # label size
                       k_colors = "jco"
                       )
dend_data <- attr(dend_plot, "dendrogram") # Extract dendrogram data

# Cut the dendrogram at height h = 10
dend_cuts <- cut(dend_data, h=10)
# Visualize the truncated version containing
# two branches
fviz_dend(dend_cuts$upper)

# Plotthewhole dendrogram
print(dend_plot)

# Plotsubtree1
fviz_dend(dend_cuts$lower[[1]],main="Subtree1")

# Plotsubtree2
fviz_dend(dend_cuts$lower[[2]],main="Subtree2")

fviz_dend(dend_cuts$lower[[2]], type = "circular")

Saving dendrogram into a large PDF page

pdf("dendrogram.pdf", width=30, height=15) # Open a PDF
p<-fviz_dend(hc, k=4, cex = 1, k_colors = "jco" ) # Do plotting
print(p)
dev.off() # Close the PDF
## png 
##   2

Manipulating dendrograms using dendextend

data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

library(dendextend)
dend <- USArrests[1:5,] %>% # data
  scale %>% # Scale the data
  dist %>% # calculate a distance matrix,
  hclust(method = "ward.D2")%>%# Hierarchical clustering
  as.dendrogram # Turn the object into a dendrogram.
plot(dend)

library(dendextend)
# 1. Create a customized dendrogram
mycols <- c("#104E8B", "#CD8162", "#00FF00", "#8B3A62")
dend <- as.dendrogram(hc) %>%
  set("branches_lwd", 1)%>%# Branches line width
  set("branches_k_color",mycols,k=4)%>%# Color branches by groups
  set("labels_colors",mycols,k=4)%>% # Color labels by groups
  set("labels_cex", 0.5) # Change label size

# 2. Create plot
fviz_dend(dend)

5. Aplicación del Análisis de Cluster: estudio de un dataset de Kaggle

El conjunto de datos utilizado corresponde a un dataset conocido como Country Data Murcia Valles (2021), el cual reúne información económica y social de diversos países. Incluye variables como el ingreso per cápita, la tasa de mortalidad infantil, la inflación, las exportaciones, las importaciones y otros indicadores macroeconómicos relevantes para caracterizar el nivel de desarrollo económico de cada nación.

Este tipo de información es especialmente adecuado para aplicar análisis de clúster, ya que permite evaluar similitudes estructurales entre países y agruparlos en función de patrones comunes en su desempeño económico. Asimismo, las variables del conjunto de datos se encuentran en formatos comparables o fácilmente estandarizables, lo que facilita la implementación de métodos como K-means o los algoritmos jerárquicos.

library(readr)
Country_data <- read_csv("Country-data.csv")
head(Country_data,n=15)
## # A tibble: 15 × 10
##    country         child_mort exports health imports income inflation life_expec
##    <chr>                <dbl>   <dbl>  <dbl>   <dbl>  <dbl>     <dbl>      <dbl>
##  1 Afghanistan           90.2    10     7.58    44.9   1610     9.44        56.2
##  2 Albania               16.6    28     6.55    48.6   9930     4.49        76.3
##  3 Algeria               27.3    38.4   4.17    31.4  12900    16.1         76.5
##  4 Angola               119      62.3   2.85    42.9   5900    22.4         60.1
##  5 Antigua and Ba…       10.3    45.5   6.03    58.9  19100     1.44        76.8
##  6 Argentina             14.5    18.9   8.1     16    18700    20.9         75.8
##  7 Armenia               18.1    20.8   4.4     45.3   6700     7.77        73.3
##  8 Australia              4.8    19.8   8.73    20.9  41400     1.16        82  
##  9 Austria                4.3    51.3  11       47.8  43200     0.873       80.5
## 10 Azerbaijan            39.2    54.3   5.88    20.7  16000    13.8         69.1
## 11 Bahamas               13.8    35     7.89    43.7  22900    -0.393       73.8
## 12 Bahrain                8.6    69.5   4.97    50.9  41100     7.44        76  
## 13 Bangladesh            49.4    16     3.52    21.8   2440     7.14        70.4
## 14 Barbados              14.2    39.5   7.97    48.7  15300     0.321       76.7
## 15 Belarus                5.5    51.4   5.61    64.5  16200    15.1         70.4
## # ℹ 2 more variables: total_fer <dbl>, gdpp <dbl>
library(stats)
library(factoextra)
library(cluster)

# FUNCIÓN PARA CALCULAR K ÓPTIMO DE FORMA ESTABLE
calcular_k_optimo <- function(datos, semilla = 123) {
  set.seed(semilla)
  df <- scale(datos)
  
  # Método de Silueta con semilla fija
  siluetas <- numeric(9)
  for(k in 2:10) {
    set.seed(semilla)
    km <- kmeans(df, centers = k, nstart = 25)
    siluetas[k-1] <- mean(silhouette(km$cluster, dist(df)))
  }
  
  k_silueta <- which.max(siluetas) + 1
  
  # Método del Codo para verificar
  wss <- sapply(1:10, function(k){
    set.seed(semilla)
    kmeans(df, centers = k, nstart = 25)$tot.withinss
  })
  
  # Devolver K óptimo
  return(k_silueta)
}

# CALCULAR K ÓPTIMO UNA SOLA VEZ
K_OPTIMO <- calcular_k_optimo(Country_data[, -1])

# MOSTRAR RESULTADO
cat("=== K ÓPTIMO CALCULADO ===\n")
## === K ÓPTIMO CALCULADO ===
cat("K =", K_OPTIMO, "\n")
## K = 10
cat("Este valor se mantendrá constante en todo el análisis\n")
## Este valor se mantendrá constante en todo el análisis

TÉCNICAS JERÁRQUICAS Agrupamiento Aglomerativo (AGNES)

library(cluster)
library(factoextra)

# Método 1: Usando funciones base + factoextra

datos_numericos <- Country_data[, -1]  # Excluir columna country
df <- scale(datos_numericos)  # Estandarizar datos

rownames(df) <- Country_data$country

# Calcular matriz de distancias
dist_matrix <- dist(df, method = "euclidean")

# Aplicar clustering jerárquico
hc <- hclust(dist_matrix, method = "ward.D2")

# Visualizar dendrograma CON K = 10 
fviz_dend(hc, k = 10, cex = 0.6)

# Método 2: Usando función agnes() del paquete cluster
res.agnes <- agnes(x = USArrests, 
                   stand = TRUE,        # Estandarizar
                   metric = "euclidean", # Métrica de distancia
                   method = "ward")     # Método de enlace

Agrupamiento Divisivo (DIANA)

library(cluster)
library(factoextra)

datos_numericos <- Country_data[, -1]  
rownames(datos_numericos) <- Country_data$country

# Aplicar clustering divisivo
res.diana <- diana(x = datos_numericos,
                   stand = TRUE,        # Estandarizar datos
                   metric = "euclidean") # Métrica de distancia

# Visualizar resultados
fviz_dend(res.diana, k = 10, cex = 0.6)

# Obtener grupos
grupos <- cutree(res.diana, k = 10)

TÉCNICAS NO JERÁRQUICAS K-Means Clustering

library(stats)      # Función kmeans() 
library(factoextra) # Visualización

datos_numericos <- Country_data[, -1]  
rownames(datos_numericos) <- Country_data$country

# Preparar datos
df <- scale(datos_numericos)

# Estimar número óptimo de clusters
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss")

# Aplicar K-means con k=4
set.seed(123)
km.res <- kmeans(df, 
                 centers = 4,     # Número de clusters
                 nstart = 25)     # Número de inicializaciones

# Visualizar resultados
fviz_cluster(km.res, data = df,
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
             ellipse.type = "euclid")

# Acceder a resultados
km.res$cluster      # Asignación de clusters
##                    Afghanistan                        Albania 
##                              3                              2 
##                        Algeria                         Angola 
##                              2                              3 
##            Antigua and Barbuda                      Argentina 
##                              2                              2 
##                        Armenia                      Australia 
##                              2                              1 
##                        Austria                     Azerbaijan 
##                              1                              2 
##                        Bahamas                        Bahrain 
##                              2                              2 
##                     Bangladesh                       Barbados 
##                              2                              2 
##                        Belarus                        Belgium 
##                              2                              1 
##                         Belize                          Benin 
##                              2                              3 
##                         Bhutan                        Bolivia 
##                              2                              2 
##         Bosnia and Herzegovina                       Botswana 
##                              2                              3 
##                         Brazil                         Brunei 
##                              2                              1 
##                       Bulgaria                   Burkina Faso 
##                              2                              3 
##                        Burundi                       Cambodia 
##                              3                              2 
##                       Cameroon                         Canada 
##                              3                              1 
##                     Cape Verde       Central African Republic 
##                              2                              3 
##                           Chad                          Chile 
##                              3                              2 
##                          China                       Colombia 
##                              2                              2 
##                        Comoros               Congo, Dem. Rep. 
##                              3                              3 
##                    Congo, Rep.                     Costa Rica 
##                              3                              2 
##                  Cote d'Ivoire                        Croatia 
##                              3                              2 
##                         Cyprus                 Czech Republic 
##                              1                              2 
##                        Denmark             Dominican Republic 
##                              1                              2 
##                        Ecuador                          Egypt 
##                              2                              2 
##                    El Salvador              Equatorial Guinea 
##                              2                              3 
##                        Eritrea                        Estonia 
##                              3                              2 
##                           Fiji                        Finland 
##                              2                              1 
##                         France                          Gabon 
##                              1                              3 
##                         Gambia                        Georgia 
##                              3                              2 
##                        Germany                          Ghana 
##                              1                              3 
##                         Greece                        Grenada 
##                              1                              2 
##                      Guatemala                         Guinea 
##                              2                              3 
##                  Guinea-Bissau                         Guyana 
##                              3                              2 
##                          Haiti                        Hungary 
##                              3                              2 
##                        Iceland                          India 
##                              1                              2 
##                      Indonesia                           Iran 
##                              2                              2 
##                           Iraq                        Ireland 
##                              3                              1 
##                         Israel                          Italy 
##                              1                              1 
##                        Jamaica                          Japan 
##                              2                              1 
##                         Jordan                     Kazakhstan 
##                              2                              2 
##                          Kenya                       Kiribati 
##                              3                              3 
##                         Kuwait                Kyrgyz Republic 
##                              1                              2 
##                            Lao                         Latvia 
##                              3                              2 
##                        Lebanon                        Lesotho 
##                              2                              3 
##                        Liberia                          Libya 
##                              3                              2 
##                      Lithuania                     Luxembourg 
##                              2                              4 
##                 Macedonia, FYR                     Madagascar 
##                              2                              3 
##                         Malawi                       Malaysia 
##                              3                              2 
##                       Maldives                           Mali 
##                              2                              3 
##                          Malta                     Mauritania 
##                              4                              3 
##                      Mauritius          Micronesia, Fed. Sts. 
##                              2                              2 
##                        Moldova                       Mongolia 
##                              2                              2 
##                     Montenegro                        Morocco 
##                              2                              2 
##                     Mozambique                        Myanmar 
##                              3                              2 
##                        Namibia                          Nepal 
##                              3                              2 
##                    Netherlands                    New Zealand 
##                              1                              1 
##                          Niger                        Nigeria 
##                              3                              3 
##                         Norway                           Oman 
##                              1                              2 
##                       Pakistan                         Panama 
##                              3                              2 
##                       Paraguay                           Peru 
##                              2                              2 
##                    Philippines                         Poland 
##                              2                              2 
##                       Portugal                          Qatar 
##                              1                              1 
##                        Romania                         Russia 
##                              2                              2 
##                         Rwanda                          Samoa 
##                              3                              2 
##                   Saudi Arabia                        Senegal 
##                              2                              3 
##                         Serbia                     Seychelles 
##                              2                              2 
##                   Sierra Leone                      Singapore 
##                              3                              4 
##                Slovak Republic                       Slovenia 
##                              2                              1 
##                Solomon Islands                   South Africa 
##                              2                              3 
##                    South Korea                          Spain 
##                              1                              1 
##                      Sri Lanka St. Vincent and the Grenadines 
##                              2                              2 
##                          Sudan                       Suriname 
##                              3                              2 
##                         Sweden                    Switzerland 
##                              1                              1 
##                     Tajikistan                       Tanzania 
##                              2                              3 
##                       Thailand                    Timor-Leste 
##                              2                              3 
##                           Togo                          Tonga 
##                              3                              2 
##                        Tunisia                         Turkey 
##                              2                              2 
##                   Turkmenistan                         Uganda 
##                              2                              3 
##                        Ukraine           United Arab Emirates 
##                              2                              1 
##                 United Kingdom                  United States 
##                              1                              1 
##                        Uruguay                     Uzbekistan 
##                              2                              2 
##                        Vanuatu                      Venezuela 
##                              2                              2 
##                        Vietnam                          Yemen 
##                              2                              3 
##                         Zambia 
##                              3
km.res$centers      # Centroides
##   child_mort      exports       health     imports     income   inflation
## 1 -0.8261247  0.172103053  0.856613486 -0.29548409  1.4578905 -0.47675466
## 2 -0.4185681  0.006628559 -0.211088772  0.04743879 -0.2166227 -0.03484844
## 3  1.3561391 -0.436221182 -0.155516293 -0.18863644 -0.6848344  0.40090504
## 4 -0.8464575  4.920873128 -0.008138555  4.53442030  2.4322274 -0.50269428
##   life_expec  total_fer       gdpp
## 1  1.1043279 -0.7613916  1.6569189
## 2  0.2676147 -0.4369082 -0.3298134
## 3 -1.2783352  1.3608511 -0.6024306
## 4  1.2231457 -1.0357477  2.4334786
km.res$size         # Tamaño de clusters
## [1] 30 87 47  3

K-Medoids (PAM - Partitioning Around Medoids)

library(cluster)    # Función pam()
library(factoextra) # Visualización

# Estimar número óptimo de clusters
fviz_nbclust(df, pam, method = "silhouette")

# Aplicar PAM con k=2
pam.res <- pam(x = df,
               k = 2,              # Número de clusters
               metric = "euclidean", # Métrica de distancia
               stand = FALSE)      # Ya estandarizado

# Visualizar resultados
fviz_cluster(pam.res,
             palette = c("#00AFBB", "#FC4E07"),
             ellipse.type = "t")

# Acceder a resultados
pam.res$medoids     # Medoides seleccionados
##        child_mort     exports     health     imports     income  inflation
## Ghana   0.9033202 -0.42349963 -0.5809185 -0.04090177 -0.7306069  0.8342082
## Poland -0.8001715 -0.03680781  0.2345648 -0.19786437  0.2414823 -0.5791319
##        life_expec  total_fer        gdpp
## Ghana  -0.9395623  0.8732953 -0.63584175
## Poland  0.6459238 -1.0159306 -0.01986805
pam.res$clustering  # Asignación de clusters
##                    Afghanistan                        Albania 
##                              1                              2 
##                        Algeria                         Angola 
##                              2                              1 
##            Antigua and Barbuda                      Argentina 
##                              2                              2 
##                        Armenia                      Australia 
##                              2                              2 
##                        Austria                     Azerbaijan 
##                              2                              2 
##                        Bahamas                        Bahrain 
##                              2                              2 
##                     Bangladesh                       Barbados 
##                              1                              2 
##                        Belarus                        Belgium 
##                              2                              2 
##                         Belize                          Benin 
##                              2                              1 
##                         Bhutan                        Bolivia 
##                              2                              1 
##         Bosnia and Herzegovina                       Botswana 
##                              2                              1 
##                         Brazil                         Brunei 
##                              2                              2 
##                       Bulgaria                   Burkina Faso 
##                              2                              1 
##                        Burundi                       Cambodia 
##                              1                              1 
##                       Cameroon                         Canada 
##                              1                              2 
##                     Cape Verde       Central African Republic 
##                              2                              1 
##                           Chad                          Chile 
##                              1                              2 
##                          China                       Colombia 
##                              2                              2 
##                        Comoros               Congo, Dem. Rep. 
##                              1                              1 
##                    Congo, Rep.                     Costa Rica 
##                              1                              2 
##                  Cote d'Ivoire                        Croatia 
##                              1                              2 
##                         Cyprus                 Czech Republic 
##                              2                              2 
##                        Denmark             Dominican Republic 
##                              2                              2 
##                        Ecuador                          Egypt 
##                              2                              1 
##                    El Salvador              Equatorial Guinea 
##                              2                              1 
##                        Eritrea                        Estonia 
##                              1                              2 
##                           Fiji                        Finland 
##                              2                              2 
##                         France                          Gabon 
##                              2                              1 
##                         Gambia                        Georgia 
##                              1                              2 
##                        Germany                          Ghana 
##                              2                              1 
##                         Greece                        Grenada 
##                              2                              2 
##                      Guatemala                         Guinea 
##                              2                              1 
##                  Guinea-Bissau                         Guyana 
##                              1                              1 
##                          Haiti                        Hungary 
##                              1                              2 
##                        Iceland                          India 
##                              2                              1 
##                      Indonesia                           Iran 
##                              1                              2 
##                           Iraq                        Ireland 
##                              1                              2 
##                         Israel                          Italy 
##                              2                              2 
##                        Jamaica                          Japan 
##                              2                              2 
##                         Jordan                     Kazakhstan 
##                              2                              1 
##                          Kenya                       Kiribati 
##                              1                              1 
##                         Kuwait                Kyrgyz Republic 
##                              2                              1 
##                            Lao                         Latvia 
##                              1                              2 
##                        Lebanon                        Lesotho 
##                              2                              1 
##                        Liberia                          Libya 
##                              1                              2 
##                      Lithuania                     Luxembourg 
##                              2                              2 
##                 Macedonia, FYR                     Madagascar 
##                              2                              1 
##                         Malawi                       Malaysia 
##                              1                              2 
##                       Maldives                           Mali 
##                              2                              1 
##                          Malta                     Mauritania 
##                              2                              1 
##                      Mauritius          Micronesia, Fed. Sts. 
##                              2                              2 
##                        Moldova                       Mongolia 
##                              2                              1 
##                     Montenegro                        Morocco 
##                              2                              2 
##                     Mozambique                        Myanmar 
##                              1                              1 
##                        Namibia                          Nepal 
##                              1                              1 
##                    Netherlands                    New Zealand 
##                              2                              2 
##                          Niger                        Nigeria 
##                              1                              1 
##                         Norway                           Oman 
##                              2                              2 
##                       Pakistan                         Panama 
##                              1                              2 
##                       Paraguay                           Peru 
##                              2                              2 
##                    Philippines                         Poland 
##                              1                              2 
##                       Portugal                          Qatar 
##                              2                              2 
##                        Romania                         Russia 
##                              2                              2 
##                         Rwanda                          Samoa 
##                              1                              1 
##                   Saudi Arabia                        Senegal 
##                              2                              1 
##                         Serbia                     Seychelles 
##                              2                              2 
##                   Sierra Leone                      Singapore 
##                              1                              2 
##                Slovak Republic                       Slovenia 
##                              2                              2 
##                Solomon Islands                   South Africa 
##                              1                              1 
##                    South Korea                          Spain 
##                              2                              2 
##                      Sri Lanka St. Vincent and the Grenadines 
##                              1                              2 
##                          Sudan                       Suriname 
##                              1                              2 
##                         Sweden                    Switzerland 
##                              2                              2 
##                     Tajikistan                       Tanzania 
##                              1                              1 
##                       Thailand                    Timor-Leste 
##                              2                              1 
##                           Togo                          Tonga 
##                              1                              1 
##                        Tunisia                         Turkey 
##                              2                              2 
##                   Turkmenistan                         Uganda 
##                              1                              1 
##                        Ukraine           United Arab Emirates 
##                              2                              2 
##                 United Kingdom                  United States 
##                              2                              2 
##                        Uruguay                     Uzbekistan 
##                              2                              1 
##                        Vanuatu                      Venezuela 
##                              1                              1 
##                        Vietnam                          Yemen 
##                              2                              1 
##                         Zambia 
##                              1
pam.res$silinfo     # Información de silueta
## $widths
##                                cluster neighbor    sil_width
## Guinea                               1        2  0.484743868
## Mozambique                           1        2  0.483524204
## Malawi                               1        2  0.480851879
## Burkina Faso                         1        2  0.469089211
## Zambia                               1        2  0.464051033
## Tanzania                             1        2  0.462916774
## Afghanistan                          1        2  0.460127503
## Cameroon                             1        2  0.453604087
## Cote d'Ivoire                        1        2  0.446584934
## Mali                                 1        2  0.445482563
## Benin                                1        2  0.440205163
## Chad                                 1        2  0.434896670
## Ghana                                1        2  0.430167799
## Madagascar                           1        2  0.429469387
## Gambia                               1        2  0.427114997
## Congo, Dem. Rep.                     1        2  0.427065085
## Guinea-Bissau                        1        2  0.425305960
## Uganda                               1        2  0.423256936
## Niger                                1        2  0.422771801
## Central African Republic             1        2  0.410991132
## Comoros                              1        2  0.404570157
## Senegal                              1        2  0.399287672
## Angola                               1        2  0.391356071
## Togo                                 1        2  0.389320685
## Sudan                                1        2  0.387359840
## Eritrea                              1        2  0.383237807
## Kenya                                1        2  0.380758511
## Pakistan                             1        2  0.366400866
## Burundi                              1        2  0.360322354
## Mauritania                           1        2  0.359554557
## Yemen                                1        2  0.347800818
## Lao                                  1        2  0.333207854
## Sierra Leone                         1        2  0.316264394
## Haiti                                1        2  0.289299434
## Timor-Leste                          1        2  0.286531998
## Gabon                                1        2  0.279684078
## Congo, Rep.                          1        2  0.279470490
## Rwanda                               1        2  0.254503447
## Namibia                              1        2  0.246708541
## India                                1        2  0.235700523
## Liberia                              1        2  0.234641166
## Tajikistan                           1        2  0.227855579
## Equatorial Guinea                    1        2  0.220073549
## Lesotho                              1        2  0.209636412
## Myanmar                              1        2  0.200914025
## Nepal                                1        2  0.196665567
## Iraq                                 1        2  0.196087077
## South Africa                         1        2  0.188038333
## Botswana                             1        2  0.179683487
## Kiribati                             1        2  0.172560021
## Vanuatu                              1        2  0.158470068
## Solomon Islands                      1        2  0.143230690
## Nigeria                              1        2  0.142216619
## Bangladesh                           1        2  0.133205195
## Bolivia                              1        2  0.115560216
## Indonesia                            1        2  0.111270945
## Philippines                          1        2  0.106465768
## Mongolia                             1        2  0.103783311
## Egypt                                1        2  0.099308783
## Tonga                                1        2  0.088349631
## Uzbekistan                           1        2  0.083677937
## Cambodia                             1        2  0.074259645
## Turkmenistan                         1        2  0.063893280
## Samoa                                1        2  0.047660192
## Venezuela                            1        2  0.011667827
## Guyana                               1        2  0.008598896
## Kyrgyz Republic                      1        2  0.002566736
## Sri Lanka                            1        2 -0.007448437
## Kazakhstan                           1        2 -0.024200202
## South Korea                          2        1  0.469987123
## Slovenia                             2        1  0.452788726
## Czech Republic                       2        1  0.449272251
## Cyprus                               2        1  0.448627936
## Iceland                              2        1  0.438026088
## Poland                               2        1  0.434168823
## Finland                              2        1  0.432467911
## Austria                              2        1  0.431149269
## Spain                                2        1  0.431034452
## Italy                                2        1  0.428157307
## Portugal                             2        1  0.425619252
## Germany                              2        1  0.425614365
## United Kingdom                       2        1  0.423981464
## Croatia                              2        1  0.423773503
## Sweden                               2        1  0.421775083
## Greece                               2        1  0.418828184
## Barbados                             2        1  0.414519564
## New Zealand                          2        1  0.413356943
## Bahamas                              2        1  0.403537794
## Lebanon                              2        1  0.402848066
## Canada                               2        1  0.401689037
## Belgium                              2        1  0.398465768
## Latvia                               2        1  0.398188205
## Slovak Republic                      2        1  0.395213375
## Netherlands                          2        1  0.393335610
## Lithuania                            2        1  0.393178602
## Denmark                              2        1  0.391233410
## Estonia                              2        1  0.389734417
## France                               2        1  0.389448611
## Israel                               2        1  0.387753044
## Antigua and Barbuda                  2        1  0.386548309
## Chile                                2        1  0.385724926
## Bulgaria                             2        1  0.379103500
## Hungary                              2        1  0.375488933
## Montenegro                           2        1  0.374046618
## Japan                                2        1  0.372368148
## Australia                            2        1  0.372345560
## Bahrain                              2        1  0.367106019
## Switzerland                          2        1  0.352501201
## Mauritius                            2        1  0.352447900
## Macedonia, FYR                       2        1  0.349632984
## Ireland                              2        1  0.348924691
## Costa Rica                           2        1  0.342260242
## Serbia                               2        1  0.340596953
## Bosnia and Herzegovina               2        1  0.336286700
## Uruguay                              2        1  0.332030003
## Romania                              2        1  0.321833431
## Maldives                             2        1  0.321466114
## Tunisia                              2        1  0.320042027
## United Arab Emirates                 2        1  0.315434186
## Panama                               2        1  0.313107171
## Albania                              2        1  0.308700395
## Norway                               2        1  0.297891907
## Thailand                             2        1  0.293538780
## Turkey                               2        1  0.283882778
## Malaysia                             2        1  0.276966753
## Kuwait                               2        1  0.269099584
## Brunei                               2        1  0.251445794
## Libya                                2        1  0.249542010
## United States                        2        1  0.246533187
## Georgia                              2        1  0.246176275
## Belarus                              2        1  0.243381156
## Ukraine                              2        1  0.234207657
## El Salvador                          2        1  0.227164403
## Oman                                 2        1  0.225213646
## Colombia                             2        1  0.224196690
## Saudi Arabia                         2        1  0.217917318
## Grenada                              2        1  0.213387279
## Brazil                               2        1  0.205779807
## Ecuador                              2        1  0.205255972
## Seychelles                           2        1  0.203991154
## Suriname                             2        1  0.202088319
## Qatar                                2        1  0.200081237
## Malta                                2        1  0.198485186
## China                                2        1  0.195589670
## Luxembourg                           2        1  0.189988347
## Moldova                              2        1  0.189397178
## Vietnam                              2        1  0.187052616
## Paraguay                             2        1  0.183667600
## Jamaica                              2        1  0.177134285
## Belize                               2        1  0.175060925
## Peru                                 2        1  0.171159280
## Russia                               2        1  0.169553301
## Singapore                            2        1  0.169385539
## St. Vincent and the Grenadines       2        1  0.159933320
## Iran                                 2        1  0.158980220
## Argentina                            2        1  0.148296888
## Armenia                              2        1  0.148221814
## Jordan                               2        1  0.145326132
## Dominican Republic                   2        1  0.124392586
## Morocco                              2        1  0.102002200
## Cape Verde                           2        1  0.084014941
## Bhutan                               2        1  0.073144906
## Azerbaijan                           2        1  0.070911482
## Algeria                              2        1  0.046901561
## Fiji                                 2        1  0.022081701
## Micronesia, Fed. Sts.                2        1 -0.013527738
## Guatemala                            2        1 -0.058171571
## 
## $clus.avg.widths
## [1] 0.2768443 0.2901275
## 
## $avg.width
## [1] 0.2846392

CLARA (Clustering Large Applications)

library(cluster)    # Función clara()
library(factoextra) # Visualización

# Para datos grandes
clara.res <- clara(x = df,
                   k = 2,              # Número de clusters
                   samples = 50,       # Número de muestras
                   pamLike = TRUE,     # Usar algoritmo como PAM
                   metric = "euclidean")

# Visualizar resultados
fviz_cluster(clara.res,
             palette = c("#00AFBB", "#FC4E07"),
             ellipse.type = "t")

# Acceder a resultados
clara.res$medoids    # Medoides de la mejor muestra
##        child_mort     exports     health     imports     income  inflation
## Ghana   0.9033202 -0.42349963 -0.5809185 -0.04090177 -0.7306069  0.8342082
## Poland -0.8001715 -0.03680781  0.2345648 -0.19786437  0.2414823 -0.5791319
##        life_expec  total_fer        gdpp
## Ghana  -0.9395623  0.8732953 -0.63584175
## Poland  0.6459238 -1.0159306 -0.01986805
clara.res$clustering # Asignación de clusters
##                    Afghanistan                        Albania 
##                              1                              2 
##                        Algeria                         Angola 
##                              2                              1 
##            Antigua and Barbuda                      Argentina 
##                              2                              2 
##                        Armenia                      Australia 
##                              2                              2 
##                        Austria                     Azerbaijan 
##                              2                              2 
##                        Bahamas                        Bahrain 
##                              2                              2 
##                     Bangladesh                       Barbados 
##                              1                              2 
##                        Belarus                        Belgium 
##                              2                              2 
##                         Belize                          Benin 
##                              2                              1 
##                         Bhutan                        Bolivia 
##                              2                              1 
##         Bosnia and Herzegovina                       Botswana 
##                              2                              1 
##                         Brazil                         Brunei 
##                              2                              2 
##                       Bulgaria                   Burkina Faso 
##                              2                              1 
##                        Burundi                       Cambodia 
##                              1                              1 
##                       Cameroon                         Canada 
##                              1                              2 
##                     Cape Verde       Central African Republic 
##                              2                              1 
##                           Chad                          Chile 
##                              1                              2 
##                          China                       Colombia 
##                              2                              2 
##                        Comoros               Congo, Dem. Rep. 
##                              1                              1 
##                    Congo, Rep.                     Costa Rica 
##                              1                              2 
##                  Cote d'Ivoire                        Croatia 
##                              1                              2 
##                         Cyprus                 Czech Republic 
##                              2                              2 
##                        Denmark             Dominican Republic 
##                              2                              2 
##                        Ecuador                          Egypt 
##                              2                              1 
##                    El Salvador              Equatorial Guinea 
##                              2                              1 
##                        Eritrea                        Estonia 
##                              1                              2 
##                           Fiji                        Finland 
##                              2                              2 
##                         France                          Gabon 
##                              2                              1 
##                         Gambia                        Georgia 
##                              1                              2 
##                        Germany                          Ghana 
##                              2                              1 
##                         Greece                        Grenada 
##                              2                              2 
##                      Guatemala                         Guinea 
##                              2                              1 
##                  Guinea-Bissau                         Guyana 
##                              1                              1 
##                          Haiti                        Hungary 
##                              1                              2 
##                        Iceland                          India 
##                              2                              1 
##                      Indonesia                           Iran 
##                              1                              2 
##                           Iraq                        Ireland 
##                              1                              2 
##                         Israel                          Italy 
##                              2                              2 
##                        Jamaica                          Japan 
##                              2                              2 
##                         Jordan                     Kazakhstan 
##                              2                              1 
##                          Kenya                       Kiribati 
##                              1                              1 
##                         Kuwait                Kyrgyz Republic 
##                              2                              1 
##                            Lao                         Latvia 
##                              1                              2 
##                        Lebanon                        Lesotho 
##                              2                              1 
##                        Liberia                          Libya 
##                              1                              2 
##                      Lithuania                     Luxembourg 
##                              2                              2 
##                 Macedonia, FYR                     Madagascar 
##                              2                              1 
##                         Malawi                       Malaysia 
##                              1                              2 
##                       Maldives                           Mali 
##                              2                              1 
##                          Malta                     Mauritania 
##                              2                              1 
##                      Mauritius          Micronesia, Fed. Sts. 
##                              2                              2 
##                        Moldova                       Mongolia 
##                              2                              1 
##                     Montenegro                        Morocco 
##                              2                              2 
##                     Mozambique                        Myanmar 
##                              1                              1 
##                        Namibia                          Nepal 
##                              1                              1 
##                    Netherlands                    New Zealand 
##                              2                              2 
##                          Niger                        Nigeria 
##                              1                              1 
##                         Norway                           Oman 
##                              2                              2 
##                       Pakistan                         Panama 
##                              1                              2 
##                       Paraguay                           Peru 
##                              2                              2 
##                    Philippines                         Poland 
##                              1                              2 
##                       Portugal                          Qatar 
##                              2                              2 
##                        Romania                         Russia 
##                              2                              2 
##                         Rwanda                          Samoa 
##                              1                              1 
##                   Saudi Arabia                        Senegal 
##                              2                              1 
##                         Serbia                     Seychelles 
##                              2                              2 
##                   Sierra Leone                      Singapore 
##                              1                              2 
##                Slovak Republic                       Slovenia 
##                              2                              2 
##                Solomon Islands                   South Africa 
##                              1                              1 
##                    South Korea                          Spain 
##                              2                              2 
##                      Sri Lanka St. Vincent and the Grenadines 
##                              1                              2 
##                          Sudan                       Suriname 
##                              1                              2 
##                         Sweden                    Switzerland 
##                              2                              2 
##                     Tajikistan                       Tanzania 
##                              1                              1 
##                       Thailand                    Timor-Leste 
##                              2                              1 
##                           Togo                          Tonga 
##                              1                              1 
##                        Tunisia                         Turkey 
##                              2                              2 
##                   Turkmenistan                         Uganda 
##                              1                              1 
##                        Ukraine           United Arab Emirates 
##                              2                              2 
##                 United Kingdom                  United States 
##                              2                              2 
##                        Uruguay                     Uzbekistan 
##                              2                              1 
##                        Vanuatu                      Venezuela 
##                              1                              1 
##                        Vietnam                          Yemen 
##                              2                              1 
##                         Zambia 
##                              1
clara.res$sample     # Observaciones en la mejor muestra
##  [1] "Austria"                        "Bahrain"                       
##  [3] "Belarus"                        "Benin"                         
##  [5] "Bosnia and Herzegovina"         "Botswana"                      
##  [7] "Chile"                          "Colombia"                      
##  [9] "Congo, Rep."                    "Cyprus"                        
## [11] "Czech Republic"                 "Fiji"                          
## [13] "France"                         "Georgia"                       
## [15] "Ghana"                          "Guatemala"                     
## [17] "Guyana"                         "Iceland"                       
## [19] "Iraq"                           "Ireland"                       
## [21] "Latvia"                         "Lesotho"                       
## [23] "Madagascar"                     "Malawi"                        
## [25] "Malaysia"                       "Malta"                         
## [27] "Montenegro"                     "Mozambique"                    
## [29] "Nepal"                          "New Zealand"                   
## [31] "Niger"                          "Nigeria"                       
## [33] "Philippines"                    "Poland"                        
## [35] "Romania"                        "Samoa"                         
## [37] "Saudi Arabia"                   "Serbia"                        
## [39] "South Africa"                   "St. Vincent and the Grenadines"
## [41] "Tanzania"                       "Tonga"                         
## [43] "Vanuatu"                        "Yemen"

K-Means Clustering

df <- scale(datos_numericos) # Scaling the data
# View the firt 3 rows of the data
head(df, n = 3)
##             child_mort     exports      health     imports     income
## Afghanistan  1.2876597 -1.13486665  0.27825140 -0.08220771 -0.8058219
## Albania     -0.5373329 -0.47822017 -0.09672528  0.07062429 -0.3742433
## Algeria     -0.2720146 -0.09882442 -0.96317624 -0.63983800 -0.2201823
##              inflation life_expec   total_fer       gdpp
## Afghanistan  0.1568645 -1.6142372  1.89717646 -0.6771431
## Albania     -0.3114109  0.6459238 -0.85739418 -0.4841671
## Algeria      0.7869076  0.6684130 -0.03828924 -0.4639802
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)

# Compute k-means with k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
# Print the results
print(km.res)
## K-means clustering with 4 clusters of sizes 30, 87, 47, 3
## 
## Cluster means:
##   child_mort      exports       health     imports     income   inflation
## 1 -0.8261247  0.172103053  0.856613486 -0.29548409  1.4578905 -0.47675466
## 2 -0.4185681  0.006628559 -0.211088772  0.04743879 -0.2166227 -0.03484844
## 3  1.3561391 -0.436221182 -0.155516293 -0.18863644 -0.6848344  0.40090504
## 4 -0.8464575  4.920873128 -0.008138555  4.53442030  2.4322274 -0.50269428
##   life_expec  total_fer       gdpp
## 1  1.1043279 -0.7613916  1.6569189
## 2  0.2676147 -0.4369082 -0.3298134
## 3 -1.2783352  1.3608511 -0.6024306
## 4  1.2231457 -1.0357477  2.4334786
## 
## Clustering vector:
##                    Afghanistan                        Albania 
##                              3                              2 
##                        Algeria                         Angola 
##                              2                              3 
##            Antigua and Barbuda                      Argentina 
##                              2                              2 
##                        Armenia                      Australia 
##                              2                              1 
##                        Austria                     Azerbaijan 
##                              1                              2 
##                        Bahamas                        Bahrain 
##                              2                              2 
##                     Bangladesh                       Barbados 
##                              2                              2 
##                        Belarus                        Belgium 
##                              2                              1 
##                         Belize                          Benin 
##                              2                              3 
##                         Bhutan                        Bolivia 
##                              2                              2 
##         Bosnia and Herzegovina                       Botswana 
##                              2                              3 
##                         Brazil                         Brunei 
##                              2                              1 
##                       Bulgaria                   Burkina Faso 
##                              2                              3 
##                        Burundi                       Cambodia 
##                              3                              2 
##                       Cameroon                         Canada 
##                              3                              1 
##                     Cape Verde       Central African Republic 
##                              2                              3 
##                           Chad                          Chile 
##                              3                              2 
##                          China                       Colombia 
##                              2                              2 
##                        Comoros               Congo, Dem. Rep. 
##                              3                              3 
##                    Congo, Rep.                     Costa Rica 
##                              3                              2 
##                  Cote d'Ivoire                        Croatia 
##                              3                              2 
##                         Cyprus                 Czech Republic 
##                              1                              2 
##                        Denmark             Dominican Republic 
##                              1                              2 
##                        Ecuador                          Egypt 
##                              2                              2 
##                    El Salvador              Equatorial Guinea 
##                              2                              3 
##                        Eritrea                        Estonia 
##                              3                              2 
##                           Fiji                        Finland 
##                              2                              1 
##                         France                          Gabon 
##                              1                              3 
##                         Gambia                        Georgia 
##                              3                              2 
##                        Germany                          Ghana 
##                              1                              3 
##                         Greece                        Grenada 
##                              1                              2 
##                      Guatemala                         Guinea 
##                              2                              3 
##                  Guinea-Bissau                         Guyana 
##                              3                              2 
##                          Haiti                        Hungary 
##                              3                              2 
##                        Iceland                          India 
##                              1                              2 
##                      Indonesia                           Iran 
##                              2                              2 
##                           Iraq                        Ireland 
##                              3                              1 
##                         Israel                          Italy 
##                              1                              1 
##                        Jamaica                          Japan 
##                              2                              1 
##                         Jordan                     Kazakhstan 
##                              2                              2 
##                          Kenya                       Kiribati 
##                              3                              3 
##                         Kuwait                Kyrgyz Republic 
##                              1                              2 
##                            Lao                         Latvia 
##                              3                              2 
##                        Lebanon                        Lesotho 
##                              2                              3 
##                        Liberia                          Libya 
##                              3                              2 
##                      Lithuania                     Luxembourg 
##                              2                              4 
##                 Macedonia, FYR                     Madagascar 
##                              2                              3 
##                         Malawi                       Malaysia 
##                              3                              2 
##                       Maldives                           Mali 
##                              2                              3 
##                          Malta                     Mauritania 
##                              4                              3 
##                      Mauritius          Micronesia, Fed. Sts. 
##                              2                              2 
##                        Moldova                       Mongolia 
##                              2                              2 
##                     Montenegro                        Morocco 
##                              2                              2 
##                     Mozambique                        Myanmar 
##                              3                              2 
##                        Namibia                          Nepal 
##                              3                              2 
##                    Netherlands                    New Zealand 
##                              1                              1 
##                          Niger                        Nigeria 
##                              3                              3 
##                         Norway                           Oman 
##                              1                              2 
##                       Pakistan                         Panama 
##                              3                              2 
##                       Paraguay                           Peru 
##                              2                              2 
##                    Philippines                         Poland 
##                              2                              2 
##                       Portugal                          Qatar 
##                              1                              1 
##                        Romania                         Russia 
##                              2                              2 
##                         Rwanda                          Samoa 
##                              3                              2 
##                   Saudi Arabia                        Senegal 
##                              2                              3 
##                         Serbia                     Seychelles 
##                              2                              2 
##                   Sierra Leone                      Singapore 
##                              3                              4 
##                Slovak Republic                       Slovenia 
##                              2                              1 
##                Solomon Islands                   South Africa 
##                              2                              3 
##                    South Korea                          Spain 
##                              1                              1 
##                      Sri Lanka St. Vincent and the Grenadines 
##                              2                              2 
##                          Sudan                       Suriname 
##                              3                              2 
##                         Sweden                    Switzerland 
##                              1                              1 
##                     Tajikistan                       Tanzania 
##                              2                              3 
##                       Thailand                    Timor-Leste 
##                              2                              3 
##                           Togo                          Tonga 
##                              3                              2 
##                        Tunisia                         Turkey 
##                              2                              2 
##                   Turkmenistan                         Uganda 
##                              2                              3 
##                        Ukraine           United Arab Emirates 
##                              2                              1 
##                 United Kingdom                  United States 
##                              1                              1 
##                        Uruguay                     Uzbekistan 
##                              2                              2 
##                        Vanuatu                      Venezuela 
##                              2                              2 
##                        Vietnam                          Yemen 
##                              2                              3 
##                         Zambia 
##                              3 
## 
## Within cluster sum of squares by cluster:
## [1] 131.68189 273.91303 269.66044  20.87409
##  (between_SS / total_SS =  53.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
aggregate(datos_numericos, by=list(cluster=km.res$cluster), mean)
##   cluster child_mort   exports   health   imports    income inflation
## 1       1   4.953333  45.82667 9.168667  39.73667 45250.000   2.74220
## 2       2  21.389655  41.29068 6.235862  48.03869 12968.621   7.41346
## 3       3  92.961702  29.15128 6.388511  42.32340  3942.404  12.01968
## 4       4   4.133333 176.00000 6.793333 156.66667 64033.333   2.46800
##   life_expec total_fer      gdpp
## 1   80.37667  1.795333 43333.333
## 2   72.93563  2.286552  6919.103
## 3   59.18723  5.008085  1922.383
## 4   81.43333  1.380000 57566.667
dd <- cbind(datos_numericos, cluster = km.res$cluster)
head(dd)
##                     child_mort exports health imports income inflation
## Afghanistan               90.2    10.0   7.58    44.9   1610      9.44
## Albania                   16.6    28.0   6.55    48.6   9930      4.49
## Algeria                   27.3    38.4   4.17    31.4  12900     16.10
## Angola                   119.0    62.3   2.85    42.9   5900     22.40
## Antigua and Barbuda       10.3    45.5   6.03    58.9  19100      1.44
## Argentina                 14.5    18.9   8.10    16.0  18700     20.90
##                     life_expec total_fer  gdpp cluster
## Afghanistan               56.2      5.82   553       3
## Albania                   76.3      1.65  4090       2
## Algeria                   76.5      2.89  4460       2
## Angola                    60.1      6.16  3530       3
## Antigua and Barbuda       76.8      2.13 12200       2
## Argentina                 75.8      2.37 10300       2
# Cluster number for each of the observations
km.res$cluster
##                    Afghanistan                        Albania 
##                              3                              2 
##                        Algeria                         Angola 
##                              2                              3 
##            Antigua and Barbuda                      Argentina 
##                              2                              2 
##                        Armenia                      Australia 
##                              2                              1 
##                        Austria                     Azerbaijan 
##                              1                              2 
##                        Bahamas                        Bahrain 
##                              2                              2 
##                     Bangladesh                       Barbados 
##                              2                              2 
##                        Belarus                        Belgium 
##                              2                              1 
##                         Belize                          Benin 
##                              2                              3 
##                         Bhutan                        Bolivia 
##                              2                              2 
##         Bosnia and Herzegovina                       Botswana 
##                              2                              3 
##                         Brazil                         Brunei 
##                              2                              1 
##                       Bulgaria                   Burkina Faso 
##                              2                              3 
##                        Burundi                       Cambodia 
##                              3                              2 
##                       Cameroon                         Canada 
##                              3                              1 
##                     Cape Verde       Central African Republic 
##                              2                              3 
##                           Chad                          Chile 
##                              3                              2 
##                          China                       Colombia 
##                              2                              2 
##                        Comoros               Congo, Dem. Rep. 
##                              3                              3 
##                    Congo, Rep.                     Costa Rica 
##                              3                              2 
##                  Cote d'Ivoire                        Croatia 
##                              3                              2 
##                         Cyprus                 Czech Republic 
##                              1                              2 
##                        Denmark             Dominican Republic 
##                              1                              2 
##                        Ecuador                          Egypt 
##                              2                              2 
##                    El Salvador              Equatorial Guinea 
##                              2                              3 
##                        Eritrea                        Estonia 
##                              3                              2 
##                           Fiji                        Finland 
##                              2                              1 
##                         France                          Gabon 
##                              1                              3 
##                         Gambia                        Georgia 
##                              3                              2 
##                        Germany                          Ghana 
##                              1                              3 
##                         Greece                        Grenada 
##                              1                              2 
##                      Guatemala                         Guinea 
##                              2                              3 
##                  Guinea-Bissau                         Guyana 
##                              3                              2 
##                          Haiti                        Hungary 
##                              3                              2 
##                        Iceland                          India 
##                              1                              2 
##                      Indonesia                           Iran 
##                              2                              2 
##                           Iraq                        Ireland 
##                              3                              1 
##                         Israel                          Italy 
##                              1                              1 
##                        Jamaica                          Japan 
##                              2                              1 
##                         Jordan                     Kazakhstan 
##                              2                              2 
##                          Kenya                       Kiribati 
##                              3                              3 
##                         Kuwait                Kyrgyz Republic 
##                              1                              2 
##                            Lao                         Latvia 
##                              3                              2 
##                        Lebanon                        Lesotho 
##                              2                              3 
##                        Liberia                          Libya 
##                              3                              2 
##                      Lithuania                     Luxembourg 
##                              2                              4 
##                 Macedonia, FYR                     Madagascar 
##                              2                              3 
##                         Malawi                       Malaysia 
##                              3                              2 
##                       Maldives                           Mali 
##                              2                              3 
##                          Malta                     Mauritania 
##                              4                              3 
##                      Mauritius          Micronesia, Fed. Sts. 
##                              2                              2 
##                        Moldova                       Mongolia 
##                              2                              2 
##                     Montenegro                        Morocco 
##                              2                              2 
##                     Mozambique                        Myanmar 
##                              3                              2 
##                        Namibia                          Nepal 
##                              3                              2 
##                    Netherlands                    New Zealand 
##                              1                              1 
##                          Niger                        Nigeria 
##                              3                              3 
##                         Norway                           Oman 
##                              1                              2 
##                       Pakistan                         Panama 
##                              3                              2 
##                       Paraguay                           Peru 
##                              2                              2 
##                    Philippines                         Poland 
##                              2                              2 
##                       Portugal                          Qatar 
##                              1                              1 
##                        Romania                         Russia 
##                              2                              2 
##                         Rwanda                          Samoa 
##                              3                              2 
##                   Saudi Arabia                        Senegal 
##                              2                              3 
##                         Serbia                     Seychelles 
##                              2                              2 
##                   Sierra Leone                      Singapore 
##                              3                              4 
##                Slovak Republic                       Slovenia 
##                              2                              1 
##                Solomon Islands                   South Africa 
##                              2                              3 
##                    South Korea                          Spain 
##                              1                              1 
##                      Sri Lanka St. Vincent and the Grenadines 
##                              2                              2 
##                          Sudan                       Suriname 
##                              3                              2 
##                         Sweden                    Switzerland 
##                              1                              1 
##                     Tajikistan                       Tanzania 
##                              2                              3 
##                       Thailand                    Timor-Leste 
##                              2                              3 
##                           Togo                          Tonga 
##                              3                              2 
##                        Tunisia                         Turkey 
##                              2                              2 
##                   Turkmenistan                         Uganda 
##                              2                              3 
##                        Ukraine           United Arab Emirates 
##                              2                              1 
##                 United Kingdom                  United States 
##                              1                              1 
##                        Uruguay                     Uzbekistan 
##                              2                              2 
##                        Vanuatu                      Venezuela 
##                              2                              2 
##                        Vietnam                          Yemen 
##                              2                              3 
##                         Zambia 
##                              3
head(km.res$cluster, 4)
## Afghanistan     Albania     Algeria      Angola 
##           3           2           2           3
# Cluster size
km.res$size
## [1] 30 87 47  3
# Cluster means
km.res$centers
##   child_mort      exports       health     imports     income   inflation
## 1 -0.8261247  0.172103053  0.856613486 -0.29548409  1.4578905 -0.47675466
## 2 -0.4185681  0.006628559 -0.211088772  0.04743879 -0.2166227 -0.03484844
## 3  1.3561391 -0.436221182 -0.155516293 -0.18863644 -0.6848344  0.40090504
## 4 -0.8464575  4.920873128 -0.008138555  4.53442030  2.4322274 -0.50269428
##   life_expec  total_fer       gdpp
## 1  1.1043279 -0.7613916  1.6569189
## 2  0.2676147 -0.4369082 -0.3298134
## 3 -1.2783352  1.3608511 -0.6024306
## 4  1.2231457 -1.0357477  2.4334786
fviz_cluster(km.res, data = df,

palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid", # Concentration ellipse
star.plot = TRUE, # Add segments from centroids to items
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_minimal()
)

K-Medoids

df <- scale(datos_numericos) # Scale the data
head(df, n = 3) # View the firt 3 rows of the data
##             child_mort     exports      health     imports     income
## Afghanistan  1.2876597 -1.13486665  0.27825140 -0.08220771 -0.8058219
## Albania     -0.5373329 -0.47822017 -0.09672528  0.07062429 -0.3742433
## Algeria     -0.2720146 -0.09882442 -0.96317624 -0.63983800 -0.2201823
##              inflation life_expec   total_fer       gdpp
## Afghanistan  0.1568645 -1.6142372  1.89717646 -0.6771431
## Albania     -0.3114109  0.6459238 -0.85739418 -0.4841671
## Algeria      0.7869076  0.6684130 -0.03828924 -0.4639802
library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()

pam.res <- pam(df, 2)
print(pam.res)
## Medoids:
##         ID child_mort     exports     health     imports     income  inflation
## Ghana   60  0.9033202 -0.42349963 -0.5809185 -0.04090177 -0.7306069  0.8342082
## Poland 122 -0.8001715 -0.03680781  0.2345648 -0.19786437  0.2414823 -0.5791319
##        life_expec  total_fer        gdpp
## Ghana  -0.9395623  0.8732953 -0.63584175
## Poland  0.6459238 -1.0159306 -0.01986805
## Clustering vector:
##                    Afghanistan                        Albania 
##                              1                              2 
##                        Algeria                         Angola 
##                              2                              1 
##            Antigua and Barbuda                      Argentina 
##                              2                              2 
##                        Armenia                      Australia 
##                              2                              2 
##                        Austria                     Azerbaijan 
##                              2                              2 
##                        Bahamas                        Bahrain 
##                              2                              2 
##                     Bangladesh                       Barbados 
##                              1                              2 
##                        Belarus                        Belgium 
##                              2                              2 
##                         Belize                          Benin 
##                              2                              1 
##                         Bhutan                        Bolivia 
##                              2                              1 
##         Bosnia and Herzegovina                       Botswana 
##                              2                              1 
##                         Brazil                         Brunei 
##                              2                              2 
##                       Bulgaria                   Burkina Faso 
##                              2                              1 
##                        Burundi                       Cambodia 
##                              1                              1 
##                       Cameroon                         Canada 
##                              1                              2 
##                     Cape Verde       Central African Republic 
##                              2                              1 
##                           Chad                          Chile 
##                              1                              2 
##                          China                       Colombia 
##                              2                              2 
##                        Comoros               Congo, Dem. Rep. 
##                              1                              1 
##                    Congo, Rep.                     Costa Rica 
##                              1                              2 
##                  Cote d'Ivoire                        Croatia 
##                              1                              2 
##                         Cyprus                 Czech Republic 
##                              2                              2 
##                        Denmark             Dominican Republic 
##                              2                              2 
##                        Ecuador                          Egypt 
##                              2                              1 
##                    El Salvador              Equatorial Guinea 
##                              2                              1 
##                        Eritrea                        Estonia 
##                              1                              2 
##                           Fiji                        Finland 
##                              2                              2 
##                         France                          Gabon 
##                              2                              1 
##                         Gambia                        Georgia 
##                              1                              2 
##                        Germany                          Ghana 
##                              2                              1 
##                         Greece                        Grenada 
##                              2                              2 
##                      Guatemala                         Guinea 
##                              2                              1 
##                  Guinea-Bissau                         Guyana 
##                              1                              1 
##                          Haiti                        Hungary 
##                              1                              2 
##                        Iceland                          India 
##                              2                              1 
##                      Indonesia                           Iran 
##                              1                              2 
##                           Iraq                        Ireland 
##                              1                              2 
##                         Israel                          Italy 
##                              2                              2 
##                        Jamaica                          Japan 
##                              2                              2 
##                         Jordan                     Kazakhstan 
##                              2                              1 
##                          Kenya                       Kiribati 
##                              1                              1 
##                         Kuwait                Kyrgyz Republic 
##                              2                              1 
##                            Lao                         Latvia 
##                              1                              2 
##                        Lebanon                        Lesotho 
##                              2                              1 
##                        Liberia                          Libya 
##                              1                              2 
##                      Lithuania                     Luxembourg 
##                              2                              2 
##                 Macedonia, FYR                     Madagascar 
##                              2                              1 
##                         Malawi                       Malaysia 
##                              1                              2 
##                       Maldives                           Mali 
##                              2                              1 
##                          Malta                     Mauritania 
##                              2                              1 
##                      Mauritius          Micronesia, Fed. Sts. 
##                              2                              2 
##                        Moldova                       Mongolia 
##                              2                              1 
##                     Montenegro                        Morocco 
##                              2                              2 
##                     Mozambique                        Myanmar 
##                              1                              1 
##                        Namibia                          Nepal 
##                              1                              1 
##                    Netherlands                    New Zealand 
##                              2                              2 
##                          Niger                        Nigeria 
##                              1                              1 
##                         Norway                           Oman 
##                              2                              2 
##                       Pakistan                         Panama 
##                              1                              2 
##                       Paraguay                           Peru 
##                              2                              2 
##                    Philippines                         Poland 
##                              1                              2 
##                       Portugal                          Qatar 
##                              2                              2 
##                        Romania                         Russia 
##                              2                              2 
##                         Rwanda                          Samoa 
##                              1                              1 
##                   Saudi Arabia                        Senegal 
##                              2                              1 
##                         Serbia                     Seychelles 
##                              2                              2 
##                   Sierra Leone                      Singapore 
##                              1                              2 
##                Slovak Republic                       Slovenia 
##                              2                              2 
##                Solomon Islands                   South Africa 
##                              1                              1 
##                    South Korea                          Spain 
##                              2                              2 
##                      Sri Lanka St. Vincent and the Grenadines 
##                              1                              2 
##                          Sudan                       Suriname 
##                              1                              2 
##                         Sweden                    Switzerland 
##                              2                              2 
##                     Tajikistan                       Tanzania 
##                              1                              1 
##                       Thailand                    Timor-Leste 
##                              2                              1 
##                           Togo                          Tonga 
##                              1                              1 
##                        Tunisia                         Turkey 
##                              2                              2 
##                   Turkmenistan                         Uganda 
##                              1                              1 
##                        Ukraine           United Arab Emirates 
##                              2                              2 
##                 United Kingdom                  United States 
##                              2                              2 
##                        Uruguay                     Uzbekistan 
##                              2                              1 
##                        Vanuatu                      Venezuela 
##                              1                              1 
##                        Vietnam                          Yemen 
##                              2                              1 
##                         Zambia 
##                              1 
## Objective function:
##    build     swap 
## 2.320291 2.251688 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"
dd <- cbind(datos_numericos, cluster = pam.res$cluster)
head(dd, n = 3)
##             child_mort exports health imports income inflation life_expec
## Afghanistan       90.2    10.0   7.58    44.9   1610      9.44       56.2
## Albania           16.6    28.0   6.55    48.6   9930      4.49       76.3
## Algeria           27.3    38.4   4.17    31.4  12900     16.10       76.5
##             total_fer gdpp cluster
## Afghanistan      5.82  553       1
## Albania          1.65 4090       2
## Algeria          2.89 4460       2
# Cluster medoids: New Mexico, Nebraska
pam.res$medoids
##        child_mort     exports     health     imports     income  inflation
## Ghana   0.9033202 -0.42349963 -0.5809185 -0.04090177 -0.7306069  0.8342082
## Poland -0.8001715 -0.03680781  0.2345648 -0.19786437  0.2414823 -0.5791319
##        life_expec  total_fer        gdpp
## Ghana  -0.9395623  0.8732953 -0.63584175
## Poland  0.6459238 -1.0159306 -0.01986805
# Cluster numbers
head(pam.res$clustering)
##         Afghanistan             Albania             Algeria              Angola 
##                   1                   2                   2                   1 
## Antigua and Barbuda           Argentina 
##                   2                   2
fviz_cluster(pam.res,

palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_classic()
)

CLARA - Clustering Large Applications

library(cluster)
library(factoextra)

set.seed(1234)
# Generate 500 objects, divided into 2 clusters.
df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))

# Specify column and row names
colnames(df) <- c("x", "y")

rownames(df) <- paste0("S", 1:nrow(df))
# Previewing the data
head(df, nrow = 6)
##             x        y
## S1  -9.656526 3.881815
## S2   2.219434 5.574150
## S3   8.675529 1.484111
## S4 -18.765582 5.605868
## S5   3.432998 2.493448
## S6   4.048447 6.083699
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()

# Compute CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Print components of clara.res
print(clara.res)
## Call:     clara(x = df, k = 2, samples = 50, pamLike = TRUE) 
## Medoids:
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
## Objective function:   9.87862
## Clustering vector:    Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes:            200 300 
## Best sample:
##  [1] S37  S49  S54  S63  S68  S71  S76  S80  S82  S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"
dd <- cbind(df, cluster = clara.res$cluster)
head(dd, n = 4)
##             x        y cluster
## S1  -9.656526 3.881815       1
## S2   2.219434 5.574150       1
## S3   8.675529 1.484111       1
## S4 -18.765582 5.605868       1
# Medoids
clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
# Clustering
head(clara.res$clustering, 10)
##  S1  S2  S3  S4  S5  S6  S7  S8  S9 S10 
##   1   1   1   1   1   1   1   1   1   1
fviz_cluster(clara.res,

palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)

Agglomerative Clustering

# Standardize the data
df <- scale(datos_numericos)
# Show the first 6 rows
head(df, nrow = 6)
##                     child_mort     exports      health     imports      income
## Afghanistan          1.2876597 -1.13486665  0.27825140 -0.08220771 -0.80582187
## Albania             -0.5373329 -0.47822017 -0.09672528  0.07062429 -0.37424335
## Algeria             -0.2720146 -0.09882442 -0.96317624 -0.63983800 -0.22018227
## Angola               2.0017872  0.77305618 -1.44372888 -0.16481961 -0.58328920
## Antigua and Barbuda -0.6935483  0.16018613 -0.28603389  0.49607554  0.10142673
## Argentina           -0.5894047 -0.81019144  0.46756001 -1.27594958  0.08067776
##                      inflation life_expec   total_fer        gdpp
## Afghanistan          0.1568645 -1.6142372  1.89717646 -0.67714308
## Albania             -0.3114109  0.6459238 -0.85739418 -0.48416709
## Algeria              0.7869076  0.6684130 -0.03828924 -0.46398018
## Angola               1.3828944 -1.1756985  2.12176975 -0.51472026
## Antigua and Barbuda -0.5999442  0.7021467 -0.54032130 -0.04169175
## Argentina            1.2409928  0.5897009 -0.38178486 -0.14535428
# Compute the dissimilarity matrix
# df = the standardized data
res.dist <- dist(df, method = "euclidean")

as.matrix(res.dist)[1:6, 1:6]
##                     Afghanistan  Albania  Algeria   Angola Antigua and Barbuda
## Afghanistan            0.000000 4.130922 3.885865 2.990652            4.400212
## Albania                4.130922 0.000000 1.836223 4.999170            1.121520
## Algeria                3.885865 1.836223 0.000000 3.865637            2.109950
## Angola                 2.990652 4.999170 3.865637 0.000000            4.965356
## Antigua and Barbuda    4.400212 1.121520 2.109950 4.965356            0.000000
## Argentina              4.169492 2.281593 1.892311 4.908200            2.845779
##                     Argentina
## Afghanistan          4.169492
## Albania              2.281593
## Algeria              1.892311
## Angola               4.908200
## Antigua and Barbuda  2.845779
## Argentina            0.000000
res.hc <- hclust(d = res.dist, method = "ward.D2")

# cex: label size
library("factoextra")
fviz_dend(res.hc, cex = 0.5)

# Compute cophentic distance
res.coph <- cophenetic(res.hc)
# Correlation between cophenetic distance and
# the original distance
cor(res.dist, res.coph)
## [1] 0.5290291
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.8394248
# Cut tree into 4 groups
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
## Afghanistan     Albania     Algeria      Angola 
##           1           2           2           2
# Number of members in each cluster
table(grp)
## grp
##   1   2   3   4 
##  27 106  31   3
# Get the names for the members of cluster 1
rownames(df)[grp == 1]
##  [1] "Afghanistan"              "Benin"                   
##  [3] "Burkina Faso"             "Burundi"                 
##  [5] "Cameroon"                 "Central African Republic"
##  [7] "Chad"                     "Comoros"                 
##  [9] "Congo, Dem. Rep."         "Cote d'Ivoire"           
## [11] "Gambia"                   "Guinea"                  
## [13] "Guinea-Bissau"            "Haiti"                   
## [15] "Kenya"                    "Madagascar"              
## [17] "Malawi"                   "Mali"                    
## [19] "Mozambique"               "Niger"                   
## [21] "Rwanda"                   "Senegal"                 
## [23] "Sierra Leone"             "Tanzania"                
## [25] "Togo"                     "Uganda"                  
## [27] "Zambia"
# Cut in 4 groups and color by groups
fviz_dend(res.hc, k = 4, # Cut in four groups

cex = 0.5, # label size
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color labels by groups
rect = TRUE # Add rectangle around groups
)

fviz_cluster(list(data = df, cluster = grp),

palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())

library("cluster")
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(x = datos_numericos, # data matrix
stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)

# DIvisive ANAlysis Clustering
res.diana <- diana(x = datos_numericos, # data matrix
stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)

fviz_dend(res.agnes, cex = 0.6, k = 4)

Agglomerative Clustering

df <- scale(datos_numericos)

# Subset containing 10 rows
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]

library(dendextend)
# Compute distance matrix
res.dist <- dist(df, method = "euclidean")
# Compute 2 hierarchical clusterings
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Create two dendrograms
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Create a list to hold dendrograms
dend_list <- dendlist(dend1, dend2)

tanglegram(dend1, dend2)

tanglegram(dend1, dend2,
highlight_distinct_edges = FALSE, # Turn-off dashed lines
common_subtrees_color_lines = FALSE, # Turn-off line colors
common_subtrees_color_branches = TRUE, # Color common branches
main = paste("entanglement =", round(entanglement(dend_list), 2))
)

# Cophenetic correlation matrix
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9761469
## [2,] 0.9761469 1.0000000
# Baker correlation matrix
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9399632
## [2,] 0.9399632 1.0000000
# Cophenetic correlation coefficient
cor_cophenetic(dend1, dend2)
## [1] 0.9761469
# Baker correlation coefficient
cor_bakers_gamma(dend1, dend2)
## [1] 0.9399632
# Create multiple dendrograms by chaining
dend1 <- df %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df %>% dist %>% hclust("centroid") %>% as.dendrogram
# Compute correlation matrix
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)

cors <- cor.dendlist(dend_list)
# Print correlation matrix
round(cors, 2)
##          Complete Single Average Centroid
## Complete     1.00   0.89    0.98     0.94
## Single       0.89   1.00    0.93     0.89
## Average      0.98   0.93    1.00     0.96
## Centroid     0.94   0.89    0.96     1.00
# Visualize the correlation matrix using corrplot package
library(corrplot)
corrplot(cors, "pie", "lower")

Visualizing Dendrograms

# Compute distances and hierarchical clustering
dd <- dist(scale(datos_numericos), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

library(factoextra)
fviz_dend(hc, cex = 0.5)

fviz_dend(hc, cex = 0.5,
          main = "Dendrogram - ward.D2",
          xlab = "Objects", ylab = "Distance", sub = "")

fviz_dend(hc, cex = 0.5, horiz = TRUE)

fviz_dend(hc, k = 4, # Cut in four groups
          cex = 0.5, # label size
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # color labels by groups
          rect = TRUE) # Add rectangle around groups

fviz_dend(hc, k = 4, # Cut in four groups
          cex = 0.5, # label size
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # color labels by groups
          ggtheme = theme_gray() # Change theme
)

fviz_dend(hc, cex = 0.5, k = 4, # Cut in four groups
          k_colors = "jco")

fviz_dend(hc, k = 4, cex = 0.4, horiz = FALSE, k_colors = "jco",
          rect = TRUE, rect_fill = TRUE)

fviz_dend(hc, cex = 0.5, k = 4,
          k_colors = "jco", type = "circular")

require("igraph")
fviz_dend(hc, k = 4, k_colors = "jco",
          type = "phylogenic", repel = TRUE)

require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups
          k_colors = "jco",
          type = "phylogenic", repel = TRUE,
          phylo_layout = "layout.gem")

fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

# Create a plot of the whole dendrogram,
# and extract the dendrogram data
dend_plot <- fviz_dend(hc, k = 4, # Cut in four groups
                       cex = 0.5, # label size
                       k_colors = "jco"
)

dend_data <- attr(dend_plot, "dendrogram") # Extract dendrogram data

# Cut the dendrogram at height h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualize the truncated version containing
# two branches
fviz_dend(dend_cuts$upper)

# Plot the whole dendrogram
print(dend_plot) 

# Plot subtree 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

# Plot subtree 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

fviz_dend(dend_cuts$lower[[2]], type = "circular") 

pdf("dendrogram.pdf", width=30, height=15) # Open a PDF
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" ) # Do plotting
print(p)
dev.off()
## png 
##   2
data <- scale(datos_numericos)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

library(dendextend)
dend <- datos_numericos[1:5,] %>% # data
  scale %>% # Scale the data
  dist %>% # calculate a distance matrix,
  hclust(method = "ward.D2") %>% # Hierarchical clustering
  as.dendrogram # Turn the object into a dendrogram.
plot(dend)

library(dendextend)
# 1. Create a customized dendrogram
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
  set("branches_lwd", 1) %>% # Branches line width
  set("branches_k_color", mycols, k = 4) %>% # Color branches by groups
  set("labels_colors", mycols, k = 4) %>% # Color labels by groups
  set("labels_cex", 0.5) # Change label size
# 2. Create plot
plot(dend, main = "Customized Dendrogram")

Referencias Bibliografías

Kassambara, A. (2017). Practical guide to cluster analysis in r: Multivariate analysis i (1st ed.). STHDA.
Murcia Valles, M. (2021). Clustering country data. Kaggle. https://www.kaggle.com/code/mateomurciavalles/clustering-country-data