A23-Análisis de Clúster

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

CICLO II-2024

Asignatura:

Métodos para el Análisis Económico

Docente:

Carlos Ademir Pérez Alas.

Tema:

Análisis de Clúster (Conglomerados)

Grupo:

2

Integrantes:

Márquez Arévalo, Iris Leonor. MA15003 .

Menjivar Guillen, Carlos Fernando. MG20035.

Santos Guzman, Orlando Rigoberto SG18058.

Ciudad Universitaria, 24 de noviembre de 2024.

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

El análisis de conglomerados, también conocido como análisis de clúster, es una técnica que permite agrupar observaciones en diferentes categorías o grupos. Estos grupos, denominados clústeres o conglomerados, se caracterizan por su homogeneidad en relación con las variables que los definen, lo que significa que las observaciones dentro de cada grupo son similares entre sí. Además, una propiedad clave de este análisis es que los diferentes grupos deben ser lo más heterogéneos posible entre sí, en función de las variables consideradas.

El análisis de clúster es un método descriptivo, no inferencial y sin fundamentos estadísticos para realizar inferencias sobre una población a partir de una muestra. Este método se basa en criterios geométricos y se emplea principalmente como una técnica exploratoria y descriptiva, pero no explicativa. Las soluciones obtenidas no son únicas, ya que la asignación de observaciones a un conglomerado depende de diversos factores relacionados con el procedimiento elegido. Asimismo, los resultados del análisis son sensibles a las variables utilizadas: la inclusión o exclusión de variables relevantes puede modificar significativamente los resultados obtenidos.

Pasos en el análisis de clúster:

  • Contar con datos de 𝑛 casos y k variables

  • Determinar un indicador que permita evaluar la similitud o distancia entre pares de observaciones.

  • Agrupar las observaciones con base en la medida de similitud o distancia seleccionada. Existen diferentes tipos de agrupamientos y métodos de clasificación.

  • Analizar y comparar los grupos resultantes.

  • Validar los resultados del análisis.

2. Elabore un cuadro comparativo.

Análisis de clúster

Técnicas disponibles

Ventajas

Desventajas

Jerárquico

Técnica utilizada para agrupar un conjunto de objetos basados en características similares, generando una diferencia de importancia entre ellas, que permite que se genere una jerarquía.


Enlace simple
Enlace completo
Enlace aglomerado (AGNES)

Enlace promedio

Método Ward

Utilizan métodos de distancia (euclidiana o manhattan), que permiten una explicación de grupo, más detallada.

La distancia permite identificar qué tan relacionados están los datos.

No hay corrección de pasos.


Como existe una jerarquía, los clústeres no son independientes entre sí.

Los métodos tienden a ser más complejos, por lo tanto son métodos más lentos.

No Jerárquico

Técnica utilizada para agrupar un conjunto de objetos basados en características similares.

CLARA
K-medoids
K-means

C-means

Gaussian Mixture Models (GMM)

Expectation-Maximization

Los clústeres que se generan son independientes entre sí.

k means es uno de los métodos más rápidos.

La distribución de datos no está estandarizada, permitiendo su aplicación en múltiples bases de datos.

Es más útil para datos de grandes volúmenes.

Requiere la predeterminación del número de clústeres con anticipación. 

Es sensible a los valores atípicos, debido al tipo de datos que se utilizan.

Si bien es más útil para datos grandes, debe especificarse el contexto porque su efectividad depende siempre del tipo de datos.

Fuente: elaboración propia con base en: Kassambara, A. (2017). Obtenido de Practical Guide To Cluster Analysis in R. Unsupervised Machine Learning.

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.

Métodos jerárquicos.

Enlace simple: Este enfoque tiende a crear clústeres en forma de cadena, ya que puede unir clústeres que están conectados a través de un solo punto cercano, lo que puede resultar en una estructura menos compacta en comparación con otros métodos como el enlace completo. En R: Utiliza la función dist() para calcular la matriz de distancias entre los puntos de datos, luego hclust(), luego plot() para visualizar el dendograma.

Enlace completo: En este método, la distancia entre dos clústeres se define como la distancia más larga entre cualquier par de puntos, uno de cada clúster.es una técnica robusta para realizar análisis de clúster jerárquico en R, proporcionando clústeres más compactos y menos influenciados por valores atípicos. Para aplicar el método: Usa la función hclust() con el argumento method = “complete” para realizar el agrupamiento jerárquico. y luego igual que el método de enlace simple.

Enlace aglomerativo: Conocido también por AGNES, (por sus siglas en inglés), que se utiliza para agrupar objetos en clústeres basándose en su similitud. Los datos deben ser una matriz numérica con:filas y columnas. Para utilizar en R, se debe cargar la data, estandarizar los datos, luego se aplica: la función dist(), y dada una matriz de distancias ‘res.dist’ generada por la función dist(), la función base de R hclust() puede ser utilizada para crear el árbol jerárquico. El paquete de R cluster facilita la realización de análisis de clúster en R. Proporciona las funciones agnes() y diana() para calcular el agrupamiento aglomerativo y el agrupamiento divisivo, respectivamente.

