UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONOMICAS

ESCUELA DE ECONOMIA


Métodos para el Análisis Económico

GT03 CICLO II/2024

CATEDRATICO: Carlos Ademir Perez Alas

Tema de investigación: “Análisis de Clúster (Conglomerados )”

Integrantes:

Cortez Hércules, José Vladimir CH21018

Deodanes Abrego, Cristian Jeferson DA21012

Linares Rodriguez, Walter Jose LR21023

Ciudad Universitaria, 23 Noviembre de 2024.

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

El análisis de conglomerados es un método exploratorio multivariante que busca clasificar individuos u objetos en grupos distintos.

El objetivo es que los miembros dentro de cada grupo sean lo más homogéneos posible con respecto a ciertas variables, mientras que los grupos en sí mismos sean lo más heterogéneos posible entre sí, por este método no impone restricciones previas en forma de modelos estadísticos, lo que lo convierte en una técnica de aprendizaje no supervisado.

La clasificación se realiza a partir de las variables observadas en los individuos u objetos, por lo que es crucial elegir adecuadamente las variables iniciales y la medida de homogeneidad o similitud.

2. Elabore un cuadro comparativo.

Análisis de Clúster Técnicas Disponibles Ventajas Desventajas
Jerárquico
Método de agrupamiento que construye una estructura jerárquica para mostrar cómo los datos se agrupan en diferentes niveles de similitud. Ideal para análisis exploratorio en conjuntos de datos sin una estructura de clústeres predeterminada.
  • Aglomerativo: Cada observación comienza como su propio clúster y se fusiona con otros clústeres en pasos sucesivos hasta formar un único clúster. Métodos de enlace (linkage) incluyen:
    • Single: Une el par de clústeres con la menor distancia entre sus puntos más cercanos.
    • Complete: Une el par de clústeres con la mayor distancia entre sus puntos más lejanos.
    • Average: Calcula el promedio de todas las distancias posibles entre puntos de dos clústeres.
    • Ward: Minimiza el aumento en la suma de las varianzas dentro de los clústeres al fusionar.
  • Divisivo: Comienza con un único clúster que contiene todos los datos y se divide sucesivamente en clústeres más pequeños. Este método, conocido como DIANA (Divisive Analysis), es menos común y se utiliza cuando se busca descomponer clústeres grandes y heterogéneos en subconjuntos más específicos.
  1. No requiere especificar el número de clústeres de antemano: Permite observar cómo se agrupan los datos en diferentes niveles de similitud sin tener que decidir un número fijo de clústeres.
  2. Representación gráfica mediante dendrogramas: Los dendrogramas permiten visualizar la estructura jerárquica de los clústeres, facilitando la interpretación de relaciones y patrones en los datos.
  3. Captura de estructuras jerárquicas: Ideal para datos que contienen jerarquías naturales, donde se puede observar cómo los grupos se descomponen en subgrupos más específicos.
  1. Sensibilidad al ruido y valores atípicos: Puede verse afectado por observaciones atípicas, las cuales pueden distorsionar la estructura de los clústeres.
  2. No escalable para grandes conjuntos de datos: Dado que cada combinación de puntos debe evaluarse, los métodos jerárquicos pueden ser computacionalmente costosos y lentos en conjuntos de datos grandes.
  3. Fijación temprana de los clústeres: Una vez que una observación es asignada a un clúster, no puede ser reasignada a otro, lo cual puede limitar la flexibilidad en algunos análisis.
