Portada

UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
MÉTODOS PARA EL ANÁLISIS ECONÓMICO
CICLO II-2024

GT02

TEMA A INVESTIGAR:

“ANÁLISIS DE CLÚSTER (CONGLOMERADOS)”

INTEGRANTES:

Nombre Cárne
Edwin Fabricio Aguirre Sarmieno AS19011
Gabriel Arturo Sánchez Henríquez SH22002
Diego Edgardo Siliezar Madrid SM21024
DOCENTE:

Carlos Ademir Pérez Alas

Ciudad Universitaria, San Salvador, 24 de noviembre del 2024.

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

El análisis de conglomerados, también conocido como clustering o agrupamiento, es una técnica de análisis estadístico utilizada para agrupar objetos, casos o un conjunto de datos en subgrupos o conglomerados, de tal forma que los elementos dentro de un mismo grupo sean lo más similares posibles entre sí( homogéneos internamente) y diferentes de los elementos en otros grupos (externamente heterogéneos). Es una técnica de aprendizaje no supervisado, lo que significa que no requiere de categorías predefinidas para clasificar los datos.

En el análisis de cluster se examinan las relaciones interdependientes entre el conjunto completo de variables, es decir, los datos/objetos de un grupo son relativamente parecidos en términos de ciertas variables pero diferentes de los datos/objetos de otros grupos. En ese sentido, el análisis de conglomerados es la contracara del análisis factorial ya que reduce el número de objetos y no de variables al agruparlos.

Entonces el metodo de analisis de cluster esta diseñado para poder crear grupos homogeneos de casos o entidades. Se puede resumir bajo cuatro objetivos principales el uso de este metodo:

  1. Desarrollar una tipologıa o clasificacion.
  2. Investigar esquemas conceptuales utiles para agrupar entidades.
  3. Generar hipotesis a traves de la exploracion de los datos.
  4. Contrastar hipotesis o intentar determinar si tipos definidos por otros procedimientos estan de hecho presentes en un conjunto de datos.

Hay que destacar que la aplicacion mas usada de este metodo es la creacion de clasificaciones pero la mayor parte de los casos de apliacion se combina para poder formar una base de estudio.

Se puede remarcar algunas precauciones respecto al uso de este metodo de cluster:

  1. En la mayoría de los casos, los métodos de Análisis Cluster son procedimientos que no están respaldados por un conjunto de doctrinas estadísticas teóricas. En resumen, la mayoría de los métodos son de naturaleza heurística. Esto difiere de otros métodos como el Análisis Factorial, que se fundamenta en una amplia teoria estadística.

  2. Varios procesos de agrupación pueden producir soluciones distintas en el mismo conjunto de datos. Una razón para esto se basa en el hecho previamente mencionado de que los métodos clusters se han originado a partir de diversas fuentes que han originado normas distintas para la formación de grupos. Así, lógicamente, es imprescindible la presencia de métodos que puedan emplearse para determinar qué método genera los grupos naturalmente más uniformes en los datos.

  3. La mayoría de los métodos clusters han surgido bajo el amparo de determinadas disciplinas científicas, por lo que, de manera ineludible, están impregnados de un sesgo que proviene de dichas disciplinas. Este aspecto es crucial ya que cada disciplina posee sus propias inclinaciones, como los tipos de datos que se utilizan en la elaboración de la clasificación.

Objetivo del análisis de conglomerados:

El propósito del análisis de conglomerados es identificar similitudes, patrones o estructuras subyacentes en los datos, permitiendo segmentar las observaciones en función de su similitud. Esto se consigue utilizando medidas de distancia o disimilitud entre las distintas observaciones ayudando a los investigadores y estadísticos a tener una comprensión más profunda de los datos y tomar decisiones mucho más acertadas en base a estos.

En este tipo de analisis poca o ninguna informacion se conoce previamente para la estructura de las categorias, lo cual diferencia este metodo con los metodos multivariantes de asignacion y discriminacion. Entonces de lo que se dispone es una coleccion de observaciones, y como principal objetivo del metodo es el descubrir la estructua de las categorias que podrian encajar con las observaciones, por lo que concretamente se dispone a ordenar las observaciones los cuales las asociaciones resuelte lo mas natural posible entre los miembros del grupo y entre miembros de grupos diferentes.

2. Resumen sobre el analisis de cluster

Análisis de Clúster

