Portada

Universidad de El Salvador

Facultad de Ciencias Económicas

Escuela de Economía

Métodos para el Análisis Económico

Prof. Carlos Ademir Pérez

Integrantes:

NOMBRES CARNET
Kevin Adonay Lemus Pérez LP16027
Luis Daniel Quijano Vasquez QV13001
Erick Rodolfo Rojas Flores RF21001
Jeimmy Yamileth Salazar Chávez SC19009

GT-02

Ciclo II

Ciudad Universitaria, 07 de enero de 2024.

Punto 1

Analisis de Conglomerados (Cluster)

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

El Analisis de conglomerados al que tambien se le denomina comunmente análisis cluster, es una tecnica diseñada para clasificar distintas observaciones en grupos, de tal forma que:

  • Cada grupo (conglomerado o cluster) sea homogeneo respecto a las variables utilizadas para caracterizarlo, es decir que cada observación contenida en el sea parecida a todas las que esten incluidas en ese grupo.
  • Que los grupos sean lo mas distinto posible unos de otros respecto a las variables consideradas. (Kassambara, 2017)

Punto 2

Elabore un cuadro comparativo, que incluya los siguientes elementos:

library(kableExtra)

created_var <- data.frame(
 `Analisis_de_cluster` = c ('Jerarquico: Es una alternativa y enfoque nativo para la creación de particiones en clusters para agrupar objetos basados en su similitud y no requiere una pre-especificación del número de clusters que se producirán.','No jerarquico: Se categorizan los elementos según un número de clúster dado y se necesita que el número de particiones esté fijado a priori.'),
`Tecnicas disponibles` = c('Aglomerativas,Agrupación en clústeres dividida',
'k-medias,K-medoides,CLARA'),
Ventajas = c ('El número óptimo de clusters se puede obtener por el mismo modelo, a través de su muy útil dendrograma. No es necesario especificar el número de clústeres necesarios para el algoritmo y es fácil de implementar.','Asume un conocimiento previo de los datos y requiere que el analista elija el número apropiado de clúster (k) por adelantado, los resultados finales obtenidos son sensibles a la selección aleatoria inicial del clúster.'),
Desventajas = c('No es conveniente para grandes conjuntos de datos, y un algoritmo nunca puede deshacer ninguna de los pasos anteriores, Si por ejemplo, el algoritmo agrupa 2 puntos y más tarde vemos que la conexión no era buena el programa no puede deshacer ese paso.','Para cada ejecución diferente del algoritmo en el mismo conjunto de datos, puede elegir un conjunto diferente de centros iniciales, y esto puede conducir a diferentes resultados de agrupamiento en diferentes ejecuciones del algoritmo, y es sensible a los valores atípicos también al cambiar el orden de los datos se obtiene una solución diferente.')
)

kbl(created_var, caption = "Resumen del Análisis de Clusters") %>%
  kable_paper(full_width = F) %>%
  kable_styling(latex_options = c("striped", "hold_position"), font_size = 12) %>%
  column_spec(1, bold = TRUE, border_right = TRUE, background = "lightblue") %>% 
  column_spec(2, bold = TRUE, border_right = TRUE, background = "lightgreen") %>%
  column_spec(3, bold = TRUE, border_right = TRUE, background = "lightblue") %>%
  column_spec(4, bold = TRUE, border_right = TRUE, background = "lightgreen") %>%
  add_footnote(
    label = "Fuente: Elaboración propia en base al libro Multivariate Analysis I, Alboukadel Kassambara(2017), Análisis Multivariante Joaquin aldas(2017).",
    notation = "symbol"
  )
