Laboratorio 2

2022-11-03

PORTADA

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 DANIEL QUIJANO VÁSQUEZ QV13001
CARLOS ROBERTO GARCÍA RAMÍREZ GR16051

Ejercicio 1

Explique en que consiste el análisis de conglomerados

De forma sencilla, el análisis de conglomerados es una forma en la cual se crean grupos para separar elementos de una población. El análisis de clúster o de conglomerados es un método muy importante en la exploración de datos y es utilizado para descubrir conocimientos en datos multidimensionales, es decir, el objetivo general de este proceso de exploración de datos consiste en extraer información dentro de un conjunto de datos y de esta forma transformarla en una estructura comprensible para un futuro uso, dicho de otro modo, esta agrupación busca identificar patrones o grupos de objetos similares dentro de un cierto conjunto de datos que resulten de interés para el investigador.

El “análisis clúster” es una técnica estadística multivariante, la cual tiene por propósito agrupar elementos (variables) y tratar de lograr la mayor homogeneidad posible en cada grupo y mayor diferencia entre los grupos. Este método es basado en criterios geométricos y se utiliza como técnica exploratoria descriptiva.

Las soluciones propuestas bajo este método dependen de las variables usadas, la destrucción o adición de variables tiene un relevante impacto en dichas soluciones. Los algoritmos de construcción de conglomerados se agrupan en dos categorías que se verán a continuación.

Ejercicio 2

Ejercicio 3

Describa las técnicas disponibles para realizar el análisis de clúster, tanto jerárquicas como no jerárquicas, presentadas en el cuadro anterior, incluya una explicación de la librería y sintaxis para implementarla en R.

METODOS JERARQUICOS

El objetivo de los metodos jerarquicos es grupar cluster para crear 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.

Los métodos jerarquicos se dividen en aglomerativos y disociativos.

AGLOMERATIVOS O ASCENDENTES

Los metodos aglomerativos, tambien conocidos como ascendentes, comienzan el analisis con tantos grupos como individuos haya. A partir de estas unidades iniciales se van formando grupos, de forma ascendente, hasta que al final del proceso todos los casos tratados estan englobados en un mismo conglomerado.

Los métodos jerárquicos permiten construir un árbol de clasificación o dendograma.

Simple Linkage

El método de agrupación de enlace simple (Single linkage clustering) o del vecino más próximo (nearest neighbor clustering) (Gower, 1967), comienza al seleccionar y unir los dos elementos de la matriz de distancias que se encuentran más próximos. La distancia de este nuevo conglomerado respecto a los restantes elementos de la matriz se calcula como la menor de las distancias entre cada elemento del conglomerado y el resto de los elementos de la matriz. En los pasos sucesivos, la distancia entre dos conglomerados se calcula como la distancia entre sus dos elementos más próximos.

*Complete Linkage

En inglés Complete linkage clustering o método del vecino más lejano (furthest neighbor clustering) (Sorensen, 1948), se comporta de manera opuesta al anterior. La distancia entre dos conglomerados se obtiene o calcula como la distancia entre sus dos elementos más alejados.

Promedio entre Grupos

En inglés Average linkage clustering o vinculación inter-grupo (unweighted Pair-group arithmetic averages (UPGMA)) (Sneath and Sokal, 1973), Aprovecha la información de todos los miembros de los conglomerados que se comparan uniéndolos previamente. La distancia entre dos conglomerados se calcula como la distancia promedio existente entre todos los miembros del conglomerado unión de ambos.

Método del Centroide

Este metodo utiliza como distancia entre grupos la distancia entre los centroides de cada grupo. Este método es, también, espacio-conservativo, pero presenta el inconveniente de dejarse influir excesivamente por los grupos de mayor tamaño.

Método de la Mediana

Una de la desventaja del método del centroide es que si se fusionan dos grupos de diferente tamaño, el centroide del nuevo grupo queda más cerca del grupo de mayor tamaño y más alejado del de menor tamaño en proporción a sus diferencias de tamaño. Esto trae como consecuencia que durante el proceso aglomerativo de fusión se van perdiendo paulatinamente las propiedades de los grupos pequeños. Para evitar esto, puede suponerse, con independencia del tamaño que tengan los grupos en realidad, que los grupos son de igual tamaño.
Llevando a cabo esta estrategia, la distancia entre un individuo o grupo K de centroide k y el grupo formado por la fusión de los grupos I y J de centroides i y j viene dada por la mediana del triángulo i,j, k. Razón por la cual Gower propuso el nombre de método (distancia) de la mediana.
Este método es, como el del centroide, espacio-conservativo, aunque también como él no resulta ser invariante ante transformaciones monótonas de la distancia empleada, cosa que sí ocurría con los tres primeros métodos.