Técnicas disponibles

Ventajas

Desventajas

Jerárquico

- Métodos aglomerativos: Inician considerando cada objeto como un clúster independiente y luego agrupan los más similares hasta formar un único conglomerado. Ejemplos:
- Método de enlace simple (minimiza la distancia entre los objetos más cercanos de diferentes clústeres).
- Método de enlace completo (maximiza la distancia entre los objetos más lejanos de diferentes clústeres).
- Método de enlace promedio.
- Método de Ward (minimiza la varianza intragrupal).
-
Métodos divisivos: Comienzan con todos los objetos en un solo clúster y los dividen sucesivamente en grupos más pequeños.

- No requiere definir el número de clústeres previamente, lo que es útil cuando no se tiene conocimiento sobre la estructura de los datos.
- Genera una representación visual clara a través de dendrogramas, facilitando la interpretación del proceso de agrupamiento.
- Es útil para identificar patrones y relaciones jerárquicas en datos pequeños o medianos.

- Una vez que un objeto se asigna a un clúster, no puede ser reasignado, lo que puede ser problemático si hay errores o nuevas observaciones.
- Requiere una alta capacidad computacional para procesar datos grandes.
- Es sensible a la presencia de valores atípicos (outliers), que pueden distorsionar el agrupamiento y afectar los resultados finales.
- Puede ser menos efectivo para datos con estructuras complejas.

No jerárquico

- Método de K-medias: Asigna objetos a los clústeres más cercanos en función de un centroide. Es ampliamente utilizado por su simplicidad y eficiencia.
-
Métodos basados en densidad: Agrupan objetos que se encuentran en regiones densamente pobladas del espacio de datos. Ejemplos:
- Análisis modal de Wishart.
- Método Taxmap.
-
Métodos de reasignación: Permiten que un objeto cambie de clúster durante el proceso si mejora la homogeneidad del grupo (e.g., método de nubes dinámicas).
-
Métodos directos: Clasifican simultáneamente individuos y variables (e.g., Block-Clustering).

- Adecuado para bases de datos grandes y de alta dimensionalidad, ya que no necesita construir una matriz de distancias.
- Es flexible y permite cambios en la asignación de objetos a clústeres durante el proceso, lo que puede mejorar significativamente los resultados.
- Permite maximizar la homogeneidad dentro de los clústeres y la heterogeneidad entre ellos.
- Los resultados son más ajustables y pueden ser adaptados según las necesidades específicas del análisis.

- Requiere especificar a priori el número de clústeres, lo cual puede ser difícil si no se tiene un conocimiento previo de los datos.
- Es sensible a las condiciones iniciales (e.g., elección de centroides iniciales), lo que puede generar diferentes resultados.
- La elección de la medida de distancia o similaridad puede afectar significativamente los resultados.
- Menor capacidad para identificar estructuras jerárquicas en los datos.
- No proporciona representaciones gráficas claras como un dendrograma.

3. Técnicas disponibles para realizar el análisis de clúster, tanto jerárquicas como no jerárquicas y explicación de la librería y sintaxis para implementarla en R.

1. Análisis de Clúster Jerárquico

El análisis jerárquico tiene como objetivo agrupar las observaciones en una estructura de árbol (dendrograma), que muestra cómo se agrupan los datos jerárquicamente. En la agrupación, se forma un nuevo grupo o se separa un grupo ya existente para producir dos grupos adicionales, de una manera que permita minimizar alguna función de distancia o maximizar alguna medida de similitud. Los métodos de jerárquicos se dividen a su vez en los métodos aglomerativos y divisivos. La agregación se centra en analizar la cantidad de individuos versus la cantidad de grupos en el estudio. A partir de ahí se van formando grupos en orden ascendente hasta que, al final del proceso, todos los casos quedan incluidos en un mismo grupo.

El método de disociativos o divisivos realiza el proceso inverso al método anterior. Comienzan con un conglomerado que incluye a todos los individuos. A partir de este grupo inicial se van formando grupos cada vez más pequeños mediante sucesivas divisiones. Al final del proceso, quedan tantos grupos como individuos en la muestra de estudio.

  • Técnicas:
  1. Método Aglomerativo:

Los aglomerativos inician estudios con la cantidad de grupos que existen en el estudio. Desde ese punto, se generan grupos de manera ascendente, hasta que, al concluir el proceso, todos los casos se encuentran dentro de un solo conglomerado.

  1. Método Divisivo:

