Análisis Cluster No Jerárquico k-means en R

Uso: Clasificador de clases por clustering o agrupamiento, no supervisado.

Descripción: El objetivo es segmentar un conjunto de datos en grupos homogéneos, disjuntos entre sí, es decir, ningún elemento formará parte de dos grupos distintos, por lo que, serán heterogéneos entre sí.

Para ello, el algoritmo utiliza el Criterio de la Inercia, que indica que el modelo será óptimo, cuando los grupos formados tengan una distancia mínima intra-cluster y, una distancia máxima inter-cluster, como se observa en el siguiente gráfico.

Los grupos que se formaran serán por compartir características similares, por lo cual, por ser un método no supervisado el Científico de Datos deberá darle una interpretación a la clasificación realizada.

Para ello, el algoritmo identificara  k centroides, los cuales compararán su valor medio con el de los datos restantes, seleccionando aquellos más cercanos para realizar los clúster o agrupamiento.

En el siguiente gráfico se puede evidenciar los centroides del ejemplo que estamos presentando utilizando como variables de aporte de información: Petal.Width y Petal.Length.

Variable dependiente: no métricas.

Variables independientes: métricas.

Ejemplo en R: Clasificar tipo de flor atendiendo a sus características físicas como pueden ser el ancho y alto de los pétalos y sépalos.

Aplicaciones: Segmentación de Mercados, Geoestadística, Astronomía y  Agricultura.

# La función kmeans viene por defecto en la librería: stat.

set.seed(12345)

#Invocamos la Base de datos Iris.
data(iris)
datos=iris

# Verificamos la composición del set de datos.
# En este caso hay 5 variables: 4 numéricas (Sepal y Petal) y 1 categorica determinada como factor (Species).

str(datos)
# En este caso la variable objetivo, nuestra y, que es la variable: Species.
datos$Species

# Las primeras 50 son: Setosas, las 50 siguientes son: Versicolor y, las ultimas 50, son: virginica y, estas conforman las 3 CLASES a pronosticar.

# Gráfico de dispersión de las clases según las variables predictoras.

pairs(datos[-5],col=datos$Species)

# Verificamos la correlación entre las variables NUMÉRICAS existentes.

correlacion=cor(datos[-5])
correlacion

# Con esto podemos observar que combinación de variables van a portar mayor información a la formación de los grupos. En este caso podemos observar que la combinación Petal.Width y Petal.Length, nos proporciona la mejor clusterización.

# Aplicación del Método: K MEANS.

# El objetivo del Kmeans o K medias es formar grupos homogéneos, distintos entre si. En este caso, nuestro k=3, formaremos 3 grupos, porque ya conocemos que hay  3 distintos tipos de iris, sin embargo, el n, dependerá del problema.

grupos=kmeans(datos[-5],3)

# La función kmeans recibe dos parametros: datos (solo las variables numericas) y k (número de grupos a formar).

grupos

# El número 3: corresponde a las Setosas, el número 2 a las Versicolor y el número 1 a las Virginicas.

# Con la siguiente sentencia se obtiene el grupo al cual pertenecen los registros o filas del set de datos según la función: kmeans .

grupos$cluster

# Como se puede apreciar se han formado 3 clusters o grupos.

# Grupo 3, corresponden a: Setosas.
# Grupo 1, corresponden a: Versicolor.
# Grupo 2: corresponden a: Virginica.

 

Enfoque en el Output:

# Evaluación de Resultados

# Asignamos a la variable: clases, los datos numéricos como factor del set de datos.

clases=factor(datos[,5])

# Asignamos a la variable: predicho, las clases predichas por el kmedias.

predicho= NULL

# La función: mode (moda), contará la cantidad de registros clasificados como: setosa, versicolor o virginica en cada llamada y, retornará la mayor cantidad de ocurrencias vinculadas a la clase que se le asigne.

mode=function (x){
ux=unique(x)
ux[which.max(tabulate(match(x,ux)))]
}

# Segmentamos el clustering vector de 50 en 50, hasta llegar a 150, es decir, 3 grupos de 50, porque, al inicio, habian 50 flores de cada tipo: Setosas, Versicolor y Virginica.
# ¡ Importante ! : 
# Evidentemente el algoritmo tiene errores en clasificar entre Versicolor y Virginica, por lo cual, se necesita conocer la precisión y el error asociado al modelo.

# Setosas
# [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 3 3 3 3 3 3 3 3 3 3 3 3 3

# Versicolor
# 1 1 2 1
# [55] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

# Virginicas
# 2 1 2 2 2 2 1 2
# [109] 2 2 2 2 2 1 1 2 2 2 2 1 2 1 2 1 2 2 1 1 2 2 2 2 2 1 2 2 2 2 1 2 2 2 1 2 2 2 1 2 2 1
# Así pues, las primeras 50 eran: Setosas, las 50 siguientes eran: Versicolor y, las ultimas 50, eran: virginica y, estas conforman las 3 CLASES a pronósticar.

predicho [grupos$cluster==mode(grupos$cluster[1:50])]="setosa" 
predicho [grupos$cluster==mode(grupos$cluster[50:100])]="versicolor"
predicho [grupos$cluster==mode(grupos$cluster[100:150])]="virginica"
# ¡ Importante ! : 
# Verificar que el orden de los grupos son los que se evaluaron al inicio. 
# Se transforma la variable: predicho, a factor. 

predicho=factor(predicho) 

# Matriz de confusión 

MC = table(clases, predicho) 
MC 

precision=(sum(diag(MC)))/sum(MC) 
precision 

error=1-precision 
error
# En este caso sabíamos cuantos grupos podíamos formar, sin embargo, para otras aplicaciones donde no se sepa correctamente cuántos grupos formar es necesario realizar el test que indicaremos en otra entrega.

Otros artículos que pueden ser de interés: