1. Explique en qué consiste el análisis de conglomerados.

El análisis de clúster o también llamado análisis de conglomerados, es una técnica diseñada para clasificar distintas observaciones en grupos, de tal forma que cada grupo (clúster o conglomerado) sea homogéneo respecto a las variables utilizadas para caracterizarlo, es decir, que cada observación obtenida en el sea parecida a todas las que estén incluidas en ese grupo; además otra característica es que los grupos sean lo mas distintos posibles uno de otros respecto a las variables consideradas. (Aldas)

El Análisis Clúster es una técnica descriptiva, ateórica y no inferencial que no tiene bases estadísticas sobre las que deducir inferencias estadísticas para una población a partir de una muestra, es un método basado en criterios geométricos y se utiliza fundamentalmente como una técnica exploratoria, descriptiva pero no explicativa. Las soluciones no son únicas, en la medida en que la pertenencia al conglomerado para cualquier número de soluciones depende de muchos elementos del procedimiento elegido. Por otra parte, la solución clúster depende totalmente de las variables utilizadas, la adición o destrucción de variables relevantes puede tener un impacto substancial sobre la solución resultante (fuente)

2. Elabore un cuadro comparativo, que incluya los siguientes elementos:

(Lo indicado en rojo corresponde a los elementos a redactar, en la versión a ser entregada debe aparecer el texto negro normal).

Análisis de Clúster Técnicas disponibles Ventajas Desventajas
Jerárquico Métodos aglomerativos
Métodos divisivos
No requieren especificar el número de conglomerados al inicio, lo que resulta ideal en análisis exploratorios.

Generan un dendrograma que facilita la interpretación visual de cómo se forman los grupos.

Permiten analizar relaciones multiescala, identificando estructuras desde niveles finos hasta más generales.

Adecuados para muestras pequeñas o medianas, donde el coste computacional es razonable.
Sensibles al ruido y valores atípicos, lo que puede distorsionar los resultados.

Las decisiones de agrupamiento son irreversibles; no se puede deshacer una fusión.

Alto costo computacional en muestras grandes por el cálculo exhaustivo de distancias.

Dependencia del método de enlace, lo que puede cambiar significativamente el resultado final.
No jerárquico K-means
K-medoids (PAM)
CLARA (para grandes bases de datos)
Block clustering
Análisis factorial tipo Q
Eficientes para grandes volúmenes de datos debido a su baja complejidad computacional.

Permiten reasignar elementos durante el proceso, logrando soluciones más óptimas.

Rápidos y escalables, ideales para aplicaciones prácticas y análisis masivos.

Fáciles de interpretar, especialmente cuando se utilizan centroides (como en K-means).
Requieren definir k previamente, lo que puede ser difícil sin criterios claros.

Sensibles a valores atípicos, que pueden mover los centroides.

Pueden converger en soluciones subóptimas si la inicialización no es adecuada.

Suponene estructuras esféricas o convexas, limitando la identificación de formas complejas.

Fuente: Elaboración propia con base en Kassambara (2017), Practical Guide to Cluster Analysis in R.

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.

Con base a información extraída de (Kassambara, 2017):

Métodos Jerárquicos:

Aglomerativo Método que inicia considerando cada observación como un clúster individual y fusiona progresivamente los más similares hasta formar un único gran grupo. Produce un dendrograma que muestra la estructura de agrupamiento “de abajo hacia arriba”.

Métodos:

Simple Linkage (Vecino más cercano): Agrupa basándose en la menor distancia entre elementos de dos clústeres. Tiende a formar cadenas y es sensible al ruido..

Complete Linkage (Vecino más lejano): Define la distancia entre dos clústeres como la mayor distancia entre sus elementos. Genera clústeres compactos y homogéneos.

Average Linkage (Promedio entre grupos): Calcula la distancia como el promedio de todas las distancias entre observaciones de ambos clústeres. Ofrece un equilibrio entre los métodos simple y complete.

