Capítulo 5

Christian Alvarez

Mayo 27, 2023

library(cluster)
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(ggplot2)
library(ggsignif)

Capítulo 5 - K-Medoids

El k-medoids es una variante del clustering k-means que divide un conjunto de datos en k grupos. Cada grupo está representado por un medoide, que es el punto central con la menor disimilitud promedio. A diferencia del k-means, que utiliza medias como centros, el k-medoids es más resistente al ruido y valores atípicos. Se especifica el número de clusters k y se puede determinar utilizando el método de la silueta. El k-medoids mejora la representatividad de los grupos y se aplica en diversas situaciones en el análisis de datos. Su utilización permite una mayor robustez y una mejor identificación de patrones en conjuntos de datos complejos, lo que lo convierte en una herramienta valiosa en el campo de la minería de datos y el aprendizaje automático.

5.1. Concepto PAM

El uso de medias implica que la agrupación k-means es muy sensible a los valores atípicos. Esto puede afectar gravemente a la asignación de observaciones a los conglomerados. El algoritmo PAM ofrece un algoritmo más robusto.

5.2 Algoritmo PAM

El algoritmo PAM busca k medoides representativos entre las observaciones del conjunto de datos. Luego, asigna cada observación al medoide más cercano para formar clusters. Mediante el intercambio de medoides y puntos de datos no medoides, se calcula una función objetivo que representa la suma de las disimilitudes entre los objetos y sus medoides más cercanos. El paso SWAP busca mejorar el agrupamiento intercambiando objetos seleccionados y no seleccionados si la función objetivo se reduce. Este proceso continúa hasta que la función objetivo ya no pueda reducirse más. El objetivo es encontrar k medoides que minimicen las disimilitudes entre las observaciones y sus medoides más cercanos.

El algoritmo PAM se ejecuta en dos fases:

  • Selecciona k objetos para que se conviertan en los medoides, o en caso de que estos objetos hayan sido proporcionados utilízalos como medoides;
  • Calcular la matriz de disimilitud si no se ha proporcionado;
  • Asignar cada objeto a su medoide más cercano;
  • Para cada cluster buscar si alguno de los objetos del cluster disminuye el coeficiente de disimilitud medio; si lo hace, seleccionar la entidad que más disminuye este coeficiente como el medoid para este cluster;
  • Si al menos un medoid ha cambiado, pasar a (3), si no, finalizar el algoritmo.

Es relevante considerar que el algoritmo PAM utiliza una matriz de disimilitud, la cual puede ser calculada utilizando dos métricas distintas:

  • Distancia euclidiana: Implica calcular la raíz cuadrada de la suma de los cuadrados de las diferencias entre los elementos.
  • Distancia Manhattan: Consiste en la suma de las diferencias absolutas entre los elementos.

Es importante señalar que, en la práctica, en la mayoría de los casos se obtendrán resultados similares al utilizar tanto la distancia euclidiana como la distancia Manhattan. Sin embargo, si los datos contienen valores atípicos, la distancia Manhattan ofrecerá resultados más robustos, ya que no se verá tan afectada por estos valores inusuales. Por otro lado, la distancia euclidiana puede ser más sensible a la presencia de valores atípicos y esto puede influir en los resultados obtenidos. Por lo tanto, al elegir entre ambas métricas, es necesario considerar la naturaleza de los datos y la presencia potencial de valores atípicos para seleccionar la distancia más adecuada en cada caso.

5.3 Computación de PAM en R

5.3.1 Datos

Utilizaremos el conjunto de datos de demostración “USArrests”, que empezaremos escalando (Capítulo 2) utilizando la función de R scale() como se indica a continuación:

data ("USArrests") 
df <- scale (USArrests)
head(df, n = 3) 
##             Murder   Assault   UrbanPop         Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska  0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona 0.07163341 1.4788032  0.9989801  1.042878388

5.3.2 Paquetes y funciones de R necesarios

En R, se emplean las funciones pam() y pamk() para realizar el cálculo del algoritmo PAM. La función pamk() no requiere la especificación del número de clústeres, a diferencia de la función pam() que sí lo requiere.

La sintaxis simplificada de la función pam() es la siguiente:

#pam(x, k, metric = "euclidean", stand = FALSE)

↦ x: Puede ser una matriz o un marco de datos numéricos, donde cada fila representa una observación y cada columna una variable. También puede ser una matriz de disimilitud, obtenida típicamente a través de las funciones daisy() o dist().

↦ k: Especifica el número de clústeres.

↦ metric: Indica la métrica de distancia a utilizar, que puede ser “euclidean” o “manhattan”.

↦ stand: Un valor lógico que determina si se deben estandarizar las variables antes de calcular las disimilitudes. Si x es una matriz de disimilitud, este parámetro se ignora. Para visualizar los clústeres generados con la función pam(), se recomienda utilizar el paquete factoextra.

Procedemos a instalar el paquete necesario:

 install.packages(c("cluster", "factoextra"))
## Installing packages into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
library(cluster)
library(factoextra)

5.3.3 Estimando el número optimo de grupos

Vamos a utilizar el método de la silueta media para determinar el número óptimo de grupos. La idea consiste en aplicar el algoritmo PAM utilizando distintos valores de grupos (k). Luego, graficamos la silueta media de los grupos en función del número de ellos. La silueta media es un indicador de la calidad de la agrupación, donde un valor alto representa una buena agrupación. El número óptimo de grupos k es aquel que maximiza la silueta media dentro de un rango de valores posibles para k, según lo propuesto por Kaufman y Rousseeuw en 1990.

La función de R fviz_nbclust() [paquete factoextra] proporciona una solución práctica para estimar el número óptimo de congloomerados.

library(cluster)

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

A partir del gráfico, el número de conglomerados sugerido es 2. En la siguiente sección, clasificaremos las observaciones en 2 conglomerados.

5.3.4 Cálculo de la agrupación PAM

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"

La salida impresa muestra:

Los medoides del cluster: una matriz, cuyas filas son los medoides y las columnas son variables.

El vector de clusterización: Un vector de enteros (de 1:k) que indica el cluster al que se asigna cada punto.

5.3.5 Accediendo a los resultados de la funcion pam()

La función pam() devuelve un objeto de la clase pam cuyos componentes incluyen:

Medoides: Objetos que representan clusters.

clustering: un vector que contiene el número de cluster de cada objeto.

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

5.3.6 Vizualizando los conglomerados PAM

Utilizaremos la función “fviz_cluster()” del paquete “factoextra” para representar los resultados de la partición. Generaremos un gráfico de dispersión en el que los puntos de datos estarán coloreados según los números de cluster asignados. En caso de que los datos contengan más de 2 variables, se empleará el algoritmo de Análisis de Componentes Principales (ACP) para reducir la dimensionalidad de los datos. Para la visualización, se utilizarán las dos primeras dimensiones principales.

fviz_cluster(pam.res,
             palette = c("#B19ED7", "#61FAA6"), 
             ellipse.type = "t", 
             repel = TRUE, 
             ggtheme = theme_classic()
             )

5.4 Resumen

K-medoids, también conocido como algoritmo PAM, es una opción sólida en lugar de k-means para dividir un conjunto de datos en clústeres de observaciones. En el método k-medoids, cada clúster está representado por un objeto seleccionado dentro del mismo, llamado medoide, que corresponde al punto más central del clúster.

El algoritmo PAM requiere que el usuario esté familiarizado con los datos y proporcione el número adecuado de clústeres a generar. Esto puede estimarse utilizando la función Jvíz_nbclust del paquete R “factoezxtra”. Se puede utilizar la función pam() del paquete “cluster” de R para calcular el algoritmo PAM. La sintaxis simplificada es pam(x, k), donde “x” representa los datos y “k” es el número de clústeres a generar.

Una vez realizado el clustering PAM, se puede utilizar la función fviz_cluster() del paquete “factoextra” de R para visualizar los resultados. La sintaxis sería fviz_cluster(pam.res), donde “pam.res” representa los resultados obtenidos mediante PAM. Es importante tener en cuenta que, para conjuntos de datos grandes, pam() podría requerir una gran cantidad de memoria o tiempo de cálculo. En tal caso, es recomendable utilizar la función clara().