1. Clusters con R
1. Planteamiento general
Como es sabido, de cualquier dataset se pueden extraer un número k de clusters, número que en el
caso de cluster no jerárquico hay que elegir de antemano. Además, el procedimiento habitualmente
utilizado se basa en el cálculo de las similaridades o disimilaridades de los objetos, cosa que se
puede realizar de diversas formas (distancias euclideanas o de otro tipo). En fin, el algoritmo
utilizado para la agrupación de objetos parte de una elección aleatoria de puntos de partida, que
varía en cada intento, lo que quiere decir que la repetición de un mismo procedimiento puede
arrojar resultados (algo) diferentes.
Por todo ello es aconsejable incluir en la estrategia de análisis tres elementos:
• Analizar previamente si el dataset contiene o no objetos “clusterables” y en caso afirmativo
realizar una estimación del número más probable de clusters, probando entonces el resultado
a obtener según el número k de cluster elegido
• Realizar el cluster no una vez sino varias, utilizando -si no hay un criterio objetivo previo
que lo indique- un abanico de medidas de similaridad/disimilaridad y de procedimientos de
cluster diferentes, asignando en cada caso a cada objeto el cluster al que pertenecería y ver si
el resultado tiene sentido para la finalidad del análisis
• Evaluar a posteriori la calidad del cluster obtenido y comparar resultados
2. Procedimientos
2.1. Exploración del dataset
Si las variables de nuestro dataset son todas numéricas es aconsejable estimar las correlaciones
entre las mismas ya que es posible que un grupo de ellas en realidad sean reflejo de uno o varios
factores subyacentes. En este caso habría que realizar un Análisis de Componentes Principales
(PCA) y utilizar en el cluster los factores obtenidos. No obstante, en R existen funciones que
realizan esta doble operación “de una vez”.
Además si se detectan objetos con datos extremos (“outliers”) es mejor utilizar el método
Partitioning Around Medoids (PAM), en vez de k-means, ya que es menos sensible a dichos
“outliers”.
Los objetos con ausencia de valores para algunas variables deben ser eliminados del análisis o
poner en marcha procedimientos de “relleno” de esos valores “faltantes” (NAs en R).
Hay que evitar el impacto de diferentes magnitudes de las variables estandarizando dichas
variables: función scale() en R.
2.2. ¿Son nuestros datos “clusterables”?
En estadística se denomina “Assessing Clustering Tendency” al procedimiento para averiguar si un
dataset está uniformemente o aleatoriamente distribuido o si, al contrario, los objetos que muestran
una tendencia a agruparse en “clusters”. Se utiliza para ello el estadístico de Hopkins (H), que mide
la probabilidad de que un dataset está generado por una distribución uniforme de datos, es decir la
2. distribución espacial aleatoria de los datos. La hipótesis nula es que los datos están uniformemente
distribuidos, es decir no hay clusters significativos y la hipótesis alternativa es que los datos no
están uniformemente distribuidos, es decir existen clusters significativos.
En R dos funciones realizan este cálculo con idénticos resultados: la función get_clust_tendency()
del paquete {factoextra} y la función hopkins() del paquete {clustertend}. Un valor de H cercano
a 0.5 o por encima significa que los datos están aleatoria o uniformemente distribuidos. Si H es
cercano a cero, podemos rechazar la hipótesis nula y concluir que sí existen clusters significativos.
2.3. Estimación a priori del número de k clusters
En R se puede utilizar el método “elbow” para estimar el número óptimo de clusters, con la función
fviz_nbclust() del paquete {factoextra}. Otra alternativa se obtiene con la función NbClust() del
paquete del mismo nombre que calcula 30 índices para elegir el mejor número de clusters, tomando
entonces el número más frecuente.
2.4. Ponderación en el cluster
Cuando se quiere dar más importancia a unas variables que a otras, creo que la mejor forma es
reducir las “menos” importantes a sus posibles factores subyacentes y después utilizar estos factores
como variables para el cluster.
Si pensamos que hay algunas variables que tienen una fuerte relación entre sí, a diferencia del resto
del dataset, se puede combinar el PCA con el cluster k-means por medio de la función cluspca() del
paquete {clustrd}.
Si lo que queremos es ponderar los casos (objetos) el paquete {WeightedCluster} ofrece distintos
procedimientos.