No Jerárquico
Método de agrupamiento que asigna observaciones a un número fijo de clústeres sin una estructura jerárquica, basado en criterios como densidad, centroide o proximidad.
  • K-Means: Divide las observaciones en K clústeres predeterminados usando centroides que representan cada grupo. El algoritmo asigna cada punto al clúster con el centroide más cercano y recalcula iterativamente los centroides hasta que se minimiza la varianza interna del clúster.
  • K-Medoids: Similar a K-Means, pero usa observaciones reales (medoides) en lugar de promedios como centroides, lo cual mejora la robustez frente a valores atípicos.
  • Partitioning Around Medoids (PAM): Una extensión de K-Medoids que es particularmente útil en grandes conjuntos de datos y permite seleccionar representaciones reales del conjunto de datos como centro de los clústeres.
  • DBSCAN (Density-Based Spatial Clustering of Applications with Noise): Identifica clústeres basados en densidad, detectando áreas de alta densidad separadas por regiones de baja densidad. Es adecuado para formas y tamaños de clústeres irregulares y también permite la detección de ruido.
  1. Alta eficiencia computacional: Métodos como K-Means son rápidos y eficaces, especialmente para grandes conjuntos de datos donde la escalabilidad es crucial.
  2. Escalabilidad y adaptabilidad: Capacidad para manejar grandes volúmenes de datos y ofrecer soluciones en un tiempo relativamente corto.
  3. Adecuado para estructuras no esféricas: Métodos como DBSCAN pueden detectar clústeres con formas irregulares y separar el ruido o los valores atípicos de los clústeres reales.
  4. Versatilidad en aplicaciones: Los métodos no jerárquicos son ampliamente aplicados en marketing (segmentación de clientes), biología (clasificación de especies), y otras áreas que requieren dividir los datos en grupos con estructuras flexibles.
  5. Menor complejidad de interpretación: Estos métodos no producen dendrogramas complejos y son más intuitivos de entender para particiones específicas y no jerárquicas.
  1. Sensibilidad a la inicialización: En K-Means, la elección de los centroides iniciales puede afectar el resultado, produciendo soluciones inconsistentes y la posibilidad de converger en óptimos locales en lugar de una solución global.
  2. Requiere especificar el número de clústeres en algunos métodos: En métodos como K-Means y K-Medoids, es necesario decidir el número de clústeres antes de ejecutar el algoritmo, lo cual puede ser difícil si no se conoce la estructura de los datos.
  3. Menor capacidad para capturar jerarquías naturales: Al no tener una estructura jerárquica, estos métodos no son ideales cuando los datos contienen subestructuras que deben representarse en niveles de anidamiento.
  4. Limitaciones en datos no esféricos (K-Means): K-Means tiende a formar clústeres esféricos, lo cual no es adecuado para datos en formas complejas; DBSCAN es mejor en estos casos, pero no otros métodos no jerárquicos.
  5. Problemas de rendimiento en datos dispersos (DBSCAN): DBSCAN puede ser menos eficiente en conjuntos de datos muy dispersos o con variaciones de densidad, ya que puede detectar menos clústeres y considerar más puntos como ruido.

Elaboración Propia en base a Kassambara 2017, Landa Baella s.f, Aldas Uriel 2017.

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.

Técnicas para Análisis de Clúster Jerárquicas en R

Las técnicas de análisis de clúster jerárquicas, se basan en la construcción de una estructura jerárquica de grupos (clusters) que representan las relaciones de similitud entre las observaciones. Se dividen en dos enfoques principales: aglomerativos y desagregativos.

Métodos Aglomerativos (AGNES)

Los métodos aglomerativos, también llamados AGNES (Agglomerative Nesting), comienzan considerando cada observación como un grupo individual. A medida que el algoritmo avanza, los grupos más similares se fusionan paso a paso hasta que todas las observaciones pertenecen a un solo grupo. Este proceso se representa visualmente en un dendograma, donde la altura de la unión entre grupos indica el grado de similitud entre ellos.

Pasos del método aglomerativo:

1. Inicialización: Cada observación se considera un grupo individual.

2. Cálculo de distancias: Se calcula una matriz de distancias entre todos los pares de grupos, utilizando una métrica de distancia como la distancia Euclidiana.

3. Fusión de grupos: Se fusionan los dos grupos más similares, basándose en la matriz de distancias y en el método de enlace elegido.

4. Actualización de la matriz de distancias: Se actualiza la matriz de distancias para reflejar la fusión de los grupos.

5. Repetición: Se repiten los pasos 3 y 4 hasta que todas las observaciones pertenecen a un solo grupo.

Métodos de enlace:

● Enlace simple (vecino más cercano): La distancia entre dos grupos se define como la distancia mínima entre cualquier par de observaciones, una en cada grupo. Tiende a formar grupos alargados o encadenados.

