Estudiantes

UNIVERSIDAD DE EL SALVADOR


FACULTAD DE CIENCIAS ECONÓMICAS


ESCUELA DE ECONOMÍA CICLO II-2024



Tema:Tarea Grupal A23-Análisis de Clúster (Conglomerados)


Materia: Métodos para el Análisis Económico


Docente: MSF. Carlos Ademir Pérez Alas


GT: 03


Estudiantes:
Nombres y número de carnet
INTEGRANTES CARNET
Sandra Maribel Aparicio Fuentes AF22025
Nubia Linette Beltrán Hernández BH21010
Génesis Melissa Siguenza Rivas SR22041

Literal 1


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


El análisis de conglomerados (o clustering) es una técnica utilizada para agrupar objetos o datos en subconjuntos llamados clústeres, de manera que los objetos dentro de un clúster sean más similares entre sí en comparación con los de otros clústeres.


Es decir, que el análisis de conglomerados es una técnica estadística que agrupa datos en subconjuntos llamados conglomerados o clústeres, con el objetivo de maximizar la similitud entre los elementos dentro de un mismo grupo y, al mismo tiempo, maximizar las diferencias entre los grupos establecidos.


Existen dos enfoques principales en el análisis de conglomerados: el jerárquico y el no jerárquico. El análisis jerárquico organiza los datos en una estructura en forma de árbol. Puede ser aglomerativo, donde cada elemento comienza como un conglomerado individual y se van combinando, o divisivo, donde se parte de un conglomerado general y se divide. Por otro lado, el análisis no jerárquico, como el método k-means, requiere definir de antemano el número de conglomerados deseados y asignar cada observación al grupo más cercano según una métrica de similitud y PAM utiliza puntos reales como centroides, robusto frente a valores atípicos.

Literal 2


Elabore un cuadro comparativo, que incluya los siguientes elementos: (Lo indicado en rojo corresponde a los elementos a redactar, en la versión a ser entregada debe aparecer el texto negro normal.)


ANALISIS DE CLUSTER

Análisis de

Clúster

Técnicas

disponibles

Ventajas

Desventajas

Jerárquico:

Este enfoque busca identificar grupos discretos basados en la similitud entre sus elementos. Los grupos se estructuran jerárquicamente y se pueden visualizar mediante un dendrograma. En este tipo de análisis, no es necesario establecer el número de clústeres previamente, y los métodos se clasifican en aglomerativos y divisivos

(nubia)

Métodos jerárquicos aglomerativos:

  • Método de vinculación máxima o completa.
  • Método de enlace mínimo o simple.
  • Método de vinculación media o promedio.
  • Método de enlace centroide.
  • Método de varianza mínima de Ward.

Métodos jerárquicos divisivos:

  • Método de la distancia promedio de separación: (Dillon y Goldstein 1984).

Genera estructura ilustrativa para determinar el número de conglomerados, mediante el dendrograma.

Esta implementación es fácil y accesible a comparación de la agrupación jerárquica.

Es más eficiente en informática, particularmente en un valor pequeño de K. Por ende, se considera que K-Means se presenta como una técnica estable y versátil.

Resalta en situaciones de error.

Las decisiones incorrectas son inalterables, dado que no es posible deshacer los pasos previos.

La complejidad temporal puede llevarnos a cálculos extensos por lo que afecta su eficiencia. Asimismo, la gran cantidad de cálculos requeridos puede limitar su uso en conjuntos de datos grandes.

Por otro lado, la imposibilidad de ajustar una partición errónea una vez realizada presenta un desafío adicional en cuanto a flexibilidad.

No jerárquico (Particionamiento):

Son técnicas de análisis que permiten clasificar observaciones en un conjunto de datos, dividiéndolas en varios grupos o clústeres en función de su similitud. Previo a emplear  estos métodos, el analista debe especificar el número de grupos que desea crear, lo cual es un requisito esencial para algoritmos como el k-means. Para  este caso, "k" representa la cantidad de grupos predefinidos, y el algoritmo se encarga de asignar cada observación al grupo cuya "media" o centroide esté más cerca.

Este tipo de métodos se caracteriza por que tiene una asignación de observaciones a grupos, maximización de la homogeneidad dentro de los grupos, maximización de la heterogeneidad entre grupos.

 Estos métodos son más útiles cuando se trabaja con grandes cantidades de datos, ya que permiten segmentar el conjunto de datos de manera eficiente y detectar patrones en los datos, realizando que cada grupo sea específicamente significativo.

  • K-Medias
  • CLARA
  • K-Medoides

