Laboratorio 2

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

“LABORATORIO 2”

DOCENTE: MSF. CARLOS ADEMIR PÉREZ

MATERIA: MÉTODOS PARA EL ANÁLISIS ECONÓMICO

GT: 02

Presentado por:

NOMBRE CARNET
LUIS DAVID CASTRO MARTINEZ CM16011
KEILY MARLENE CAMPOS ULLOA CU14003
LISBETH ESMERALDA MELCHOR REYES MR14076
RUTH ABIGAIL MARROQUIN SARAVIA MS17026

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

El Análisis conglomerados es una técnica de análisis exploratorio utilizada para resolver problemas de clasificación.

Se encuadra en los métodos de aprendizaje no supervisado. Su objetivo es ordenar objetos (definidos por un conjunto de variables) en grupos de forma que los miembros del grupo sean lo más homogéneos posibles y los más heterogéneos entre miembros de distintos grupos

El análisis de conglomerados permite descubrir asociaciones y estructuras que no son evidentes a priori pero que pueden ser útiles una vez que se han detectado. Las estructuras encontradas pueden utilizarse para la definición formal de un esquema de clasificación (taxonomía).

Los métodos más utilizados de clusterización se dividen en dos grandes grupos: jerárquicos y no jerárquicos.

Esta técnica es 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 estan incluidas en ese grupo.

-Que los grupos sean lo más distintos posible unos de otros respecto a las variables consideradas.

Aldas Manzano, J., & Uriel Jimenez, E. (2017). Análisis multivariante aplicado con R. Ediciones Paraninfo, SA.

2. Elabore un cuadro comparativo, que incluya los siguientes elementos:

ANALISIS DE CLUSTER

TECNICAS DISPONIBLES

VENTAJAS

DESVENTAJAS

JERARQUICO:

 

Es un enfoque alternativo al agrupamiento de particiones para agrupar objetos en función de su similitud.

 

El agrupamiento jerárquico no requiere especificar previamente el número de clústeres que se producirán.

 

El resultado de la agrupación jerárquica es una representación basada en árboles de los objetos, que también se conoce como dendrograma

 

Métodos del centroide:

este método comienza uniendo aquellas dos observaciones que están más cercanas.

 

Método del vecino más cercano:

La distancia entre dos clústeres se define como el valor mínimo de todas las distancias por pares entre los elementos en el grupo 1 y los elementos del grupo 2.

 

Método del vecino más lejano:

La distancia entre dos grupos se define como el valor máximo de todas las distancias por pares entre los elementos del grupo 1 y los elementos del grupo 2.

 

Método de vinculación promedio:

La distancia entre dos grupos se define como la distancia media entre los elementos del grupo 1 y los elementos del grupo 2.

 

Método de Ward:

Su objetivo es maximizar la homogeneidad dentro de cada conglomerado.

·         El número óptimo de clústeres se puede obtener por el mismo modelo, a través de su muy útil dendrograma.

 

·         Se utiliza cuando no se conoce el número de clusters a priori y trabaja mejor cuando el número de objetos no es muy grande.

 

·         La posibilidad de estandarizarlas variables puede llevarse a cabo automáticamente mediante el propio procedimiento de Análisis de conglomerados jerárquico.

 

·         Debido a que el análisis clúster implica la elección entre diferentes medidas y procedimientos, con frecuencia es difícil juzgar la veracidad de los resultados.

 

·         Imposibilidad de reasignar los individuos a los clusters en los casos en que la clasificación haya sido dudosa en las primeras etapas del análisis.

 

·         Alta complejidad de espacio y tiempo para el agrupamiento jerárquico, es decir, no se puede usar cuando tenemos una gran cantidad de datos.

 

·         No existe un objetivo matemático para el agrupamiento jerárquico y el orden de los datos tiene un impacto en los resultados finales.

 

 

NO JERARQUICO:

Los métodos no jerárquicos categorizan los elementos según un número de clúster dado.

 

