Naturgy — EDA y predicción
Cuatro años de electricidad horaria española (2015–2018): limpios, ingenierizados y predichos 6 horas antes con XGBoost contra una NN de Keras, cara a cara.
Un encargo ficticio de Naturgy planteado como proyecto final de máster. Desde parquets de capa silver ejecuté el EDA completo, feature engineering (poda por VIF, codificación cíclica sin/cos, construcción de lags) y un benchmark dividido cronológicamente entre XGBoost y una red neuronal de Keras — prediciendo carga, precio y generación renovable seis horas adelante.
Qué hace que funcione.
- 01
Eliminadas todas las columnas de predicción TSO day-ahead para evitar fugas de target antes del EDA.
- 02
Poda de multicolinealidad por VIF — con excepciones deliberadas para variables de generación renovable correlacionadas.
- 03
División train/val/test cronológica con el último mes de 2018 reservado por completo — sin shuffle, sin fugas.
— Contexto
Un proyecto final de máster planteado como un encargo ficticio de Naturgy en 2019. El equipo global diseñó el pipeline de GCP (Cloud Storage → Dataproc/Spark → BigQuery → Vertex AI / Power BI). Mi parte fue el notebook analítico: tomar los parquets de capa silver y convertirlos en una historia de predicción defendible.
— El problema
Cuatro años de datos horarios de electricidad española con más de 30 fuentes de generación, variables meteorológicas y un conjunto tentador de predicciones TSO 'day ahead' que habrían filtrado la respuesta. El trabajo: predecir carga, precio y generación renovable seis horas en el futuro, sin trampas.
El proceso, paso a paso.
- 01 Research
Elimina la fuga antes que nada.
El dataset incluye predicciones TSO day-ahead: usarlas es fuga de target. Eliminadas primero 'price day ahead', 'forecast wind onshore day ahead', 'forecast solar day ahead' y 'total load forecast'. Cada métrica posterior es honesta gracias a esta única decisión.
- 02 Research
EDA — distribuciones, outliers, correlaciones sobre un dataset real.
Distribuciones univariantes en cada columna numérica; revisión de outliers con box-plot (se mantuvieron los extremos — las horas de pico de demanda llevan señal); matriz de correlación completa más una matriz focalizada solo en targets sobre carga, precio y total_renewable_generation.
- 03 Build
Feature engineering con VIF + cíclico + lags.
Capados los outliers extremos en una lista reducida de columnas. Transformadas las variables sesgadas hacia la simetría (mediana ≈ media). Poda por VIF (variance inflation factor) — pero se mantuvieron algunas columnas renovables correlacionadas a propósito porque portan señal física distinta. Codificada la `hora` como sin/cos para que el modelo vea 23h → 0h como adyacentes. Añadidos features de lag.
- 04 Build
Pipeline de preprocesado reutilizable.
Toda la transformación envuelta en `preprocess_data_pipeline(energy_path, weather_path)` — una llamada de parquets en bruto a frame listo para el modelo. El mismo camino se ejecuta durante entrenamiento, validación y el test reservado, así que no hay riesgo de deriva sutil entre pasos.
- 05 Model
XGBoost vs NN de Keras — holdout cronológico, sin shuffle.
División en `cutoff = 2018-12-10`: todo lo anterior va a train + validation; diciembre de 2018 se reserva por completo para el test final. Construidos tres targets H+6 (renovable, carga, precio). Entrenado XGBoost dentro de un Pipeline de sklearn; entrenada una MLP de Keras con el mismo preprocesador. Ambos guardados con joblib para reproducibilidad total.
- 06 Ship
Compara en validación, luego en el mes final no visto.
Gráficas actual-vs-predicho lado a lado para ambos modelos en validación, y de nuevo en el holdout de diciembre 2018. El notebook cierra con un veredicto escrito: qué modelo gana en qué target, y en qué se equivoca sistemáticamente cada uno.
9 capturas, un producto.
Cifras, sin adornos.
- H+6 Horizonte de predicción — Multi-target conjunto: carga, precio, renovables
- 2018-12 Mes de test reservado — Cronológico — sin shuffle, sin fugas
- VIF Poda de multicolinealidad — Con excepciones deliberadas en renovables
- XGB ↔ NN Benchmark cara a cara — Mismo pipeline, reproducible con joblib
“Elimina la fuga primero; todo lo que midas después será honesto.
” — Naturgy EDA — principio de trabajo