PARTE DOS DEL LABORATORIO: ANÁLISIS DE CLÚSTER(CONGLOMERADOS)

UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
CICLO II - 2023
“ANÁLISIS DE CLÚSTER(CONGLOMERADOS)”
ASIGNATURA: MÉTODOS PARA EL ANÁLISIS ECONÓMICO
CATEDRÁTICO: MSF. CARLOS ADEMIR PERÉZ ALAS
GRUPO TEÓRICO: 02
GRUPO DE TRABAJO: 04
EL EQUIPO DE TRABAJO ESTA CONFORMADO POR:
NOMBRE CARNET
AGUILAR ZACARIAS, CRISTALI DAYAMARI AZ20006
GUARDADO ANGEL, CARLOS ALBERTO GA19035
SANABRIA HERNÁNDEZ, MARIA ISABEL SH21012
PÉREZ PALACIOS, ELDER ARIEL PP18054
CIUDAD UNIVERSITARIA, 07 DE ENERO DE 2024

ANÁLISIS DE CLÚSTER(CONGLOMERADOS)

1. Explique en que consiste el análisis de conglomerados.

El Análisis de Cluster, también conocido como Análisis de Conglomerados, constituye una técnica estadística multivariante que busca la agrupación de elementos o variables con el propósito de lograr la máxima homogeneidad dentro de cada grupo y, simultáneamente, la mayor diferencia entre los grupos.

Aunque es una herramienta esencial en diversas áreas de investigación, el Análisis de Cluster tiene limitaciones notables. Se trata de una técnica descriptiva, carece de fundamento teórico y no es inferencial. Su enfoque se basa en criterios geométricos, destacándose por ser una herramienta exploratoria y descriptiva, más que explicativa.

La efectividad del análisis de clúster depende enteramente de las variables utilizadas, y la adición o eliminación de variables puede tener un impacto significativo en la solución resultante (De la Fuente Fernández, 2011).

Existen dos tipos principales de análisis de clusters: jerárquicos y no jerárquicos.

MÉTODOS JERÁRQUICOS:

Estos métodos se apoyan en el cálculo de una matriz de distancias y son más efectivos cuando n < 200, ya que los cálculos y resultados se vuelven más complicados con muestras más grandes. Estos métodos no permiten la reasignación de grupos una vez que han sido formados.

-De aglomeración: También conocidos como ascendentes, parten de objetos singulares para construir conglomerados cada vez más complejos. Incluyen métodos como Simple Linkage (Vecino más próximo), Complete Linkage (Vecino más lejano), Promedio entre Grupos, Método del Centroide, Método de la Mediana y Método de Ward.

-De división: Parten del conjunto de datos y se dividen hasta crear un solo elemento. Los elementos en un grupo no pueden ser reasignados.

MÉTODOS NO JERÁRQUICOS:

Conocidos como métodos de “optimización”, permiten la reasignación de grupos, pero es necesario especificar de antemano el número de clústeres deseado. Algunos métodos incluyen:

-Reasignación: Permite la reasignación de individuos a diferentes conglomerados en cada fase. Métodos incluyen K-medias, Quick-Cluster, Método de Forgy y Nubes dinámicas.

-Búsqueda de densidad: Basados en la suposición de que los puntos pertenecientes a cada clúster se extraen de una distribución de probabilidad particular.

-Métodos directos: Clasifican simultáneamente individuos y variables.

-Métodos reductivos: Buscan factores en el espacio de los individuos, correspondiendo a un grupo. Un ejemplo es el Análisis Factorial tipo Q.

Es crucial diferenciar entre los métodos jerárquicos y no jerárquicos. Los primeros no requieren determinar a priori el número de conglomerados, y la asignación de objetos es definitiva, mientras que los segundos comienzan con una partición inicial y determinan el número y composición de conglomerados a priori, permitiendo la reasignación de objetos (Dı́az Covián et al., 2014).

2. Cuadro comparativo