Método del Centroide: Determina la distancia entre grupos comparando sus centroides. Es eficiente, pero puede verse fuertemente influido por clústeres grandes.

Método de la Mediana: Modifica el método del centroide para evitar que grupos grandes dominen la fusión. Usa coordenadas medianas, logrando mayor estabilidad que el centroide.

Método de Ward: Busca minimizar el aumento en la suma de cuadrados dentro de los clústeres en cada fusión. Produce grupos muy homogéneos y suele ser uno de los métodos más eficaces.

Disociativa

Proceso inverso al aglomerativo: comienza con un único grupo global y lo divide sucesivamente, separando primero las observaciones más heterogéneas. Ideal para detectar grandes clústeres.

Pasos a seguir

Se debe seguir los siguientes pasos:

  1. Preparar los datos.

  2. Calcular información de (des) similitud entre cada par de objetos en los datos a colocar.

  3. Uso de la función de vinculación para agrupar objetos en un árbol de clúster jerárquico, según la información de distancia generada en el paso 1. Objetos/grupos que están cerca aproximadamente se vinculan entre sí mediante la función de vinculación.

  4. Determinar dónde cortar el árbol jerárquico en grupos. Esto crea un partición de los datos.

Usando método de Linkage

library(cluster)
library(factoextra)

data("USArrests")
df <- scale(USArrests)

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

fviz_dend(res.hc, cex = 0.5)

Métodos no Jerárquicos:

Reasignación: Algoritmos que permiten mover observaciones de un clúster a otro durante el proceso para mejorar el criterio de agrupación. Buscan optimizar iterativamente la calidad del resultado.

K-means Clustering: Divide los datos en k grupos usando centroides que se actualizan iterativamente. Minimiza la distancia de cada punto al centroide de su clúster. Es rápido pero sensible a valores atípicos.

K-medoides o PAM: Similar al K-means, pero usa medoides (observaciones reales) en lugar de medias. Es más robusto al ruido y a los outliers.

CLARA: Extensión de PAM que permite trabajar con grandes conjuntos de datos mediante muestreo. Reduce el costo computacional manteniendo buena calidad de agrupación.

Nubes Dinámicas: Representa cada clúster mediante varios puntos centrales (“núcleos”), lo que permite identificar estructuras más complejas que las basadas en un único centroide.

Búsqueda de densidad:

Forma clústeres identificando áreas de alta concentración de observaciones. Puede incorporar enfoques tipológicos (zonas densas) o probabilísticos (grupos basados en distribuciones).

Métodos Directos:

Agrupan simultáneamente individuos y variables, analizando patrones en la matriz completa de datos. Los clústeres se aplican a las observaciones (celdas) y no solo a filas o columnas.

Block - Clustering:

Identifica submatrices con alta correlación entre filas y columnas. Es útil para datos estructurados en bloques, aunque requiere especificar el número de clústeres y puede ser complejo de optimizar.

Métodos Reductivos:

Reducen el espacio original buscando factores que actúan como clústeres. Se fundamentan en técnicas factoriales aplicadas a individuos, no a variables.

Análisis Factorial tipo Q:

Agrupa individuos según la similitud de sus perfiles, basándose en su matriz de correlaciones. Permite identificar tipologías, aunque puede producir solapamiento entre grupos.

4. Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA, desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.

4.0 EJEMPLO CAPITULO 4: K-means Clustering

Data

data("USArrests")
Data_USA <- scale(USArrests)
head(Data_USA)
##                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

4.2 Calculo del numero Optimo de Clusters

library(factoextra)
fviz_nbclust(Data_USA, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2) +labs(title = "Número Óptimo de Conglomerados")+
  xlab(label = "Número de Grupos")+
  ylab(label = "Totales dentro de la suma de cuadrados")

Interpretación: El gráfico angterior representa las varianzas dentro de cada “cluster” , en el cual se visualiza que a medida aumenta K (números de grupos), la varianza disminuye. Se puede observar que existe una curva o “codo” cuando el numero de grupos es 4. La cual nos indica que un número mayor de grupos a 4 tienen poco valor. Por lo cual se clasificarán las observaciones en 4 grupos.