Métodos no jerárquicos.

CLARA: CLARA (Clustering Large Applications, Kaufman and Rousseeuw (1990)) is an extension to k-medoids methods. Repite los procesos de muestreo y agrupamiento un número pre especificado de veces para minimizar el sesgo de muestreo. Los resultados finales del agrupamiento corresponden al conjunto de medoids con el costo mínimo. Para lograr un resultado reproducible, comenzamos por la función set.seed(). La función clara() puede ser utilizada para calcular CLARA, se requiere de las funciones: clúster y factor extra.

K-medoides: El término medoid se refiere a un objeto dentro de un clúster para el cual la disimilitud promedio entre él y todos los demás miembros del clúster es mínima. Corresponde al punto más central en el clúster. El algoritmo k-medoides requiere que el usuario especifique 𝑘, el número de clústeres que se generarán. El método de agrupamiento que se utiliza en R, es PAM, se utiliza: el conjunto de datos de demostración ‘USArrests’, que comenzamos escalando, utilizando la función de R scale(). La función pam() [paquete cluster] y pamk() [paquete fpc] pueden ser utilizadas para calcular PAM.

K-means: puede ser utilizado para clasificar observaciones en k grupos, basándose en su similitud. La función de R kmeans() [paquete stats] puede ser utilizada para calcular el algoritmo k-means. El formato simplificado es kmeans(x, centers), donde “x” son los datos y centers es el número de clústeres que se producirán.

C-means: El algoritmo de c-means difuso (FCM) es uno de los algoritmos de agrupamiento difuso más utilizados. El centroide de un clúster se calcula como la media de todos los puntos, ponderada por su grado de pertenencia al clúster. En R: La función fanny() proveniente del paquete cluster puede ser utilizada para calcular agrupamiento difuso. FANNY significa fuzzy analysis clustering.

4. Del texto: Kassambara, A. (2017). Desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.

Capítulo 4

Datos

# Datos utilizados y su respectica descripción en el capítulo 2
data("USArrests") 
df <- scale(USArrests) 

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
# A través de la función fviz, obtenemos una vizualización práctica de cuanto es el número de conglomerados óptimos
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)

Como se observa en el resultado el número óptimo de conglomerados para este ejercicio es de 4 Clúster

Cálculo de agrupación K-meanas

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"
# Cálculo con nstar como recomendación
set.seed(123)
km.res <- kmeans(df, 4, nstart = 50)
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"

Ahora usando los datos originales

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

Acceso a los resultados de la funcióm k-means

# Accediendo
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
km.res$cluster
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              4              4              1              4 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              4              3              3              4              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              4              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              4 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              4              2              1              4 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              4              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              4              4              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              4              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3
head(km.res$cluster, 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        4        4        1
km.res$size
## [1]  8 13 16 13
km.res$centers
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964

Visualización de los clústers K-means

fviz_cluster(km.res, data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type =  "euclid",
star.plot = TRUE,
repel = TRUE,
ggtheme = theme_minimal()
)

4.4 Ventajas y desventajas de la agrupación K-means Un medio análisis de las ventajas y desventajas del uso de la función k-means

Ejercicio 5

Paquete PAM

# Datos
data("USArrests") 
df <- scale(USArrests) 
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

Estimación del número óptimo de clusters (usando PAM)

library(cluster)
## Warning: package 'cluster' was built under R version 4.4.2
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()

Agrupación de clústers

pam.res <- pam(df, 2)
print(pam.res)
## Medoids:
##            ID     Murder    Assault   UrbanPop       Rape
## New Mexico 31  0.8292944  1.3708088  0.3081225  1.1603196
## Nebraska   27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              1              1              2              1 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              1              2              2              1              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              2              2              1              2              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              2              2              1              2              1 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              2              1              2              1              1 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              1              2              2 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              1              1              1              2              2 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              2              2              2              2              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              1              2              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              2              2              2              2              2 
## Objective function:
##    build     swap 
## 1.441358 1.368969 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

Ahora usando 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
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
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

Visualización de clúster en paquete PAM

fviz_cluster(pam.res,
palette = c("#00AFBB", "#FC4E07"), 
ellipse.type = "t", 
repel = TRUE, 
ggtheme = theme_classic()
)

Capitulo 6

CLARA

set.seed(1234)
# 500 datos
df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))
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
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()

# Comparando CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
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"
dd <- cbind(df, cluster = clara.res$cluster)
head(dd, n = 4)
##             x        y cluster
## S1  -9.656526 3.881815       1
## S2   2.219434 5.574150       1
## S3   8.675529 1.484111       1
## S4 -18.765582 5.605868       1
clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
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

