Estudiantes

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

MÉTODOS PARA EL ANALISIS ECONOMICO

DOCENTE:

MSF. Carlos Ademir Pérez Alas.

Grupo de Teorico

Grupo 03

Integrantes: Carnet:
Alas Duarte Fátima Lourdes AD22008
Belloso Martínez Gabriela Alexandra MP22010
López Gonzalez Vanessa Iveth LG20034
Rivas Alvarado Fátima Alejandra RA22087

CIUDAD UNIVERSITARIA, 23 DE NOVIEMBRE DE 2024

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

El análisis de conglomerados, también conocido como clustering, es una técnica utilizada en minería de datos dentro del aprendizaje no supervisado. Su propósito es agrupar un conjunto de objetos en subconjuntos llamados clusters o conglomerados, basándose en su similitud. Sus características son:

  • No requiere datos previamente etiquetados. Es decir, los grupos se forman únicamente a partir de las características de los datos.

  • Emplea métricas como la distancia euclidiana, Manhattan o coeficientes de correlación para medir las similitudes entre los objetos.

  • Es aplicable a conjuntos de datos pequeños y también a grandes volúmenes.

El análisis de conglomerados tiene como meta organizar los datos en grupos homogéneos que cumplan con las siguientes condiciones:

Alta similitud intra-grupo: Los elementos dentro de un mismo cluster deben ser lo más parecidos posible.

Baja similitud inter-grupos: Los clusters resultantes deben ser claramente distintos entre sí.

Fuente: Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.).

2. Elabore un cuadro comparativo

Análisis Clúster

Técnicas disponibles

Ventajas

Desventajas

Jerárquico:

Técnica de agrupamiento que organiza datos en una estructura jerárquica que son similares.

No se conoce previamente el número de grupos a formar.

Aglomerativos:

  • Simple Linkage (Vecino más próximo)
  • Complete Linkage (Vecino más lejano)
  • Promedio entre grupos
  • Método del Centroide
  • Método de la Mediana
  • Método de Ward

Disociativos:

  • Linkage Simple
  • Linkage Completo
  • Promedio entre Grupos
  • Promedio del Centroide
  • Método de la Mediana
  • Método de Ward
  • Análisis de Asociación

  • No es necesario conocer el número de grupos a formar
  • El dendograma facilita entender las relaciones y similitudes a diferentes niveles.
  • Adecuado para un conjunto de datos pequeños
  • Permite la visualización de dendrograma, lo cual facilita entender las relaciones y similitudes a diferentes niveles.
  • Una vez que una observación o individuo ha sido asignado a un clúster, no es posible su reasignación a otro clúster distinto.
  • No puede deshacer fusiones o divisiones
  • Tiempo de cálculo largo
  • No se puede utilizar para un conjunto de datos grandes

No Jerárquico:

Se busca asignar cada individuo al grupo cuyo centroide (media) le sea más cercano.

En los métodos no jerárquicos se busca maximizar la homogeneidad dentro de los grupos y la heterogeneidad entre ellos, permitiendo que las observaciones cambien de grupo durante el proceso de agrupación.

Reasignación

  • K- Medias
  • K-medoides PAM
  • CLARA

Nubes Dinámicas

  • Búsqueda de densidad
  • Análisis Modal
  • Métodos Taxmap.

  • Se pueden aplicar a casos con un gran tamaño de muestra.
  • Buscan soluciones óptimas, es decir, la mejor configuración de grupos posible dada la medida de distancia y el número de grupos especificados.
  • Proporcionan los valores de los centroides de los grupos, lo que facilita la interpretación de los resultados.

  • Requieren que el usuario especifique el número de grupos a formar a priori, lo cual puede ser una limitación si no se tiene una idea clara de la estructura de los datos.
  • Los resultados de agrupamiento pueden variar dependiendo de la selección inicial de los centroides.
  • Algunos métodos no jerárquicos, como el de k-medias, son sensibles a la presencia de valores atípicos en los datos.

Fuente: Elaboración propia con base en Análisis conglomerados. De la Fuente Fernández, S. (2011). y Desarrollo del Análisis Cluster en R. Landa Baella, María del Pilar.

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

Según De la Fuente, (2011) el objetivo de los métodos jerárquicos es “Agrupar cluster para formar uno nuevo o separar alguno ya existente para dar origen a otros dos de forma que se maximice una medida de similaridad o se minimice alguna distancia.” Es decir, unir grupos para formar uno nuevo, o dividir uno ya existente en dos nuevos, para que los elementos dentro de cada grupo se parezcan lo más posible entre sí o estén lo más lejos posible de otros grupos. Estos se clasifican en:

Sociativos o Aglomerativos: De la Fuente (2011), explica, que en estos métodos se comienza considerando a cada individuo como un grupo independiente y se van fusionando progresivamente los grupos más similares hasta que todos los individuos pertenecen a un solo grupo.

Disociativos: En contrariedad al método Asociativo, en el disociativo se comienza con un solo grupo que incluye a todos los individuos, y mediante divisiones sucesivas, se van formando grupos más pequeños hasta que cada individuo se convierte en su propio grupo.

A Continuación se presenta una implementación en R sobre los métodos disociativos jerárquicos, donde se aplicó el método de Ward a los datos del conjunto USArrests para identificar agrupamientos entre los estados de EE.UU. basados en variables de arrestos. Ward generó el dendrograma de agrupamiento, permitiendo la identificación de 4 grupos claramente diferenciados dentro de los datos.

# Cargar las librerías necesarias
# Se cargan las librerías 'factoextra' y 'cluster', que se utilizarán para análisis y visualización de datos de agrupamiento.
library(factoextra)
library(cluster)


# Cargar el conjunto de datos 'USArrests'
# Se utiliza el conjunto de datos 'USArrests' que contiene estadísticas de arrestos en cada estado de EE.UU.
data("USArrests")

# Estandarizar los datos
# Escala (estandariza) las variables para que tengan media 0 y desviación estándar 1.
df <- scale(USArrests)

# Mostrar las primeras 6 filas de los datos estandarizados
# Muestra la cabeza del conjunto de datos, es decir, las primeras 6 filas, para verificar los datos estandarizados.
head(df, nrow = 6)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207
# Calcular la matriz de disimilitud
# Calcula la matriz de disimilitud entre cada par de observaciones utilizando la distancia euclidiana.
res.dist <- dist(df, method = "euclidean")

# Mostrar las primeras 6x6 de la matriz de disimilitud
# Muestra una porción de la matriz de disimilitud (6 filas y 6 columnas) para ver las distancias entre observaciones.
as.matrix(res.dist)[1:6, 1:6]
##             Alabama   Alaska  Arizona Arkansas California Colorado
## Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
## Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
## Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
## Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
## Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000
# Agrupamiento jerárquico utilizando el método Ward.D2
# Aplica el método de agrupamiento jerárquico Ward.D2 para construir un árbol de agrupamiento en función de las distancias calculadas.
res.hc <- hclust(d = res.dist, method = "ward.D2")

# Agrupamiento jerárquico aglomerativo con agnes
# Usa la función 'agnes' para realizar un agrupamiento jerárquico aglomerativo en los datos.
res.agnes <- agnes(
  USArrests,          # Matriz de datos original
  stand = TRUE,       # Estandarizar los datos
  metric = "euclidean",# Métrica de distancia
  method = "ward"     # Método de vinculación
)

# Agrupamiento jerárquico divisivo con diana
# Usa la función 'diana' para realizar un agrupamiento jerárquico divisivo en los datos.
res.diana <- diana(
  USArrests,          # Matriz de datos original
  stand = TRUE,       # Estandarizar los datos
  metric = "euclidean"# Métrica de distancia
)

# Visualizar el dendrograma y cortar el árbol jerárquico en 4 grupos
# Visualiza el dendrograma del agrupamiento jerárquico y lo divide en 4 grupos.
fviz_dend(res.agnes, cex = 0.6, k = 4)

NO JERÁRQUICOS Los métodos no jerárquicos “Están diseñados para la clasificación de individuos (no de variables) en K grupos. El procedimiento es elegir una partición de los individuos en K grupos e intercambiar los miembros de los clusters para tener una partición mejor.” (De la Fuente, 2011) Se clasifican en:

Reasignación: K-medias y nubes didácticas.

Búsqueda de densidad: Método de Wolf, Método de Fortin, Métodos Taxap, Análisis Modal.

Métodos directos: Block Clustering.

Métodos reductivos: Análisis Factorial tipo Q.

Implementaremos a modo de explicación el método K-means y PAM. El método K-medias, no crea una jerarquía de clústeres. En lugar de eso, divide el conjunto de datos en un número fijo de clústeres (en este caso 4) basándose en las distancias entre los puntos y los centros de los clústeres (centroides). En cambio el método PAM, los “centroides” son puntos reales de los datos llamados medoids. Es decir, un “medoid” es el punto más cercano a todos los demás puntos en su clúster.

