Análisis de Clúster (Conglomerados)
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. |
|
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. |
|
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.
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.
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.
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
)| 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 |
| 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
## 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
## Alabama Alaska Arizona Arkansas
## 1 4 4 1
## [1] 8 13 16 13
## 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
| 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
Computing PAM clustering
## 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"
| 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
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
## 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:
| 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:
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## 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
| 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
Dendrogram
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
## [1] 0.7180382
Cut the dendrogram into di erent groups
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
## grp
## 1 2 3 4
## 7 12 19 12
## [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
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
## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
## [,1] [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
The correlation between two trees can be also computed as follow:
## [1] 0.9925544
## [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
fviz_dend(hc, cex = 0.5,
main = "Dendrogram- ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")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
)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
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)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.
## # 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 ===
## K = 10
## 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 enlaceAgrupamiento 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)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")## 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
## 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
## [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")## 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
## 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
## $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")## 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
## 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
## [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
## 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"
## 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
## 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
## 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
## Afghanistan Albania Algeria Angola
## 3 2 2 3
## [1] 30 87 47 3
## 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
## 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
## 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"
## 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
## 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
## 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"
## 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
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## 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
## 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
## [1] 0.8394248
## Afghanistan Albania Algeria Angola
## 1 2 2 2
## grp
## 1 2 3 4
## 27 106 31 3
## [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))
)## [,1] [,2]
## [1,] 1.0000000 0.9761469
## [2,] 0.9761469 1.0000000
## [,1] [,2]
## [1,] 1.0000000 0.9399632
## [2,] 0.9399632 1.0000000
## [1] 0.9761469
## [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, 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 groupsfviz_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
)require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")# 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)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")