Este documento te muestra paso a paso como realizar e implementar el algoritmo K-means a partir de una base de datos en formato .csv, este archivo podrás descargarlo desde la sección de material de consulta de la semana 6.
En primer lugar, cargaremos la base de datos desde el archivo base_datos_clientes.csv, este archivo debe estar en el mismo directorio donde esté ubicada tu consola o Script de R en el que estés trabajando.
#Cargamos el data set desde el archivo CSV
clientes<-read.csv("base_datos_clientes.csv")
#ver las filas del dataset
head(clientes)
## ID_Cliente Edad Ingreso_Anual Gasto_Anual
## 1 1 33 63999 2768
## 2 2 59 39954 9642
## 3 3 39 53975 6213
## 4 4 64 95903 5393
## 5 5 67 53461 4324
## 6 6 20 90132 8862
Seleccionamos las columnas relevantes para realizar el clustering, para este ejercicio se decide considerar: Ingreso_Anual y Gasto_Anual.
# Seleccionar las columnas relevantes para el clustering (Ingreso Anual y Gasto Anual)
datos_clustering <- clientes[, c("Ingreso_Anual", "Gasto_Anual")]
# Ver una muestra de los datos seleccionados
head(datos_clustering)
## Ingreso_Anual Gasto_Anual
## 1 63999 2768
## 2 39954 9642
## 3 53975 6213
## 4 95903 5393
## 5 53461 4324
## 6 90132 8862
#Graficamos para ver los datos antes de agrupar
library(ggplot2)
ggplot(clientes, aes(x = Ingreso_Anual, y = Gasto_Anual)) +
geom_point(size = 3, color = "blue") +
labs(title = "Visualización de los Clientes por Ingreso y Gasto Anual",
x = "Ingreso Anual",
y = "Gasto Anual") +
theme_minimal()
Aplicaremos el algoritmo K-means, especificando que queremos agrupas a los clientes en 3 clusters.
# Establecer el número de clusters
set.seed(123) # esta linea es para que todos obtengan los mismos resultados
kmeans_resultado <- kmeans(datos_clustering, centers = 3, nstart = 20)
kmeans_resultado
## K-means clustering with 3 clusters of sizes 43, 20, 37
##
## Cluster means:
## Ingreso_Anual Gasto_Anual
## 1 33481.19 5401.628
## 2 91297.85 4469.250
## 3 63847.95 5137.730
##
## Clustering vector:
## [1] 3 1 3 2 3 2 2 3 1 1 2 1 1 2 3 1 3 2 3 1 3 1 1 1 1 2 1 1 1 3 3 2 3 3 3 3 2
## [38] 2 2 3 1 1 1 1 2 1 1 1 1 3 2 3 1 1 1 1 3 1 3 1 3 1 3 1 1 3 3 1 1 1 3 1 2 3
## [75] 3 3 1 3 2 3 2 1 3 1 3 3 1 3 2 2 1 1 2 3 2 3 1 3 1 3
##
## Within cluster sum of squares by cluster:
## [1] 4372790219 634129034 2554163131
## (between_SS / total_SS = 86.6 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Usamos ggplot2 para visualizar los clusters resultantes.
# Añadir el cluster al dataset original
clientes$Cluster <- as.factor(kmeans_resultado$cluster)
# Visualización con ggplot2
ggplot(clientes, aes(x = Ingreso_Anual, y = Gasto_Anual, color = Cluster)) +
geom_point(size = 3) +
labs(title = "Clusters de Clientes según Ingreso y Gasto Anual") +
theme_minimal()
## Paso 5: Interpretación de los resultados A continuación se listan los
elementos que regresa como resultado al ejecutar el algortimo
K-means:
# Ver los centroides de cada cluster
kmeans_resultado$centers
## Ingreso_Anual Gasto_Anual
## 1 33481.19 5401.628
## 2 91297.85 4469.250
## 3 63847.95 5137.730
# Ver a qué cluster pertenece cada punto
kmeans_resultado$cluster
## [1] 3 1 3 2 3 2 2 3 1 1 2 1 1 2 3 1 3 2 3 1 3 1 1 1 1 2 1 1 1 3 3 2 3 3 3 3 2
## [38] 2 2 3 1 1 1 1 2 1 1 1 1 3 2 3 1 1 1 1 3 1 3 1 3 1 3 1 1 3 3 1 1 1 3 1 2 3
## [75] 3 3 1 3 2 3 2 1 3 1 3 3 1 3 2 2 1 1 2 3 2 3 1 3 1 3
# Suma total de cuadrados dentro de los clusters
kmeans_resultado$tot.withinss
## [1] 7561082384
# Separación entre los clusters
kmeans_resultado$betweenss
## [1] 49006812680
# Tamaño de cada cluster
kmeans_resultado$size
## [1] 43 20 37
# Número de iteraciones necesarias para la convergencia
kmeans_resultado$iter
## [1] 2
Con esto hemos concluido la práctica básica del algoritmo Kmeans, en el cual de manera arbitraría decidí generar 3 clusters, sin embargo existe un método denominado del codo, que nos permite encontrar el número adecuado de cluster de manera análitica.El cual describiremos a continuación:
# Función para calcular el método del codo
set.seed(123)
inercia_total <- sapply(1:10, function(k){
kmeans(datos_clustering, centers = k, nstart = 20)$tot.withinss
})
# Graficar el método del codo
plot(1:10, inercia_total, type = "b", pch = 19, frame = FALSE,
xlab = "Número de clusters K",
ylab = "Inercia total dentro del cluster",
main = "Método del Codo para encontrar el número óptimo de Clusters")
Con esta gráfica podemos determinar el número adecuado de clusters, en este caso podemos observar que después de 4 la inercia ya no disminuye significativamente, con lo que el número adecuado de cluster es de 3, el último punto antes de estabilizarce la gráfica.Finalmente otro parametro muy importante del algoritmo K-means es nstart, este número es muy importante porque controla el número de veces que el algoritmo K-means se ejecuta con diferentes inicializaciones de centroides. La inicialización de los centroides en K-means es crucial, ya que puede afectar el resultado del agrupamiento debido a que el algoritmo puede converger a soluciones subóptimas si los centroides iniciales no están bien ubicados.
Evitar soluciones subóptimas: Al ejecutar el algoritmo varias veces con diferentes inicializaciones, se aumenta la probabilidad de encontrar una buena solución, ya que K-means puede quedar atrapado en mínimos locales. Resultados más robustos: Los resultados del clustering son más estables y consistentes, especialmente en datasets más complejos. De manera generales recomendable aumentar el valor de nstart cuando se trabaja con datasets grandes o complejos, o cuando se observa que el resultado varía mucho entre ejecuciones con diferentes inicializaciones.
En resumen, nstart es una medida para mejorar la calidad y la estabilidad de los resultados del algoritmo K-means al ejecutar múltiples inicializaciones y elegir la mejor solución.
Con estos pasos, habrás aprendido a:
Esta práctica cubre los aspectos básicos del clustering con K-means y te permitirá explorar más sobre el agrupamiento de datos en R, con esto hemos segmentado a nuestros usuarios en tres grupos. Ahora es tu turno para aplicar esta técnica y generar agrupamientos en tus propias bases de datos.