options(repos = c(CRAN = "https://cloud.r-project.org"))
#install.packages("readxl") Instalar solo una vez
library(readxl)
datos_residuos <- read_excel("Generación_residuos_2024.xlsx")
datos_residuos
## # A tibble: 366 × 7
##    fecha               dia_semana es_feriado tipo_dia residuo_base_t
##    <dttm>              <chr>      <chr>      <chr>             <dbl>
##  1 2024-01-01 00:00:00 Monday     TRUE       Feriado            550.
##  2 2024-01-02 00:00:00 Tuesday    FALSE      Normal             680 
##  3 2024-01-03 00:00:00 Wednesday  FALSE      Normal             680 
##  4 2024-01-04 00:00:00 Thursday   FALSE      Normal             680 
##  5 2024-01-05 00:00:00 Friday     FALSE      Normal             680 
##  6 2024-01-06 00:00:00 Saturday   FALSE      Normal             540.
##  7 2024-01-07 00:00:00 Sunday     FALSE      Normal             540.
##  8 2024-01-08 00:00:00 Monday     FALSE      Normal             680 
##  9 2024-01-09 00:00:00 Tuesday    FALSE      Normal             680 
## 10 2024-01-10 00:00:00 Wednesday  FALSE      Normal             680 
## # ℹ 356 more rows
## # ℹ 2 more variables: factor_incremento <dbl>, residuos_totales_t <dbl>
View(datos_residuos)
head(datos_residuos)
## # A tibble: 6 × 7
##   fecha               dia_semana es_feriado tipo_dia residuo_base_t
##   <dttm>              <chr>      <chr>      <chr>             <dbl>
## 1 2024-01-01 00:00:00 Monday     TRUE       Feriado            550.
## 2 2024-01-02 00:00:00 Tuesday    FALSE      Normal             680 
## 3 2024-01-03 00:00:00 Wednesday  FALSE      Normal             680 
## 4 2024-01-04 00:00:00 Thursday   FALSE      Normal             680 
## 5 2024-01-05 00:00:00 Friday     FALSE      Normal             680 
## 6 2024-01-06 00:00:00 Saturday   FALSE      Normal             540.
## # ℹ 2 more variables: factor_incremento <dbl>, residuos_totales_t <dbl>
str(datos_residuos)
## tibble [366 × 7] (S3: tbl_df/tbl/data.frame)
##  $ fecha             : POSIXct[1:366], format: "2024-01-01" "2024-01-02" ...
##  $ dia_semana        : chr [1:366] "Monday" "Tuesday" "Wednesday" "Thursday" ...
##  $ es_feriado        : chr [1:366] "TRUE" "FALSE" "FALSE" "FALSE" ...
##  $ tipo_dia          : chr [1:366] "Feriado" "Normal" "Normal" "Normal" ...
##  $ residuo_base_t    : num [1:366] 550 680 680 680 680 ...
##  $ factor_incremento : num [1:366] 1.12 1 1 1 1 ...
##  $ residuos_totales_t: num [1:366] 618 680 680 680 680 ...
#install.packages("dplyr")# Instalar solo una vez 
library(dplyr)
## 
## 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
library(lubridate)
## 
## 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-01-01 00:00:00            4551.              650.      7
## 2 2024-01-08 00:00:00            4613.              659.      7
## 3 2024-01-15 00:00:00            4613.              659.      7
## 4 2024-01-22 00:00:00            4001.              572.      7
## 5 2024-01-29 00:00:00            4613.              659.      7
## 6 2024-02-05 00:00:00            4613.              659.      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. 
##    1360    4613    4613    4534    4613    4676

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 2024-01-01 00:00:00           19819.              639.     31
## 2 2024-02-01 00:00:00           19008.              655.     29
## 3 2024-03-01 00:00:00           20282.              654.     31
## 4 2024-04-01 00:00:00           19688.              656.     30
## 5 2024-05-01 00:00:00           20430.              659.     31
## 6 2024-06-01 00:00:00           19666.              656.     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. 
##   19008   19727   20050   20027   20443   20555

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                 642.          50.8              607.              743.
## 2 Normal                  657.          36.1              512.              680 
## # ℹ 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] -15.34062
# 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] 657.1193
promedio_feriado          # Promedio t/día en feriado
## [1] 641.7787
incremento_absoluto       # Cuántas toneladas más en feriado
## [1] -15.34062
incremento_relativo       # % más de residuos en feriado
## [1] -2.334525
# 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(2024, 1),                           # Año 2024, "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(2024, 1) 
## End = c(2025, 1) 
## Frequency = 365 
##   [1] 617.7848 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
##   [9] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
##  [17] 680.0000 680.0000 680.0000 606.5884 606.5884 530.1200 514.4000 512.4500
##  [25] 551.2300 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
##  [33] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
##  [41] 606.5884 606.5884 617.7848 617.7848 680.0000 680.0000 680.0000 606.5884
##  [49] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
##  [57] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
##  [65] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
##  [73] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
##  [81] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
##  [89] 616.1344 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
##  [97] 606.5884 606.5884 680.0000 680.0000 617.7848 680.0000 680.0000 606.5884
## [105] 606.5884 680.0000 680.0000 680.0000 617.7848 680.0000 606.5884 606.5884
## [113] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
## [121] 680.0000 617.7848 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [129] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
## [137] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
## [145] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
## [153] 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884
## [161] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
## [169] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
## [177] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [185] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
## [193] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
## [201] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
## [209] 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884
## [217] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
## [225] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
## [233] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [241] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
## [249] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
## [257] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
## [265] 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884
## [273] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
## [281] 680.0000 680.0000 680.0000 742.6620 680.0000 606.5884 606.5884 680.0000
## [289] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [297] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
## [305] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
## [313] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
## [321] 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884
## [329] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
## [337] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
## [345] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [353] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 742.6620
## [361] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
# 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 (2024)",  # Título del gráfico
  xlab = "Tiempo (días del año 2024)",          # 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)
