El análisis de conglomerados es un método exploratorio multivariante que busca clasificar individuos u objetos en grupos distintos.
El objetivo es que los miembros dentro de cada grupo sean lo más homogéneos posible con respecto a ciertas variables, mientras que los grupos en sí mismos sean lo más heterogéneos posible entre sí, por este método no impone restricciones previas en forma de modelos estadísticos, lo que lo convierte en una técnica de aprendizaje no supervisado.
La clasificación se realiza a partir de las variables observadas en los individuos u objetos, por lo que es crucial elegir adecuadamente las variables iniciales y la medida de homogeneidad o similitud.
Análisis de Clúster | Técnicas Disponibles | Ventajas | Desventajas |
---|---|---|---|
Jerárquico Método de agrupamiento que construye una estructura jerárquica para mostrar cómo los datos se agrupan en diferentes niveles de similitud. Ideal para análisis exploratorio en conjuntos de datos sin una estructura de clústeres predeterminada. |
|
|
|
No Jerárquico Método de agrupamiento que asigna observaciones a un número fijo de clústeres sin una estructura jerárquica, basado en criterios como densidad, centroide o proximidad. |
|
|
|
Las técnicas de análisis de clúster jerárquicas, se basan en la construcción de una estructura jerárquica de grupos (clusters) que representan las relaciones de similitud entre las observaciones. Se dividen en dos enfoques principales: aglomerativos y desagregativos.
Los métodos aglomerativos, también llamados AGNES (Agglomerative Nesting), comienzan considerando cada observación como un grupo individual. A medida que el algoritmo avanza, los grupos más similares se fusionan paso a paso hasta que todas las observaciones pertenecen a un solo grupo. Este proceso se representa visualmente en un dendograma, donde la altura de la unión entre grupos indica el grado de similitud entre ellos.
Pasos del método aglomerativo:
1. Inicialización: Cada observación se considera un grupo individual.
2. Cálculo de distancias: Se calcula una matriz de distancias entre todos los pares de grupos, utilizando una métrica de distancia como la distancia Euclidiana.
3. Fusión de grupos: Se fusionan los dos grupos más similares, basándose en la matriz de distancias y en el método de enlace elegido.
4. Actualización de la matriz de distancias: Se actualiza la matriz de distancias para reflejar la fusión de los grupos.
5. Repetición: Se repiten los pasos 3 y 4 hasta que todas las observaciones pertenecen a un solo grupo.
Métodos de enlace:
● Enlace simple (vecino más cercano): La distancia entre dos grupos se define como la distancia mínima entre cualquier par de observaciones, una en cada grupo. Tiende a formar grupos alargados o encadenados.
● Enlace completo (vecino más lejano): La distancia entre dos grupos se define como la distancia máxima entre cualquier par de observaciones, una en cada grupo. Produce grupos más compactos y esféricos.
● Enlace promedio: La distancia entre dos grupos se define como la distancia promedio entre todas las parejas de observaciones, una en cada grupo. Ofrece un compromiso entre el enlace simple y el completo.
● Método de Ward: Busca minimizar la varianza total dentro de los grupos, lo que resulta en grupos con mayor homogeneidad interna.
Implementación en R
Estandarización de datos: se recomiendan estandarizar las variables antes de calcular la matriz de distancias, especialmente si están medidas en diferentes escalas. Esto asegura que las variables sean comparables y evita que las variables con mayor varianza dominen el cálculo de las distancias. La estandarización se puede realizar utilizando la función scale() en R
Donde:
x: Este argumento es obligatorio y representa la matriz o data frame de datos numéricos. Cada fila de x corresponde a una observación y cada columna a una variable. Es esencial que los datos sean numéricos, ya que dist() no puede manejar otros tipos de variables.
method: Este argumento especifica la métrica de distancia a utilizar para calcular las distancias entre las observaciones. Los valores permitidos para method son:
“euclidean”: Distancia Euclidiana, que es la raíz cuadrada de la suma de las diferencias cuadradas entre las coordenadas de dos puntos. Es la métrica por defecto.
“maximum”: Distancia de Chebyshev, que es la mayor diferencia entre las coordenadas de dos puntos.
“manhattan”: Distancia de Manhattan, que es la suma de las diferencias absolutas entre las coordenadas de dos puntos.
“canberra”: Distancia de Canberra, que es la suma de las diferencias absolutas ponderadas por la suma de los valores absolutos.
“binary”: Distancia binaria o de Jaccard, que se utiliza para datos binarios y mide la proporción de atributos diferentes entre dos observaciones.
“minkowski”: Distancia de Minkowski, que es una generalización de las distancias Euclidiana y de Manhattan. El argumento p (ver más abajo) define el orden de la distancia de Minkowski.
diag: Este argumento es un valor lógico (TRUE o FALSE) que indica si se deben incluir los valores de la diagonal principal de la matriz de distancias (es decir, las distancias de cada observación consigo misma). Por defecto, diag = FALSE.
upper: Este argumento es un valor lógico que indica si se deben incluir los valores del triángulo superior de la matriz de distancias. Por defecto, upper = FALSE.
p: Este argumento se utiliza solo cuando method = “minkowski” y define el orden de la distancia de Minkowski. El valor por defecto es p = 2, lo que corresponde a la distancia Euclidiana.
Donde:
d: Matriz de distancias, creada con la función dist().
method: Especifica el método de enlace.
Donde:
x: Matriz o data frame que contiene los datos.
stand: Si es TRUE, los datos se estandarizan.
metric: Métrica de distancia a utilizar.
method: Especifica el método de enlace.
Función fviz_dend() (paquete factoextra): Se utiliza para visualizar el dendograma resultante.
Ejemplo de Método Aglomerativo
# Calcular la matriz de distancias
dist_matrix <- dist(df, method = "euclidean")
# Realizar el análisis de clúster jerárquico con enlace Ward
hc_ward <- hclust(dist_matrix, method = "ward.D2")
# Visualizar el dendograma
plot(hc_ward, main = "Dendograma - Enlace Ward", xlab = "", sub = "")
# Cargar el paquete cluster
library(cluster)
# Realizar el análisis de clúster jerárquico con enlace promedio
hc_average <- agnes(df, method = "average")
# Visualizar el dendograma
plot(hc_average, main = "Dendograma - Enlace Promedio", xlab = "", sub = "")
Los métodos desagregativos, también conocidos como DIANA (DIvisive ANAlysis Clustering), siguen un enfoque “de arriba hacia abajo”. Inicialmente, todas las observaciones se consideran parte de un único grupo. Luego, el algoritmo divide el grupo en subgrupos cada vez más pequeños hasta que cada observación forma un grupo individual.
Implementación en R
Función diana() (paquete cluster): Permite realizar el análisis de clúster jerárquico desagregativo.
Donde:
x: Matriz o data frame que contiene los datos.
stand: Si es TRUE, los datos se estandarizan.
metric: Métrica de distancia a utilizar.
# Cargar el paquete cluster
library(cluster)
# Realizar el análisis de clúster jerárquico desagregativo
hc_diana <- diana(df)
# Visualizar el dendograma
plot(hc_diana, main = "Dendograma - DIANA", xlab = "", sub = "")
# Cargar el paquete factoextra
library(factoextra)
# Visualizar el dendograma con fviz_dend()
fviz_dend(hc_ward, cex = 0.5, main = "Dendograma - Enlace Ward",
xlab = "Observaciones", ylab = "Distancia")
Los métodos de análisis de clúster no jerárquicos, también conocidos como métodos de particionamiento, se caracterizan por requerir que se predefina el número de grupos (clusters) que se desean formar. El objetivo principal de estos métodos es agrupar las observaciones de manera que se maximice la homogeneidad dentro de cada grupo y la heterogeneidad entre grupos. A continuación, se describen las técnicas más comunes para realizar análisis de clúster no jerárquico, incluyendo una explicación de las librerías y sintaxis en R.
El método de las k-medias es uno de los algoritmos de agrupamiento más utilizados. Su principio básico consiste en asignar cada observación al grupo cuyo centroide (media) se encuentra más cerca, utilizando generalmente la distancia Euclidiana como medida de similitud.
Los resultados pueden variar dependiendo de la inicialización aleatoria de los centroides.
Implementación en R:
La función kmeans() del paquete stats se utiliza para implementar el algoritmo k-medias en R.
Sintaxis:
kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c(“Hartigan-Wong”, “Lloyd”, “Forgy”, “MacQueen”))
Donde:
● x: Matriz o data frame que contiene los datos.
● centers: Número de grupos (k) a formar.
● iter.max: Número máximo de iteraciones permitidas.
● nstart: Número de inicializaciones aleatorias diferentes para los centroides.
● algorithm: Algoritmo a utilizar.
Ejemplo:
# Cargar los datos
data(iris)
# Realizar k-medias con 3 grupos
cluster_km <- kmeans(iris[, -5], centers = 3)
# Ver los resultados
print(cluster_km)
## K-means clustering with 3 clusters of sizes 38, 62, 50
##
## Cluster means:
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 6.850000 3.073684 5.742105 2.071053
## 2 5.901613 2.748387 4.393548 1.433871
## 3 5.006000 3.428000 1.462000 0.246000
##
## Clustering vector:
## [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [38] 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [75] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1
## [112] 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 1
## [149] 1 2
##
## Within cluster sum of squares by cluster:
## [1] 23.87947 39.82097 15.15100
## (between_SS / total_SS = 88.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
El método de las k-medoides es similar a k-medias, pero en lugar de utilizar centroides, utiliza medoides. Un medoide es una observación real del conjunto de datos que representa el “centro” del grupo. Este método es más robusto a la presencia de valores atípicos en comparación con k-medias.
Implementación en R:
La función pam() del paquete cluster se utiliza para implementar PAM en R.
Sintaxis:
pam(x, k, metric = “euclidean”, stand = FALSE)
Donde:
●x: Matriz o data frame que contiene los datos.
●k: Número de grupos (k) a formar.
●metric: Métrica de distancia a utilizar (por defecto “euclidean”).
●stand: Si es TRUE, los datos se estandarizan antes del análisis.
Ejemplo:
# Cargar el paquete cluster
library(cluster)
# Realizar PAM con 3 grupos
cluster_pam <- pam(iris[, -5], k = 3)
# Ver los resultados
print(cluster_pam)
## Medoids:
## ID Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] 8 5.0 3.4 1.5 0.2
## [2,] 79 6.0 2.9 4.5 1.5
## [3,] 113 6.8 3.0 5.5 2.1
## Clustering vector:
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [75] 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3 3 3 3
## [112] 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3 3 3 2 3
## [149] 3 2
## Objective function:
## build swap
## 0.6709391 0.6542077
##
## Available components:
## [1] "medoids" "id.med" "clustering" "objective" "isolation"
## [6] "clusinfo" "silinfo" "diss" "call" "data"
El algoritmo CLARA es una extensión de PAM diseñada para manejar conjuntos de datos grandes. En lugar de analizar todo el conjunto de datos, CLARA utiliza un enfoque de muestreo, seleccionando un subconjunto de observaciones y aplicando PAM en este subconjunto.
Implementación en R:
La función clara() del paquete cluster se utiliza para implementar CLARA en R.
Sintaxis:
clara(x, k, metric = “euclidean”, stand = FALSE, samples = 5, sampsize = min(n, 40 + 2 * k))
Donde:
●x: Matriz o data frame que contiene los datos.
●k: Número de grupos (k) a formar.
●metric: Métrica de distancia a utilizar (por defecto “euclidean”).
●stand: Si es TRUE, los datos se estandarizan antes del análisis.
●samples: Número de submuestras a utilizar.
●sampsize: Tamaño de cada submuestra.
Ejemplo:
#Cargar el paquete cluster
library(cluster)
#Realizar CLARA con 3 grupos
cluster_clara <- clara(iris[, -5], k = 3)
#Ver los resultados
print(cluster_clara)
## Call: clara(x = iris[, -5], k = 3)
## Medoids:
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] 5.1 3.5 1.4 0.2
## [2,] 6.1 3.0 4.6 1.4
## [3,] 6.8 3.0 5.5 2.1
## Objective function: 0.6760124
## Clustering vector: int [1:150] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
## Cluster sizes: 50 61 39
## Best sample:
## [1] 1 2 4 14 16 29 30 32 33 37 41 47 48 50 54 59 64 66 67
## [20] 70 75 76 80 83 92 96 97 111 112 113 114 117 119 120 121 126 128 130
## [39] 131 132 133 140 143 144 147 149
##
## Available components:
## [1] "sample" "medoids" "i.med" "clustering" "objective"
## [6] "clusinfo" "diss" "call" "silinfo" "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
# 4.3.3 Estimación del número óptimo de clústeres
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
# 4.3.4 Cálculo de la agrupación en clústeres de k-medias
# Calcular k-medias con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
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"
## 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
# 4.3. CÁLCULO DE LA AGRUPACIÓN DE K-MEANS EN R
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 1
## Alaska 10.0 263 48 44.5 4
## Arizona 8.1 294 80 31.0 4
## Arkansas 8.8 190 50 19.5 1
## California 9.0 276 91 40.6 4
## Colorado 7.9 204 78 38.7 4
## 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
## 1 4 4 1
## [1] 8 13 16 13
## Murder Assault UrbanPop Rape
## 1 1.4118898 0.8743346 -0.8145211 0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 4 0.6950701 1.0394414 0.7226370 1.27693964
# 4.3.6 Visualización de clústeres de k-medias
fviz_cluster(km.res, data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid",
star.plot = TRUE,
repel = TRUE,
ggtheme = theme_minimal()
)
## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
# 5.3.3 Estimación del número óptimo de clústeres
library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()
## 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"
# clasificaciones de puntos a los datos originales
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd, n = 3)
## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 1
## Alaska 10.0 263 48 44.5 1
## Arizona 8.1 294 80 31.0 1
# 5.3.5 Acceso a los resultados de la función pam()
# Medoides en cluster: Nuevo México, Nebraska
pam.res$medoids
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
# 5.3.6 Visualización de clústeres PAM
fviz_cluster(pam.res,
palette = c("#00AFBB", "#FC4E07"),
ellipse.type = "t",
repel = TRUE,
ggtheme = theme_classic()
)
# 6.3.1 Formato y preparación de los datos
set.seed(1234)
# Generar 500 objetos, divididos en 2 clústeres.
df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))
# Especificar nombres de columnas y filas
colnames(df) <- c("x", "y")
## x y
## S1 -9.656526 3.881815
## S2 2.219434 5.574150
## S3 8.675529 1.484111
## S4 -18.765582 5.605868
## S5 3.432998 2.493448
## S6 4.048447 6.083699
# 6.3.3 Estimación del número óptimo de clústeres
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()
# 6.3.4 Cálculo de CLARA
# Calcular CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Componentes de impresión de clara.res
print(clara.res)
## Call: clara(x = df, k = 2, samples = 50, pamLike = TRUE)
## Medoids:
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## Objective function: 9.87862
## Clustering vector: Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
## - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes: 200 300
## Best sample:
## [1] S37 S49 S54 S63 S68 S71 S76 S80 S82 S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
##
## Available components:
## [1] "sample" "medoids" "i.med" "clustering" "objective"
## [6] "clusinfo" "diss" "call" "silinfo" "data"
## x y cluster
## S1 -9.656526 3.881815 1
## S2 2.219434 5.574150 1
## S3 8.675529 1.484111 1
## S4 -18.765582 5.605868 1
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
## 1 1 1 1 1 1 1 1 1 1
# 6.3.5 Visualización de clústeres CLARA
fviz_cluster(clara.res,
palette = c("#00AFBB", "#FC4E07"),
ellipse.type = "t",
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)
# 7.2.1 Estructura y preparación de datos.
# Cargar los datos
data("USArrests")
# Estandarizar los datos
df <- scale(USArrests)
# Mostrar las primeras 6 filas
head(df, nrow = 6)
## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144 1.7589234 2.067820292
## Colorado 0.02571456 0.3988593 0.8608085 1.864967207
# 7.2.2 Medidas de similitud
# Calcular la matriz de disimilitud
# df = los datos estandarizados
res.dist <- dist(df, method = "euclidean")
## 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 Verificar el árbol de clústeres
# Calcular la distancia cofenética
res.coph <- cophenetic(res.hc)
# Correlación entre la distancia cofenética y
# la distancia original
cor(res.dist, res.coph)
## [1] 0.6975266
## [1] 0.7180382
# 7.4 Cortar el dendrograma en diferentes grupos
# Cortar el árbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
## grp
## 1 2 3 4
## 7 12 19 12
## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
# 7.4. CORTAR EL DENDROGRAMA EN DIFERENTES GRUPOS
# Cortar en 4 grupos y colorear por grupos
fviz_dend(res.hc, k = 4,
cex = 0.5,
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
rect = TRUE
)
fviz_cluster(list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex",
repel = TRUE,
show.clust.cent = FALSE, ggtheme = theme_minimal())
# 7.5 Paquete R de Cluster
library("cluster")
# Anidamiento aglomerativo (agrupamiento jerárquico)
res.agnes <- agnes(x = USArrests,
stand = TRUE,
metric = "euclidean",
method = "ward"
)
# Análisis divisorio Agrupamiento
res.diana <- diana(x = USArrests,
stand = TRUE,
metric = "euclidean"
)
# 8.1 Preparación de datos
df <- scale(USArrests)
# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]
# 8.2 Comparación de dendrogramas
library(dendextend)
# Calcular la matriz de distancia
res.dist <- dist(df, method = "euclidean")
# Calcular 2 agrupamientos jerárquicos
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Crea dos dendrogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Crea una lista para almacenar dendrogramas
dend_list <- dendlist(dend1, dend2)
tanglegram(dend1, dend2,
highlight_distinct_edges = FALSE,
common_subtrees_color_lines = FALSE,
common_subtrees_color_branches = TRUE,
main = paste("entanglement =", round(entanglement(dend_list), 2))
)
# 8.2.2 Matriz de correlación entre una lista de dendrogramas
# Matriz de correlación cofenética
cor.dendlist(dend_list, method = "cophenetic")
## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
## [,1] [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
## [1] 0.9925544
## [1] 0.9895528
# Crear múltiples dendrogramas mediante encadenamiento
dend1 <- df %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df %>% dist %>% hclust("centroid") %>% as.dendrogram
# Calcular la matriz de correlación
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)
# Imprimir matriz de correlación
round(cors, 2)
## Complete Single Average Centroid
## Complete 1.00 0.46 0.45 0.30
## Single 0.46 1.00 0.23 0.17
## Average 0.45 0.23 1.00 0.31
## Centroid 0.30 0.17 0.31 1.00
# Visualice la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")
# Cargar datos
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
fviz_dend(hc, cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")
fviz_dend(hc, k = 4,
cex = 0.5,
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
ggtheme = theme_gray()
)
fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)
require("igraph")
fviz_dend(hc, k = 4,
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")
# 9.2.2 Trazado de un subárbol de dendrogramas
# Crea un gráfico de todo el dendrograma,
# y extrae los datos del dendrograma
dend_plot <- fviz_dend(hc, k = 4,
cex = 0.5,
k_colors = "jco"
)
dend_data <- attr(dend_plot, "dendrogram")
# Cortar el dendrograma a la altura h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualice la versión truncada que contiene
# dos ramas
fviz_dend(dend_cuts$upper)
# 9.2.3 Guardar el dendrograma en una página PDF grande
pdf("dendrogram.pdf", width=30, height=15)
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" )
print(p)
dev.off()
## png
## 2
# 9.3 Manipulación de dendrogramas utilizando dendextend
data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)
library(dendextend)
dend <- USArrests[1:5,] %>%
scale %>%
dist %>%
hclust(method = "ward.D2") %>%
as.dendrogram
plot(dend)
library(dendextend)
# 1. Crear un dendrograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>%
set("branches_k_color", mycols, k = 4) %>%
set("labels_colors", mycols, k = 4) %>%
set("labels_cex", 0.5)
# 2. Crear gráfico
fviz_dend(dend)