18. Detección de anomalías
¿Cómo detectar condiciones raras antes de que el problema sea evidente?
Detección de anomalías
Combinamos distancia, error y etiquetas históricas para reconocer condiciones operativas que se alejan de lo normal.
1. Pregunta de planta
Una anomalía es una condición que no se parece al comportamiento normal de la planta.
Idea central: en aprendizaje supervisado, usamos etiquetas históricas para aprender qué patrones suelen estar asociados a condiciones anómalas.
Normal = comportamiento esperado
Anómalo = condición rara, riesgosa o fuera de patrón
2. Matemática simple
La detección de anomalías puede verse como una combinación de distancia, error y etiqueta.
| Enfoque | Idea | Ejemplo |
|---|---|---|
| Distancia | Lejos de lo normal. | Norma o distancia respecto a una condición promedio. |
| Error | Lo real se aleja de lo estimado. | Recuperación real muy distinta de recuperación predicha. |
| Etiqueta | Aprender eventos conocidos. | Usar evento_sobre_espumacion como clase. |
Lectura simple: una anomalía no siempre es una falla. Es una condición que merece revisión.
3. Aplicación en flotación
Podemos buscar anomalías en varios niveles:
- Anomalía de proceso: nivel, aire o espumante fuera de patrón.
- Anomalía metalúrgica: recuperación real cae más de lo esperado.
- Anomalía de riesgo: score alto sin evento confirmado, o evento sin score alto.
- Anomalía de sensor: señal plana, saltos bruscos o valores imposibles.
4. Excel: anomalía por distancia simple
Primero estandarizamos variables para que estén en escala comparable.
Z-score de aire
=(I2-PROMEDIO(I:I))/DESVEST.M(I:I)
Z-score de nivel
=(J2-PROMEDIO(J:J))/DESVEST.M(J:J)
Distancia simple
=RAIZ(z_aire^2 + z_nivel^2 + z_espumante^2 + z_score^2)
Alerta
=SI(distancia>PERCENTIL.INC(rango_distancia,0.90),"Anómalo","Normal")
5. Python: detección supervisada y por distancia
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
archivo = "flotacion_cobre.xlsx"
df = pd.read_excel(archivo)
features = [
"flujo_aire", "nivel_celda", "ph", "dosificacion_espumante",
"p80", "densidad_pulpa", "score_riesgo"
]
X = df[features]
y = df["evento_sobre_espumacion"]
# 1) Anomalía por distancia al comportamiento medio
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
centro = X_scaled.mean(axis=0)
df["distancia_normal"] = np.linalg.norm(X_scaled - centro, axis=1)
df["alerta_distancia"] = (df["distancia_normal"] > df["distancia_normal"].quantile(0.90)).astype(int)
# 2) Modelo supervisado usando etiquetas de evento
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
modelo = RandomForestClassifier(n_estimators=200, random_state=42)
modelo.fit(X_train, y_train)
pred = modelo.predict(X_test)
print(classification_report(y_test, pred))
6. Lectura operativa
La detección de anomalías sirve para priorizar revisión, no para declarar causa automática.
Buen uso: avisar que una condición no se parece a la operación normal.
Mal uso: asumir que toda anomalía es sobre-espumación o que todo evento debe corregirse igual.
Mensaje final: detectar anomalías es aprender a reconocer cuándo la planta se aleja de su zona conocida antes de que el problema sea evidente.
