Leer los datos
Instalar paquete para poder ejecutar comandos
# Instalar 'dplyr' (solo la primera vez, luego puedes comentar esta línea)
#install.packages("dplyr")
# Instalar 'lubridate' para trabajar con fechas (también solo la primera vez)
#install.packages("lubridate")
# Cargar el paquete dplyr para manipulación de datos
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.2
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Cargar el paquete lubridate para manejar fechas (semanas, meses, etc.)
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.5.2
##
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(magrittr)
Resumenes semanales y mensuales
# Crear un resumen semanal de la generación de residuos
resumen_semanal <- datos_residuos %>% # Toma la base de datos original
mutate(semana = floor_date(fecha, "week", week_start = 1)) %>% #Crea nueva columna semana con lunes de inicio
group_by(semana) %>% # Agrupa los datos por cada semana
summarise( # Resume las variables para cada grupo (cada semana)
total_residuos_t = sum(residuos_totales_t), # Suma total de residuos en la semana (toneladas)
promedio_diario_t = mean(residuos_totales_t), # Promedio diario de residuos en la semana
n_dias = n() # Número de días incluidos en esa semana
) %>% # Fin del resumen
ungroup() # Quita la agrupación para evitar problemas en pasos siguientes
# Ver las primeras filas del resumen semanal
head(resumen_semanal)
## # A tibble: 6 × 4
## semana total_residuos_t promedio_diario_t n_dias
## <dttm> <dbl> <dbl> <int>
## 1 2024-12-30 00:00:00 215. 43.0 5
## 2 2025-01-06 00:00:00 278. 39.7 7
## 3 2025-01-13 00:00:00 263. 37.6 7
## 4 2025-01-20 00:00:00 269. 38.4 7
## 5 2025-01-27 00:00:00 254. 36.3 7
## 6 2025-02-03 00:00:00 295. 42.1 7
View(resumen_semanal)
# Ver un resumen estadístico del total semanal de residuos
summary(resumen_semanal$total_residuos_t)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 128.9 265.9 280.7 276.4 290.7 311.0
RESUMEN MENSUAL
# Crear un resumen mensual de la generación de residuos
resumen_mensual <- datos_residuos %>% # Toma la base original
mutate(mes = floor_date(fecha, "month")) %>% # Crea una columna 'mes' con el primer día de cada mes
group_by(mes) %>% # Agrupa los datos por mes
summarise( # Resume las variables para cada mes
total_residuos_t = sum(residuos_totales_t), # Suma total de residuos en el mes (toneladas)
promedio_diario_t = mean(residuos_totales_t), # Promedio diario de residuos en el mes
n_dias = n() # Número de días incluidos en ese mes
) %>% # Fin del resumen
ungroup() # Quita la agrupación
# Ver las primeras filas del resumen mensual
head(resumen_mensual)
## # A tibble: 6 × 4
## mes total_residuos_t promedio_diario_t n_dias
## <dttm> <dbl> <dbl> <int>
## 1 2025-01-01 00:00:00 1214. 39.2 31
## 2 2025-02-01 00:00:00 1119. 40.0 28
## 3 2025-03-01 00:00:00 1248. 40.3 31
## 4 2025-04-01 00:00:00 1204 40.1 30
## 5 2025-05-01 00:00:00 1243. 40.1 31
## 6 2025-06-01 00:00:00 1170. 39.0 30
# Ver un resumen estadístico del total mensual de residuos
summary(resumen_mensual$total_residuos_t)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1119 1210 1231 1221 1249 1271
compara día feriado vs día normal
# Comparar la generación de residuos entre días normales y feriados
comparacion_feriados <- datos_residuos %>% # Toma la base de datos original
group_by(tipo_dia) %>% # Agrupa por tipo de día: "Normal" o "Feriado"
summarise( # Calcula estadísticas por cada tipo de día
promedio_residuos_t = mean(residuos_totales_t), # Promedio de residuos por día (toneladas)
sd_residuos_t = sd(residuos_totales_t), # Desviación estándar de residuos
minimo_residuos_t = min(residuos_totales_t), # Valor mínimo de residuos
maximo_residuos_t = max(residuos_totales_t), # Valor máximo de residuos
n_dias = n() # Número de días en cada categoría
) %>% # Fin del resumen
ungroup() # Quita la agrupación
# Ver la tabla de comparación entre días normales y feriados
comparacion_feriados
## # A tibble: 2 × 6
## tipo_dia promedio_residuos_t sd_residuos_t minimo_residuos_t maximo_residuos_t
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Feriado 50.8 7.38 38.7 62.2
## 2 Normal 39.8 5.83 30.1 49.8
## # ℹ 1 more variable: n_dias <int>
Gráficos inciales
# Histograma de residuos totales diarios
hist(
datos_residuos$residuos_totales_t, # Vector numérico con residuos diarios
main = "Histograma de residuos diarios (t/día)", # Título del gráfico
xlab = "Residuos totales (toneladas/día)", # Etiqueta del eje X
ylab = "Frecuencia" # Etiqueta del eje Y
)
# Boxplot para comparar residuos en días normales vs feriados
boxplot(
residuos_totales_t ~ tipo_dia, # Fórmula: residuos en función del tipo de día
data = datos_residuos, # Indica el data frame
main = "Residuos diarios: día normal vs feriado", # Título del gráfico
xlab = "Tipo de dia", # Etiqueta eje X
ylab = "Residuos totales (t/dia)" # Etiqueta eje Y
)
seperar feriados normales
# Filtrar el promedio de residuos en días normales
promedio_normal <- comparacion_feriados %>% # Toma la tabla de comparación
filter(tipo_dia == "Normal") %>% # Se queda solo con filas de tipo "Normal"
pull(promedio_residuos_t) # Extrae el valor de la columna promedio_residuos_t
# Filtrar el promedio de residuos en feriados
promedio_feriado <- comparacion_feriados %>% # Toma la misma tabla
filter(tipo_dia == "Feriado") %>% # Se queda solo con filas de tipo "Feriado"
pull(promedio_residuos_t) # Extrae el promedio de residuos en feriados
# Calcular el incremento absoluto (en toneladas)
incremento_absoluto <- promedio_feriado - promedio_normal # Diferencia entre promedios
incremento_absoluto
## [1] 10.94645
# Calcular el incremento relativo (en porcentaje)
incremento_relativo <- (incremento_absoluto / promedio_normal) * 100 # Diferencia / normal * 100
# Mostrar los resultados en consola
promedio_normal # Promedio t/día en día normal
## [1] 39.80446
promedio_feriado # Promedio t/día en feriado
## [1] 50.75091
incremento_absoluto # Cuántas toneladas más en feriado
## [1] 10.94645
incremento_relativo # % más de residuos en feriado
## [1] 27.50055
# Crear un vector con los dos promedios
valores_promedio <- c(promedio_normal, promedio_feriado) # Vector con ambos promedios
# Crear un vector con los nombres de las categorías
nombres_tipos <- c("Normal", "Feriado") # Etiquetas para cada barra
# Hacer un gráfico de barras para comparar los promedios
barplot(
valores_promedio, # Altura de las barras (los promedios)
names.arg = nombres_tipos, # Nombres debajo de cada barra
main = "Promedio de residuos diarios: día normal vs feriado", # Título del gráfico
xlab = "Tipo de dia", # Etiqueta eje X
ylab = "Residuos totales (t/dia)"# Etiqueta eje Y
)
Analizar series de tiempo
# Asegurarse de que los datos están ordenados por fecha
datos_residuos_ordenado <- datos_residuos %>% # Usa la base original
arrange(fecha) # Ordena las filas cronológicamente
# Crear un objeto de serie de tiempo (ts) con datos diarios
residuos_ts <- ts(
datos_residuos_ordenado$residuos_totales_t, # Vector numérico: residuos diarios
start = c(2025, 1), # Año 2025, "período" 1 (día 1)
frequency = 365 # Frecuencia: 365 observaciones por año (diario)
)
# Ver un resumen de la serie de tiempo
residuos_ts # Muestra parte de la serie en consola
## Time Series:
## Start = c(2025, 1)
## End = c(2025, 365)
## Frequency = 365
## [1] 46.44 49.01 44.64 41.97 33.12 33.12 31.16 47.32 42.02 44.16 30.41 49.40
## [13] 46.65 34.25 33.64 33.67 36.08 40.50 38.64 35.82 42.24 32.79 35.84 37.33
## [25] 39.12 45.70 33.99 40.28 41.85 30.93 42.15 33.41 31.30 48.98 49.31 46.17
## [37] 36.09 31.95 43.68 38.80 32.44 39.90 30.69 48.19 35.18 43.25 36.23 40.40
## [49] 40.93 33.70 49.39 45.50 48.79 47.90 41.96 48.44 31.77 33.92 30.90 36.51
## [61] 37.77 44.08 60.02 37.14 35.62 40.85 32.82 46.04 31.49 49.74 45.44 33.97
## [73] 30.11 46.31 44.14 44.58 45.43 31.48 37.17 32.32 47.26 42.47 36.62 31.27
## [85] 36.22 36.50 44.59 42.75 47.74 39.44 32.39 44.26 45.22 41.23 45.42 39.88
## [97] 40.45 38.55 30.51 32.16 30.63 42.73 36.29 40.17 48.15 34.99 38.21 54.33
## [109] 34.58 31.54 35.80 33.22 48.59 46.16 42.67 47.43 46.07 33.73 47.85 40.79
## [121] 46.15 57.72 36.36 32.20 34.56 38.54 46.36 47.21 30.14 40.21 38.35 34.44
## [133] 32.40 36.75 48.86 36.46 40.38 44.06 37.27 49.44 49.25 35.04 51.22 36.02
## [145] 35.70 30.74 42.19 40.05 31.03 35.57 48.17 34.79 32.90 39.79 49.71 34.84
## [157] 43.44 45.23 34.75 44.56 37.36 42.65 42.67 40.72 31.81 46.71 36.42 33.73
## [169] 30.82 41.82 43.55 30.33 40.24 34.53 42.90 33.49 43.82 37.73 48.73 32.75
## [181] 36.82 32.27 48.49 47.55 35.16 43.20 46.34 41.10 40.59 34.84 31.86 47.94
## [193] 48.01 42.66 36.78 36.98 44.52 47.94 47.74 45.60 42.84 31.68 33.23 47.97
## [205] 42.13 30.18 32.03 43.27 30.10 33.22 40.97 43.84 43.04 34.49 44.24 34.74
## [217] 36.51 44.93 42.99 46.98 43.15 41.37 38.66 37.35 35.30 34.88 49.46 37.86
## [229] 47.84 42.62 45.90 40.05 41.54 39.85 33.90 44.45 35.62 30.49 42.91 33.54
## [241] 48.81 49.08 48.30 37.40 30.31 48.57 38.56 49.33 49.27 47.06 35.89 37.70
## [253] 47.02 36.34 33.39 41.14 48.72 43.92 41.40 31.94 42.30 49.80 32.80 40.37
## [265] 47.55 44.82 43.94 44.05 37.19 35.87 46.19 46.20 47.34 48.26 40.23 40.03
## [277] 45.97 43.00 44.04 45.92 47.80 36.76 47.56 31.88 41.57 30.72 39.31 40.85
## [289] 35.73 41.82 30.61 30.75 46.45 37.20 32.54 40.44 45.40 34.32 42.46 31.71
## [301] 31.03 40.63 40.81 42.75 44.52 49.52 52.01 44.04 45.90 35.42 38.78 31.57
## [313] 30.51 49.25 46.72 43.92 38.18 33.47 33.13 35.00 40.98 44.29 43.20 35.60
## [325] 49.10 44.76 41.09 42.23 38.39 34.95 37.12 45.16 30.29 32.32 30.92 30.81
## [337] 47.11 44.07 39.48 31.96 39.83 39.47 33.46 38.68 37.97 42.32 42.70 30.91
## [349] 37.49 42.52 40.06 47.13 43.17 33.26 31.41 42.85 30.53 41.72 62.18 41.51
## [361] 37.76 42.87 39.17 40.91 48.83
# Ver clase del objeto (debe decir "ts")
class(residuos_ts)
## [1] "ts"
graficas de series de tiempo
# Graficar la serie de tiempo diaria
plot(residuos_ts)
plot(
residuos_ts, # La serie de tiempo que creamos
main = "Serie de tiempo de residuos diarios (2025)", # Título del gráfico
xlab = "Tiempo (días del año 2025)", # Etiqueta eje X
ylab = "Residuos totales (toneladas/día)" # Etiqueta eje Y
)
# mejorar visualización
# Instalar el paquete 'zoo' para promedios móviles (solo la primera vez)
#install.packages("zoo")
# Cargar el paquete 'zoo'
library(zoo)
## Warning: package 'zoo' was built under R version 4.5.2
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
# Calcular un promedio móvil de 7 días (ventana semanal)
residuos_ma7 <- rollmean(
residuos_ts, # Serie de tiempo original
k = 7, # Tamaño de la ventana: 7 días
align = "center", # Centra la ventana en cada punto
fill = NA # Rellena bordes con NA para mantener la misma longitud
)
# Graficar serie original + promedio móvil
plot(
residuos_ts, # Serie original
main = "Residuos diarios y promedio movil de 7 días", # Título del gráfico
xlab = "Tiempo (dias)", # Etiqueta eje X
ylab = "Residuos (t/dia)" # Etiqueta eje Y
)
# Crear una serie de tiempo mensual con el total de residuos por mes
residuos_mensual_ts <- ts(
resumen_mensual$total_residuos_t, # Vector con el total mensual de residuos
start = c(2025, 1), # Año 2025, mes 1 (enero)
frequency = 12 # 12 observaciones por año (mensual)
)
# Ver la serie mensual en consola
residuos_mensual_ts
## Jan Feb Mar Apr May Jun Jul Aug Sep
## 2025 1214.24 1119.17 1247.89 1204.00 1242.84 1169.61 1251.03 1270.85 1256.38
## Oct Nov Dec
## 2025 1228.55 1211.42 1233.06
# Graficar la serie mensual
plot(
residuos_mensual_ts, # Serie mensual
main = "Serie de tiempo mensual de residuos (2025)", # Título
xlab = "Tiempo (meses)", # Eje X
ylab = "Residuos totales (t/mes)" # Eje Y
)
Graficos de de los 12 meses por días
# Instalar paquetes (solo la primera vez)
# install.packages(c("ggplot2","tidyr"))
# Cargar paquetes necesarios
library(dplyr) # Manipulación de datos
library(lubridate) # Extraer año/mes/día desde fecha
library(tidyr) # Para completar días faltantes
##
## Adjuntando el paquete: 'tidyr'
## The following object is masked from 'package:magrittr':
##
## extract
library(ggplot2) # Gráficos
# Etiquetas de meses en español (estables, sin depender del locale)
mes_labels <- c("Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic")
# Preparar tabla: día del mes (1-31) y mes (1-12)
datos_dia_mes <- datos_residuos %>%
mutate(
fecha = as.Date(fecha), # Asegura que fecha sea tipo Date
anio = year(fecha), # Extrae año
mes_num = month(fecha), # Extrae mes como número (1-12)
mes = factor(mes_num, levels = 1:12, labels = mes_labels), # Mes como factor con etiquetas
dia_mes = day(fecha) # Extrae día del mes (1-31)
) %>%
group_by(anio, mes, dia_mes) %>% # Agrupa por año, mes y día del mes
summarise(
residuos_t = sum(residuos_totales_t), # Suma por si hay más de un registro por día
.groups = "drop"
) %>%
complete( # Completa días 1:31 para cada mes (si faltan)
anio, mes, dia_mes = 1:31,
fill = list(residuos_t = NA_real_)
)
# (Opcional) Si solo quieres graficar 2025, filtra aquí:
datos_dia_mes <- datos_dia_mes %>% filter(anio == 2025)
# Gráfico: 12 líneas (una por mes) recorriendo días del mes
ggplot(datos_dia_mes, aes(x = dia_mes, y = residuos_t, color = mes, group = mes)) +
geom_line(linewidth = 0.9, na.rm = TRUE) + # Línea por mes
geom_point(size = 1.2, na.rm = TRUE) + # Puntos para ver datos reales
scale_x_continuous(breaks = seq(1, 31, 2)) + # Marcas en el eje X
labs(
title = "Patrón diario por mes (12 líneas)",
x = "Día del mes",
y = "Residuos totales (t/día)",
color = "Mes"
) +
theme_minimal()
digrama de cajas por día
library(dplyr)
library(lubridate)
library(ggplot2)
datos_box_dia <- datos_residuos %>%
mutate(
fecha = as.Date(fecha),
dia_mes = factor(day(fecha), levels = 1:31) # 1..31 como categorías ordenadas
)
ggplot(datos_box_dia, aes(x = dia_mes, y = residuos_totales_t)) +
geom_boxplot(na.rm = TRUE, outlier.alpha = 0.4) +
geom_jitter(width = 0.15, alpha = 0.25, na.rm = TRUE) +
labs(
title = "Distribucion de residuos por dia del mes",
x = "Dia del mes",
y = "Residuos totales (t/dia)"
) +
theme_minimal()
heapmap diario
# 1) Consolidar a 1 valor por fecha (por si hay duplicados en un mismo día)
diario <- datos_residuos %>%
mutate(fecha = as.Date(fecha)) %>%
group_by(fecha) %>%
summarise(residuos_t = sum(residuos_totales_t, na.rm = TRUE), .groups = "drop")
# 2) Completar días faltantes entre min y max (para que el "calendario" no tenga huecos raros)
diario_completo <- diario %>%
complete(fecha = seq.Date(min(fecha), max(fecha), by = "day")) %>%
mutate(
anio = isoyear(fecha),
semana = isoweek(fecha),
dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE) # Lun..Dom
)
# 3) Heatmap tipo GitHub (semana vs día de semana), por año
ggplot(diario_completo, aes(x = semana, y = dia_sem, fill = residuos_t)) +
geom_tile(color = NA) +
facet_wrap(~ anio, ncol = 1) +
labs(
title = "Calendar heatmap de residuos (diario)",
x = "Semana ISO",
y = "Día de la semana",
fill = "t/día"
) +
theme_minimal()
boxplo díario
datos_semana <- datos_residuos %>%
mutate(
fecha = as.Date(fecha),
dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE) # Lun..Dom
)
ggplot(datos_semana, aes(x = dia_sem, y = residuos_totales_t)) +
geom_boxplot(na.rm = TRUE, outlier.alpha = 0.4) +
geom_jitter(width = 0.15, alpha = 0.25, na.rm = TRUE) +
labs(
title = "Residuos por día de la semana",
x = "Día de la semana",
y = "Residuos (t/día)"
) +
theme_minimal()
boxplot mensual
mes_labels <- c("Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic")
datos_mes <- datos_residuos %>%
mutate(
fecha = as.Date(fecha),
mes = factor(month(fecha), levels = 1:12, labels = mes_labels)
)
ggplot(datos_mes, aes(x = mes, y = residuos_totales_t)) +
geom_boxplot(na.rm = TRUE, outlier.alpha = 0.4) +
geom_jitter(width = 0.15, alpha = 0.25, na.rm = TRUE) +
labs(
title = "Residuos por mes",
x = "Mes",
y = "Residuos (t/día)"
) +
theme_minimal()
# Instalar el paquete 'forecast' (solo la primera vez)
#install.packages("forecast")
# Cargar el paquete 'forecast'
library(forecast)
## Warning: package 'forecast' was built under R version 4.5.2
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
# Ajustar un modelo ARIMA automáticamente a la serie mensual
modelo_arima <- auto.arima(
residuos_mensual_ts # Serie mensual de entrada para el modelo
)
# Ver el resumen del modelo ARIMA ajustado
summary(
modelo_arima # Muestra coeficientes, AIC, etc.
)
## Series: residuos_mensual_ts
## ARIMA(0,0,0) with non-zero mean
##
## Coefficients:
## mean
## 1220.7533
## s.e. 11.6301
##
## sigma^2 = 1771: log likelihood = -61.38
## AIC=126.76 AICc=128.09 BIC=127.73
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -4.547474e-13 40.28761 30.88778 -0.1137917 2.577488 NaN
## ACF1
## Training set -0.1132613
# Hacer un pronóstico de 12 meses (todo el año 2026)
pronostico_2026 <- forecast(
modelo_arima, # Modelo previamente ajustado
h = 12 # Horizonte de pronóstico: 12 meses hacia adelante
)
# Ver los valores del pronóstico en consola
pronostico_2026 # Muestra predicciones, error estándar y rangos de confianza
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Jan 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Feb 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Mar 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Apr 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## May 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Jun 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Jul 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Aug 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Sep 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Oct 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Nov 2026 1220.753 1166.827 1274.68 1138.28 1303.227
## Dec 2026 1220.753 1166.827 1274.68 1138.28 1303.227
# Graficar el pronóstico junto con la serie histórica
plot(
pronostico_2026, # Objeto de pronóstico (forecast)
main = "Pronóstico mensual de residuos para 2026", # Título del gráfico
xlab = "Tiempo (meses)", # Etiqueta eje X
ylab = "Residuos totales (t/mes)" # Etiqueta eje Y
)
library(dplyr)
# Asegurarse de que los datos están ordenados por fecha
datos_residuos_ordenado <- datos_residuos %>% # Usa tu data frame original
arrange(fecha) # Ordena de la fecha más antigua a la más reciente
# Crear la serie de tiempo diaria con frecuencia semanal (7 días)
residuos_diario_ts <- ts(
datos_residuos_ordenado$residuos_totales_t, # Vector numérico: residuos diarios
start = c(2025, 1), # Año 2025, día 1 (aprox.)
frequency = 7 # Frecuencia semanal: 7 observaciones por “ciclo”
)
# Descomponer la serie diaria (estacionalidad semanal)
descomp_diaria <- decompose(
residuos_diario_ts, # Serie de tiempo diaria
type = "additive" # Modelo aditivo
)
# Ver el gráfico con serie, tendencia, estacionalidad y residuo
plot(descomp_diaria)
Inciar calculo de genración electrica
# Cargar dplyr por si no está cargado
library(dplyr)
# Definir el poder calorífico inferior (PCI) en MJ/kg (puedes cambiarlo)
PCI_MJ_kg <- 8 # Supuesto: 8 MJ por kg de residuo
# Definir la eficiencia eléctrica de la planta (fracción entre 0 y 1)
eficiencia_electrica <- 0.25 # Supuesto: 25% de la energía térmica se convierte en electricidad
# Definir el consumo promedio mensual de una vivienda en kWh/mes
consumo_mensual_kWh_hogar <- 170 # Dato dado: 170 kWh por mes por vivienda
# Aproximar el consumo diario de una vivienda (suponiendo 30 días/mes)
consumo_diario_kWh_hogar <- consumo_mensual_kWh_hogar / 30 # kWh/día por vivienda
# Calcular el consumo anual de una vivienda (12 meses)
consumo_anual_kWh_hogar <- consumo_mensual_kWh_hogar * 12 # kWh/año por vivienda
# Ordenar la base por fecha y calcular energía diaria y viviendas equivalentes
datos_residuos_energia <- datos_residuos %>% # Tomar la base original de residuos
arrange(fecha) %>% # Ordenar por fecha cronológicamente
mutate(
masa_residuos_kg = residuos_totales_t * 1000, # Convertir toneladas/día a kg/día
energia_bruta_MJ = masa_residuos_kg * PCI_MJ_kg, # Energía térmica diaria en MJ
energia_electrica_kWh = energia_bruta_MJ * # Energía eléctrica diaria en kWh =
eficiencia_electrica / 3.6, # (MJ * eficiencia) / 3.6 MJ/kWh
viviendas_equivalentes_dia = # Número de viviendas que se podrían abastecer ese día =
energia_electrica_kWh / consumo_diario_kWh_hogar # kWh disponibles / kWh por vivienda por día
)
View(datos_residuos_energia)
# Ver algunas filas para comprobar los cálculos
head(datos_residuos_energia) # Muestra las primeras filas de la tabla con energía
## # A tibble: 6 × 11
## fecha dia_semana es_feriado tipo_dia residuos_base_t
## <dttm> <chr> <lgl> <chr> <dbl>
## 1 2025-01-01 00:00:00 Wednesday TRUE Feriado 37.5
## 2 2025-01-02 00:00:00 Thursday FALSE Normal 49.0
## 3 2025-01-03 00:00:00 Friday FALSE Normal 44.6
## 4 2025-01-04 00:00:00 Saturday FALSE Normal 42.0
## 5 2025-01-05 00:00:00 Sunday FALSE Normal 33.1
## 6 2025-01-06 00:00:00 Monday FALSE Normal 33.1
## # ℹ 6 more variables: factor_incremento <dbl>, residuos_totales_t <dbl>,
## # masa_residuos_kg <dbl>, energia_bruta_MJ <dbl>,
## # energia_electrica_kWh <dbl>, viviendas_equivalentes_dia <dbl>
# Calcular la energía total anual producida
energia_total_anual_kWh <- sum( # Sumar toda la energía del año
datos_residuos_energia$energia_electrica_kWh # Vector de energía diaria en kWh
)
View(energia_total_anual_kWh)
# Calcular cuántas viviendas puedo abastecer en promedio en el año
viviendas_equivalentes_anual <- # Número de viviendas equivalentes en el año
energia_total_anual_kWh / consumo_anual_kWh_hogar # kWh anuales disponibles / kWh por vivienda por año
# Ver resultados anuales en consola
energia_total_anual_kWh # Energía total anual en kWh
## [1] 8138356
viviendas_equivalentes_anual # Viviendas equivalentes abastecidas en el año
## [1] 3989.39
# Crear un resumen semanal con residuos, energía y viviendas equivalentes
resumen_semanal_energia <- datos_residuos_energia %>% # Tomar la tabla con energía diaria
mutate(
semana = lubridate::floor_date( # Crear una columna de semana
fecha, "week", week_start = 1 # La semana empieza el lunes (1 = lunes)
)
) %>%
group_by(semana) %>% # Agrupar por semana
summarise(
total_residuos_t = sum(residuos_totales_t), # Suma semanal de residuos (toneladas)
total_energia_kWh = sum(energia_electrica_kWh), # Suma semanal de energía (kWh)
promedio_diario_residuos_t = mean(residuos_totales_t), # Promedio diario de residuos en esa semana
promedio_diario_energia_kWh = mean(energia_electrica_kWh), # Promedio diario de energía en esa semana
n_dias = n() # Número de días en esa semana (normalmente 7)
) %>%
ungroup() %>% # Quitar la agrupación
mutate(
consumo_semanal_kWh_hogar = # Consumo semanal por vivienda
consumo_diario_kWh_hogar * 7, # kWh/día * 7 días
viviendas_equivalentes_semana = # Viviendas equivalentes por semana
total_energia_kWh / consumo_semanal_kWh_hogar # kWh semanales disponibles / kWh semanales por vivienda
)
# Ver las primeras filas del resumen semanal
head(resumen_semanal_energia) # Muestra tabla semanal con energía y viviendas
## # A tibble: 6 × 8
## semana total_residuos_t total_energia_kWh promedio_diario_resid…¹
## <dttm> <dbl> <dbl> <dbl>
## 1 2024-12-30 00:00:00 215. 119544. 43.0
## 2 2025-01-06 00:00:00 278. 154217. 39.7
## 3 2025-01-13 00:00:00 263. 146350 37.6
## 4 2025-01-20 00:00:00 269. 149356. 38.4
## 5 2025-01-27 00:00:00 254. 141061. 36.3
## 6 2025-02-03 00:00:00 295. 163878. 42.1
## # ℹ abbreviated name: ¹promedio_diario_residuos_t
## # ℹ 4 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## # consumo_semanal_kWh_hogar <dbl>, viviendas_equivalentes_semana <dbl>
# Crear un resumen mensual con residuos, energía y viviendas equivalentes
resumen_mensual_energia <- datos_residuos_energia %>% # Tomar la tabla diaria con energía
mutate(
mes = lubridate::floor_date(fecha, "month") # Crear columna con el primer día del mes
) %>%
group_by(mes) %>% # Agrupar por mes
summarise(
total_residuos_t = sum(residuos_totales_t), # Suma mensual de residuos (toneladas)
total_energia_kWh = sum(energia_electrica_kWh), # Suma mensual de energía (kWh)
promedio_diario_residuos_t = mean(residuos_totales_t), # Promedio diario de residuos en el mes
promedio_diario_energia_kWh = mean(energia_electrica_kWh), # Promedio diario de energía en el mes
n_dias = n() # Número de días en ese mes (28–31)
) %>%
ungroup() %>% # Quitar agrupación
mutate(
viviendas_equivalentes_mes = # Viviendas equivalentes por mes
total_energia_kWh / consumo_mensual_kWh_hogar # kWh mensuales disponibles / 170 kWh/mes por vivienda
)
# Ver las primeras filas del resumen mensual
head(resumen_mensual_energia) # Muestra la tabla mensual con energía y viviendas
## # A tibble: 6 × 7
## mes total_residuos_t total_energia_kWh promedio_diario_resid…¹
## <dttm> <dbl> <dbl> <dbl>
## 1 2025-01-01 00:00:00 1214. 674578. 39.2
## 2 2025-02-01 00:00:00 1119. 621761. 40.0
## 3 2025-03-01 00:00:00 1248. 693272. 40.3
## 4 2025-04-01 00:00:00 1204 668889. 40.1
## 5 2025-05-01 00:00:00 1243. 690467. 40.1
## 6 2025-06-01 00:00:00 1170. 649783. 39.0
## # ℹ abbreviated name: ¹promedio_diario_residuos_t
## # ℹ 3 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## # viviendas_equivalentes_mes <dbl>
graficos de nergia
# Ver las primeras filas del resumen mensual para comprobar su contenido
head(resumen_mensual_energia) # Debe tener columnas como mes, total_energia_kWh, viviendas_equivalentes_mes
## # A tibble: 6 × 7
## mes total_residuos_t total_energia_kWh promedio_diario_resid…¹
## <dttm> <dbl> <dbl> <dbl>
## 1 2025-01-01 00:00:00 1214. 674578. 39.2
## 2 2025-02-01 00:00:00 1119. 621761. 40.0
## 3 2025-03-01 00:00:00 1248. 693272. 40.3
## 4 2025-04-01 00:00:00 1204 668889. 40.1
## 5 2025-05-01 00:00:00 1243. 690467. 40.1
## 6 2025-06-01 00:00:00 1170. 649783. 39.0
## # ℹ abbreviated name: ¹promedio_diario_residuos_t
## # ℹ 3 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## # viviendas_equivalentes_mes <dbl>
# Crear un gráfico de barras con la energía total mensual (kWh)
barplot(
height = resumen_mensual_energia$total_energia_kWh, # Altura de cada barra = energía total del mes en kWh
names.arg = format(resumen_mensual_energia$mes, "%b"), # Etiquetas del eje X = abreviatura del mes (Ene, Feb, etc.)
main = "Energia mensual generada a partir de residuos (kWh)", # Título del gráfico
xlab = "Mes", # Etiqueta del eje X
ylab = "Energía generada (kWh/mes)" # Etiqueta del eje Y
)
# Verificar que la columna viviendas_equivalentes_mes existe
head(resumen_mensual_energia$viviendas_equivalentes_mes) # Muestra algunos valores de viviendas por mes
## [1] 3968.105 3657.418 4078.072 3934.641 4061.569 3822.255
# Crear un gráfico de barras con viviendas equivalentes por mes
barplot(
height = resumen_mensual_energia$viviendas_equivalentes_mes, # Altura = número de viviendas equivalentes por mes
names.arg = format(resumen_mensual_energia$mes, "%b"), # Etiquetas de los meses en el eje X
main = "Viviendas equivalentes abastecidas por mes", # Título del gráfico
xlab = "Mes", # Etiqueta del eje X
ylab = "Viviendas equivalentes (unidad)" # Etiqueta del eje Y
)
# Cargar dplyr por si no está cargado
library(dplyr)
# Definir el consumo mensual promedio por vivienda en kWh/mes
consumo_mensual_kWh_hogar <- 170 # Dato que tú diste: 170 kWh por mes
# Calcular el consumo diario promedio por vivienda (aprox. 30 días/mes)
consumo_diario_kWh_hogar <- consumo_mensual_kWh_hogar / 30 # kWh por día por vivienda
# Crear una nueva columna con viviendas equivalentes promedio por día en cada mes
resumen_mensual_energia <- resumen_mensual_energia %>% # Tomar el resumen mensual que ya tienes
mutate(
viviendas_promedio_diarias = # Nueva columna: viviendas promedio por día en el mes
promedio_diario_energia_kWh / consumo_diario_kWh_hogar # Energía diaria promedio / consumo diario por vivienda
)
# Ver las primeras filas para comprobar las nuevas columnas
head(resumen_mensual_energia) # Debes ver 'promedio_diario_energia_kWh' y 'viviendas_promedio_diarias'
## # A tibble: 6 × 8
## mes total_residuos_t total_energia_kWh promedio_diario_resid…¹
## <dttm> <dbl> <dbl> <dbl>
## 1 2025-01-01 00:00:00 1214. 674578. 39.2
## 2 2025-02-01 00:00:00 1119. 621761. 40.0
## 3 2025-03-01 00:00:00 1248. 693272. 40.3
## 4 2025-04-01 00:00:00 1204 668889. 40.1
## 5 2025-05-01 00:00:00 1243. 690467. 40.1
## 6 2025-06-01 00:00:00 1170. 649783. 39.0
## # ℹ abbreviated name: ¹promedio_diario_residuos_t
## # ℹ 4 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## # viviendas_equivalentes_mes <dbl>, viviendas_promedio_diarias <dbl>
ultimo
library(dplyr)
library(tidyr)
library(lubridate)
library(ggplot2)
# =========================
# 1) ENERGÍA DIARIA REAL 2025 (kWh/día)
# =========================
energia_2025 <- datos_residuos_energia %>%
mutate(fecha = as.Date(fecha)) %>%
group_by(fecha) %>%
summarise(energia_kWh = sum(energia_electrica_kWh, na.rm = TRUE), .groups = "drop") %>%
filter(year(fecha) == 2025)
# =========================
# 2) PESOS POR DÍA DE SEMANA (a partir de 2025)
# Esto se usa para repartir el total mensual pronosticado de 2026 en días
# =========================
pesos_dow <- datos_residuos %>%
mutate(fecha = as.Date(fecha)) %>%
filter(year(fecha) == 2025) %>%
mutate(dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)) %>%
group_by(dia_sem) %>%
summarise(media_t = mean(residuos_totales_t, na.rm = TRUE), .groups = "drop") %>%
mutate(peso = media_t / mean(media_t, na.rm = TRUE)) %>%
select(dia_sem, peso)
# =========================
# 3) RESIDUOS MENSUALES PROYECTADOS 2026 (desde forecast)
# =========================
residuos_2026_mensual <- tibble(
mes = seq.Date(as.Date("2026-01-01"), by = "month", length.out = 12),
total_residuos_t = as.numeric(pronostico_2026$mean) # <-- total t/mes pronosticado
)
# =========================
# 4) DESAGREGAR A DIARIO 2026 CONSERVANDO TOTALES MENSUALES
# usando el patrón de día de semana de 2025
# =========================
residuos_2026_diario <- residuos_2026_mensual %>%
rowwise() %>%
mutate(
fechas = list(seq.Date(mes, ceiling_date(mes, "month") - days(1), by = "day"))
) %>%
unnest(fechas) %>%
rename(fecha = fechas) %>%
mutate(
dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)
) %>%
left_join(pesos_dow, by = "dia_sem") %>%
group_by(mes) %>%
mutate(
# normalizar pesos dentro del mes para que la suma diaria = total mensual
peso_norm = peso / sum(peso, na.rm = TRUE),
residuos_t_dia = total_residuos_t * peso_norm
) %>%
ungroup()
# =========================
# 5) PASAR RESIDUOS 2026 -> ENERGÍA 2026 (kWh/día)
# =========================
energia_2026 <- residuos_2026_diario %>%
mutate(
masa_kg = residuos_t_dia * 1000,
energia_bruta_MJ = masa_kg * PCI_MJ_kg,
energia_kWh = energia_bruta_MJ * eficiencia_electrica / 3.6
) %>%
select(fecha, energia_kWh)
# =========================
# 6) UNIR 2025 (real) + 2026 (proyectado)
# =========================
energia_all <- bind_rows(
energia_2025 %>% mutate(tipo = "Real 2025"),
energia_2026 %>% mutate(tipo = "Proyección 2026")
) %>%
mutate(
anio = year(fecha),
# semana del año basada en lunes (sin problemas de ISO-year)
semana_inicio = floor_date(fecha, "week", week_start = 1),
semana0 = floor_date(as.Date(paste0(anio, "-01-01")), "week", week_start = 1),
semana = as.integer(difftime(semana_inicio, semana0, units = "weeks")) + 1,
dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)
)
# (opcional) completar días faltantes para que el heatmap no quede "hueco"
energia_all <- energia_all %>%
group_by(anio, tipo) %>%
complete(
fecha = seq.Date(min(fecha), max(fecha), by = "day")
) %>%
ungroup() %>%
mutate(
semana_inicio = floor_date(fecha, "week", week_start = 1),
semana0 = floor_date(as.Date(paste0(year(fecha), "-01-01")), "week", week_start = 1),
semana = as.integer(difftime(semana_inicio, semana0, units = "weeks")) + 1,
dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)
)
# =========================
# 7) HEATMAP (ENERGÍA kWh/día) 2025 vs 2026
# =========================
ggplot(energia_all, aes(x = semana, y = dia_sem, fill = energia_kWh)) +
geom_tile(color = NA) +
facet_wrap(~ tipo, ncol = 1) +
labs(
title = "Heatmap calendario de generación de energía (kWh/día): 2025 real vs 2026 proyectado",
x = "Semana del año (inicio lunes)",
y = "Día de la semana",
fill = "kWh/día"
) +
theme_minimal()
###############################################
# VALORIZACIÓN ENERGÉTICA CON VARIACIÓN MENSUAL
# Ecuador: más residuos en feriados (Carnaval, Semana Santa, Finados, Navidad)
###############################################
########## 0. LIBRERÍAS ##########
# Ejecutar solo una vez si no está instalado:
# install.packages("ggplot2")
library(ggplot2)
########## 1. CONSTANTES Y PARÁMETROS GLOBALES ##########
MJ_por_kWh <- 3.6 # 1 kWh = 3,6 MJ
dias_anio <- 365
horas_anio <- 8760 # 24*365
# Días por mes (año no bisiesto)
dias_mes <- c(
31, # Enero
28, # Febrero
31, # Marzo
30, # Abril
31, # Mayo
30, # Junio
31, # Julio
31, # Agosto
30, # Septiembre
31, # Octubre
30, # Noviembre
31 # Diciembre
)
nombres_mes <- c(
"Enero", "Febrero", "Marzo", "Abril",
"Mayo", "Junio", "Julio", "Agosto",
"Septiembre", "Octubre", "Noviembre", "Diciembre"
)
# Consumo típico de un hogar (ajusta a tu realidad)
consumo_hogar_kWh_anio <- 4000 # kWh/año por vivienda (ejemplo)
########## 2. FUNCIÓN BÁSICA: ENERGÍA DIARIA A PARTIR DE RESIDUOS ##########
# Calcula energía bruta y útil (solo a nivel diario)
energia_residuo_diaria <- function(masa_t_dia,
PCI_MJ_kg,
eficiencia_electrica = 0.25,
eficiencia_termica = 0.00,
disponibilidad = 0.90) {
# masa en kg/día
masa_kg_dia <- masa_t_dia * 1000
# energía bruta en el residuo
energia_bruta_MJ_dia <- masa_kg_dia * PCI_MJ_kg
energia_bruta_kWh_dia <- energia_bruta_MJ_dia / MJ_por_kWh
# energía útil diaria
energia_el_kWh_dia <- energia_bruta_kWh_dia * eficiencia_electrica * disponibilidad
energia_th_kWh_dia <- energia_bruta_kWh_dia * eficiencia_termica * disponibilidad
list(
masa_t_dia = masa_t_dia,
PCI_MJ_kg = PCI_MJ_kg,
eficiencia_electrica = eficiencia_electrica,
eficiencia_termica = eficiencia_termica,
disponibilidad = disponibilidad,
energia_bruta_MJ_dia = energia_bruta_MJ_dia,
energia_bruta_kWh_dia = energia_bruta_kWh_dia,
energia_el_kWh_dia = energia_el_kWh_dia,
energia_th_kWh_dia = energia_th_kWh_dia
)
}
########## 3. TABLA MENSUAL PARA UN AÑO (CON VARIACIÓN POR MES) ##########
# multip_mes: vector de 12 factores (1 = igual al promedio anual)
# Ejemplo Ecuador (puedes ajustar):
# - Febrero (Carnaval) -> 1.10
# - Marzo (Semana Santa aprox)-> 1.05
# - Noviembre (Finados) -> 1.08
# - Diciembre (Navidad/Año Nuevo) -> 1.20
calcular_ano_mensual <- function(
masa_t_dia_base,
PCI_MJ_kg,
eficiencia_electrica = 0.25,
eficiencia_termica = 0.00,
disponibilidad = 0.90,
multip_mes = c(
1.00, # Ene
1.10, # Feb (Carnaval)
1.05, # Mar (Semana Santa aproximada)
1.00, # Abr
1.00, # May
1.00, # Jun
1.00, # Jul
1.00, # Ago
1.00, # Sep
1.00, # Oct
1.08, # Nov (Finados)
1.20 # Dic (Navidad / Año Nuevo)
)
) {
if (length(multip_mes) != 12) {
stop("El vector multip_mes debe tener 12 valores (uno por mes).")
}
n_meses <- 12
masa_t_dia_mes <- numeric(n_meses)
masa_t_mes <- numeric(n_meses)
energia_el_kWh_dia <- numeric(n_meses)
energia_el_kWh_mes <- numeric(n_meses)
for (i in 1:n_meses) {
# masa diaria ajustada por mes
masa_t_dia_mes[i] <- masa_t_dia_base * multip_mes[i]
# energía diaria para ese mes
res_dia <- energia_residuo_diaria(
masa_t_dia = masa_t_dia_mes[i],
PCI_MJ_kg = PCI_MJ_kg,
eficiencia_electrica = eficiencia_electrica,
eficiencia_termica = eficiencia_termica,
disponibilidad = disponibilidad
)
energia_el_kWh_dia[i] <- res_dia$energia_el_kWh_dia
# masa y energía mensual
masa_t_mes[i] <- masa_t_dia_mes[i] * dias_mes[i]
energia_el_kWh_mes[i] <- energia_el_kWh_dia[i] * dias_mes[i]
}
energia_el_kWh_anio <- sum(energia_el_kWh_mes)
energia_el_GWh_anio <- energia_el_kWh_anio / 1e6
tabla <- data.frame(
mes = 1:12,
nombre_mes = factor(nombres_mes, levels = nombres_mes),
dias_mes = dias_mes,
multip_mes = multip_mes,
masa_t_dia = masa_t_dia_mes,
masa_t_mes = masa_t_mes,
energia_el_kWh_dia = energia_el_kWh_dia,
energia_el_kWh_mes = energia_el_kWh_mes
)
list(
tabla_mensual = tabla,
energia_el_kWh_anio = energia_el_kWh_anio,
energia_el_GWh_anio = energia_el_GWh_anio
)
}
########## 4. EJEMPLO: AÑO BASE CON VARIACIÓN MENSUAL ##########
# Aquí defines TU ESCENARIO BASE:
# - masa_t_dia_base: promedio diario de residuos (t/día)
# - PCI: buen poder calorífico (MJ/kg)
masa_t_dia_base_ej <- 100 # t/día (ejemplo, se puede cambiar )
PCI_MJ_kg_ej <- 12 # MJ/kg (RSU con buen PCI)
ef_el_ej <- 0.25 # 25 % eficiencia eléctrica
ef_th_ej <- 0.00 # no uso calor en este ejemplo
disp_ej <- 0.90 # 90 % disponibilidad
resultado_ano_base <- calcular_ano_mensual(
masa_t_dia_base = masa_t_dia_base_ej,
PCI_MJ_kg = PCI_MJ_kg_ej,
eficiencia_electrica = ef_el_ej,
eficiencia_termica = ef_th_ej,
disponibilidad = disp_ej
)
tabla_mensual_base <- resultado_ano_base$tabla_mensual
tabla_mensual_base
## mes nombre_mes dias_mes multip_mes masa_t_dia masa_t_mes energia_el_kWh_dia
## 1 1 Enero 31 1.00 100 3100 75000
## 2 2 Febrero 28 1.10 110 3080 82500
## 3 3 Marzo 31 1.05 105 3255 78750
## 4 4 Abril 30 1.00 100 3000 75000
## 5 5 Mayo 31 1.00 100 3100 75000
## 6 6 Junio 30 1.00 100 3000 75000
## 7 7 Julio 31 1.00 100 3100 75000
## 8 8 Agosto 31 1.00 100 3100 75000
## 9 9 Septiembre 30 1.00 100 3000 75000
## 10 10 Octubre 31 1.00 100 3100 75000
## 11 11 Noviembre 30 1.08 108 3240 81000
## 12 12 Diciembre 31 1.20 120 3720 90000
## energia_el_kWh_mes
## 1 2325000
## 2 2310000
## 3 2441250
## 4 2250000
## 5 2325000
## 6 2250000
## 7 2325000
## 8 2325000
## 9 2250000
## 10 2325000
## 11 2430000
## 12 2790000
resultado_ano_base$energia_el_GWh_anio # energía anual en GWh (escenario base)
## [1] 28.34625
########## 5. GRÁFICAS PARA EL AÑO BASE ##########
# 5.1. Masa de residuos por mes (t/mes)
ggplot(tabla_mensual_base, aes(x = nombre_mes, y = masa_t_mes)) +
geom_col(fill = "darkgreen") +
labs(
title = "Masa de residuos tratada por mes",
x = "Mes",
y = "Masa de residuos (t/mes)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 0, hjust = 0.5))
# 5.2. Energía eléctrica por mes (MWh/mes)
tabla_mensual_base$energia_el_MWh_mes <- tabla_mensual_base$energia_el_kWh_mes / 1000
ggplot(tabla_mensual_base, aes(x = nombre_mes, y = energia_el_MWh_mes)) +
geom_col(fill = "steelblue") +
labs(
title = "Energía eléctrica generada por mes",
x = "Mes",
y = "Energía eléctrica (MWh/mes)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 0, hjust = 0.5))
# 5.3. Línea comparando masa (t/mes) y energía (MWh/mes) normalizadas
tabla_mensual_base$masa_norm <- tabla_mensual_base$masa_t_mes / max(tabla_mensual_base$masa_t_mes)
tabla_mensual_base$energia_norm <- tabla_mensual_base$energia_el_MWh_mes / max(tabla_mensual_base$energia_el_MWh_mes)
ggplot(tabla_mensual_base, aes(x = mes)) +
geom_line(aes(y = masa_norm, colour = "Masa (t/mes)")) +
geom_line(aes(y = energia_norm, colour = "Energía (MWh/mes)")) +
scale_x_continuous(breaks = 1:12, labels = nombres_mes) +
labs(
title = "Comparación relativa masa vs energía por mes",
x = "Mes",
y = "Valor normalizado"
) +
scale_colour_manual(values = c("Masa (t/mes)" = "darkgreen",
"Energía (MWh/mes)" = "steelblue")) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
########## 6. PROYECCIÓN MULTIANUAL CON PATRÓN MENSUAL ##########
# Esta función proyecta varios años:
# - La masa base se multiplica por (1 + tasa_crecimiento)^año
# - El patrón mensual (multip_mes) se mantiene igual cada año
proyectar_meses_varios_anios <- function(
masa_t_dia_base,
PCI_MJ_kg,
eficiencia_electrica = 0.25,
eficiencia_termica = 0.00,
disponibilidad = 0.90,
multip_mes = rep(1, 12),
tasa_crecimiento = 0.02, # 2 % anual
n_anios = 10,
anio_inicio = 2025
) {
# Data.frame vacío "largo": año-mes
n_total <- (n_anios + 1) * 12 # año 0 + n_anios
df <- data.frame(
anio = integer(n_total),
anio_rel = integer(n_total),
mes = integer(n_total),
nombre_mes = character(n_total),
dias_mes = integer(n_total),
masa_t_dia = numeric(n_total),
masa_t_mes = numeric(n_total),
energia_el_kWh_mes = numeric(n_total),
stringsAsFactors = FALSE
)
idx <- 1
for (a in 0:n_anios) { # a = 0 es el año base
masa_base_anio <- masa_t_dia_base * (1 + tasa_crecimiento) ^ a
anio_cal <- anio_inicio + a
# Calculamos el año completo con la función de antes
res_anio <- calcular_ano_mensual(
masa_t_dia_base = masa_base_anio,
PCI_MJ_kg = PCI_MJ_kg,
eficiencia_electrica = eficiencia_electrica,
eficiencia_termica = eficiencia_termica,
disponibilidad = disponibilidad,
multip_mes = multip_mes
)
tab_m <- res_anio$tabla_mensual
for (m in 1:12) {
df$anio[idx] <- anio_cal
df$anio_rel[idx] <- a
df$mes[idx] <- m
df$nombre_mes[idx] <- as.character(tab_m$nombre_mes[m])
df$dias_mes[idx] <- tab_m$dias_mes[m]
df$masa_t_dia[idx] <- tab_m$masa_t_dia[m]
df$masa_t_mes[idx] <- tab_m$masa_t_mes[m]
df$energia_el_kWh_mes[idx] <- tab_m$energia_el_kWh_mes[m]
idx <- idx + 1
}
}
df$energia_el_MWh_mes <- df$energia_el_kWh_mes / 1000
df
}
########## 7. EJEMPLO DE PROYECCIÓN: 10 AÑOS ##########
tasa_crec_ej <- 0.03 # 3 % más residuos por año
n_anios_ej <- 10
anio_inicio_ej <- 2025
# Usamos el mismo multip_mes del año base (feriados)
multip_mes_ej <- c(
1.00, # Ene
1.10, # Feb
1.05, # Mar
1.00, # Abr
1.00, # May
1.00, # Jun
1.00, # Jul
1.00, # Ago
1.00, # Sep
1.00, # Oct
1.08, # Nov
1.20 # Dic
)
proyeccion_meses <- proyectar_meses_varios_anios(
masa_t_dia_base = masa_t_dia_base_ej,
PCI_MJ_kg = PCI_MJ_kg_ej,
eficiencia_electrica = ef_el_ej,
eficiencia_termica = ef_th_ej,
disponibilidad = disp_ej,
multip_mes = multip_mes_ej,
tasa_crecimiento = tasa_crec_ej,
n_anios = n_anios_ej,
anio_inicio = anio_inicio_ej
)
head(proyeccion_meses)
## anio anio_rel mes nombre_mes dias_mes masa_t_dia masa_t_mes
## 1 2025 0 1 Enero 31 100 3100
## 2 2025 0 2 Febrero 28 110 3080
## 3 2025 0 3 Marzo 31 105 3255
## 4 2025 0 4 Abril 30 100 3000
## 5 2025 0 5 Mayo 31 100 3100
## 6 2025 0 6 Junio 30 100 3000
## energia_el_kWh_mes energia_el_MWh_mes
## 1 2325000 2325.00
## 2 2310000 2310.00
## 3 2441250 2441.25
## 4 2250000 2250.00
## 5 2325000 2325.00
## 6 2250000 2250.00
########## 8. RESUMEN ANUAL DE LA PROYECCIÓN ##########
# Calculamos energía anual sumando todos los meses
anios_unicos <- unique(proyeccion_meses$anio)
n_anios_tot <- length(anios_unicos)
resumen_anual <- data.frame(
anio = anios_unicos,
energia_el_kWh_anio = numeric(n_anios_tot),
energia_el_GWh_anio = numeric(n_anios_tot),
masa_t_anio = numeric(n_anios_tot)
)
for (i in 1:n_anios_tot) {
anio_i <- anios_unicos[i]
sub_i <- proyeccion_meses[proyeccion_meses$anio == anio_i, ]
resumen_anual$energia_el_kWh_anio[i] <- sum(sub_i$energia_el_kWh_mes)
resumen_anual$energia_el_GWh_anio[i] <- resumen_anual$energia_el_kWh_anio[i] / 1e6
resumen_anual$masa_t_anio[i] <- sum(sub_i$masa_t_mes)
}
resumen_anual
## anio energia_el_kWh_anio energia_el_GWh_anio masa_t_anio
## 1 2025 28346250 28.34625 37795.00
## 2 2026 29196638 29.19664 38928.85
## 3 2027 30072537 30.07254 40096.72
## 4 2028 30974713 30.97471 41299.62
## 5 2029 31903954 31.90395 42538.61
## 6 2030 32861073 32.86107 43814.76
## 7 2031 33846905 33.84690 45129.21
## 8 2032 34862312 34.86231 46483.08
## 9 2033 35908181 35.90818 47877.58
## 10 2034 36985427 36.98543 49313.90
## 11 2035 38094990 38.09499 50793.32
########## 9. GRÁFICAS DE LA PROYECCIÓN ##########
# 9.1 Energía eléctrica anual (GWh/año)
ggplot(resumen_anual, aes(x = anio, y = energia_el_GWh_anio)) +
geom_line() +
geom_point(size = 2) +
labs(
title = "Proyección de energa elctrica anual",
x = "Anio",
y = "Energía eléctrica (GWh/año)"
) +
theme_minimal()
# 9.2 Masa total de residuos por año (t/año)
ggplot(resumen_anual, aes(x = anio, y = masa_t_anio)) +
geom_line(color = "darkgreen") +
geom_point(size = 2, color = "darkgreen") +
labs(
title = "Masa total de residuos tratada por anio",
x = "Anio",
y = "Masa de residuos (t/anio)"
) +
theme_minimal()