Maximización de la homogeneidad y heterogeneidad:

Estos métodos clasifican las observaciones de manera que los elementos de un mismo grupo sean lo más parecidos posible (homogeneidad), mientras que los diversos grupos sean lo más diferentes entre sí (heterogeneidad). Esto facilita la identificación de patrones claros en los datos.

Flexibilidad en la elección del número de grupos:

A diferencia de otros métodos, el investigador puede elegir la cantidad de grupos deseados aún después de que se ha ejecutado el algoritmo, lo que posibilita ajustar el análisis para obtener resultados más específicos o generales, según sea necesario.

Necesidad de especificar los centroides iniciales:

Para aplicar estos métodos, es necesario definir los centroides iniciales o media, que representan los valores promedio de las variables dentro de cada grupo. Estos centroides, también llamados semillas, son un punto de partida fundamental para el agrupamiento, pero pocas veces se conocen con anticipación.

Dependencia de la semilla inicial:

La calidad del agrupamiento final depende de qué tan bien se ajusten los centroides iniciales a la estructura real de los datos. Si estos no se seleccionan adecuadamente, los resultados pueden ser poco representativos. Debido a esto, no es recomendable que el software elija los centroides de manera aleatoria, ya que esto podría afectar la precisión del análisis.

Fuente: Elaboración propia con base en : “Landa y Pilar (S.F), obtenido de DESARROLLO DE ANÁLISIS CLÚSTER EN R.” y “Kassambara, A. (2017). Obtenido de Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHD”

Literal 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.

METODOS JERÁRQUICOS

1. Métodos jerárquicos aglomerativos:

La función es primero considerando cada observación como un clúster independiente, posteriormente, en cada paso, se combinan los clústeres más similares según alguna medida de similitud o distancia.


Este proceso continúa hasta que todos los clústeres se han fusionado en un único clúster grande, que incluye todas las observaciones.(hay que tener en cuenta que este método es mejor para identificar conglomerados pequeños)

En pocas palabras,inicia cada punto como un clúster individual y los combina gradualmente.


La agrupación aglomerativa es buena para identificar agrupaciones pequeñas, mientras que la agrupación divisiva es buena para identificar agrupaciones grandes


Pasos para la agrupación jerárquica aglomerativa


1. Preparación de los datos colocar.


2. Calcular información de similitud entre cada par de objetos en el conjunto de datos.


3. Usar la función de vinculación para agrupar objetos en un árbol de clúster jerárquico, según la información de distancia generada en el paso 1. Los objetos/clústeres que están muy cerca se vinculan entre sí mediante la función de vinculación.


4. Determinar dónde dividir el árbol jerárquico en grupos. Esto crea un partición de los datos.


Métodos de enlace más comunes:


  • Método de vinculación máxima o completo: Define la distancia entre dos clústeres como la máxima distancia entre pares de elementos de ambos grupos.


  • Método de enlace mínimo o simple: Mide la distancia entre dos clústeres como la mínima distancia entre elementos individuales de cada clúster.


  • Método de vinculación media o promedio: Calcula la distancia promedio entre todos los pares de elementos de los clústeres.

  • Método de enlace centroide: Mide la distancia entre los centroides de dos clústeres


  • Método de varianza mínima de Ward: Minimiza la varianza total dentro de los clústeres en cada paso.


2. Métodos jerárquicos divisivos:

El análisis jerárquico divisivo, también conocido como DIANA, es considerado la inversa de la agrupación aglomerativa, por lo que funciona de manera “de arriba hacia abajo”. Inicia considerando que todos los objetos están en un único clúster grande. En cada avance, el clúster más heterogéneo se divide en subgrupos más pequeños, este proceso continúa hasta que cada observación se convierte en un clúster propio. (hay que tener en cuenta que este método es mejor para identificar conglomerados grandes)

  • Método de la distancia promedio de separación: (Dillon y Goldstein 1984). Inicia con todos los datos en un solo clúster y los divide iterativamente en subgrupos más heterogéneos.

Implementación en R utilizando Librerías

1. PAQUETE FACTOEXTRA


El paquete factoextra es utilizado para la visualización de dendrogramas generados por el análisis jerárquico.