Resumen del Análisis de Clusters
Analisis_de_cluster Tecnicas.disponibles Ventajas Desventajas
Jerarquico: Es una alternativa y enfoque nativo para la creación de particiones en clusters para agrupar objetos basados en su similitud y no requiere una pre-especificación del número de clusters que se producirán. Aglomerativas,Agrupación en clústeres dividida El número óptimo de clusters se puede obtener por el mismo modelo, a través de su muy útil dendrograma. No es necesario especificar el número de clústeres necesarios para el algoritmo y es fácil de implementar. No es conveniente para grandes conjuntos de datos, y un algoritmo nunca puede deshacer ninguna de los pasos anteriores, Si por ejemplo, el algoritmo agrupa 2 puntos y más tarde vemos que la conexión no era buena el programa no puede deshacer ese paso.
No jerarquico: Se categorizan los elementos según un número de clúster dado y se necesita que el número de particiones esté fijado a priori. k-medias,K-medoides,CLARA Asume un conocimiento previo de los datos y requiere que el analista elija el número apropiado de clúster (k) por adelantado, los resultados finales obtenidos son sensibles a la selección aleatoria inicial del clúster. Para cada ejecución diferente del algoritmo en el mismo conjunto de datos, puede elegir un conjunto diferente de centros iniciales, y esto puede conducir a diferentes resultados de agrupamiento en diferentes ejecuciones del algoritmo, y es sensible a los valores atípicos también al cambiar el orden de los datos se obtiene una solución diferente.
* Fuente: Elaboración propia en base al libro Multivariate Analysis I, Alboukadel Kassambara(2017), Análisis Multivariante Joaquin aldas(2017).

Punto 3

Describa las tecnicas disponibles para realizar el analisis de cluster, tanto jerarquicas como no jerarquicas, presentadas en el cuadro anterior, incluya una explicación de la libreria y sintaxis para implementarla en R.

Técnicas Jerarquicas

1. Aglomerativa

Agrupación aglomerativa en la que, cada observación se considera inicialmente como un racimo propio (hoja). Luego, los clusteres más similares se fusionan sucesivamente hasta que haya un solo gran cluster (raíz). El agrupamiento aglomerativo es el tipo mas común de agrupamiento jerarquico. Se usa para agrupar objetos en grupos en función de su similitud. Tambien se conoce como AGNES(Anidamiento aglomerativo). El algoritmo comienza tratando cada objeto como un grupo de toneladas. Los pares de clusteres se fusionan sucesivamente hasta que todos los clusteres se hayan fusionado en un gran cluster que contiene todos los objetos. El resultado es un árbol en representación de los objetos se denominada dendrograma (Kassambara, 2017).

Librerias utilizadas

FactoExtra

Implementación en R

Los dendrogramas corresponden a la representación gráfica del árbol jerárquico generado por la función hclust (). El dendrograma se puede producir en R usando el gráfico de función base (res.hc), donde res.hc es la salida de hclust (). Se usa la función fviz_dend () [en el paquete factoextra R] para producir el dendrograma.

Cluster: El clúster de paquetes R facilita la realización de análisis de clústeres en R. Proporciona la función agnes y diana para calcular la agrupación aglomerativa y divisiva, respectivamente. Estas funciones realizan todos los pasos necesarios . No se necesita ejecutar las funciones scale, dist y hclust por separado.

2.La agrupación en clusteres dividida

Es una operacion inversa de la agrupación aglomerativa, comienza con la raíz, en donde todos los objetos estan incluidos en un grupo. Los conglomerados se dividen sucesivamente hasta que todas las observaciones se encuentran en su propio conglomerado (Kassambara, 2017).

Librerias utilizadas

Dendextend El paquete dendextend proporciona varias funciones para comparar dendrogramas. Aquí,nos centraremos en dos funciones:

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

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

Para comparar visualmente dos dendrogramas, se usa la función tanglegram [ dendextendpaquete], que traza los dos dendrogramas, uno al lado del otro, con sus etiquetas conectadas por líneas. La calidad de la alineación de los dos árboles se puede medir utilizando la función enredo. El entrelazamiento es una medida entre 1 (entrelazamiento total) y 0 (sin entrelazamiento). Un coeficiente de entrelazamiento más bajo corresponde a una buena alineación.

Técnicas NO Jerarquicas

1. K-medias

Agrupación de K-medias en la que, cada agrupación esta representada por el centro o por medio de los puntos de datos pertenecientes al cluster. El metodo es sensible a puntos de datos anomalos y valores atipicos. Es el metodo no supervisado mas utilizado, algoritmo de aprendizaje automatico para particionar un conjunto de datos dado en un conjunto de k grupos (es decir, k conglomerados), donde k representa el número de grupos predefinidos por el analista (Kassambara, 2017).

Eso clasifica objetos en varios grupos (es decir, clusteres), de modo que los objetos dentro del mismo cluster son tan similares como sea posible (es decir, alta similitud intraclase), mientras que los objetos de diferentes grupos son los mas diferentes posible (es decir, baja similitud entre clases). En el agrupamiento de k-medias, cada grupo esta representado por su centro (es decir, centroide) que corresponde a la media de puntos asignados al cluster.