Resumen del análisis de clúster
Análisis de Clúster Técnicas disponibles Ventajas Desventajas
Jerárquico:
Método que se apoya en el cálculo de una matriz de distancias y son más efectivos cuando n < 200, ya que los cálculos y resultados se vuelven más complicados con muestras más grandes. Estos métodos no permiten la reasignación de grupos una vez que han sido formados.
Aglomerativas
También conocidos como ascendentes, parten de objetos singulares para construir conglomerados cada vez más complejos.
Incluye métodos como:
-Método de encadenamiento simple.
-Métodos de encadenamiento completo.
-Método de encadenamiento medio.
-Método de Ward.
-Método del centroide.
-Método de la Mediana
De división
Parten del conjunto de datos y se dividen hasta crear un solo elemento. Los elementos en un grupo no pueden ser reasignados.
Incluye métodos como:
-Simple Linkage (Vecino más próximo)
-Complete Linkage (Vecino más lejano)
-Promedio entre Grupos
-Método del Centroide
-Método de la Mediana
-Método de Ward.
- No se necesita determinar el número de clusters de antemano.
-Es posible identificar agrupaciones de cualquier forma.
-Puede identificar valores atípicos.
-Visualización clara mediante dendograma.
- No permite la reasignación de grupos una vez formados.
-Sensibilidad a la elección de métodos y criterios de enlace.

-Necesidad de especificar el número de clusters en el caso de métodos de división.
No jerárquico:
También denominado agrupación en clústeres de particiones, son técnicas de agrupación empleadas para clasificar observaciones dentro de un conjunto de datos en diversos grupos según su similitud. Estos algoritmos requieren que el analista especifique previamente el número de conglomerados que se generarán.
-Agrupación de K-medias.
-Agrupación de K-medoides.
-Algoritmo de Agrupación de aplicaciones. (por sus siglas en inglés, CLARA)
-Método del centroide.
-Nubes dinámicas.
-Permite la reasignación de objetos en etapas posteriores.
-Mayor control sobre el número de clusters.
-Requiere especificar de antemano el número de clusters deseados.
-Sensible a valores atípicos.
-Al modificar la disposición de los datos, es altamente probable obtener una solución distinta.

Fuente: Elaboración propia con base en Kassambara 2017

3. Describa las técnicas disponibles para realizar el análisis de clúster, tanto jerárquicas como no jerárquicas, presentadas en el cuadro anterior, incluya una explicación de la librería y sintaxis para implementarla en R.

Metodos Jerarquicos

Vecino más cercano

Una vez que se conocen las distancias existentes entre cada dos individuos se observa cuáles son los individuos más próximos en cuanto a esta distancia o similaridad (qué dos individuos tienen menor distancia o mayor similaridad). Estos dos individuos forman un grupo que no vuelve a separarse durante el proceso.

Vecino mas lejano

Conocidas las distancias o similaridades existentes entre cada dos individuos se observa cuáles son los individuos más próximos en cuanto a esta distancia o similaridad (qué dos individuos tienen menor distancia o mayor similaridad). Estos dos individuos formarán un grupo que no vuelve a separarse durante el proceso.

Promedio entre grupos

La distancia entre los grupos es la media aritmética de las distancias existentes entre todos los componentes de cada grupo, considerados dos a dos. Se consiguen grupos con varianzas similares y pequeñas. Método del centroide: La distancia entre dos grupos es la distancia existente entre sus centros de gravedad (centroides). El proceso comienza calculando el centro de gravedad de cada conglomerado, para agrupar los conglomerados cuya distancia entre centroides sea mínima. Tras unir dos conglomerados se calculó el nuevo centro de gravedad y se procede de forma similar. Con este procedimiento se reduce la influencia de casos extremos.

Método de la mediana

Es una variación de la agrupación de centroides, donde no se considera el número de individuos que forman cada uno de los agrupamientos. En el método anterior se calcula el centroide en función del número de individuos de cada conglomerado, de modo que cuando se une un gran conglomerado (por ejemplo 10 casos) con otro muy pequeño (por ejemplo 2 casos), este último apenas varía la situación del centroide inicial. En el método de la mediana no se considera el número de elementos de cada conglomerado, sino el número de conglomerados.

Método de Ward

Cuando se unen dos conglomerados, con independencia del método utilizado, la varianza aumenta. El método de Ward une los casos buscando minimizar la varianza dentro de cada grupo. Para ello se calcula, en primer lugar, la media de todas las variables en cada conglomerado. A continuación, se calcula la distancia entre cada caso y la media del conglomerado, sumando después las distancias entre todos los casos. Posteriormente se agrupan los conglomerados que generan menos aumentos en la suma de las distancias dentro de cada conglomerado. Este procedimiento crea grupos homogéneos y con tamaños similares.

Metodos no jerarquicos

K-Medias

comienza con una división del conjunto de los datos en (x) grupos configurados al azar y posteriormente busca mejorar esta primera clasificación reasignando los elementos al centroide del clúster más cercano, tratando de reducir la distancia media entre cada elemento de un grupo y su centroide.

Nubes dinámicas

Los algoritmos de clasificación clásicos generan particiones en las que cada objeto de x es asignado a una única clase. Sin embargo, a veces los objetos no pueden ser asignados estrictamente a una clase pues están localizados ‘entre’ distintas clases.

library(cluster)
library(factoextra)
data("USArrests")
df <- scale(USArrests)
res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:10, 1:10]
##              Alabama   Alaska  Arizona Arkansas California Colorado Connecticut
## Alabama     0.000000 2.703754 2.293520 1.289810   3.263110 2.651067    3.215297
## Alaska      2.703754 0.000000 2.700643 2.826039   3.012541 2.326519    4.739912
## Arizona     2.293520 2.700643 0.000000 2.717758   1.310484 1.365031    3.262858
## Arkansas    1.289810 2.826039 2.717758 0.000000   3.763641 2.831051    2.607639
## California  3.263110 3.012541 1.310484 3.763641   0.000000 1.287619    4.066390
## Colorado    2.651067 2.326519 1.365031 2.831051   1.287619 0.000000    3.327992
## Connecticut 3.215297 4.739912 3.262858 2.607639   4.066390 3.327992    0.000000
## Delaware    2.019293 3.621363 1.909370 1.800324   3.073785 2.554746    1.756847
## Florida     2.298135 2.996764 1.749393 3.372197   2.025004 2.445860    4.470070
## Georgia     1.131435 2.819439 2.787196 2.211761   3.378058 2.864910    3.973823
##             Delaware  Florida  Georgia
## Alabama     2.019293 2.298135 1.131435
## Alaska      3.621363 2.996764 2.819439
## Arizona     1.909370 1.749393 2.787196
## Arkansas    1.800324 3.372197 2.211761
## California  3.073785 2.025004 3.378058
## Colorado    2.554746 2.445860 2.864910
## Connecticut 1.756847 4.470070 3.973823
## Delaware    0.000000 3.061417 2.983872
## Florida     3.061417 0.000000 2.181296
## Georgia     2.983872 2.181296 0.000000
res.hc <- hclust(d = res.dist, method = "ward.D2")
fviz_dend(res.hc, cex = 0.5)

4. Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA, disponible en:https://xsliulab.github.io/Workshop/week10/r-cluster-book.pdf, desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.

Capitulo 4: K-Means Clustering

4.3 Calcular la agrupación de k-medias en R.

4.3.1 Datos
data("USArrests") # Cargando el conjunto de datos
df <- scale(USArrests) # Scaling the data
# Ver las primeras 3 filas de datos
head(df, n = 3)
##             Murder   Assault   UrbanPop         Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska  0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona 0.07163341 1.4788032  0.9989801  1.042878388
4.3.3 Estimación del número óptimo de conglomerados
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2)

El gráfico anterior representa la varianza dentro de los grupos. Disminuye a medida que k aumenta, pero se puede ver una curva (o “codo”) en k = 4. Esta curva indica que los grupos adicionales más allá del cuarto tienen poco valor. En la siguiente sección, clasificaremos las observaciones en 4 racimos.

4.3.4 Cálculo de la agrupación en clústeres de k-medias
# Calcule k-medias con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
# Imprime los resultados
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"

La salida impresa muestra:

• las medias o centros del conglomerado: una matriz, cuyas filas son el número de conglomerados (1 a 4) y las columnas son variables

• el vector de agrupamiento: un vector de números enteros (de 1: k) que indica el grupo al que se asigna cada punto.

Es posible calcular la media de cada variable por conglomerados utilizando los datos originales:

aggregate(USArrests, by = list(cluster = km.res$cluster), mean)
##   cluster   Murder   Assault UrbanPop     Rape
## 1       1 13.93750 243.62500 53.75000 21.41250
## 2       2  3.60000  78.53846 52.07692 12.17692
## 3       3  5.65625 138.87500 73.87500 18.78125
## 4       4 10.81538 257.38462 76.00000 33.19231

Si desea agregar las clasificaciones de puntos a los datos originales, use esto:

dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
##            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
4.3.5 Acceso a los resultados de la función kmeans ()
# Número de conglomerado para cada una de las observaciones
km.res$cluster
##        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
head(km.res$cluster, 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        4        4        1
# Tamaño de cluster
km.res$size
## [1]  8 13 16 13
# Clúster significa
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
4.3.6 Visualización de clústeres de k-medias
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()
)

CAPITULO 5: K-Medoids

5.3 Calcular PAM en R.

5.3.1 Datos
data("USArrests") # Cargar el conjunto de datos
df <- scale(USArrests) # Escala los datos
head(df, n = 3) # Ver las primeras 3 filas de datos
##             Murder   Assault   UrbanPop         Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska  0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona 0.07163341 1.4788032  0.9989801  1.042878388
5.3.3 Estimación del número óptimo de conglomerados
library(factoextra)
library(cluster)
fviz_nbclust(df, pam, method = "silhouette") +
  theme_classic()

