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)
(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.
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:
Preparar los datos.
Calcular información de (des) similitud entre cada par de objetos en los datos a colocar.
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.
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.
Data
## 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
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.
## 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:
## 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
El número de conglomerado al que pertence cada una de las observaciones
## 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
## 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”:
## [1] 8 13 16 13
La matriz de las medias de los conglomerados:
## 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
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")La data a utilizar será la misma que en el ejemplo anterior(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
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.
## 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
Visualizar los Medoides a utilizar:
## 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:
## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
## Connecticut Delaware Florida Georgia
## 2 2 1 1
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
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.
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
Acceder a los medoides a utilizar:
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
Cluster al que pertenece cada dato:
## 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
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
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
## $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")
library("factoextra")
fviz_dend(Res_HC, cex = 0.5) + labs(title = "Dendograma de Conglomerados")+theme_gray()# 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)
## [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.
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
## 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"
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()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")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
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:
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)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))
)## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
## [,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:
## [1] 0.9925544
## [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
La data a utilizar se encuentra en “Data_USA” que ya se encuentra estadarizada.
fviz_dend(HC_cap9, cex = 0.5,
main = "Dendograma - ward.D2",
xlab = "Objetos", ylab = "Distancia", sub = "")fviz_dend(HC_cap9, cex = 0.5, horiz = TRUE,
main = "Dendograma ",
xlab = "Objetos", ylab = "Distancia", sub = "")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 = "")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")fviz_dend(HC_cap9,
xlim = c(1, 20), # limitar el eje x (objetos)
ylim = c(1, 8)) # limitar el eje y (distancia)# 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)El dendograma completo sería el siguiente:
Gráficar los sub-arboles 1 y 2
También se pueden trazar sub-árboles circulares de la siguiente manera:
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
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.
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.