Necesitan que el número de particiones esté fijado a priori, con la intención de que se encuentren conjuntos de elementos que maximicen o minimicen según sea el criterio de evaluación.

 

 

K-Means (centroides):

Esta elaborada para asignar los elementos del estudio a un número fijo de grupos, para ello se cuenta con un valor de K establecido, es decir el número de grupos.

 

K-Medoids o PAM (medioides):

Es una aplicación más robusta de K-means, ya que en este no se toma en cuenta el promedio.

 

Clara (mediodes):

El método Clara reduce el tiempo de cálculo y el problema de almacenamiento cuando se tiene una gran cantidad de elementos (observaciones).

 

·         Es un algoritmo muy simple y rápido. Puede manejar de manera eficiente conjuntos de datos muy grandes.

 

·         Es el método que se usa más habitualmente, es fácil de programar y da resultados razonables.

 

·         Con una gran cantidad de variables, K-Means puede ser computacionalmente más rápido que el agrupamiento jerárquico.

 

 

·         Supone un conocimiento previo de los datos y requiere que el analista elija el número apropiado de clúster (k) por adelantado.

 

·         La lectura de los datos es más difícil y no cuenta con una estructura de compresión como con los clústeres jerárquicos.

 

·         Los resultados finales obtenidos son sensibles a la selección aleatoria inicial de conglomerados centros.

 

·         Es sensible a los valores atípicos.

 

 

 

 

 

 

 

 

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

Métodos Jerárquicos

  • Método del centroide

    El método del centroide (Sokal y Michener, 1958) está implementado en la función de R, hclust{stats}, este método comienza uniendo aquellas dos observaciones que están más cercanas. A continuación el grupo formado es sustituido por una observación que lo representa y en la que las variables toman los valores medios de todas las observaciones que constituyen el grupo representado (centroide). Se unen aquellas dos observaciones que están de nuevo más cerca, hclust muestra esas distancias sucesivas en lo que denominamos el historial de conglomeración.

  • Método del vecino más cercano

    La distancia entre dos clústeres se define como el valor mínimo de todas las distancias por pares entre los elementos en el grupo 1 y los elementos del grupo 2. Tiende a producir grupos largos y “sueltos”. En este método se considera que la distancia o similitud entre dos clusters viene dada, respectivamente, por la mínima distancia (o máxima similitud) entre sus componentes.

  • Método del vecino mas lejano

    La distancia entre dos grupos se define como el valor máximo de todas las distancias por pares entre los elementos del grupo 1 y los elementos del grupo 2. Tiende a producir grupos más compactos. Se considera que la distancia o similitud entre dos clusters hay que medirla atendiendo a sus elementos más dispares, o sea, la distancia o similitud entre clusters viene dada, respectivamente, por la máxima distancia (o mínima similitud) entre sus componentes.

  • Método de vinculación promedio

    La distancia entre dos grupos se define como la distancia media entre los elementos del grupo 1 y los elementos del grupo 2. En esta estrategia la distancia, o similitud, del cluster Ci con el Cj se obtiene como la media aritmética entre la distancia, o similitud, de las componentes de dichos clusters.

  • Método de Ward

    El método de Ward no calcula la distancia entre los distintos conglomerados para decidir cuáles se deben fusionar, ya que su objetivo es maximizar la homogeneidad dentro de cada conglomerado. Para ello plantea todas las posibles combinaciones de observaciones para el número de grupos que se esté considerando en cada etapa concreta.

Paquetes

Stats y Cluster

En los métodos jerárquicos aglomerativos entre los más destacados están “hclust” del package stats y “agnes” del package cluster y divisivos como diana del package cluster.

Sintaxis

scale() -> Función genérica para centrado y/o escalado de columnas de una matriz numérica.

Ejemplo:

df <- scale(USArrests)

dist()-> Calcula y devuelve la matriz de distancias/similitud entre filas (utilizando la medida indicada, ej. euclídea).

Argumentos:

