29. Aplicaciones con mineria de datos
Como integrar limpieza, caracteristicas, modelos y decisiones en un flujo de trabajo?
Aplicaciones con mineria de datos
Cerramos el curso conectando datos, calidad, variables, modelos, patrones y soporte de decisiones.
Mapa rapido
| Componente | Uso en clase |
|---|---|
| Excel | KPIs, flags, tablas dinamicas y semaforo. |
| Python | pipeline simple de mineria de datos |
| ML / mineria de datos | Unir analisis, modelos y decision |
1. Pregunta de planta
La mineria de datos no es solo entrenar modelos. Es construir un flujo de trabajo para convertir datos historicos en conocimiento operativo: limpiar, transformar, modelar, interpretar y decidir.
2. Flujo simple
1. Definir pregunta de planta.
2. Revisar calidad de datos.
3. Crear variables utiles.
4. Entrenar o explorar modelos.
5. Interpretar resultados.
6. Convertir hallazgos en accion revisable.
3. Aplicacion en flotacion
Para la sobre-espumacion: limpiamos sensores, creamos variables de estabilidad, usamos modelos supervisados para probabilidad de evento, usamos no supervisado para modos de operacion, y generamos un semaforo de revision.
4. Excel
- KPIs: recuperacion, score_riesgo, eventos.
- Flags: nivel alto, espumante alto, dato raro.
- Tabla dinamica: turno vs evento.
- Semaforo: normal, atencion, critico.
5. Python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
df = pd.read_excel("flotacion_cobre.xlsx").sort_values("fecha_hora")
# 1. Caracteristicas
df["nivel_std_4h"] = df["nivel_celda"].rolling(4).std().fillna(0)
df["rec_delta"] = df["recuperacion_cu"].diff().fillna(0)
df["espumante_alto"] = (df["dosificacion_espumante"] > df["dosificacion_espumante"].quantile(0.75)).astype(int)
features = ["flujo_aire", "nivel_celda", "ph", "p80", "densidad_pulpa", "nivel_std_4h", "rec_delta", "espumante_alto"]
# 2. Modelo supervisado
X = df[features]
y = df["evento_sobre_espumacion"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
clf = LogisticRegression(max_iter=1000).fit(X_train, y_train)
df["prob_evento"] = clf.predict_proba(X)[:, 1]
# 3. Segmentacion no supervisada
X_scaled = StandardScaler().fit_transform(X)
df["modo_operacion"] = KMeans(n_clusters=3, random_state=42, n_init=10).fit_predict(X_scaled)
# 4. Semaforo final
df["semaforo"] = pd.cut(df["prob_evento"], bins=[0, 0.4, 0.7, 1.0], labels=["Verde", "Amarillo", "Rojo"], include_lowest=True)
print(df[["fecha_hora", "modo_operacion", "prob_evento", "semaforo", "recuperacion_cu"]].tail(12))6. Cierre del curso
Mensaje final: La meta no es tener el modelo mas complejo. La meta es tener un flujo que planta pueda entender, revisar y mejorar con datos reales.
