UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

METODOS PARA EL ANALISIS ECONÓMICO

MSF. Carlos Ademir Pérez Alas.

GRUPO TEÓRICO:

02

INTEGRANTES:

MF21013 Ruth Noemi Mendez Flores

CH19009, Andrea Esmeralda Cortez Herrera

Ciudad Universitaria, 22 de noviembre de 2024.

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

ANÁLISIS DE CLUSTER (CONGLOMERADOS)

El Análisis Cluster, también conocido como Análisis de Conglomerados, es una técnica estadística multivariante que busca agrupar elementos (o variables) y que trata de lograr la máxima homogeneidad en cada grupo y la mayor diferencia entre grupos tambien cabe destacar que tiene una gran importancia en aplicación en muchas áreas de investigación. Pero, con los beneficios del Análisis Cluster existen algunas desventajas. El Análisis de Cluster es una técnica descriptiva, ateórica y no inferencial. Este Análisis no tiene bases estadísticas para deducir inferencias estadísticas sobre una población a partir de una muestra, es un método que se basa en criterios geométricos y es utilizado fundamentalmente como una técnica exploratoria, descriptiva pero no explicativa.

Existen dos grandes tipos de análisis de clusters: Jerárquicos y No Jerárquicos.

Metodos Jerarquicos: Se basan en el cálculo de una matriz de distancias y se aplican con n<200, ya que los cálculos y resultados se complican al aumentar el tamaño de la muestra. Estos métodos se caracterizan por no permitir una reasignación en los grupos, es decir, que dos clusters o individuos unidos durante el proceso, no pueden separarse en etapas decisivas.

Se pueden aplicar a variables o a observaciones:

Si se agrupan variables se necesitan de tres o más variables numéricas. Si se agrupan observaciones se necesita al menos una variable numérica. Dada la matriz, los algoritmos son de dos tipos:

  1. De aglomeración: También se denominan ascendentes. Parten de objetos singulares (cada objeto es un conglomerado) para ir construyendo conglomerados cada vez más complejos, hasta concluir en uno sólo. Requieren menor tiempo y son los más utilizados.

  2. De división: Parten del conjunto de datos y se van dividiendo hasta crear uno solo, los elementos que se incluyen en un grupo no se pueden reasignar.

Un dendograma es una representación gráfica con forma de árbol que sirve para resumir el proceso de agrupación del análisis de clusters.Los objetos similares están conectados por enlaces y su posición, en el diagrama, está determinada por el nivel de similitud o disimilitud de los objetos.

Metodos no jerarquicos: También conocidos como métodos de “optimización.” Estos métodos si permiten una reasignación en los grupos, aunque se vuelve necesario fijar de antemano el número de clusters deseado.

Se utilizan cuando:

Los métodos de reasignación permiten reasignar objetos a distintos conglomerados en cada fase. Los métodos de búsqueda de densidad se agrupan mediante la búsqueda de altas densidades (modas). Los métodos directos permiten clasificar de forma simultánea individuos y variables. Estos métodos son:

  1. Reasignación: Permite que un individuo ya asignado a un grupo en una determinada etapa del proceso sea reasignado a otro grupo en una etapa anterior, si con esto optimiza el criterio de selección. Este proceso termina cuando no existan individuos cuya reasignación permita optimizar el resultado que se ha obtenido. En esta categoría se encuentran los métodos de:

  2. Búsqueda de densidad: Los métodos que se encuentran en esta categoría, tienen su base en la suposición de que los puntos pertenecientes a cada cluster se extraen de una distribución de probabilidad particular. Los métodos de densidad proporcionan una aproximación tipológica y una aproximación probabilística.

Aproximación tipológica: En los métodos de aproximación tipológica, los grupos que se van formando buscan zonas en las que se da una mayor concentración de individuos.

Aproximación probabilística: Los métodos de aproximación probabilística, parten del postulado que las variables prosiguen una ley de probabilidad, por la cual, los parámetros varían de un grupo a otro. Trata de encontrar individuos pertenecientes a una misma distribución, introduciendo el cluster en la inferencia estadística. El por qué de los clusters es explicado por la existencia de poblaciones distintas y cómo descubrirlas.

Es importante establecer algunas diferencias básicas entre los métodos:

Métodos Jerárquicos:

-Comienza con las observaciones y no precisa determinar a priori el número de conglomerados.

-La asignación de objetos es definitiva.

-Operan con una matriz de similaridades.

Métodos No Jerárquicos:

-Comienza con una partición inicial de conglomerados. A priori se determina el número y composición de los conglomerados.

-El procedimiento es iterativo y permite la reasignación de objetos.

-Operan con la matriz de datos originales.

En Resumen, los usos que se le pueden dar al análisis cluster se puede representar en los siguientes cuatro puntos:

Desarrollar una tipología o clasificación. Investigar esquemas conceptuales útiles para agrupar entidades. Generar hipótesis a través de la exploración de los datos. Intentar determinar si tipos definidos por otros procedimientos están de hecho presentes en un conjunto de datos. (Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA,)

