UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA



MÉTODOS PARA EL ANÁLISIS ECONÓMICO



A31-Tarea de investigación de Clusters




DOCENTE:

MSF. CARLOS ADEMIR PÉREZ ALAS.



INTEGRANTES:

Albayero Cortez, Marjorie Nohemy. AC19029.

Carranza Soto, Jose Muricio.CS21022 .

Rivas Ramos, Marco Antonio.RR14082 .





r format(Sys.Date(), ‘%d de %B de %Y’)

Indicaciones Generales:

Presente en un reporte de Rmardown todas las operaciones que se indican en la tarea, debe incluir el archivo rmd, la correspondiente versión html y el informe publicado en una cuenta de Rpubs (incluir el enlace en los comentarios de entrega de las tareas, y en un archivo txt dentro de la entrega), incluyendo los nombres y apellidos de cada uno de los integrantes del grupo.

1. Explique en que consiste el análisis de conglomerados.

ANÁLISIS DE CLUSTER (CONGLOMERADOS)

El Análisis de Clusters, también denominado Análisis de Conglomerados, consiste en una técnica estadística multivariante cuyo objetivo principal es formar grupos de elementos (ya sean casos u observaciones, o bien variables) de manera que se logre la mayor homogeneidad posible dentro de cada grupo y, al mismo tiempo, la máxima diferenciación entre los distintos grupos. Es importante resaltar que esta metodología tiene una amplia y relevante aplicación en numerosos campos de investigación. Sin embargo, junto con sus ventajas, el Análisis de Clusters presenta ciertas limitaciones. Se trata de una técnica esencialmente descriptiva, sin fundamento teórico específico y de carácter no inferencial. Esto significa que no cuenta con soporte estadístico para realizar inferencias sobre una población a partir de una muestra; su funcionamiento se basa principalmente en criterios geométricos y se emplea sobre todo como un procedimiento exploratorio y descriptivo, pero no como una herramienta explicativa.

Existen dos categorías principales de análisis de clusters: los jerárquicos y los no jerárquicos.

Métodos jerárquicos: Se fundamentan en el cálculo previo de una matriz de distancias y suelen aplicarse cuando el número de casos es inferior a 200, ya que tanto los cálculos como la interpretación de los resultados se vuelven más complejos conforme aumenta el tamaño de la muestra. Una característica clave de estos métodos es que no permiten reubicar elementos una vez que han sido agrupados: si dos individuos o conglomerados se unen en alguna fase del proceso, esa unión es definitiva y no podrán separarse posteriormente.

Pueden aplicarse tanto a variables como a observaciones:

A partir de la matriz de distancias, los algoritmos jerárquicos se dividen en dos tipos:

Aglomerativos (o ascendentes): Son los más comunes y requieren menos tiempo computacional. Comienzan considerando cada objeto como un conglomerado individual y van fusionando progresivamente los más similares hasta formar un único grupo final.

Divisivos (o descendentes): Parten de todo el conjunto de datos como un solo conglomerado y lo van dividiendo sucesivamente hasta obtener conglomerados individuales. Los elementos asignados a un grupo no pueden ser reasignados después.

El dendrograma es una representación gráfica en forma de árbol que resume visualmente todo el proceso de agrupamiento. Los objetos que presentan mayor similitud aparecen conectados mediante ramas, y la altura de los enlaces indica el grado de similitud o disimilitud entre ellos.

Métodos no jerárquicos: También se les conoce como métodos de optimización. A diferencia de los jerárquicos, sí permiten la reasignación de objetos entre grupos y exigen definir de antemano cuántos conglomerados se desean obtener.

Se emplean principalmente en tres situaciones o enfoques:

Métodos de reasignación: Permiten que un elemento asignado a un grupo en una iteración pueda cambiarse a otro grupo en iteraciones posteriores si eso mejora el criterio de optimización establecido. El algoritmo finaliza cuando ninguna reasignación adicional produce una mejora.

Métodos basados en búsqueda de densidad: Se fundamentan en la idea de que los puntos de un mismo cluster provienen de una distribución de probabilidad específica.

Ofrecen dos enfoques:

Aproximación tipológica: Busca regiones del espacio donde existe una alta concentración de casos. Aproximación probabilística: Asume que las variables siguen una distribución de probabilidad cuyos parámetros difieren entre grupos. Este enfoque permite incorporar el análisis de clusters al ámbito de la inferencia estadística, explicando la existencia de los grupos por la presencia de subpoblaciones distintas en los datos.

Métodos directos: Clasifican simultáneamente individuos y variables.

Diferencias fundamentales entre ambos tipos de métodos: Métodos jerárquicos