PASOS:


1. Instalación del paquete: Asegurarse de intalar el paquete:

# install.packages("factoextra")

2. Preparación de los datos: Los datos deben ser una matriz numérica con filas que representan observaciones y columnas que representan variables. Normalice las variables utilizando la función scale() de R para garantizar comparabilidad entre variables medidas en diferentes escalas.

# Cargar los datos
data("USArrests")
# Normalizar los datos
df <- scale(USArrests)
# Mostrar las “n” (número de filas)
head(df, nrow = n)
##                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


3. Cálculo de medidas de similitud o distancia:


Utilice la función dist() para calcular distancias entre observaciones:

# Calcular la matriz de disimilitud
# df = los datos estandarizados
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

la función dist() calcula la distancia entre las filas de una matriz de datos utilizando el método de medida de distancia especificado.


4. Agrupamiento jerárquico (vinculación):


Aplique la función hclust() para crear un árbol jerárquico basado en la matriz de distancias.

res.hc <- hclust(d = res.dist, method = "ward.D2")
  • d: una estructura de disimilitud producida por la función dist() .


  • method: es el método de aglomeración que se utilizará para calcular la distancia entre conglomerados. Los valores permitidos son “ward.D”, “ward.D2”, “single”, “complete”, “average”, “mcquitty”, “median” o “centroid”.


5. Determinación del número de clusters:


Para cortar el dendrograma y dividir los datos en clusters específicos, utilice la función cutree():

library(factoextra)
fviz_dend(res.hc, k = , # Cortar en “k” grupos
cex = , # tamaño de la etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # colorear etiquetas por grupos
rect = TRUE # Añadir rectángulo alrededor de los grupos
)

6. Uso para visualización de dendrogramas:


Una vez instalado, se pueden crear dendrogramas estéticos utilizando la función fviz_dend(hc,cex). Donde hc es el objeto jerárquico creado con hclust().


2. PAQUETE DENDEXTEND


dendextend permite comparar y manipular endrogramas. Proporciona funciones como:


  • tanglegram(): para comparación visual de dos dendrogramas.


  • cor.dendlist(): calcula la matriz de correlación entre dendrogramas.


3. PAQUETE CLUSTER


El paquete cluster incluye funciones como agnes() y diana() que ejecutan todos los pasos necesarios para el clustering jerárquico de manera integrada, eliminando la necesidad de usar scale(), dist() y hclust() separadamente. (Función diana()Realiza clustering jerárquico divisivo).

library("cluster")
res.agnes <- agnes(x = USArrests, # matriz de datos
stand = TRUE, # Estandarizar los datos
metric = "euclidean", # métrica para la matriz de distancias
method = "ward" # Método de vinculación
)

# DIvisive ANAlysis Clustering
res.diana <- diana(x = USArrests, # matriz de datos
stand = TRUE, # estandarizar los datos
metric = "euclidean" # métrica para la matriz de distancias
)


#Después de ejecutar agnes() y diana(), puede utilizar la función fviz_dend()[en factoextra] para visualizar el resultado:

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

METODOS NO JERÁRQUICAS


1. K-medias:


Es un algoritmo de agrupación no supervisado utilizado para dividir un conjunto de datos en un conjunto de k clústeres predefinidos por el analista. Su objetivo es que los datos se organicen de tal manera que los puntos dentro de un clúster sean lo más parecidos posible entre sí, en cambio los puntos de diferentes clústeres sean los más diferentes posibles.


Pasos a utilizar en esta agrupación:


1- Selecciona aleatoriamente k centroides que sirven como centros iniciales de los clústeres.


2- A cada uno de los objetos restantes se asigna a su centroide más cercano, según una medida de distancia (por ejemplo, la distancia euclidiana).


3-Recalcular los centros y volver a comprobar que cada observación si podría estar más cerca de un grupo diferente.


4- Estos dos últimos pasos se repiten hasta que las asignaciones de clúster dejan de cambiar o se alcance un número máximo de iteraciones.


Paquetes y funciones de R necesarios


La función estándar de R para la agrupación k-means es kmeans() [paquete stats], cuyo formato simplificado es el siguiente:

#library(stats)
#kmeans(x,centers, iter.max = 10, nstart = 1)