2. Elabore un cuadro comparativo

library(dplyr)
library(knitr)
library(kableExtra)
# Datos de análisis de clúster
analisis_cluster <- c(
  "Jerárquico:
Los métodos jerárquicos tienen como objetivo la formación de nuevos grupos al agrupar clústeres o separar los existentes para generar otros dos, de manera que, al repetir este proceso de aglomeración o división, se minimice alguna distancia o se maximice alguna medida de similitud. Estos métodos se dividen en dos categorías principales: Agrupamiento Aglomerativo y Disociativo.En este análisis se busca agrupar clúster para formar uno nuevo o separar alguno que existía para dar origen a otros dos maximizando la similaridad o se minimice la distancia.",
  "No jerárquico: 
 Es aquel análisis que asigna casos o grupos diferenciados y los configura de manera que unos dependan de otros. A su vez, produce clusters disjuntos (cada caso es un grupo), o bien clusters solapados (un caso puede pertenecer a más de un grupo). Esta técnica es valiosa en una variedad de disciplinas, desde la investigación científica hasta el análisis de mercado, ya que puede revelar patrones y estructuras subyacentes que no son evidentes a simple vista."
)
# Técnicas disponibles
tecnicas_disponibles <- c(
  paste(
  "Aglomerativo",
"• Linkage Simple.",
"• Linkage Completo.",
"• Promedio entre grupos.",
"• Método del centroide.",
"• Método de la mediana.",
"• Método de Ward.",
"• Dendrograma.",
"• Mapa de Calor.",
"\nDisociativos",
"• Linkage Simple.",
"• Linkage Completo.",
"• Promedio entre grupos.",
"• Método del centroide.",
"• Método de la mediana.",
"• Método de Ward.",
"• Análisis de asociación.",
"• Detector Automático de Interacción.",
 sep = "\n"
  ),
  paste(
"Métodos de Reasignación:",
"• Centroides.",
"• PAM.",
"• CLARA.",
"• K-medias.",
"• Quick-Cluster.",
"• Método de Forgy.",
"• Nubes Dinámicas.",
"Búsqueda de densidad:",
"• Aproximación Tipológica.",
"• Análisis Modal.",
"• Método Taxmap.",
"• Método de Fortín.",
"Aprobación Probabilística:",
"• Método de Wolf.",
"Métodos Directos: Block-Clustering.",
"Métodos Reductivos: Análisis Factorial tipo Q.",
 sep = "\n"
  )
)
# Ventajas
ventajas <- c(
"•  El método jerárquico sugiere naturalmente la cantidad de clústeres presentes en los datos, ya que el dendrograma proporciona una representación visual de cómo se agrupan las observaciones a diferentes niveles de similitud.

• No es necesario especificar el número de clústeres

• Fácil implementación

• Dendrograma informativo

• Visualización simultánea de grupos de muestras y características",
"• Fácil de entender, fácil de adaptar: Los métodos no jerárquicos, como K-medoids, son conocidos por su simplicidad y facilidad de comprensión. Además, son adaptables a diferentes conjuntos de datos y resultan intuitivos en términos de interpretación.

• Eficiente y adecuado para conjuntos de datos grandes o pequeños

• Buen desempeño: Los métodos no jerárquicos, como K-medoids, a menudo exhiben un buen rendimiento en términos de identificación de clústeres significativos y representativos.

• Robustez frente a outliers o ruido: Una característica clave de K-medoids es su robustez ante la presencia de outliers o ruido en el conjunto de datos."
)
 # Desventajas
desventajas <- c(
"• Anidamiento restrictivo es una desventaja en la que la asignación de elementos a grupos puede no ser ideal, ya que no se permite la flexibilidad de pertenencia a múltiples clústeres.

• Dendrograma producido es muy útil para comprender los datos: Esto también se presenta como una ventaja. El dendrograma es una representación gráfica útil para entender las relaciones jerárquicas entre los clústeres y las observaciones.",

"•Necesita que el usuario defina el número de clústeres: Este es uno de los desafíos más comunes de los métodos no jerárquicos, como K-means. 
• Sensible a ruido: Los métodos no jerárquicos, como K-means, son sensibles a la presencia de ruido en los datos, lo que puede afectar la calidad de los clústeres identificados.

• Variabilidad en función de las semillas: Los resultados de los métodos no jerárquicos pueden variar según las semillas iniciales elegidas al inicio del algoritmo. Esto puede llevar a soluciones subóptimas o diferentes en ejecuciones separadas.

• Problemas de robustez: La sensibilidad a las condiciones iniciales y la presencia de datos atípicos pueden hacer que los métodos no jerárquicos, como K-means, sean menos robustos en comparación con otros métodos en ciertas situaciones.

• Tasa de convergencia menor con algunas semillas: La elección de ciertas semillas iniciales puede resultar en una tasa de convergencia más lenta en el proceso de agrupamiento.

• Selección de semillas basada en heurísticas o resultados obtenidos por otros métodos: La elección de semillas iniciales puede depender de heurísticas o resultados obtenidos por otros métodos, lo que introduce cierta subjetividad en el proceso.

• Puede caer en mínimos locales: Dado que K-means busca optimizar una función objetivo, puede converger hacia mínimos locales, lo que puede afectar la calidad de los clústeres identificados."
)
# Marco de los datos
cuadro_comparativo <- tibble(
  `Análisis de Clúster` = analisis_cluster,
  `Técnicas Disponibles` = tecnicas_disponibles,
  `Ventajas` = ventajas,
  `Desventajas` = desventajas
)
# Presentacion de la tabla
cuadro_comparativo %>%
  kable(format = "html") %>%
  row_spec(0, background = "#E65554", bold = T, align = "c") %>%
  column_spec(c(1), width = "7cm", border_right = T) %>%
  column_spec(c(2), border_right = T) %>%
  column_spec(c(3), border_right = T) %>%
  column_spec(c(4), border_right = T) %>%
  kable_styling("hover") %>%
  footnote(general = "Fuente:  Elaboración propia con base en (Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA,)")