Métodos no jerárquicos

En resumen, las principales aplicaciones del análisis de clusters pueden condensarse en los siguientes cuatro propósitos:

Comprobar si los tipos o categorías definidos por otros métodos o teorías están realmente presentes en el conjunto de datos analizado.

(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)

# 1. DATOS DE ANALISIS DE CLUSTER (Sin tildes)
analisis_cluster <- c(
  "Jerarquico: Los metodos jerarquicos tienen como objetivo la formacion de nuevos grupos al agrupar clusteres o separar los existentes para generar otros dos, de manera que, al repetir este proceso de aglomeracion o division, se minimice alguna distancia o se maximice alguna medida de similitud. Estos metodos se dividen en dos categorias principales: Agrupamiento Aglomerativo y Disociativo. En este analisis se busca agrupar cluster para formar uno nuevo o separar alguno que existia para dar origen a otros dos maximizando la similaridad o se minimice la distancia.",
  "No jerarquico: Es aquel analisis que asigna casos o grupos diferenciados y los configura de manera que unos dependan de otros. A su vez, produce clusteres disjuntos (cada caso es un grupo), o bien clusteres solapados (un caso puede pertenecer a mas de un grupo). Esta tecnica es valiosa en una variedad de disciplinas, desde la investigacion cientifica hasta el analisis de mercado, ya que puede revelar patrones y estructuras subyacentes que no son evidentes a simple vista."
)

# 2. TECNICAS DISPONIBLES
tecnicas_disponibles <- c(
  paste(
    "Aglomerativo:",
    "• Linkage Simple.",
    "• Linkage Completo.",
    "• Promedio entre grupos.",
    "• Metodo del centroide.",
    "• Metodo de la mediana.",
    "• Metodo de Ward.",
    "• Dendrograma.",
    "• Mapa de Calor.",
    "\nDisociativos:",
    "• Linkage Simple.",
    "• Linkage Completo.",
    "• Promedio entre grupos.",
    "• Metodo del centroide.",
    "• Metodo de la mediana.",
    "• Metodo de Ward.",
    "• Analisis de asociacion.",
    "• Detector Automatico de Interaccion.", sep = "\n"
  ),
  paste(
    "Metodos de Reasignacion:",
    "• Centroides.",
    "• PAM.",
    "• CLARA.",
    "• K-medias.",
    "• Quick-Cluster.",
    "• Metodo de Forgy.",
    "• Nubes Dinamicas.",
    "Búsqueda de densidad:",
    "• Aproximacion Tipologica.",
    "• Analisis Modal.",
    "• Metodo Taxmap.",
    "• Metodo de Fortin.",
    "Aprobacion Probabilistica:",
    "• Metodo de Wolf.",
    "Metodos Directos: Block-Clustering.",
    "Metodos Reductivos: Analisis Factorial tipo Q.", sep = "\n"
  )
)

# 3. VENTAJAS
ventajas <- c(
  "• El metodo jerarquico sugiere naturalmente la cantidad de clusteres presentes en los datos, ya que el dendrograma proporciona una representacion visual de como se agrupan las observaciones a diferentes niveles de similitud.
  • No es necesario especificar el numero de clusteres
  • Facil implementacion
  • Dendrograma informativo
  • Visualizacion simultanea de grupos de muestras y caracteristicas",
  "• Facil de entender, facil de adaptar: Los metodos no jerarquicos, como K-medoids, son conocidos por su simplicidad y facilidad de comprension.
  • Eficiente y adecuado para conjuntos de datos grandes o pequeños
  • Buen desempeño: Los metodos no jerarquicos, como K-medoids, a menudo exhiben un buen rendimiento.
  • Robustez frente a outliers o ruido: Una caracteristica clave de K-medoids es su robustez ante la presencia de outliers o ruido en el conjunto de datos."
) 

# 4. DESVENTAJAS
desventajas <- c(
  "• Anidamiento restrictivo es una desventaja en la que la asignacion de elementos a grupos puede no ser ideal, ya que no se permite la flexibilidad de pertenencia a multiples clusteres.
  • Dendrograma producido es muy util para comprender los datos: Esto tambien se presenta como una ventaja.",
  "• Necesita que el usuario defina el numero de clusteres: Este es uno de los desafios mas comunes de los metodos no jerarquicos.
  • Sensible a ruido: Los metodos no jerarquicos, como K-means, son sensibles a la presencia de ruido en los datos.
  • Variabilidad en funcion de las semillas: Los resultados de los metodos no jerarquicos pueden variar segun las semillas iniciales elegidas.
  • Puede caer en minimos locales: Dado que K-means busca optimizar una funcion objetivo, puede converger hacia minimos locales."
)