Donde:

  • x: marco de datos númericos


  • centros: Los valores posibles son el número de conglomerados (k) o un conjunto de centros de conglomerados iniciales (distintos). Si es un número, se elige un conjunto aleatorio de filas (distintas) en x como centros iniciales


  • iter.max: el número máximo de iteraciones permitidas.


  • nstart: el número de particiones iniciales aleatorias cuando centers es un número.


Además para crear un gráfico de los clústeres generados, se utilizara el paquete factoextra.

# install.packages("factoextra")
# library(factoextra)

2. K-medoides o PAM (Partitioning Around Medoids):


Es un algoritmo de agrupamiento semejante al k-medias ya que los dos agrupan las observaciones en k clústeres, aunque el k-medoides es más robusto frente al ruido y a los valores atípicos. En este agrupamiento, cada clúster está representado por uno de los medoides de clúster, que es el punto del grupo con la más mínima disimilitud promedio en relación a los demás miembros, comportándose como un representante central del clúster. A diferencia de k-medias, que aplica la media como centroide.


El método de agrupamiento de k-medoides más común es el algoritmo PAM (Partitioning Around Medoids) y los pasos a seguir son los siguientes:


1- Seleccione k objetos para que se conviertan en medoides iniciales


2- Calcula la matriz de disimilitud si no se prorciono


3- Asignar cada objeto a su medoide más cercano


4- Cada uno de los cluster creados, comprobar si seleccionando otra observación como medoide se consigue reducir la distancia promedio del cluster, si esto sucede, seleccionar la observación que consiga una mayor reducción como nuevo medoide.


5- Si al menos un medioide ha cambiado en el paso 4, se regresa al paso 3, de lo contrario se finaliza el algoritmo.


Paquetes y funciones de R necesarios


Las funciones pam() [paquete cluster] y pamk() [paquete fpc] pueden utilizarse para calcular PAM.


La función pamk() no requiere que el usuario decida el número de conglomerados K.


En los siguientes ejemplos, describiremos sólo la función pam(), cuyo formato simplificado es:

# pam(x, k, métrica = "euclídea", stand = FALSE)
  • x: los valores posibles son:


  • Matriz de datos numéricos o marco de datos numéricos: cada fila corresponde a una observación y cada columna a una variable. – Matriz de disimilitud: en este caso x suele ser la salida de daisy() o dist()


  • k: El número de conglomerados


  • métrica: la métrica de distancia que se utilizará. Las opciones disponibles son “euclídea” y “manhattan”.


  • stand: valor lógico; si es verdadero, las variables (columnas) de x se estandarizan antes de calcular las disimilitudes. Se ignora cuando x es una matriz de disimilitudes.


Para crear un bonito gráfico de los clusters generados con la función pam(), utilizaremos el paquete factoextra

# librerias a utilizar
library(cluster) 
library(factoextra)

3.CLARA (Clustering Large Applications):


Es un método diseñado para manipular conjunto de datos grandes de forma eficiente. Selecciona bastantes muestras pequeñas en proporción fijo (sampsize) en vez de trabajar con todo el conjunto de datos. Para hallar los medoides óptimos aplica el algoritmo PAM en cada muestra. Realiza la evaluación de la calidad de los medoides por medio del cálculo de la disimilitud promedio entre todos los puntos del conjunto de datos completos y el medoide correspondiente de su clúster. Su resultado final corresponde seleccionando el conjunto de medoides con el menor costo, garantizando un agrupamiento eficaz y representativo.


Los pasos a seguir en este algoritmo son los siguientes:


1- Se divide aleatoriamente los conjuntos de datos en múltiples subconjuntols con un tamaño fijo (sampsize)


2- Calcular el algoritmo PAM en cada subconjunto y elija los k objetos representativos (medoides) correspondientes. Asigna cada observación de todo el conjunto de datos al medoide más cercano


3- Calcular la media (o la suma) de las diferencias de las observaciones con respecto a su medoide más cercano. Esto se utiliza como medida de la bondad del agrupamiento


4- Conserve el subconjunto de datos para el que la media (o la suma) es mínima


Paquetes y funciones de R necesarios


La función clara() [paquete cluster] puede utilizarse para calcular CLARA. El formato simplificado es el siguiente:

# clara(x, k, métrica = "euclídea", stand = FALSE, muestras = 5, pamLike = FALSE)

x: matriz de datos numéricos o marco de datos, cada fila corresponde a una observación y cada columna a una variable. Se permiten valores perdidos (NA).


k: el número de conglomerados.