Análisis de Clúster Técnicas Disponibles Ventajas Desventajas
Jerárquico: Los métodos jerárquicos tienen como objetivo la formación de nuevos grupos al agrupar clústeres o separar los existentes para generar otros dos, de manera que, al repetir este proceso de aglomeración o división, se minimice alguna distancia o se maximice alguna medida de similitud. Estos métodos se dividen en dos categorías principales: Agrupamiento Aglomerativo y Disociativo.En este análisis se busca agrupar clúster para formar uno nuevo o separar alguno que existía para dar origen a otros dos maximizando la similaridad o se minimice la distancia.

Aglomerativo • Linkage Simple. • Linkage Completo. • Promedio entre grupos. • Método del centroide. • Método de la mediana. • Método de Ward. • Dendrograma. • Mapa de Calor.

Disociativos • Linkage Simple. • Linkage Completo. • Promedio entre grupos. • Método del centroide. • Método de la mediana. • Método de Ward. • Análisis de asociación. • Detector Automático de Interacción.

• El método jerárquico sugiere naturalmente la cantidad de clústeres presentes en los datos, ya que el dendrograma proporciona una representación visual de cómo se agrupan las observaciones a diferentes niveles de similitud.

• No es necesario especificar el número de clústeres

• Fácil implementación

• Dendrograma informativo

• Visualización simultánea de grupos de muestras y características

• Anidamiento restrictivo es una desventaja en la que la asignación de elementos a grupos puede no ser ideal, ya que no se permite la flexibilidad de pertenencia a múltiples clústeres.

• Dendrograma producido es muy útil para comprender los datos: Esto también se presenta como una ventaja. El dendrograma es una representación gráfica útil para entender las relaciones jerárquicas entre los clústeres y las observaciones.
No jerárquico: Es aquel análisis que asigna casos o grupos diferenciados y los configura de manera que unos dependan de otros. A su vez, produce clusters disjuntos (cada caso es un grupo), o bien clusters solapados (un caso puede pertenecer a más de un grupo). Esta técnica es valiosa en una variedad de disciplinas, desde la investigación científica hasta el análisis de mercado, ya que puede revelar patrones y estructuras subyacentes que no son evidentes a simple vista. Métodos de Reasignación: • Centroides. • PAM. • CLARA. • K-medias. • Quick-Cluster. • Método de Forgy. • Nubes Dinámicas. Búsqueda de densidad: • Aproximación Tipológica. • Análisis Modal. • Método Taxmap. • Método de Fortín. Aprobación Probabilística: • Método de Wolf. Métodos Directos: Block-Clustering. Métodos Reductivos: Análisis Factorial tipo Q.

• Fácil de entender, fácil de adaptar: Los métodos no jerárquicos, como K-medoids, son conocidos por su simplicidad y facilidad de comprensión. Además, son adaptables a diferentes conjuntos de datos y resultan intuitivos en términos de interpretación.

• Eficiente y adecuado para conjuntos de datos grandes o pequeños

• Buen desempeño: Los métodos no jerárquicos, como K-medoids, a menudo exhiben un buen rendimiento en términos de identificación de clústeres significativos y representativos.

• Robustez frente a outliers o ruido: Una característica clave de K-medoids es su robustez ante la presencia de outliers o ruido en el conjunto de datos.

•Necesita que el usuario defina el número de clústeres: Este es uno de los desafíos más comunes de los métodos no jerárquicos, como K-means. • Sensible a ruido: Los métodos no jerárquicos, como K-means, son sensibles a la presencia de ruido en los datos, lo que puede afectar la calidad de los clústeres identificados.

