Segmentación de clientes (Clusterización)
En esta sección se estará realizando la documentación del proceso de clusterización.
En esta primera parte comenzamos con la importación de librerías que vamos a estar utilizando en este proceso.
Este bloque prepara el entorno para:
visualizarlos (matplotlib / seaborn) evaluar clusters (silhouette) Aquí comenzamos a leer la base cluster ya preparada (documentada en la sección anterior) e imprimimos los primeros valores para verificar que se está leyendo correctamente.
Para fines de clusterización creamos una columna nueva llamada Porcentaje Cemento, sumando las columnas de:
Porcentaje Cemento Envasado Porcentaje Cemento Mega Bolsa Porcentaje Cemento Granel A este punto, estamos listos para realizar la primera segmentación
Primera segmentación
Para esta primera clusterización
En vars_cluster, para esta primera segmentación usaremos solo las variables VolumenT y Venta mensual
en X_df extraemos solo esas columnas del DataFrame original, donde X_df será la base numérica para el modelo
En esta parte rellenamos los valores vacíos con ceros, ya que el modelo solo acepta valores numéricos.
Después centramos los valores a cero y una desviación estándar a 1.
Esto es importante porque el modelo KMeans usa distancias, si una variable está en miles y otra en decenas, entonces domina el clustering y el escalado las pone en igualdad de condiciones.
Lista donde guardarás la WCSS (Within-Cluster Sum of Squares → qué tan compactos están los clusters)
En el ciclo for calculamos de 1 a 10 clusters
n_clusters=i :número de clusters
k-means++ : inicialización inteligente (mejor convergencia)
max_iter=500 : más iteraciones permitidas
random_state=42 : resultados reproducibles
Para cada k:
guardas la inercia (WCSS) A mayor k:
pero llega un punto donde la mejora es mínima: el codo Por último, dibuja la gráfica del codo, donde:
eje X : número de clusters Donde estamos buscando:
El punto donde la curva deja de bajar “bruscamente” Ese k es un buen número de clusters Este codo es el resultante de la primera segmentación
Aquí estamos evaluando qué tan buenos son los clusters usando el Silhouette Score.
Silhouette Score mide:
qué tan parecido es un punto a su propio cluster vs qué tan lejano está de otros clusters Valores:
≈ 1 → clusters muy bien definidos Buscar los resultados nos ayuda a busca el k con mayor silhouette, compáralo con el método del codo, esto nos da una guía para saber cuál es la segmentación óptima para cada caso, en la primera segmentación, nuestro valor optimo fue 3.
Ahora, empezamos a segmentar por kmeans
Parámetros clave:
k-means++ : mejores centroides iniciales max_iter=300 : límite de iteraciones n_init=10 : corre el algoritmo 10 veces y se queda con la mejor solución random_state=42 : reproducible Después, entrenamos KMeans con los datos escalados y asignamos a cada fila un cluster (0, 1 o 2)
Posteriormente, se calcularon los centroides de cada cluster. Con el fin de visualizar la segmentación, se empleó PCA para reducir la dimensionalidad a dos componentes principales, permitiendo representar gráficamente la distribución de los clientes y sus centroides en un plano 2D.
Se generó una gráfica de dispersión utilizando las dos componentes principales obtenidas mediante PCA. Cada punto representa un cliente, coloreado según el cluster asignado por K-Means. Adicionalmente, se graficaron los centroides de cada cluster, identificados con un marcador distintivo, con el objetivo de visualizar la separación y la posición relativa de los grupos resultantes.
Se añadieron elementos descriptivos a la visualización, incluyendo un título, etiquetas para los ejes correspondientes a las componentes principales, una leyenda para identificar clientes y centroides, y una cuadrícula para facilitar la interpretación. Finalmente, se mostró la gráfica resultante con la segmentación obtenida.
Esta es la dispersión de la primera clusterización, generando 3 clusters (0,1,2)
Una vez ejecutado el modelo K-Means, se obtuvieron las etiquetas de cluster para cada observación. Estas etiquetas se incorporaron al DataFrame original de clientes mediante una nueva columna denominada Cluster, permitiendo identificar a qué segmento pertenece cada cliente. Finalmente, se realizó un conteo de registros por cluster para validar la distribución de los clientes entre los grupos generados.
Para la primera clusterización, vemos:
Cluster 0: tiene 1598 clientes, entonces el cluster 0 pasará a la segunda segmentación Cluster 1: tiene 33, no requiere una nueva segmentación Cluster 2: Existen 5 clientes, no requiere nueva segmentación Se creó un subconjunto del DataFrame de clientes que contiene el identificador del cliente y el cluster asignado. Posteriormente, se validaron los valores únicos de cluster generados. Finalmente, esta información se integró nuevamente al DataFrame mediante una unión interna por el identificador de cliente, obteniendo un DataFrame final que conserva la asignación de cluster para cada registro.
Se eliminaron columnas duplicadas generadas durante el proceso de unión, conservando únicamente la columna definitiva de cluster. Posteriormente, se estandarizó el nombre de dicha columna y se validó la estructura final del DataFrame. Finalmente, el conjunto de datos resultante se exportó a un archivo CSV para su uso posterior en análisis, reportes o procesos downstream.
Una vez que hemos guardado la primera segmentación, separamos en un archivo los cluster 1 y 2, lo cuales por el análisis, no requieren una nueva segmentación, y de otro lado tenemos el cluster 0 que requiere una nueva clusterización, y se repetira el mismo proceso, pero ahora con esos clusters.
Segunda segmentación
Para la segunda clusterización, mandamo a llamar el archivo que solo contiene los clientes que en la anterior segmentación tuvieron 0, y borramos la columna de Cluster para evitar duplicar columnas
Volvemos a correr la parte donde se realiza el kmeans y la grafica del codo, para esta segunda segmentación tomamos las variables:
Obteniendo la siguiente grafica de codo.
Para esta segunda segmentación vemos que el valor óptimo para segmentar en 3 clusters.
Volvemos a correr la parte de kmeans con 3 y obtenemos el siguiente grafico de dispersión
En esta segunda segmentación encontramos que:
Cluster 0: tiene 1254 clientes, requiere una tercera clusterización Cluster 1: Tiene 254 clientes, ya no requiere una tercera clusterización y este cluster se convierte en el Cluster 3 Cluster 2: Tiene 99 clientes, ya no requiere una tercera clusterización y pasa a ser el Cluster 4 Se creó un subconjunto del DataFrame de clientes que contiene el identificador del cliente y el cluster asignado. Posteriormente, se validaron los valores únicos de cluster generados. Finalmente, esta información se integró nuevamente al DataFrame mediante una unión interna por el identificador de cliente, obteniendo un DataFrame final que conserva la asignación de cluster para cada registro.
Se eliminaron columnas duplicadas generadas durante el proceso de unión, conservando únicamente la columna definitiva de cluster. Posteriormente, se estandarizó el nombre de dicha columna y se validó la estructura final del DataFrame. Finalmente, el conjunto de datos resultante se exportó a un archivo CSV para su uso posterior en análisis, reportes o procesos downstream.
Este proceso se repite para todas las clusterizaciones.
Repetimos el proceso de separar los cluster que ya no necesitan nueva clusterización y dejamos los que sí para volver a correr el proceso.
Tercera segmentación
Cargamos el nuevo archivo, y eliminamos columnas no necesarias
A partir de la tercera clusterización en adelante ahora las variables que se van a utilizar son:
Varianza_Interanual_Precio Obteniendo el siguiente grafico de codo
Teniendo esto, el valor optimo vuelve a ser una segmentación de 3 clusters, nos da un gráfico de dispersión.
Para esta tercera segmentación obtenemos los siguientes resultados:
Cluster 0: tiene 325 clientes, requiere una cuarta segmentación. Cluster 1: tiene 243 clientes, no requiere una nueva segmentación, y este cluster pasa a ser Cluster 5. Cluster 2: tiene 677 clientes, requiere una 4 clusterización. Volvemos a repetir este proceso que es unir, limpiar y guardar.
Repetimos el proceso de separar los cluster que ya no necesitan nueva clusterización y dejamos los que sí para volver a correr el proceso.
Cuarta segmentación Cluster 0
Para este paso, y los siguientes se vuelve a correr el mismo procedimiento.
Las variables que utilizamos son:
Para esta cuarta clusterización para el cluster 0 nos dio un óptimo de 2 clusters.
Imprimimos su grafico de disperción
Cluster 0: tiene 186 clientes, ya no es necesario volver a segmentar, y este clúster pasa a ser el clúster 6 Cluster 1: tiene 139 clientes, ya no es necesario volver a segmentar, este clúster pasa a ser el cluster 7
Cuarta segmentación Cluster 2
Volvemos a cargar la base, pero ahora donde tenemos los clusters 2 de la segmentación anterior
Usamos las variables:
Obtenemos el grafico del codo, el cual nos dice que el óptimo es 2 clusters.
Imprimimos su grafico de dispersión
Cluster 0: tiene 170 clientes, no requiere una nueva segmentación, pasa a ser cluster 0 Cluster 1: tiene 507 clientes, requiere una nueva segmentación. Volvemos a repetir este proceso que es unir, limpiar y guardar.
Repetimos el proceso de separar los cluster que ya no necesitan nueva clusterización y dejamos los que sí para volver a correr el proceso.
Quinta segmentación
Volvemos a cargar la base, pero ahora donde tenemos los clusters 2 de la segmentación anterior
Usamos las variables:
Obtenemos el grafico del codo, el cual nos dice que el óptimo es 2 clusters.
Imprimimos su grafico de dispersión
Obtenemos los siguientes resultados
Cluster 0: Tiene 338 clientes, no requiere otra segmentación, pasa a ser cluster 8 Cluster 1: Tiene 169 clientes, no requiere otra segmentación, pasa a ser cluster 9 Volvemos a repetir este proceso que es unir, limpiar y guardar.
Repetimos el proceso de separar los cluster que ya no necesitan nueva clusterización y dejamos los que sí para volver a correr el proceso.
Este proceso nos da un total de 10 clusters.
Segmentación ONE TIME
Para calcular la segmentación de ONE TIME, una vez que tenemos los clusters usando el metodo de kmeans, vamos a utilizar la columna de Customer Name agregado
Buscamos todos los clientes que contienen ONE TIME, y se les cambia el cluster que tengan al cluster 11.
Esto nos da un total de 12 clusters, del 0 al 11.
Agrupación de clusters
Una vez que tenemos nuestra base con todos los clusters, es cargada a nuestro powerBI para hacer el analisis.
En este análisis pudimos observar que
Cluster 0, Cluster 3 y Cluster 5 tenian valores similares de venta de concreto, block, frecuencia, días de ultima compra, estos 3 clusters se fusionan y pasan a ser Cluster 0 Cluster 4, Cluster 6 compartían valores similares de venta de concreto, block, frecuencia, días de ultima compra, estos 2 clusters se fusionan y pasan a ser Cluster 3 Cluster 7 no se fusionó, pasa a ser el Cluster 4 para no romper el orden de numeración Cluster 8 Cluster 9 compartían valores similares de venta de concreto, block, frecuencia, días de ultima compra, estos 2 clusters se fusionan y pasan a ser Cluster 5 Cluster 10 no se fusionó, pasa a ser el Cluster 6 para no romper el orden de numeración Cluster 11 no se fusionó, pasa a ser el Cluster 7 para no romper el orden de numeración
Esto nos da un total de 8 Clusters los cuales son:
Cluster 0: No consumidores