métrica: la métrica de distancia que se utilizará. Las opciones disponibles son “euclídea” y “manhattan”. Las distancias euclidianas son la suma de los cuadrados de las diferencias, y las distancias manhattan son la suma de las diferencias absolutas.


stand: valor lógico; si es verdadero, las variables (columnas) en x se estandarizan antes de calcular las disimilitudes. Tenga en cuenta que se recomienda estandarizar las variables antes de agruparlas


samples: número de muestras a extraer del conjunto de datos. El valor por defecto es 5 pero se recomienda un valor mucho mayor.


pamLike: lógico que indica si se debe utilizar el mismo algoritmo de la función pam(). Debe ser siempre verdadero.


Para crear un bonito gráfico de los clusters generados con la función pam(), utilizaremos el paquete factoextra.

# librerias a utilizar
library(cluster) 
library(factoextra)

Literal 4


Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA.desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.


Ejemplo del Capítulo 4: Agrupamiento de K-medias


4.3 Cálculo de la agrupación en clústeres de k-medias en R


4.3.1 Datos

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

4.3.2 Paquetes y funciones necesarios


Se necesita la función de R Kmeans() para el agrupamiento de K-medias, que pertenece al paqueta stats:

# library(stats)
# kmeans(x, centros, iter.max = 10, nstart = 1)

Ejemplo: En el gráfico se muestra que K=4


4.3.4 Cálculo de la agrupación en clústeres de k-medias


# Calcule K-medias con k=4

set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)

# Imprime los resultado

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"

Es posible calcular la media de cada variable por conglomerados utilizando los datos originales:

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

Si desea agregar las clasificaciones de puntos a los datos originales, se puede usar:

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.1.5 Acceso a los resultados de la función kmeans()


Componentes de la funcion Kmeans():

  • clpuster: Un vector de números enteros (de 1: k) indica el grupo al que se asigna cada punto


  • centros: Una matriz de centros de conglomerados (medias de conglomerados)


  • totss: La suma total de cuadrados (TSS), es decir (XI ≠ x̄)2. TSS mide la varianza total en los datos.


  • whithinss: Vector de suma de cuadrados dentro del conglomerado, un componente por conglomerado


  • tot.withinss: Suma total de cuadrados dentro del conglomerado, es decir suma(dentro)


  • beteweenss: La suma de cuadrados entre grupos, es decir totss ≠ tot.withinss


  • size: El número de observaciones en cada grupo


Para conocer el Número de conglomerado para cada una de las observaciones:

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
# tamaño del cluster
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.1.6 Visualización de clústeres de k-medias


Si tenemos un conjunto de datos multidimensionales, una solución es realizar un análisis de componentes principales (PCA) y trazar los puntos de datos de acuerdo con las coordenadas de los dos primeros componentes principales.


La función fviz_cluster() del paquete factoextra se puede utilizar para visualizar fácilmente los clústeres de kmedias. Toma los resultados de k-medias y los datos originales como argumentos


fviz_cluster(km.res, data = df,

palette = c("#00BFFF", "#FF1493", "#68228B", "#00008B"),
ellipse.type = "euclid", #Eclipse de concentración
star.plot = TRUE, # Añadir segmentos desde los centroides a los items
repel = TRUE, # Evitar sobretrazado de etiquetas (lento)
ggtheme = theme_minimal()
)

Ejemplo del capitulo 5: K-Medoides

5.3 Cálculo de PAM en R


5.3.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.3.2 Paquetes y funciones R necesarios


La función pamk() no requiere que el usuario decida la cantidad de clústeres K.

# library(cluster)
# pam(x, k, metric = "euclidean", stand = FALSE)

5.3.3 Estimación del número óptimo de conglomerados

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

5.3.4 Cálculo de la agrupación PAM


Se calcula el algoritmo PAM con k = 2:

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"

Para añadir las 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.3.5 Acceso a los resultados de la función pam()

# Medoides de racimo: Nuevo México, 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
# Números de clúster
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

5.3.6 Visualización de los clusters PAM

fviz_cluster(pam.res,
             palette = c("#00FF00", "#EE30A7"), # paleta de colores
             ellipse.type = "t", # cocentración ellipse
             repel = TRUE, # Evtar sobretrazado de etiquetas(lento)
             ggtheme = theme_classic()
)

Ejemplo del Capítulo 6: CLARA - Clustering Large Applications (Agrupación de grandes aplicaciones)


