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

###############################################
# 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()