K-means

Equipo 4: Carlos Angulo, Fernando Bocardo, Josue Flores, Oscar Roman

5/4/2022

K-means

K-means es un algoritmo de clasificación no supervisada (clusterización) que agrupa objetos en k grupos basándose en sus características. El agrupamiento se realiza minimizando la suma de distancias entre cada objeto y el centroide de su grupo o cluster.

Desarrollo

Datos y Paquetes

Importando datos y paquetes.

library(ggplot2)
library(DT)
df <- iris

Visualización de datos en una tabla.

datatable(df)

Representación gráfica

Haciendo uso de un diagrama de dispersión.

ggplot(df, aes(Petal.Length, Petal.Width) ) + geom_point(aes(col=Species), size=4)

Podemos observar claramente que en el caso de los datos para setosa, se tiene un grupo con datos muy diferentes al resto de especies, por lo que el algoritmo lo identificará rapidamente, mientras tanto en el caso de veriscolor y virginica existe ruido ya que tienen datos parecidos.

Implementación del algoritmo k-means

Para iniciar la implementación del algoritmo k-means, necesitamos determinar la cantidad de clusters que utilizaremos en el modelo, viendo la representación gráfica podemos definir facilmente que serán 3 clusters, correspondientes a cada una de las especies de iris.

Realizamos el primer modelo de clusterización utilizando k-means.

set.seed(777)
clusterIris <- kmeans(df[,1:4], center=3, nstart = 20)
clusterIris
## K-means clustering with 3 clusters of sizes 50, 38, 62
## 
## Cluster means:
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     5.006000    3.428000     1.462000    0.246000
## 2     6.850000    3.073684     5.742105    2.071053
## 3     5.901613    2.748387     4.393548    1.433871
## 
## 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 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
##  [75] 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 2 2 2 2 3 2 2 2 2
## [112] 2 2 3 3 2 2 2 2 3 2 3 2 3 2 2 3 3 2 2 2 2 2 3 2 2 2 2 3 2 2 2 3 2 2 2 3 2
## [149] 2 3
## 
## Within cluster sum of squares by cluster:
## [1] 15.15100 23.87947 39.82097
##  (between_SS / total_SS =  88.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Representación gráfica de los clusters modelados

library(cluster)
clusplot(iris, clusterIris$cluster, color=TRUE, shade = TRUE, lines=0, main = "Representación de los clusters modelados")

Como mencionabamos podemos ver setosa completamente identificada sin nada de ruido, mientras que entre virginica y versicolor existe ruido por su similitud.

Lo analizaremos de manera más clara.

ggplot(iris,aes(x = Petal.Length, y = Petal.Width, shape= Species, col= as.factor(clusterIris$cluster))) + geom_point()

En esta gráfica podemos observar todos los puntos rojos (Cluster 1) son setosa, mientras que en el caso de los puntos azules (Cluster 3) podemos notar una combinación considerable entre veriscolor (triangulos) y virginica (cuadrados), y en menor medida también lo observamos con los cuadrados (Cluster 2), de esta forma podemos ver que nuestro modelo ha logrado clasificar la mayoria de los datos correctamente, aunque sigue existiendo una cantidad considerable de ruido. Para comprobarlo vamos a calcular la precisión del modelo.

Calculo de la precisión del modelo

table(clusterIris$cluster, df$Species)
##    
##     setosa versicolor virginica
##   1     50          0         0
##   2      0          2        36
##   3      0         48        14

Esta tabla representa numéricamente lo que observamos en la gráfica anterior. Todas las Setosa están clasificadas en un único grupo, y existe una minima variación en versicolor y una más notable en virginica.

Para calcular la precisión, sumamos las observaciones correctas del modelo y lo dividimos entre las observaciones totales, viendo la gráfica sabemos que el primer cluster representa a setosa, el segundo a virginica y el tercero a versicolor.

(50+36+48) / 150
## [1] 0.8933333

Con esto tenemos que nuestro modelo tiene una precisión de aproximadamente un 90%, por lo tanto se puede concluir que el algoritmo k-means hizo un buen trabajo en la clusterización de los datos.

Descarga este código

xfun::embed_file("K means.Rmd")

Download K means.Rmd