Método de Ward

Ward propuso que la pérdida de información que se produce al integrar los distintos individuos en clusters puede medirse a través de la suma total de los cuadrados de las desviaciones entre cada punto (individuo) y la media del cluster en el que se integra. Para que el proceso de clusterización resulte óptimo, en el sentido de que los grupos formados no distorsionen los datos originales, proponía la siguiente estrategia:
En cada paso del análisis, considerar la posibilidad de la unión de cada par de grupos y optar por la fusión de aquellos dos grupos que menos incrementen la suma de los cuadrados de las desviaciones al unirse.
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 media y suele ser más discriminativo en la determinación de los niveles de agrupación .Una investigación llevada a cabo por Kuiper y Fisher probó que este método era capaz de acertar mejor con la clasificación óptima que otros métodos (mínimo, máximo, media y centroide).

DISOCIATIVOS O DESCENDENTES

Los metodos disociativos, tambien llamados descendentes, constituyen el proceso inverso al anterior.
Comienzan con un conglomerado que engloba a todos los casos tratados y, a partir de este grupo inicial,a traves de sucesivas divisiones, se van formando grupos cada vez mas pequeños. Al final del proceso se tienen tantas agrupaciones como casos han sido tratados.
En cuanto a la clasificación de estos métodos se puede decir que la filosofía de los métodos aglomerativos puede mantenerse para este otro tipo de procedimientos en lo que concierne a la forma de calcular la distancia entre los grupos, si bien, como es lógico, al partir de un grupo único que hay que subdividir, se seguirá la estrategia de maximizar las distancias, o minimizar las similaridades, puesto que buscamos ahora los individuos menos similares para separarlos del resto del conglomerado.

METODOS NO JERARQUICOS

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

Los métodos de reasignación permiten que un individuo asignado a un grupo en un determinado paso del proceso sea reasignado a otro grupo en un paso posterior, si esto optimiza el criterio de selección. El proceso termina cuando no quedan individuos cuya reasignación permita optimizar el resultado que se ha conseguido. Algunos de los algoritmos más conocidos dentro de estos métodos son el método K-means (o K-medias) de McQueen (1967), el Quick Cluster Analysis y el método de Forgy, los cuales se suelen agrupar bajo el nombre de métodos centroides o centros de gravedad. Por otra parte, está el método de las nubes dinámicas, debido a Diday.

K - Medias

K-means necesita como dato de entrada el número de grupos en los que vamos a segmentar la población. A partir de este número k de clusters, el algoritmo coloca primero k puntos aleatorios (centroides). Luego asigna a cualquiera de esos puntos todas las muestras con las distancias más pequeñas. A continuación, el punto se desplaza a la media de las muestras más cercanas. Esto generará una nueva asignación de muestras, ya que algunas muestras están ahora más cerca de otro centroide. Este proceso se repite de forma iterativa y los grupos se van ajustando hasta que la asignación no cambia más moviendo los puntos. Este resultado final representa el ajuste que maximiza la distancia entre los distintos grupos y minimiza la distancia intragrupo.

K-medoides o PAM

El algoritmo de k-medoides es un enfoque de agrupación relacionado con la agrupación de k-medias para dividir un conjunto de datos en k grupos o agrupaciones. En la agrupación de k-medoides, cada grupo está representado por uno de los puntos de datos en el grupo. Estos puntos se denominan medoides de racimo.
El término medoide se refiere a un objeto dentro de un grupo para el cual la disimilitud promedio entre él y todos los demás miembros del grupo es mínima. Corresponde a el punto más céntrico del grupo. Estos objetos (uno por grupo) se pueden considerar como un ejemplo representativo de los miembros de ese grupo que puede ser útil en algunas situaciones. Recuerde que, en la agrupación de k-medias, el centro de un grupo dado se calcula como el valor medio de todos los puntos de datos en el grupo.
K-medoid es una alternativa sólida al agrupamiento de k-medias. Esto significa que el algoritmo es menos sensible al ruido y valores atípicos, en comparación con k-medias, porque usa medoides como centros de clúster en lugar de medias (usado en k-medias).
El algoritmo k-medoids requiere que el usuario especifique k, el número de clusters que se generarán (como en el clustering de k-means). Un enfoque útil para determinar el número óptimo de conglomerados es el método de silueta, que se describe en las siguientes secciones. El método de agrupamiento de k-medoides más común es el algoritmo PAM (Partitioning Around Medoids, Kaufman & Rousseeuw, 1990).

CLARA