## 
## 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(2024, 1),                  # Año 2024, 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
## 2024 19818.69 19008.28 20282.02 19688.28 20430.49 19665.88 20492.71 20419.30
##           Sep      Oct      Nov      Dec
## 2024 19739.30 20555.37 19739.30 20481.96
# Graficar la serie mensual
plot(
  residuos_mensual_ts,                # Serie mensual
  main = "Serie de tiempo mensual de residuos (2024)",  # 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 == 2024)

# 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)
## 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
##       20026.7971
## s.e.    133.7669
## 
## sigma^2 = 234241:  log likelihood = -90.69
## AIC=185.38   AICc=186.71   BIC=186.35
## 
## Training set error measures:
##                         ME     RMSE      MAE         MPE     MAPE MASE
## Training set -8.185452e-12 463.3802 416.8433 -0.05434883 2.091642  NaN
##                   ACF1
## Training set -0.368564
# Hacer un pronóstico de 12 meses (todo el año 2025)
pronostico_2025 <- 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_2025                       # Muestra predicciones, error estándar y rangos de confianza
##          Point Forecast    Lo 80    Hi 80   Lo 95    Hi 95
## Jan 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Feb 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Mar 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Apr 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## May 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Jun 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Jul 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Aug 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Sep 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Oct 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Nov 2025        20026.8 19406.55 20647.05 19078.2 20975.39
## Dec 2025        20026.8 19406.55 20647.05 19078.2 20975.39
# Graficar el pronóstico junto con la serie histórica
plot(
  pronostico_2025,                    # Objeto de pronóstico (forecast)
  main = "Pronóstico mensual de residuos para 2025",  # 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(2024, 1),                           # Año 2024, 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 <- 9                      # Supuesto: 8 MJ por kg de residuo

# Definir la eficiencia eléctrica de la planta (fracción entre 0 y 1)
eficiencia_electrica <- 0.30        # Supuesto: 50% 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 <- 250    # 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 residuo_base_t
##   <dttm>              <chr>      <chr>      <chr>             <dbl>
## 1 2024-01-01 00:00:00 Monday     TRUE       Feriado            550.
## 2 2024-01-02 00:00:00 Tuesday    FALSE      Normal             680 
## 3 2024-01-03 00:00:00 Wednesday  FALSE      Normal             680 
## 4 2024-01-04 00:00:00 Thursday   FALSE      Normal             680 
## 5 2024-01-05 00:00:00 Friday     FALSE      Normal             680 
## 6 2024-01-06 00:00:00 Saturday   FALSE      Normal             540.
## # ℹ 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] 180241174
viviendas_equivalentes_anual                           # Viviendas equivalentes abastecidas en el año
## [1] 60080.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-01-01 00:00:00            4551.          3413221.                    650.
## 2 2024-01-08 00:00:00            4613.          3459883.                    659.
## 3 2024-01-15 00:00:00            4613.          3459883.                    659.
## 4 2024-01-22 00:00:00            4001.          3001033.                    572.
## 5 2024-01-29 00:00:00            4613.          3459883.                    659.
## 6 2024-02-05 00:00:00            4613.          3459883.                    659.
## # ℹ 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 2024-01-01 00:00:00           19819.         14864019.                    639.
## 2 2024-02-01 00:00:00           19008.         14256208.                    655.
## 3 2024-03-01 00:00:00           20282.         15211514.                    654.
## 4 2024-04-01 00:00:00           19688.         14766208.                    656.
## 5 2024-05-01 00:00:00           20430.         15322869.                    659.
## 6 2024-06-01 00:00:00           19666.         14749413.                    656.
## # ℹ 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 2024-01-01 00:00:00           19819.         14864019.                    639.
## 2 2024-02-01 00:00:00           19008.         14256208.                    655.
## 3 2024-03-01 00:00:00           20282.         15211514.                    654.
## 4 2024-04-01 00:00:00           19688.         14766208.                    656.
## 5 2024-05-01 00:00:00           20430.         15322869.                    659.
## 6 2024-06-01 00:00:00           19666.         14749413.                    656.
## # ℹ 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] 59456.08 57024.83 60846.06 59064.83 61291.48 58997.65
# 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 <- 250      # 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 2024-01-01 00:00:00           19819.         14864019.                    639.
## 2 2024-02-01 00:00:00           19008.         14256208.                    655.
## 3 2024-03-01 00:00:00           20282.         15211514.                    654.
## 4 2024-04-01 00:00:00           19688.         14766208.                    656.
## 5 2024-05-01 00:00:00           20430.         15322869.                    659.
## 6 2024-06-01 00:00:00           19666.         14749413.                    656.
## # ℹ 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_2024 <- 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) == 2024)

# =========================
# 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) == 2024) %>%
  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 2025 (desde forecast)
# =========================
residuos_2025_mensual <- tibble(
  mes = seq.Date(as.Date("2025-01-01"), by = "month", length.out = 12),
  total_residuos_t = as.numeric(pronostico_2025$mean)   # <-- total t/mes pronosticado
)

# =========================
# 4) DESAGREGAR A DIARIO 2025 CONSERVANDO TOTALES MENSUALES
#    usando el patrón de día de semana de 2024
# =========================
residuos_2025_diario <- residuos_2025_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 2025 -> ENERGÍA 2025 (kWh/día)
# =========================
energia_2025 <- residuos_2025_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 2024 (real) + 2024 (proyectado)
# =========================
energia_all <- bind_rows(
  energia_2024 %>% mutate(tipo = "Real 2024"),
  energia_2025 %>% mutate(tipo = "Proyección 2025")
) %>%
  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) 2024 vs 2025
# =========================
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): 2024 real vs 2025 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")
## Warning: package 'ggplot2' is in use and will not be installed
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 <- 2500   # 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.30,
                                   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.15
