Detección predictiva de fallos en rodamientos industriales mediante procesamiento de señales vibratorias y Machine Learning no supervisado.
Un rodamiento que falla sin aviso puede detener una línea de producción entera. El coste no es solo la pieza (€50-500), sino las horas de paro no planificado (€10,000+/hora en industria pesada). La pregunta no es si va a fallar — todos los rodamientos fallan — sino cuándo, con tiempo suficiente para programar el mantenimiento.
Este proyecto implementa un pipeline completo de Condition Monitoring predictivo que:
- Extrae la huella digital de cada segundo de vibración en 4 métricas (dominio tiempo + frecuencia)
- Aprende qué es "normal" con un modelo ligero entrenado exclusivamente con datos sanos
- Detecta la degradación ~55 horas antes del fallo catastrófico
Aplicado al dataset NASA IMS Bearing (2nd Test), el sistema genera la primera alerta consistente el 16 de febrero a las 22:22, mientras que el fallo catastrófico ocurre el 19 de febrero a las 05:42 — 2.3 días de margen operativo.
| Criterio | Isolation Forest | Red Neuronal (LSTM/Autoencoder) |
|---|---|---|
| Datos necesarios | Solo datos sanos (~200 muestras) | Miles de muestras + datos de fallo |
| Tiempo de entrenamiento | < 1 segundo | Minutos/horas + GPU |
| Interpretabilidad | Alta (anomaly score directo) | Baja (caja negra) |
| Despliegue en Edge | ~50 KB en memoria | ~50-500 MB + runtime |
| Mantenimiento | Re-entrenar con fit() |
Re-entrenar + validar arquitectura |
En un entorno industrial real, el modelo corre en un PLC o gateway IoT junto al sensor de vibración. Un Isolation Forest puede ejecutarse en un microcontrolador con 256 KB de RAM. Una red neuronal profunda necesita un servidor dedicado o conexión cloud — añadiendo latencia y un punto de fallo.
Además, en la realidad industrial casi nunca hay datos de máquinas rotas para entrenar. Las máquinas se reparan antes de que fallen catastróficamente. El aprendizaje no supervisado resuelve este problema: solo necesita saber qué aspecto tiene una máquina sana.
Signal (20,480 puntos @ 20 kHz)
├── Dominio del Tiempo
│ ├── RMS ─────────────── Energía total de vibración
│ ├── Kurtosis ────────── Impactos secos (grietas, spalling)
│ └── Crest Factor ────── Ratio pico/RMS (detector temprano)
└── Dominio de Frecuencia
└── Frecuencia Dominante ── Desplazamiento espectral por defecto
- RMS sube cuando la vibración general aumenta — pero reacciona tarde, cuando el daño ya es severo.
- Kurtosis detecta los micro-impactos de una grieta incipiente antes de que el RMS se mueva. Un rodamiento sano tiene kurtosis ~0 (distribución gaussiana). Cuando aparecen impactos, sube a valores >3.
- Crest Factor captura picos aislados que el RMS promedia y suaviza. Es el primer indicador en moverse.
- Frecuencia Dominante cambia de ~1009 Hz (resonancia normal del eje) a ~4500 Hz cuando aparecen frecuencias de defecto (BPFO, BPFI). Esta feature integra el análisis espectral FFT en el pipeline ML.
Las primeras 200 muestras cubren los 2 primeros días del experimento (Feb 12-13). Esto captura:
- Variaciones normales entre ciclos de carga
- Fluctuaciones térmicas (día/noche)
- Suficiente diversidad estadística para que el modelo no sobreajuste a un único estado
Usar más muestras (ej. 400) arriesga incluir el inicio de la degradación, contaminando el concepto de "normalidad".
nasa_dataset/
├── 01_feature_engineering.py # Extracción de features: señal → CSV
├── 02_anomaly_detection.py # Isolation Forest + visualización
├── bearing_analysis_v2.py # Análisis exploratorio (RMS trend + FFT)
├── requirements.txt # Dependencias pinneadas
├── data/
│ └── 2nd_test/2nd_test/ # 984 archivos de vibración (NASA IMS)
└── output/
├── features_bearing1.csv # 984 × 5 features extraídas
├── predictions_bearing1.csv # Predicciones del modelo
├── anomaly_dashboard.png # Dashboard 5 paneles
├── prediction_timeline.png # Timeline normal/anomalía
├── rms_trend.png # Tendencia RMS vida completa
├── spectral_analysis.png # FFT sano vs fallo
└── fft_overlay.png # FFT superpuesta (escala log)
# 1. Clonar e instalar
git clone <repo-url>
cd nasa_dataset
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 2. Descargar dataset NASA IMS (2nd Test)
# https://www.nasa.gov/content/prognostics-center-of-excellence-data-set-repository
# 3. Ejecutar pipeline
python 01_feature_engineering.py # → output/features_bearing1.csv
python 02_anomaly_detection.py # → output/anomaly_dashboard.png + predicciones| Métrica | Valor |
|---|---|
| Archivos procesados | 984 |
| Features extraídas | 4 (RMS, Kurtosis, Crest Factor, Freq. Dominante) |
| Muestras de entrenamiento | 200 (solo datos sanos) |
| Primera alerta consistente | Feb 16, 22:22 |
| Fallo catastrófico | Feb 19, 05:42 |
| Antelación de la alerta | 55.3 horas (~2.3 días) |
El análisis FFT confirma la degradación a nivel de frecuencia. En estado sano, la señal tiene un único pico a ~1009 Hz (frecuencia de rotación). En el momento del fallo, aparecen múltiples picos armónicos entre 2-5 kHz correspondientes a frecuencias de defecto del rodamiento.
NASA IMS Bearing Dataset — Intelligent Maintenance Systems Center, University of Cincinnati.
4 rodamientos Rexnord ZA-2115, carga radial 6000 lbs, velocidad 2000 RPM.
Sensor: acelerómetro PCB 353B33, muestreo a 20 kHz.
Duración: 7 días continuos hasta fallo del Bearing 1 (outer race failure).
- NumPy / SciPy: Procesamiento de señal y FFT
- pandas: Estructuración y exportación de features
- scikit-learn: Isolation Forest + StandardScaler
- matplotlib: Visualización de series temporales y dashboards