# Cargar y escalar los datos
data("USArrests")  # Carga el conjunto de datos USArrests, que contiene datos de crímenes en Estados Unidos.
df <- scale(USArrests)  # Escala los datos para que todas las variables tengan media 0 y desviación estándar 1. Esto es importante para evitar que las variables con rangos más grandes dominen el análisis.
head(df, n = 3)  # Muestra las primeras tres filas para visualizar cómo se ven los datos escalados.
##             Murder   Assault   UrbanPop         Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska  0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona 0.07163341 1.4788032  0.9989801  1.042878388
# Configuración para clustering K-means
library(factoextra)  # Paquete para la visualización de los resultados de clustering.

set.seed(123)  # Fija la semilla aleatoria para asegurar que los resultados sean reproducibles. Esto es útil si queremos obtener el mismo resultado cada vez que ejecutemos el código.
km.res <- kmeans(df, centers = 4, nstart = 25)  # Ejecuta el algoritmo K-means con 4 clústeres. 'nstart = 25' significa que el algoritmo hará 25 inicios aleatorios para evitar caer en soluciones subóptimas.

# Imprimir los resultados de K-means
print(km.res)  # Muestra los resultados del clustering K-means: asignación de clústeres y los centroides de cada clúster.
## K-means clustering with 4 clusters of sizes 8, 13, 16, 13
## 
## Cluster means:
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964
## 
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              4              4              1              4 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              4              3              3              4              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              4              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              4 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              4              2              1              4 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              4              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              4              4              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              4              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3 
## 
## Within cluster sum of squares by cluster:
## [1]  8.316061 11.952463 16.212213 19.922437
##  (between_SS / total_SS =  71.2 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
# Visualización de los clústeres obtenidos por K-means
fviz_cluster(km.res, data = df, geom = "point", ellipse.type = "convex", ggtheme = theme_minimal())  

# Visualiza los resultados del clustering K-means. Los puntos se asignan a los clústeres, y las elipses convexas rodean cada clúster, ayudando a visualizar los grupos.
# Configuración para clustering PAM (Partitioning Around Medoids)
library(cluster)  # Paquete necesario para ejecutar el algoritmo PAM.
library(fpc)  # Paquete que incluye la función pamk() para encontrar el número óptimo de clústeres automáticamente.

# Ejecutar PAM con k = 4 medoids
pam.res <- pam(df, k = 4)  # Ejecuta el algoritmo PAM con 4 clústeres (medoids). A diferencia de K-means, PAM usa puntos reales de los datos como los "medoids" (representantes del clúster).

# Visualizar los clústeres de PAM
fviz_cluster(pam.res, data = df, geom = "point", ellipse.type = "convex", ggtheme = theme_minimal())  

# Similar a K-means, se visualizan los resultados de PAM mostrando los puntos de los datos y las elipses convexas alrededor de cada clúster.

# Alternativa: Usar pamk() para seleccionar automáticamente el número óptimo de clústeres
pamk.res <- pamk(df)  # pamk() selecciona automáticamente el número óptimo de clústeres basado en un criterio de validación interna.

# Visualizar los resultados de pamk() con el número óptimo de clústeres
fviz_cluster(pamk.res$pamobject, data = df, geom = "point", ellipse.type = "convex", ggtheme = theme_minimal())  

# Visualiza los resultados de PAM con el número óptimo de clústeres determinado por pamk().

# Imprimir los resultados de PAM
print(pam.res)  # Muestra los resultados del algoritmo PAM con los medoids y las asignaciones de los clústeres.
## Medoids:
##               ID     Murder    Assault   UrbanPop         Rape
## Alabama        1  1.2425641  0.7828393 -0.5209066 -0.003416473
## Michigan      22  0.9900104  1.0108275  0.5844655  1.480613993
## Oklahoma      36 -0.2727580 -0.2371077  0.1699510 -0.131534211
## New Hampshire 29 -1.3059321 -1.3650491 -0.6590781 -1.252564419
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              2              2              1              2 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              2              3              3              2              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              4              2              3              4 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              3              1              4              2 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              2              4              1              3 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              3              3              2              4              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              2              2              1              4              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              4              1              2              3              4 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              4              4              3 
## Objective function:
##    build     swap 
## 1.035116 1.027102 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

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.

Capítulo 4: K-Means Clustering

Selección del número óptimo de clusters