# 5. MARCO DE LOS DATOS (Creacion del tibble/data frame)
cuadro_comparativo <- tibble(
  `Analisis de Cluster` = analisis_cluster,
  `Tecnicas Disponibles` = tecnicas_disponibles,
  `Ventajas` = ventajas,
  `Desventajas` = desventajas
)

# 6. PRESENTACION DE LA TABLA CON ESTILO Y PIE DE PÁGINA
cuadro_comparativo %>%
  kable(format = "html", 
        caption = "Cuadro Comparativo de Metodos de Analisis de Cluster") %>%
  row_spec(0, background = "#E65554", bold = T, align = "c") %>%
  column_spec(1, width = "7cm", border_right = T) %>%
  column_spec(2, border_right = T) %>%
  column_spec(3, border_right = T) %>%
  column_spec(4, border_right = T) %>%
  kable_styling("hover", full_width = F) %>%
  footnote(general = "Fuente: Elaboracion propia con base en (Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA,)")
Cuadro Comparativo de Metodos de Analisis de Cluster
Analisis de Cluster Tecnicas Disponibles Ventajas Desventajas
Jerarquico: Los metodos jerarquicos tienen como objetivo la formacion de nuevos grupos al agrupar clusteres o separar los existentes para generar otros dos, de manera que, al repetir este proceso de aglomeracion o division, se minimice alguna distancia o se maximice alguna medida de similitud. Estos metodos se dividen en dos categorias principales: Agrupamiento Aglomerativo y Disociativo. En este analisis se busca agrupar cluster para formar uno nuevo o separar alguno que existia para dar origen a otros dos maximizando la similaridad o se minimice la distancia.

Aglomerativo: • Linkage Simple. • Linkage Completo. • Promedio entre grupos. • Metodo del centroide. • Metodo de la mediana. • Metodo de Ward. • Dendrograma. • Mapa de Calor.

Disociativos: • Linkage Simple. • Linkage Completo. • Promedio entre grupos. • Metodo del centroide. • Metodo de la mediana. • Metodo de Ward. • Analisis de asociacion. • Detector Automatico de Interaccion.
• El metodo jerarquico sugiere naturalmente la cantidad de clusteres presentes en los datos, ya que el dendrograma proporciona una representacion visual de como se agrupan las observaciones a diferentes niveles de similitud. • No es necesario especificar el numero de clusteres • Facil implementacion • Dendrograma informativo • Visualizacion simultanea de grupos de muestras y caracteristicas • Anidamiento restrictivo es una desventaja en la que la asignacion de elementos a grupos puede no ser ideal, ya que no se permite la flexibilidad de pertenencia a multiples clusteres. • Dendrograma producido es muy util para comprender los datos: Esto tambien se presenta como una ventaja.
No jerarquico: Es aquel analisis que asigna casos o grupos diferenciados y los configura de manera que unos dependan de otros. A su vez, produce clusteres disjuntos (cada caso es un grupo), o bien clusteres solapados (un caso puede pertenecer a mas de un grupo). Esta tecnica es valiosa en una variedad de disciplinas, desde la investigacion cientifica hasta el analisis de mercado, ya que puede revelar patrones y estructuras subyacentes que no son evidentes a simple vista. Metodos de Reasignacion: • Centroides. • PAM. • CLARA. • K-medias. • Quick-Cluster. • Metodo de Forgy. • Nubes Dinamicas. Búsqueda de densidad: • Aproximacion Tipologica. • Analisis Modal. • Metodo Taxmap. • Metodo de Fortin. Aprobacion Probabilistica: • Metodo de Wolf. Metodos Directos: Block-Clustering. Metodos Reductivos: Analisis Factorial tipo Q. • Facil de entender, facil de adaptar: Los metodos no jerarquicos, como K-medoids, son conocidos por su simplicidad y facilidad de comprension. • Eficiente y adecuado para conjuntos de datos grandes o pequeños • Buen desempeño: Los metodos no jerarquicos, como K-medoids, a menudo exhiben un buen rendimiento. • Robustez frente a outliers o ruido: Una caracteristica 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 numero de clusteres: Este es uno de los desafios mas comunes de los metodos no jerarquicos. • Sensible a ruido: Los metodos no jerarquicos, como K-means, son sensibles a la presencia de ruido en los datos. • Variabilidad en funcion de las semillas: Los resultados de los metodos no jerarquicos pueden variar segun las semillas iniciales elegidas. • Puede caer en minimos locales: Dado que K-means busca optimizar una funcion objetivo, puede converger hacia minimos locales.
Note:
Fuente: Elaboracion 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