4.3 Cálculo de K-means con K=4

set.seed(123)
Kmeans_res<-kmeans(Data_USA, 4, nstart = 25)
print(Kmeans_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"

Es posible calcular la media de cada varaible por clústeres utilizando los data original:

aggregate(USArrests, by=list(cluster=Kmeans_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 se desea añadir la clasificación de los datos, se realiza de la siguiente manera:

Clasificacion_Kmeans <- cbind(USArrests, cluster = Kmeans_res$cluster)
head(Clasificacion_Kmeans, 10)
##             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
## Connecticut    3.3     110       77 11.1       3
## Delaware       5.9     238       72 15.8       3
## Florida       15.4     335       80 31.9       4
## Georgia       17.4     211       60 25.8       1

4.4 Acceder a resultados de K-means

El número de conglomerado al que pertence cada una de las observaciones

Kmeans_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(Kmeans_res$cluster,10)
##     Alabama      Alaska     Arizona    Arkansas  California    Colorado 
##           1           4           4           1           4           4 
## Connecticut    Delaware     Florida     Georgia 
##           3           3           4           1

El tamaño que posee cada “cluster”:

Kmeans_res$size
## [1]  8 13 16 13

La matriz de las medias de los conglomerados:

Kmeans_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.5 Visualización de los K-means Clusters

fviz_cluster(Kmeans_res, data = Data_USA,
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
             ellipse.type = "euclid", 
             star.plot = TRUE, # añadir los segmentos a los centroides o grupos
             repel = TRUE, # para que las etiquetas no queden sobrepuestas
             ggtheme = theme_minimal()
             )+labs(title = "Gráfico de Conglomerados")

5. EJEMPLO CAPITULO 5: K-Medoids

5.1 Data

La data a utilizar será la misma que en el ejemplo anterior(Data_USA).

head(Data_USA,4)
##              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

5.2 Calculo del numero Optimo de Clusters

library(cluster)
library(factoextra)
fviz_nbclust(Data_USA, pam, method = "silhouette")+
theme_classic() +labs(title = "Número Óptimo de Conglomerados")+
  xlab(label = "Número de Grupos")+ 
  ylab(label = "Anchura media de la silueta")

Como podemos observar del gráfico anterior el número sugerido de conglomerados es 2. Por lo que, en los siguientes procesos se clasificará la información en dos conglomerados.

5.3 Calculo de PAM Clustering con K=2

PAM_res <- pam(Data_USA, 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"

Si se desea añadir la clasificación de los datos, se realiza de la siguiente manera:

Clasificacion_Medoids <- cbind(USArrests, cluster = PAM_res$cluster)
head(Clasificacion_Medoids, n = 10)
##             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
## Arkansas       8.8     190       50 19.5       2
## California     9.0     276       91 40.6       1
## Colorado       7.9     204       78 38.7       1
## Connecticut    3.3     110       77 11.1       2
## Delaware       5.9     238       72 15.8       2
## Florida       15.4     335       80 31.9       1
## Georgia       17.4     211       60 25.8       1

5.4 Acceder a resultados de la funcion PAM()

Visualizar los Medoides a utilizar:

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úmero de clusters al que pertenece cada dato:

head(PAM_res$clustering,10)
##     Alabama      Alaska     Arizona    Arkansas  California    Colorado 
##           1           1           1           2           1           1 
## Connecticut    Delaware     Florida     Georgia 
##           2           2           1           1

5.5 Visualización de PAM clusters

fviz_cluster(PAM_res, 
             palette = c("#00AFBB", "#FC4E07"), # color palette
             ellipse.type = "t", # Concentration ellipse
             repel = TRUE, # Avoid label overplotting (slow)
             ggtheme = theme_classic()
             )+labs(title = "Gráfico de Conglomerados")

6. EJEMPLO CAPITULO 6: CLARA- Clustering Large Applications

6.1 Formato y Preparación de datos.

set.seed(1234)
# Generar 500 objetos en dos clusters.
Data_Cap6 <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))

# Especificar los nombres de columnas y filas
colnames(Data_Cap6) <- c("x", "y")
rownames(Data_Cap6) <- paste0("S", 1:nrow(Data_Cap6))

# PVisualización de la data
head(Data_Cap6, 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.2 Calculo del numero Optimo de Clusters

library(cluster)
library(factoextra)
fviz_nbclust(Data_Cap6, clara, method = "silhouette")+
theme_gray()+labs(title = "Número Óptimo de Conglomerados")+
  xlab(label = "Número de Grupos")+ 
  ylab(label = "Anchura media de la silueta")

Como podemos observar del gráfico anterior el número sugerido de conglomerados es 2. Por lo que, en los siguientes procesos se clasificará la información en dos conglomerados.

6.3 Calculando CLARA

El codigo de R a utilizar, usa el algoritmo PAM con K=2

# Compute CLARA
CLARA_res <- clara(Data_Cap6, 2, samples = 50, pamLike = TRUE)
# Print components of clara.res
print(CLARA_res)
## Call:     clara(x = Data_Cap6, 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"

Si se desea añadir la clasificación de los datos, se realiza de la siguiente manera:

Clasificacion_CLARA <- cbind(Data_Cap6, cluster = CLARA_res$cluster)
head(Clasificacion_CLARA, 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

6.4 Acceder a resultados de CLARA

Acceder a los medoides a utilizar:

CLARA_res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499

Cluster al que pertenece cada dato:

head(CLARA_res$clustering,20)
##  S1  S2  S3  S4  S5  S6  S7  S8  S9 S10 S11 S12 S13 S14 S15 S16 S17 S18 S19 S20 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

6.5 Visualización de CLARA clusters

fviz_cluster(CLARA_res,
             palette = c("#00AFBB", "#FC4E07"),
             ellipse.type = "t", 
             geom = "point", pointsize = 1,
             ggtheme = theme_get()
             )+labs(title = "Gráfico de Conglomerados")

7. EJEMPLO CAPITULO 7: AGGLOMERATIVE CLUSTERING

7.1 Estructura y preparación de la data.

La data a utilizar es la data cargada para el ejemplo del capitulo 4 que es presentada como “Data_USA”, cabe destacar que esta data ya ha sido estandarizada por el comando “scale(data)”

# Load the data
#data("USArrests")
# Standardize the data
#Data_USA <- scale(USArrests)
# Show the first 6 rows
head(Data_USA, 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 Medidas de Similitud

Se puede calcular la matriz de distancia de la siguiente manera:

# Calculo de la matriz de disimilitud

Res_Dist <- dist(Data_USA, 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.3 Vinculación de

Res_HC <- hclust(d = Res_Dist, method = "ward.D2")
head(Res_HC, n=6)
## $merge
##       [,1] [,2]
##  [1,]  -15  -29
##  [2,]  -13  -32
##  [3,]  -14  -16
##  [4,]  -23  -49
##  [5,]  -20  -31
##  [6,]  -36    3
##  [7,]  -37  -47
##  [8,]  -19    1
##  [9,]  -46  -50
## [10,]  -41  -48
## [11,]  -26  -27
## [12,]   -1  -18
## [13,]  -35  -38
## [14,]  -24  -40
## [15,]  -21  -30
## [16,]  -12   11
## [17,]    6   13
## [18,]  -43    2
## [19,]  -22    5
## [20,]  -34  -45
## [21,]  -10  -42
## [22,]   -4  -17
## [23,]  -11  -44
## [24,]   -7  -39
## [25,]   12   21
## [26,]    9   22
## [27,]   -5  -28
## [28,]  -33   14
## [29,]  -25    7
## [30,]   -3   19
## [31,]   10   20
## [32,]    4    8
## [33,]   -6   27
## [34,]   15   24
## [35,]   -9   30
## [36,]   16   32
## [37,]   -8   34
## [38,]   17   23
## [39,]   29   38
## [40,]   18   35
## [41,]   25   28
## [42,]   31   36
## [43,]   -2   33
## [44,]   37   39
## [45,]   40   43
## [46,]   26   44
## [47,]   41   45
## [48,]   42   46
## [49,]   47   48
## 
## $height
##  [1]  0.2058539  0.3502188  0.4287712  0.4940832  0.5353893  0.5535286
##  [7]  0.5935343  0.6559259  0.7038309  0.7108812  0.7389936  0.7722224
## [13]  0.7781298  0.7865674  0.7977642  0.8076434  0.8472042  0.9427614
## [19]  0.9513719  0.9824857  1.0122252  1.0598104  1.0709720  1.0756115
## [25]  1.0910920  1.1606271  1.1968261  1.2074603  1.2601290  1.2990516
## [31]  1.3169658  1.3449118  1.3901014  1.5396377  1.6907596  1.7484165
## [37]  1.8118061  1.9360777  2.2033391  2.2421782  2.7145543  2.9932892
## [43]  3.0250236  3.2107135  3.4960481  3.7341155  6.4618664  7.1881893
## [49] 13.5162424
## 
## $order
##  [1]  1 18 10 42 33 24 40 43 13 32  9  3 22 20 31  2  6  5 28 41 48 34 45 12 26
## [26] 27 23 49 19 15 29 46 50  4 17  8 21 30  7 39 25 37 47 36 14 16 35 38 11 44
## 
## $labels
##  [1] "Alabama"        "Alaska"         "Arizona"        "Arkansas"      
##  [5] "California"     "Colorado"       "Connecticut"    "Delaware"      
##  [9] "Florida"        "Georgia"        "Hawaii"         "Idaho"         
## [13] "Illinois"       "Indiana"        "Iowa"           "Kansas"        
## [17] "Kentucky"       "Louisiana"      "Maine"          "Maryland"      
## [21] "Massachusetts"  "Michigan"       "Minnesota"      "Mississippi"   
## [25] "Missouri"       "Montana"        "Nebraska"       "Nevada"        
## [29] "New Hampshire"  "New Jersey"     "New Mexico"     "New York"      
## [33] "North Carolina" "North Dakota"   "Ohio"           "Oklahoma"      
## [37] "Oregon"         "Pennsylvania"   "Rhode Island"   "South Carolina"
## [41] "South Dakota"   "Tennessee"      "Texas"          "Utah"          
## [45] "Vermont"        "Virginia"       "Washington"     "West Virginia" 
## [49] "Wisconsin"      "Wyoming"       
## 
## $method
## [1] "ward.D2"
## 
## $call
## hclust(d = Res_Dist, method = "ward.D2")

7.4 Dendograma

library("factoextra")
fviz_dend(Res_HC, cex = 0.5) + labs(title = "Dendograma de Conglomerados")+theme_gray()

7.5 Verificación del Árbol de Clusters

# Calcular la distancia cofentica
Res_coph <- cophenetic(Res_HC)
# Correlación entre la distancia confentica y la distancia original
cor(Res_Dist, Res_coph)
## [1] 0.6975266

Se observa que el valor no supera el 0.75 por lo cual no se puede decir que la solución mostrada por este agrupamiento no es del todo buena. Por ello recurriremos a cambiar el metodo de vinculación a “average” (promedio)

Res_HC2 <- hclust(Res_Dist, method = "average")
cor(Res_Dist, cophenetic(Res_HC2))
## [1] 0.7180382

El coeficiente de correlaciones muestra que el uso de un método de vinculación diferente crea un árbol que representa las distancias originales ligeramente mejor.

7.6 Segmentación del dendogramas en diferentes grupos

# Cortaremos el árbol en 4 grupos
Grupos_7 <- cutree(Res_HC, k = 4)
head(Grupos_7, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Número de miembros en cada Clusters
table(Grupos_7)
## Grupos_7
##  1  2  3  4 
##  7 12 19 12
#Obtención de los nombres de los miembros que pertenecen al Cluster 1
row.names(Data_USA)[Grupos_7==1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"

7.7 Visualización de los cortes del dendograma

7.7.1 Usando la función fviz_dend()

fviz_dend(Res_HC, k = 4, # Cortar el árbol en 4 grupos
          cex = 0.5, 
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # cada grupo con un color
          rect = TRUE # Enmarcar con un rectangulo cada corte
          )+ labs(title = "Dendograma de Clongomerados")+ theme_classic()

7.7.1 Usando la función fviz_cluster()

fviz_cluster(list(data = Data_USA, cluster = Grupos_7),
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", 
                         "#FC4E07"),
             ellipse.type = "convex", 
             repel = TRUE, 
             show.clust.cent = FALSE, 
             ggtheme = theme_minimal())+ labs(title = "Gráfico de
                                              conglomerados")

7.8 Usando el paquete de Cluster en R

library("cluster")

# Agglomerative Nesting (Hierarchical Clustering)

Res_Agnes <- agnes(x = USArrests, 
                   stand = TRUE, # Estandarizar la data
                   metric = "euclidean", # matriz de distancia
                   method = "ward" # metodo de vinculación
                   )

# Divisive Analysis Clustering

Res_DIANA<- diana(x = USArrests, 
                  stand = TRUE, 
                  metric = "euclidean"
                  )

Visualización

fviz_dend(Res_Agnes, cex = 0.6, k = 4)+labs(title = "Dendograma de Conglomerados")

EJEMPLO DEL CAPITULO 8: Comparing Dendograms

8.1 Preparación de la data

Se seguira utilizando la data de USArrests estadarizados que se ha guardado en el objeto de Data_USA.

Para hacer legibles los diagramas que se van a generar, trabajaremos con una pequeña subconjunto aleatorio del conjunto de datos. Por lo tanto, se usará la función sample() para aleatoriamente seleccione 10 observaciones entre las 50 observaciones contenidas en el conjunto de datos:

set.seed(123)
Random <- sample(1:50, 10)
SubData_USA<- Data_USA[Random,]

8.2 Comparación de dondogramas

library(dendextend)

# Calculo de la matriz de distancias
Res_dist_8 <- dist(SubData_USA, method = "euclidean")

# Calculo de 2 agrupamientos jerarquicos
HC1 <- hclust(Res_dist_8, method = "average")
HC2 <- hclust(Res_dist_8, method = "ward.D2")

# Creamos ambos dendogramas
Dendo1 <- as.dendrogram (HC1)
Dendo2 <- as.dendrogram (HC2)

# Crear una lista para la obtención de dendogramas
Dend_list <- dendlist(Dendo1, Dendo2)

8.3 Comparación visual de 2 dendogramas

8.3.1 Dibujar un Tanglegrama

tanglegram(Dendo1, Dendo2)

8.3.2 Personalización de un Tanglegrama

tanglegram(Dendo1, Dendo2,
           highlight_distinct_edges = FALSE, # líneas discontinuas
           common_subtrees_color_lines = FALSE, # lineas de colores
           common_subtrees_color_branches = TRUE, # lineas comunes del mismo color
           main = paste("Enredo =",
                        round(entanglement(Dend_list), 2))
           )

8.4 Matriz de correlación entre una lista de dendogramas

# 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(dendogramas) también se puede calcular de la siguiente manera:

# Coeficiente de Correlación Cofenético
cor_cophenetic(Dendo1, Dendo2)
## [1] 0.9925544
# Coeficiente de correlación de Baker
cor_bakers_gamma(Dendo1, Dendo2)
## [1] 0.9895528

También es posible comparar simultáneamente múltiples dendrogramas. Se utiliza un operador de encadenamiento %>% (pipe) para ejecutar múltiples funciones al mismo tiempo. Es útil para simplificar el código:

# Creación de múltiples dendogramas
Dend1_8 <- SubData_USA %>% dist %>% hclust("complete") %>% as.dendrogram

Dend2_8 <- SubData_USA %>% dist %>% hclust("single") %>% as.dendrogram

Dend3_8 <- SubData_USA %>% dist %>% hclust("average") %>% as.dendrogram

Dend4_8 <- SubData_USA %>% dist %>% hclust("centroid") %>% as.dendrogram

# Calculo de la matriz de correlacion
dend_list_8 <- dendlist("Complete" = Dend1_8, "Single" = Dend2_8,
"Average" = Dend3_8, "Centroid" = Dend4_8)
Matriz_Corr_8 <- cor.dendlist(dend_list_8)

# Visualizar la matriz de Correlación
round(Matriz_Corr_8, 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

Visualización de la matriz de correlación usando la librería Corrplot

library(corrplot)
corrplot(Matriz_Corr_8, "pie", "lower")

EJEMPLO CAPITULO 9: Visualizing Dendrograms

La data a utilizar se encuentra en “Data_USA” que ya se encuentra estadarizada.

9.1 Data a utilizar

# CalculO de distancias y agrupamiento jerárquico.
distancias_9 <- dist(Data_USA, method = "euclidean")
HC_cap9 <- hclust(distancias_9, method = "ward.D2")

9.2 Visualizar Dendogramas

9.2.1 Crear un dendograma básico.

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

9.2.2 Crear un dendograma usando los argumentos: main, sub, xlab, ylab

fviz_dend(HC_cap9, cex = 0.5,
          main = "Dendograma - ward.D2",
          xlab = "Objetos", ylab = "Distancia", sub = "")

9.2.3 Crear un Dendograma horizontal

fviz_dend(HC_cap9, cex = 0.5, horiz = TRUE,
          main = "Dendograma ",
          xlab = "Objetos", ylab = "Distancia", sub = "")

9.2.4 Dendograma dividido en Grupos

fviz_dend(HC_cap9, k = 4, # Cortar en 4 grupos
          cex = 0.5, # tamaño de las etiquetas
          k_colors= "npg",
          color_labels_by_k = TRUE, # color de las etiquetas por cada grupos
          rect = TRUE,# Añadir un rectangulo limitando cada grupo
          rect_border ="npg",
          rect_fill = TRUE,
          main = "Dendograma",
          xlab = "Objetos", ylab = "Distancia", sub = ""
          )

Nota: Los valores permitidos para k_color incluyen paletas de cervezas del paquete RColorBrewer (p. ej., “RdBu”, “Blues”, “Dark2”, “Set2”, . . . ; ) y paletas de revistas científicas del paquete ggsci R (p. ej., “npg”, “aaas”, “lancet”, “jco”, “ucscgb”, “uchicago”, “simpsons” y “rickandmorty”).

Para cambiar el tema de la trama se usa el argumento ggtheme:

fviz_dend(HC_cap9, k = 4, 
          cex = 0.5, 
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, 
          ggtheme = theme_minimal(), # Cambios de Trama
          main = "Dendograma",
          xlab = "Objetos", ylab = "Distancia", sub = ""
)

Para dibujar un dendograma horizontal con rectangulos en cada grupo, se realizaría de la siguiente manera:

fviz_dend(HC_cap9, k = 4, 
          cex = 0.4, horiz = TRUE, 
          k_colors = "jco", 
          rect = TRUE, 
          rect_border = "jco", 
          rect_fill = TRUE,
          main = "Dendograma Horizontal",
          xlab = "Objetos", ylab = "Distancia", sub = "")

9.2.4 Tipos Adicionales de gráficos

9.2.4.1 Dendogramas Circulares

fviz_dend(HC_cap9, cex = 0.5, k = 4,
          k_colors = "aaas", type = "circular")

9.2.4.2 Árbol de tipo filogenético

library(igraph)
fviz_dend(HC_cap9, k = 4, k_colors = "uchicago",
          type = "phylogenic", repel = TRUE)

El diseño predeterminado para los á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”, “diseño_con_lgl”).

A continuación usaremos: phylo.layout = “layout.gem”

fviz_dend(HC_cap9, k = 4,
          k_colors = "jco",
          type = "phylogenic", repel = TRUE,
          phylo_layout = "layout.gem")

9.3 Dendrogramas con grandes conjuntos de datos

9.3.1 Utilizar ZOOM en un dendograma

fviz_dend(HC_cap9, 
          xlim = c(1, 20), # limitar el eje x (objetos)
          ylim = c(1, 8)) # limitar el eje y (distancia)

9.3.2 Sub-árbol de un Dendograma

9.3.2.1 Cortar un dendograma

# 1- Crear una gráfica de todo el dendograma y extraer los datos del dendograma

Dendo_plot <- fviz_dend(HC_cap9, k = 4, # Cortar en 4 grupos
                        cex = 0.5, 
                        k_colors = "jco"
                        )
Dendo_data <- attr(Dendo_plot, "dendrogram") # Datos del dendograma

# Cortar el dendograma a una altura de  h = 15
dend_cortado <- cut(Dendo_data, h = 15)

# Visualizar el dendograma cortado
# dos ramas 
fviz_dend(dend_cortado$upper)

9.3.2.2 Sub-arboles del dendograma

El dendograma completo sería el siguiente:

print(Dendo_plot)

Gráficar los sub-arboles 1 y 2

# Sub-arbol 1 o grupo 1
fviz_dend(dend_cortado$lower[[1]], main = "Sub-Árbol 1")

# Sub-arbol 2 o grupo 2
fviz_dend(dend_cortado$lower[[2]], main = "Sub-Árbol 2")

También se pueden trazar sub-árboles circulares de la siguiente manera:

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

9.3.3 Guardar el Dendograma en PDF

Se puede tener un dendograma grande y guardarlo en una única pagina sin que se pierda la resolución de este.

El proceso es el siguiente:

pdf("dendrograma.pdf", width=30, height=15) # crear el pdf
dendograma<- fviz_dend(HC_cap9, k = 4, cex = 1, k_colors = "jco" ) 

#creación del gráfico
print(dendograma)
dev.off()
## png 
##   2

9.4 Manipulación de dendrogramas usando dendextend

Código R estándar para crear un dendrograma:

Código R para crear un dendrograma usando un operador de encadenamiento y la librería dendextend:

library(dendextend)
Dend <- USArrests[1:5,] %>% # data
  scale %>% # estandarizar
  dist %>% # calculo de la matriz de distancias,
  hclust(method = "ward.D2") %>% # agrupación jerarquica
  as.dendrogram # convertirlos en dendograma.

plot(Dend)

La función set() de la librería dendextend nos permite cambiar los parametros del dendograma

A continuaión se muestra un ejemplo:

library(dendextend)

# 1. Crear el dendograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(HC_cap9) %>%
  set("branches_lwd", 1) %>% # Anchura de las ramas
  set("branches_k_color", mycols, k = 4) %>% # colores de las grupos
  set("labels_colors", mycols, k = 4) %>% # Colores de las etiquetas de los grupos
  set("labels_cex", 0.5) # tamaño de las etiquetas

# 2. Creación del gráfico
fviz_dend(dend)

Y como podemos obervar se obtiene el mismo dendograma que se muestra como ejemplo a inicios del capitulo.

Bibliografía

Aldas, J. (s.f.). Analisis multivariante aplicado con R. Obtenido de https://drive.google.com/drive/folders/1A_OB3xL4KYu48kGqmFUDaXue4Wh5DfkM

fuente, S. d. (s.f.). analisis conglomerados. Obtenido de https://www.fuenterrebollo.com/Economicas/ECONOMETRIA/SEGMENTACION/CONGLOMERADOS/conglomerados.pdf

Kassambara, A. (2017). Obtenido de Practical Guide To Cluster Analysis in R. Unsupervised Machine Learning.