El método del codo (wss) evalúa la suma total de distancias intracluster para diferentes valores de 𝑘.

library(factoextra)
data("USArrests")
df <- scale(USArrests) # Escala las variables para que tengan media 0 y desviación estándar 1

# Visualización del número óptimo de clusters según el método del codo
fviz_nbclust(df, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2) # El libro sugiere que el codo aparece en k=4

Cálculo de clustering K-means

El cálculo incluye 25 inicializaciones para minimizar el riesgo de converger a un mínimo local.

set.seed(123) # Aseguramos resultados reproducibles
km.res <- kmeans(df, centers = 4, nstart = 25)

# Imprimir el resultado del clustering
print(km.res)
## K-means clustering with 4 clusters of sizes 8, 13, 16, 13
## 
## Cluster means:
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964
## 
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              4              4              1              4 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              4              3              3              4              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              4              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              4 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              4              2              1              4 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              4              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              4              4              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              4              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3 
## 
## Within cluster sum of squares by cluster:
## [1]  8.316061 11.952463 16.212213 19.922437
##  (between_SS / total_SS =  71.2 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Resumen y asignación de clusters al dataset original

El libro sugiere usar aggregate para calcular los promedios de las variables por cluster y agregar los resultados al dataset original.

# Promedios por cluster
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
# Agregar la columna de asignación de clusters al dataset original
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
##            Murder Assault UrbanPop Rape cluster
## Alabama      13.2     236       58 21.2       1
## Alaska       10.0     263       48 44.5       4
## Arizona       8.1     294       80 31.0       4
## Arkansas      8.8     190       50 19.5       1
## California    9.0     276       91 40.6       4
## Colorado      7.9     204       78 38.7       4

Visualización de los clusters

El libro indica el uso de PCA para reducir la dimensionalidad y graficar los clusters en un espacio bidimensional. La visualización utiliza fviz_cluster.

library(factoextra)

# Visualización de clusters
fviz_cluster(
  km.res, 
  data = df,
  palette = c("#2E9FDF", "#00AFBB", "#E8B800", "#FF4E07"),
  ellipse.type = "euclid", # Basado en distancias euclidianas
  star.plot = TRUE, # Conexión de puntos al centroide
  repel = TRUE, # Evita superposiciones
  ggtheme = theme_minimal()
)

CAPÍTULO 5: PAM (Partitioning Around Medoids)

Selección del número óptimo de clusters con el método Silhouette

El libro utiliza el método silhouette para determinar el número adecuado de clusters.

library(cluster)

# Determinar el número óptimo de clusters
fviz_nbclust(df, pam, method = "silhouette") +
  theme_classic()

Cálculo del clustering PAM

El clustering PAM se centra en la selección de medoids, que son puntos representativos dentro de los clusters.

pam.res <- pam(df, k = 2)

# Imprimir los resultados
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"

Resumen y asignación de clusters al dataset original

Como en el caso de K-means, el libro indica cómo agregar la columna de clusters y obtener los medoids.

# Agregar la asignación de clusters al dataset original
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd)
##            Murder Assault UrbanPop Rape cluster
## Alabama      13.2     236       58 21.2       1
## Alaska       10.0     263       48 44.5       1
## Arizona       8.1     294       80 31.0       1
## Arkansas      8.8     190       50 19.5       2
## California    9.0     276       91 40.6       1
## Colorado      7.9     204       78 38.7       1
# Medoids (representantes de los clusters)
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

Visualización de los clusters

El libro sugiere el uso de fviz_cluster para visualizar los resultados, resaltando los medoids como centros de los clusters.

fviz_cluster(
  pam.res, 
  palette = c("#00AFBB", "#FC4E07"),
  ellipse.type = "t", # Elipses basadas en la distribución t
  repel = TRUE,
  ggtheme = theme_minimal()
)

Capítulo 6: CLARA - Agrupación de grandes aplicaciones

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