Librerias utilizadas

FactoExtra La función R fviz_nbclust [en el paquete factoextra ] proporciona una solución conveniente para estimar el número óptimo de conglomerados.

Al calcular la agrupación en clústeres de k-medias utilizando diferentes valores de conglomerados, en el caso de wss (dentro de la suma del cuadrado) se dibuja de acuerdo al número de clústeres. La ubicación de una curva (rodilla) en el dibujo es generalmente considerado como un indicador del número apropiado de conglomerados.

La función kmeans devuelve una lista de componentes, que incluyen:

• cluster : un vector de números enteros (de 1: k) que indica el cluster al que cada uno se asigna el punto.

• centros : una matriz de centros de conglomerados (medias de conglomerados).

• totss : La suma total de cuadrados (TSS), es decir, q ( x i ≠ ¯ x ) 2 . TSS mide el total de varianza en los datos.

• withinss : Vector de suma de cuadrados dentro del conglomerado, un componente por conglomerado.

• tot.withinss : suma total de cuadrados dentro del conglomerado, es decir, una suma.

• betweenss : La suma entre-cluster de cuadrados, es decir totss ≠ tot.withinss.

• tamaño : el número de observaciones en cada grupo.

2. K-medoides

Agrupación de K-medoides o PAM ( Partitioning Around Medoids) en el que, cada grupo esta representado por uno de los objetos en el racimo. PAM es menos sensible a valores atipicos en comparación con k-medias. El algoritmo k-medoids es un enfoque de agrupamiento relacionado con k-medias para particionar un conjunto de datos en k grupos o clusteres. En agrupaciones de k-medoides, cada grupo esta representado por uno de los puntos de datos del grupo. Estos puntos son medoides de racimo nombrados. El termino medoide se refiere a un objeto dentro de un grupo para el cual la disimilitud promedio entre el y todos los demas, los miembros del cluster son minimos corresponde al punto mas centrico del grupo. Estos objetos (uno por grupo) pueden ser considerado como un ejemplo representativo de los miembros de ese grupo que puede ser útil en algunas situaciones (Kassambara, 2017).

Librerias utilizadas

FactoExtra

Cluster

Paquetes y funciones de R requeridos

La función pam [ paquete de clúster ] y pamk [ paquete fpc ] se pueden utilizar para calcular PAM. La función pamk no requiere que el usuario decida el número de clústeres K.

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

• x : los valores posibles incluyen: - Matriz de datos numéricos o marco de datos numéricos: cada fila corresponde a unobservación, y cada columna corresponde a una variable. - Matriz de disimilitud: en este caso x es típicamente la salida de daisy y odist. • k : el número de clústeres • métrica : la métrica de distancia que se utilizará. Las opciones disponibles son “euclidiana” y “Manhattan”. • soporte : valor lógico; si es verdadero, las variables (columnas) en x están estandarizadas antes calculando las diferencias. Se ignora cuando x es una matriz de disimilitudes.

El algoritmo K-medoids, PAM, es una alternativa robusta a k-means para dividir un conjunto de datos en grupos de observación. En el método k-medoides, cada grupo está representado por un objeto seleccionado dentro del grupo.

Los objetos seleccionados se denominan medoides y corresponden a los más centralizados, puntos ubicados dentro del clúster.El algoritmo PAM requiere que el usuario conozca los datos e indique la aprobación a priori n número de conglomerados que se producirán. Esto se puede estimar usando la función fviz_nbclust [en el paquete factoextra R].

La función R pam () [ paquete de clúster ] se puede utilizar para calcular el algoritmo PAM, el formato simplificado es pam (x, k), donde “x” son los datos y k es el número de agrupaciones que se generará. Después, realizando la agrupación en clústeres PAM, la función R fviz_cluster [paquete factoextra]se puede utilizar para visualizar los resultados. El formato es fviz_cluster (pam.res), donde pam.res son los resultados de PAM.

