UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
CICLO II-2021
“Laboratorio 2 Análisis de Clúster (Conglomerados)”
Metodos para el Analisis Económico.
Docente:
Carlos Ademir Pérez Alas.
Integrantes:
Nelson Jesus Carrillo Paniagua. (CP18075)
Hugo Alejandro Azahar Nieto. (AN18012)
Grupo Teorico:
03
Ciudad Universitaria, Viernes 25 de noviembre de 2021.
1. Explique en qué consiste el análisis de conglomerados.
El análisis de conglomerados, al que también se denomina comúnmente análisis cluster, es una técnica diseñada para clasificar distintas observaciones en grupos, de tal forma que:
Cada grupo (conglomerado o cluster) sea homogéneo respecto a las variables utilizadas para caracterizarlo, es decir, que cada observación contenida en él sea parecida a todas las que estén incluidas en ese grupo.
Que los grupos sean lo más distintos posible unos de otros respecto a las variables consideradas.
(Aldas Manzano & Uriel Jimenez, 2017)
La agrupación en clústeres es uno de los métodos de minería de datos importantes para descubrir conocimiento en datos multidimensionales. El objetivo de la agrupación es identificar patrones o grupos de objetos similares dentro de un conjunto de datos de interés.
El análisis de conglomerados es popular en muchos campos, que incluyen:
• En la investigación del cáncer para clasificar a los pacientes en subgrupos según su perfil de expresión génica. Esto puede ser útil para identificar el perfil molecular de pacientes con buen o mal pronóstico, así como para comprender la enfermedad.
• En marketing para la segmentación del mercado mediante la identificación de subgrupos de clientes con perfiles similares y que puedan ser receptivos a una determinada forma de publicidad.
• En Urbanismo para la identificación de grupos de viviendas según su tipología, valor y ubicación.
(Kassambara, 2017)
El análisis de conglomerados (CLA) es una colección de algoritmos para clasificar objetos como países, especies e individuos (Anderberg, 1973; Massart & Kaufman, 1983). La clasificación tiene como objetivo reducir la dimensionalidad de un conjunto de datos explotando las similitudes/disemejanzas entre los casos.
(Commission et al., 2008)
2. Elabore un cuadro comparativo, que incluya los siguientes elementos:
Resumen del Análisis de Clúster
|
Análisis de Clúster |
Técnicas disponibles |
Ventajas |
Desventajas |
|
Jerárquico: Agrupar clúster
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. En una
clasificación jerárquica, los grupos se van fusionando (o subdividiendo)
sucesivamente, siguiendo una prelación o jerarquía, decreciendo la
homogeneidad conforme se van haciendo más amplios. |
Agrupación aglomerativa ·
Vinculación máxima o
completa ·
Enlace
mínimo o único ·
Enlace medio o promedio ·
Método centroide ·
Método de la varianza
mínima de Ward Agrupación divisiva ·
Vinculación máxima o
completa ·
Enlace mínimo o único ·
Enlace medio o promedio ·
Método centroide ·
Método de la varianza
mínima de Ward |
·
No es
necesario especificar el número de clusteres
necesarios para el algoritmo. ·
El clustering jerárquico es fácil de implementar. ·
El dendrograma producido es muy útil para comprender los
datos. |
·
El algoritmo nunca puede
deshacer ninguna de los pasos anteriores, No puede recuperarse de decisiones
incorrectas. ·
La complejidad del
tiempo para el clustering puede dar lugar a tiempos
de cálculo muy largos, en comparación con algoritmos eficientes, como K-Means. ·
Si tenemos un conjunto
de datos grande, puede ser difícil determinar el número correcto de clusteres por el dendrograma. |
|
No
Jerárquico: 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. |
Reasignación ·
K Medias ·
Partitioning Around Medoids (PAM) ·
CLARA ·
Nubes
Dinámicas Búsqueda
de densidad ·
Análisis
Modal ·
Métodos Taxap ·
Método de Fortin ·
Método de
Wolf Métodos
Directos ·
Block – Clustering Métodos
Reductivos ·
Análisis
Factorial tipo Q |
·
Fácil de
entender, fácil de adaptar ·
Trabaja bien
con conjuntos de datos grandes o pequeños, ·
Es eficiente
y tiene buen desempeño |
·
Necesita que
el usuario defina el número de clústeres. ·
Sensible a
ruido ·
Presenta
problemas de robustez ·
El resultado
puede variar según las variables elegidas al inicio. |
Fuente: elaboración propia con base en:
(Kassambara, 2017),(Hojas, 2020),(AN�LISIS CLUSTER, n.d.), (De La Fuente, 2011)
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.
El Análisis Cluster, conocido como Análisis de Conglomerados, es una técnica estadística multivariante que busca agrupar elementos (o variables) tratando de lograr la máxima homogeneidad en cada grupo y la mayor diferencia entre los grupos.
Es un procedimiento estadístico que parte de un conjunto de datos que contiene información sobre una muestra de entidades e intenta reorganizarlas en grupos relativamente homogéneos a los que se llama conglomerados (clusters).
ETAPAS DEL ANÁLISIS DE CONGLOMERADOS (CLUSTERS)
Elección de las variables
Elección de la medida de asociación
Elección de la técnica Cluster
Validación de los resultados
Conglomerados Jerárquico:
El Análisis de Conglomerados Jerárquico pretende identificar grupos homogéneos de variables en función de alguna característica. Consecuentemente, al realizar este proceso, se busca ir combinando las agrupaciones hasta que finalmente quede solamente un grupo con características más diferenciadas. Esta metodología para realizar conglomerados no requiere que se preestablezca un número de clusters determinado, como si necesita el Análisis de k-Medias, y suele completarse con la realización de un tipo de gráfico particular, llamado dendrograma, que permite visualizar las agrupaciones en forma de árbol donde se van representando los datos por subcategorías.
La agrupación jerárquica se puede subdividir en dos tipos:
Agrupamiento aglomerativo
en el que cada observación se considera inicialmente como un grupo propio (hoja). Luego, los clústeres más similares se fusionan sucesivamente hasta que solo queda un solo clúster grande (raíz).
Vinculación máxima o completa
La distancia entre dos conglomerados se define como el valor máximo de todas las distancias por pares entre los elementos del conglomerado 1 y los elementos del conglomerado 2. Tiende a producir conglomerados más compactos.
Vinculación mínima o simple
La distancia entre dos grupos se define como el valor mínimo de todas las distancias por pares entre los elementos del grupo 1 y los elementos del grupo 2. Tiende a producir grupos largos y “sueltos”.
Vinculación media o media
La distancia entre dos conglomerados se define como la distancia promedio entre los elementos del conglomerado 1 y los elementos del conglomerado 2.
Enlace centroide
La distancia entre dos conglomerados se define como la distancia entre el centroide del conglomerado 1 (un vector medio de variables de longitud p) y el centroide del conglomerado 2.
Método de la varianza mínima de Ward
Minimiza la varianza total dentro del conglomerado. En cada paso, se fusionan el par de clústeres con una distancia mínima entre clústeres.
El Método de Ward es uno de los más utilizados en la práctica; posee casi todas las ventajas del Método de la K‐medias y suele ser más discriminativo en la determinación de los niveles de agrupación.
El agrupamiento dividido
Lo contrario del agrupamiento aglomerativo, comienza con la raíz, en el que todos los objetos se incluyen en un agrupamiento. Luego, los grupos más heterogéneos se dividen sucesivamente hasta que todas las observaciones están en su propio grupo.
Conglomerado no Jerarquico
El análisis de conglomerados no jerárquico se caracteriza porque, a diferencia del jerárquico, se conoce a priori el número k de grupos que se desea, y las observaciones son entonces asignadas a cada uno de esos k conglomerados, de tal forma que se maximiza la homogeneidad de los sujetos asignados a un mismo grupo y la heterogeneidad entre los distintos conglomerados.
Se han de determinar los centroides iniciales de los k grupos, esto es, los valores medios de las variables que caracterizan las observaciones en cada uno de esos grupos. Estos centroides iniciales, que se conocen como semillas, pueden ser fijados por el investigador de acuerdo con información previa.
Una vez establecidas las semillas, cada observación se asigna a aquel conglomerado, de entre los k existentes, cuyo centroide esté más cercano.
Se recalculan entonces los centroides de los k grupos de acuerdo con las observaciones que han sido clasificadas en cada uno de ellos. Si el cambio en los centroides es mayor que un valor criterio de convergencia preestablecido, entonces se vuelve al paso 2.
(Aldas Manzano & Uriel Jimenez, 2017)
K-Medoids
El algoritmo k-medoids es un enfoque de agrupamiento relacionado con el agrupamiento de k-medias para dividir un conjunto de datos en k grupos o conglomerados. En el agrupamiento de k-medoides, cada grupo está representado por uno de los puntos de datos en el grupo. Estos puntos se denominan medoides de racimo.
K-medoid es una alternativa robusta al agrupamiento k-means. Esto significa que el algoritmo es menos sensible al ruido y los valores atípicos, en comparación con k-means, porque usa medoids como centros de clúster en lugar de medios (usados en k-means).
El algoritmo k-medoids requiere que el usuario especifique k, el número de grupos que se generarán (como en k-means clustering).
(Kassambara, 2017)
PAM
El uso de medias implica que la agrupación de k-medias es muy sensible a los valores atípicos. Esto puede afectar gravemente la asignación de observaciones a los conglomerados. El algoritmo PAM proporciona un algoritmo más robusto.
El algoritmo PAM se basa en la búsqueda de k objetos representativos o medoides entre las observaciones del conjunto de datos. Después de encontrar un conjunto de k medoides, se construyen grupos asignando cada observación al medoide más cercano.
Seleccione k objetos para que se conviertan en los medoides o, en caso de que se hayan proporcionado estos objetos, utilícelos como medoides;
Calcular la matriz de disimilitud si no se proporcionó;
Asigne cada objeto a su medoide más cercano;
Para cada búsqueda de conglomerados, si alguno de los objetos del conglomerado disminuye el coeficiente de disimilitud promedio; si es así, seleccione la entidad que más disminuya este coeficiente como el medoide para este grupo;
Si al menos un medoid ha cambiado, vaya a (3), de lo contrario finalice el algoritmo
(Kassambara, 2017)
CLARA
CLARA (Clustering Large Applications, Kaufman and Rousseeuw (1990)) es una extensión de los métodos k-medoids para manejar datos que contienen una gran cantidad de objetos (más de varios miles de observaciones) para reducir el tiempo de cálculo y el problema de almacenamiento de RAM. .Esto se logra utilizando el método de muestreo.
CLARA repite los procesos de muestreo y agrupación un número predeterminado de veces para minimizar el sesgo de muestreo. Los resultados finales del agrupamiento corresponden al conjunto de medoides con el costo mínimo.
El algoritmo es el siguiente:
Divida aleatoriamente los conjuntos de datos en múltiples subconjuntos con tamaño fijo (tamaño de muestra)
Calcule el algoritmo PAM en cada subconjunto y elija los k objetos representativos correspondientes (medoides). Asigne cada observación del conjunto de datos completo al medoide más cercano.
Calcular la media (o la suma) de las diferencias de las observaciones a su medoid más cercano. Esto se utiliza como una medida de la bondad de la agrupación.
Conservar el conjunto de subdatos para el que la media (o la suma) es mínima. Se lleva a cabo un análisis adicional en la partición final.
(Kassambara, 2017)
Nubes Dinamicas
Se basa en que cada clúster debe tener una representación llamada núcleo o centroide de clúster para, posteriormente, hacer una búsqueda iterada de centroides y de clúster, por lo que cada clase estará representada por un núcleo, que será un elemento representativo de todos los que integran la misma.
Los pasos del algoritmo son los siguientes:
Se establece un conjunto de “k” núcleos iniciales
Fase de asignación: Se forma un clúster, asignando cada individuo al clúster más próximo mediante el cálculo de la distancia al centroide.
Fase de representación: Se calculan los centroides de los clúster y se toman como nuevos centroides.
Se repiten los pasos 2 y 3 hasta alcanzar un determinado criterio de convergencia, cuando las clases se estabilizan.
Búsqueda de densidad
La idea principal de este tipo de métodos, es identificar los clústers y sus parámetros de distribución, haciendo crecer una determinada agrupación hasta que la densidad del clúster vecino o más próximo sobrepase un cierto umbral (es decir, que contenga un determinado número de individuos dentro del clúster).
Block - Clustering
El objetivo de este método es encontrar sub-matrices, con filas y columnas con una alta correlación, pero uno de los problemas que plantean es que el número de clúster a calcular debe de ser suministrado previamente al cálculo del algoritmo. Sin embargo, estas estrategias sólo pueden ser realizadas utilizando algoritmos de una vía y existe una falta de enfoque claro para conseguir el mejor número de clústers en algoritmos de “Block-Clustering”. (Charrad et al., 2010)
Análisis Factorial tipo Q
El objetivo consiste en encontrar grupos de individuos con valores semejantes en las variables, con la finalidad de determinar un número reducido de clúster, de los que se espera que los individuos contenidos en cada uno de ellos tengan algún tipo de propiedad común. El método parte de la matriz de correlaciones entre individuos y somete los factores encontrados a una rotación ortogonal (Vallejo, 1992)
Medidas de similitud Linkage
library(cluster)
library(factoextra)
library(ggplot2)
data("USArrests") #Cargar la data
df <- scale(USArrests) # Estandarizar los datos
res.dist <- dist(df, method = "euclidean") # Calcular la matriz de disimilitud
# df = los datos estandarizados
as.matrix(res.dist)[1:6, 1:6] # Refleja la matriz
## 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")# El dendograma se puede producir en R usando el función base (res.hc), es la salida de hclust().
fviz_dend(res.hc, cex = 0.5) # fviz_dend() para producir un dendrograma.
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 Capitulo 4 Agrupación de K-Means
# Especificacion del número de agrupaciones a ser generado.
library(ggplot2)
library(factoextra)
data("USArrests")
df <- scale(USArrests)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
El gráfico representa la varianza dentro de los grupos. Disminuye a medida que aumenta k. Esta curva indica que los grupos adicionales despues del cuarto su valor disminuye.
Cálculo de clústeres de k-medias
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"
library(kableExtra)
## Warning in !is.null(rmarkdown::metadata$output) && rmarkdown::metadata$output
## %in% : 'length(x) = 4 > 1' in coercion to 'logical(1)'
# Calcular la media de cada variable por conglomerados
aggregate(USArrests, by = list(cluster = km.res$cluster), mean) %>%
kable(caption = "Media de cada variable por conglomerados",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| cluster | Murder | Assault | UrbanPop | Rape |
|---|---|---|---|---|
| 1 | 13.93750 | 243.62500 | 53.75000 | 21.41250 |
| 2 | 3.60000 | 78.53846 | 52.07692 | 12.17692 |
| 3 | 5.65625 | 138.87500 | 73.87500 | 18.78125 |
| 4 | 10.81538 | 257.38461 | 76.00000 | 33.19231 |
# clasificaciones de puntos a los datos originales
library(factoextra)
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd) %>%
kable(caption = "Clasificaciones de Puntuaciones",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| 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 |
# 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
# Tamaño de cluster
km.res$size
## [1] 8 13 16 13
# Medios de clúster
library(factoextra)
km.res$centers %>%
kable(caption = "Medios de cluster",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "#2a0b23",
background = "#c4a8bb")
| Murder | Assault | UrbanPop | Rape |
|---|---|---|---|
| 1.411890 | 0.874335 | -0.814521 | 0.019271 |
| -0.961541 | -1.106601 | -0.930107 | -0.966763 |
| -0.489438 | -0.382600 | 0.575830 | -0.261654 |
| 0.695070 | 1.039441 | 0.722637 | 1.276940 |
# Visualización de clústeres de k-medias
library(factoextra)
library(ggrepel)
fviz_cluster(
km.res,
data = df,
palette = c("#2a0b23", "#c4a8bb", "#ff7c43", "#008cd4"),
ellipse.type = "euclid",
# Elipse de concentración
star.plot = TRUE,
# Agregar segmentos de centroides a elementos
repel = TRUE,
# Evite el sobretrazado de etiquetas (lento)
ggtheme = theme_minimal()
)
fuente: en base a los ejempos del capitulo 4 (Kassambara, 2017)
Ejemplo capitulo 5 K-medoides
library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+ # La idea es calcular el algoritmo PAM usando diferentes valores de grupos k.
theme_minimal()
El siguiente código R 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"
Agregacion de las clasificaciones de puntos a los datos originales
library(factoextra)
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd) %>%
kable(caption = "Clasificaciones de Puntos",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| 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 |
Accediendo a los resultados de la función pam()
# Medoides de clúster
pam.res$medoids %>%
kable(caption = "Medoides de clúster",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|
| New Mexico | 0.829294 | 1.370809 | 0.308122 | 1.160320 |
| Nebraska | -0.800825 | -0.825077 | -0.244564 | -0.505211 |
# Números de clúster
head(pam.res$clustering)
## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
fviz_cluster(pam.res,
palette = c("#B23AEE","#66CD00"), # Paleta de colores
ellipse.type = "t", # Elipse de concentracion
repel = TRUE, # Evitar el exceso de etiqueta (lento)
ggtheme = theme_light()
)
fuente: en base a los ejempos del capitulo 5 (Kassambara, 2017)
Ejemplo Capitulo 6: CLARA - Agrupamiento grande Aplicaciones
# Reproduccion del resultado usando la función set.seed().
set.seed(1234)
# Genera 500 objetos, divididos en 2 grupos..
df_CLARA <- 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_CLARA) <- c("x", "y")
rownames(df_CLARA) <- paste0("S", 1:nrow(df_CLARA))
# Vista previa de los datos
head(df_CLARA, nrow = 10) %>%
kable(caption = "Datos Aleatorios",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| 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 |
library(cluster)
library(factoextra)
fviz_nbclust(df_CLARA, clara, method = "silhouette")+
theme_classic()
# Calcular CLARA
clara.res <- clara(df_CLARA, 2, samples = 50, pamLike = TRUE)
# Imprimir componentes de clara.res
print(clara.res)
## Call: clara(x = df_CLARA, 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"
# Agregacion de las clasificaciones de puntos a los datos originales
library(factoextra)
dd_CLARA <- cbind(df_CLARA, cluster = clara.res$cluster)
head(dd_CLARA, n = 4) %>%
kable(caption = "Clasificaciones de Puntos",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| 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 %>%
kable(caption = "Medoides",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| x | y | |
|---|---|---|
| S121 | -1.531137 | 1.145057 |
| S455 | 48.357304 | 50.233499 |
# Agrupación
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
Visualización de clústeres CLARA
fviz_cluster(clara.res,
palette = c("#4E9D53", "#CD6E94"), # color palette
ellipse.type = "t", # Concentration ellipse
geom = "point", pointsize = 1,
ggtheme = theme_linedraw()
)
fuente: en base a los ejempos del capitulo 6 (Kassambara, 2017)
Ejemplo Capitulo 7: Agrupación aglomerativa
# Calculo la matriz de disimilitud
# df = los datos estandarizados
res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:6, 1:6] %>%
kable(caption = "matriz de disimilitud",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| 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 |
# El dendograma se puede producir en R usando el función base (res.hc), es la salida de hclust().
res.hc <- hclust(d = res.dist, method = "ward.D2")
# cex: tamaño de la etiqueta
library("factoextra")
fviz_dend(res.hc, cex = 0.5)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
# 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
# Metodo de vinculacion promedio
res.hc2 <- hclust(res.dist, method = "average")
# Calcular la distancia cofentica
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382
# Cortar el árbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
# Numero de miembros en cada grupo
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"
# Obtener los nombres de los miembros del clúster 2
rownames(df)[grp == 2]
## [1] "Alaska" "Arizona" "California" "Colorado" "Florida"
## [6] "Illinois" "Maryland" "Michigan" "Nevada" "New Mexico"
## [11] "New York" "Texas"
# Obtener los nombres de los miembros del clúster 3
rownames(df)[grp == 3]
## [1] "Arkansas" "Connecticut" "Delaware" "Hawaii"
## [5] "Indiana" "Kansas" "Kentucky" "Massachusetts"
## [9] "Missouri" "New Jersey" "Ohio" "Oklahoma"
## [13] "Oregon" "Pennsylvania" "Rhode Island" "Utah"
## [17] "Virginia" "Washington" "Wyoming"
# Obtener los nombres de los miembros del clúster 4
rownames(df)[grp == 4]
## [1] "Idaho" "Iowa" "Maine" "Minnesota"
## [5] "Montana" "Nebraska" "New Hampshire" "North Dakota"
## [9] "South Dakota" "Vermont" "West Virginia" "Wisconsin"
# Cortar en 4 grupos y colorear por grupos
fviz_dend(res.hc, k = 4, # Corta en 4 grupos
cex = 0.5, # Tamaño de la etiqueta
k_colors = c("#4A3D8D", "#922C33", "#005923", "#B23A6E"),
color_labels_by_k = TRUE, # etiquetas de color por grupos
rect = TRUE # Agregue un rectángulo alrededor de los grupos
)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
# visualizar el resultado en un diagrama de dispersión.
fviz_cluster(list(data = df, cluster = grp),
palette = c("#4A3D8D", "#922C33", "#005923", "#B23A6E"),
ellipse.type = "convex", # elipse de concentracion
repel = TRUE, # Evitar el exceso de etiqueta (lento)
show.clust.cent = FALSE, ggtheme = theme_minimal())
library("cluster")
# Anidamiento aglomerativo (agrupación jerárquica)
res.agnes <- agnes(x = USArrests, # Matriz de datos
stand = TRUE, # Estandarizar los datos
metric = "euclidean", # Métrica para matriz de distancia
method = "ward" # Método de vinculación
)
fviz_dend(res.agnes, cex = 0.6, k = 4) # Visualizar dendograma
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
# Agrupamiento de análisis divisivo
res.diana <- diana(x = USArrests, # matriz de datos
stand = TRUE, # Estandarizar los datos
metric= "euclidean" # Métrica para matriz de distancia
)
fviz_dend(res.diana, cex = 0.6, k = 4)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
fuente: en base a los ejempos del capitulo 7 (Kassambara, 2017)
Ejemplo Capitulo 8: Comparación de dendogramas
# Preparando los datos
data("USArrests") # Cargando el data set de R base
df <- scale(USArrests)
# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]
# Comparación visual de dos dendrogramas
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 dendogramas
dend_list <- dendlist(dend1, dend2)
# Dibuja un tanglegrama
tanglegram(dend1, dend2)
# Personalizacion del tanglegrama
tanglegram(dend1, dend2,
highlight_distinct_edges = FALSE, # Turn-off dashed lines
common_subtrees_color_lines = FALSE, # Turn-off line colors
common_subtrees_color_branches = TRUE, # Color common branches
main = paste("entanglement =", round(entanglement(dend_list), 2))
)
# 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ético
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
# Calcular 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) %>%
kable(caption = "matriz de correlación",
align = "c",
digits = 6) %>%
kable_classic_2(html_font = "Luminari",
lightable_options = c("basic","hover", "striped")) %>%
row_spec(0,
bold = TRUE,
monospace = TRUE,
italic = FALSE,
color = "# 2a0b23",
background = "#c4a8bb")
| 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")
fuente: en base a los ejempos del capitulo 8 (Kassambara, 2017)
Ejemplo Capítulo 9 Visualización de dendogramas
# Cargar la DATA
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
fviz_dend(hc, cex = 0.5) # Dendograma
# Visualización de dendogramas
fviz_dend(hc, cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")
# Dibujar un dendograma horizontal
fviz_dend(hc, cex = 0.5, horiz = TRUE)
library(dendextend)
library(factoextra)
fviz_dend(hc, k = 4, # Cortar en 4 grupos
palette = "jco", rect = TRUE, rect_fill = TRUE, rect_border = "jco", labels_track_height = 1.8 )
library(dendextend)
library(factoextra)
fviz_dend(hc, k = 4, # Cortar en 4 grupos
cex = 0.5, # Tamaño de la etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # Etiquetas de colores por grupos
ggtheme = theme_gray() # Cambio de tema
)
fviz_dend(hc, cex = 0.5, k = 4, # Cortar en 4 grupos
k_colors = "jco")
# Dendograma horizontal con un rectángulo alrededor de los grupos
fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)
# dendrograma circular
fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")
require("igraph")
# Arbol de tipo filogénico
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")
# Zoom en el dendrograma
fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))
# Crea una gráfica de todo el dendrograma,
# y extraer los datos del dendrograma
dend_plot <- fviz_dend(hc, k = 4, # Corta en 4 grupos
cex = 0.5, # Tamaño de la etiqueta
k_colors = "jco"
)
dend_data <- attr(dend_plot, "dendrogram") # Extraer datos de dendrograma
# Cortar el dendograma a la altura h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualiza la versión truncada que contiene
# dos ramas
fviz_dend(dend_cuts$upper)
# Trazar todo el dendograma
print(dend_plot)
# Parcela subárbol 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")
# Parcela subárbol 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")
fviz_dend(dend_cuts$lower[[2]], type = "circular")
# Código R estándar para crear un dendrograma:
data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)
# Código R para crear un dendrograma usando un operador de encadenamiento:
library(dendextend)
dend <- USArrests[1:5,] %>% # data
scale %>% # Escalar los datos
dist %>% # Calcular una matriz de distancia,
hclust(method = "ward.D2") %>% # Agrupación jerárquica
as.dendrogram # Convertir el objeto en un dendrograma.
plot(dend)
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 ramas
set("branches_k_color", mycols, k = 4) %>% # Ramas de colores por grupos
set("labels_colors", mycols, k = 4) %>% # Etiquetas de colores por grupos
set("labels_cex", 0.5) # Cambiar tamaño de etiqueta
# 2. Crear grafico
fviz_dend(dend)
fuente: en base a los ejempos del capitulo 9 (Kassambara, 2017)