El término clustering hace referencia a un amplio abanico de técnicas no supervisadas cuya finalidad es encontrar patrones o grupos (clusters) dentro de un conjunto de observaciones. Las particiones se establecen de forma que, las observaciones que están dentro de un mismo grupo, son similares entre ellas y distintas a las observaciones de otros grupos. Se trata de un método no supervisado, ya que el proceso ignora la variable respuesta que indica a que grupo pertenece realmente cada observación (si es que existe tal variable). Esta caracterÃstica diferencia al clustering de las técnicas supervisadas, que emplean un set de entrenamiento en el que se conoce la verdadera clasificación.
Dada la utilidad del clustering en disciplinas muy distintas (genómica, marketing…), se han desarrollado multitud de variantes y adaptaciones de sus métodos y algoritmos. Pueden diferenciarse tres grupos principales:
Partitioning Clustering: Este tipo de algoritmos requieren que el usuario especifique de antemano el número de clusters que se van a crear (K-means, K-medoids, CLARA).
Hierarchical Clustering: Este tipo de algoritmos no requieren que el usuario especifique de antemano el número de clusters. (agglomerative clustering, divisive clusterig).
Métodos que combinan o modifican los anteriores (hierarchical K-means, fuzzy clustering, model based clustering y density based clustering).
Todos los métodos de clustering tienen una cosa en común, para poder llevar a cabo las agrupaciones necesitan definir y cuantificar la similitud entre las observaciones. El término distancia se emplea dentro del contexto del clustering como cuantificación de la similitud o diferencia entre observaciones. Si se representan las observaciones en un espacio p dimensional, siendo p el número de variables asociadas a cada observación, cuando más se asemejen dos observaciones más próximas estarán, de ahà que se emplee el término distancia. La caracterÃstica que hace del clustering un método adaptable a escenarios muy diversos es que puede emplear cualquier tipo de distancia, lo que permite al investigador escoger la más adecuada para el estudio en cuestión. A continuación, se describen algunas de las más utilizadas.
La distancia euclÃdea entre dos puntos p y q se define como la longitud del segmento que une ambos puntos. En coordenadas cartesianas, la distancia euclÃdea se calcula empleando el teorema de Pitágoras. Por ejemplo, en un espacio de dos dimensiones en el que cada punto está definido por las coordenadas (x,y) , la distancia euclÃdea entre p y q viene dada por la ecuación:
\[ d_{euc}(p,q) = \sqrt{(x_p - x_q)^2 + (y_p - y_q)^2} \]
Esta ecuación puede generalizarse para un espacio euclÃdeo n-dimensional donde cada punto está definido por un vector de n coordenadas: $ p = (p_1,p_2,p_3,…,p_n) $ y $ q = (q_1,q_2,q_3,…,q_n) $
\[ d_{euc}(p,q) = \sqrt{(p_1 - q_1)^2 + (p_2 - q_2)^2 +...+(p_n - q_n)^2} = \]
\[ \sqrt{ \sum_{i=1}^n (p_i - q_i)^2} \]
Idea intuitiva
El método K-means clustering (MacQueen, 1967) agrupa las observaciones en K clusters distintos, donde el número K lo determina el analista antes de ejecutar del algoritmo. K-means clustering encuentra los K mejores clusters, entendiendo como mejor cluster aquel cuya varianza interna (intra-cluster variation) sea lo más pequeña posible. Se trata por lo tanto de un problema de optimización, en el que se reparten las observaciones en K clusters de forma que la suma de las varianzas internas de todos ellos sea lo menor posible. Para poder solucionar este problema es necesario definir un modo de cuantificar la varianza interna.
setwd("~/Documents/APLICADA")
library(ggplot2)
library(DT)
df <- iris
datatable(df)
** visualizando los datos graficamente
Para esto haremos un diagrama de dispersion o scatterplot
ggplot(df, aes(Petal.Length, Petal.Width) ) + geom_point(aes(col=Species), size=4)
Como podemos ver, setosa se agrupará más fácilmente. Mientras tanto, hay ruido entre versicolor y virginica incluso cuando parecen perfectamente agrupados.
Ejecutemos el modelo. kmeans está instalado en el paquete base de R, por lo que no tenemos que instalar ningún paquete.
En la función kmeans, es necesario establecer el centro, que es el número de grupos a los que queremos agrupar. En este caso, sabemos que este valor será 3. Establezcamos eso.
, pero veamos cómo construirÃamos el modelo si no lo supiéramos.
** Primer modelo de clusterizacion usando k medias
set.seed(101)
irisCluster <- kmeans(df[,1:4], center=3, nstart = 20 )
irisCluster
## K-means clustering with 3 clusters of sizes 38, 62, 50
##
## Cluster means:
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 6.850000 3.073684 5.742105 2.071053
## 2 5.901613 2.748387 4.393548 1.433871
## 3 5.006000 3.428000 1.462000 0.246000
##
## Clustering vector:
## [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [38] 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [75] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1
## [112] 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 1
## [149] 1 2
##
## Within cluster sum of squares by cluster:
## [1] 23.87947 39.82097 15.15100
## (between_SS / total_SS = 88.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Comparando los clusters con los datos originiales
table(irisCluster$cluster, df$Species)
##
## setosa versicolor virginica
## 1 0 2 36
## 2 0 48 14
## 3 50 0 0
Representacion grafica de los clusters modelados
library(cluster)
clusplot(iris, irisCluster$cluster, color=T, shade = T, lines=0 )
Podemos ver el cúmulo de setosa perfectamente explicado, mientras que virginica y versicolor tienen un poco de ruido entre sus cúmulos.
Como dije antes, no siempre tendremos los datos etiquetados. Si quisiéramos saber el número exacto de centros, deberÃamos haber construido el método del codo.
tot.withinss <- vector(mode="character", length=10)
for (i in 1:10){
irisCluster <- kmeans(df[,1:4], center=i, nstart=20)
tot.withinss[i] <- irisCluster$tot.withinss
}
vamos a visualizar el resultado
plot(1:10, tot.withinss, type = "b", pch=19)
Entonces resultado del metodo del codo a traves de un bucle, tenemos que ciertamente el numero de clusters es 3