-X: una matriz numérica, en este se coloca la matriz ya estandarizada que se ha obtenido con las observaciones y las variables a utilizar.

-method: la medida de distancia que se utilizará. Las opciones que se pueden colocar de acuerdo método que desee usar pueden ser: “euclidean,” “maximum,” “manhattan,” “canberra,” “binary” o “minkowski.” Sino lo coloca, automáticamente utilizará “euclidean.”

-diag: Es un valor lógico (FALSE o TRUE) que indica si se debe imprimir la diagonal principal de la matriz de distancias ya que son solo 0.

-upper: Es otro valor lógico (FALSE o TRUE) que indica si el triángulo superior de la matriz de distancias debe imprimirse. Automáticamente no lo hace (FALSE).

Ejemplo:

dist (x, method = ” euclidean “, diag = TRUE, upper = FALSO)

hclust()-> Implementación de clustering jerárquico.

Argumentos:

-d: Se coloca la matriz de distancias que se ha obtenido con anterioridad.

-method: se especifica el método de aglomeración jerárquico que se usará, entre ellos pueden ser “ward.D,” “ward.D2,” “single,” “complete,” “average”.

Ejemplo:

hclust (d, method = “average”)

cutree() -> Corta un árbol en varios grupos, ya sea especificando el número deseado de grupos (k) o la altura del corte (h).

La función base de R cutree() se puede usar para cortar un árbol, generada por la función hclust(), en varios grupos especificando el número deseado de grupos o la altura de corte.

Argumentos:

-res.hc: salida del hclust().

-k: indica el número de grupos a cortar

Ejemplo:

grp <- cutree(res.hc, k = 4)

fviz_cluster() -> Para visualizar los resultados de la partición, usaremos la función fviz_cluster(). Dibuja un diagrama de dispersión de puntos de datos coloreados por números de conglomerados. si los datos contiene más de 2 variables, el algoritmo de análisis de componentes principales (PCA) se utiliza para reducir la dimensionalidad de los datos. En este caso, los dos primeros principales Las dimensiones se utilizan para trazar los datos.

Argumentos:

-pam.res: son los resultados de PAM. -palette: para elegir de la paleta de colores. -ellipse.type: para el elipse de concentracion. -repel: se utiliza TRUE para evitar el exceso de la etiqueta. -ggtheme: elegir el tema.

Ejemplo:

fviz_cluster(pam.res, palette = c(“#00AFBB”, “#FC4E07”), ellipse.type = “t”, repel = TRUE, ggtheme = theme_classic() )

Métodos no jerárquicos

  • K-Medias

    Esta elaborada para asignar los elementos del estudio a un número fijo de grupos, para ello se cuenta con un valor de K establecido, es decir el número de grupos. El objetivo primordial es separar los elementos en a un solo grupo en el cual se consideraría definitivo y altamente homogéneo, así mismo muy diferente a los otros clústeres formados.

  • K-Medoids

    Es una aplicación más robusta de K-means, ya que en este no se toma en cuenta el promedio como se hacía anteriormente, ese promedio de k-means se ve afectado por los valores atípicos al conjunto de datos, haciendo que el centroide no sea representativo para el grupo. En este se selecciona algún elemento con su valor real, el cual representará el grupo y será utilizado para medir las distancias.

  • Clara

    Este método es utilizado como una ampliación del método k-medoids, ya que cuando se tiene una gran cantidad de elementos (obervaciones), el método clara reduce el tiempo de cálculo y el problema de almacenamiento, para ello usa el método de muestreo. En el muestreo, se establece un tamaño de muestra.

Paquetes

Cluster

Las funciones a utilizar están incluidas sobre todo en la libreria cluster como kmeans, pam y clara.

La función kmeans() devuelve una lista de componentes, que incluye:

• cluster: Un vector de enteros (de 1:k) que indica el cluster al que pertenece cada se asigna el punto • centros: una matriz de centros de conglomerados (medios de conglomerados) • totss: La suma total de cuadrados (TSS), es decir, q(xi ≠ ¯x)2. TSS mide el total variación en los datos. • withinss: Vector de suma de cuadrados dentro de un grupo, un componente por grupo • tot.withinss: suma total de cuadrados dentro del grupo, es decir, sum(withinss) • betweenss: la suma de cuadrados entre grupos, es decir, totss ≠ tot.withinss • tamaño: El número de observaciones en cada grupo.

Ejemplo:

Calcular k-medias con k = 4

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

La función pam() es un algoritmo que funciona con una matriz de disimilitud, y para calcular esta matriz, el algoritmo puede usar dos métricas: 1. Las distancias euclidianas, que son la raíz de la suma de los cuadrados de las diferencias; 2. Y, la distancia de Manhattan que son la suma de distancias absolutas. • x: valores posibles incluye: – Matriz de datos numéricos o trama de datos numéricos: cada fila corresponde a un observación, y cada columna corresponde a una variable. – Matriz de disimilitud: en este caso, x suele ser la salida de daisy() o dist() • k: el número de grupos • metric: las métricas de distancia a utilizar. Las opciones disponibles son “euclidean” y “Manhattán”. • soporte: valor lógico; si es verdadero, las variables (columnas) en x están estandarizadas antes calcular las diferencias. Ignorado cuando x es una matriz de disimilitud.

Ejemplo:

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

CLARA (Clustering Large Applications, Kaufman y Rousseeuw (1990)) es una extensión a los métodos k-medoids para tratar con datos que contienen una gran número de objetos (más de varios miles de observaciones) con el fin de reducir tiempo de computación y problema de almacenamiento de RAM.

La función clara() se puede usar para calcular CLARA.

Argumentos:

• x: una matriz de datos numéricos o marco de datos, cada fila corresponde a una observación, y cada columna corresponde a una variable. Se permiten valores faltantes (NA). • k: el número de conglomerados. • metric: las métricas de distancia a utilizar. Las opciones disponibles son “euclidean” y “Manhattán”. Las distancias euclidianas son la raíz de la suma de los cuadrados de las diferencias, y las distancias de manhattan son la suma de las diferencias absolutas. Leer más sobre la distancia medidas. Tenga en cuenta que la distancia de Manhattan es menos sensible a los valores atípicos. • soporte: valor lógico; si es verdadero, las variables (columnas) en x están estandarizadas antes calcular las diferencias. Tenga en cuenta que se recomienda estandarizar variables antes de la agrupación. • muestras: número de muestras que se extraerán del conjunto de datos. El valor predeterminado es 5 pero se recomienda un valor mucho mayor. • pamLike: indicación lógica si el mismo algoritmo en la función pam() debería ser usado. Esto debería ser siempre cierto.

Ejemplo:

clara(x, k, metric = “euclidean”, stand = FALSE, samples = 5, pamLike = FALSE)

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 Capítulo 4

data("USArrests") # Cargando la data
df <- scale(USArrests) 
# Ver las primeras 3 filas de los datos
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
# La función de R fviz_nbclust() proporciona una solución conveniente para estimar el número óptimo de conglomerados.

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

# Calcular k-medias con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
# Resultados
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
# Es posible calcular la media de cada variable por conglomerados utilizando los datos originales

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
# Número de conglomerado para cada una de las observaciones

km.res$cluster
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              4              4              1              4 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              4              3              3              4              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              4              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              4 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              4              2              1              4 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              4              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              4              4              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              4              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3
head(km.res$cluster, 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        4        4        1
#Tamaño del conglomerado

km.res$size
## [1]  8 13 16 13
#Medias de cluster

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
# La función fviz_cluster() se puede usar para visualizar fácilmente las k-medias

fviz_cluster(km.res, data = df,

palette = c("#EE1289", "#00CED1", "#7D26CD", "#00008B"),
ellipse.type = "euclid", 
star.plot = TRUE, 
repel = TRUE, 
ggtheme = theme_minimal()
)

Ejemplo Capítulo 5

# Cargando la data
data("USArrests") 

df <- scale(USArrests) 

# Ver las primeras 3 filas de los datos
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
# La función R fviz_nbclust() proporciona una solución conveniente para estimar el número óptimo de conglomerados.

library(cluster)
library(factoextra)

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

# 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"
# Si se desea agregar las clasificaciones de puntos a los datos originales, use esto:

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
# Cluster medoids: 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
# Para visualizar los resultados de la partición, usaremos la función fviz_cluster(). Dibuja un diagrama de dispersión de puntos de datos coloreados por números de conglomerados.

fviz_cluster(pam.res,
palette = c("#7D26CD", "#00CD00"), 
ellipse.type = "t", 
repel = TRUE, 
ggtheme = theme_classic()
)

Ejemplo Capítulo 6

# Aquí, generaremos un conjunto de datos aleatorios. Para que el resultado sea reproducible, comenzamos usando la función set.seed().

set.seed(1234)

# Genera 500 objetos, divido en 2 conglomerados.
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
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()

# Calcular CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)

# Imprimir componentes de clara.res
print(clara.res)
## Call:     clara(x = df, k = 2, samples = 50, pamLike = TRUE) 
## Medoids:
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
## Objective function:   9.87862
## Clustering vector:    Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes:            200 300 
## Best sample:
##  [1] S37  S49  S54  S63  S68  S71  S76  S80  S82  S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"
# Si desea agregar las clasificaciones de puntos a los datos originales, use esto:
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
# Medoids
clara.res$medoids
##              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
# Para visualizar los resultados de la partición, usaremos la función fviz_cluster(). Dibuja un diagrama de dispersión de puntos de datos coloreados por números de conglomerados.

fviz_cluster(clara.res,
palette = c("#7FFF00", "#9400D3"), # color 
ellipse.type = "t", 
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)

Ejemplo Capítulo 7

# Cargando data
data("USArrests")

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
# Calcular la matriz de disimilitud

res.dist <- dist(df, method = "euclidean")
# muestra las primeras 6 filas y columnas de la matriz de distancia

as.matrix(res.dist)[1:6, 1:6]
##             Alabama   Alaska  Arizona Arkansas California Colorado
## Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
## Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
## Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
## Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
## Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000
# La función base de R hclust() se puede usar para crear el árbol jerárquico.

res.hc <- hclust(d = res.dist, method = "ward.D2")
# cex: tamaño de la etiqueta

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

# 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
# Ejecute la función hclust() nuevamente usando el método de vinculación promedio. A continuación, llame cophenetic() para evaluar la solución de agrupamiento.

res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382
# Corte 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 las miembros del cluster 1

rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cortar en 4 grupos y colorear por grupos
fviz_dend(res.hc, k = 4, 
cex = 0.5, 
k_colors = c("#C71585", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, 
rect = TRUE 
)

# Usando la función fviz_cluster(), también podemos visualizar el resultado enun gráfico de dispersión. 

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

library("cluster")

# agrupación jerárquica (AGNES)
res.agnes <- agnes(x = USArrests, 
stand = TRUE, 

# métrica para matriz de distancia
metric = "euclidean", 

# Método de vinculación
method = "ward"
)

# Analisis divisivo (DIANA)
res.diana <- diana(x = USArrests, 
stand = TRUE, 
metric = "euclidean" 
)
fviz_dend(res.agnes, cex = 0.6, k = 4)

Ejemplo Capítulo 8

df <- scale(USArrests)
# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:20, 10)
df <- df[ss,]
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)

# Personalizar el tanglegrama
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))
)