• Variabilidad en función de las semillas: Los resultados de los métodos no jerárquicos pueden variar según las semillas iniciales elegidas al inicio del algoritmo. Esto puede llevar a soluciones subóptimas o diferentes en ejecuciones separadas.

• Problemas de robustez: La sensibilidad a las condiciones iniciales y la presencia de datos atípicos pueden hacer que los métodos no jerárquicos, como K-means, sean menos robustos en comparación con otros métodos en ciertas situaciones.

• Tasa de convergencia menor con algunas semillas: La elección de ciertas semillas iniciales puede resultar en una tasa de convergencia más lenta en el proceso de agrupamiento.

• Selección de semillas basada en heurísticas o resultados obtenidos por otros métodos: La elección de semillas iniciales puede depender de heurísticas o resultados obtenidos por otros métodos, lo que introduce cierta subjetividad en el proceso.

• Puede caer en mínimos locales: Dado que K-means busca optimizar una función objetivo, puede converger hacia mínimos locales, lo que puede afectar la calidad de los clústeres identificados.
Note:
Fuente: Elaboración propia con base en (Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA,)

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.

Jerárquico

Existen dos enfoques principales para el agrupamiento jerárquico: aglomerativo y divisivo.

Agrupamiento Jerárquico Aglomerativo

En el método aglomerativo, el proceso sigue una estrategia de “abajo hacia arriba”. Inicialmente, cada objeto del conjunto de datos se considera como un clúster independiente (un solo elemento). Luego, en cada paso del algoritmo, se fusionan los dos grupos que son más similares. Este proceso de combinación continúa hasta que todos los objetos forman un único clúster grande, es decir, hasta alcanzar la raíz del árbol jerárquico.

Agrupamiento Jerárquico Divisivo

El método divisivo (también conocido como DIANA, por “Divisive Analysis”) sigue un enfoque opuesto, es decir, de “arriba hacia abajo”. Comienza considerando todos los objetos como parte de un solo gran clúster. Luego, en cada iteración, el clúster más heterogéneo se divide en dos grupos. Este proceso se repite hasta que cada objeto queda como un clúster independiente.

El método aglomerativo es más efectivo para identificar grupos pequeños y compactos. El método divisivo tiende a ser mejor para identificar grupos grandes y generales. Nos enfocaremos en el método aglomerativo, ya que es el más común.

Pasos para Realizar un Agrupamiento Jerárquico Aglomerativo en R Preparación de los Datos: Los datos deben estar organizados en una matriz numérica donde:

Las filas representan observaciones (individuos). Las columnas representan variables (características de los individuos). Cálculo de Distancias: Se calcula una medida de similitud o distancia entre cada par de observaciones.

Construcción del Árbol Jerárquico: Se utiliza una función de enlace (o vinculación) para agrupar las observaciones según las distancias calculadas en el paso anterior. Las observaciones más cercanas se agrupan primero.

Corte del Dendrograma: Finalmente, se decide dónde cortar el árbol jerárquico para definir los clústeres finales, lo que permite particionar los datos en diferentes grupos.

Estandarización de Datos

Es importante estandarizar las variables antes de realizar el análisis, especialmente si tienen diferentes escalas de medición. Por ejemplo, si una variable mide altura en metros y otra mide peso en kilogramos, sus valores no serían comparables directamente. Para estandarizar los datos, se puede utilizar la función scale() en R, que ajusta las variables para que tengan media cero y desviación estándar uno.

library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
# Cargar los datos 
data("USArrests")

# Estandarizar los datos 
df <- scale(USArrests)

# Mostrar la cabeza de 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

Medidas de Similitud y Distancia

Para realizar un análisis de agrupamiento, es fundamental calcular la similitud o disimilitud entre los objetos. Existen varias formas de hacerlo, y entre las más comunes están las distancias Euclidiana y Manhattan (ver Capítulo 3).

En R, puedes utilizar la función dist() para calcular la distancia entre cada par de observaciones en tu conjunto de datos. El resultado de este cálculo es lo que se conoce como una matriz de distancia o matriz de disimilitud.

Distancia Euclidiana y Otras Métricas Por defecto, la función dist() en R utiliza la distancia Euclidiana. Sin embargo, es posible especificar otras métricas de distancia mediante el argumento “method”.

# Compute the dissimilarity matrix
# df = the standardized data
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

Uso de la Función dist() y Métodos de Vinculación en R La función dist() de R se utiliza para calcular las distancias entre filas de una matriz de datos, utilizando una métrica de distancia especificada por el usuario.

Convertir a Matriz de Distancia Para visualizar mejor la información de distancia entre los objetos, se puede convertir el resultado de dist() a una matriz usando as.matrix(). En esta matriz, el valor en la posición [i, j] indica la distancia entre las observaciones i y j del conjunto de datos.

res.hc <- hclust(d = res.dist, method = "ward.D2") 

Métodos de Vinculación y Agrupamiento en R