El metodo divisivos lleva a cabo el proceso contrario al aglomerativo Comienzan con un conjunto que abarca a todas las personas. Desde este grupo inicial, se van creando, mediante divisiones sucesivas, grupos cada vez más reducidos. Al concluir el procedimiento, existen tantos grupos como personas en la muestra analizada.

  • Librería a usar en R:

stats: La librería stats es una de las librerías base incluidas en el lenguaje R y está diseñada para realizar análisis estadístico. Esta libreria contiene una amplia gama de funciones que sirven para el modelado, análisis, y pruebas estadísticas

factoextra: La librería factoextra es una herramienta popular que ayuda a visualizar y analizar resultados de métodos multivariantes, como análisis de componentes principales (PCA), análisis de correspondencia (CA), análisis de agrupamiento, y más.

Esta librería no ejecuta cálculos complejos por ella misma, sino que su especializacion es ayudar a visualizar y enriquecer resultados provenientes de otras funciones o paquetes como FactoMineR o cluster.

  • Funciones:

o hclust() [De stats] Usado para calcular los cluster de forma jerárquica.

Dentro de la función hclust() se especifica que método se desea ejecutar:

  1. Método del amalgamamiento simple: “single”
  2. Método del amalgamamiento completo: “complete”
  3. Método del promedio entre grupos: “average”
  4. Método del centroide: “centroid”
  5. Método de la mediana: “median”
  6. Método de Ward: “ward.D”, “ward.D2”

o fviz_dend() [De factoextra] Usado para visualizar el dendrograma.

  • Sintaxis a usar en R:

Ejemplo:

# Cargar datos de ejemplo
data("USArrests")
df <- scale(USArrests) # Normalizar datos

# Análisis jerárquico aglomerativo
dist_matrix <- dist(df, method = "euclidean") # Calcular matriz de distancia
hclust_res <- hclust(dist_matrix, method = "ward.D2") # Clustering aglomerativo

# Visualización del dendrograma
library(factoextra)
fviz_dend(hclust_res, k = 4, rect = TRUE) # Cortar en 4 conglomerados

2. Análisis de Clúster No Jerárquico

Los métodos no jerárquicos, también conocidos como parciales u optimización, el objetivo es unir individuos en K grupos. Esto significa que el investigador debe especificar a priori los grupos que debe formar, siendo la principal diferencia con los métodos jerárquicos. La asignación de individuos a grupos se logra mediante algún proceso de optimización de los criterios de selección. Otra diferencia entre estos métodos y los métodos jerárquicos es que utilizan matrices de datos sin procesar y no requieren su conversión a matrices de distancia o similitud.

  • Técnicas:
  1. K-Means: En este caso divide los datos en k conglomerados basándose en una minimización de la variación dentro de los conglomerados o clúster.

  2. K-Medoids (PAM): Similar a K-Means, pero utiliza medoids (observaciones reales) en lugar de usar promedios como centroides, lo que lo vuelve más robusto frente a valores atípicos.

  3. CLARA (Clustering Large Applications): Es una extensión de PAM que está diseñada para ejecutar un conjunto de datos grandes mediante muestras aleatorias que resulten ser representativas.

  • Librería a usar en R:

cluster: La librería cluster es una herramienta especializada en análisis de agrupamiento (clustering). Esta contiene funciones para realizar diversos métodos de agrupamiento, tanto jerárquicos como no jerárquicos, y para analizar y evaluar la calidad de los clústeres formados. Es una de las librerías más utilizadas para este propósito debido a su flexibilidad y amplia compatibilidad con otros paquetes y métodos.

stats: La librería stats es una de las librerías base incluidas en el lenguaje R y está diseñada para realizar análisis estadístico. Esta libreria contiene una amplia gama de funciones que sirven para el modelado, análisis, y pruebas estadísticas

factoextra: La librería factoextra es una herramienta popular que ayuda a visualizar y analizar resultados de métodos multivariantes, como análisis de componentes principales (PCA), análisis de correspondencia (CA), análisis de agrupamiento, y más.

  • Funciones:

o kmeans() para K-Means. o pam() para K-Medoids. o clara() para DBSCAN.

  • Sintaxis a usar en R:

K-Means:

# K-Means clustering
set.seed(123)
km_res <- kmeans(df, centers = 4, nstart = 25)

