Análisis clúster: preprocesamiento, creación y comparación de metodologías

Este artículo lo guiará a través de todo el proceso de segmentación, desde el entendimiento de los datos, pasando por las buenas prácticas recomendadas para una correcta programación, el análisis exploratorio inicial, las transformaciones más adecuadas previas a la segmentación, así como la generación, análisis y visualización de los segmentos obtenidos mediante la exploración de características.

(1) Carga de módulos necesarios
(2) Carga de datos y dimensionamiento

Se trabajará con una base de ventas de nombre Mall_customers para poder determinar segmentos de interés en base a las variables proporcionadas:

CustomerID: indica el ID único por persona

Gender: Género

Age: Edad

Annual Income: Ingresos anuales

Spending Score: Score de gasto

Dimensionamiento de variables

Es importante conocer las dimensiones del DataFrame con el que se está trabajando, se tiene que conocer el número de observaciones con que se cuenta para analizar, así como el número de variables disponibles.

El dimensionamiento inicial muestra una base de datos con información de 200 personas y 5 variables por individuo, siendo predominantes las variables de tipo categóricas. Es importante entender el uso que se le da a las variables categóricas para un modelo de segmentación, las variables categóricas de tipo demográficas generalmente son utilizadas como variables explicativas de los segmentos generados.

Como buenas prácticas es recomendable uniformizar los nombres de las variables para que el programa no tenga inconvenientes con las llamadas posteriores. Se recomienda trabajar sin espacios, sin caracteres especiales y conservando una estructura a nivel de palabras.

Para un Análisis Exploratorio Inicial se separan los tipos de variables en:

  • Variables numéricas
  • Variables categóricas
(3) Análisis Exploratorio de Datos

Variables numéricas:

El análisis descriptivo de variables numéricas muestra que existe disparidad entre los límites inferiores y superiores, es decir, las variables no están en las mismas dimensiones.

Se observa una ligera presencia de parámetros bimodales y tendencias sesgadas en las variables edad y spending score. Se puede empezar a presumir que existen 2 tipos de poblaciones en estas variables.

Se realiza un poco de análisis bivariado en busca de variabilidad

Variables String

Para tratar de encontrar las variables influyentes se busca de forma gráfica presencia de agrupaciones y dispersiones importantes. El cruce de las variables numéricas versus la variable categórica muestra que el género tiene mucha dispersión con respecto a las otras variables y no es influyente en el análisis; sin embargo, las variables AnnualIncome y SpendingScore muestran presencia de aglomeraciones por sectores indicando la posible división por segmentos.

Se puede observar separaciones marcadas entre las variables AnnualIncome y SpendingScore:

Del análisis descriptivo y visual inicial retiramos las variables que no aportan a nuestro análisis: CustomerID y Género y creamos un nuevo DataFrame de nombre df quedándonos únicamente con las variables importantes.

Transformamos nuestros datos para lograr una correcta lectura de los algoritmos

Algo para considerar en el modelo de análisis de segmentación es que los algorítmos generalmente utilizan la distancia euclideana para calcular las distancias, sin embargo, esta distancia falla cuando se tiene datos en diferentes dimensiones. Una solución es utilizar la distancia coseno, que funciona mejor para datos en diferentes dimensiones, y dado que la distancia coseno y la distancia euclidiana están conectadas linealmente para los vectores normalizados, simplemente podemos normalizar nuestros datos.

(4) Algoritmos de clustering

Existen muchos algoritmos no supervisados de segmentación, cada uno tiene fortalezas significativas en ciertas situaciones, a continuación se discutirán los más utilizados.

4.1. Segmentación Kmeans:

Este es uno de los algoritmos más utilizados para agrupar datos. k-Means comienza eligiendo k centros aleatorios que pueden ser establecidos de manera manual. Luego, todos los puntos de datos se asignan al centro más cercano en función de su distancia. A continuación, se calculan los nuevos centros y se actualizan los puntos de datos. Este proceso es continuo hasta que los grupos no cambian entre iteraciones.