5.3.4 Cálculo de la agrupación en clústeres PAM

El siguiente código R calcula el algoritmo PAM con k = 2:

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"

La salida impresa muestra:

• los medoides del clúster: una matriz, cuyas filas son los medoides y las columnas son variables

• el vector de agrupamiento: un vector de números enteros (de 1: k) que indica el grupo al que se asigna cada punto.

Si desea agregar las clasificaciones de puntos a los datos originales, use esto:

dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd, n = 3)
##         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
5.3.5 Acceder a los resultados de la función pam ()

La función pam () devuelve un objeto de clase pam cuyos componentes incluyen:

• medoides : objetos que representan grupos

• agrupación : un vector que contiene el número de agrupación de cada objeto

Se puede acceder a estos componentes de la siguiente manera:

# Medoides de racimo: Nuevo México, 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
# Números de clúster
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1
5.3.6 Visualización de clústeres PAM
fviz_cluster(
  pam.res,
  palette = c("#00AFBB", "#FC4E07"),
  # color palette
  ellipse.type = "t",
  # Concentration ellipse
  repel = TRUE,
  # Avoid label overplotting (slow)
  ggtheme = theme_classic()
)

CAPITULO 6:CLARA - Clustering Large Applications

6.3 Calcular CLARA en R

6.3.1 Formato y preparación de los datos

Para calcular el algoritmo CLARA en R, generaremos el uso de un conjunto de datos aleatorios. Para que el resultado sea reproducible, comenzamos utilizando la función set.seed ().

set.seed(1234)
# Genera 500 objetos, divididos en 2 grupos
df <- rbind(cbind(rnorm(200, 0, 8), rnorm(200, 0, 8)),
            cbind(rnorm(300, 50, 8), rnorm(300, 50, 8)))
# Especificar nombres de filas y columnas
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))
# Vista previa de los datos
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
6.3.3 Estimación del número óptimo de conglomerados

Para estimar el número óptimo de clústeres en sus datos, es posible utilizar el método de silueta promedio como se describe en el capítulo de agrupamiento de PAM (Capítulo 5). El r function fviz_nbclust () [ paquete factoextra ] proporciona una solución para facilitar este paso

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

A partir de la gráfica, el número sugerido de grupos es 2. En la siguiente sección, clasificaremos las observaciones en 2 grupos.

6.3.4 Computación CLARA

El siguiente código R calcula el algoritmo PAM con k = 2:

# Calcular CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Imprimir componentes de 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"

La salida de la función clara() incluye los siguientes componentes:

• medoides: Objetos que representan grupos

• agrupamiento: un vector que contiene el número de grupo de cada objeto

• muestra: etiquetas o números de caso de las observaciones en la mejor muestra, es decir, la muestra utilizada por el algoritmo clara para la partición final.

Si desea agregar las clasificaciones de puntos a los datos originales, use esto:

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

Puede acceder a los resultados devueltos por clara () de la siguiente manera:

# Medoides
clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
# Agrupación
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

Los medoides son S121, S455.

6.3.5 Visualización de clústeres CLARA

Para visualizar los resultados de la partición, usaremos la función fviz_cluster () [ el paquete factoextra]. Dibuja un diagrama de dispersión de puntos de datos coloreados por números de grupo.

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

CAPITULO 7: Agglomerative Clustering

7.1 Algoritmo

La agrupación aglomerativa funciona de forma “de abajo hacia arriba.” Es decir, cada objeto se considera inicialmente como un grupo de un solo elemento (hoja). En cada paso del algoritmo, los dos grupos que son más similares se combinan en un nuevo grupo más grande (nodos). Este procedimiento se repite hasta que todos los puntos son miembros de un solo gran clúster (raíz) (consulte la figura siguiente). La inversa de la agrupación aglomerativa es agrupamiento divisivo, que también se conoce como DIANA (Análisis de división) y funciona de manera “de arriba hacia abajo.” Comienza con la raíz, en la que todos los objetos se incluyen en un solo clúster. En cada paso de la iteración, el grupo más heterogéneo se divide en dos. El proceso se repite hasta que todos los objetos están en su propio clúster.

Tenga en cuenta que la agrupación aglomerativa es buena para identificar agrupaciones pequeñas. La agrupación en clústeres divisoria es buena para identificar grandes agrupaciones. En este artículo, nos centraremos principalmente en la agrupación jerárquica aglomerativa.