# Visualización
fviz_cluster(km_res, data = df)

K-Medoids (PAM):

library(cluster)
pam_res <- pam(df, k = 4) # K-Medoids clustering

# Visualización
fviz_cluster(pam_res, data = df)

CLARA:

# CLARA clustering
clara_res <- clara(scale(USArrests), k = 4)

# Visualización
fviz_cluster(clara_res, data = scale(USArrests))

Comparación de Librerías y Métodos:

Técnica Librerías Ideal para Visualización
Jerárquico stats, factoextra Conjuntos pequeños o medianos fviz_dend()
K-Means stats, factoextra Conjuntos grandes y datos continuos fviz_cluster()
K-Medoids cluster, factoextra Datos con valores atípicos fviz_cluster()
CLARA cluster cluster, factoextra Conjuntos grandes y representativos fviz_cluster()

4. Ejemplos desarrollados en el texto texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.)

Capitulo 4: K-Means Clustering

4.1. Carga de datos

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

4.2. Estimación del número óptimo de clústeres

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

4.3. Calculo de K-MEANS clúster

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"
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
##   cluster   Murder   Assault UrbanPop     Rape
## 1       1 13.93750 243.62500 53.75000 21.41250
## 2       2  3.60000  78.53846 52.07692 12.17692
## 3       3  5.65625 138.87500 73.87500 18.78125
## 4       4 10.81538 257.38462 76.00000 33.19231
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
##            Murder Assault UrbanPop Rape cluster
## Alabama      13.2     236       58 21.2       1
## Alaska       10.0     263       48 44.5       4
## Arizona       8.1     294       80 31.0       4
## Arkansas      8.8     190       50 19.5       1
## California    9.0     276       91 40.6       4
## Colorado      7.9     204       78 38.7       4

4.4 Accediendo a los resultados de la función kmeans()

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

4.5 Visualización de clústeres de k-medias

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

Capitulo 5: K-Medoids

5.1. datos

data("USArrests") 
df <- scale(USArrests) 
head(df, n = 3) 
##             Murder   Assault   UrbanPop         Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska  0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona 0.07163341 1.4788032  0.9989801  1.042878388

5.2. Estimación del número óptimo de clústeres

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

5.3. Cálculo de la agrupación en clústeres PAM

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"

5.4. clasificaciones de puntos a los datos originales,

dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd, n = 3)
##         Murder Assault UrbanPop Rape cluster
## Alabama   13.2     236       58 21.2       1
## Alaska    10.0     263       48 44.5       1
## Arizona    8.1     294       80 31.0       1

5.5. Accediendo a los resultados de la función pam()

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.6. Visualización de clústeres PAM.

fviz_cluster(pam.res,

palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_classic()
)

Capitulo 6: Clustering Large Applications

CLARA considera una pequeña muestra de los datos con tamaño fijo (tamaño de muestra) y aplica el algoritmo PAM para generar un conjunto óptimo de objetos para la muestra, la calidad de los mismos se mide por la disimilitud promedio entre cada objeto en todo el conjunto de datos y el objeto de su grupo. CLARA repite los procesos de muestreo y agrupamiento un número de veces predeterminado para minimizar el sesgo de muestreo.

6.1. Preparacion de los datos

Se utiliza la función set.seed y se genera un conjunto de datos aleatorios

set.seed(1234)
#500 objetos, divididos en 2 grupos
df6 <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))

# Se especifica nombres de columnas y filas
colnames(df6) <- c("x", "y")

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