# Este código sirve para determinar el número óptimo de clústeres en un conjunto de datos (df) utilizando el algoritmo CLARA (Clustering Large Applications) y el método del coeficiente de silueta. 
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
print(clara.res)
## Call:     clara(x = df, k = 2, samples = 50, pamLike = TRUE) 
## Medoids:
##                Murder    Assault   UrbanPop       Rape
## New Mexico  0.8292944  1.3708088  0.3081225  1.1603196
## Nebraska   -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Objective function:   1.368969
## Clustering vector:    Named int [1:50] 1 1 1 2 1 1 2 2 1 1 2 2 1 2 2 2 2 1 ...
##  - attr(*, "names")= chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" "California" "Colorado" "Connecticut" ...
## Cluster sizes:            20 30 
## Best sample:
##  [1] Alabama        Arizona        California     Colorado       Connecticut   
##  [6] Delaware       Georgia        Idaho          Illinois       Iowa          
## [11] Kansas         Kentucky       Louisiana      Maine          Maryland      
## [16] Massachusetts  Michigan       Minnesota      Mississippi    Missouri      
## [21] Montana        Nebraska       Nevada         New Hampshire  New Mexico    
## [26] New York       North Carolina North Dakota   Ohio           Oklahoma      
## [31] Oregon         Pennsylvania   Rhode Island   South Carolina South Dakota  
## [36] Tennessee      Texas          Utah           Vermont        Virginia      
## [41] Washington     West Virginia  Wisconsin      Wyoming       
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"
# Este código utiliza la función clara del paquete cluster para realizar un análisis de agrupamiento en el conjunto de datos df. Se aplica el método CLARA (Clustering Large Applications), diseñado para trabajar con grandes conjuntos de datos. 
dd <- cbind(df, cluster = clara.res$cluster)
head(dd, n = 4)
##              Murder   Assault   UrbanPop         Rape cluster
## Alabama  1.24256408 0.7828393 -0.5209066 -0.003416473       1
## Alaska   0.50786248 1.1068225 -1.2117642  2.484202941       1
## Arizona  0.07163341 1.4788032  0.9989801  1.042878388       1
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602       2
clara.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(clara.res$clustering, 10)
##     Alabama      Alaska     Arizona    Arkansas  California    Colorado 
##           1           1           1           2           1           1 
## Connecticut    Delaware     Florida     Georgia 
##           2           2           1           1
fviz_cluster(
  clara.res,
  palette = c("#09DFBB", "#FC4E97"),
  ellipse.type = "t",
  geom = "point",
  pointsize = 1,
  ggtheme = theme_classic()
)

#Este gráfico muestra la distribución de los clústeres en el espacio de las variables del conjunto de datos.

Capítulo 7: Agrupación aglomerativa

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
res.hc <- hclust(d = res.dist, method = "ward.D2")
fviz_dend(res.hc, cex = 0.5)

# Este código realiza un análisis de agrupamiento jerárquico y visualiza el dendrograma resultante.
res.coph <- cophenetic(res.hc)
cor(res.dist, res.coph)
## [1] 0.6975266
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
fviz_dend(
  res.hc,
  k = 4,
  cex = 0.5,
  k_colors = c("#1b0DDF", "#01B1BB", "#A7B200", "#BB4E16"),
  color_labels_by_k = TRUE,
  rect = TRUE
)

# Este código genera un dendrograma del análisis de agrupamiento jerárquico previamente realizado, aplicando personalizaciones como el número de clústeres deseado, colores específicos y la visualización de rectángulos para destacar los clústeres.
fviz_cluster(
  list(data = df, cluster = grp),
  palette = c("#1b0DDF", "#01B1BB", "#A7B200", "#BB4E16"),
  ellipse.type = "convex",
  repel = TRUE,
  show.clust.cent = FALSE,
  ggtheme = theme_minimal()
)

# El gráfico muestra cómo las observaciones están agrupadas en el espacio de las variables.
res.agnes <-
  agnes(
    x = USArrests,
    stand = TRUE,
    metric = "euclidean",
    method = "ward"
  )
res.diana <-
  diana(x = USArrests, stand = TRUE, metric = "euclidean")
fviz_dend(res.agnes, cex = 0.6, k = 4)

#Este código realiza un análisis de agrupamiento jerárquico utilizando dos algoritmos diferentes (AGNES y DIANA) y visualiza el dendrograma resultante del análisis AGNES con clústeres formados.

Capítulo 8: Comparación de dendrogramas

El libro ocupa el paquete dendextend proporciona varias funciones para comparar dendrogramas. Y se centra en dos funciones:

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

  • cor.dendlist() para calcular una matriz de correlación entre dendrogramas.

8.1 Preparación de data

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

8.2 Comparación de dendrogramas

# Cálculo de agrupamiento jerárquico (HC) utilizando dos métodos de ligamiento diferentes ("average" y "ward". D2").

library(dendextend)

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

# Calcular 2 agrupaciones jerárquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")

#Crear dos dendogramas 
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)

#Crear una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)