● Enlace completo (vecino más lejano): La distancia entre dos grupos se define como la distancia máxima entre cualquier par de observaciones, una en cada grupo. Produce grupos más compactos y esféricos.

● Enlace promedio: La distancia entre dos grupos se define como la distancia promedio entre todas las parejas de observaciones, una en cada grupo. Ofrece un compromiso entre el enlace simple y el completo.

● Método de Ward: Busca minimizar la varianza total dentro de los grupos, lo que resulta en grupos con mayor homogeneidad interna.

Implementación en R

Estandarización de datos: se recomiendan estandarizar las variables antes de calcular la matriz de distancias, especialmente si están medidas en diferentes escalas. Esto asegura que las variables sean comparables y evita que las variables con mayor varianza dominen el cálculo de las distancias. La estandarización se puede realizar utilizando la función scale() en R

dist(x, method = “euclidean”, diag = FALSE, upper = FALSE, p = 2)

Donde:

x: Este argumento es obligatorio y representa la matriz o data frame de datos numéricos. Cada fila de x corresponde a una observación y cada columna a una variable. Es esencial que los datos sean numéricos, ya que dist() no puede manejar otros tipos de variables.

method: Este argumento especifica la métrica de distancia a utilizar para calcular las distancias entre las observaciones. Los valores permitidos para method son:

“euclidean”: Distancia Euclidiana, que es la raíz cuadrada de la suma de las diferencias cuadradas entre las coordenadas de dos puntos. Es la métrica por defecto.

“maximum”: Distancia de Chebyshev, que es la mayor diferencia entre las coordenadas de dos puntos.

“manhattan”: Distancia de Manhattan, que es la suma de las diferencias absolutas entre las coordenadas de dos puntos.

“canberra”: Distancia de Canberra, que es la suma de las diferencias absolutas ponderadas por la suma de los valores absolutos.

“binary”: Distancia binaria o de Jaccard, que se utiliza para datos binarios y mide la proporción de atributos diferentes entre dos observaciones.

“minkowski”: Distancia de Minkowski, que es una generalización de las distancias Euclidiana y de Manhattan. El argumento p (ver más abajo) define el orden de la distancia de Minkowski.

diag: Este argumento es un valor lógico (TRUE o FALSE) que indica si se deben incluir los valores de la diagonal principal de la matriz de distancias (es decir, las distancias de cada observación consigo misma). Por defecto, diag = FALSE.

upper: Este argumento es un valor lógico que indica si se deben incluir los valores del triángulo superior de la matriz de distancias. Por defecto, upper = FALSE.

p: Este argumento se utiliza solo cuando method = “minkowski” y define el orden de la distancia de Minkowski. El valor por defecto es p = 2, lo que corresponde a la distancia Euclidiana.

Función hclust() (paquete stats): Permite realizar el análisis de clúster jerárquico aglomerativo. Se debe proporcionar una matriz de distancias como entrada.

Donde:

d: Matriz de distancias, creada con la función dist().

method: Especifica el método de enlace.

Función agnes() (paquete cluster): Realiza un análisis de clúster jerárquico aglomerativo, incluyendo la estandarización de datos y el cálculo de la matriz de distancias en una sola llamada.

Donde:

x: Matriz o data frame que contiene los datos.

stand: Si es TRUE, los datos se estandarizan.

metric: Métrica de distancia a utilizar.

method: Especifica el método de enlace.

Función fviz_dend() (paquete factoextra): Se utiliza para visualizar el dendograma resultante.

# Cargar los datos
data(USArrests)

# Estandarizar las variables
df <- scale(USArrests)

Ejemplo de Método Aglomerativo

  1. Usando hclust():
# Calcular la matriz de distancias
dist_matrix <- dist(df, method = "euclidean")

# Realizar el análisis de clúster jerárquico con enlace Ward
hc_ward <- hclust(dist_matrix, method = "ward.D2")

# Visualizar el dendograma
plot(hc_ward, main = "Dendograma - Enlace Ward", xlab = "", sub = "")

  1. Usando agnes():
# Cargar el paquete cluster
library(cluster)

# Realizar el análisis de clúster jerárquico con enlace promedio
hc_average <- agnes(df, method = "average")