Visualización de los cluster con el paquete clara

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

Ejercicio 7

clúster aglomerativo

# Datos
data("USArrests")
df <- scale(USArrests)
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
res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:6, 1:6]
##             Alabama   Alaska  Arizona Arkansas California Colorado
## Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
## Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
## Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
## Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
## Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000
res.hc <- hclust(d = res.dist, method = "ward.D2")

Dendograma

library("factoextra")
fviz_dend(res.hc, cex = 0.5)
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
##   Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

res.coph <- cophenetic(res.hc)
cor(res.dist, res.coph)
## [1] 0.6975266
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382
# 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Número de miembros de cada clúster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Obtener los nombres de los miembros del clúster 1
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# Resalatar los 4 grupos
fviz_dend(res.hc, k = 4, # cortar los 4 grupos
cex = 0.5, # tamaño de etiqueta
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", # Concentración ellipse
repel = TRUE, 
show.clust.cent = FALSE, ggtheme = theme_minimal())

library("cluster")
# Agrupamiento jerárquico
res.agnes <- agnes(x = USArrests, # Matriz de datos
stand = TRUE, # Standarización de datos
metric = "euclidean", # Distancía métrica de datos
method = "ward" # Método de vinculació
)
# Agrupamienrto de análisis
res.diana <- diana(x = USArrests, # Matriz de datos
stand = TRUE, # Estandarización de datos
metric = "euclidean" # Distancía métrica de datos
)
fviz_dend(res.agnes, cex = 0.6, k = 4)

Ejercicio 8

Comparación de dendogramas

df <- scale(USArrests)
# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]
library(dendextend)
# Calcular matriz de distancias
res.dist <- dist(df, method = "euclidean")
# Cálculo de 2 agrupaciones jerárquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Creación de dos dendrogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Crear una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)

Visualizació de demdograma

tanglegram(dend1, dend2)

tanglegram(dend1, dend2,
highlight_distinct_edges = FALSE, # Desactivar líneas discontinuas
common_subtrees_color_lines = FALSE, 
common_subtrees_color_branches = TRUE, 
main = paste("entanglement =", round(entanglement(dend_list), 2))
)

# Matriz de correlación cophenetic
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Matriz de correlación baker
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
# Coeficinete de correlación Cophenetic 
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Coeficiente de correlació Baker 
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
# comparación de dendogramas
# Creación de varios dendrogramas mediante el 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
# Compute correlation matrix
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)
# 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
# Visualice la matriz de correlación mediante el paquete corrplot
library(corrplot)
## corrplot 0.95 loaded
corrplot(cors, "pie", "lower")

Ejercicio 9

visualización de dendograma

# Datos
data(USArrests)
# Calcular distancias y agrupación jerárquica
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
library(factoextra)
fviz_dend(hc, cex = 0.5)

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

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

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

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

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

# Datos de ejemplo
data <- USArrests
dist_matrix <- dist(scale(data))  # Matriz de distancias
hc <- hclust(dist_matrix, method = "ward.D2")  # Clustering jerárquico
fviz_dend(hc,
          k = 4,                      # Cortar en 4 grupos
          cex = 0.5,                  # Tamaño de etiquetas
          rect = TRUE,                # Añadir rectángulos
          rect_fill = TRUE,           # Rellenar rectángulos
          k_colors = "jco"            # Usa una paleta predefinida
)

fviz_dend(hc,
          k = 4,                       # Cortar en 4 grupos
          cex = 0.5,                   # Tamaño de etiquetas
          rect = TRUE,                 # Añadir rectángulos
          rect_fill = TRUE,            # Rellenar rectángulos
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")  # Colores personalizados
)

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
)

fviz_dend(hc, cex = 0.5, k = 4, # Cut in four groups
k_colors = "jco")

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

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

require("igraph")
fviz_dend(hc, k = 4, k_colors = "jco",
type = "phylogenic", repel = TRUE)

require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")

fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

# Create a plot of the whole dendrogram,
# and extract the dendrogram data
dend_plot <- fviz_dend(hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = "jco"
)
dend_data <- attr(dend_plot, "dendrogram") # Extract dendrogram data
# Cut the dendrogram at height h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualize the truncated version containing
# two branches
fviz_dend(dend_cuts$upper)
## Warning in min(-diff(our_dend_heights)): ningún argumento finito para min;
## retornando Inf

# Plot subtree 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

# Plot subtree 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

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

pdf("dendrogram.pdf", width=30, height=15) # Open a PDF
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" ) 
print(p)
dev.off()
## png 
##   2
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. Create a customized dendrogram
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>% # Branches line width
set("branches_k_color", mycols, k = 4) %>% # Color branches by groups
set("labels_colors", mycols, k = 4) %>% # Color labels by groups
set("labels_cex", 0.5) # Change label size
# 2. Create plot
fviz_dend(dend)