El aálisis posterior a la agrupación en clusters implica interpretar el significado de cada segmetno identificado. Existen dos enfoques principales:
- Selección previa de características: Priorizar atributos específicos antes de aplicar el algoritmo de clustering
- Selección posterior: Analizar las características diferenciadoras después de obtener los grupos
La visualización gráfica combinada con técnicas de IA permite definir el significado de los clusters. En el contexto científico, se valida el impacto de la ingeniería de características mediante la mejora en la precisión del modelo.
Implementcaión: Evaluación de Métricas de Clustering
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score, calinski_harabasz_score, davies_bouldin_score
import matplotlib.pyplot as plt
# Configuración de parámetros
n_clusters = range(2, 11)
resultados = {
'inercia': [],
'coef_silueta': [],
'indice_ch': [],
'indice_db': []
}
for n in n_clusters:
modelo = KMeans(n_clusters=n, random_state=0)
clusters = modelo.fit_predict(datos_escalados)
# Cálculo de métricas
resultados['inercia'].append(modelo.inertia_)
resultados['coef_silueta'].append(silhouette_score(datos_escalados, clusters))
resultados['indice_ch'].append(calinski_harabasz_score(datos_escalados, clusters))
resultados['indice_db'].append(davies_bouldin_score(datos_escalados, clusters))
print(f"Clusters: {n}, Inercia: {modelo.inertia_:.1f}, Silueta: {resultados['coef_silueta'][-1]:.2f}")
# Visualización comparativa
fig, ejes = plt.subplots(2, 2, figsize=(14, 10))
metricas = list(resultados.keys())
for idx, metrica in enumerate(metricas):
ax = ejes[idx//2, idx%2]
ax.plot(n_clusters, resultados[metrica], 's--')
ax.set_title(metrica.capitalize())
ax.set_xlabel('Número de Clusters')
ax.grid(True)
plt.tight_layout()
plt.show()
Interpretación con SHAP
import shap
explicador = shap.Explainer(modelo_entrenado)
contribuciones = explicador(datos_muestra)
# Diagrama de importancia global
shap.plots.bar(contribuciones[:, :, 0], show=False)
plt.title("Contribución de Características (SHAP)")
plt.gcf().set_size_inches(10, 6)
plt.show()
Distribución de Características Relevantes
features_principales = ['edad', 'presion', 'colesterol', 'glucosa']
fig, axs = plt.subplots(2, 2, figsize=(12, 8))
axs = axs.ravel()
for i, feat in enumerate(features_principales):
axs[i].hist(datos_originales[feat], bins=15, alpha=0.7)
axs[i].set_title(f'Distribución de {feat}')
axs[i].set_xlabel('Valores')
axs[i].set_ylabel('Frecuencia')
plt.tight_layout()
plt.show()