7.2 Pasos para la agrupación jerárquica aglomerativa

Seguiremos los pasos a continuación para realizar agrupaciones jerárquicas aglomerativas utilizando el software R: 1. Preparación de los datos 2. Calcular información de (dis) similitud entre cada par de objetos en el conjunto de datos. 3. Uso de la función de vinculación para agrupar objetos en un árbol de agrupamiento jerárquico, según la información de distancia generada en el paso 1. Los objetos / agrupaciones que están muy próximos se vinculan entre sí mediante la función de vinculación. 4. Determinar dónde cortar el árbol jerárquico en grupos. Esto crea una partición de los datos.

7.2.1 Estructura y preparación de datos

Los datos deben ser una matriz numérica con: filas que representan observaciones (individuos); y columnas que representan variables, usaremos los conjuntos de datos de USArrests base R.

Tenga en cuenta que, en general, se recomienda estandarizar las variables en el conjunto de datos antes de realizar un análisis posterior. La estandarización hace que las variables sean comparables cuando se miden en diferentes escalas. Por ejemplo, una variable puede medir la altura en metros y otra variable puede medir el peso en kg.

# Cargar los datos
data("USArrests")
# Estandarizar los datos
df <- scale(USArrests)
# Mostrar las primeras 6 filas
head(df, nrow = 6)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207
7.2.2 Medidas de similitud
# Calcule la matriz de disimilitud
# df = los datos estandarizados
res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:6, 1:6]
##             Alabama   Alaska  Arizona Arkansas California Colorado
## Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
## Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
## Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
## Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
## Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000
7.2.3 Vinculación
res.hc <- hclust(d = res.dist, method = "ward.D2")
7.2.4 Dendrograma
#  cex: tamaño de etiqueta
library("factoextra")
fviz_dend(res.hc, cex = 0.5)

En el dendrograma que se muestra arriba, cada hoja corresponde a un objeto. A medida que subimos por el árbol, los objetos que son similares entre sí se combinan en ramas, que a su vez se fusionan a una altura mayor.

La altura de la fusión, proporcionada en el eje vertical, indica la (dis) similitud / distancia entre dos objetos / grupos. Cuanto mayor sea la altura de la fusión, menos similares serán los objetos. Esta altura se conoce comodistancia cofenética entre los dos objetos.

Tenga en cuenta que las conclusiones sobre la proximidad de dos objetos solo se pueden extraer en función de la altura en la que se fusionan las ramas que contienen esos dos objetos primero. No podemos utilizar la proximidad de dos objetos a lo largo del eje horizontal como criterio de su similitud.

Para identificar subgrupos, podemos cortar el dendrograma a una cierta altura como se describe en las siguientes secciones.

7.3 Verificar el árbol del clúster

# Calcule la distancia cophentic
res.coph <- cophenetic(res.hc)
# Correlación entre distancia cofenética y
# la distancia original
cor(res.dist, res.coph)
## [1] 0.6975266

Ejecute la función hclust () nuevamente usando el método de vinculación promedio. A continuación, llame cophenetic () para evaluar la solución de agrupamiento.

res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

7.4 Cortar el dendrograma en diferentes grupos

# Cortar el árbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Número de miembros en cada grupo
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Obtenga los nombres de los miembros del clúster 1
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"

El resultado de los cortes se puede visualizar fácilmente usando la función fviz_dend () [en factoextra]:

#  Cortar en 4 grupos y colorear por grupos
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
)

Usando la función fviz_cluster () [in factoextra], también podemos visualizar el resultado en un diagrama de dispersión. Las observaciones están representadas por puntos en la gráfica, usando el método de componentes principales. Se dibuja un marco alrededor de cada grupo.

fviz_cluster(
  list(data = df, cluster = grp),
  palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
  ellipse.type = "convex",
  # Elipse de concentración
  repel = TRUE,
  # # Evite el trazado excesivo de etiquetas (lento)
  show.clust.cent = FALSE,
  ggtheme = theme_minimal()
)

7.5 Paquete Cluster R

El clúster de paquetes R facilita la realización de análisis de clústeres en R. Proporciona la función agnes () y diana () para calcular la agrupación aglomerativa y divisiva, respectivamente. Estas funciones realizan todos los pasos necesarios para usted. No necesitas para ejecutar las funciones scale (), dist () y hclust () por separado.

Las funciones se pueden ejecutar de la siguiente manera

library("cluster")
# Anidación aglomerativa (agrupación jerárquica)
res.agnes <- agnes(
  x = USArrests,
  # matriz de datos
  stand = TRUE,
  # Estandarizar los datos
  metric = "euclidean",
  # métrica para matriz de distancia
  method = "ward" # Método de vinculación
)

