Análisis y predicción de series temporales de contaminantes atmosféricos (NO₂ y CO) en la ciudad de Madrid durante el período 2001-2018. El proyecto incluye limpieza de datos, análisis de estacionariedad (tests ADF y KPSS), descomposición estacional, transformación Box-Cox, diferenciación, y aplicación de modelos ARIMA y suavizado exponencial (SES, Holt, Holt-Winters) para pronóstico.
La organización de los archivos en este repositorio es la siguiente:
madrid-air-pollution-time-series-forecasting/
├── Madrid_Air_Pollution_Forecasting.ipynb # Notebook principal
├── requirements.txt # Dependencias de Python
├── LICENSE # Licencia MIT
├── .gitignore # Archivos ignorados
└── README.md # Este archivo
Fuente: Air Quality in Madrid (2001-2018) en Kaggle
Autor: decide-soluciones
Fuente original: Ayuntamiento de Madrid (Open Data)
Licencia: Open Data (uso libre con atribución)
| Característica | Descripción |
|---|---|
| Período | 2001 - 2018 (18 años) |
| Frecuencia | Mediciones horarias |
| Contaminantes | NO₂ (µg/m³), CO (mg/m³) |
| Estructura | Archivos CSV anuales (madrid_2001.csv a madrid_2018.csv) |
| Estaciones | Múltiples estaciones de monitoreo en Madrid |
git clone https://github.com/SebastianDeghi/madrid-air-pollution-time-series-forecasting.git
cd madrid-air-pollution-time-series-forecasting- En Windows:
python -m venv venv venv\Scripts\activate
- En macOS/Linux:
python3 -m venv venv source venv/bin/activate
Con el entorno virtual activo, instala los paquetes necesarios:
pip install -r requirements.txtNota: El archivo requirements.txt incluye las siguientes librerías:
numpypandasmatplotlibseabornscipystatsmodelspmdarimascikit-learnjoblibkagglehubjupytertqdmsession-info
Finalmente, lanza Jupyter Notebook para abrir el archivo principal:
jupyter notebook Madrid_Air_Pollution_Forecasting.ipynb El notebook descargará automáticamente el dataset desde Kaggle usando kagglehub. Si es la primera vez, asegúrate de tener configuradas tus credenciales de Kaggle.
- Carga y concatenación de archivos CSV anuales
- Agregación diaria (promedio entre estaciones)
- Visualización de series temporales (diarias, mensuales, anuales)
- Test ADF (Augmented Dickey-Fuller): Hipótesis nula → serie no estacionaria
- Test KPSS (Kwiatkowski-Phillips-Schmidt-Shin): Hipótesis nula → serie estacionaria
- Interpretación combinada de ambos tests
- Modelo aditivo y multiplicativo
- Separación en componentes: Tendencia + Estacionalidad + Residuo
- Box-Cox: Estabilización de varianza
- Diferenciación (orden 1): Eliminación de tendencia
| Modelo | Descripción | Parámetros |
|---|---|---|
| ARIMA | Autoregressive Integrated Moving Average | p, d, q (seleccionados automáticamente con auto_arima) |
| SES | Simple Exponential Smoothing | α (smoothing level) |
| Holt | Doble suavizado exponencial (con tendencia) | α, β |
| Holt-Winters | Triple suavizado exponencial (tendencia + estacionalidad) | α, β, γ, s |
- MSE (Mean Squared Error): Penaliza errores grandes
- RMSE (Root Mean Squared Error): Error en unidades originales
- MAE (Mean Absolute Error): Robusto a outliers
- MAPE (Mean Absolute Percentage Error): Error relativo porcentual
| Contaminante | Tendencia | Estacionalidad | Mejor Modelo |
|---|---|---|---|
| NO₂ | Descendente (políticas de control de emisiones) | Fuerte (mayor en invierno) | Holt-Winters |
| CO | Descendente pronunciado (mejora tecnológica) | Suave | Holt-Winters |
| Gas | ADF (p-value) | KPSS (p-value) | Conclusión |
|---|---|---|---|
| NO₂ | < 0.05 (estacionaria) | < 0.05 (no estacionaria) | Estacionaria en diferencia (tiene tendencia) |
| CO | < 0.05 (estacionaria) | < 0.05 (no estacionaria) | Estacionaria en diferencia (tiene tendencia) |
| Gas | λ Box-Cox | ADF (p-value) | KPSS (p-value) | Estado |
|---|---|---|---|---|
| NO₂ | 0.489 | < 0.0001 | > 0.05 | Estacionaria |
| CO | -0.572 | < 0.0001 | > 0.05 | Estacionaria |
- Series temporales diarias de NO₂ y CO
- Promedios mensuales y anuales
- Descomposición estacional (aditiva y multiplicativa)
- Comparación antes/después de transformaciones
- Pronóstico ARIMA con intervalos de confianza
- Comparativa de modelos de suavizado exponencial
- Gráfico de barras de métricas de error
| Categoría | Librerías |
|---|---|
| Cálculo científico | numpy, pandas, scipy |
| Visualización | matplotlib, seaborn |
| Series temporales | statsmodels, pmdarima |
| Machine Learning | scikit-learn, joblib |
| Jupyter | jupyter, ipykernel, session-info |
| Utilidades | tqdm, kagglehub |
Este proyecto está bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.
- decide-soluciones por publicar el dataset en Kaggle
- Ayuntamiento de Madrid por proporcionar los datos abiertos
- Comunidad open source por
statsmodels,pmdarima,scipyy demás librerías
- Box, G. E. P., Jenkins, G. M., Reinsel, G. C., & Ljung, G. M. (2015). Time Series Analysis: Forecasting and Control. John Wiley & Sons.
- Hyndman, R. J., & Athanasopoulos, G. (2018). Forecasting: Principles and Practice. OTexts.
- Statsmodels Documentation
- pmdarima Documentation
Sebastián Deghi
- GitHub: @SebastianDeghi
- LinkedIn: @sebastian-deghi
- Google Scholar: @Sebastian E. Deghi