# Visualizar el dendograma
plot(hc_average, main = "Dendograma - Enlace Promedio", xlab = "", sub = "")

Métodos Desagregativos (DIANA)

Los métodos desagregativos, también conocidos como DIANA (DIvisive ANAlysis Clustering), siguen un enfoque “de arriba hacia abajo”. Inicialmente, todas las observaciones se consideran parte de un único grupo. Luego, el algoritmo divide el grupo en subgrupos cada vez más pequeños hasta que cada observación forma un grupo individual.

Implementación en R

Función diana() (paquete cluster): Permite realizar el análisis de clúster jerárquico desagregativo.

Donde:

x: Matriz o data frame que contiene los datos.

stand: Si es TRUE, los datos se estandarizan.

metric: Métrica de distancia a utilizar.

# Cargar el paquete cluster
library(cluster)

# Realizar el análisis de clúster jerárquico desagregativo
hc_diana <- diana(df)

# Visualizar el dendograma
plot(hc_diana, main = "Dendograma - DIANA", xlab = "", sub = "")

# Cargar el paquete factoextra
library(factoextra)

# Visualizar el dendograma con fviz_dend()
fviz_dend(hc_ward, cex = 0.5, main = "Dendograma - Enlace Ward",
          xlab = "Observaciones", ylab = "Distancia")

Tecnicas para Análisis de Clúster No Jerárquico en R

Los métodos de análisis de clúster no jerárquicos, también conocidos como métodos de particionamiento, se caracterizan por requerir que se predefina el número de grupos (clusters) que se desean formar. El objetivo principal de estos métodos es agrupar las observaciones de manera que se maximice la homogeneidad dentro de cada grupo y la heterogeneidad entre grupos. A continuación, se describen las técnicas más comunes para realizar análisis de clúster no jerárquico, incluyendo una explicación de las librerías y sintaxis en R.

Método de las k-medias ()

El método de las k-medias es uno de los algoritmos de agrupamiento más utilizados. Su principio básico consiste en asignar cada observación al grupo cuyo centroide (media) se encuentra más cerca, utilizando generalmente la distancia Euclidiana como medida de similitud.

Los resultados pueden variar dependiendo de la inicialización aleatoria de los centroides.

Implementación en R:

La función kmeans() del paquete stats se utiliza para implementar el algoritmo k-medias en R.

Sintaxis:

kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c(“Hartigan-Wong”, “Lloyd”, “Forgy”, “MacQueen”))

Donde:

● x: Matriz o data frame que contiene los datos.

● centers: Número de grupos (k) a formar.

● iter.max: Número máximo de iteraciones permitidas.

● nstart: Número de inicializaciones aleatorias diferentes para los centroides.

● algorithm: Algoritmo a utilizar.

Ejemplo:

# Cargar los datos
data(iris)

# Realizar k-medias con 3 grupos
cluster_km <- kmeans(iris[, -5], centers = 3) 

# Ver los resultados
print(cluster_km) 
## K-means clustering with 3 clusters of sizes 38, 62, 50
## 
## Cluster means:
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     6.850000    3.073684     5.742105    2.071053
## 2     5.901613    2.748387     4.393548    1.433871
## 3     5.006000    3.428000     1.462000    0.246000
## 
## Clustering vector:
##   [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
##  [38] 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [75] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1
## [112] 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 1
## [149] 1 2
## 
## Within cluster sum of squares by cluster:
## [1] 23.87947 39.82097 15.15100
##  (between_SS / total_SS =  88.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Método de las k-medoides (PAM)

El método de las k-medoides es similar a k-medias, pero en lugar de utilizar centroides, utiliza medoides. Un medoide es una observación real del conjunto de datos que representa el “centro” del grupo. Este método es más robusto a la presencia de valores atípicos en comparación con k-medias.

Implementación en R:

La función pam() del paquete cluster se utiliza para implementar PAM en R.

Sintaxis:

pam(x, k, metric = “euclidean”, stand = FALSE)

Donde:

●x: Matriz o data frame que contiene los datos.

●k: Número de grupos (k) a formar.

●metric: Métrica de distancia a utilizar (por defecto “euclidean”).

