Skip to content

Clusterización

Segmentación de clientes (Clusterización)

En esta sección se estará realizando la documentación del proceso de clusterización.
image.png
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:
limpiar datos (pandas)
analizarlos (numpy)
visualizarlos (matplotlib / seaborn)
crear clusters (KMeans)
evaluar clusters (silhouette)
image.png
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.
image.png
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

image.png
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
image.png
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.

image.png
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:
entrenas el modelo
guardas la inercia (WCSS)
A mayor k:
WCSS siempre baja
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
eje Y : WCSS
Donde estamos buscando:
El punto donde la curva deja de bajar “bruscamente”
Ese k es un buen número de clusters
image.png
Este codo es el resultante de la primera segmentación
image.png
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
≈ 0 → clusters solapados
< 0 → mala asignación
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.

image.png
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.

image.png
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.

image.png
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.
image.png
Esta es la dispersión de la primera clusterización, generando 3 clusters (0,1,2)

image.png
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.
image.png
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
image.png
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.
image.png
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.
image.png
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

image.png
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
image.png
Volvemos a correr la parte donde se realiza el kmeans y la grafica del codo, para esta segunda segmentación tomamos las variables:
Porcentaje Cemento
Porcentaje Concreto
Porcentaje Block
Obteniendo la siguiente grafica de codo.
image.png
Para esta segunda segmentación vemos que el valor óptimo para segmentar en 3 clusters.
image.png
Volvemos a correr la parte de kmeans con 3 y obtenemos el siguiente grafico de dispersión
image.png
image.png
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
image.png
image.png
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.
image.png
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

image.png
Cargamos el nuevo archivo, y eliminamos columnas no necesarias
image.png
A partir de la tercera clusterización en adelante ahora las variables que se van a utilizar son:
Unique Products
Days Since Last Order
Frecuencia Mensual
Antiguedad_anios
Varianza_Interanual_Precio
Obteniendo el siguiente grafico de codo
image.png
Teniendo esto, el valor optimo vuelve a ser una segmentación de 3 clusters, nos da un gráfico de dispersión.
image.png
image.png
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.
image.png
image.png
Volvemos a repetir este proceso que es unir, limpiar y guardar.
image.png
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.
image.png
Las variables que utilizamos son:
image.png
Para esta cuarta clusterización para el cluster 0 nos dio un óptimo de 2 clusters.
image.png
Imprimimos su grafico de disperción
image.png
image.png
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

image.png

Volvemos a cargar la base, pero ahora donde tenemos los clusters 2 de la segmentación anterior
Usamos las variables:
image.png
Obtenemos el grafico del codo, el cual nos dice que el óptimo es 2 clusters.
image.png
Imprimimos su grafico de dispersión
image.png
image.png
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.
image.png
Volvemos a repetir este proceso que es unir, limpiar y guardar.
image.png
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

image.png

Volvemos a cargar la base, pero ahora donde tenemos los clusters 2 de la segmentación anterior
Usamos las variables:
image.png
Obtenemos el grafico del codo, el cual nos dice que el óptimo es 2 clusters.
image.png
Imprimimos su grafico de dispersión
image.png
image.png
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
image.png
Volvemos a repetir este proceso que es unir, limpiar y guardar.
image.png
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
image.png
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 1 no se fusionó
Cluster 2 no se fusionó.
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
image.png

Esto nos da un total de 8 Clusters los cuales son:
Cluster 0: No consumidores
Cluster 1: Mix B
Cluster 2: Mix Alto
Cluster 3: Cemento A
Cluster 4: Con-Block A
Cluster 5: Con-Block B
Cluster 6: Con-Block C
Cluster 7: ONE TIME

image.png

Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.