# Agrupación de análisis de análisis visual
res.diana <- diana(x = USArrests, # matriz de datos
                   stand = TRUE, # estandarizar los datos
                   metric = "euclidean" # métrica para matriz de distancia
                   )

Después de ejecutar agnes () y diana (), puede usar la función fviz_dend () [in factoextra] para visualizar la salida:

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

CAPITULO 8: Comparing Dendrograms

8.1 Preparación de datos

Usaremos los conjuntos de datos de USArrests base R y comenzaremos por estandarizar las variables usando la función scale () de la siguiente manera:

df <- scale(USArrests)

# Para hacer legibles los gráficos, generados en las siguientes secciones, trabajaremos con un pequeño subconjunto aleatorio del conjunto de datos. Por lo tanto, usaremos la funciónmuestra() para seleccionar al azar 10 observaciones entre las 50 observaciones contenidas en el conjunto de datos:

# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss, ]

8.2 Comparación de dendrogramas

library(dendextend)
# Calcular matriz de distancias
res.dist <- dist(df, method = "euclidean")
# Calcule 2 agrupaciones jerárquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Crear dos Dendogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Crea una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)
8.2.1 Comparación visual de dos dendrogramas
tanglegram(dend1, dend2)

Personalizó el enredo con muchas otras opciones de la siguiente manera:

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))
)

Tenga en cuenta que los nodos “únicos,” con una combinación de etiquetas / elementos que no están presentes en el otro árbol, están resaltados con líneas discontinuas.

8.2.2 Matriz de correlación entre una lista de dendrogramas
# Matriz de correlación cofenética
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
#Matriz de correlación de Baker
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000

La correlación entre dos árboles también se puede calcular de la siguiente manera:

# Coeficiente de correlación cofenética
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Coeficiente de correlación de Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528

También es posible comparar simultáneamente varios dendrogramas. Un operador de encadenamiento %>% se usa para ejecutar múltiples funciones al mismo tiempo. Es útil para simplificar código

# Crea múltiples dendrogramas encadenando
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
# Calcular matriz de correlación
dend_list <- dendlist(
  "Complete" = dend1,
  "Single" = dend2,
  "Average" = dend3,
  "Centroid" = dend4
)
cors <- cor.dendlist(dend_list)
# Imprimir matriz de correlación
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
# Visualice la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")

CAPITULO 9: Visualizing Dendrograms

9. Visualización de dendrogramas

Comenzamos calculando la agrupación jerárquica utilizando los conjuntos de datos de USArrests:

# Cargar datos
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
9.1 Visualización de dendrogramas
library(factoextra)
fviz_dend(hc, cex = 0.5)

Puede usar los argumentos main, sub, xlab, ylab para cambiar los títulos de la trama de la siguiente manera:

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

Para dibujar un dendrograma horizontal, escriba esto:

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

Para cambiar el tema de la trama, use el argumento ggtheme, cuyos valores permitidos incluyen ggplot2 temas oficiales [theme_gray (), theme_bw (), theme_minimal (), theme_classic (), theme_void ()] o cualquier otro tema de ggplot2 definido por el usuario.

fviz_dend(hc, k = 4, # Cut in four groups

cex = 0.5, # label size
k_colors = c("#8B0000", "#006400", "#8B008B", "#00008B"),
color_labels_by_k = TRUE, # color labels by groups
ggtheme = theme_gray() # Change theme
)

Si desea dibujar un dendrograma horizontal con un rectángulo alrededor de los grupos, use esto:

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

Además, puede trazar un dendrograma circular usando la opción type = “circular.”

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

Para trazar un árbol filogénico, use type = “phylogenic” y repel = TRUE (para evitar superposición de etiquetas). Esta funcionalidad requiere el paquete R igraph. Asegúrate de eso está instalado antes de escribir el siguiente código R

require("igraph")
## Loading required package: igraph
## Warning: package 'igraph' was built under R version 4.3.2
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
fviz_dend(hc, k = 4, k_colors = "lancet",
type = "phylogenic", repel = TRUE)

El diseño predeterminado para árboles filogenéticos es “layout.auto.” Los valores permitidos son uno de: c (“layout.auto,” “layout_with_drl,” “layout_as_tree,” “layout.gem,” “layout.mds,” “Layout_with_lgl”). Para leer más sobre estos diseños, lea la documentación del paquete igraph R.

Probemos phylo.layout = “layout.gem”:

require("igraph")
fviz_dend(
  hc,
  k = 4,
  # Cortar en cuatro grupos
  k_colors = "jco",
  type = "phylogenic",
  repel = TRUE,
  phylo_layout = "layout.gem"
)

9.2 Caso de dendrograma con grandes conjuntos de datos
9.2.1 Zoom en el dendrograma
fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

9.2.2 Trazado de un subárbol de dendrogramas

9.2.2 Trazado de un subárbol de dendrogramas

# Cree una gráfica de todo el dendrograma,
# y extrae los datos del dendrograma
dend_plot <- fviz_dend(hc,
                       k = 4,
                       # Cortar en cuatro grupos
                       cex = 0.5,
                       # label size
                       k_colors = "jco")
dend_data <-
  attr(dend_plot, "dendrogram") # Extraer datos de dendrograma
# # Cortar el dendrograma a la altura h= 10
dend_cuts <- cut(dend_data, h = 10)
# Visualice la versión truncada que contiene
# dos ramas
fviz_dend(dend_cuts$upper)

# Trazar el dendrograma completo
print(dend_plot)

# Parcela subárbol 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

# Parcela subárbol 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

También puede trazar árboles circulares de la siguiente manera:

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

9.2.3 Guardar dendrograma en una página PDF grande
pdf("dendrogram.pdf", width=30, height=15) 
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "lancet" )
print(p)
dev.off()
## png 
##   2
9.3 Manipulación de dendrogramas usando dendextend
data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

Código R para crear un dendrograma usando un operador de encadenamiento:

library(dendextend)
dend <- USArrests[1:5, ] %>% # data
  scale %>% # Escala de datos
  dist %>% # calcular una matriz de distancia,
  hclust(method = "ward.D2") %>% # Agrupación jerárquica
  as.dendrogram # Convierte el objeto en un dendrograma.
plot(dend)

Funciones para personalizar dendrogramas: la función set () [en el paquete dendextend] se puede utilizar para cambiar los parámetros de un dendrograma. El formato es:set(object, what, value)

objeto: un objeto dendrograma

qué: un carácter que indica cuál es la propiedad del árbol que debe ser configurar / actualizar

valor: un vector con el valor a establecer en el árbol (el tipo de valor depende sobre el “qué”).

Valores posibles para el argumento qué incluir:

library(dendextend)
# 1. Crea un dendrograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#00008B")
dend <- as.dendrogram(hc) %>%
  set("branches_lwd", 1) %>% # Ancho de línea de ramas
  set("branches_k_color", mycols, k = 4) %>% # Colorea ramas por grupos
  set("labels_colors", mycols, k = 4) %>% # Etiquetas de color por grupos
  set("labels_cex", 0.5) # Cambiar el tamaño de la etiqueta

# 2. Crea una trama
fviz_dend(dend)

5. Presente un ejemplo de aplicación de Análisis de Cluster, con datos de un caso de lo disponibles en https://www.kaggle.com/datasets (puede buscar dentro del sitio por la palabra clave “Cluster”.

El siguiente ejercio, es sobre los datos recogidos en http://tinyurl.com/yl29woeb, sobre Casos de Covid 19 en Asia(hasta octubre de 2021), que contiene la siguiente información, Número total de casos, Total de muertes registradas, Cuantas personas sobrevivieron, Numero de personas que tienen el virus, poblacion del pais, etc. Mediante el análisis de Cluster nos interesa agrupar aquellos paises con desempeños similares al afrontar la pandemia, para ello utilizaremos el método de agrupación jerárquica aglomerativa.

Estructura y preparación de datos

library(readr)
AsiaCases_ <- read_csv("C:/Users/Guardado/Documents/AsiaCases_.csv", 
    col_types = cols(ID = col_skip(), Country = col_skip()))