tanglegram(dend1, dend2) #Comparación de dendrogramas usando la función de tanglegram

# Personalización del dendrogramas
 tanglegram(dend1,dend2,
 highlight_distinct_edges=FALSE, #Desactivar líneas discontinuas
 common_subtrees_color_lines=FALSE, #Desactivar colores de líneas
 common_subtrees_color_branches=TRUE, #Colorear ramas comunes 
 main=paste("entanglement=",round(entanglement(dend_list),2))
 )

 # Matriz de correlación cofenética
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
# 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
 # Crear múltiples dendrogramas encadenando
dend1 <- df %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df %>% dist %>% hclust("centroid") %>% as.dendrogram
dend_list <-
  dendlist(
    "Complete" = dend1,
    "Single" = dend2,
    "Average" = dend3,
    "Centroid" = dend4
  )
cors <- cor.dendlist(dend_list)

# Imprimir matriz de correlaciones
round(cors, 2)
##          Complete Single Average Centroid
## Complete     1.00   0.46    0.45     0.30
## Single       0.46   1.00    0.23     0.17
## Average      0.45   0.23    1.00     0.31
## Centroid     0.30   0.17    0.31     1.00
# Visualiza la matriz de correlaciones usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")

Capitulo 9: Visualización de dendrogramas

#Carga de datos
data(USArrests)
# Calcular distancias y agrupación jerárquicas
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

9.1 Visualización de dendrogramas

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

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

#Dendrograma horizontal
 fviz_dend(hc, cex = 0.5, horiz = TRUE)

fviz_dend(hc,
  k = 4, #Cortado en cuatro
  cex = 0.5, #tamaño de la etiqueta
  k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
  color_labels_by_k = TRUE, #colorear etiquetas por grupos
  ggtheme = theme_gray() #cambiar tema
)

fviz_dend(hc,
          cex = 0.5, #cortar en cuatro grupos 
          k = 4,
          k_colors = "jco")

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

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

 require("igraph")
 fviz_dend(hc, k=4, k_colors = "jco",
 type = "phylogenic", repel = TRUE)

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

9.2 Caso del dendrograma con grandes conjunto de datos

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

# Crear un gráfico de todo el dendrograma, y extraer los datos del dendrograma

dend_plot <- fviz_dend(hc, 
                       k = 4, #Cortar en cuatro grupos
                       cex = 0.5, #tamaño de la etiqueta
                       k_colors = "jco"
 )
dend_data <- attr(dend_plot, "dendrogram") #Extraer los datos del dendrograma
dend_cuts <- cut(dend_data, h = 10) #Corta el dendrograma a la altura h=10
fviz_dend(dend_cuts$upper) # Visualiza la versión truncada que contiene dos ramas

print(dend_plot)

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

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

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

9.3 Manipulación de dendrogramas con dendextend

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

dend <- USArrests[1:5, ] %>% #datos
  scale %>% #escala de datos
  dist %>% #calcular una matriz de distancias
  hclust(method = "ward.D2") %>% #agrupación jerárquica
  as.dendrogram #convierte el objeto en un dendrograma
plot(dend)

# Funciones para personalizar un dendrograma 

library(dendextend)
# 1. Crear un dendrograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1)%>% #Ancho de línea de las ramas
set("branches_k_color",mycols,k=4)%>% #Colorear las ramas por grupos
set("labels_colors",mycols,k=4)%>% #Colorear las etiquetas por grupos
set("labels_cex", 0.5) #Cambiar el tamaño de las etiquetas 
 
# 2. Crear parcela
fviz_dend(dend)

5. Bibliografia

Kassambara, Alboukadel. 2017. Practical Guide to Cluster Analysis in r: Unsupervised Machine Learning. Vol. 1. Sthda.STHDA, disponible en: https://drive.google.com/file/d/1iOUDLsbrUgS-ypVLaZ3tU60AulQn2VPv/view?usp=sharing

De la Fuente Fernández, Santiago. 2011. “Análisis Conglomerados.” Facultad de Ciencias Económicas y Empresariales de La Universidad Autónoma Madrid.

Galili, Tal. 2015. “Dendextend: An r Package for Visualizing, Adjusting, and Comparing Trees of Hierarchical Clustering.” Bioinformatics. https://doi.org/10.1093/bioinformatics/btv428.

Galili, Tal, and Gregory Jefferis. 2022. Dendextend: Extending Dendrogram Functionality in r. https://CRAN.R-project.org/package=dendextend.