# - Marzo (Semana Santa aprox)-> 1.30
# - Noviembre (Finados)       -> 1.10
# - Diciembre (Navidad/Año Nuevo) -> 1.00

calcular_ano_mensual <- function(
  masa_t_dia_base,
  PCI_MJ_kg,
  eficiencia_electrica = 0.30,
  eficiencia_termica  = 0.00,
  disponibilidad      = 0.90,
  multip_mes          = c(
    1.00, # Ene
    1.15, # Feb (Carnaval)
    1.30, # 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.10, # Nov (Finados)
    1.00  # 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   <- 150    # t/día (ejemplo, se puede cambiar )
PCI_MJ_kg_ej         <- 15     # MJ/kg (RSU con buen PCI)
ef_el_ej             <- 0.30   # 30 % 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      150.0       4650           168750.0
## 2    2    Febrero       28       1.15      172.5       4830           194062.5
## 3    3      Marzo       31       1.30      195.0       6045           219375.0
## 4    4      Abril       30       1.00      150.0       4500           168750.0
## 5    5       Mayo       31       1.00      150.0       4650           168750.0
## 6    6      Junio       30       1.00      150.0       4500           168750.0
## 7    7      Julio       31       1.00      150.0       4650           168750.0
## 8    8     Agosto       31       1.00      150.0       4650           168750.0
## 9    9 Septiembre       30       1.00      150.0       4500           168750.0
## 10  10    Octubre       31       1.00      150.0       4650           168750.0
## 11  11  Noviembre       30       1.10      165.0       4950           185625.0
## 12  12  Diciembre       31       1.00      150.0       4650           168750.0
##    energia_el_kWh_mes
## 1             5231250
## 2             5433750
## 3             6800625
## 4             5062500
## 5             5231250
## 6             5062500
## 7             5231250
## 8             5231250
## 9             5062500
## 10            5231250
## 11            5568750
## 12            5231250
resultado_ano_base$energia_el_GWh_anio  # energía anual en GWh (escenario base)
## [1] 64.37812
########## 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.30,
  eficiencia_termica  = 0.00,
  disponibilidad      = 0.90,
  multip_mes          = rep(1, 12),
  tasa_crecimiento    = 0.02,    # 2 % anual
  n_anios             = 15,
  anio_inicio         = 2024
) {
  # 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: 15 AÑOS ##########

tasa_crec_ej  <- 0.03   # 3 % más residuos por año
n_anios_ej    <- 15
anio_inicio_ej <- 2024

# Usamos el mismo multip_mes del año base (feriados)
multip_mes_ej <- c(
  1.00, # Ene
  1.15, # Feb
  1.30, # Mar
  1.00, # Abr
  1.00, # May
  1.00, # Jun
  1.00, # Jul
  1.00, # Ago
  1.00, # Sep
  1.00, # Oct
  1.10, # Nov
  1.00  # 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 2024        0   1      Enero       31      150.0       4650
## 2 2024        0   2    Febrero       28      172.5       4830
## 3 2024        0   3      Marzo       31      195.0       6045
## 4 2024        0   4      Abril       30      150.0       4500
## 5 2024        0   5       Mayo       31      150.0       4650
## 6 2024        0   6      Junio       30      150.0       4500
##   energia_el_kWh_mes energia_el_MWh_mes
## 1            5231250           5231.250
## 2            5433750           5433.750
## 3            6800625           6800.625
## 4            5062500           5062.500
## 5            5231250           5231.250
## 6            5062500           5062.500
########## 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  2024            64378125            64.37812    57225.00
## 2  2025            66309469            66.30947    58941.75
## 3  2026            68298753            68.29875    60710.00
## 4  2027            70347715            70.34772    62531.30
## 5  2028            72458147            72.45815    64407.24
## 6  2029            74631891            74.63189    66339.46
## 7  2030            76870848            76.87085    68329.64
## 8  2031            79176973            79.17697    70379.53
## 9  2032            81552283            81.55228    72490.92
## 10 2033            83998851            83.99885    74665.65
## 11 2034            86518817            86.51882    76905.61
## 12 2035            89114381            89.11438    79212.78
## 13 2036            91787813            91.78781    81589.17
## 14 2037            94541447            94.54145    84036.84
## 15 2038            97377690            97.37769    86557.95
## 16 2039           100299021           100.29902    89154.69
########## 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()