Enfoque guía: Detección de anomalías
Distancia multivariada + umbrales + clasificador — ¿esta hora es rara en flotación?
Ver concepto general MathPlay · Ruta IA matemática (MathPlay) →Detección de anomalías
Integrar norma (unidad 7), σ (unidad 1) y clasificador (unidad 17) en alerta multivariable
Idea central
Anomalía = hora de planta que no se parece al comportamiento normal. No siempre hay etiqueta clara; aquí tenemos sobre_espumacion para validar. Combinamos enfoque geométrico (Curso 1) y supervisado (Curso 2).
Demo: distancia euclídea al punto normal x₀ (mediana histórica): sin evento ≈ 13,8 · con evento ≈ 39,8.
1. Matemática — tres capas de anomalía
d(x) = ‖x − x₀‖ = √Σj (xj − x₀j)²
| Capa | Señal demo | Acción sugerida |
|---|---|---|
| σ rec. 6 h > 3 | Planta nerviosa | Vigilar |
| d > umbral | ~40 vs ~14 | Confirmar anomalía multivariable |
| P(evento) alta | Clasificador | Alerta turno |
2. Anomalía vs clasificación
- Clasificación: aprende frontera evento/no evento con etiquetas.
- Anomalía (geométrica): aprende solo qué es "normal" (x₀) y marca lejanos.
- Isolation Forest (mención): separa puntos raros sin etiqueta — profundizar en Módulo 2 no supervisado.
En flotación, espumante+nivel+aire juntos explican mejor la rareza que un solo sensor.
3. Excel — distancia y alerta
CSV demo · estandarizar cada columna H:M (restar mediana, dividir por DESVEST).
=' Distancia euclídea simplificada (6 vars estandarizadas en fila 2):
=RAIZ(SUMAPRODUCTO((H2-MEDIANA(H$2:H$121))^2/DESVEST(H$2:H$121)^2;
(K2-MEDIANA(K$2:K$121))^2/DESVEST(K$2:K$121)^2;
... ))
=' Umbral d (percentil 90):
=PERCENTIL.INC(columna_d; 0,9)
=' Alerta anomalía:
=SI(d2 > umbral_d; "ANOMALIA"; "OK")
4. Python — detector integrado
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
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 = df[features].values
y = df["sobre_espumacion"].values
scaler = StandardScaler()
X_s = scaler.fit_transform(X)
x0 = np.median(X_s, axis=0)
df["distancia"] = np.linalg.norm(X_s - x0, axis=1)
umbral_d = np.quantile(df["distancia"], 0.90)
df["alerta_dist"] = (df["distancia"] > umbral_d).astype(int)
clf = Pipeline([
("s", StandardScaler()),
("m", LogisticRegression(max_iter=500, class_weight="balanced"))
])
clf.fit(X, y)
df["p_evento"] = clf.predict_proba(X)[:, 1]
df["alerta_integrada"] = (
(df["distancia"] > umbral_d) & (df["p_evento"] > 0.5)
).astype(int)
print(df.groupby("sobre_espumacion")[["distancia","p_evento","alerta_integrada"]].mean())
print("Filas alerta integrada:", df["alerta_integrada"].sum())
5. Investigación sugerida
Para las 14 horas con evento=1: ¿cuántas activan alerta de distancia, clasificador e integrada? ¿Cuál capa tiene mejor recall?
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.