6.3 Cálculo de CLARA en R


6.3.1 Formato y preparación de los datos

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

6.3.2 Paquetes y funciones R necesarios


La funcion clara() se usa pra clcular CLARA.

# library(cluster)
# clara(x, k, metric = "euclidean", stand = FALSE,
# samples = 5, pamLike = FALSE)

6.3.3 Estimación del número óptimo de conglomerados


Para estimar la cantidad óptima de clústeres en sus datos, es posible utilizar el método de silueta promedio

# Cargar la libreria "cluster" y "factoextra"
library(cluster)
library(factoextra)
fviz_nbclust(df,clara,method = "silhouette")+
  theme_classic()

6.3.4 Informática CLARA


El siguiente código R calcula el algoritmo PAM con k = 2:

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

Si desea añadir las clasificaciones de puntos a los datos originales:

# 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

Para acceder a los resultados devueltos por clara():

# Para que aparezcan los resultados devueltos por clara()
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.3.5 Visualización de clústers CLARA

fviz_cluster(clara.res, palette = c("blue", "red"), # paleta de colores
             ellipse.type = "t", # Elipse de concentración 
             geom = "point", pointsize = 1,
             ggtheme = theme_classic()
)

Ejemplo capitulo 7: Aglomeración aglomerativa


7.2.1 Estructura y preparación de los datos

# Cargar los datos
data("USArrests")

# Estandarizar los datos
df <- scale(USArrests)

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

7.2.2 Medidas de similitud

# Calcular la matriz de disimilitud
# df = los datos estandarizados
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.2.3 Enlace

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

7.2.4 Dendrograma

# cex: tamaño de etiqueta
fviz_dend(res.hc,cex = 0.5)

7.3 Verificar el árbol del clúster

# Calcular la distancia cofentica
res.coph <- cophenetic(res.hc)

# Correlación entre distancia cofenética y la distancia original
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.4 Cortar el dendrograma en diferentes grupos

