Es una técnica estadística multivariante que agrupa variables o elementos con características similares en conjuntos más homogéneos. Esta técnica es de carácter descriptivo, más no inferencial. Debido a su funcionalidad descriptiva se utiliza mucho en el campo del análisis exploratorio.
Se puede decir que esta técnica se basa en el agrupamiento de variables con características similares, obtenidas de un conjunto de datos, en grupos más homogéneos.
El Análisis de clusters es uno de los métodos de minería de datos más importantes para descubrir conocimientos en datos multidimensionales. El objetivo es identificar patrones de objetos similares en un conjunto de datos. Pero no se utiliza solo aquí, hay una gran cantidad de datos provenientes de todas las ramas de investigación, los métodos de conglomerados pueden utilizarse en las siguientes competencias mostradas por (Cluster Analysis):
Inteligencia Artificial: En esta área se le conoce como aprendizaje automático no supervisado, un método proveniente del Machine Learning. se conoce asi debido a que se parte sin ningun conocimiento sobre los grupos de datos y el algoritmo aprende a agrupar esos datos por si solo.
psiquiatría: Donde la caracterización de los pacientes en base a grupos de síntomas puede ser útil en la identificación de una forma de terapia.
Biología: Para la búsqueda de grupos de genes con funciones similares.
Recuperación de información: La red mundial está formada por miles de millones de páginas web y los resultados de una consulta a un motor de búsqueda pueden devolver miles de páginas. El clustering puede utilizarse para agrupar estos resultados de búsqueda en un pequeño número de clusters, cada uno de los cuales captura un aspecto particular de la consulta. Cada categoría (clúster) puede dividirse en subcategorías (subclústeres), lo que produce una estructura jerárquica que ayuda al usuario a explorar los resultados de la consulta.
Clima: Para entender el clima de la Tierra es necesario encontrar patrones en la atmósfera y el océano. Para ello, se ha aplicado el análisis de clústeres para encontrar patrones en la presión atmosférica de las regiones polares y en los ateos del océano que tienen un impacto significativo en el clima terrestre.
Marketing: Sirve para la segmentación del mercado mediante la identificación de subgrupos de clientes con perfiles similares y que podrían ser receptivos a una determinada forma de publicidad.
Economía: En la economía puede utilizarse para estudiar para agrupar variables economicas que describan un mismo fenómeno. Además tambien puede servir para el estudio de concentraciones geográficas de empresas e instituciones interconectadas en un campo en particular.
El análisis de conglomerados se diferencia del análisis factorial, en que este último agrupa variables en función de las respuestas provenientes de cosas externas a esas variables, mientras que los métodos de conglomerados agrupa los objetos en función de las respuestas que propongan a varias variables. Para entenderlo mejor suponga el ejemplo de distintas personas que responden una determinada encuentas sobre los niveles de pobreza, en el análisis factorial, formamos grupos de variables en función de las respuestas de las personas a esas variables. En cambio, en el análisis de conglomerados, agrupamos a las personas en función de sus respuestas a varias variables.
Resumen de Análisis de Clúster
Análisis de Clúster |
Técnicas Disponibles |
Ventajas |
Desventajas |
Jerárquico: Es el procedimiento escalonado que identifica grupos relativamente homogéneos de casos basados en características seleccionadas que resulta en la construcción de una jerarquía o estructura en forma de árbol (dendrograma) que representa la formación de clusters y que en cuyo inicio no requiere especificar previamente el número de conglomerados a producir. La muestra debe ser moderada con < 300. |
|
|
|
No Jerárquico: Procedimiento que no implica el proceso de construcción de árboles y que asignan los objetos en distintos conglomerados una vez que se especifica el número de estos.Están diseñados para la clasificación de individuos (no de variables) en K grupos. |
|
|
|
Fuente: Elaboración Propia en base a (Sthda, n.d.)
Este es un método ascentende, la agrupación aglomerativa se da cuando cada observación se considera inicialmente como un grupo propio (hoja). Luego, los clústeres más similares se fusionan sucesivamente hasta que haya un solo gran clúster (raíz), el resultadi es un árbol llamado dendrograma. (Sthda, n.d.)
Este método tambien es conocido como asociativo y se parte del número original de individuos (grupos propios) que se tiene en la base de datos a utilizar y se van agrupando hasta tener todos los casos en un mismo grupo. los pasos para llevar a acabo un análisis jerárquico aglomerativo son los sigueintes:
1. Preparar los datos a utilizar. Esto implica estandarizar los datos
2. Cálcular la similitud entre cada par de objetos
3. Agrupar todos los objetos en un árbol jerárquico
4. Partición de los datos. Esto implica cortar el árbol jerárquico
La librería utilizada para el análisis de clusters es cluster
de ella se utiliza la función agnes()
en el enfoque aglomarativo, su implementación es la siguiente:
library(cluster)
agnes(x = df, # df es un conjunto de datos o matriz de disimilitud
stand = TRUE, # TRUE significa que el conjunto de datos se estandarizará
metric = "euclidean", # Tipo de cálculo de las diferencias entre observaciones
method = "ward") # Define el método de agrupamiento.
Para visualizar el árbol creado o dendograma se utiliza la librería factoextra
y la función fviz_dend()
que se implementa de la sigueinte manera:
library(factoextra)
fviz_dend(x = df, # Objeto dendograma creado con agnes()
k = 4, # Número de grupos en que se cortará el árbol
horiz = TRUE, # Verdadero dibuja dendograma horizontalmente
cex = 0.5, # Tamaño de las etiquetas
rect = TRUE) # Verdadero agrega un rectángulo al rededor de grupos
La agrupación divisiva, comienza con la raíz, en la que todos los objetos se incluyen en un grupo. Luego, los conglomerados más heterogéneos se dividen sucesivamente hasta que todas las observaciones se encuentran en su propio conglomerado. (Sthda, n.d.)
Los pasos de los métodos divisivos son similares al aglomerativo y para implementar el análisis en R se utiliza la libería cluster
y su función diana()
de la forma siguiente:
library(cluster)
diana(x = df, # Conjunto o matriz de datos
metric ="euclidean", #Tipo de cálculo de las diferencias entre observaciones
stand = TRUE) # TRUE significa que el conjunto de datos se estandarizará
Para visualizar el objeto creado con diana
se utiliza también la función fviz_dend()
de factoextra
vista anteriormente.
Es un algortimo de aprendizaje automático no supervisado mas utilizado para dividir un conjunto de datos dado en uno de k grupos, donde “k” representa el número de grupos preespecificados por el analista. Clasifica objetos en múltipes grupos, de modo que los obejtos son lo mas similares posibles, mientras que los objetos de diferentes grupos son tan diferentes como sea posible. En el agrupamiento k-medias, cada grupo está representado por su centro que corresponde a la media de puntos asignados al grupo.
Las ideas basicas de la agrupación k-medias consiste en definir agrupaciones de modo que se minimice la variación total dentro de la agrupación.
El algoritmo k-medias se puede resumir de la siguiente manera:
1. Especificar el número de agrupaciones (k) que se crearán por el analista
2. Seleccionar aleatoriamente k objetos del conjunto de datos como centros o medias del conglomerado inicial
3. Asigna cada observación a su controide más cercano, segun la distancia euclidiana entre el objeto y el centroide
4. Para cada uno de los k conglomerados, actualice el centroide del conglomerado calculando los nuevos valores medios de todos los puntos de datos del conglomerado. El centroide de un grupo k, es un vector de lungitud p que contiene las medias de todas las variables para las observaciones en el grupo ku; p es el número de variables
5. Minimice iterativamente el total dentro de la suma del cuadrado. Es decir, repita los pasos 3 y 4 hasta que las asiganaciones de cluster dejen de cambiar o se alcancen el número máximo de iteraciones. De forma predeterminada, el software R usa 10 como valor predeterminado para el número máximo de iteraciones
data("USArrests")
<- scale(USArrests)
df
head(df, n = 3)
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
# Calculando K-mean con K=4
set.seed(123)
<- kmeans(df, 4, nstart = 25)
km.res
# Vista Km.res
print(km.res)
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
<- cbind(USArrests, cluster = km.res$cluster)
dd head(dd)
# Número de conglomerados para cada una de las observaciones
$cluster
km.reshead(km.res$cluster, 4)
#Tamaño de clúster
$size
km.res
# Medias de clúster
$centers
km.res
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()
)
El algoritmo anterior (k-medias) es muy sensible a los valores atípicos. Esto puede afectar gravemente a la asignación de observaciones a los conglomerados. El algoritmo PAM proporciona un algoritmo más robusto.
El algoritmo PAM se basa en la busqueda de K objetos representativos y medidos entre las observaciones del conjunto de datos.
El algoritmo PAM procede en dos fases de las siguentes maneras:
1. Seleccione k objetos para convertirlos en medoides, o en caso de que se proporcionen estos objetos utilicelos como medoides
2. Calcule la matriz de disimilitud si no se proporcionó
3. Asigne cada objeto a su medoide más cercano
4. Para cada busqueda de conglomerados, si alguno de los objetos del conglomerado disminuye el coeficiente de disimilitud promedio; si lo hace, seleccione la entidad que mas disminuya este coeficiente como el medoide para este conglomerado
5. Si al menos un medoide ha cambiado, vaya a (3), de lo contrario finalice el algoritmo
El algoritmo PAM funciona con una matriz de disimilitud y para calcular esta matriz, el algoritmo puede utilizar dos métricas:
1. Las distintas euclidianas, que son la raiz de la suma de cuadrados de las diferencias
2. Y la distancia de Manhattan que es la suma de distancia absoluta
data("USArrests")
<- scale(USArrests)
df head(df, n = 3)
library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()
<- pam(df, 2)
pam.res print(pam.res)
<- cbind(USArrests, cluster = pam.res$cluster)
dd head(dd, n = 3)
$medoids
pam.res
head(pam.res$clustering)
fviz_cluster(pam.res,
palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_classic()
)
Esta técnica es una extensión de los métodos k-medoides para tratar datos que contienen una gran cantidad de objetos con el fin de reducir el tiempo de cálculo y la RAM, problema de almacenamiento. Esto se logra utilizando el método de muestreo.
Clara no utiliza todo el conjunto de datos si no que considera una pequeña muestra de los datos con tamaño fijo y aplica el algoritmo PAM para generar un conjunto optimo de medoides para la muestra. La calidad de los medoides resultantes se mide por la disimilitud promedio entre cada objeto en todo el conjunto de datos y el medoide de su grupo, definido como la función de costo.
Clara repite los procesos de muestreo y agrupamiento un número prestablecido de veces para minimizar los contenedores de muestreo. los resultados finales del clustering correponden al conjunto de medoides con el mismo coste.
El algoritmo Clara se resume de la siguente manera:
1. Divida aleatoriamente los conjuntos de datos en varios subconjuntos con tamaño fijo
2. Calcule el algoritmo PAM en cada subconjunto y elija los k objetos representativos correspondientes. Asigne cada observación de todo el conjunto de datos al medoide más cercano
3. Calcule la media de las diferencias de las observaciones con su medoide más cercano. Esto se usa como una medida de la bondad de la agrupación
4. Conserve el subcnjunto de datos para el que la media es mínima. Se lleva a cabo un análisis adicional en la partición final
set.seed(1234)
<- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
df cbind(rnorm(300,50,8), rnorm(300,50,8)))
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))
head(df, nrow = 6)
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()
<- clara(df, 2, samples = 50, pamLike = TRUE)
clara.res
print(clara.res)
<- cbind(df, cluster = clara.res$cluster)
dd head(dd, n = 4)
$medoids
clara.res
head(clara.res$clustering, 10)
fviz_cluster(clara.res,
palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)
data("USArrests")
<- scale(USArrests)
df head(df, 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
# Elegir conglomerados antes del 4. en el "codo"
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
# nstart es recomendable de 25 o 50
set.seed(123)
<- kmeans(df, 4, nstart = 25)
km.res 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"
# Calcular la media de cada variable por conglomerados
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
# Clasificaciones
<- cbind(USArrests, cluster = km.res$cluster)
dd 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
# Número de conglomerados por observaciones
head(km.res$cluster, 4)
## Alabama Alaska Arizona Arkansas
## 1 4 4 1
# Tamaño de los conglomerados
$size km.res
## [1] 8 13 16 13
# Media de los conglomerados
$centers km.res
## 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(km.res, data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid", # Elipse de concentración
star.plot = TRUE, # Segmentos de centroides
repel = TRUE, # Evita el exceso de etiquetas
ggtheme = theme_minimal()
)
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
# Grupos sugeridos son 2
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()
<- pam(df, 2)
pam.res 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"
# Clasificación de puntos datos originales
<- cbind(USArrests, cluster = pam.res$cluster)
dd 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
# Cluster medoids: New Mexico, Nebraska
$medoids pam.res
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
# Cluster numbers
head(pam.res$clustering)
## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
fviz_cluster(pam.res,
palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_classic()
)
set.seed(1234)
# Generate 500 objects, divided into 2 clusters.
<- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
df cbind(rnorm(300,50,8), rnorm(300,50,8)))
# Especificar los nombre de las columnas y las filas
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))
# Previewing the data
head(df, nrow = 6)
## x y
## S1 -9.656526 3.881815
## S2 2.219434 5.574150
## S3 8.675529 1.484111
## S4 -18.765582 5.605868
## S5 3.432998 2.493448
## S6 4.048447 6.083699
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()
# Compute CLARA
<- clara(df, 2, samples = 50, pamLike = TRUE)
clara.res
# Print components of clara.res
print(clara.res)
## Call: clara(x = df, k = 2, samples = 50, pamLike = TRUE)
## Medoids:
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## Objective function: 9.87862
## Clustering vector: Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
## - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes: 200 300
## Best sample:
## [1] S37 S49 S54 S63 S68 S71 S76 S80 S82 S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
##
## Available components:
## [1] "sample" "medoids" "i.med" "clustering" "objective"
## [6] "clusinfo" "diss" "call" "silinfo" "data"
# Clasificación por puntos en la data original
<- cbind(df, cluster = clara.res$cluster)
dd head(dd, n = 4)
## x y cluster
## S1 -9.656526 3.881815 1
## S2 2.219434 5.574150 1
## S3 8.675529 1.484111 1
## S4 -18.765582 5.605868 1
# Medoids
$medoids clara.res
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
# Clustering
head(clara.res$clustering, 10)
## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
## 1 1 1 1 1 1 1 1 1 1
fviz_cluster(clara.res,
palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)
# cargar
data("USArrests")
# Estandarizar
<- scale(USArrests)
df 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
<- dist(df, method = "euclidean")
res.dist 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
<- hclust(d = res.dist, method = "ward.D2") res.hc
fviz_dend(res.hc, cex = 0.5)
# Cálculo de distancia cofenética
<- cophenetic(res.hc)
res.coph # Correlación entre la distancia cofenética y
# la distancia original
cor(res.dist, res.coph)
## [1] 0.6975266
# Solución de agrupación
<- hclust(res.dist, method = "average")
res.hc2 cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382
# Cortar arbol en 4 grupos
<- cutree(res.hc, k = 4)
grp head(grp, n = 4)
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
# Número de miembros en cada clúster
table(grp)
## grp
## 1 2 3 4
## 7 12 19 12
# Nombres de los miembros del clúster 1
rownames(df)[grp == 1]
## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cut in 4 groups and color by groups
fviz_dend(res.hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color labels by groups
rect = TRUE # Add rectangle around groups
)
fviz_cluster(list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())
library("cluster")
# Anidamiento aglomerativo (clustering jerárquico)
<- agnes(x = USArrests, # data matrix
res.agnes stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)# Agrupación de ANÁLISIS DIVISIVA
<- diana(x = USArrests, # data matrix
res.diana stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)
fviz_dend(res.agnes, cex = 0.6, k = 4)
<- scale(USArrests)
df set.seed(123)
<- sample(1:50, 10)
ss <- df[ss,] df
library(dendextend)
# Compute distance matrix
<- dist(df, method = "euclidean")
res.dist
# Compute 2 hierarchical clusterings
<- hclust(res.dist, method = "average")
hc1 <- hclust(res.dist, method = "ward.D2")
hc2
# Create two dendrograms
<- as.dendrogram (hc1)
dend1 <- as.dendrogram (hc2)
dend2
# Create a list to hold dendrograms
<- dendlist(dend1, dend2) dend_list
tanglegram(dend1, dend2)
# Personalizar enredo
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("enredo =", round(entanglement(dend_list), 2))
)
# Cophenetic correlation matrix
cor.dendlist(dend_list, method = "cophenetic")
## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Baker correlation matrix
cor.dendlist(dend_list, method = "baker")
## [,1] [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
# Cophenetic correlation coefficient
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Baker correlation coefficient
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
# Create multiple dendrograms by chaining
<- df %>% dist %>% hclust("complete") %>% as.dendrogram
dend1 <- df %>% dist %>% hclust("single") %>% as.dendrogram
dend2 <- df %>% dist %>% hclust("average") %>% as.dendrogram
dend3 <- df %>% dist %>% hclust("centroid") %>% as.dendrogram
dend4
# Compute correlation matrix
<- dendlist("Complete" = dend1, "Single" = dend2,
dend_list "Average" = dend3, "Centroid" = dend4)
<- cor.dendlist(dend_list)
cors
# Print correlation matrix
round(cors, 2)
## Complete Single Average Centroid
## Complete 1.00 0.46 0.45 0.30
## Single 0.46 1.00 0.23 0.17
## Average 0.45 0.23 1.00 0.31
## Centroid 0.30 0.17 0.31 1.00
# Visualize the correlation matrix using corrplot package
library(corrplot)
corrplot(cors, "pie", "lower")
library(factoextra)
# Load data
data(USArrests)
# Compute distances and hierarchical clustering
<- dist(scale(USArrests), method = "euclidean")
dd <- hclust(dd, method = "ward.D2") hc
Gráfico 1:
## Representación 1
fviz_dend(hc, cex = 0.5)
## Representación 2
fviz_dend(hc, cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")
## Representación 3
fviz_dend(hc, cex = 0.5, horiz = TRUE)
Gráfico 2:
fviz_dend(hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color labels by groups
rect = TRUE, # Add rectangle around groups
rect_border = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
rect_fill = TRUE)
Gráfico 3:
fviz_dend(hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color labels by groups
ggtheme = theme_gray() # Change theme
)
Gráfico 4:
fviz_dend(hc, cex = 0.5, k = 4, # Cut in four groups
k_colors = "jco")
Gráfico 5:
fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)
Gráfico 6:
fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")
Gráfico 7:
require("igraph")
fviz_dend(hc, k = 4, k_colors = "jco",
type = "phylogenic", repel = TRUE)
Gráfico 8:
require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")
Hacer zoom
fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))
Trazar un subárbol
# Cree un gráfico de todo el dendrograma y extraiga los datos del dendrograma
<- fviz_dend(hc, k = 4, # Cortar en 4 grupos
dend_plot cex = 0.5,
k_colors = "jco")
<- attr(dend_plot, "dendrogram") # Extraer los datos del dendrograma
dend_data <- cut(dend_data, h = 10) # Cortar dendrograma a la altura h = 10
dend_cuts fviz_dend(dend_cuts$upper) # Visualizar
print(dend_plot) # Dendrograma completo
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1") # subárbol 1
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2") # subárbol 2
fviz_dend(dend_cuts$lower[[2]], type = "circular") # árboles circulares
Guardar dendrograma
pdf("dendrogram.pdf", width=30, height=15) # Abrir pdf
<- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" )
p print(p)
dev.off() # Cerrar PDF
## png
## 2
library(dendextend)
<- USArrests[1:5,] %>% # data
dend %>% # Escalar los datos
scale %>% # cálcular la matriz de distancia
dist hclust(method = "ward.D2") %>% # Agrupación jerárquica
# Convierte el objeto en un dendrograma.
as.dendrogram plot(dend)
Ejemplo:
library(dendextend)
# 1. Crear dendrograma personalizado
<- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
mycols <- as.dendrogram(hc) %>%
dend set("branches_lwd", 1) %>% # Ancho de las líneas
set("branches_k_color", mycols, k = 4) %>% # Color de las ramas por grupos
set("labels_colors", mycols, k = 4) %>% # Color de etiquetas
set("labels_cex", 0.5) # Tamaño de las etiquetas
fviz_dend(dend) # Crear Gráfico