●stand: Si es TRUE, los datos se estandarizan antes del análisis.

Ejemplo:

# Cargar el paquete cluster
library(cluster)

# Realizar PAM con 3 grupos
cluster_pam <- pam(iris[, -5], k = 3) 

# Ver los resultados
print(cluster_pam)
## Medoids:
##       ID Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,]   8          5.0         3.4          1.5         0.2
## [2,]  79          6.0         2.9          4.5         1.5
## [3,] 113          6.8         3.0          5.5         2.1
## Clustering vector:
##   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [75] 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3 3 3 3
## [112] 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3 3 3 2 3
## [149] 3 2
## Objective function:
##     build      swap 
## 0.6709391 0.6542077 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

CLARA (Clustering Large Applications)

El algoritmo CLARA es una extensión de PAM diseñada para manejar conjuntos de datos grandes. En lugar de analizar todo el conjunto de datos, CLARA utiliza un enfoque de muestreo, seleccionando un subconjunto de observaciones y aplicando PAM en este subconjunto.

Implementación en R:

La función clara() del paquete cluster se utiliza para implementar CLARA en R.

Sintaxis:

clara(x, k, metric = “euclidean”, stand = FALSE, samples = 5, sampsize = min(n, 40 + 2 * k))

Donde:

●x: Matriz o data frame que contiene los datos.

●k: Número de grupos (k) a formar.

●metric: Métrica de distancia a utilizar (por defecto “euclidean”).

●stand: Si es TRUE, los datos se estandarizan antes del análisis.

●samples: Número de submuestras a utilizar.

●sampsize: Tamaño de cada submuestra.

Ejemplo:

#Cargar el paquete cluster
library(cluster)
#Realizar CLARA con 3 grupos
cluster_clara <- clara(iris[, -5], k = 3)
#Ver los resultados
print(cluster_clara) 
## Call:     clara(x = iris[, -5], k = 3) 
## Medoids:
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,]          5.1         3.5          1.4         0.2
## [2,]          6.1         3.0          4.6         1.4
## [3,]          6.8         3.0          5.5         2.1
## Objective function:   0.6760124
## Clustering vector:    int [1:150] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
## Cluster sizes:            50 61 39 
## Best sample:
##  [1]   1   2   4  14  16  29  30  32  33  37  41  47  48  50  54  59  64  66  67
## [20]  70  75  76  80  83  92  96  97 111 112 113 114 117 119 120 121 126 128 130
## [39] 131 132 133 140 143 144 147 149
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"

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

Ejemplos Cap 4

# 4.3.1 Data

data("USArrests") 
df <- scale(USArrests) 
head(df, n = 3)
##             Murder   Assault   UrbanPop         Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska  0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona 0.07163341 1.4788032  0.9989801  1.042878388
# 4.3.3 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.4 Cálculo de la agrupación en clústeres de k-medias

# Calcular k-medias con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
print(km.res)
## K-means clustering with 4 clusters of sizes 8, 13, 16, 13
## 
## Cluster means:
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964
## 
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              4              4              1              4 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              4              3              3              4              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              4              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              4 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              4              2              1              4 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              4              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              4              4              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              4              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3 
## 
## Within cluster sum of squares by cluster:
## [1]  8.316061 11.952463 16.212213 19.922437
##  (between_SS / total_SS =  71.2 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
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
# 4.3. CÁLCULO DE LA AGRUPACIÓN DE K-MEANS EN R
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.3.5 Acceso 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.3.6 Visualización de clústeres de k-medias

fviz_cluster(km.res, data = df,
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
             ellipse.type = "euclid",
             star.plot = TRUE,
             repel = TRUE,
             ggtheme = theme_minimal()
)

Ejemplos Cap 5

# 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.3 Estimación del número óptimo de clústeres

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

# 5.3.4 Cálculo de la agrupación en clústeres de 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"
# 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 en cluster: 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 clústeres PAM
fviz_cluster(pam.res,
             palette = c("#00AFBB", "#FC4E07"),
             ellipse.type = "t",
             repel = TRUE,
             ggtheme = theme_classic()
)

Ejemplos Cap 6

