TRABAJO FINAL ECONOMETRIA - ENERGIA NUCLEAR - SERIES DE TIEMPO
Author
GASCO , LUCRECIA MELANIE
ANALISIS DE SERIE DE TIEMPO APLICADO A LA ENERGIA NUCLEAR
¿Es la transición energética una realidad asociada a la energía nuclear?
Para responder esta pregunta vamos a hacer un análisis de la producción de energía nuclear, partiendo de la información recolectada y centralizada en la base de datos, llamada nuclear_energy. La información fue recolectada de fuentes oficiales:
U.S. Energy Information Administration (EIA),
U.S. Nuclear Regulatory Commission (NRC),
Our World in Data,
World Resources Institute,
Ember Climate.
En la base de datos podemos observar que la información fue recolectada de forma mensual entre los años 1973 y 2024. La información recolectada es:
Nuclear Generating Units, Net Summer Capacity (Unidades de Generación Nuclear, Capacidad Neta en Verano): La capacidad máxima de generación que una unidad puede mantener durante condiciones de verano.
Nuclear Electricity Net Generation (Generación Neta de Electricidad): La cantidad real de electricidad producida y suministrada a la red, descontando la energía consumida por la propia planta.
Nuclear Share of Electricity Net Generation (Participación Nuclear): El porcentaje de la generación total de electricidad que proviene de centrales nucleares.
Nuclear Generating Units, Capacity Factor (Factor de Capacidad): Una medida de la eficiencia operativa, calculada como la generación real dividida por la generación máxima teórica posible en un período.
CARGA DE PAQUETES Y DATOS
# Carga de todos los paquetes necesarios al iniciolibrary(readxl)library(fpp3)library(urca)library(aTSA)library(lubridate)library(dplyr)library(scales)library(ggplot2)library(forecast)library(tseries)# Es una buena práctica para la visualización en la consolaoptions(width =200)# Carga de los datos desde el archivo Excelnuclear_energy <-read_excel("nuclear_energy_overview_eia.xlsx")head(nuclear_energy)
# A tibble: 6 × 6
Year Month `Nuclear Generating Units, Net Summer Capacity` `Nuclear Electricity Net Generation` `Nuclear Share of Electricity Net Generation` `Nuclear Generating Units, Capacity Factor`
<chr> <chr> <chr> <chr> <chr> <chr>
1 1973 January 14.532999999999999 6246 3.9 57.8
2 1973 February 14.532999999999999 5928 4.0999999999999996 60.7
3 1973 March 15.314 6649 4.5 58.4
4 1973 April 15.314 5876 4.2 53.4
5 1973 May 16.173999999999999 5697 3.9 47.3
6 1973 June 18.728999999999999 6784 4.2 50.3
TRANSFORMACION DE DATOS A FORMATO SERIE DE TIEMPO
# Renombrar columnas para un manejo más sencillonuclear_energy_rename <- nuclear_energy %>%rename(Year = Year,Month = Month,Capacity_summer =`Nuclear Generating Units, Net Summer Capacity`,Generation =`Nuclear Electricity Net Generation`,Share =`Nuclear Share of Electricity Net Generation`,Factor =`Nuclear Generating Units, Capacity Factor` )# Se usa make_date para crear una fecha y yearmonth para convertirla al formato de tsibble.# Esta es una forma más robusta que usar paste() y match().nuclear_serie <- nuclear_energy_rename %>%mutate(Date_col =make_date(Year, match(Month, month.name), 1),Date =yearmonth(Date_col) ) %>%as_tsibble(index = Date) %>%select(Date, Capacity_summer, Generation, Share, Factor)nuclear_serie_2 <- nuclear_serie %>%filter(Date <=yearmonth("2023-12"))# correccion las columnas de métricas se leen como character, se deben convertir a numeric.nuclear_ts <- nuclear_serie_2 %>%mutate(Generation =as.numeric(Generation),Capacity_summer =as.numeric(Capacity_summer),Share =as.numeric(Share),Factor =as.numeric(Factor))# Verificamos la estructura final del tsibbleglimpse(nuclear_ts)
Ahora que tenemos la serie armada podemos comenzar a analizar.
ANALISIS GRAFICO
1. ANALISIS DE LA GENERACION DE ENERGIA NUCLEAR
Recordemos que en el dataset, el dato era Nuclear Electricity Net Generation (Generación Neta de Electricidad), que es la cantidad real de electricidad producida y suministrada a la red, descontando la energía consumida por la propia planta.
nuclear_ts %>%autoplot(Generation) +labs(title ="Generación Nuclear Mensual (1973-2023)",subtitle ="Datos hasta diciembre 2023",y ="Generación (MWh)",x ="Fecha") +scale_x_yearmonth(date_breaks ="5 years", date_labels ="%Y") +scale_y_continuous(labels = comma) +# Formato con separadores de milestheme_minimal() +theme(plot.title =element_text(face ="bold", size =14),axis.text.x =element_text(angle =45, hjust =1))
Interpretación:
El gráfico de Generación Nuclear Mensual muestra un crecimiento sostenido desde 1973 hasta principios de los 2000, alcanzando un pico. A partir de entonces, se observa una meseta con fluctuaciones, lo que podría indicar una madurez en la capacidad instalada o un menor ritmo de expansión. La presencia de picos y valles sugiere una posible estacionalidad, algo común en la demanda y producción de energía.
Tendencia:
Crecimiento acelerado (1973-2000)
seguido de estancamiento (2000-2010) y ligero declive (post-2010). -
Eventos clave:
Caída en 2011 (Fukushima) y 2020 (COVID-19).
Estacionalidad: Patrón anual consistente con menor generación en verano por el mantenimiento de reactores.
nuclear_ts %>%gg_subseries(Generation) +labs(title ="Evolución Mensual de la Generación Nuclear",subtitle ="Promedio mensual por décadas",y ="Generación (MWh)") +scale_y_continuous(labels = comma) +theme_minimal()
Interpretación:
El gráfico de subseries de la generación nuclear refuerza la idea de estacionalidad. Observamos que, en general, los meses de verano (junio, julio, agosto) y los meses de invierno (diciembre, enero) tienden a mostrar una mayor generación. Esto podría estar relacionado con picos en la demanda de electricidad para refrigeración y calefacción, respectivamente, lo que impulsaría una mayor operación de las plantas nucleares. A lo largo de las décadas, la forma de la subserie mensual parece bastante consistente, lo que sugiere un patrón estacional estable.
nuclear_ts %>%gg_season(Generation, period ="year") +labs(title ="Patrón Estacional Anual de la Generación Nuclear",y ="Generación (MWh)",x ="Mes") +scale_y_continuous(labels = comma) +theme_minimal() +theme(legend.position ="bottom")
Interpretación:
El gráfico estacional de la generación nuclear confirma el patrón observado en las subseries. Claramente, los meses de junio, julio y agosto muestran consistentemente los niveles más altos de generación, seguidos por un repunte en diciembre y enero. Los meses de primavera (marzo, abril, mayo) y otoño (septiembre, octubre, noviembre) suelen presentar una menor generación. Esta estacionalidad anual es un componente crucial a considerar al modelar y pronosticar la serie.
En los tres graficos puedo concluir que existe una estacionariedad, que vamos analizar mediante herramientas estadisticas formales.
2. CAPACIDAD
nuclear_ts %>%autoplot(Capacity_summer) +labs(title ="Capacidad Neta de Verano de Energía Nuclear (1973-2023)",subtitle ="Datos hasta diciembre 2023",y ="porcentaje",x ="Fecha") +scale_x_yearmonth(date_breaks ="5 years", date_labels ="%Y") +scale_y_continuous(labels = comma) +theme_minimal() +theme(plot.title =element_text(face ="bold", size =14),axis.text.x =element_text(angle =45, hjust =1))
Interpretacion:
El gráfico muestra que la energía nuclear ha mantenido un alto Factor de Capacidad (entre 50% y 75%) de forma consistente desde 1973 hasta 2023, lo que refleja su extraordinaria eficiencia operativa y fiabilidad como fuente de energía base. Este alto porcentaje indica que las plantas nucleares operaron cerca de su máxima capacidad teórica durante décadas, con mínimos tiempos de parada gracias a mantenimientos optimizados y ciclos de combustible eficientes; las eventuales caídas temporales (por debajo del 50%) probablemente se asocien a actualizaciones de seguridad post-accidentes nucleares, regulaciones más estrictas, o desafíos climáticos en verano que afectaron los sistemas de refrigeración. La estabilidad reciente cerca del 75% confirma su madurez técnica, aunque factores como políticas de cierre (ej. Alemania) o presión económica pudieron generar ligeras fluctuaciones regionales hacia 2023. En esencia, este desempeño subraya por qué la energía nuclear sigue siendo clave para una generación eléctrica estable y continua.
3. PARTICIPACION NUCLEAR
nuclear_ts %>%autoplot(Share) +labs(title ="Participación Nuclear en la Generación Total Mensual (1973-2023)",subtitle ="Datos hasta diciembre 2023",y ="Participación (%)",x ="Fecha") +scale_x_yearmonth(date_breaks ="5 years", date_labels ="%Y") +scale_y_continuous(labels = percent) +# Usar formato de porcentajetheme_minimal() +theme(plot.title =element_text(face ="bold", size =14),axis.text.x =element_text(angle =45, hjust =1))
Interpretacion:
El gráfico revela que la participación de la energía nuclear en la generación eléctrica total mensual ha experimentado cambios significativos entre 1973 y 2023, mostrando un crecimiento inicial constante hasta alcanzar su pico máximo (probablemente entre los años 80 y 2000), seguido de un declive moderado en décadas recientes. Las variaciones mensuales reflejan factores estacionales (como mayor demanda en verano que puede elevar o reducir su participación relativa frente a otras fuentes), mientras que la tendencia a largo plazo está marcada por la construcción de nuevas plantas, cierres anticipados (por políticas o accidentes como Fukushima 2011), y la expansión de energías renovables que reducen su porcentaje en el mix global. Hacia 2023, su participación se estabiliza en niveles significativos (aunque inferiores a sus máximos históricos), evidenciando su papel como fuente estable en la transición energética, pese a desafíos políticos y competencia tecnológica.
4. FACTOR DE CAPACIDAD
nuclear_ts %>%autoplot(Factor) +labs(title ="Factor de Capacidad de la Energía Nuclear (1973-2023)",subtitle ="Datos hasta diciembre 2023",y ="Factor de Capacidad (%)",x ="Fecha") +theme_minimal() +theme(plot.title =element_text(face ="bold", size =14),axis.text.x =element_text(angle =45, hjust =1))
interpretacion:
La energía nuclear mantuvo una excelente eficiencia (>80%) durante décadas, con una caída moderada post-2010 por factores externos (políticos/accidentes) y una recuperación reciente, confirmando su importancia en la generacion de energia y su eficiencia , en comparacion con las demas fuentes generadoras de energia.
# A tibble: 1 × 5
mean sd min max obs
<dbl> <dbl> <dbl> <dbl> <int>
1 76.4 16.3 34.6 102. 612
Interpretación:
Estadístico
Valor
Interpretación
Media (mean)
76.43%
Alta eficiencia operativa: Las plantas nucleares operan normalmente al 76% de su capacidad máxima, demostrando su fiabilidad como fuente de energía base.
Desv. Estándar (sd)
16.27%
Variabilidad significativa: Fluctuaciones del ±16% indican impactos por mantenimiento, paradas no programadas o condiciones climáticas extremas.
Mínimo (min)
34.6%
Crisis operativa: Valor excepcionalmente bajo (ej.: paradas múltiples por accidentes, desastres naturales o problemas técnicos graves).
Máximo (max)
101.6%
Sobrecapacidad puntual: Operación excepcional por encima del 100% (posiblemente por optimización temporal o mediciones ajustadas).
Observaciones (obs)
612
Serie histórica completa: Datos mensuales de 51 años (1973-2023), asegurando análisis robustos.
ANALISIS DE ESTACIONARIEDAD
a. Serie Generación
# Test de Dickey-Fuller Aumentado (ADF) para la serie original# H0: La serie tiene raíz unitaria (es no estacionaria).# H1: La serie es estacionaria.adf.test(nuclear_ts$Generation, alternative ="stationary")
Augmented Dickey-Fuller Test
data: nuclear_ts$Generation
Dickey-Fuller = -1.9386, Lag order = 8, p-value = 0.6043
alternative hypothesis: stationary
El p-valor > 0.05, por lo tanto, no rechazamos \(H_0\). La serie es no estacionaria y necesita ser diferenciada para modelar con ARIMA, que requiere estacionariedad.
###############################################
# Augmented Dickey-Fuller Test Unit Root Test #
###############################################
Test regression trend
Call:
lm(formula = z.diff ~ z.lag.1 + 1 + tt + z.diff.lag)
Residuals:
Min 1Q Median 3Q Max
-11623.2 -2710.7 211.4 3008.6 10758.3
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3191.44173 529.96719 6.022 2.99e-09 ***
z.lag.1 -0.15603 0.02081 -7.499 2.29e-13 ***
tt 15.22447 2.30223 6.613 8.28e-11 ***
z.diff.lag 0.15579 0.04022 3.874 0.000119 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 4305 on 606 degrees of freedom
Multiple R-squared: 0.09052, Adjusted R-squared: 0.08602
F-statistic: 20.11 on 3 and 606 DF, p-value: 1.963e-12
Value of test-statistic is: -7.4992 18.892 28.1859
Critical values for test statistics:
1pct 5pct 10pct
tau3 -3.96 -3.41 -3.12
phi2 6.09 4.68 4.03
phi3 8.27 6.25 5.34
#misma prueba con otra libreria que da mas informacion para interpretar mejor. encontramos problemas nuevos (sad)
El test de Dickey-Fuller Aumentado (ADF) aplicado a la serie de generación nuclear revela que la serie no es estacionaria en su forma original, a pesar de que el estadístico de prueba (-7.499) es más negativo que los valores críticos estándar. Esto se debe a que la serie presenta una fuerte tendencia temporal positiva (confirmada por la significancia del término tt con coeficiente 15.22) y una tendencia lineal (indicada por el intercepto significativo de 3191.44). Aunque se rechaza formalmente la hipótesis nula de raíz unitaria, esto solo es válido en el contexto de un modelo que incluye componentes determinísticos (tendencia e intercepto).
La presencia de autocorrelación (z.diff.lag significativo) y heterocedasticidad en los residuales indica que la serie necesita transformaciones (diferenciación y posiblemente transformación logarítmica) para lograr estacionariedad débil antes de modelarse con técnicas como ARIMA.
# Diferenciamos la serie para hacerla estacionariadiff_series_Generaton <-diff(nuclear_ts$Generation)# CORRECCIÓN: Se usaba 'diff_series' en lugar de 'diff_series_Generaton'# Verificamos si la serie diferenciada es estacionariaadf.test(diff_series_Generaton, alternative ="stationary")
Warning in adf.test(diff_series_Generaton, alternative = "stationary"): p-value smaller than printed p-value
Augmented Dickey-Fuller Test
data: diff_series_Generaton
Dickey-Fuller = -12.839, Lag order = 8, p-value = 0.01
alternative hypothesis: stationary
El p-valor < 0.01, por lo que ahora hay evidencia suficiente para rechazar \(H_0\). La serie diferenciada de primer orden es estacionaria (\(d=1\)). Ahora buscamos los órdenes \(p\) y \(q\) para el modelo ARIMA.
Vamos a logalizar para cumplir con las recomendaciones de la prueba Dickey-Fuller- aumentada:
Augmented Dickey-Fuller Test
data: serie_transformada$Generation
Dickey-Fuller = -1.9386, Lag order = 8, p-value = 0.6043
alternative hypothesis: stationary
# 1. Eliminar la primera fila (NA) de la serie transformadaserie_transformada <- nuclear_ts %>%mutate(log_gen =log(Generation),diff_log_gen =difference(log_gen) ) %>%slice(-1) # Elimina la primera fila (fila con NA en diff_log_gen)adf.test(serie_transformada$Generation)
Augmented Dickey-Fuller Test
data: serie_transformada$Generation
Dickey-Fuller = -1.9454, Lag order = 8, p-value = 0.6014
alternative hypothesis: stationary
Bueno podemos ver claramente que la serie no es estacionaria, porque el p-valor es > 0.05 ; asi que en vez de llorar vamos a trabajar esta serie de tiempo sobre la energia nuclear como una serie de tendencia pero como no sabemos manejar al 100% , los modelos Sarima, voy a intentar volver a diferenciar.
Warning in adf.test(na.omit(serie_transformada_2$diff_log_gen)): p-value smaller than printed p-value
Augmented Dickey-Fuller Test
data: na.omit(serie_transformada_2$diff_log_gen)
Dickey-Fuller = -12.2, Lag order = 8, p-value = 0.01
alternative hypothesis: stationary
Bueno podemos ver claramente que la serie no es estacionaria, porque el p-valor es < 0.05 ; asi que podemos
# Analizar ACF y PACF de la serie diferenciada para proponer órdenes p y qggAcf(serie_transformada$Generation)
ggPacf(serie_transformada$Generation)
Interpretación: (Tu interpretación de los gráficos ACF y PACF para elegir p y q).
# Probar modelos ARIMA candidatosmodel_g_1 <-arima(serie_transformada$Generation, order =c(1, 1, 1))model_g_2 <-arima(serie_transformada$Generation, order =c(2, 1, 1))# Test de Ljung-Box para autocorrelación en los residuos# H0: Los residuos se distribuyen de forma independiente (no hay autocorrelación).# H1: Hay autocorrelación.Box.test(model_g_1$residuals, type ="Ljung-Box")
Call:
arima(x = nuclear_ts$Generation, order = c(4, 1, 1))
Coefficients:
ar1 ar2 ar3 ar4 ma1
-0.1185 -0.2912 -0.5498 -0.3535 -0.2545
s.e. 0.0688 0.0312 0.0329 0.0529 0.0696
sigma^2 estimated as 9776256: log likelihood = -5785.31, aic = 11582.63
Training set error measures:
ME RMSE MAE MPE MAPE MASE ACF1
Training set 306.2319 3124.145 2435.128 0.7504104 5.598274 0.6782875 -0.01621583
Interpretación: El test de Ljung-Box para model_g_3 tiene un p-valor > 0.05, indicando que no hay autocorrelación en los residuos.
checkresiduals(model_g_3)
Ljung-Box test
data: Residuals from ARIMA(4,1,1)
Q* = 79.129, df = 5, p-value = 1.221e-15
Model df: 5. Total lags used: 10
Interpretación: El gráfico de residuos muestra que se comportan como ruido blanco, lo cual es un buen indicio de la calidad del modelo.
Comparemos los modelos usando el criterio de información de Akaike (AIC) para seleccionar el mejor (el de menor AIC).
AIC(model_g_1)
[1] 11992.31
AIC(model_g_2)
[1] 11720.72
AIC(model_g_3)
[1] 11582.63
# El modelo con el menor AIC es el mejor.
PRONÓSTICO DE LA GENERACIÓN
# Usamos el mejor modelo (model_g_3) para pronosticar 24 meses hacia adelantepronostico_generacion <-forecast(model_g_3, h =24)autoplot(pronostico_generacion) +labs(title ="Generación Nuclear: Histórico y Pronóstico 2024-2025",x ="Año",y ="Generación (GWh)") +theme_minimal()
adf.test(na.omit(nuclear_ts$Capacity_summer), alternative ="stationary")
Augmented Dickey-Fuller Test
data: na.omit(nuclear_ts$Capacity_summer)
Dickey-Fuller = -2.5732, Lag order = 8, p-value = 0.3357
alternative hypothesis: stationary
c. Serie Participación
adf.test(na.omit(nuclear_ts$Share), alternative ="stationary")
Augmented Dickey-Fuller Test
data: na.omit(nuclear_ts$Share)
Dickey-Fuller = -2.8209, Lag order = 8, p-value = 0.2308
alternative hypothesis: stationary
d. Serie Factor
adf.test(na.omit(nuclear_ts$Factor), alternative ="stationary")
Augmented Dickey-Fuller Test
data: na.omit(nuclear_ts$Factor)
Dickey-Fuller = -3.4467, Lag order = 8, p-value = 0.04743
alternative hypothesis: stationary