# Matriz de correlación cofenética
cor.dendlist(dend_list, method = "cophenetic")
##          [,1]     [,2]
## [1,] 1.000000 0.960709
## [2,] 0.960709 1.000000
# Matriz de correlación de Baker
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9803627
## [2,] 0.9803627 1.0000000
# Coeficiente de correlación cofenético
cor_cophenetic(dend1, dend2)
## [1] 0.960709
# Coeficiente de correlación de Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.9803627
# 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)
##          Complete Single Average Centroid
## Complete     1.00   0.85    0.98     0.85
## Single       0.85   1.00    0.91     0.95
## Average      0.98   0.91    1.00     0.89
## Centroid     0.85   0.95    0.89     1.00
# Visualice la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")

Ejemplo Capítulo 9

# Cargando la data
data(USArrests)

# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
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, # Cortar en cuatro grupos
cex = 0.5, # tamaño de etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # etiquetas de color por grupos
ggtheme = theme_gray() # Cambiar tema
)

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

#Para obtenerlo de forma circular se usa la opción "circular"
fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")

#Para trazar un árbol filogenético primero instalamos la libreria igraph y utilizamos la opción "phylogenic"

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

require("igraph")
fviz_dend(hc, k = 4, # Para cortar en 4 grupos
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")

#Si desea ampliar los primeros grupos, es posible utilizar la opción xlim e ylim para limitar el área de la parcela.

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, # Para cortar en 4 grupos
cex = 0.5, 
k_colors = "jco"
)

 #Extrae los datos del dendrograma