rownames(AsiaCases_)<- c("Yemen", "Vietnam", "Uzbekistan", "UAE", "Turkey", "Timor-Leste", "Thailand", "Tajikistan", "Taiwan", "Syria", "Sri Lanka", "Singapore", "Saudi Arabia", "S. Korea", "Qatar", "Philippines", "Palestine", "Pakistan", "Oman", "Nepal", "Myanmar", "Mongolia", "Maldives", "Malaysia", "Macao", "Lebanon", "Laos", "Kyrgyzstan", "Kuwait", "Kazakhstan", "Jordan", "Japan", "Israel", "Iraq", "Iran", "Indonesia", "India", "Hong Kong", "Georgia", "Cyprus", "China", "Cambodia", "Brunei", "Bhutan", "Bangladesh", "Bahrain", "Azerbaijan", "Armenia", "Afghanistan")
df <- scale(AsiaCases_)
df<-na.omit(df)
head(df, nrow= 6)
##             TotalCases TotalDeaths TotalRecovered ActiveCases
## Yemen       -0.3166424  -0.3188696     -0.3114628 -0.44184441
## Vietnam     -0.1486838  -0.0461558     -0.1507152 -0.04988727
## Uzbekistan  -0.2824015  -0.3262332     -0.2766138 -0.42534879
## UAE         -0.1692711  -0.3139896     -0.1612562 -0.41057727
## Turkey       1.1874090   0.6164936      1.1147759  4.93314503
## Timor-Leste -0.3145580  -0.3429646     -0.3086857 -0.45795071
##             TotalCasesPerMillion TotalDeathsPerMillion TotalTests
## Yemen                 -0.9418307            -0.8119713 -0.3382365
## Vietnam               -0.7640605            -0.5034273  0.1501160
## Uzbekistan            -0.8351426            -0.8548814 -0.3253762
## UAE                    0.6400285            -0.4993406  0.6671044
## Turkey                 0.9340423             0.6510584  0.6971727
## Timor-Leste           -0.6334837            -0.7506711 -0.3393432
##             TotalTestsPerMillion TotalPopulation
## Yemen                -0.62471839     -0.22811216
## Vietnam              -0.39771211      0.01242593
## Uzbekistan           -0.60767464     -0.21595737
## UAE                   4.03081209     -0.30126749
## Turkey               -0.06563526     -0.03355576
## Timor-Leste          -0.56202760     -0.33210812

Medidas de similitud

res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:6, 1:6]
##                 Yemen   Vietnam Uzbekistan      UAE   Turkey Timor-Leste
## Yemen       0.0000000 0.8699042  0.1286098 5.033421 6.414327   0.3382811
## Vietnam     0.8699042 0.0000000  0.8390794 4.706523 5.769261   0.8778004
## Uzbekistan  0.1286098 0.8390794  0.0000000 4.983660 6.361529   0.2658971
## UAE         5.0334207 4.7065228  4.9836601 0.000000 7.152155   4.8825191
## Turkey      6.4143275 5.7692614  6.3615290 7.152155 0.000000   6.3323384
## Timor-Leste 0.3382811 0.8778004  0.2658971 4.882519 6.332338   0.0000000

Vinculación

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

Dendrograma

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

Cortando el dendrograma en diferentes grupos

Ya que la agrupación jerárquica es que no indica cuántos racimos que hay o donde cortar el dendrograma para formar grupos se ha decidido, para distribuir optimamente, cortar en 4 grupos.

grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##      Yemen    Vietnam Uzbekistan        UAE 
##          1          1          1          2

Visualización de clústeres y Dendograma

Por ultimo los clústeres quedan distruibuidos de la siguiente manera, y se presenta un dendograma y la agrupación grafica de los clúster.

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

fviz_cluster(
  list(data = df, cluster = grp),
  palette = c( "#00AFBB", "#FC4E07", "#E7B800","green"),
  ellipse.type = "convex",
  # Elipse de concentración
  repel = TRUE,
  # # Evite el trazado excesivo de etiquetas (lento)
  show.clust.cent = FALSE,
  ggtheme = theme_minimal()
)

# Número de miembros en cada grupo
table(grp)
## grp
##  1  2  3  4 
## 27 17  2  1

Finalmente el los clúster quedan constituidos de la siguiente manera:

1.El Cluster #1 tiene 27 paises, que comparten un desempeño en el manejo la pandemia similar.

2.El Cluster #2 contiene 17 países, que comparten un desempeño similar del manejo de la pandemia.

3.El Cluster #3 contiene 2 países, Iran y Turquía, que comparten un desempeño similar del manejo de la pandemia.

4.El Cluster #4 contiene solamente a India, que no comparte similitudes en el manejo de la pandemia con ningún otro país.

Bibliografía

Conglomerados, F. S. A. (2011). Facultad de ciencias económicas y empresariales. Universidad Autónoma de Madrid.

Kassambara, A. (2017). Practical guide to cluster analysis in r: Unsupervised machine learning (Vol. 1). Sthda.

Kassambara, Alboukadel, and Fabian Mundt. 2020. Factoextra: Extract and Visualize the Results of Multivariate Data Analyses. http://www.sthda.com/english/rpkgs/factoextra.

R Package ’Corrplot’: Visualization of a Correlation Matrix. https://github.com/taiyun/corrplot.

Wickham, Hadley, Romain François, Lionel Henry, and Kirill Müller. 2021. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.