Para crear un árbol jerárquico de clústeres en R, se necesita una estructura de disimilitud, la cual puede obtenerse utilizando la función dist(). A partir de esta estructura, la función hclust() permite agrupar observaciones utilizando diferentes métodos de vinculación (o aglomeración).

Parámetros de hclust() d: Objeto que representa la matriz de disimilitud calculada con dist(). method: Especifica el método de vinculación que se utilizará para medir la distancia entre clústeres. Los métodos disponibles para method incluyen:

“ward.D” y “ward.D2”: Minimización de la varianza (método de Ward). “single”: Vinculación simple (distancia mínima). “complete”: Vinculación completa (distancia máxima). “average”: Vinculación promedio. “mcquitty”: Método de McQuitty. “median”: Método de la mediana. “centroid”: Método de enlace centroide.

Métodos de Vinculación Más Comunes

Vinculación Completa (Complete Linkage): Usa la distancia máxima entre puntos de diferentes clústeres. Vinculación Simple (Single Linkage): Basa la distancia en el par de puntos más cercanos. Vinculación Promedio (Average Linkage): Calcula el promedio de todas las distancias entre puntos de diferentes clústeres. Vinculación Centroidal (Centroid Linkage): Utiliza el centroide (media) de cada clúster para calcular la distancia. Método de Ward: Minimiza la varianza dentro de los clústeres al agrupar. En cada paso del proceso, se combinan los dos clústeres que tienen la menor distancia de vinculación, formando clústeres más grandes a medida que avanza el algoritmo.

Simplificación del Análisis con el Paquete cluster

El paquete cluster de R facilita la creación de clústeres jerárquicos mediante funciones integradas que simplifican el proceso:

agnes(): Para realizar agrupamiento jerárquico aglomerativo. diana(): Para realizar agrupamiento jerárquico divisivo. Estas funciones automatizan todo el proceso, por lo que no es necesario ejecutar manualmente las funciones scale(), dist() y hclust().

library("cluster")
## Warning: package 'cluster' was built under R version 4.3.3
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(USArrests, # data matrix
stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)
# DIvisive ANAlysis Clustering
res.diana <- diana(USArrests, # data matrix
stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)

Ejemplo de Agrupamiento Jerárquico en R: agnes() y diana() Agrupamiento Aglomerativo (agnes()) Para realizar un agrupamiento jerárquico aglomerativo en R, podemos utilizar la función agnes() del paquete cluster. Aquí tienes un ejemplo con el conjunto de datos USArrests:

res_agnes <- agnes(
  x = USArrests,     # Datos de entrada
  stand = TRUE,      # Normalizar las variables
  metric = "euclidean", # Usar distancia Euclidiana
  method = "ward"    # Método de vinculación: Ward
)

En este código:

stand = TRUE normaliza los datos para hacer comparables las variables. metric = “euclidean” establece la métrica de distancia como Euclidiana. method = “ward” aplica el método de Ward para la vinculación, minimizando la varianza dentro de los clústeres. Agrupamiento Jerárquico Divisivo con diana() Para realizar un análisis divisivo, se emplea la función diana(), que sigue un enfoque de arriba hacia abajo:

res_diana <- diana(
  x = USArrests,     # Datos de entrada
  stand = TRUE,      # Normalizar las variables
  metric = "euclidean" # Usar distancia Euclidiana
)

En este ejemplo:

stand = TRUE normaliza los datos para hacer comparables las escalas de las variables. metric = “euclidean” utiliza la distancia Euclidiana como medida de disimilitud. Visualización del Dendrograma con fviz_dend() Una vez realizados los análisis con agnes() y diana(), podemos representar los resultados con la función fviz_dend() del paquete factoextra:

library(factoextra)

# Visualizar el dendrograma del análisis aglomerativo
fviz_dend(res_agnes, main = "Dendrograma - Aglomerativo")
## 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.

# Visualizar el dendrograma del análisis divisivo
fviz_dend(res_diana, main = "Dendrograma - Divisivo")

En estos gráficos:

Los dendrogramas muestran la estructura jerárquica del agrupamiento, permitiendo identificar los diferentes clústeres. La visualización facilita la comparación de los métodos aglomerativo y divisivo y ayuda a interpretar los resultados del análisis. Este enfoque proporciona una manera clara y efectiva de realizar y visualizar el agrupamiento jerárquico en R.

No gerárquico

K-Means

El método de K-means es una técnica de agrupamiento que clasifica las observaciones en k grupos distintos. El número de clústeres (k) es definido previamente por el usuario antes de ejecutar el algoritmo. El objetivo es identificar k clústeres óptimos, donde cada grupo se forma de tal manera que la varianza interna (la dispersión de los puntos dentro del clúster) sea lo más baja posible.

# Generar datos
set.seed(123)  # Para reproducir
datos <- matrix(rnorm(100 * 2), ncol = 2)  # 100 filas, 2 columnas

# Aplicar k-means con k=3
k <- 3