dend_data <- attr(dend_plot, "dendrogram")

# Cortar el dendograma a la altura h = 10
dend_cuts <- cut(dend_data, h = 10)

# Visualiza la versión que contiene dos ramas
fviz_dend(dend_cuts$upper) 

# Para graficar todo el dendograma
print(dend_plot)

#Para graficar el subtree 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

#Para graficar el subtree 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

#Para trazar árboles circulares
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
# Escala los datos
  scale %>% 
  
# Calcula una matriz de distancia
  dist %>% 
  
# Agrupación jerárgica
  hclust(method = "ward.D2") %>% 
  
# Convierte el objeto en un dendrograma
  as.dendrogram 

plot(dend)

#Utilizando la funcioón set() para cambiar los parámetros de un dendograma.

library(dendextend)

# 1. Crea 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) %>% # Colorea las ramas por grupos
set("labels_colors", mycols, k = 4) %>% # Etiquetas de color por grupos
set("labels_cex", 0.5) # Cambiar el tamaño de la etiqueta

# 2. Crear gráfico
fviz_dend(dend)

Bibliografía

Aldas Manzano, Joaquin, and Ezequiel Uriel Jimenez. 2017. Análisis Multivariante Aplicado Con r. Ediciones Paraninfo, SA.
Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, and Richard Iannone. 2022. Rmarkdown: Dynamic Documents for r.
Calvo, Diego. 2018. “Clúster Jerárquicos y No Jerárquicos.” https://www.diegocalvo.es/cluster-jerarquicos-y-no-jerarquicos/.
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.
Granada, Universidad de. n.d. “Métodos de Análisis Multivariante: Análisis de Clúster.” http://wpd.ugr.es/~bioestad/guia-spss/practica-8/.
Hyndman, Rob J, and Yeasmin Khandakar. 2008. “Automatic Time Series Forecasting: The Forecast Package for R.” Journal of Statistical Software 26 (3): 1–22. https://doi.org/10.18637/jss.v027.i03.
Kassambara, Alboukadel. 2017. Practical Guide to Cluster Analysis in r: Unsupervised Machine Learning. Vol. 1. Sthda.
Kassambara, Alboukadel, and Fabian Mundt. 2020. Factoextra: Extract and Visualize the Results of Multivariate Data Analyses. http://www.sthda.com/english/rpkgs/factoextra.
Maechler, Martin, Peter Rousseeuw, Anja Struyf, and Mia Hubert. 2022. Cluster: "Finding Groups in Data": Cluster Analysis Extended Rousseeuw Et Al. https://svn.r-project.org/R-packages/trunk/ cluster/.
Wei, Taiyun, and Viliam Simko. 2021a. Corrplot: Visualization of a Correlation Matrix. https://github.com/taiyun/corrplot.
———. 2021b. R Package ’Corrplot’: Visualization of a Correlation Matrix. https://github.com/taiyun/corrplot.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.