3. CLARA: Algoritmo CLARA ( Clustering Large Applications), que es una extensión de PAM adaptado para grandes conjuntos de datos. CLARA considera una pequeña muestra de los datos con tamaño fijo (tamaño de muestra) y aplica el algoritmo PAM para generar un conjunto optimo de medoides para la muestra. La calidad de los medoides resultantes se mide por la disimilitud promedio entre cada objeto en todo el conjunto de datos y el medoide de su cluster definido como la función de costo. CLARA repite los procesos de muestreo y agrupamiento un número preestablecido de veces para minimizar el sesgo de muestreo. Los resultados finales de la agrupación corresponden al conjunto de medoides con el minimo costo. El algoritmo CLARA se resume en elSiguiente sección (Kassambara, 2017).

Librerias utilizadas

Cluster

FactoExtra

Paquetes requeridos en R

La salida de la función clara () incluye los siguientes componentes:

• medoides : objetos que representan grupos.

• agrupación : un vector que contiene el número de agrupación de cada objeto.

• muestra : etiquetas o números de caso de las observaciones en la mejor muestra, es decir,la muestra utilizada por el algoritmo clara para la partición final.

El algoritmo CLARA (Clustering Large Applications) es una extensión del PAM (Partitioning Around Medoids) método de agrupamiento para grandes conjuntos de datos. Como casi todos los algoritmos de particionamiento, requiere que el usuario especifique elnúmero de racimos que se producirán. Esto se puede estimar usando la función fviz_nbclust [en el paquete factoextra R].La función R clara [paquete de clúster] se puede utilizar para calcular el algoritmo CLARA. El formato simplificado es clara (x, k, pamLike = TRUE), donde “x” son los datos y k es el número de clústeres que se generarán. Luego, calculando CLARA, la función R fviz_cluster [factoextra package] puede ser utilizado para visualizar los resultados. El formato es fviz_cluster (clara.res), donde clara.res da los resultados de CLARA.

Punto 4

Del libro indicado, desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.

Capitulo 4: Agrupación de K-medias

Calcular la agrupación de k-medias en R

data("USArrests") # Cargando el conjunto de datos
df4 <-scale(USArrests)# Escalando los datos
# ver las primeras tres filas de datos
head(df,n=3)
##                                            
## 1 function (x, df1, df2, ncp, log = FALSE) 
## 2 {                                        
## 3     if (missing(ncp))

Estimación del número optimo de conglomerados

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

Cálculo de la agrupación en clústeres de k-medias

# Calcule k-means con k = 4
set.seed(123)
km.res <-kmeans(df4,4,nstart =25)
# Print the results
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"

La salida muestra las medias o centros del conglomerado siendo una matriz cuyas filas son el número del conglomerado (1 a 4) y las columnas son variables el vector de agrupación es un vector de números enteros (de 1: k) que indica la agrupación que se asigna a cada punto.

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

dd4 <-cbind(USArrests,cluster =km.res$cluster)
head(dd4)
##            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

Acceso a los resultados de la función kmeans

# Número de Cluster 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 de Cluster
km.res$size
## [1]  8 13 16 13
# Cluster means
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

Visualización de grupos de k-medias

fviz_cluster(km.res,data =df4,
palette =c("#2E9FDF","#00AFBB","#E7B800","#FC4E07"),
ellipse.type ="euclid",# Eclipse de concentración
star.plot =TRUE,# Agragar segmentos a los elementos
repel =TRUE,# Evitar las superposiciones de elementos
ggtheme =theme_minimal()
)

Fuente: (Kassambara, 2017)

Capitulo 5: K-medoides

Calcular PAN en R
data("USArrests") # Cargar el conjunto de datos
df5 <-scale(USArrests)
head(df5,n=3) # Ver las primeras 3 filas de datos
##             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

Estimación del número optimo de conglomerados

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

A partir de la grafica, la cantidad sugerida de grupos es 2.

Calculo de la agrupación en clústeres PAM

El siguiente codigo R calcula el algoritmo PAM con k = 2:

pam.res <-pam(df5,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"

La salida muestra los medoides del clúster que es una matriz cuyas filas son los medoides y las columnas son variables tambien muestra el vector de agrupación un vector de números enteros (de 1: k) que indica la agrupación que se asigna a cada punto.

Data original

dd5 <-cbind(USArrests,cluster =pam.res$cluster)
head(dd5,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

Acceder a los resultados de la función pam

# Cluster medoids: Nuevo Mexico, 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 Cluster 
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

Visualización de clusters PAN

library(factoextra)
fviz_cluster(pam.res,
palette =c("#00AFBB","#FC4E07"),# Paleta de Colores
ellipse.type ="t",# Eclipse de Concentración
repel =TRUE,# Evitar la superposición de etiquetas
ggtheme =theme_classic())

Fuente: (Kassambara, 2017)

Capitulo 6: CLARA - Agrupación grande

Formato y preparación de los datos

set.seed(1234)
# Genera 500 objetos, divididos en 2 clusters.
df6 <-rbind(cbind(rnorm(200,0,8),rnorm(200,0,8)),
cbind(rnorm(300,50,8),rnorm(300,50,8)))
# Especificar nombres de filas y columnas
colnames(df6) <-c("x","y")
rownames(df6) <-paste0("S",1:nrow(df6))
# Previewing the data
head(df6,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

Estimación del número optimo de conglomerados

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

Ejecución CLARA

El siguiente codigo R calcula el algoritmo PAM con k = 2
# Calculo de CLARA
clara.res <-clara(df6,2,samples =50,pamLike =TRUE)
# Mostrar componentes de clara.res
print(clara.res)
## Call:     clara(x = df6, 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"

clasificaciones de puntos a los datos originales

dd6 <-cbind(df6,cluster = clara.res$cluster)
head(dd6,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

Acceder a los resultados devueltos por clara () de la siguiente manera

# Medoids
clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
# 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

Los medoids son S121, S455.

Visualización de clústeres CLARA

library(factoextra)
fviz_cluster(clara.res,
palette =c("#00AFBB","#FC4E07"),# Paleta de colores
ellipse.type ="t",# Eclipse de Concentracion
geom ="point",pointsize =1,
ggtheme =theme_classic()
)

Fuente: (Kassambara, 2017)

Capitulo 7: Agrupación aglomerativa

PASOS HACIA LA AGRUPACIóN JERARQUICA AGLOMERATIVA

data("USArrests") # Cargar los datos
df7 <-scale(USArrests) #Estandarizar los datos
head(df7,nrow = 6) # Mostrar las primeras 6 filas
##                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

Medidas de similitud

# Calcule la matriz de disimilitud
# df = resultados estandarizados
res.dist <-dist(df7,method ="euclidean")
as.matrix(res.dist)[1:6,1:6]
##             Alabama   Alaska  Arizona Arkansas California Colorado
## Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
## Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
## Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
## Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
## Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000
res.hc <-hclust(d=res.dist,method ="ward.D2") #Vinculación

Dendograma

# cex: label size
library("factoextra")
fviz_dend(res.hc,cex =0.5)

En el dendrograma que se muestra, cada hoja corresponde a un objeto, los objetos que son similares entre si. se combinan en ramas, y estan fusionados a una altura mayor. La altura de la fusión, proporcionada en el eje vertical, indica la (dis) similitud / distancia entre dos objetos / grupos. Cuanto mayor sea la altura de la fusión, menos similar sera los objetos. Esta altura se conoce como la distancia cofenetica entre los dos objetos.

Verificar el árbol del clúster

La función de base R cophenetic () se puede utilizar para calcular distancias cofeneticas para agrupaciones jerarquicas.

# Calcular la distancia cophentic
res.coph <-cophenetic(res.hc)
# Correlacion entre distancia cofonetica y la distancia original
cor(res.dist, res.coph)
## [1] 0.6975266

Función hclust usando el método de vinculación promedio y cophenetic para evaluar la solución de agrupamiento.

res.hc2 <-hclust(res.dist,method ="average")
cor(res.dist,cophenetic(res.hc2))
## [1] 0.7180382

El coeficiente de correlación muestra que el uso de un metodo de vinculación diferente crea un árbol que representa las distancias originales de mejor manera.

Cortar el dendrograma en diferentes grupos

# Cortar el arbol 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 cluster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Obtenga los nombres de los miembros del cluster 1
rownames(df7)[grp ==1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cortar en 4 grupos y coloriar por grupos
fviz_dend(res.hc,k=4,# Cortar en 4 grupo
k_colors =c("#2E9FDF","#00AFBB","#E7B800","#FC4E07"),
color_labels_by_k =TRUE,# color labels by groups
rect =TRUE# Add rectangle around groups
)

Diagrama de dispersion

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

Paquete cluster R

library("cluster")
# Agrupación gerarquica
res.agnes <-agnes(x=USArrests,# Matriz de datos
stand =TRUE,# Estandarizar los datos
metric ="euclidean",# Metrica para matriz de distancia
method ="ward"# Metodo de vinculacion
)
# Agrupacion de analisis
res.diana <-diana(x=USArrests,# Matriz de datos
stand =TRUE,# Estandarizar los datos
metric ="euclidean"# Metrica para matriz de distancia
)
fviz_dend(res.agnes,cex =0.6,k=4)

Fuente: (Kassambara, 2017)

Capitulo 8: Comparación de dendrogramas

library(dendextend)
# Calcular la matriz de distancias
res.dist <-dist(df7,method ="euclidean")
# Calculo de dos agrupaciones jerarquicas
hc1 <-hclust(res.dist,method ="average")
hc2 <-hclust(res.dist,method ="ward.D2")
# Creación de dos dendogramas
dend1 <-as.dendrogram(hc1)
dend2 <-as.dendrogram(hc2)
# Creación de una lista para contener dendogramas
dend_list <-dendlist(dend1, dend2)
tanglegram(dend1, dend2)

Matriz de correlación entre una lista de dendrogramas

# Matriz de correlación Cofenetica
cor.dendlist(dend_list,method ="cophenetic")
##          [,1]     [,2]
## [1,] 1.000000 0.843143
## [2,] 0.843143 1.000000
# Matriz de correlación Baker 
cor.dendlist(dend_list,method ="baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.8400675
## [2,] 0.8400675 1.0000000
# Coeficiente de correlacion cofenetica
cor_cophenetic(dend1, dend2)
## [1] 0.843143
# Coeficiente de correlacion Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.8400675

Dendrogramas encadenados

# creación de multiples dendrogramas encadenados
dend1 <-df7 %>%dist %>%hclust("complete")%>%as.dendrogram
dend2 <-df7 %>%dist %>%hclust("single")%>%as.dendrogram
dend3 <-df7 %>%dist %>%hclust("average")%>%as.dendrogram
dend4 <-df7 %>%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)
# Presentar la matriz de correlación
round(cors,2)
##          Complete Single Average Centroid
## Complete     1.00   0.50    0.86     0.49
## Single       0.50   1.00    0.58     0.71
## Average      0.86   0.58    1.00     0.61
## Centroid     0.49   0.71    0.61     1.00
# Visualización de la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors,"pie","lower")

Fuente: (Kassambara, 2017)

Capitulo 9: Visualización de dendrogramas

Ejemplo 6

library(cluster)
data(USArrests)
dd <-dist(scale(USArrests),method ="euclidean")
hc <-hclust(dd,method ="ward.D2")

Caso de dendrograma con grandes conjuntos de datos

fviz_dend(hc,k=4, # Cortar en 4 grupos
cex =0.5, # label size
k_colors =c("#2E9FDF","#00AFBB","#E7B800","#FC4E07"),
color_labels_by_k =TRUE, # color labels by groups
ggtheme =theme_gray() # Change theme
)

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

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

Trazado de un sub-arbol de dendrogramas

# Creación de una grafica de todo el dendrograma y extraer los datos 
dend_plot <-fviz_dend(hc,k=4,# Cortar en 4 grupos
cex =0.5,# Tamaño de etiqueta
k_colors ="jco"
)
dend_data <-attr(dend_plot,"dendrogram")# Extraer los datos del dendrograma
# Cortar el dendrograma
dend_cuts <-cut(dend_data,h=10)
fviz_dend(dend_cuts$upper)

print(dend_plot)

Caso de dendrograma con grandes conjuntos de datos

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

# 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")

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

Punto 5

Presente un ejemplo de aplicación de Análisis de Cluster

Ejemplo Kaggle (K-medoides)

Calcular PAN en R

wine <- read.csv("C:/Users/yamis/Desktop/MAE/wine-clustering.csv") # Cargar el conjunto de datos
dfw <-scale(wine)
head(dfw,n=3) # Ver las primeras 3 filas de datos
##        Alcohol  Malic_Acid        Ash Ash_Alcanity  Magnesium Total_Phenols
## [1,] 1.5143408 -0.56066822  0.2313998   -1.1663032 1.90852151     0.8067217
## [2,] 0.2455968 -0.49800856 -0.8256672   -2.4838405 0.01809398     0.5670481
## [3,] 0.1963252  0.02117152  1.1062139   -0.2679823 0.08810981     0.8067217
##      Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity       Hue
## [1,]  1.0319081           -0.6577078       1.2214385       0.2510088 0.3611585
## [2,]  0.7315653           -0.8184106      -0.5431887      -0.2924962 0.4049085
## [3,]  1.2121137           -0.4970050       2.1299594       0.2682629 0.3174085
##          OD280   Proline
## [1,] 1.8427215 1.0101594
## [2,] 1.1103172 0.9625263
## [3,] 0.7863692 1.3912237

Estimación del número optimo de conglomerados

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

A partir de la gráfica, el número sugerido de conglomerados es 3.

Calculo de la agrupación en clústeres PAM

El siguiente codigo R calcula el algoritmo PAM con k = 2:

pam.res <-pam(dfw,2)
print(pam.res)
## Medoids:
##       ID     Alcohol Malic_Acid        Ash Ash_Alcanity  Magnesium
## [1,]  36  0.59049809 -0.4711544  0.1584986    0.3009543 0.01809398
## [2,] 164 -0.05003283  0.9968720 -0.0602049   -0.2979263 0.43818899
##      Total_Phenols Flavanoids Nonflavanoid_Phenols Proanthocyanins
## [1,]     0.6469393  0.9518167           -0.8184106       0.4701615
## [2,]    -1.4462105 -1.3307885            0.3065090      -1.1372216
##      Color_Intensity        Hue     OD280    Proline
## [1,]      0.01807806  0.3611585  1.208910  0.5497067
## [2,]      0.09572164 -1.2138406 -1.213658 -0.2282996
## Clustering vector:
##   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 2 1 1 1 2 1 2 1 1 1
##  [75] 1 2 1 2 1 1 1 1 1 2 1 1 1 1 2 1 2 2 2 1 1 1 2 1 1 1 1 2 1 1 1 2 1 2 1 1 1
## [112] 1 2 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [149] 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## Objective function:
##    build     swap 
## 3.242228 3.152913 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

La salida muestra los medoides del clúster: es una matriz cuyas filas son los medoides y las columnas son variables tambien muestra el vector de agrupación un vector de números enteros (de 1: k) que indica la agrupación que se asigna a cada punto.

Data original

ddw <-cbind(wine,cluster =pam.res$cluster)
head(ddw,n=3)
##   Alcohol Malic_Acid  Ash Ash_Alcanity Magnesium Total_Phenols Flavanoids
## 1   14.23       1.71 2.43         15.6       127          2.80       3.06
## 2   13.20       1.78 2.14         11.2       100          2.65       2.76
## 3   13.16       2.36 2.67         18.6       101          2.80       3.24
##   Nonflavanoid_Phenols Proanthocyanins Color_Intensity  Hue OD280 Proline
## 1                 0.28            2.29            5.64 1.04  3.92    1065
## 2                 0.26            1.28            4.38 1.05  3.40    1050
## 3                 0.30            2.81            5.68 1.03  3.17    1185
##   cluster
## 1       1
## 2       1
## 3       1

Acceder a los resultados de la función pam

# Cluster medoids: 
pam.res$medoids
##          Alcohol Malic_Acid        Ash Ash_Alcanity  Magnesium Total_Phenols
## [1,]  0.59049809 -0.4711544  0.1584986    0.3009543 0.01809398     0.6469393
## [2,] -0.05003283  0.9968720 -0.0602049   -0.2979263 0.43818899    -1.4462105
##      Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity        Hue
## [1,]  0.9518167           -0.8184106       0.4701615      0.01807806  0.3611585
## [2,] -1.3307885            0.3065090      -1.1372216      0.09572164 -1.2138406
##          OD280    Proline
## [1,]  1.208910  0.5497067
## [2,] -1.213658 -0.2282996
# Números de Cluster 
head(pam.res$clustering)
## [1] 1 1 1 1 1 1

Visualización de clusters PAN

library(factoextra)
fviz_cluster(pam.res,
palette =c("#00AFBB","#FC4E07"),# Paleta de Colores
ellipse.type ="t",# Eclipse de Concentración
repel =TRUE,# Evitar la superposición de etiquetas
ggtheme =theme_classic()) 

Fuente: (Harry Wang, 2020)

Refencias

Harry Wang. (2020). Kaggle. https://www.kaggle.com/datasets/harrywang/wine-dataset-for-clustering
Kassambara, A. (2017). Practical guide to cluster analysis in r: Unsupervised machine learning (Vol. 1). Sthda.