Parra determinar el número de clústeres óptimos se suele utilizar el método del codo. Puede hacerse este gráfico sorteando un número secuencial de grupos en el eje X y la inercia (criterio de suma de cuadrados dentro del grupo) en el eje Y.

Los indicadores de inercia y silueta indican que el número optimo de clusters es de 5, así que se procede a generar el cluster final en base a 5 segmentos.

Ahora que ya se tienen generados los segmentos, se puede probar un gráfico bivariado.

Finalmente añadimos la variable cluster a nuestro set de datos original y obtenemos frecuencias simples para analizar la importancia de los segmentos

4.2. Segmentación DB SCAN:

La agrupación espacial basada en densidad de aplicaciones con ruido (DBCSAN) es un algoritmo de agrupación que se propuso en 1996. DBSCAN es un método de agrupación en clústeres que se utiliza en el aprendizaje automático para separar clústeres de alta densidad de clústeres de baja densidad. Dado que DBSCAN es un algoritmo de agrupamiento basado en densidad, hace un gran trabajo al buscar áreas en los datos que tienen una alta densidad de observaciones, frente a áreas de los datos que no son muy densas con observaciones. DBSCAN también puede clasificar datos en grupos de diferentes formas.

La diferencia con k-means es que DBSCAN no requiere que especifique el número de clústeres. Los dos parámetros principales para DBSCAN son el número mínimo de puntos que constituyen un grupo (minPts) y el tamaño de la vecindad (eps). Por lo general, el número de puntos que constituyen un punto no debe ser muy pequeño, ya que se puede generar errores en los grupos. Como regla general, se aconseja establecer el número de minPts en la misma cantidad de características que los datos. eps es un poco más difícil de optimizar y podría requerir un gráfico de distancia k para encontrar el valor correcto. A menudo se prefiere utilizar valores pequeños iterando buscando eficiencias.


En términos sencillos, encontramos un valor adecuado para épsilon calculando la distancia a los n puntos más cercanos para cada punto, ordenando y trazando los resultados. Luego miramos para ver dónde el cambio es más pronunciado.

Podemos calcular la distancia desde cada punto hasta su vecino más cercano usando NeighborsNeighbors. El punto en sí está incluido en n_neighbors. El método kneighbors devuelve dos matrices, una que contiene la distancia a los n_neighbors puntos más cercanos y la otra que contiene el índice para cada uno de esos puntos.

El valor óptimo de épsilon es 0.08 que se encuentra en el punto de máxima curvatura. Determinado el valor de eps, podemos correr nuestro algoritmo DBSCAN

Graficando nuestro cluster podemos observar visualmente que no clasifica de forma correcta el sector pintado en color verde.

Añadimos la variable cluster a nuestro set de datos original y obtenemos frecuencias simples para analizar la importancia de los segmentos

4.3. Segmentación Jerárquica:

La agrupación jerárquica es una alternativa a los algoritmos de agrupación basados en prototipos. La principal ventaja de la agrupación jerárquica es que tampoco se necesita especificar el número de agrupaciones. Además, permite el trazado de dendogramas. Los dendogramas son visualizaciones de una agrupación jerárquica binaria.

Al marcar con una línea imaginaria en el dendograma cogiendo todos los clusters formados por la línea azul, observamos que se genera 5 clusters.

Analizamos el indicador de silueta

Añadimos la variable cluster a nuestro set de datos original y obtenemos frecuencias simples para analizar la importancia de los segmentos

(5) Comparación final de metodologías

Para seleccionar el mejor método de segmentación se utilizó el criterio de silueta, siendo el algoritmo kmeans el que vence a los demas algoritmos con un indicador de silueta más próximo a uno.

Descarga el código aquí:

https://github.com/cesarqb/Cluster-Analysis-with-python

Fuentes utilizadas:

https://towardsdatascience.com/cluster-analysis-create-visualize-and-interpret-customer-segments-474e55d00ebb

https://www.kaggle.com/kushal1996/customer-segmentation-k-means-analysis