Enfoque guía: Clustering
Agrupar horas de planta sin etiqueta — ¿operación estable o bajo estrés?
Ver concepto general MathPlay · Ruta IA matemática (MathPlay) →Clustering
Descubrir modos de operación en la celda — sin usar sobre_espumacion para entrenar
Puente desde Módulo 1
En el Módulo 1 el modelo sabía la respuesta (recuperación, evento sí/no). En no supervisado la computadora solo ve sensores y busca grupos naturales: “estas horas se parecen entre sí”.
Problema en planta: a veces no hay bitácora clara de espuma, pero sí muchas horas de DCS. Clustering responde: ¿cuántos “estilos” de operación hay? ¿uno estable y otro bajo estrés?
Validación educativa: en el demo usamos sobre_espumacion solo después, para ver si los grupos tienen sentido metalúrgico.
1. Matemática — K-means
minC Σk Σx∈Ck ‖x − μk‖²
Idea simple: elige K centros (μk). Cada hora va al centro más cercano. Repite hasta que los grupos no cambien.
Distancia: la misma norma euclídea de la unidad 7 — aquí en 6 sensores estandarizados (pH, P80, aire, espumante, nivel, ley cabeza).
Demo K=2 (n=120, sin usar etiquetas)
| Cluster | Horas | Rec. media | % con espuma* | Lectura en turno |
|---|---|---|---|---|
| 0 — estrés | 14 | 76,5 % | 100 % | Espumante alto, nivel alto, rec. baja |
| 1 — estable | 106 | 86,4 % | 0 % | Operación habitual del demo |
*Validación post-hoc; el algoritmo no vio esta columna.
2. Escalera de métodos
Salida operativa: etiqueta de cluster por hora en el historiador. Panel: “% del turno en cluster estrés”.
3. Excel — agrupación manual (K=2)
CSV demo · estandarizar columnas H:M (restar media, dividir por DESVEST).
=' Distancia al "centro estable" (mediana de filas sin evento en demo):
=RAIZ(SUMAPRODUCTO((H2-H_med)^2 + ... ))
=' Distancia al "centro estrés" (mediana filas con evento):
=RAIZ(...)
=' Cluster asignado (0 o 1):
=SI(dist_estres < dist_estable; 0; 1)
=' Recuperación media por cluster:
=PROMEDIO.SI(cluster_col; G_col; 0)
En clase: comparen su cluster con sobre_espumacion. ¿Coincide la mayoría?
4. Python — K-means
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
features = ["ph","p80_um","flujo_aire","dosif_espumante_ml_min","nivel_celda_pct","ley_cabeza_cu_pct"]
df = pd.read_csv("datos_flotacion_demo.csv")
X = StandardScaler().fit_transform(df[features])
km = KMeans(n_clusters=2, random_state=42, n_init=10)
df["cluster"] = km.fit_predict(X)
for c in sorted(df["cluster"].unique()):
sub = df[df["cluster"] == c]
print(f"Cluster {c}: n={len(sub)}",
f"rec={sub['recuperacion_cu_pct'].mean():.1f}",
f"espuma%={sub['sobre_espumacion'].mean()*100:.0f}")
# Silhouette (calidad de separación)
from sklearn.metrics import silhouette_score
print("Silhouette:", round(silhouette_score(X, df["cluster"]), 2))
5. Investigación sugerida
Prueba K=3 y K=4. ¿Aparece un tercer grupo (p.ej. ley cabeza alta)? ¿Sigue teniendo sentido para el jefe de turno?
Regístrate al boletín MathPlay
Datos, simulación, visualización, IA y tecnología aplicada a problemas reales de industria y minería.
Sin calendario fijo. Sin spam.
Listo. Te escribo cuando haya algo nuevo.