En comparación con otros métodos de particionamiento como pam, puede manejar conjuntos de datos mucho más grandes. Internamente, esto se logra considerando subconjuntos de datos de tamaño fijo ( sampsize) de modo que los requisitos de tiempo y almacenamiento se vuelvan lineales en n en lugar de cuadráticos.
Cada subconjunto de datos se divide en kgrupos utilizando el mismo algoritmo que en pam. Una vez kque se han seleccionado objetos representativos del subconjunto de datos, cada observación de todo el conjunto de datos se asigna al medoide más cercano.La media (equivalente a la suma) de las diferencias de las observaciones con su medoide más cercano se usa como una medida de la calidad de la agrupación. Se retiene el subconjunto de datos para el cual la media (o suma) es mínima. Un análisis adicional se lleva a cabo en la partición final.
Cada subconjunto de datos se ve obligado a contener los medoides obtenidos del mejor subconjunto de datos hasta entonces. Las observaciones dibujadas al azar se agregan a este conjunto hasta que sampsizese haya alcanzado.

Nubes Dinámicas

Fue introducido por Diday (1972), generalizando el metodo de K-Medias de Forgy. 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á repsentada por un núcleo, que será un elemento representativo de todos los que intefran la misma.
Es decir, que en lugar de elegir como referencia de clase un sólo punto que constituye su centro y reasignar los puntos por proximidad a ese centro, se eligen varios puntos “h” para representar cada clase, siendo estos puntos el “núcleo” de la clase.

Búsqueda de densidad

Los métodos de búsqueda de la densidad presentan una aproximación tipológica y una aproximación probabilística. En la primera aproximación, los grupos se forman buscando las zonas en las cuales se da una mayor concentración de individuos. Entre los algoritmos más conocidos dentro de estos métodos están el análisis modal de Wishart, el método de Taxmap de Carmichael y Sneath, y el método de Fortin. En la segunda aproximación, se parte del postulado de que las variables siguen una ley de probabilidad según la cual los parámetros varían de un grupo a otro. Se trata de encontrar los individuos que pertenecen a la misma distribución. Destaca en esta aproximación el método de las combinaciones de Wolf.
Los métodos de busqueda de densidad son los siguientes: Análisis Modal, Métodos Taxmap, Método de Fortin y Método de Wolf.

Métodos Directos

Los métodos directos permiten clasificar simultáneamente a los individuos y a las variables. Las entidades agrupadas, ya no son los individuos o las variables, sino que son las observaciones, es decir, los cruces que configuran la matriz de datos.

Block - Clustering

La agrupación simultánea es una técnica importante en el análisis de datos bidireccional.
El obejtivo 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 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 enroque claro para conseguir el mejor número de clústers en algoritmos de “Block-Clustering.”

Métodos Reductivos

Consisten en la busqueda de unos factores en el espacio de los individuos que contiene la matriz de datos, donde cada factor corresponde a un clúster y se les cononoce como “Analisis Factorial tipo Q”

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 individuios y somete los factores econtrados a una roación ortogonal, el problema es que los individuos pueden pertenecer a varios y, por tanto, los clústers pueden presentar solapamiento, resultando (por lo tanto) compleja interpretación.

SINTAXIS PARA IMPLEMENTARLA EN R

Métodos de analisis jerárquicos

En Rstudio se usa la función hclust.
#  hclust(d, method = "complete", members = NULL)

#  S3 method for hclust
#  plot(x, labels = NULL, hang = 0.1, check = TRUE,
#     axes = TRUE, frame.plot = FALSE, ann = TRUE,
#     main = "Cluster Dendrogram",
#    sub = NULL, xlab = NULL, ylab = "Height", …)
Argumentos de la Función
d: toma el valor de una estructura de disimilitud
method: indicamos el método de aglomeración que se utilizará. Esto debe ser (una abreviatura inequívoca de) uno de , , , , (= UPGMA), (= WPGMA), (= WPGMC) o (= UPGMC).“ward.D”“ward.D2”“single”“complete”“average”“mcquitty”“median”“centroid”
members: NULL o un vector

Argumentos del resultado

x: un objeto del tipo producido por .hclust
hang: la fracción de la altura de la parcela por la que las etiquetas deben colgar por debajo del resto de la parcela. Un valor negativo hará que las etiquetas cuelguen de 0.
check: lógico que indica si el objeto debe comprobarse su validez.
labels: Un vector de caracteres de etiquetas para las hojas del árbol. De forma predeterminada, se utilizan los nombres de fila o los números de fila de los datos originales. Si no se traza ninguna etiqueta.labels = FALSE
axes:, frame.plot, ann banderas lógicas como en .plot.default
main, sub, xlab, ylab: cadenas de caracteres para . y tener un valor predeterminado no NULL cuando hay un archivo .titlesubxlabtree$call