# Cortar el árbol en 4 grupos.
grp <- cutree(res.hc,k = 4)
head(grp,n=4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Número 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 (cluster).
rownames(df)[grp==1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cortar en 4 grupos y colorear por grupos.
fviz_dend(res.hc, k = 4, 
          cex = 0.5,
          k_colors = c("blue", "green", "#E7B800", "red"),
          color_labels_by_k = TRUE, 
          rect = TRUE 
)

Utilizando la función fviz_cluster() [en factoextra], también podemos visualizar el resultado en un diagrama de dispersión

fviz_cluster(list(data = df, cluster = grp),
             palette = c("blue", "green", "#E7B800", "red"),
             ellipse.type = "convex", 
repel = TRUE,
             show.clust.cent = FALSE, ggtheme = theme_minimal())

7.5. Paquete clúster R

library("cluster")
# Anidamiento aglomerativo (agrupamiento jerárquico)
res.agnes <- agnes(x = USArrests, # data matrix
stand = TRUE, # Estandarizar los datos
metric = "euclidean", # métrica para la matriz de distancia
method = "ward" # Método de vinculación
)
# Análisis divisorio Agrupamiento
res.diana <- diana(x = USArrests, # data matrix
stand = TRUE, 
metric = "euclidean" 
)

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

Ejemplo Capítulo 8: Comparacion de Dendogramas.


8.1 Preparación de datos


Para hacer legibles los gráficos, generados en las siguientes secciones, trabajaremos con un pequeño subconjunto aleatorio del conjunto de datos. Por lo tanto, usaremos la función sample () para seleccionar al azar 10 observaciones entre las 50 observaciones contenidas en el conjunto de datos:

df <- scale(USArrests)

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

8.2 Comparación de dendrogramas


Comenzamos creando una lista de dos dendrogramas calculando agrupamiento jerárquico (HC) usando dos métodos de enlace diferentes (“promedio” y “ward.D2”). A continuación, transformamos los resultados como dendrogramas y creamos una lista para contener los dos dendrogramas.

library(dendextend)

# Calculamos la matriz de disimilitud o de distancia

res.dist <- dist(df, method = "euclidean")

# Ejecuamos los agrupamientos jerarquicos

hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")

# Creamos los dos dendogramas

dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)

# Creamos una lista que contenga los dos dendogramas

dend_list <- dendlist(dend1, dend2)

8.2.1 Comparación visual de dos dendrogramas

tanglegram(dend1, dend2)

Otra opción:

# Perzonalizado se veria asi:

tanglegram(
  dend1,
  dend2,
  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


Estas matriz se pueden usar cuando sean mas de dos dendogramas, pero primero deben de estar en una lista.

# Matriz de Correlacion Cofenetica

cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Matriz de Correlacion de Baker
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000

Para tener la correlacion entre solo dos dendogramas:

# Coeficiente de correlación cofenética
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Coeficiente de correlación de Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528

Comparar multiples dendogramas:

library(kableExtra)

# Creamos multiples Dendogramas encadenando. Pero cada dendograma utiliza un metodo distinto

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

# Elaboramos la Matriz de Correlaciones

dend_list <- dendlist(
  "Complete" = dend1,
  "Single" = dend2,
  "Average" = dend3,
  "Centroid" = dend4
)
cors <- cor.dendlist(dend_list)

# se imprime el resultado

round(cors, 2) %>%
  kable(caption = "Matriz de Correlacion de Multiples Dendogramas",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "white",
           background = "#228B22")
Matriz de Correlacion de Multiples Dendogramas
Complete Single Average Centroid
Complete 1.00 0.46 0.45 0.30
Single 0.46 1.00 0.23 0.17
Average 0.45 0.23 1.00 0.31
Centroid 0.30 0.17 0.31 1.00
# Visualice la matriz de correlación

library(corrplot)
corrplot(cors, "pie", "lower")

Capitulo 9: Visualizacion de Dendogramas.

Datos

# Cargar datos
data(USArrests)
# Calculamo las distancias y los agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

9.1 Visualización de dendrogramas

library(dendextend)
library(factoextra)
library(ggplot2)
library(khroma)

fviz_dend(hc, cex = 0.5)

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

# para colocar en posicion horizontal el dendograma
fviz_dend(hc, cex = 0.5, horiz = TRUE)

# Realizamos la Particion o corte del Arbol en multiples grupos. 


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

fviz_dend(hc, k = 4, 
          cex = 0.5, 
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, 
          ggtheme = theme_light() 
)

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

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

# Para crear un dendograma circular
fviz_dend(
  hc,
  cex = 0.5,
  k = 4,
  k_colors = "jco",
  type = "circular"
)

# Para trazar un árbol de tipo filogénico, 
library(igraph)
fviz_dend(
  hc,
  k = 4,
  k_colors = "jco",
  type = "phylogenic",
  repel = TRUE
)

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

9.2.1 Zoom en el dendrograma

#Para Hacer Zoom
fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

9.2.2 Trazar un subárbol de dendrogramas

# Trazado de un subarbol

# Cortar el dendrograma y visualizar la versión truncada:


dend_plot <- fviz_dend(hc,
                       k = 4,
                       cex = 0.5,
                       k_colors = "jco")
dend_data <- attr(dend_plot, "dendrogram") 
# corar  h = 10
dend_cuts <- cut(dend_data, h = 10)

fviz_dend(dend_cuts$upper)

# Trazar subárboles dendrogramas:

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

# Plot subtree 2, en forma circular 

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

9.2.3 Guardar dendrograma en una página PDF grande

# Guardando en pdf un dendograma sin perder resolucion 

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

9.3 Manipulación de dendrogramas con dendextend

# COdigo Estandar para crear un dendograma
data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

# Usando la libreria dendextend
library(dendextend)
dend <- USArrests[1:5,] %>% # data
scale %>%
dist %>% 
hclust(method = "ward.D2") %>% 
as.dendrogram 
plot(dend)

Funciones para personalizar dendrogramas: La función set() [del paquete dendextend] se puede utilizar para cambiar los parámetros de un dendrograma. El formato es:

# set(object, what, value)

1. objeto: un objeto dendrograma 2.


2. qué: un carácter que indica cuál es la propiedad del árbol que debe ser establecido/actualizado


3. Valor: vector con el valor a establecer en el árbol


Personalizando los dendogramas con la libreria dendextend:

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)

BIBLIOGRAFIA

Kassambara, A. 2017. Practical Guide to Cluster Analysis in r: Unsupervised Machine Learning (Multivariate Analysis) (1st Ed.). STHDA.
Landa Baella, Maria del Pilar. n.d. DESARROLLO DE ANALISIS CLUSTER EN r.