# aplica el algorirmo de k-medias
resultado_kmeans <- kmeans(datos, centers = k)

# Mostrar los resultados
print(resultado_kmeans)
## K-means clustering with 3 clusters of sizes 38, 29, 33
## 
## Cluster means:
##          [,1]       [,2]
## 1 -0.66333772 -0.6219885
## 2 -0.02025692  1.0093022
## 3  1.05560227 -0.4966328
## 
## Clustering vector:
##   [1] 1 2 3 1 1 3 3 1 1 2 3 2 3 1 2 3 3 1 3 1 1 1 1 1 2 1 3 2 1 3 2 2 3 3 3 2 3
##  [38] 2 2 1 2 1 1 3 3 1 1 2 2 1 2 2 2 3 1 3 1 3 2 3 2 1 1 2 1 2 2 1 3 3 1 1 3 2
##  [75] 1 3 1 1 2 1 1 2 1 3 1 3 2 3 2 3 3 3 2 1 3 2 3 3 1 1
## 
## Within cluster sum of squares by cluster:
## [1] 23.92627 22.26036 24.96196
##  (between_SS / total_SS =  59.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

K-Medoides

El método de K-medoides es similar al de K-means, ya que ambos dividen las observaciones en k grupos, donde k es un valor previamente definido por el usuario. La diferencia principal radica en que, en K-medoides, cada clúster está representado por una observación real del conjunto de datos (medoide), mientras que en K-means, cada clúster está representado por un centroide calculado.

Algoritmo PAM (Partitioning Around Medoids) El algoritmo más popular para implementar K-medoides es PAM, que sigue los siguientes pasos:

Seleccionar aleatoriamente k observaciones como medoides iniciales. Calcular la matriz de distancias entre todas las observaciones (si aún no se ha hecho). Asignar cada observación al medoide más cercano. Para cada clúster, evaluar si cambiar el medoide actual por otra observación del clúster reduce la distancia promedio. Si es así, actualizar el medoide al que minimice la distancia. Repetir los pasos 3 y 4 hasta que no haya cambios en los medoides. El proceso finaliza cuando no se encuentran nuevos medoides que mejoren la agrupación.

Paquete cluster en R El algoritmo PAM se encuentra implementado en la librería cluster de R, que ofrece diversas herramientas para análisis de agrupamiento, tanto jerárquicos como no jerárquicos. Este paquete permite realizar agrupamientos de datos, así como identificar patrones y estructuras subyacentes en conjuntos de datos no etiquetados.

Sintaxis en R

# Instalar la libreria "cluster"
# Cargar el paquete cluster
library(cluster)

# Generar datos 
set.seed(123)  
datos <- matrix(rnorm(100 * 2), ncol = 2)  # 100 filas, 2 columnas

# Aplicar k-medoids con k=3 
k <- 3

# aplica el algoritmo k-medoids a los datos, utilizando "k" para especificar el número de clústeres
resultado_kmedoids <- pam(datos, k)

# Mostrar los resultados
print(resultado_kmedoids)
## Medoids:
##      ID                       
## [1,]  1 -0.56047565 -0.7104066
## [2,] 52 -0.02854676  0.7690422
## [3,] 90  1.14880762 -0.4992920
## Clustering vector:
##   [1] 1 2 3 1 1 3 3 1 1 2 3 2 1 2 2 3 2 1 3 1 1 1 1 1 2 1 3 2 1 3 2 2 3 3 3 2 3
##  [38] 2 2 1 2 1 1 3 3 1 1 2 2 1 2 2 2 3 1 3 2 3 2 1 2 1 1 2 1 2 2 1 2 3 1 1 3 2
##  [75] 1 3 2 1 2 1 1 2 1 3 1 3 2 2 2 3 3 3 2 1 3 2 3 3 1 1
## Objective function:
##     build      swap 
## 0.8127219 0.7353591 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

En este ejemplo:

pam() aplica el algoritmo K-medoides al conjunto de datos especificado. k define el número de clústeres deseados. El método K-medoides es más robusto frente a valores atípicos en comparación con K-means, ya que utiliza observaciones reales como representantes de los clústeres.

CLARA

CLARA (Clustering Large Applications) es un método que adapta la técnica de k-medoides mediante el uso de muestreo, con el fin de aplicarse eficientemente en grandes conjuntos de datos. CLARA selecciona aleatoriamente una muestra de un tamaño específico y aplica el algoritmo PAM (k-medoides) a esa muestra para identificar los clústeres óptimos. Luego, utiliza estos medoides para agrupar todas las observaciones en el conjunto completo de datos. Este proceso se repite varias veces para minimizar el sesgo de muestreo, y al final se elige el conjunto de clústeres que tiene la menor suma total de distancias como resultado final.

Pasos del algoritmo CLARA 1.Dividir aleatoriamente el conjunto de datos en n subconjuntos de igual tamaño, donde n es un parámetro definido por el investigador.