# 6.3.1 Formato y preparación de los datos

set.seed(1234)
# Generar 500 objetos, divididos en 2 clústeres.
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.3 Estimación del número óptimo de clústeres

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

# 6.3.4 Cálculo de CLARA

# Calcular CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Componentes de impresión 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"
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
# Medoides
clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
# Agrupamiento
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ústeres CLARA

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

Ejemplos Cap 7

# 7.2.1 Estructura y preparación de 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 Vinculación

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

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

# 7.3 Verificar el árbol de clústeres

# Calcular la distancia cofenética
res.coph <- cophenetic(res.hc)
# Correlación entre la 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 clúster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Obtener los nombres de los miembros del clúster 1
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# 7.4. CORTAR EL DENDROGRAMA EN DIFERENTES GRUPOS

# Cortar en 4 grupos y colorear por grupos 
fviz_dend(res.hc, k = 4,
          cex = 0.5,
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE,
          rect = TRUE 
)

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

# 7.5 Paquete R de Cluster

library("cluster")
# Anidamiento aglomerativo (agrupamiento jerárquico)
res.agnes <- agnes(x = USArrests,
                   stand = TRUE,
                   metric = "euclidean",
                   method = "ward"
)
# Análisis divisorio Agrupamiento
res.diana <- diana(x = USArrests,
                   stand = TRUE,
                   metric = "euclidean"
)
fviz_dend(res.agnes, 
          cex = 0.6, k = 4)

Ejemplos Cap 8

# 8.1 Preparación de datos

df <- scale(USArrests)

# Subconjunto que contiene 10 filas 
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]
# 8.2 Comparación de dendrogramas

library(dendextend)
# Calcular la matriz de distancia
res.dist <- dist(df, method = "euclidean")
# Calcular 2 agrupamientos jerárquicos 
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Crea dos dendrogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Crea una lista para almacenar dendrogramas
dend_list <- dendlist(dend1, dend2)
tanglegram(dend1, dend2)

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

# 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 mediante encadenamiento
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
# Calcular la matriz de correlación
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)
# Imprimir matriz de correlación
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
# Visualice la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")

Ejemplos Cap 9

# Cargar datos
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
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 = "")

fviz_dend(hc, cex = 0.5, 
          horiz = TRUE)

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

fviz_dend(hc, cex = 0.5, 
          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,
          k_colors = "jco",
          type = "phylogenic", repel = TRUE,
          phylo_layout = "layout.gem")

# 9.2.1 Ampliar el dendrograma

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

# 9.2.2 Trazado de un subárbol de dendrogramas

# Crea un gráfico de todo el dendrograma,
# y extrae los datos del dendrograma
dend_plot <- fviz_dend(hc, k = 4,
cex = 0.5,
k_colors = "jco"
)

dend_data <- attr(dend_plot, "dendrogram")

# Cortar el dendrograma a la altura h = 10 
dend_cuts <- cut(dend_data, h = 10)
# Visualice la versión truncada que contiene 
# dos ramas 

fviz_dend(dend_cuts$upper)

# Graficar el dendrograma completo
print(dend_plot)

# Trazar subárbol 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

# Subárbol de la trama 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

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

# 9.2.3 Guardar el dendrograma en una página PDF grande

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 utilizando dendextend

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

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

library(dendextend)
# 1. Crear un dendrograma personalizado 
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)

# 2. Crear gráfico 
fviz_dend(dend)

Bibliografia

Aldas, Joaquin, and Ezequiel Uriel. 2017. Análisis Multivariante Aplicado Con r. 2nd ed. Ediciones Paraninfo, S.A.
B., María Pilar Landa, and Daysi Celeste Villagómez V. s.f. “Estadística Computacional: Desarrollo de Análisis Clúster En r.” Recuperado de los archivos del curso de Estadística Computacional.
EcuRed. s. f. “Clúster No Jerárquico - ECUReD.” https://www.ecured.cu/Cl%C3%BAster_no_jer%C3%A1rquico.
Kassambara, Alboukadel. 2017. Guía Práctica Para El Análisis de Clúster En r : Aprendizaje Automático No Supervisado. 1st ed. STHDA.