# Vista previa de los datos
head(df6, 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.2. Estimar el número optimo de conglomerados

Para estimar el numero optimo de conglomerados se utiliza el metodo “silhouette” utilizando la funcion “fviz_nbclust”

# Se cargan las funciones cluster y facto extra
library(cluster)
library(factoextra)
fviz_nbclust(df6, clara, method = "silhouette")+
theme_classic()

6.3. Calcular CLARA

Se calcula el algoritmo PAM con k=2

clara.res <- clara(df6, 2, samples = 50, pamLike = TRUE)
# Se muestra clara.res
print(clara.res)
## Call:     clara(x = df6, 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"

Las salidas de la funcion clara incluye:

  • medoids: objetos que representan clusters
  • clustering: un vector que contiene el número de cluster de cada objeto
  • muestra: etiquetas o números de caso de las observaciones en la mejor muestra

6.4. Se agregan las clasificaciones a los datos originales

dd6 <- cbind(df6, cluster = clara.res$cluster)
head(dd6, 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

6.5. Se visulaizan los resultados de Clara

# Medioides
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.6. Visualizando clusters CLARA

fviz_cluster(clara.res,

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

Capitulo 7: Agglomerative Clustering

Es la agrupacion jerarquica mas común, agrupa los objetos en funcion de su similitud El algoritmo trata cada objeto como un mismo grupo, luego, fusiona pares de grupos de forma sucesiva hasta que todos se hayan funsionado en un solo grupo que contenga a todos los objetos. El resultado se presenta en un diagrama de arbol llamado “dendrograma”

7.1. Preparacion de los datos

Se utilizan los conjuntos de datos “USArrests”

data("USArrests")

# Se estandarizan los datos
df7 <- scale(USArrests)

# Se muestran los datos
head(df7, nrow = 6)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207

7.2. Se calcula la matriz de distancia

Para calcular la disimilitud entre los objetos y asi determinar que grupos deben fusionarse entre si se utiliza la funcion “dist” que mide la distancia entre los objetos y se presenta en la matriz de distancia

# Se calcula la matriz de distancia
# df7 = datos estandarizados
res.dist <- dist(df7, 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.3. Funcion de enlace

A partir de la distancia medida por la funcion “dist” la funcion de enlace agrupa en pares los grupos en funcion de su similitud y a su vez estos grupos creados se vinculan entre si para formar grupos mas grandes y asi sucesivamente hasta que todos esten agrupados jerarquicamente en un “arbol” que es creado por la funcion “hclust”

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

7.4. Dendrograma

La representacion grafica del arbol jerarquico se llama dendograma y para su elaboracion se utiliza la libraria “factoextra”

library("factoextra")
fviz_dend(res.hc, cex = 0.5)

En el árbol, cada hoja corresponde a un objeto, los que son similares entre sí se combinan en ramas, que están fusionados a mayor altura. La altura de la fusión, proporcionada en el eje vertical, indica la (des)similitud/distancia entre dos objetos/clústeres. Cuanto mayor sea la altura de la fusión, menos similares serán. Esta altura se conoce como distancia cofenética entre los dos objetos.

7.5 Verificacion del arbol

Para evaluar que las distancias(alturas) en el arbol se condicen con las distnacias orginales se calcula la correlación entre las distancias cofenéticas y los datos de distancia originales. Mientras mas acercado a 1 se encuentre el coeficiente de correlacion mas precisa sera la solucion de agrupaciondel arbol respecto a la matriz de distancia original. Los valores superiores a 0.75 se dan por buenos

#Se calculan las distancias cofeneticas
res.coph <- cophenetic(res.hc)
#Correlación entre la distancia cofenetica y la distancia original
cor(res.dist, res.coph)
## [1] 0.6975266
# Se ejecuta la funcio hclust de nuevo utilizando el metodo de enlace promedio y se utiliza "cophenetic" para evaluar la solucion de agrupamiento
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

7.6. Se divide el dendograma en diferentes grupos

# Se divide en cuatro grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# S edetermina el numero de miembros en cada grupo
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Obtener los nombres de los miembros del grupo 1
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
#Se divide en cuatro grupos y se separa por color
fviz_dend(res.hc, k = 4, # Se divide en cuatro grupos

cex = 0.5,
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # colores de los grupos
rect = TRUE 
)

Usando la “función fviz_cluster” se puede visualizar el resultado en un diagrama de dispersión.

library(factoextra)
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.7. Usando el paquete cluster

library("cluster")
# Anidamiento aglomerativo (agrupación jerárquica)
res.agnes <- agnes(x = USArrests,
stand = TRUE, # datos estandarizados
metric = "euclidean", 
method = "ward"
)

res.diana <- diana(x = USArrests,
stand = TRUE, # datos estandarizados
metric = "euclidean"
)

#Se vizualiza el resultado
fviz_dend(res.agnes, cex = 0.6, k = 4)

Capitulo 8: Comparación de dendrogramas

Tras la demostracion de cómo calcular la agrupación jerárquica (Capítulo 7), se describira aquí cómo poder comparar dos dendrogramas utilizando el paquete dendextend de R.

El paquete dendextend posee varias funciones para comparar dendrogramas. En este caso nos centraremos en dos funciones: - tanglegram() para la comparación visual de dos dendrogramas - y cor.dendlist() para calcular una matriz de correlación entre dendrogramas.

8.1. Preparación de los datos

Se usara una base de datos ya dentro de R llamada “USArrests”, trabajando con una pequeña porción de los datos, seleccionando aleatoriamente 10 de las 10 observaciones dentro del data set:

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

8.2 Comparación de dendrogramas

Se comienza creando una lista con dos dendrogramas realizando la agrupación jerárquica utilizando dos formas diferentes de enlazarlos (usando “average” y “ward.D”), posteriormente, se transforma el resultado a un dendrograma y se crea la lista que los contenga.

library(dendextend)

#Calcular la distancia de la matrix
res.dist <- dist(df.1, method = "euclidean")

#Calculas las 2 agrupaciones gerarquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")

#Crear los dos dendogramas
den1 <- as.dendrogram(hc1)
den2 <- as.dendrogram(hc2)

#Crear la lista que contenga los dendogramas
dend_list <- dendlist(den1, den2)

8.2.1. Comparación visual

Para comparar ambos dendrogramas, se utilizara la función “tanglegram()”, dentro de la librería “dendextend” y esta función muestra ambos dendrogramas, una al lado del otro con sus etiquetas conectadas por líneas.

La calidad del alineamiento de ambos “arboles” puede ser medida usando la función “entanglement()”. El enredo se mide entre 1 (completamente enredado) y 0 (sin enredo); un nivel bajo de enredo corresponde a un buen alineamiento.

tanglegram(den1,den2)

tanglegram(den1, den2,
           highlight_distinct_edges = FALSE,
           common_subtrees_color_lines = FALSE,
           common_subtrees_color_branches = TRUE,
           main = paste("entanglement =",
                        round(entanglement(dend_list),2)))

8.2.2. Matriz de correlación entre una lista de dendrogramas

La función cor.dendlist() se utiliza para calcular la matriz de correlación “baker” o “Cophenetic” entre una lista de árboles. El valor puede oscilar entre -1 y 1. Los valores cercanos a 0 significa que los dos árboles no son estadísticamente similares.

#Matriz de correlación cofénica
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
#Matriz de correlación de Baker
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000

La correlación entre ambos “arboles” puede calcularse como:

#Matriz de correlación cofénica
cor_cophenetic(den1, den2)
## [1] 0.9925544
#Matriz de correlación de Baker
cor_bakers_gamma(den1, den2)
## [1] 0.9895528

También es posible comparar simultáneamente múltiples dendrogramas. Un operador de cadena %>% es usado para correr múltiples funciones al mismo tiempo.

# Create multiple dendrograms by chaining
dend1 <- df.1 %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df.1 %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df.1 %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df.1 %>% 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
#Visualización de la matriz de correlación usando paquete de corrplot
library(corrplot)
corrplot(cors, "pie", "lower")

Capitulo 9: Visualización de dendrogramas

Como se ha descrito en los capítulos anteriores, un dendrograma es una representación basada en un diagrama de árbol de un grupo de datos usando la agrupación jerárquica. En este capítulo, se obtendrá un código de R para ver y editar dendrpgramas.

Se comenzará calculando agrupación jerárquica usando la base de datos “USArrests”:

#Cargado de la data
data(USArrests)

#Calculo de las distancias y la agrupación jerarquica
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

9.1. Vista de los dendrogramas

Usaremos la función fviz_dend()[en el paquete R factoextra] para crear fácilmente un bonito dendrograma utilizando el gráfico base de R o ggplot2. También ofrece una opción para dibujar dendrogramas circulares y árboles filogénicos.

library(factoextra)

#Creación de un dendrograma básico
fviz_dend(hc, cex = 0.5,
          main = "dendrograma-ward.D2",
          xlab = "Objetos", ylab = "Distancia", sub = "")

#Creación de un dendrograma horizontal
fviz_dend(hc, cex = 0.5, horiz = TRUE)

También es posible cortar el árbol a cierta altura, dividiendo los datos en múltiples grupos como se describió en el capítulo 7 (Agrupación Jerárquica), también es posible aplicar color a cada grupo y agregar un rectángulo al rededor de cada grupo:

fviz_dend(hc,
          k = 4,
          cex = 0.5,
          k_colors = c("#AF7AC5","#48C9B0","#F5B041","#58D68D"),
          color_labels_by_k = TRUE,
          rect = TRUE,
          rect_fill = TRUE)

También se puede cambiar el tema, utilizando los temas que se encuentran dentro de el paquete de ggplot2, algunos de estos se llaman: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void().

fviz_dend(hc,
          k = 4,
          cex = 0.5,
          k_colors = c("#AF7AC5","#48C9B0","#F5B041","#58D68D"),
          color_labels_by_k = TRUE,
          ggtheme = theme_gray()
          )

Permitiendo los valores para k_color se incluyen algunas paletas del paquete RColorBrewer además de paletas de colores de revista científica del paquete ggsci.

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

Si se quiere un diagrama horizontal con rectángulos en las agrupaciones, se usa:

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

Adicional, también se puede presentar un dendrograma circular utilizando la opción “type =”

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

Para presentar un árbol de tipo filogénico se usa en “type=”phylogenic” y también “repel = TRUE” para evitar que los niveles se superposicionen. Esta opción requiere de un paquete llamado “igraph”.

fviz_dend(hc,
          k = 4,
          cex = 0.5,
          k_colors = "jco",
          type = "phylogenic",
          repel = TRUE)

fviz_dend(hc,
          k = 4,
          k_colors = "jco",
          type = "phylogenic",
          repel = TRUE,
          phylo_layout = "layout.gem")

9.2 Caso de dendrogramas con grandes base de datos

Si quieres calcular agrupaciones jerárquicas con un gran data set, o te gustaría hacer zoom en el dendrograma o mostrar nada más un subconjunto del dendrograma.

9.2.1. Zoom a un dendrograma

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

9.2.2 Mostrar un subconjunto del dendrograma

Se debe de seguir el siguiente procedimiento:

  • Crear un dendrograma completo usando “fviz_dend()” y guarda el resultado como un objeto.

  • Utiliza la función de R llamada “cut.dendrogram()” para cortar el dendrograma, dándole una altura (h), en múltipbles subconjuntos. Esto devuelve un listado con los componentes “\(upper" y "\)lower”.

  • Observa los subconjuntos de árboles usando “fviz_dend()”.

dend_plot <- fviz_dend(hc, k = 4,cex = 0.5, k_colors = "jco")

dend_data <- attr(dend_plot, "dendrogram") 

dend_cuts <- cut(dend_data, h = 10)

fviz_dend(dend_cuts$upper)

print(dend_plot)

fviz_dend(dend_cuts$lower[[1]], main = "Subconjunto1")

fviz_dend(dend_cuts$lower[[2]], main = "Subconjunto2")

También se pueden mostrar subconjuntos circulares:

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

9.2.3. Guarda dendrogramas en un PDF

Si tienes un dendrograma grande, puedes guardarlo en un PDF al que le puedes hacer zoom sin perder calidad

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

9.3 Manipula dendrogramas usando dendextend

El paquete dendextend da funciones para cambiar facílmente la apariencia de un dendrograma y para comparar dendrogramas.

En esta sección se usará el operador de cadena %>% para simplificar el código.

  • Código estándar para crear dendrogramas:
data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

  • Código para crear dendrogramas usando el operador de cadena:
library(dendextend)
dend <- USArrests[1:5,] %>%
scale %>% 
dist %>%
hclust(method = "ward.D2") %>% 
as.dendrogram 
plot(dend)

  • Funciones para editar dendrogramas: la función “set()” puede ser usada para cambiar parámetros del dendrograma, el formato es:

\[ set (object, what, value)\] 1. Object: Objeto, en este caso un dendrograma 2. What: un carácter que indica cuál es la propiedad del árbol que debe ser cambiada o actualizada. 3. value: un vector con el valor a cambiar en el árbol (el tipo del valor depende de lo que se coloque en “what”)

library(dendextend)
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>% 
set("branches_k_color", mycols, k = 4) %>% 
set("labels_colors", mycols, k = 4) %>% 
set("labels_cex", 0.5) 
fviz_dend(dend)

Bibliografía

Landa Baella, M. del P., & Villagómez Véliz, D. C. (n.d.). Desarrollo de análisis clúster en R. Curso de Estadística Computacional. Recuperado de archivo proporcionado.

[Autor desconocido]. (n.d.). Introducción al análisis clúster: Conceptos y metodologías. Documento técnico. Recuperado de archivo proporcionado.