2.Para cada uno de los n subconjuntos: Seleccionar una muestra aleatoria de observaciones. Aplicar el algoritmo PAM (k-medoides) a esta muestra para encontrar los medoides. Utilizar los medoides obtenidos para clasificar todas las observaciones del conjunto completo de datos.

3.Repetir el procedimiento para cada subconjunto y evaluar la calidad del agrupamiento, midiendo la suma total de distancias entre las observaciones y sus respectivos medoides.

4.Finalmente, seleccionar como solución final el conjunto de clústeres generado a partir de los medoides que hayan producido la menor suma total de distancias.

Este método permite realizar agrupamientos efectivos en grandes conjuntos de datos al reducir la complejidad computacional mediante el muestreo.

# Cargar el paquete cluster
library(cluster)

# Generar datos
set.seed(123)  # Para reproducibilidad
datos <- matrix(rnorm(100 * 2), ncol = 2)  # 100 filas, 2 columnas

# Aplicar CLARA con k=3 
k <- 3

# samples específica el número de muestran que se extraerán aleatoriamente del conjunto de datos para realizar el análisis. Un valor más alto puede llevar a resultados más estables y por último pamlike el cual indica si usar una versión modificada del algoritmo PAM que es similar a k-medoids
resultado_clara <- clara(datos, k, samples = 5, pamLike = TRUE)

# Mostrar los resultados
print(resultado_clara)
## Call:     clara(x = datos, k = k, samples = 5, pamLike = TRUE) 
## Medoids:
##             [,1]       [,2]
## [1,] -0.56047565 -0.7104066
## [2,] -0.02854676  0.7690422
## [3,]  0.87813349 -0.4224968
## Objective function:   0.7371177
## Clustering vector:    int [1:100] 1 2 3 1 1 3 3 1 1 2 3 2 3 2 2 3 3 1 ...
## Cluster sizes:            35 32 33 
## Best sample:
##  [1]   1   2   3   5   8   9  12  15  16  23  25  26  29  32  34  35  37  39  41
## [20]  42  43  44  47  51  52  54  58  59  61  65  67  69  73  76  80  86  87  89
## [39]  91  92  93  96  97  98  99 100
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"

4. Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA, disponible en:https://drive.google.com/file/d/1iOUDLsbrUgS-ypVLaZ3tU60AulQn2VPv/view?usp=sharing ,desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.

Capitulo 4 (K-Means Clustering)

Computing k-means clustering in R

data("USArrests") # Loading the data set
df <- scale(USArrests) # Scaling the data
# View the firt 3 rows of the data
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

Estimating the optimal number of clusters

library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2)

COMPUTING K-MEANS CLUSTERING IN R

# Compute k-means with 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"
library(kableExtra)
resultados <- aggregate(USArrests, by=list(cluster=km.res$cluster), mean)  
  resultados %>% 
  kable(align ="c",
        digits =2) %>%
  row_spec(0,background = "grey") %>% 
  column_spec(1:ncol(resultados), width = "100px")
cluster Murder Assault UrbanPop Rape
1 13.94 243.62 53.75 21.41
2 3.60 78.54 52.08 12.18
3 5.66 138.88 73.88 18.78
4 10.82 257.38 76.00 33.19
dd <- cbind(USArrests, cluster = km.res$cluster)
  dd %>% 
  head(dd, n= 3) %>% 
  kable(align ="c",
        digits =2) %>%
  row_spec(0,background = "pink") %>% 
  column_spec(1:ncol(resultados), width = "100px")
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

Accessing to the results of kmeans() function

# Cluster number for each of the observations
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
# Cluster size
km.res$size
## [1]  8 13 16 13
# Cluster means
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

Capitulo 5 (K-Medoids)

library(cluster)
library(factoextra)

Estimating the optimal number of clusters

fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()

Computing PAM clustering

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"
dd <- cbind(USArrests, cluster = pam.res$cluster)
dd %>% 
  head(dd, n= 3) %>% 
  kable(align ="c",
        digits =2) %>%
  row_spec(0,background = "skyblue") %>% 
  column_spec(1:ncol(resultados), width = "100px")
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

Accessing to the results of the pam() function

# Cluster medoids: New Mexico, 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
# Cluster numbers
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

Capitulo 6 (clara-cloustering large aplications)

set.seed(1234)
# Genera 500 objetos, divididos en 2 grupos.
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")

rownames(df) <- paste0("S",1:nrow(df))

# Vista previa de los datos
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
# Cargar la libreria "cluster" y "factoextra"
library(cluster)
library(factoextra)
fviz_nbclust(df,clara,method = "silhouette")+
  theme_classic()

# Calcular CLARA
clara.res <- clara(df,2,samples = 50,pamLike = TRUE)

# Imprimir componentes 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"
# Agregar clasificaciones de puntos a los datos originales
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
# Acceder a los resultados devueltos por clara()
# Medoids
clara.res$medoids
##              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("green", "pink"), # color palette
             ellipse.type = "t", # Concentration ellipse 
             geom = "point", pointsize = 1,
             ggtheme = theme_classic()
)