Valor

Objeto de clase hclust que describe el árbol producido por el proceso de clustering. El objeto es una lista con componentes:
•Fusionar: una matriz n−1 por 2. La fila i de describe la fusión de clústeres en el paso i de la agrupación en clústeres. Si un elemento j de la fila es negativo, la observación −j se fusionó en esta etapa. Si j es positivo, entonces la combinación fue con el clúster formado en la etapa (anterior) j del algoritmo. Por lo tanto, las entradas negativas en indican aglomeraciones de singletons, y las entradas positivas indican aglomeraciones de non-singletons.mergemerge
•Altura: un conjunto de n−1 valores reales (no decrecientes para árboles ultramétricos). La alturade agrupamiento: es decir, el valor del criterio asociado al agrupamiento para la aglomeración particular.method
•Orden: un vector que da la permutación de las observaciones originales adecuadas para el trazado, en el sentido de que un diagrama de racimo que utiliza este orden y matriz no tendrá cruces de las ramas.merge
•Etiquetas: etiquetas para cada uno de los objetos que se agrupan.
•Llamar: la llamada que produjo el resultado.
•Método: el método de clúster que se ha utilizado.
•dist.método: la distancia que se ha utilizado para crear (sólo se devuelve si el objeto de distancia tiene un atributo).d“method”

Métodos de analisis no jerárquicos

# Para determinar el numero optimo de cluster con la libreria factoextra

# fviz_nbclust(
#   x,
#   FUNcluster = NULL,
#   method = c("silhouette", "wss", "gap_stat"),
#   diss = NULL,
#   k.max = 10,
#   nboot = 100,
#   verbose = interactive(),
#   barfill = "steelblue",
#   barcolor = "steelblue",
#   linecolor = "steelblue",
#   print.summary = TRUE,
#   ...
# )

# Para determinar los cluster

# kmeans(x, centers, iter.max = 10, nstart = 1,
#        algorithm = c("Hartigan-Wong", "Lloyd", "Forgy",
#                      "MacQueen"), trace=FALSE)
# # S3 method for kmeans
# fitted(object, method = c("centers", "classes"), ...)

Función fviz_nbclust: Dertemina y visualiza el número óptimo de clusters utilizando diferentes métodos: dentro de cluster sumas de cuadrados, silueta media y estadísticas de gap

Argumentos
x: matriz numérica o marco de datos. En la función fviz_nbclust(), x pueden ser los resultados de la función NbClust().
FUNcluster: una función de partición que acepta como primer argumento una matriz (de datos) como x, segundo argumento, digamos k, k > = 2, el número de clústeres deseados, y devuelve una lista con un componente llamado clúster que contiene la agrupación de observaciones. Los valores permitidos incluyen: kmeans, cluster::p am, cluster::clara, cluster::fanny, hcut, etc. Este argumento no es necesario cuando x es una salida de la función .NbClust::NbClust()
method: el método que se utilizará para estimar el número óptimo de grupos. Los valores posibles son “silueta” (para el ancho promedio de la silueta), “wss” (para el total dentro de la suma del cuadrado) y “gap_stat” (para las estadísticas de brecha).
k.max: el número máximo de grupos a considerar, debe ser de al menos dos.
nboot: entero, número de muestras de Monte Carlo (“bootstrap”). Se utiliza únicamente para determinar el número de grupos utilizando la estadística de brechas.

Valor

“fviz_nbclust” devuelve un ggplot2

Función kmeans:
Argumentos
x: matriz numérica de datos, o un objeto que se puede forzar a dicha matriz (como un vector numérico o un marco de datos con todas las columnas numéricas).
centros: ya sea el número de clústeres, digamos k, o un conjunto de centros de clúster iniciales (distintos). Si es un número, se elige un conjunto aleatorio de filas (distintas) como centros iniciales.x
iter.max: el número máximo de iteraciones permitidas.
nstart: si es un número, ¿cuántos conjuntos aleatorios se deben elegir?centers
algorithm: carácter - puede abreviarse. Tenga en cuenta que y son nombres alternativos para un algoritmo.“Lloyd”“Forgy”
object: un objeto R de clase , normalmente el resultado de .“kmeans”obob <- kmeans(..)
method: carácter - puede abreviarse. hace que devuelva centros de clúster (uno para cada punto de entrada) y hace que devuelva un vector de asignaciones de clase. “centers”fitted“classes”fitted
trace: número lógico o entero, actualmente solo utilizado en el método predeterminado (): si es positivo (o verdadero), se produce información de seguimiento sobre el progreso del algoritmo. Los valores más altos pueden producir más información de rastreo.“Hartigan-Wong”
Valor
kmeans devuelve un objeto de clase que tiene un método. Es una lista con al menos los siguientes componentes:“kmeans”printfitted
•clúster: Vector de enteros (de ) que indica el clúster al que se asigna cada punto.1:k
•centers: Una matriz de centros temáticos.
•totss: La suma total de cuadrados.
•interior: Vector de suma de cuadrados dentro del clúster, un componente por clúster.
•tot.withinss: Suma total de cuadrados dentro del clúster, es decir,sum(withinss)
•entress: La suma entre grupos de cuadrados, es decir,totss-tot.withinss
•size: El número de puntos de cada clúster.
•iter: El número de iteraciones (externas).
•integer: indicador de un posible problema de algoritmo , para expertos.

