UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
MÉTODOS PARA EL ANALISIS ECONOMICO
DOCENTE:
MSF. Carlos Ademir Pérez Alas.
Grupo de Teorico
Grupo 03
| Integrantes: | Carnet: |
|---|---|
| Alas Duarte Fátima Lourdes | AD22008 |
| Belloso Martínez Gabriela Alexandra | MP22010 |
| López Gonzalez Vanessa Iveth | LG20034 |
| Rivas Alvarado Fátima Alejandra | RA22087 |
CIUDAD UNIVERSITARIA, 23 DE NOVIEMBRE DE 2024
El análisis de conglomerados, también conocido como clustering, es una técnica utilizada en minería de datos dentro del aprendizaje no supervisado. Su propósito es agrupar un conjunto de objetos en subconjuntos llamados clusters o conglomerados, basándose en su similitud. Sus características son:
No requiere datos previamente etiquetados. Es decir, los grupos se forman únicamente a partir de las características de los datos.
Emplea métricas como la distancia euclidiana, Manhattan o coeficientes de correlación para medir las similitudes entre los objetos.
Es aplicable a conjuntos de datos pequeños y también a grandes volúmenes.
El análisis de conglomerados tiene como meta organizar los datos en grupos homogéneos que cumplan con las siguientes condiciones:
Alta similitud intra-grupo: Los elementos dentro de un mismo cluster deben ser lo más parecidos posible.
Baja similitud inter-grupos: Los clusters resultantes deben ser claramente distintos entre sí.
Fuente: Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.).
|
Análisis Clúster |
Técnicas disponibles |
Ventajas |
Desventajas |
|
Jerárquico: Técnica de agrupamiento que organiza datos en una estructura jerárquica que son similares. No se conoce previamente el número de grupos a formar.
|
Aglomerativos:
Disociativos:
|
|
|
|
No Jerárquico: Se busca asignar cada individuo al grupo cuyo centroide (media) le sea más cercano.
En los métodos no jerárquicos se busca maximizar la homogeneidad dentro de los grupos y la heterogeneidad entre ellos, permitiendo que las observaciones cambien de grupo durante el proceso de agrupación.
|
Reasignación
Nubes Dinámicas
|
|
|
Fuente: Elaboración propia con base en Análisis conglomerados. De la Fuente Fernández, S. (2011). y Desarrollo del Análisis Cluster en R. Landa Baella, María del Pilar.
JERÁRQUICO
Según De la Fuente, (2011) el objetivo de los métodos jerárquicos es “Agrupar cluster para formar uno nuevo o separar alguno ya existente para dar origen a otros dos de forma que se maximice una medida de similaridad o se minimice alguna distancia.” Es decir, unir grupos para formar uno nuevo, o dividir uno ya existente en dos nuevos, para que los elementos dentro de cada grupo se parezcan lo más posible entre sí o estén lo más lejos posible de otros grupos. Estos se clasifican en:
Sociativos o Aglomerativos: De la Fuente (2011), explica, que en estos métodos se comienza considerando a cada individuo como un grupo independiente y se van fusionando progresivamente los grupos más similares hasta que todos los individuos pertenecen a un solo grupo.
Disociativos: En contrariedad al método Asociativo, en el disociativo se comienza con un solo grupo que incluye a todos los individuos, y mediante divisiones sucesivas, se van formando grupos más pequeños hasta que cada individuo se convierte en su propio grupo.
A Continuación se presenta una implementación en R sobre los métodos disociativos jerárquicos, donde se aplicó el método de Ward a los datos del conjunto USArrests para identificar agrupamientos entre los estados de EE.UU. basados en variables de arrestos. Ward generó el dendrograma de agrupamiento, permitiendo la identificación de 4 grupos claramente diferenciados dentro de los datos.
# Cargar las librerías necesarias
# Se cargan las librerías 'factoextra' y 'cluster', que se utilizarán para análisis y visualización de datos de agrupamiento.
library(factoextra)
library(cluster)
# Cargar el conjunto de datos 'USArrests'
# Se utiliza el conjunto de datos 'USArrests' que contiene estadísticas de arrestos en cada estado de EE.UU.
data("USArrests")
# Estandarizar los datos
# Escala (estandariza) las variables para que tengan media 0 y desviación estándar 1.
df <- scale(USArrests)
# Mostrar las primeras 6 filas de los datos estandarizados
# Muestra la cabeza del conjunto de datos, es decir, las primeras 6 filas, para verificar los datos estandarizados.
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
# Calcular la matriz de disimilitud
# Calcula la matriz de disimilitud entre cada par de observaciones utilizando la distancia euclidiana.
res.dist <- dist(df, method = "euclidean")
# Mostrar las primeras 6x6 de la matriz de disimilitud
# Muestra una porción de la matriz de disimilitud (6 filas y 6 columnas) para ver las distancias entre observaciones.
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
# Agrupamiento jerárquico utilizando el método Ward.D2
# Aplica el método de agrupamiento jerárquico Ward.D2 para construir un árbol de agrupamiento en función de las distancias calculadas.
res.hc <- hclust(d = res.dist, method = "ward.D2")
# Agrupamiento jerárquico aglomerativo con agnes
# Usa la función 'agnes' para realizar un agrupamiento jerárquico aglomerativo en los datos.
res.agnes <- agnes(
USArrests, # Matriz de datos original
stand = TRUE, # Estandarizar los datos
metric = "euclidean",# Métrica de distancia
method = "ward" # Método de vinculación
)
# Agrupamiento jerárquico divisivo con diana
# Usa la función 'diana' para realizar un agrupamiento jerárquico divisivo en los datos.
res.diana <- diana(
USArrests, # Matriz de datos original
stand = TRUE, # Estandarizar los datos
metric = "euclidean"# Métrica de distancia
)
# Visualizar el dendrograma y cortar el árbol jerárquico en 4 grupos
# Visualiza el dendrograma del agrupamiento jerárquico y lo divide en 4 grupos.
fviz_dend(res.agnes, cex = 0.6, k = 4)NO JERÁRQUICOS Los métodos no jerárquicos “Están diseñados para la clasificación de individuos (no de variables) en K grupos. El procedimiento es elegir una partición de los individuos en K grupos e intercambiar los miembros de los clusters para tener una partición mejor.” (De la Fuente, 2011) Se clasifican en:
Reasignación: K-medias y nubes didácticas.
Búsqueda de densidad: Método de Wolf, Método de Fortin, Métodos Taxap, Análisis Modal.
Métodos directos: Block Clustering.
Métodos reductivos: Análisis Factorial tipo Q.
Implementaremos a modo de explicación el método K-means y PAM. El método K-medias, no crea una jerarquía de clústeres. En lugar de eso, divide el conjunto de datos en un número fijo de clústeres (en este caso 4) basándose en las distancias entre los puntos y los centros de los clústeres (centroides). En cambio el método PAM, los “centroides” son puntos reales de los datos llamados medoids. Es decir, un “medoid” es el punto más cercano a todos los demás puntos en su clúster.
# Cargar y escalar los datos
data("USArrests") # Carga el conjunto de datos USArrests, que contiene datos de crímenes en Estados Unidos.
df <- scale(USArrests) # Escala los datos para que todas las variables tengan media 0 y desviación estándar 1. Esto es importante para evitar que las variables con rangos más grandes dominen el análisis.
head(df, n = 3) # Muestra las primeras tres filas para visualizar cómo se ven los datos escalados.## 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
# Configuración para clustering K-means
library(factoextra) # Paquete para la visualización de los resultados de clustering.
set.seed(123) # Fija la semilla aleatoria para asegurar que los resultados sean reproducibles. Esto es útil si queremos obtener el mismo resultado cada vez que ejecutemos el código.
km.res <- kmeans(df, centers = 4, nstart = 25) # Ejecuta el algoritmo K-means con 4 clústeres. 'nstart = 25' significa que el algoritmo hará 25 inicios aleatorios para evitar caer en soluciones subóptimas.
# Imprimir los resultados de K-means
print(km.res) # Muestra los resultados del clustering K-means: asignación de clústeres y los centroides de cada clúster.## 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"
# Visualización de los clústeres obtenidos por K-means
fviz_cluster(km.res, data = df, geom = "point", ellipse.type = "convex", ggtheme = theme_minimal()) # Visualiza los resultados del clustering K-means. Los puntos se asignan a los clústeres, y las elipses convexas rodean cada clúster, ayudando a visualizar los grupos.# Configuración para clustering PAM (Partitioning Around Medoids)
library(cluster) # Paquete necesario para ejecutar el algoritmo PAM.
library(fpc) # Paquete que incluye la función pamk() para encontrar el número óptimo de clústeres automáticamente.
# Ejecutar PAM con k = 4 medoids
pam.res <- pam(df, k = 4) # Ejecuta el algoritmo PAM con 4 clústeres (medoids). A diferencia de K-means, PAM usa puntos reales de los datos como los "medoids" (representantes del clúster).
# Visualizar los clústeres de PAM
fviz_cluster(pam.res, data = df, geom = "point", ellipse.type = "convex", ggtheme = theme_minimal()) # Similar a K-means, se visualizan los resultados de PAM mostrando los puntos de los datos y las elipses convexas alrededor de cada clúster.
# Alternativa: Usar pamk() para seleccionar automáticamente el número óptimo de clústeres
pamk.res <- pamk(df) # pamk() selecciona automáticamente el número óptimo de clústeres basado en un criterio de validación interna.
# Visualizar los resultados de pamk() con el número óptimo de clústeres
fviz_cluster(pamk.res$pamobject, data = df, geom = "point", ellipse.type = "convex", ggtheme = theme_minimal()) # Visualiza los resultados de PAM con el número óptimo de clústeres determinado por pamk().
# Imprimir los resultados de PAM
print(pam.res) # Muestra los resultados del algoritmo PAM con los medoids y las asignaciones de los clústeres.## Medoids:
## ID Murder Assault UrbanPop Rape
## Alabama 1 1.2425641 0.7828393 -0.5209066 -0.003416473
## Michigan 22 0.9900104 1.0108275 0.5844655 1.480613993
## Oklahoma 36 -0.2727580 -0.2371077 0.1699510 -0.131534211
## New Hampshire 29 -1.3059321 -1.3650491 -0.6590781 -1.252564419
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 1 2 2 1 2
## Colorado Connecticut Delaware Florida Georgia
## 2 3 3 2 1
## Hawaii Idaho Illinois Indiana Iowa
## 3 4 2 3 4
## Kansas Kentucky Louisiana Maine Maryland
## 3 3 1 4 2
## Massachusetts Michigan Minnesota Mississippi Missouri
## 3 2 4 1 3
## Montana Nebraska Nevada New Hampshire New Jersey
## 3 3 2 4 3
## New Mexico New York North Carolina North Dakota Ohio
## 2 2 1 4 3
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 3 3 3 3 1
## South Dakota Tennessee Texas Utah Vermont
## 4 1 2 3 4
## Virginia Washington West Virginia Wisconsin Wyoming
## 3 3 4 4 3
## Objective function:
## build swap
## 1.035116 1.027102
##
## Available components:
## [1] "medoids" "id.med" "clustering" "objective" "isolation"
## [6] "clusinfo" "silinfo" "diss" "call" "data"
El método del codo (wss) evalúa la suma total de distancias intracluster para diferentes valores de 𝑘.
library(factoextra)
data("USArrests")
df <- scale(USArrests) # Escala las variables para que tengan media 0 y desviación estándar 1
# Visualización del número óptimo de clusters según el método del codo
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2) # El libro sugiere que el codo aparece en k=4El cálculo incluye 25 inicializaciones para minimizar el riesgo de converger a un mínimo local.
set.seed(123) # Aseguramos resultados reproducibles
km.res <- kmeans(df, centers = 4, nstart = 25)
# Imprimir el resultado del clustering
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"
El libro sugiere usar aggregate para calcular los promedios de las variables por cluster y agregar los resultados al dataset 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
# Agregar la columna de asignación de clusters al dataset original
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
El libro indica el uso de PCA para reducir la dimensionalidad y graficar los clusters en un espacio bidimensional. La visualización utiliza fviz_cluster.
library(factoextra)
# Visualización de clusters
fviz_cluster(
km.res,
data = df,
palette = c("#2E9FDF", "#00AFBB", "#E8B800", "#FF4E07"),
ellipse.type = "euclid", # Basado en distancias euclidianas
star.plot = TRUE, # Conexión de puntos al centroide
repel = TRUE, # Evita superposiciones
ggtheme = theme_minimal()
)El libro utiliza el método silhouette para determinar el número adecuado de clusters.
library(cluster)
# Determinar el número óptimo de clusters
fviz_nbclust(df, pam, method = "silhouette") +
theme_classic()El clustering PAM se centra en la selección de medoids, que son puntos representativos dentro de los clusters.
## 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"
Como en el caso de K-means, el libro indica cómo agregar la columna de clusters y obtener los medoids.
# Agregar la asignación de clusters al dataset original
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd)## 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
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
El libro sugiere el uso de fviz_cluster para visualizar los resultados, resaltando los medoids como centros de los clusters.
fviz_cluster(
pam.res,
palette = c("#00AFBB", "#FC4E07"),
ellipse.type = "t", # Elipses basadas en la distribución t
repel = TRUE,
ggtheme = theme_minimal()
)# Este código sirve para determinar el número óptimo de clústeres en un conjunto de datos (df) utilizando el algoritmo CLARA (Clustering Large Applications) y el método del coeficiente de silueta. ## Call: clara(x = df, k = 2, samples = 50, pamLike = TRUE)
## Medoids:
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Objective function: 1.368969
## Clustering vector: Named int [1:50] 1 1 1 2 1 1 2 2 1 1 2 2 1 2 2 2 2 1 ...
## - attr(*, "names")= chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" "California" "Colorado" "Connecticut" ...
## Cluster sizes: 20 30
## Best sample:
## [1] Alabama Arizona California Colorado Connecticut
## [6] Delaware Georgia Idaho Illinois Iowa
## [11] Kansas Kentucky Louisiana Maine Maryland
## [16] Massachusetts Michigan Minnesota Mississippi Missouri
## [21] Montana Nebraska Nevada New Hampshire New Mexico
## [26] New York North Carolina North Dakota Ohio Oklahoma
## [31] Oregon Pennsylvania Rhode Island South Carolina South Dakota
## [36] Tennessee Texas Utah Vermont Virginia
## [41] Washington West Virginia Wisconsin Wyoming
##
## Available components:
## [1] "sample" "medoids" "i.med" "clustering" "objective"
## [6] "clusinfo" "diss" "call" "silinfo" "data"
# Este código utiliza la función clara del paquete cluster para realizar un análisis de agrupamiento en el conjunto de datos df. Se aplica el método CLARA (Clustering Large Applications), diseñado para trabajar con grandes conjuntos de datos. ## Murder Assault UrbanPop Rape cluster
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473 1
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941 1
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388 1
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602 2
## 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
## Connecticut Delaware Florida Georgia
## 2 2 1 1
fviz_cluster(
clara.res,
palette = c("#09DFBB", "#FC4E97"),
ellipse.type = "t",
geom = "point",
pointsize = 1,
ggtheme = theme_classic()
)## 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
## [1] 0.6975266
## [1] 0.7180382
## 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"
fviz_dend(
res.hc,
k = 4,
cex = 0.5,
k_colors = c("#1b0DDF", "#01B1BB", "#A7B200", "#BB4E16"),
color_labels_by_k = TRUE,
rect = TRUE
)# Este código genera un dendrograma del análisis de agrupamiento jerárquico previamente realizado, aplicando personalizaciones como el número de clústeres deseado, colores específicos y la visualización de rectángulos para destacar los clústeres.fviz_cluster(
list(data = df, cluster = grp),
palette = c("#1b0DDF", "#01B1BB", "#A7B200", "#BB4E16"),
ellipse.type = "convex",
repel = TRUE,
show.clust.cent = FALSE,
ggtheme = theme_minimal()
)res.agnes <-
agnes(
x = USArrests,
stand = TRUE,
metric = "euclidean",
method = "ward"
)
res.diana <-
diana(x = USArrests, stand = TRUE, metric = "euclidean")
fviz_dend(res.agnes, cex = 0.6, k = 4)El libro ocupa el paquete dendextend proporciona varias funciones para comparar dendrogramas. Y se centra en dos funciones:
tanglegram() para la comparación visual de dos dendrogramas.
cor.dendlist() para calcular una matriz de correlación entre dendrogramas.
# Cálculo de agrupamiento jerárquico (HC) utilizando dos métodos de ligamiento diferentes ("average" y "ward". D2").
library(dendextend)
# Calcular matriz de distancia
res.dist <- dist(df, method = "euclidean")
# Calcular 2 agrupaciones jerárquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
#Crear dos dendogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
#Crear una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)
tanglegram(dend1, dend2) #Comparación de dendrogramas usando la función de tanglegram# Personalización del dendrogramas
tanglegram(dend1,dend2,
highlight_distinct_edges=FALSE, #Desactivar líneas discontinuas
common_subtrees_color_lines=FALSE, #Desactivar colores de líneas
common_subtrees_color_branches=TRUE, #Colorear ramas comunes
main=paste("entanglement=",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
## [1] 0.9925544
## [1] 0.9895528
# Crear múltiples dendrogramas encadenando
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
dend_list <-
dendlist(
"Complete" = dend1,
"Single" = dend2,
"Average" = dend3,
"Centroid" = dend4
)
cors <- cor.dendlist(dend_list)
# Imprimir matriz de correlaciones
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
# Visualiza la matriz de correlaciones usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")#Carga de datos
data(USArrests)
# Calcular distancias y agrupación jerárquicas
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, #Cortado en cuatro
cex = 0.5, #tamaño de la etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, #colorear etiquetas por grupos
ggtheme = theme_gray() #cambiar tema
) require("igraph")
fviz_dend(hc, k=4, # Cut in four groups
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")# Crear un gráfico de todo el dendrograma, y extraer los datos del dendrograma
dend_plot <- fviz_dend(hc,
k = 4, #Cortar en cuatro grupos
cex = 0.5, #tamaño de la etiqueta
k_colors = "jco"
)
dend_data <- attr(dend_plot, "dendrogram") #Extraer los datos del dendrograma
dend_cuts <- cut(dend_data, h = 10) #Corta el dendrograma a la altura h=10
fviz_dend(dend_cuts$upper) # Visualiza la versión truncada que contiene dos ramasdata <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)dend <- USArrests[1:5, ] %>% #datos
scale %>% #escala de datos
dist %>% #calcular una matriz de distancias
hclust(method = "ward.D2") %>% #agrupación jerárquica
as.dendrogram #convierte el objeto en un dendrograma
plot(dend)# Funciones para personalizar un dendrograma
library(dendextend)
# 1. Crear un dendrograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1)%>% #Ancho de línea de las ramas
set("branches_k_color",mycols,k=4)%>% #Colorear las ramas por grupos
set("labels_colors",mycols,k=4)%>% #Colorear las etiquetas por grupos
set("labels_cex", 0.5) #Cambiar el tamaño de las etiquetas
# 2. Crear parcela
fviz_dend(dend)Kassambara, Alboukadel. 2017. Practical Guide to Cluster Analysis in r: Unsupervised Machine Learning. Vol. 1. Sthda.STHDA, disponible en: https://drive.google.com/file/d/1iOUDLsbrUgS-ypVLaZ3tU60AulQn2VPv/view?usp=sharing
De la Fuente Fernández, Santiago. 2011. “Análisis Conglomerados.” Facultad de Ciencias Económicas y Empresariales de La Universidad Autónoma Madrid.
Galili, Tal. 2015. “Dendextend: An r Package for Visualizing, Adjusting, and Comparing Trees of Hierarchical Clustering.” Bioinformatics. https://doi.org/10.1093/bioinformatics/btv428.
Galili, Tal, and Gregory Jefferis. 2022. Dendextend: Extending Dendrogram Functionality in r. https://CRAN.R-project.org/package=dendextend.