Capítulo 7 Agglomerative Clustering

7.1 Steps to agglomerative hierarchical clustering

7.1.1 Data structure and preparation

data("USArrests")
# Standardize the data
df <- scale(USArrests)
# Show the first 6 rows
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.1.2 Similarity measures

# Compute the dissimilarity matrix
# df = the standardized data
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

7.1.3 Linkage

res.hc <- hclust(d = res.dist, method = "ward.D2")

7.1.4 Dendrogram

# cex: label size
library("factoextra")
fviz_dend(res.hc, cex = 0.5)

7.2 Verify the cluster tree

# Compute cophentic distance
res.coph <- cophenetic(res.hc)
# Correlation between cophenetic distance and
# the original distance
cor(res.dist, res.coph)
## [1] 0.6975266
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

7.3 Cut the dendrogram into diferent groups

# Cut tree into 4 groups
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Number of members in each cluster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Get the names for the members of cluster 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("#2E56145F", "#0868894B", "#E20100", "#F55407"),
color_labels_by_k = TRUE, # color labels by groups
rect = TRUE # Add rectangle around groups
)

7.4 Cluster R package

library("cluster")
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(x = USArrests, # data matrix
stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)
# DIvisive ANAlysis Clustering
res.diana <- diana(x = USArrests, # data matrix
stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)

fviz_dend(res.agnes, cex = 0.6, k = 4)

Capítulo 8: Comparing Dendrograms

8.1 Data preparation

df <- scale(USArrests)
# Subset containing 10 rows
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]

8.2 Comparing dendrograms

library(dendextend)
## Warning: package 'dendextend' was built under R version 4.3.3
## 
## ---------------------
## Welcome to dendextend version 1.19.0
## Type citation('dendextend') for how to cite the package.
## 
## Type browseVignettes(package = 'dendextend') for the package vignette.
## The github page is: https://github.com/talgalili/dendextend/
## 
## Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
## You may ask questions at stackoverflow, use the r and dendextend tags: 
##   https://stackoverflow.com/questions/tagged/dendextend
## 
##  To suppress this message use:  suppressPackageStartupMessages(library(dendextend))
## ---------------------
## 
## Attaching package: 'dendextend'
## The following object is masked from 'package:stats':
## 
##     cutree
# Compute distance matrix
res.dist <- dist(df, method = "euclidean")
# Compute 2 hierarchical clusterings
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Create two dendrograms
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Create a list to hold dendrograms
dend_list <- dendlist(dend1, dend2)

8.2.1 Visual comparison of two dendrograms

tanglegram(dend1, dend2)

#Other form

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("entanglement =", round(entanglement(dend_list), 2))
)

8.2.2 Correlation matrix between a list of dendrograms

# 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
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
# Visualize the correlation matrix using corrplot package
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.95 loaded
corrplot(cors, "pie", "lower")

Capítulo 9: Visualizing Dendrograms

9.1 Data

# Load data
data(USArrests)
# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

9.2 Visualizing dendrograms

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

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

require("igraph")
## Loading required package: igraph
## Warning: package 'igraph' was built under R version 4.3.3
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:dplyr':
## 
##     as_data_frame, groups, union
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
fviz_dend(
  hc,
  k = 4,
  k_colors = "jco",
  type = "phylogenic",
  repel = TRUE
)

9.3 Case of dendrogram with large data sets

9.3.1 Zooming in the dendrogram

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

9.3.2 Plotting a sub-tree of dendrograms

# 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 the whole dendrogram
print(dend_plot) 

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

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

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

9.3.3 Saving dendrogram into a large PDF page

pdf("dendrogram.pdf", width=30, height=15) # Open a PDF
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" ) # Do plotting
print(p)

dev.off() # Close the PDF
## pdf 
##   3

9.4 Manipulating dendrograms using dendextend

data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

#R code for creating a dendrogram using chaining operator:
library(dendextend)
dend <- USArrests[1:5,] %>% # data
scale %>% # Scale the data
dist %>% # calculate a distance matrix,
hclust(method = "ward.D2") %>% # Hierarchical clustering
as.dendrogram # Turn the object into a dendrogram.
plot(dend)

#other form
library(dendextend)
# 1. Create a customized dendrogram
mycols <- c("green", "#00AFBB", "blue", "purple")
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)

(AlboukadeL, 2017) (Villardón, 2007) (Correa Henao, 2021)

Bibliografía

AlboukadeL, K. (2017). Practical guide to cluster analysis in r (Vol. 1). Alboukadel Kassambara.
Correa Henao, M. (2021). Análisis de clúster automático [PhD thesis]. Universidad Nacional.
Villardón, J. L. V. (2007). Introducción al análisis de clúster. Departamento de Estadı́stica, Universidad de Salamanca. 22p.