Análisis exploratorio de datos (EDA)
Análisis de series de tiempo
Análisis de modelo predictivo
Análisis integrado con datos externos
Sugerencias de indicadores claves de desarrollo (KPI)
Análisis general y conclusiones
#Importamos base de datos
demand <- read_excel("Interviews/Bia Energy/demand.xlsx")
# Eliminar las primeras n filas
n <- 4
df <- demand %>% slice((n+1):n()) #eliminar primeras 4
# Eliminar las últimas n filas
n <- 1
df <- df %>% slice(1:(n() - n))
# Convertir la columna de fecha a formato fecha
df$fecha <- as.Date(df$"Unidad Energía")
# Verificar cuántos NA hay en la columna 'fecha'
if (sum(is.na(df$fecha)) > 0) {
print("Hay valores NA en la columna 'fecha'.")
} else {
print("No hay valores NA en la columna 'fecha'.")
}
## [1] "No hay valores NA en la columna 'fecha'."
#Nombre actual de las variables
colnames(df)
## [1] "Unidad Energía" "GWh" "...3" "...4"
## [5] "...5" "...6" "...7" "...8"
## [9] "...9" "...10" "...11" "...12"
## [13] "...13" "...14" "...15" "...16"
## [17] "...17" "...18" "...19" "...20"
## [21] "...21" "...22" "...23" "...24"
## [25] "...25" "...26" "fecha"
#renombramos variables
colnames(df) <- c("borrar","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","Total","fecha" )
colnames(df)
## [1] "borrar" "1" "2" "3" "4" "5" "6" "7"
## [9] "8" "9" "10" "11" "12" "13" "14" "15"
## [17] "16" "17" "18" "19" "20" "21" "22" "23"
## [25] "24" "Total" "fecha"
# Convertir la columna de "Grand Total" a tipo numero
df$Total=as.numeric(df$Total)
# Verificar cuántos NA hay en la columna 'Total'
if (sum(is.na(df$Total)) > 0) {
print("Hay valores NA en la columna 'Total'.")
} else {
print("No hay valores NA en la columna 'Total'.")
}
## [1] "No hay valores NA en la columna 'Total'."
# Crear una nueva columna que contenga el mes
df <- df %>%
mutate(mes = format(fecha, "%m"))
# Agrupar los datos por mes y calcular estadísticas agregadas
df_por_mes <- df %>%
group_by(mes) %>%
summarize(total_GWh = sum(Total),
promedio_GWh = mean(Total),
.groups = "drop") # Esto evita que dplyr imprima el mensaje de "Groups:"
# Ver el resumen de los datos por mes
print(df_por_mes)
## # A tibble: 12 × 3
## mes total_GWh promedio_GWh
## <chr> <dbl> <dbl>
## 1 01 25032. 202.
## 2 02 23733. 210.
## 3 03 25412. 205.
## 4 04 23832. 199.
## 5 05 25067. 202.
## 6 06 24354. 203.
## 7 07 25651. 207.
## 8 08 26004. 210.
## 9 09 25926. 216.
## 10 10 26467. 213.
## 11 11 25664. 214.
## 12 12 26182. 211.
# Crear un gráfico de barras
grafico <- ggplot(df, aes(x = mes, y = Total)) +
geom_bar(stat = "identity", fill = "skyblue") + # Usar geom_bar con stat = "identity" para mostrar la suma total de los gigas de energía
labs(title = "Total de Gigawatts de Energía por Mes", x = "Mes", y = "Total de GWh") + # Etiquetas de título y ejes
theme_minimal() + # Estilo del tema del gráfico
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar las etiquetas del eje x para una mejor legibilidad
# Mostrar el gráfico
print(grafico)
# Crear una nueva columna que contenga el año
df <- df %>%
mutate(año = format(fecha, "%Y"))
# Agrupar los datos por año y calcular estadísticas agregadas
df_por_año <- df %>%
group_by(año) %>%
summarize(total_GWh = sum(Total),
promedio_GWh = mean(Total),
.groups = "drop") # Esto evita que dplyr imprima el mensaje de "Groups:"
# Ver el resumen de los datos por mes
print(df_por_año)
## # A tibble: 4 × 3
## año total_GWh promedio_GWh
## <chr> <dbl> <dbl>
## 1 2020 70625. 193.
## 2 2021 74413. 204.
## 3 2022 77068. 211.
## 4 2023 81217. 223.
# Crear un gráfico de barras
grafico <- ggplot(df, aes(x = año, y = Total)) +
geom_bar(stat = "identity", fill = "skyblue") + # Usar geom_bar con stat = "identity" para mostrar la suma total de los gigas de energía
labs(title = "Total de Gigawatts de Energía por Año", x = "Año", y = "Total de GWh") + # Etiquetas de título y ejes
theme_minimal() + # Estilo del tema del gráfico
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar las etiquetas del eje x para una mejor legibilidad
# Mostrar el gráfico
print(grafico)
Podemos analizar que de los doce meses, el mayor consumo total de GWh es el mes de octubre, con 26.467. Sin embargo, el mes de septiembre es el de mayor consumo promedio con “216”.
Por otro lado, podemos ver que hay una tendencia creciente en el análisis del consumo de energía por año. Donde podemos ver que va incrementando tanto el consumo total, como el consumo promedio.
#cremoas codigo tuveria quitando variables no deseadas
df <- df %>%
select(-c(borrar, Total, mes, año))
# Convertir datos por hora a tipo numérico
df <- df %>%
mutate_at(vars(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24), as.numeric)
### Creamos serie de tiempo con el consumo promedio del dia y el consumo por hora ###
# Crear una columna "Fecha" que combine la fecha y la hora en formato de fecha y hora
df$Fecha <- as.POSIXct(paste(df$fecha, names(df)[1:24], sep = " "), format = "%Y-%m-%d")
# Crear una nueva columna con los valores por hora
df$Valor <- rowMeans(df[,1:24], na.rm = TRUE)
# Seleccionar solo las columnas necesarias
Consumo_promedio_diario <- df[, c("Fecha", "Valor")]
# Creamos cuadro de datos del tiempo con el consumo por hora
# Replicar las fechas 24 veces
fechas_rep <- rep(df$fecha, each = 24)
# Crear un vector con las horas del día
horas <- paste0("0", 1:9) # Horas de 01:00 a 09:00
horas <- c(horas, 10:24) # Horas de 10:00 a 24:00
# Replicar las horas para cada fecha
horas_rep <- rep(horas, length.out = length(fechas_rep))
# Crear una columna "Fecha" que combine la fecha y la hora en formato de fecha y hora
fechas_horas <- paste(fechas_rep, horas_rep, sep = " ")
# Crear una columna "Valor" con los valores correspondientes
valores <- c(t(df[,1:24]))
# Crear el DataFrame final
Consumo_hora <- data.frame(Fecha = as.POSIXct(fechas_horas, format = "%Y-%m-%d %H"), Valor = valores)
#convertimos datos mensuales
datos3 <- Consumo_promedio_diario %>%
mutate(Fecha = as.Date(Fecha))
# Extraer el año y el mes de la columna 'Fecha' y calcular el promedio de 'Valor' por mes
datos_mensuales <- datos3 %>%
mutate(fechas = format(Fecha, "%Y-%m")) %>%
group_by(fechas) %>%
summarise(Valor = mean(Valor, na.rm = TRUE))
# Convertir 'Año_Mes' de vuelta a formato de fecha para que represente el primer día de cada mes
Consumo_promedio_mensual <- datos_mensuales %>%
mutate(fechas = as.Date(paste(fechas, "-01", sep = ""), format = "%Y-%m-%d"))
# Vemos los data frames modificados:
head(df,10) # df original
## # A tibble: 10 × 27
## `1` `2` `3` `4` `5` `6` `7` `8` `9` `10` `11` `12` `13`
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6.60 6.45 6.28 6.14 6.02 5.91 5.50 5.53 5.74 5.99 6.26 6.48 6.62
## 2 6.32 6.10 5.96 5.87 5.94 6.13 6.24 6.72 7.24 7.64 8.03 8.27 8.33
## 3 7.04 6.76 6.58 6.47 6.56 6.72 6.77 7.21 7.80 8.16 8.51 8.77 8.75
## 4 7.20 6.93 6.74 6.59 6.61 6.72 6.68 7.08 7.61 8.01 8.34 8.54 8.57
## 5 7.16 6.87 6.65 6.50 6.41 6.39 6.17 6.38 6.71 7.04 7.31 7.56 7.61
## 6 6.85 6.54 6.37 6.25 6.24 6.25 6.06 6.34 6.73 7.08 7.38 7.64 7.77
## 7 6.89 6.65 6.52 6.44 6.52 6.77 6.88 7.37 8.03 8.40 8.75 9.02 9.02
## 8 7.21 6.93 6.75 6.67 6.79 7.02 7.17 7.70 8.28 8.61 8.96 9.27 9.24
## 9 7.29 7.01 6.81 6.73 6.81 7.04 7.14 7.66 8.23 8.64 8.95 9.20 9.10
## 10 7.30 6.99 6.76 6.70 6.82 7.06 7.22 7.73 8.31 8.63 8.98 9.24 9.15
## # ℹ 14 more variables: `14` <dbl>, `15` <dbl>, `16` <dbl>, `17` <dbl>,
## # `18` <dbl>, `19` <dbl>, `20` <dbl>, `21` <dbl>, `22` <dbl>, `23` <dbl>,
## # `24` <dbl>, fecha <date>, Fecha <dttm>, Valor <dbl>
head(Consumo_promedio_diario,10) # df consumo promedio por dias
## # A tibble: 10 × 2
## Fecha Valor
## <dttm> <dbl>
## 1 2020-01-01 00:00:00 6.48
## 2 2020-01-02 00:00:00 7.56
## 3 2020-01-03 00:00:00 8.00
## 4 2020-01-04 00:00:00 7.84
## 5 2020-01-05 00:00:00 7.22
## 6 2020-01-06 00:00:00 7.27
## 7 2020-01-07 00:00:00 8.15
## 8 2020-01-08 00:00:00 8.36
## 9 2020-01-09 00:00:00 8.36
## 10 2020-01-10 00:00:00 8.38
head(Consumo_hora,10) # consumo por hora a lo largo de los dias
## Fecha Valor
## 1 2020-01-01 01:00:00 6.601075
## 2 2020-01-01 02:00:00 6.447886
## 3 2020-01-01 03:00:00 6.275364
## 4 2020-01-01 04:00:00 6.136344
## 5 2020-01-01 05:00:00 6.020133
## 6 2020-01-01 06:00:00 5.906730
## 7 2020-01-01 07:00:00 5.495742
## 8 2020-01-01 08:00:00 5.530112
## 9 2020-01-01 09:00:00 5.736929
## 10 2020-01-01 10:00:00 5.994528
head(Consumo_promedio_mensual,10) #consumo promedio por meses
## # A tibble: 10 × 2
## fechas Valor
## <date> <dbl>
## 1 2020-01-01 8.22
## 2 2020-02-01 8.60
## 3 2020-03-01 8.05
## 4 2020-04-01 7.22
## 5 2020-05-01 7.58
## 6 2020-06-01 7.72
## 7 2020-07-01 7.96
## 8 2020-08-01 8.05
## 9 2020-09-01 8.16
## 10 2020-10-01 8.24
# Validamos la estructura de los datos
str(Consumo_promedio_diario)
## tibble [1,461 × 2] (S3: tbl_df/tbl/data.frame)
## $ Fecha: POSIXct[1:1461], format: "2020-01-01" "2020-01-02" ...
## $ Valor: num [1:1461] 6.48 7.56 8 7.84 7.22 ...
str(Consumo_hora)
## 'data.frame': 35064 obs. of 2 variables:
## $ Fecha: POSIXct, format: "2020-01-01 01:00:00" "2020-01-01 02:00:00" ...
## $ Valor: num 6.6 6.45 6.28 6.14 6.02 ...
#Resumen estadistico de los datos
summary(Consumo_promedio_diario)
## Fecha Valor
## Min. :2020-01-01 Min. : 6.479
## 1st Qu.:2020-12-31 1st Qu.: 8.158
## Median :2021-12-31 Median : 8.733
## Mean :2021-12-31 Mean : 8.651
## 3rd Qu.:2022-12-31 3rd Qu.: 9.134
## Max. :2023-12-31 Max. :10.435
summary(Consumo_hora)
## Fecha Valor
## Min. :2020-01-01 01:00:00 Min. : 5.355
## 1st Qu.:2020-12-31 06:45:00 1st Qu.: 7.678
## Median :2021-12-31 12:30:00 Median : 8.668
## Mean :2021-12-31 12:30:00 Mean : 8.651
## 3rd Qu.:2022-12-31 18:15:00 3rd Qu.: 9.629
## Max. :2024-01-01 00:00:00 Max. :11.757
#Verificacion de los datos nulos
sum(is.na(Consumo_promedio_diario))
## [1] 0
sum(is.na(Consumo_hora))
## [1] 0
# Verificacion de datos duplicados
sum(duplicated(Consumo_promedio_diario))
## [1] 0
Consumo_promedio_diario_duplicados <- Consumo_promedio_diario[duplicated(Consumo_promedio_diario), ]
sum(duplicated(Consumo_hora))
## [1] 0
Consumo_hora_duplicados <- Consumo_hora[duplicated(Consumo_hora), ]
#Resumen detallado usando Summarytools
dfSummary(Consumo_promedio_diario)
## Data Frame Summary
## Consumo_promedio_diario
## Dimensions: 1461 x 2
## Duplicates: 0
##
## ------------------------------------------------------------------------------------------------------------------
## No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
## ---- ------------------- ----------------------- ---------------------- --------------------- ---------- ---------
## 1 Fecha min : 2020-01-01 1461 distinct values : : : : : : : : : : 1461 0
## [POSIXct, POSIXt] med : 2021-12-31 : : : : : : : : : : (100.0%) (0.0%)
## max : 2023-12-31 : : : : : : : : : :
## range : 3y 11m 30d : : : : : : : : : :
## : : : : : : : : : :
##
## 2 Valor Mean (sd) : 8.7 (0.7) 1461 distinct values : 1461 0
## [numeric] min < med < max: . : : (100.0%) (0.0%)
## 6.5 < 8.7 < 10.4 : : :
## IQR (CV) : 1 (0.1) : : : : .
## : : : : : : .
## ------------------------------------------------------------------------------------------------------------------
dfSummary(Consumo_hora)
## Data Frame Summary
## Consumo_hora
## Dimensions: 35064 x 2
## Duplicates: 0
##
## -------------------------------------------------------------------------------------------------------------------------
## No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
## ---- ------------------- ----------------------------- ----------------------- --------------------- ---------- ---------
## 1 Fecha min : 2020-01-01 01:00:00 35064 distinct values : : : : : : : : : : 35064 0
## [POSIXct, POSIXt] med : 2021-12-31 12:30:00 : : : : : : : : : : (100.0%) (0.0%)
## max : 2024-01-01 : : : : : : : : : :
## range : 4y 0m -1d 23H 0M 0S : : : : : : : : : :
## : : : : : : : : : :
##
## 2 Valor Mean (sd) : 8.7 (1.2) 35061 distinct values . . . : 35064 0
## [numeric] min < med < max: : : : : : (100.0%) (0.0%)
## 5.4 < 8.7 < 11.8 : : : : : :
## IQR (CV) : 2 (0.1) : : : : : :
## : : : : : : : : .
## -------------------------------------------------------------------------------------------------------------------------
### Visualización de datos ###
# Distribucion de variables
# Histograma del consumo promedio diario
ggplot(Consumo_promedio_diario, aes(x = Valor)) + # Reemplazar variable_de_interes con el nombre real de la columna
geom_histogram(binwidth = 1) +
labs(title = "Distribución del Consumo Promedio Diario", x = "Consumo", y = "Frecuencia")
# Histograma del consumo por hora
ggplot(Consumo_hora, aes(x = Valor)) + # Reemplazar variable_de_interes con el nombre real de la columna
geom_histogram(binwidth = 1) +
labs(title = "Distribución del Consumo por Hora", x = "Consumo", y = "Frecuencia")
# Boxplot para identificar outliers:
# Boxplot del consumo promedio diario
ggplot(Consumo_promedio_diario, aes(y = Valor)) + # Reemplazar variable_de_interes con el nombre real de la columna
geom_boxplot() +
labs(title = "Boxplot del Consumo Promedio Diario", y = "Consumo")
# Boxplot del consumo por hora
ggplot(Consumo_hora, aes(y = Valor)) + # Reemplazar variable_de_interes con el nombre real de la columna
geom_boxplot() +
labs(title = "Boxplot del Consumo por Hora", y = "Consumo")
Podemos validar que no hay datos omitidos o duplicados; así mismo, nos damos cuenta de que no hay datos atípicos para el consumo promedio diario. Sin embargo, mediante el gráfico de caja de bigotes podemos identificar la presencia de datos típicos en el consumo de datos por hora, los cuales tendremos que limpiar:
# Cálculo de Q1, Q3 y IQR
Q1 <- quantile(Consumo_promedio_diario$Valor, 0.25)
Q3 <- quantile(Consumo_promedio_diario$Valor, 0.75)
IQR <- Q3 - Q1
# Definición de los límites inferior y superior
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
# Identificación de outliers
outliers <- Consumo_promedio_diario %>%
filter(Valor < lower_bound | Valor > upper_bound)
print("Outliers:")
## [1] "Outliers:"
print(outliers)
## # A tibble: 4 × 2
## Fecha Valor
## <dttm> <dbl>
## 1 2020-01-01 00:00:00 6.48
## 2 2020-04-19 00:00:00 6.66
## 3 2020-05-31 00:00:00 6.56
## 4 2021-01-01 00:00:00 6.48
# Eliminar los outliers
Consumo_promedio_diario_clean <- Consumo_promedio_diario %>%
filter(Valor >= lower_bound & Valor <= upper_bound)
# Resumen de datos limpios
summary(Consumo_promedio_diario_clean)
## Fecha Valor
## Min. :2020-01-02 00:00:00.00 Min. : 6.697
## 1st Qu.:2021-01-03 00:00:00.00 1st Qu.: 8.171
## Median :2022-01-02 00:00:00.00 Median : 8.734
## Mean :2022-01-01 13:47:14.03 Mean : 8.656
## 3rd Qu.:2023-01-01 00:00:00.00 3rd Qu.: 9.135
## Max. :2023-12-31 00:00:00.00 Max. :10.435
# Boxplot del consumo promedio diario limpio
El método del rango intercuartílico (IQR) es una técnica robusta para identificar outliers en un conjunto de datos, ya que se basa en la dispersión central de los datos y no es influenciado por valores extremos como la media y la desviación estándar. Este método funciona de la siguiente manera:
Cuartiles: Los cuartiles dividen los datos en cuatro partes iguales. Q1 (primer cuartil) es el valor por debajo del cual se encuentra el 25% de los datos, y Q3 (tercer cuartil) es el valor por debajo del cual se encuentra el 75% de los datos.
Rango Intercuartílico (IQR): Es la diferencia entre Q3 y Q1 y mide la dispersión de los datos en la mitad central del conjunto de datos.
Límites para Outliers: Los límites inferior y superior se calculan utilizando Q1 y Q3 junto con el IQR. Los valores más allá de estos límites se consideran outliers.
Este método es ampliamente utilizado en análisis exploratorio de datos para detectar y manejar valores atípicos, ayudando a garantizar que los análisis subsiguientes no sean sesgados por valores extremos.
# Paso 1: Asegúrate de que la columna 'fechas' esté en formato POSIXct
Consumo_hora$fechas <- as.POSIXct(Consumo_hora$Fecha, format = "%Y-%m-%d %H")
Consumo_promedio_diario$fechas <- as.POSIXct(Consumo_promedio_diario$Fecha, format = "%Y-%m-%d")
Consumo_promedio_mensual$fechas <- as.POSIXct(Consumo_promedio_mensual$fechas, format = "%Y-%m")
# Paso 2: Ordena los datos por la columna 'fechas' si aún no están ordenados
datos <- Consumo_hora[order(Consumo_hora$fechas), ]
datos2 <- Consumo_promedio_diario[order(Consumo_promedio_diario$fechas), ]
datos3 <- Consumo_promedio_mensual[order(Consumo_promedio_mensual$fechas), ]
# Paso 3: Crea la serie de tiempo con la función 'ts()' de R
Consumo_Hora_ts <- ts(datos$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 24 * 365)
Consumo_Diario_ts <- ts(datos2$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 365)
Consumo_Mensual_ts <- ts(datos3$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 12)
# Serie Temporal Horaria
Consumo_Hora_ts <- ts(datos$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 24 * 365)
decomp_hora <- decompose(Consumo_Hora_ts)
plot(decomp_hora)
# Serie Temporal Diaria
Consumo_Diario_ts <- ts(datos2$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 365)
decomp_diario <- decompose(Consumo_Diario_ts)
plot(decomp_diario)
# Serie Temporal Mensual
Consumo_Mensual_ts <- ts(datos2$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 12)
decomp_mensual <- decompose(Consumo_Mensual_ts)
plot(decomp_mensual)
En el análisis de tendencia podemos ver como todas las series tienen un comportamiento creciente a o largo del tiempo, lo cual es congruente con el análisis exploratorio previo.
En el análisis de ruido/residual, podemos ver que la variación no explicada por la estacionalidad o la tendencia es significativa. Sin embargo, hará falta hacer un análisis más robusto de los componentes
En el análisis de estacionalidad, podemos ver que se refleja un patrón de pico decreciente que se repite en intervalos relativamente regulares
* Realizamos análisis de correlogramas
# Serie Temporal Horaria
Consumo_Hora_ts <- ts(datos$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 24 * 365)
# Correlograma ACF y PACF
acf(Consumo_Hora_ts, main = "ACF del Consumo Horario")
pacf(Consumo_Hora_ts, main = "PACF del Consumo Horario")
# Serie Temporal Diaria
Consumo_Diario_ts <- ts(datos2$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 365)
# Correlograma ACF y PACF
acf(Consumo_Diario_ts, main = "ACF del Consumo Diario")
pacf(Consumo_Diario_ts, main = "PACF del Consumo Diario")
# Serie Temporal Mensual
Consumo_Mensual_ts <- ts(datos2$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 12)
# Correlograma ACF y PACF
acf(Consumo_Mensual_ts, main = "ACF del Consumo Mensual")
pacf(Consumo_Mensual_ts, main = "PACF del Consumo Mensual")
El análisis de la función de autocorrelación (ACF)
En la serie temporal, horaria y diaria podemos ver que hay picos repetitivos, lo cual indica estacionalidad a lo largo de los datos observados. Así mismo muestra un comportamiento decreciente en ciertos intervalos, mostrando la presencia de tendencia en la serie temporal
En la serie temporal se evidencia un patrón decreciente lento del correlograma. Por lo tanto, el análisis sugiere una tendencia en la serie temporal
El análisis de la función parcial de autocorrelación (PACF)
#Analisamos serie mensual identifiando mes a mes
months <- c("J","F","M","A", "M","J","J","A", "S","O", "N","D")
xyplot(Consumo_Mensual_ts,
panel = function(x,y, ...){
panel.xyplot(x,y, ...)
panel.text(x,y, labels= months)})
El inicio de la temporada de lluvias (junio-agosto) puede afectar la generación hidroeléctrica y aumentar la demanda de energía para la calefacción en algunas áreas. Además, la celebración de otras festividades conlleva un aumento en eventos sociales y actividades que requieren energía adicional.
Por otro lado, las festividades navideñas generan un aumento significativo en el consumo de energía debido a la iluminación decorativa, la actividad comercial intensificada y el uso de electrodomésticos para la preparación de alimentos y otras celebraciones.
#Realizamos regresion por MCO
beer_fit1 <- lm(Consumo_Mensual_ts ~ season(Consumo_Mensual_ts) -1)
summary(beer_fit1)
##
## Call:
## lm(formula = Consumo_Mensual_ts ~ season(Consumo_Mensual_ts) -
## 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.7340 -0.2564 0.1792 0.3997 0.7607
##
## Coefficients:
## Estimate Std. Error t value
## season(Consumo_Mensual_ts)January 8.2133 0.2790 29.44
## season(Consumo_Mensual_ts)February 8.1560 0.3119 26.15
## season(Consumo_Mensual_ts)March 8.4362 0.3119 27.05
## season(Consumo_Mensual_ts)April 8.2258 0.3119 26.37
## season(Consumo_Mensual_ts)May 8.3506 0.3119 26.77
## season(Consumo_Mensual_ts)June 8.3191 0.3119 26.67
## season(Consumo_Mensual_ts)July 8.3806 0.3119 26.87
## season(Consumo_Mensual_ts)August 8.6189 0.3119 27.63
## season(Consumo_Mensual_ts)September 8.4180 0.3119 26.99
## season(Consumo_Mensual_ts)October 8.5559 0.3119 27.43
## season(Consumo_Mensual_ts)November 8.2898 0.3119 26.58
## season(Consumo_Mensual_ts)December 8.4381 0.3119 27.05
## Pr(>|t|)
## season(Consumo_Mensual_ts)January <0.0000000000000002 ***
## season(Consumo_Mensual_ts)February <0.0000000000000002 ***
## season(Consumo_Mensual_ts)March <0.0000000000000002 ***
## season(Consumo_Mensual_ts)April <0.0000000000000002 ***
## season(Consumo_Mensual_ts)May <0.0000000000000002 ***
## season(Consumo_Mensual_ts)June <0.0000000000000002 ***
## season(Consumo_Mensual_ts)July <0.0000000000000002 ***
## season(Consumo_Mensual_ts)August <0.0000000000000002 ***
## season(Consumo_Mensual_ts)September <0.0000000000000002 ***
## season(Consumo_Mensual_ts)October <0.0000000000000002 ***
## season(Consumo_Mensual_ts)November <0.0000000000000002 ***
## season(Consumo_Mensual_ts)December <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6239 on 37 degrees of freedom
## Multiple R-squared: 0.9958, Adjusted R-squared: 0.9945
## F-statistic: 734.1 on 12 and 37 DF, p-value: < 0.00000000000000022
ols_plot_resid_qq(beer_fit1) #Grafico prueba residuos qq deben estar proximos a la linea de proyeccion
coefplot(beer_fit1, title= "ols Regression") # Grafico de coeficientes
Este informe presenta un análisis de regresión realizado para
comprender el comportamiento del consumo mensual de energía en Colombia
durante un período desde enero de 2020 hasta enero de 2024. Se utilizó
una serie de tiempo denominada
Consumo_Mensual_ts
que representa el
consumo mensual de energía, con una frecuencia mensual.
Metodología: Se implementó un modelo de regresión
lineal utilizando el método de mínimos cuadrados ordinarios (MCO). La
variable dependiente fue
Consumo_Mensual_ts
, mientras que las
variables independientes fueron las variables indicadoras para cada mes
del año. Se excluyeron las variables de intersección para evitar la
multicolinealidad entre las variables indicadoras del mes. Los datos
utilizados para este análisis fueron recopilados durante el período
mencionado y representan el consumo mensual de energía en Colombia.
Resultados: Los coeficientes estimados para cada mes muestran el efecto promedio de ese mes en el consumo mensual de energía en comparación con el mes de referencia (diciembre). Los valores p asociados a cada coeficiente son muy bajos, lo que indica una alta significancia estadística en las diferencias de consumo de energía entre los meses. Por ejemplo, el coeficiente estimado para enero es 8.2133, lo que implica que se espera que el consumo de energía en enero sea 8.2133 unidades más alto que en diciembre, manteniendo todas las demás variables constantes.
El R cuadrado ajustado del modelo es muy alto (0.9945), lo que indica que el modelo explica casi la totalidad de la variabilidad en el consumo mensual de energía. Esto sugiere que la inclusión de las variables indicadoras para cada mes proporciona una buena explicación del patrón estacional en los datos de consumo de energía en Colombia.
Discusión: Este análisis revela que hay diferencias estadísticamente significativas en el consumo mensual de energía a lo largo de los meses del año en Colombia. Estas diferencias pueden estar influenciadas por factores estacionales, como cambios climáticos, demanda industrial o cambios en los patrones de consumo residencial. Es importante considerar estas variaciones estacionales al planificar políticas energéticas, infraestructura y programas de eficiencia energética.
Nota: Al excluir las variables de intersección, el modelo asume implícitamente que el mes de referencia es aquel que no está representado por ninguna variable indicadora. Dado que diciembre es el último mes del año, es común que se convierta en el mes de referencia en este tipo de modelos.
Justificación para utilizar un modelo ARIMA:
Para justificar el uso de un modelo ARIMA para datos de consumo de energía con un formato de fecha y hora (año-mes-día-hora) desde 2023 hasta 2024, y para realizar una proyección de 192 horas, podemos considerar los siguientes puntos:
Autocorrelación Temporal: Los datos de consumo de energía tienden a tener una fuerte autocorrelación temporal, lo que significa que el consumo de energía en un momento dado está influenciado por los valores anteriores. Un modelo ARIMA es adecuado para capturar esta dependencia temporal y utilizarla para hacer predicciones precisas.
Patrones Estacionales y Tendencias: Los datos de consumo de energía suelen exhibir patrones estacionales y tendencias a lo largo del tiempo, como picos de consumo durante ciertas horas del día o estacionalidades en ciertas épocas del año. Un modelo ARIMA puede capturar estas estacionalidades y tendencias, especialmente si se utilizan técnicas de diferenciación adecuadas para hacer estacionarios los datos.
Flexibilidad para Manejar Series Temporales Complejas: Los modelos ARIMA son flexibles y pueden manejar una amplia variedad de series temporales, incluidas aquellas con estacionalidad, tendencias y cambios abruptos en el comportamiento.
Proyección a Corto Plazo: La proyección de 192 horas corresponde a una proyección a corto plazo del consumo de energía. Los modelos ARIMA son especialmente útiles para este tipo de predicciones a corto plazo, ya que pueden capturar patrones y tendencias a corto plazo en los datos históricos.
Capacidad para Modelar Datos con Granularidad Temporal: El formato de fecha y hora (año-mes-día-hora) proporciona una granularidad temporal detallada, lo que permite capturar variaciones en el consumo de energía a lo largo del día. Un modelo ARIMA puede aprovechar esta información detallada para hacer predicciones precisas.
Por lo tanto, utilizar un modelo ARIMA para los datos de consumo de energía con formato de fecha y hora y realizar una proyección de 192 horas es una elección sólida debido a su capacidad para capturar la autocorrelación temporal, manejar patrones estacionales y tendencias, y hacer predicciones precisas a corto plazo.
# Ajustar un modelo AR con el orden adecuado (p)
modelo_AR <- auto.arima(Consumo_Hora_ts, seasonal = FALSE)
summary(modelo_AR)
## Series: Consumo_Hora_ts
## ARIMA(5,1,0)
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5
## 0.8288 -0.2308 0.167 -0.1070 -0.0837
## s.e. 0.0053 0.0069 0.007 0.0069 0.0053
##
## sigma^2 = 0.0527: log likelihood = 1846.01
## AIC=-3680.02 AICc=-3680.01 BIC=-3629.23
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.00001520507 0.2295467 0.1588697 0.0134341 1.790377 0.2524525
## ACF1
## Training set -0.006350001
# Realizar la predicción para las próximas 192 horas
prediccion_AR <- forecast(modelo_AR, h = 192)
# Graficar la predicción
autoplot(prediccion_AR) +
ggtitle("Predicción de las próximas 192 horas") +
xlab("Tiempo") + ylab("Consumo") +
theme_minimal()
# Obtener las últimas 192 horas
ultimas_horas <- tail(Consumo_Hora_ts, 192)
# Mostrar parte de las últimas 192 horas en forma de tabla
head(as.data.frame(ultimas_horas),10)
## x
## 1 8.279952
## 2 8.049630
## 3 7.905281
## 4 7.900341
## 5 7.947490
## 6 7.918887
## 7 8.374292
## 8 8.902768
## 9 9.277497
## 10 9.612572
#Resumen estadistico
summary(ultimas_horas)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6.783 7.934 8.874 8.850 9.746 10.843
Este informe presenta el análisis del modelo ARIMA ajustado a una
serie temporal de consumo de energía (Consumo_Hora_ts
). El
objetivo es comprender la estructura del modelo, interpretar los
coeficientes y evaluar el ajuste del modelo para realizar predicciones
precisas del consumo energético.
La serie temporal Consumo_Hora_ts
contiene datos
horarios de consumo de energía. La frecuencia de los datos es diaria
(365 observaciones por año) y abarca un total de 1461 observaciones. El
modelo ajustado es un ARIMA(5,1,0), que incluye:
Los coeficientes AR y sus errores estándar se detallan a continuación:
Coeficiente | Valor | Error Estándar |
---|---|---|
ar1 | 0.8288 | 0.0053 |
ar2 | -0.2308 | 0.0069 |
ar3 | 0.167 | 0.0070 |
ar4 | -0.1070 | 0.0069 |
ar5 | -0.0837 | 0.0053 |
El ajuste del modelo se evalúa mediante varias métricas:
Las medidas de error del conjunto de entrenamiento son:
Medida | Valor |
---|---|
ME | 1.520507e-05 |
RMSE | 0.2295467 |
MAE | 0.1588697 |
MPE | 0.0134341 |
MAPE | 1.790377 |
MASE | 0.2524525 |
ACF1 | -0.006350001 |
El análisis del resumen estadístico de la proyección de 192 horas de consumo de energía proporciona una comprensión de la distribución y las características de estos datos proyectados:
Mínimo (Min.): El valor mínimo proyectado para el consumo de energía en las próximas 192 horas es de 6.783 unidades. Esto indica el valor más bajo esperado en la proyección.
Primer cuartil (1st Qu.): El 25% de los datos proyectados de consumo de energía en las próximas 192 horas se espera que estén por debajo de 7.934 unidades. Es decir, un cuarto de las observaciones proyectadas serán iguales o menores a este valor.
Mediana (Median): La mediana de la proyección del consumo de energía en las próximas 192 horas es de 8.874 unidades. Esto significa que se espera que la mitad de los datos proyectados estén por encima de este valor y la otra mitad estén por debajo.
Media (Mean): El valor promedio proyectado del consumo de energía en las próximas 192 horas es de 8.850 unidades. Esta es la suma de todas las proyecciones dividida por el número total de observaciones.
Tercer cuartil (3rd Qu.): Se espera que el 75% de los datos proyectados de consumo de energía en las próximas 192 horas estén por debajo de 9.746 unidades. Esto indica que tres cuartos de las observaciones proyectadas serán iguales o menores a este valor.
Máximo (Max.): El valor máximo proyectado para el consumo de energía en las próximas 192 horas es de 10.843 unidades. Esto representa el valor más alto esperado en la proyección durante este período de tiempo.
Estadística | Proyección de 192 horas | Serie de Tiempo “Consumo_hora” |
---|---|---|
Mínimo | 6.783 | 5.355 |
1er Cuartil | 7.934 | 7.678 |
Mediana | 8.874 | 8.668 |
Media | 8.850 | 8.651 |
3er Cuartil | 9.746 | 9.629 |
Máximo | 10.843 | 11.757 |
La proyección de 192 horas de consumo de energía tiene un valor mínimo de 6.783 y un valor máximo de 10.843, mientras que la serie de tiempo histórica tiene un valor mínimo de 5.355 y un valor máximo de 11.757. Esto indica que la proyección tiene un rango más estrecho de valores y un máximo más bajo en comparación con la serie de tiempo histórica.
En general, las medidas de tendencia central y dispersión son bastante similares entre la proyección y la serie de tiempo histórica, lo que sugiere que la proyección está en línea con el comportamiento histórico del consumo de energía.
El modelo ARIMA(5,1,0) ajustado a la serie temporal de consumo de
energía (Consumo_Hora_ts
) es adecuado para capturar las
dependencias temporales presentes en los datos. Los coeficientes
autoregresivos indican que los valores actuales del consumo están
significativamente influenciados por los valores de hasta cinco horas
anteriores. Las métricas de error y los criterios de información
sugieren que el modelo se ajusta bien a los datos y es capaz de realizar
predicciones precisas.
La baja autocorrelación en los residuos indica que el modelo ha capturado la estructura de los datos de manera efectiva, dejando residuos que son esencialmente ruido blanco. En general, este modelo proporciona una base sólida para el análisis y la predicción del consumo energético.
Para este análisis hemos tomado datos externos de “Meteostat”,la cual es una base de datos meteorológicos y climáticos que proporciona datos meteorológicos detallados de miles de estaciones meteorológicas y lugares de todo el mundo.
Para el análisis en concreto utilizamos la estación meteorológica de Bogotá / Eldorado, con las variables diarias de precipitación (milímetros) “prcp” y temperatura promedio (grados centígrados) “tavg”
Var_Exo <- read_excel("Interviews/Bia Energy/export (2).xlsx")
# Crear codigo tubería para reemplazar los NA en la columna prcp por el mismo valor observado
Var_Exo <- Var_Exo %>%
arrange(date) %>% # Asegurarse de que los datos están ordenados por la serie temporal
fill(prcp, .direction = "down")
# Convertir la variable "date" a formato fecha y "tavg" y "prcp" a formato numérico
Var_Exo <- Var_Exo %>%
mutate(
date = as.Date(date),
prcp = as.numeric(prcp),
tavg = as.numeric(tavg)
)
# Verificar los tipos de las variables
str(Var_Exo)
## tibble [1,461 × 3] (S3: tbl_df/tbl/data.frame)
## $ date: Date[1:1461], format: "2020-01-01" "2020-01-02" ...
## $ tavg: num [1:1461] 13.8 15.2 14.6 12.9 13.6 12.2 14.1 12.3 12.3 12.4 ...
## $ prcp: num [1:1461] 0 0 0 0 0 0 0 0 0 0 ...
# Verificar si hay valores NA en las variables 'prcp' y 'tavg'
na_check <- Var_Exo %>%
summarize(
prcp_nas = sum(is.na(prcp)),
tavg_nas = sum(is.na(tavg))
)
# Mostrar los resultados de la verificación de NA
print(na_check)
## # A tibble: 1 × 2
## prcp_nas tavg_nas
## <int> <int>
## 1 0 0
La realización de un análisis del test de Granger con variables como precipitación diaria y temperatura promedio diaria puede robustecer el análisis del consumo de energía diario por varias razones:
Identificación de Relaciones Causales: El test de Granger evalúa si una serie temporal (en este caso, la precipitación y la temperatura) “causa” cambios en otra serie temporal (el consumo de energía). Si encontramos una relación causal significativa entre la precipitación/temperatura y el consumo de energía, podemos inferir que estos factores climáticos tienen un impacto en el consumo de energía.
Consideración de Factores Externos: La precipitación y la temperatura son variables externas que pueden influir en el consumo de energía. Por ejemplo, días más fríos pueden resultar en un aumento en el uso de calefacción, mientras que días más calurosos pueden aumentar el uso de aire acondicionado. La precipitación también puede influir en la demanda de energía, especialmente en sectores como la agricultura o la industria.
Validación del Modelo: Al incluir variables climáticas adicionales en el análisis, estamos enriqueciendo nuestro modelo al considerar otros factores que pueden afectar el consumo de energía. Si el test de Granger muestra que la precipitación y la temperatura tienen una influencia significativa en el consumo de energía, podemos estar más seguros de que nuestro modelo captura adecuadamente las relaciones causales entre estas variables.
Mejora de las Predicciones: Al incluir variables climáticas en el análisis, podemos mejorar nuestras predicciones del consumo de energía al tener en cuenta factores externos que afectan la demanda de energía. Esto puede ayudar a reducir la incertidumbre en nuestras predicciones y hacerlas más precisas.
De tal forma, que realizar un análisis del test de Granger con variables como la precipitación y la temperatura puede fortalecer el análisis del consumo de energía diario al identificar relaciones causales, considerar factores externos relevantes, validar el modelo y mejorar las predicciones.
Acomodamos y validamos los datos:
# Tenemos las siguentes series en la misma periodicidad:
ts_prcp <- ts(Var_Exo$prcp, start = c(2023, 1), frequency = 365)
ts_temp <- ts(Var_Exo$tavg, start = c(2023, 1), frequency = 365)
Consumo_Diario_ts <- ts(datos2$Valor, start = c(2020, 1), end = c(2024, 1), frequency = 365)
# Verificar la longitud de las series
length(ts_prcp) == length(Consumo_Diario_ts) # Debe ser TRUE
## [1] TRUE
length(ts_temp) == length(Consumo_Diario_ts) # Debe ser TRUE
## [1] TRUE
# Convertir las series a estacionarias mediante diferenciación
diff_Consumo_Diario_ts <- diff(Consumo_Diario_ts)
diff_ts_prcp <- diff(ts_prcp)
diff_ts_temp <- diff(ts_temp)
# Verificar la estacionariedad con la prueba de Dickey-Fuller aumentada
adf_Consumo <- adf.test(diff_Consumo_Diario_ts)
adf_prcp <- adf.test(diff_ts_prcp)
adf_temp <- adf.test(diff_ts_temp)
print(adf_Consumo)
##
## Augmented Dickey-Fuller Test
##
## data: diff_Consumo_Diario_ts
## Dickey-Fuller = -15.348, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary
print(adf_prcp)
##
## Augmented Dickey-Fuller Test
##
## data: diff_ts_prcp
## Dickey-Fuller = -18.437, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary
print(adf_temp)
##
## Augmented Dickey-Fuller Test
##
## data: diff_ts_temp
## Dickey-Fuller = -16.287, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary
# Test de causalidad de Granger para prcp y Consumo_Diario_ts
granger_prcp <- grangertest(diff_Consumo_Diario_ts ~ diff_ts_prcp, order = 5)
print(granger_prcp)
## Granger causality test
##
## Model 1: diff_Consumo_Diario_ts ~ Lags(diff_Consumo_Diario_ts, 1:5) + Lags(diff_ts_prcp, 1:5)
## Model 2: diff_Consumo_Diario_ts ~ Lags(diff_Consumo_Diario_ts, 1:5)
## Res.Df Df F Pr(>F)
## 1 1444
## 2 1449 -5 2.2329 0.04881 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El test de causalidad de Granger evalúa si una serie temporal (en este caso, el consumo diario de energía) es “causada” por otra serie temporal (la precipitación diaria). A continuación, analizo los resultados del test:
Modelo 1: En este modelo, se incluyen tanto los rezagos de la diferencia del consumo diario de energía como los rezagos de la diferencia de la precipitación diaria como variables explicativas. El número de rezagos considerados es de 1 a 5 tanto para el consumo diario de energía como para la precipitación diaria.
Modelo 2: En este modelo, solo se incluyen los rezagos de la diferencia del consumo diario de energía como variable explicativa. Se observa que se ha eliminado la precipitación diaria como variable explicativa.
Resultados:
Res.Df: Este valor representa los grados de libertad residuales para cada modelo.
Df: Indica la diferencia en grados de libertad entre los dos modelos.
F-statistic: Esta estadística F es una medida de cuánto mejor se ajusta el modelo con las variables explicativas en comparación con el modelo sin ellas. En este caso, se observa un valor de 2.2329.
Pr(>F): Esta columna muestra el valor p asociado con la estadística F. Un valor p menor que el nivel de significancia (0.05) indica que podemos rechazar la hipótesis nula de que no hay causalidad.
Interpretación:
En este caso, el valor p asociado con la estadística F en el Modelo 2 es 0.04881, que es menor que 0.05, lo que indica que hay evidencia significativa para rechazar la hipótesis nula de que la precipitación diaria no tiene efecto sobre el consumo diario de energía.
Por lo tanto, podemos concluir que la precipitación diaria tiene una influencia significativa en el consumo diario de energía, según los resultados del test de causalidad de Granger.
# Test de causalidad de Granger para temp y Consumo_Diario_ts
granger_temp <- grangertest(diff_Consumo_Diario_ts ~ diff_ts_temp, order = 5)
print(granger_temp)
## Granger causality test
##
## Model 1: diff_Consumo_Diario_ts ~ Lags(diff_Consumo_Diario_ts, 1:5) + Lags(diff_ts_temp, 1:5)
## Model 2: diff_Consumo_Diario_ts ~ Lags(diff_Consumo_Diario_ts, 1:5)
## Res.Df Df F Pr(>F)
## 1 1444
## 2 1449 -5 1.9239 0.08747 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El test de causalidad de Granger para la temperatura promedio diaria y el consumo diario de energía evalúa si la temperatura promedio tiene un efecto significativo en el consumo diario de energía. A continuación, analizo los resultados del test:
Modelo 1: En este modelo, se incluyen tanto los rezagos de la diferencia del consumo diario de energía como los rezagos de la diferencia de la temperatura promedio diaria como variables explicativas. Se consideran rezagos de 1 a 5 tanto para el consumo diario de energía como para la temperatura promedio diaria.
Modelo 2: En este modelo, solo se incluyen los rezagos de la diferencia del consumo diario de energía como variable explicativa. La temperatura promedio diaria se ha eliminado como variable explicativa.
Resultados:
Res.Df: Representa los grados de libertad residuales para cada modelo.
Df: Indica la diferencia en grados de libertad entre los dos modelos.
F-statistic: Esta estadística F es una medida de cuánto mejor se ajusta el modelo con las variables explicativas en comparación con el modelo sin ellas. En este caso, se observa un valor de 1.9239.
Pr(>F): Esta columna muestra el valor p asociado con la estadística F. Un valor p menor que el nivel de significancia (0.05) indica que podemos rechazar la hipótesis nula de que no hay causalidad.
Interpretación:
En este caso, el valor p asociado con la estadística F en el Modelo 2 es 0.08747, que es mayor que 0.05. Esto indica que no hay suficiente evidencia para rechazar la hipótesis nula de que la temperatura promedio diaria no tiene efecto significativo en el consumo diario de energía.
Por lo tanto, no podemos concluir que la temperatura promedio diaria tenga una influencia significativa en el consumo diario de energía según los resultados del test de causalidad de Granger.
Graficamos
#Graficamos:
# Crear un dataframe para gráficos
data_plot <- data.frame(
date = time(diff_Consumo_Diario_ts),
diff_Consumo_Diario = as.numeric(diff_Consumo_Diario_ts),
diff_prcp = as.numeric(diff_ts_prcp),
diff_temp = as.numeric(diff_ts_temp)
)
# Gráfico de las series temporales diferenciadas
p1 <- ggplot(data_plot, aes(x = date)) +
geom_line(aes(y = diff_Consumo_Diario, color = "Consumo_Diario")) +
geom_line(aes(y = diff_prcp, color = "prcp")) +
labs(title = "Series Temporales Diferenciadas (Consumo vs Precipitación)",
x = "Fecha", y = "Diferencias") +
scale_color_manual("", values = c("Consumo_Diario" = "blue", "prcp" = "red"))
p2 <- ggplot(data_plot, aes(x = date)) +
geom_line(aes(y = diff_Consumo_Diario, color = "Consumo_Diario")) +
geom_line(aes(y = diff_temp, color = "temp")) +
labs(title = "Series Temporales Diferenciadas (Consumo vs Temperatura)",
x = "Fecha", y = "Diferencias") +
scale_color_manual("", values = c("Consumo_Diario" = "blue", "temp" = "green"))
# Gráficos de residuos de la regresión de Granger
resid_prcp <- lm(diff_Consumo_Diario_ts ~ diff_ts_prcp)$residuals
resid_temp <- lm(diff_Consumo_Diario_ts ~ diff_ts_temp)$residuals
# Crear dataframes de residuos
resid_plot_prcp <- data.frame(
date = time(diff_Consumo_Diario_ts),
resid_prcp = resid_prcp
)
resid_plot_temp <- data.frame(
date = time(diff_Consumo_Diario_ts),
resid_temp = resid_temp
)
p3 <- ggplot(resid_plot_prcp, aes(x = date)) +
geom_line(aes(y = resid_prcp, color = "Residuos prcp")) +
labs(title = "Residuos de la Regresión (Consumo vs Precipitación)",
x = "Fecha", y = "Residuos") +
scale_color_manual("", values = c("Residuos prcp" = "purple"))
p4 <- ggplot(resid_plot_temp, aes(x = date)) +
geom_line(aes(y = resid_temp, color = "Residuos temp")) +
labs(title = "Residuos de la Regresión (Consumo vs Temperatura)",
x = "Fecha", y = "Residuos") +
scale_color_manual("", values = c("Residuos temp" = "orange"))
# Mostrar los gráficos
grid.arrange(p1, p2, p3, p4, ncol = 2)
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
Las gráficas proporcionan una visualización de las series temporales diferenciadas y los residuos de la regresión de Granger entre el consumo diario de energía y las variables explicativas (precipitación y temperatura). Aquí está la interpretación de cada gráfica:
Series Temporales Diferenciadas (Consumo vs Precipitación):
La línea azul representa las diferencias en el consumo diario de energía a lo largo del tiempo.
La línea roja representa las diferencias en la precipitación diaria a lo largo del tiempo.
Se puede observar cómo fluctúan ambas series a lo largo del tiempo y si hay algún patrón o tendencia común entre ellas.
Series Temporales Diferenciadas (Consumo vs Temperatura):
La línea azul representa las diferencias en el consumo diario de energía a lo largo del tiempo.
La línea verde representa las diferencias en la temperatura promedio diaria a lo largo del tiempo.
Al igual que en el gráfico anterior, se busca identificar si hay alguna relación o patrón entre las dos series.
Residuos de la Regresión (Consumo vs Precipitación):
Esta gráfica muestra los residuos de la regresión de Granger entre el consumo diario de energía y la precipitación diaria.
Los residuos representan la diferencia entre los valores observados y los valores predichos por el modelo de regresión.
Se busca si los residuos están distribuidos aleatoriamente alrededor de cero y si no muestran patrones o tendencias, lo que indicaría un buen ajuste del modelo.
Residuos de la Regresión (Consumo vs Temperatura):
Similar al gráfico anterior, esta gráfica muestra los residuos de la regresión de Granger entre el consumo diario de energía y la temperatura promedio diaria.
Se aplica la misma interpretación que en el tercer gráfico para evaluar la idoneidad del modelo de regresión.
Para realizar un seguimiento efectivo del consumo energético en Colombia basado en el análisis, se pueden sugerir los siguientes KPI (Key Performance Indicators):
Descripción: Mide el consumo total de energía en gigavatios-hora (GWh) durante un período específico (mensual, trimestral, anual).
Justificación: Este KPI permite observar la demanda total de energía y detectar patrones de crecimiento o disminución en el consumo.
Descripción: Mide el consumo promedio diario de energía en GWh.
Justificación: Este KPI ayuda a suavizar las fluctuaciones diarias y proporciona una visión más clara de la tendencia general en el consumo de energía.
Descripción: Mide la variación en el consumo de energía durante diferentes meses del año, identificando patrones estacionales.
Justificación: Identificar patrones estacionales permite planificar mejor la gestión de recursos energéticos y prever picos de demanda.
Descripción: Mide la correlación entre variables climáticas (precipitación, temperatura) y el consumo de energía.
Justificación: Este KPI permite entender cómo las condiciones climáticas afectan el consumo de energía, facilitando la previsión y adaptación a cambios climáticos.
Descripción: Mide el porcentaje de crecimiento en el consumo de energía en comparación con el período anterior (mensual, trimestral, anual).
Justificación: Este KPI ayuda a identificar tendencias de crecimiento o reducción en el consumo energético, esencial para la planificación y el desarrollo de políticas energéticas.
Descripción: Mide la precisión de los modelos predictivos utilizados (error medio absoluto, error cuadrático medio, etc.).
Justificación: Evaluar la precisión de los modelos predictivos permite ajustar y mejorar continuamente las predicciones de consumo de energía, asegurando una gestión más efectiva.
Descripción: Mide la proporción de energía consumida que proviene de fuentes renovables.
Justificación: Este KPI es crucial para evaluar el progreso hacia objetivos de sostenibilidad y la reducción de la dependencia de fuentes de energía no renovables.
Descripción: Mide el consumo de energía per cápita en kilovatios-hora (kWh).
Justificación: Este KPI ofrece una perspectiva sobre la eficiencia energética a nivel individual y ayuda a identificar áreas de mejora en la eficiencia energética.
Estos KPI proporcionan una visión integral y detallada del consumo energético, facilitando la toma de decisiones informadas y la implementación de estrategias efectivas para la gestión y planificación energética en Colombia.
Se presenta un analisis detallado del consumo de energía en Colombia, evaluando diferentes aspectos y utilizando varios métodos estadísticos y econométricos para comprender y predecir el comportamiento del consumo energético. A continuación, se resumen los puntos clave del análisis:
Análisis Mensual y Tendencial:
El mes de octubre presenta el mayor consumo total de energía con 26,467 GWh, mientras que septiembre tiene el mayor consumo promedio diario con 216 GWh.
Hay una tendencia creciente en el consumo de energía tanto total como promedio a lo largo de los años.
No se identifican datos omitidos, duplicados o atípicos en el consumo promedio diario.
Análisis de Series Temporales:
Las series temporales muestran una tendencia creciente en el consumo de energía a lo largo del tiempo.
La variación no explicada por la estacionalidad o la tendencia es significativa, indicando la necesidad de un análisis más robusto de los componentes.
Se observan patrones de estacionalidad con picos decrecientes en intervalos regulares.
La función de autocorrelación (ACF) y la función parcial de autocorrelación (PACF) sugieren la presencia de estacionalidad y tendencia en las series temporales.
Regresión Lineal y Modelo ARIMA:
Se implementó un modelo de regresión lineal para analizar el consumo mensual de energía, encontrando diferencias significativas en el consumo entre los meses.
El modelo ARIMA ajustado para datos horarios de consumo de energía es adecuado para capturar las dependencias temporales presentes en los datos, mostrando una alta precisión en las predicciones.
Análisis Integrado con Datos Meteorológicos:
Se incorporaron datos de precipitación y temperatura promedio diaria de la estación meteorológica de Bogotá/Eldorado.
El test de causalidad de Granger mostró que tanto la precipitación tienen una influencia significativa en el consumo diario de energía.
Conclusiones
En el documento proporciona un análisis exhaustivo del consumo de energía en Colombia, utilizando diversas técnicas para entender y predecir los patrones de consumo. Las principales conclusiones son:
Tendencia Creciente:
Patrones Estacionales:
Influencia de Factores Externos:
Modelos Predictivos Eficaces:
Finalmente, el análisis detallado y multifacético presentado en el documento ofrece una comprensión profunda del comportamiento del consumo de energía en Colombia, destacando la importancia de considerar tanto las tendencias históricas como los factores climáticos en la planificación y gestión energética.