Ejercicio 4

Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA, disponible en: https://xsliulab.github.io/Workshop/week10/r-cluster-book.pdf, desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9

Carga de Datos

library(dplyr)
library(kableExtra)

# Cargamos el data set
data("USArrests")

# Lo guardamos con un nuevo nombre: df
DF <- USArrests
head(DF) %>%
  kable(caption = "Base de Datos: Arrestos por cada 100,000 residentes por asalto, asesinato y violación en cada uno de los 50 estados de EE. UU. en 1973",
        align = "c",
        digits = 2) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Base de Datos: Arrestos por cada 100,000 residentes por asalto, asesinato y violación en cada uno de los 50 estados de EE. UU. en 1973
Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7
# NOTA: Para remover registros con algun valor perdido, si se llevare a presentar, podemos hacer uso de:
DF<- na.omit(DF)

# Normalizamos la data
DF <- scale(DF)
head(DF) %>%
  kable(caption = "Base de Datos Normalizada " ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Base de Datos Normalizada
Murder Assault UrbanPop Rape
Alabama 1.242564 0.782839 -0.520907 -0.003416
Alaska 0.507862 1.106823 -1.211764 2.484203
Arizona 0.071633 1.478803 0.998980 1.042878
Arkansas 0.232349 0.230868 -1.073593 -0.184917
California 0.278268 1.262814 1.758923 2.067820
Colorado 0.025715 0.398859 0.860809 1.864967

Capítulo 4: K-means Clustering (Agrupación de K-medias)

4.1 Estimacion Optima del numero de conglomerados

La función R fviz_nbclust () [en el paquete factoextra] proporciona una solución conveniente para estimar el número óptimo de clústeres.

### Determinamos el numero de grupos o comnglomerados (k)
library(factoextra)

fviz_nbclust(DF, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2)

El gráfico anterior representa la varianza dentro de los grupos. Disminuye a medida que k aumenta, pero se puede ver una curva en k = 4. Esta curva indica que los grupos adicionales más allá del cuarto tienen poco valor. En la siguiente sección, clasificaremos las observaciones en 4 racimos

4.2 Ejecucion del Algoritmo K-medias

# Seleccionamos al azar K Centroides en la base de datos normalizada.Para obtener los mismos resultados cuantas veces se reproduzca tenemos que usar una semilla de numeros aleatorios para K = 4 y asignaciones aletarioas nstart = 25
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"
# Calculamos la media de cada variable por conglomerado utilizando los datos orginales
aggregate(USArrests, by = list(cluster = km.res$cluster), mean) %>%
  kable(caption = "Media de Cada Variable por Conglomerado" ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Media de Cada Variable por Conglomerado
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
# En la agrupación de k-medias, cada grupo está representado por su centro (es decir, centroide) que corresponde a la media de puntos asignados al grupo. Agregamos las puntuaciones asignados a los conglomerados a partir de los datos originales
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd) %>%
  kable(caption = "Puntuaciones" ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Puntuaciones
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 Accediendo a los elementos de km.res

# Número de conglomerados para cada una de las observaciones
km.res$cluste
##        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 o cantidad de registros que estan agrupados en cada clusters
km.res$size
## [1]  8 13 16 13
# Cluster means: Matriz de Medias de cada Variable por cluster o conglomerado
km.res$centers %>%
  kable(caption = "Matriz de Medias de cada Variable por conglomerado" ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Matriz de Medias de cada Variable por conglomerado
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
fviz_cluster(km.res,
  data = DF,
  palette = c("#556B2F","#FF3030","#FFB90F","#FF1493"),
  ellipse.type = "euclid",
  star.plot = TRUE,
  repel = TRUE,
  ggtheme = theme_minimal()
)

Capítulo 5: K-Medoides (Algoritmo K-medoides)

El método de agrupamiento de k-medoides más común es el algoritmo PAM (Partitioning Around Medoids, Kaufman & Rousseeuw, 1990).

5.1 Estimación del Número de Conglomerados

library(cluster)

### Estimamos el numero optimo de conclomerados
fviz_nbclust(DF, pam, method = "silhouette") +
  theme_classic()

A partir de la gráfica, el número sugerido de grupos es 2.

5.2 Ejecucion del Algoritmo PAM

El algoritmo PAM se basa en la búsqueda de k objetos representativos o medoides entre las observaciones del conjunto de datos.

library(cluster)
### Ejecutamos 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"
# Agregamos las clasificaciones de puntos (puntuaciones) a los datos originales

dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd) %>%
  kable(caption = "Puntuaciones" ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Puntuaciones
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
# Cluster medoids: New Mexico, Nebraska
pam.res$medoids %>%
  kable(caption = "Medoides" ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Medoides
Murder Assault UrbanPop Rape
New Mexico 0.829294 1.370809 0.308122 1.160320
Nebraska -0.800825 -0.825077 -0.244564 -0.505211
# Cluster numbers:  Numero de Conglomerado
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

5.3 Visualizacion de los Conglomerados PAM

fviz_cluster(
  pam.res,
  palette = c("#FF3030","#FF1493"),
  # color palette
  ellipse.type = "t",
  # Concentration ellipse
  repel = TRUE,
  # Avoid label overplotting (slow)
  ggtheme = theme_classic()
)

Capítulo 6: CLARA - Clustering Large Applications

Es una version del algoritmo K-medoides, con la diferencia es que CLARA utiliza muestras en vez del conjunto de datos en si (universo)

6.1 Generacion de la Data de manera Aleatoria

# Generamos un conjunto de datos aleatorio para que el resultado sea reproducible, utilizaremos la semilla 1234
set.seed(1234)
# Generamos 500 objetos, divididos  en 2 variables: X y Y.
CLARA_DF <- rbind(cbind(rnorm(200, 0, 8), rnorm(200, 0, 8)),
                  cbind(rnorm(300, 50, 8), rnorm(300, 50, 8)))
# Asignamos nombres a las columnas y a las filas
colnames(CLARA_DF) <- c("x", "y")
rownames(CLARA_DF) <- paste0("S", 1:nrow(CLARA_DF))
# Previewing the data
head(CLARA_DF, nrow = 10) %>%
  kable(caption = "Conjunto de datos aleatorios" ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Conjunto de datos aleatorios
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.2 Estimacion optima del numero de conglomerados (clusters)

Para ello, utilizamos el metodo de la silueta promedio, que se usó en el ejemplo del algoritmo de PAM

# Metodo de la silueta Promedio
fviz_nbclust(CLARA_DF, clara, method = "silhouette") + theme_classic()

A partir de la gráfica, la cantidad sugerida de conglomerados es 2.

6.3 Ejecucion del Algoritmo Clara

# Ejecutamos el metodo CLARA
clara.res <- clara(CLARA_DF, 2, samples = 50, pamLike = TRUE)
# Print components of clara.res
print(clara.res)
## Call:     clara(x = CLARA_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"
# Agregamos las puntuaciones a los datos originales
dd_CLARA <- cbind(CLARA_DF, cluster = clara.res$cluster)
head(dd_CLARA, n = 4) %>%
  kable(caption = "Puntuaciones" ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Puntuaciones
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
# Accediendo a los objetos de Clara.res

# Medoids
clara.res$medoids %>%
  kable(caption = "Medoides" ,
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Medoides
x y
S121 -1.531137 1.145057
S455 48.357304 50.233499
# The medoids are S121, S455
# Clustering
head(clara.res$clustering, 10)
##  S1  S2  S3  S4  S5  S6  S7  S8  S9 S10 
##   1   1   1   1   1   1   1   1   1   1

6.4 Visualizacion de los Clusters de CLARA

fviz_cluster(
  clara.res,
  palette = c("#556B2F","#FF3030"),
  # color palette
  ellipse.type = "t",
  # Concentration ellipse
  geom = "point",
  pointsize = 1,
  ggtheme = theme_classic()
)

Capítulo 7: Agglomerative Clustering (Agrupacion Aglomerativa)

Volvemos a usar para la ejemplificacion el data set USArrests

7.1 Matriz de distancia o disimilitud

Para decidir qué objetos / grupos deben combinarse o dividirse, necesitamos métodos para medir la similitud entre objetos.

# Obtenemos la dissimilarity matrix (matriz de disimilitud o de distancia)

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


as.matrix(res.dist)[1:8, 1:8] %>%
  kable(caption = "Matriz de Disimilitudes. Utilizando la Metrica (distancia) Euclidiana",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Matriz de Disimilitudes. Utilizando la Metrica (distancia) Euclidiana
Alabama Alaska Arizona Arkansas California Colorado Connecticut Delaware
Alabama 0.000000 2.703754 2.293520 1.289810 3.263110 2.651067 3.215297 2.019293
Alaska 2.703754 0.000000 2.700643 2.826039 3.012541 2.326519 4.739912 3.621363
Arizona 2.293520 2.700643 0.000000 2.717758 1.310484 1.365031 3.262858 1.909370
Arkansas 1.289810 2.826039 2.717758 0.000000 3.763641 2.831051 2.607639 1.800324
California 3.263110 3.012541 1.310484 3.763641 0.000000 1.287619 4.066390 3.073785
Colorado 2.651067 2.326519 1.365031 2.831051 1.287619 0.000000 3.327992 2.554746
Connecticut 3.215297 4.739912 3.262858 2.607639 4.066390 3.327992 0.000000 1.756847
Delaware 2.019293 3.621363 1.909370 1.800324 3.073785 2.554746 1.756847 0.000000
# Funcion de Vinculacion.
# Se toma la informacion de dist()  y agrupa los objetos segun su similitud. Es un proceso iterativo hasta que todos los registros esten vinculados a un arbol jerarquico
res.hc <- hclust(d = res.dist, method = "ward.D2")

### Visualizamos el Dendograma o arbol jerarquico

fviz_dend(res.hc, cex = 0.5)

# Calculamos las Distancias Cofeneticas. cophentic distance
res.coph <- cophenetic(res.hc)

# Correlation between cophenetic distance and
# the original distance
cor(res.dist, res.coph)
## [1] 0.6975266

Volvemos a ejecutar la funcion de vinculacion, pero vamos a cambiar el metodo a “average.” Luego volvemos a calcular las distancias cofeneticas y la correlacion entre estas con las distancias orginales

# Volvemos a calcular la vinculacion, pero con el metodo de vinculacion promedio
res.hc2 <- hclust(res.dist, method = "average")
# Calculamos la correlacion
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

7.2 Cortando el Dendograma en diferentes grupos

# Cortamos el dendograma (arbol jerarquico ) en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Para ver el Number of members in each cluster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Para obtener los nombres de los miembros del cluster 1
rownames(df)[grp == 1]
## NULL
# Para obtener los nombres de los miembros del cluster 2
rownames(df)[grp == 2]
## NULL
# Para obtener los nombres de los miembros del cluster 3
rownames(df)[grp == 3]
## NULL

7.3 Visualizacion del Dendograma recortado

# Cut in 4 groups and color by groups
fviz_dend(
  res.hc,
  k = 4,
  # Cut in four groups
  cex = 0.5,
  # label size
  k_colors = c("#556B2F","#FF3030","#FFB90F","#FF1493"),
  color_labels_by_k = TRUE,
  # color labels by groups
  rect = TRUE # Add rectangle around groups
)

7.4 Visualizacion de las Agrupaciones Aglomerativas en un grafico de dispercion

fviz_cluster(
  list(data = DF, cluster = grp),
  palette = c("#556B2F","#FF3030","#FFB90F","#FF1493"),
  ellipse.type = "convex",
  # Concentration ellipse
  repel = TRUE,
  # Avoid label overplotting (slow)
  show.clust.cent = FALSE,
  ggtheme = theme_minimal()
)

7.5 Agglomerative Clustering (Agrupacion Aglomerativa) utilizando la libreria Cluster

El agrupamiento aglomerativo es el tipo más común de agrupamiento jerárquico que se utiliza para agrupar objetos en grupos en función de su similitud. También se conoce como AGNES (anidamiento aglomerativo). La agrupación aglomerativa funciona de forma “de abajo hacia arriba.”

# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(
  x = USArrests,
  # data matrix
  stand = TRUE,
  # Standardize the data
  metric = "euclidean",
  # metric for distance matrix
  method = "ward" # Linkage method
)

# Visualizar la salida

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

7.6 Divisive Analysis Clustering (Agrupación por análisis divisivo) utilizando la libreria Cluster

Lo inverso de la agrupación aglomerativa es la agrupación divisiva, que también se conoce como DIANA (Análisis de división) y funciona de manera “de arriba hacia abajo.”

# DIvisive ANAlysis Clustering
res.diana <- diana(x = USArrests, # data matrix
                   stand = TRUE, # standardize the data
                   metric = "euclidean" # metric for distance matrix
                   )
                   
### Para visualizar la salida
fviz_dend(res.diana, cex = 0.6, k = 4)

Capítulo 8: Comparación de Dendogramas

8.1 Preparamos la data

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

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

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

library(dendextend)
# Calculamos la matriz de disimilitud o de distancia
res.dist <- dist(DF, method = "euclidean")
# Ejecuamos los agrupamientos jerarquicos
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Creamos los dos dendogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Creamos una lista que contenga los dos dendogramas
dend_list <- dendlist(dend1, dend2)

# Comparando Visualmente los dos dendogramas
tanglegram(dend1, dend2)

# Perzonalizado se veria asi:
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))
)

8.2 Matriz de Correlacion entre una lista de dendogramas

# Matriz de Correlacion Cofenetica
cor.dendlist(dend_list, method = "cophenetic") 
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Matriz de Correlacion de Baker
cor.dendlist(dend_list, method = "baker") 
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
#Para tener la correlacion entre solo dos dendogramas, se puede asi:

# Cophenetic correlation coefficient
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Baker correlation coefficient
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
# Creamos multiples Dendogramas encadenando. Cada dendograma utiliza un metodo distinto
dend1 <- DF %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- DF %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- DF %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- DF %>% dist %>% hclust("centroid") %>% as.dendrogram

# Elaboramos la Matriz de Correlaciones
dend_list <- dendlist(
  "Complete" = dend1,
  "Single" = dend2,
  "Average" = dend3,
  "Centroid" = dend4
)
cors <- cor.dendlist(dend_list)
# Print correlattion matrix
round(cors, 2) %>%
  kable(caption = "Matriz de Correlacion de Multiples Dendogramas",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "sans-serif",
                  lightable_options = c("hover", "striped")) %>%
  row_spec(0,
           bold = T,
           color = "#8B4500",
           background = "#00FF00")
Matriz de Correlacion de Multiples Dendogramas
Complete Single Average Centroid
Complete 1.00 0.46 0.45 0.30
Single 0.46 1.00 0.23 0.17
Average 0.45 0.23 1.00 0.31
Centroid 0.30 0.17 0.31 1.00
# Visualize the correlation matrix using corrplot package
library(corrplot)
corrplot(cors, "pie", "lower")

Capítulo 9: Visualizacion de Dendogramas

9.1 Preparamos la Data

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

9.2 Vizualizando los dendogramas

fviz_dend(hc, cex = 0.5)

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

# Para poner en una posicion horizontal el dendograma

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

fviz_dend(hc, k = 4,
          cex = 0.5,
          k_colors = c("#556B2F","#FF3030","#FFB90F","#FF1493"),
          color_labels_by_k = TRUE,
          rect = TRUE,
          rect_fill = TRUE)

### Para cambiar el tema del arbol, usamos ggtheme
fviz_dend(hc, k = 4,
          cex = 0.5,
          k_colors = c("#556B2F","#FF3030","#FFB90F","#FF1493"),
          color_labels_by_k = TRUE,
          ggtheme = theme_gray()
          )

### Poniendolo horizontal

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

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

# Para trazar un árbol de tipo filogénico, 
# use type = "phylogenic" y repel = TRUE (para evitar la superposición de etiquetas).

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

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

### 9.3 Dendograma para grandes conjuntos de datos

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

# Trazado de un subarbol
# Cortar el dendrograma y visualizar la versión truncada:
# Create a plot of the whole dendrogram, and extract the dendrogram data
dend_plot <- fviz_dend(hc,
                       k = 4,
                       # Cut in four groups
                       cex = 0.5,
                       # label size
                       k_colors = "jco")
dend_data <- attr(dend_plot, "dendrogram") # Extract dendrogram data
# Cut the dendrogram at height h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualize the truncated version containing
# two branches
fviz_dend(dend_cuts$upper)

# Trazar subárboles dendrogramas:
# Plot the whole dendrogram
print(dend_plot)

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

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

# Plot subtree 2, en forma circular 
fviz_dend(dend_cuts$lower[[2]], type = "circular")

# Guardando en pdf un dendograma sin perder resolucion 
pdf("dendrogram.pdf", width=30, height=15) # Open a PDF
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" ) # Do plotting
print(p)
dev.off()
## png 
##   2

9.4 Manipulando un dendograma utilizando la libreria dendextend

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

library(dendextend)
# Usando la libreria dendextend

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

9.5 Personalizando los dendogramas con la libreria dendextend

library(dendextend)

mycols <- c("#556B2F","#FF3030","#FFB90F","#FF1493")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>%
set("branches_k_color", mycols, k = 4) %>% 
set("labels_colors", mycols, k = 4) %>% 
set("labels_cex", 0.5) 

fviz_dend(dend)