A continuación se describen las principales técnicas de análisis de clúster implementadas en R, tanto jerárquicas como no jerárquicas, con su fundamentación teórica y la sintaxis correspondiente utilizando la base de datos ClusteringHSS (n = 1,113 observaciones).

3.1 Métodos jerárquicos

AGNES (Agglomerative Nesting)
Método aglomerativo ascendente que parte considerando cada observación como un clúster individual y va fusionando progresivamente los clústeres más similares según un criterio de enlace. El paquete cluster proporciona la función agnes().

DIANA (Divisive Analysis)
Método divisivo descendente que inicia con un único clúster que contiene todas las observaciones y lo divide iterativamente en subgrupos más homogéneos. Se implementa con la función diana() del mismo paquete.

Ambos métodos generan un dendrograma y permiten evaluar la fuerza de la estructura jerárquica mediante el coeficiente aglomerativo (AGNES) o coeficiente divisivo (DIANA). Valores cercanos a 1 indican una estructura jerárquica fuerte.

3.2 Métodos no jerárquicos (de partición/optimización)

K-means Algoritmo más utilizado cuando las variables son continuas. Minimiza la suma de cuadrados dentro de cada cluster asignando cada observación al centroide más cercano. Rápido y escalable.

PAM (Partitioning Around Medoids) Versión robusta de k-means que usa medoides (observaciones reales) en lugar de centroides (medias). Menos sensible a outliers y funciona con cualquier matriz de distancias.

CLARA (Clustering Large Applications) Versión de PAM optimizada para muestras grandes: toma múltiples submuestras, aplica PAM a cada una y elige la mejor partición. Recomendada cuando n > ~500–1000.

Cuadro resumen de Librerías a usar y su respectiva sintaxis

Técnica

Paquete

Función principal

Sintaxis básica

AGNES

cluster

agnes()

agnes(x, method = "ward.D2")

DIANA

cluster

diana()

diana(x)

K-means

stats

kmeans()

kmeans(x, centers = k, nstart = 25)

PAM

cluster

pam()

pam(x, k = k)

CLARA

cluster

clara()

clara(x, k = k, samples = 50)

Visualización

factoextra

fviz_dend(), fviz_cluster()

ver ejemplos abajo

El análisis de clúster se divide en dos grandes grupos: Métodos Jerárquicos y Métodos No Jerárquicos. A continuación, se describen las técnicas disponibles para cada uno, así como la librería y sintaxis necesaria para su implementación en el entorno R.

  1. Métodos Jerárquicos (Clustering Hierárquico)Los métodos jerárquicos construyen una jerarquía de clústeres, representada visualmente mediante un dendrograma . Esto permite observar cómo las observaciones se agrupan progresivamente.

A. Jerárquicos Aglomerativos (AGNES - Agglomerative Nesting)Los métodos aglomerativos comienzan con cada punto de dato como un clúster individual y, en cada paso, unen los dos clústeres más cercanos hasta que solo queda un clúster grande.

Técnicas de Enlace: La diferencia entre las técnicas radica en cómo definen la “distancia” entre dos clústeres ya formados.

Linkage Simple: Define la distancia entre clústeres como la mínima distancia entre cualquier par de puntos de ambos grupos.

Linkage Completo: Utiliza la máxima distancia entre cualquier par de puntos.

Promedio entre grupos: Emplea la distancia promedio entre todos los pares de puntos entre los dos clústeres.

Método de Ward: Es uno de los más usados, ya que busca minimizar la varianza total dentro de los clústeres, creando grupos más compactos y de tamaño similar.

Librería y Sintaxis en R: Las técnicas aglomerativas se implementan comúnmente con la función hclust() del paquete base stats.

Primero se calcula la matriz de distancias con dist().Ejemplo de Sintaxis:

(Método Ward):Rd <- dist(datos_cluster, method = “euclidean”) agnes.ward <- hclust(d, method = “ward.D2”) plot(agnes.ward)

B. Jerárquicos Disociativos (DIANA - Divisive Analysis)Los métodos disociativos comienzan con un único clúster que contiene todas las observaciones y lo dividen recursivamente en clústeres más pequeños hasta que cada observación está en su propio grupo.

Técnica Principal (DIANA): Divide el clúster que tiene la distancia máxima de disimilitud entre sus puntos, continuando el proceso hasta la separación total de los datos.Librería y Sintaxis en R: El algoritmo DIANA requiere la librería cluster.

Ejemplo de Sintaxis:

R library(cluster) diana.divisiva <- diana(datos_cluster, metric = “euclidean”) plot(diana.divisiva)

  1. Métodos No Jerárquicos (Clustering de Partición)Estos métodos asignan las observaciones a un número de grupos (\(k\)) predefinido, creando clústeres disjuntos (cada observación pertenece a un único grupo).

A. K-medias (K-means) y Métodos de Reasignación

Estos métodos buscan el centro de cada clúster para minimizar la distancia entre los puntos y ese centro.

K-medias: Es el algoritmo no jerárquico más conocido. Divide los datos en \(k\) grupos donde los puntos se asignan al clúster cuyo centroide (punto promedio) es el más cercano. Es sensible a outliers y a la escala de los datos.

PAM (Partitioning Around Medoids): Alternativa a K-medias que utiliza un medoide (una observación real dentro del clúster) como centro en lugar del centroide. Esto lo hace más robusto ante outliers o ruido.

CLARA (Clustering Large Applications): Es una extensión de PAM optimizada para manejar grandes conjuntos de datos, ya que trabaja sobre muestras aleatorias del conjunto de datos.

Librería y Sintaxis en R:

K-medias: Se usa la función kmeans() del paquete base stats.R# k=4 es el número de clústeres deseado km.res <- kmeans(datos_cluster, centers = 4)

PAM/CLARA: Requieren la librería cluster.Rlibrary(cluster) pam.res <- pam(datos_cluster, k = 4)

B. Otros Métodos No Jerárquicos

EL cuadro menciona otras categorías importantes:

Búsqueda de densidad (DBSCAN): Se centra en la densidad de los puntos para encontrar clústeres de forma arbitraria (no necesariamente esférica), separándolos del ruido.

Aprobación Probabilística: Asigna probabilidades de pertenencia a cada clúster, como el Modelo de Mezcla Gaussiana, en lugar de una pertenencia estricta.

4. Desarrollo de los ejercicios de los capítulos 4, 5, 6, 7, 8, y 9 del Texto “Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis)” de Kassambara, A.

Capítulo 4: K-Means Clustering 4.1 Computing k-means clustering in R 4.1.1 Data

library(factoextra)
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
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)

4.1.3 Computing k-means clustering

# Compute k-means with k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
# Print the results
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"
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
# 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
fviz_cluster(km.res, data = df,

palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid", # Concentration ellipse
star.plot = TRUE, # Add segments from centroids to items
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_minimal()
)

Capítulo 5: K-Medoids 5.1 Computing PAM in R 5.1.1 Data

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

5.1.2 Estimating the optimal number of clusters

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

5.1.3 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)
head(dd, n = 3)

5.1.4 Accessing to the results of the pam() function

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

5.1.5 Visualizing PAM clusters

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

Capítulo 6: Clustering Large Applications 6.1 Computing CLARA in R 6.1.1 Data format and preparation

set.seed(1234)
# Generate 500 objects, divided into 2 clusters.
df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))
# Specify column and row names
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

6.1.2 Estimating the optimal number of clusters

library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()

6.1.3 Computing CLARA

# Compute CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Print components of clara.res
print(clara.res)
## Call:     clara(x = df, k = 2, samples = 50, pamLike = TRUE) 
## Medoids:
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
## Objective function:   9.87862
## Clustering vector:    Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes:            200 300 
## Best sample:
##  [1] S37  S49  S54  S63  S68  S71  S76  S80  S82  S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"
#other example
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
# 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

6.1.4 Visualizing CLARA clusters

fviz_cluster(clara.res,
palette = c("#00AFBB", "#FC4E07"), # 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

# Load the data
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)
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## ℹ 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.
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## ℹ 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.
## 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.

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 dierent 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("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color labels by groups
rect = TRUE # Add rectangle around groups
)

#Other example
fviz_cluster(list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())

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)
## 
## ---------------------
## Welcome to dendextend version 1.19.1
## 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))
## ---------------------
## 
## Adjuntando el paquete: '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)
## Loading required namespace: colorspace

#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)
## 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

#Other form
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
)
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## ℹ 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.
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## ℹ 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.
## 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.

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

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

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

#phylogenic-like tree
require("igraph")
## Cargando paquete requerido: igraph
## 
## Adjuntando el paquete: 'igraph'
## The following objects are masked from 'package:lubridate':
## 
##     %--%, union
## The following objects are masked from 'package:purrr':
## 
##     compose, simplify
## The following object is masked from 'package:tidyr':
## 
##     crossing
## The following object is masked from 'package:tibble':
## 
##     as_data_frame
## 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)

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

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("#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)