#install.packages("readxl")   
library(readxl)

datos_residuos <- read_excel("C:/Users/damia/Downloads/bd_generacion_residuos_2025.xlsx")

View(datos_residuos)   # Para verlo como tabla
head(datos_residuos)   # Primeras filas
## # A tibble: 6 × 7
##   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             43.8
## 2 2025-01-02 00:00:00 Thursday   FALSE      Normal              44.4
## 3 2025-01-03 00:00:00 Friday     FALSE      Normal              45.1
## 4 2025-01-04 00:00:00 Saturday   FALSE      Normal              48.6
## 5 2025-01-05 00:00:00 Sunday     FALSE      Normal              49.1
## 6 2025-01-06 00:00:00 Monday     FALSE      Normal              44.9
## # ℹ 2 more variables: factor_incremento <dbl>, residuos_totales_t <dbl>
str(datos_residuos)    # Estructura de la base
## tibble [365 × 7] (S3: tbl_df/tbl/data.frame)
##  $ fecha             : POSIXct[1:365], format: "2025-01-01" "2025-01-02" ...
##  $ dia_semana        : chr [1:365] "Wednesday" "Thursday" "Friday" "Saturday" ...
##  $ es_feriado        : logi [1:365] TRUE FALSE FALSE FALSE FALSE FALSE ...
##  $ tipo_dia          : chr [1:365] "Feriado" "Normal" "Normal" "Normal" ...
##  $ residuos_base_t   : num [1:365] 43.8 44.4 45.1 48.6 49.1 ...
##  $ factor_incremento : num [1:365] 1.52 1 1 1 1 ...
##  $ residuos_totales_t: num [1:365] 66.7 44.4 45.1 48.6 49.1 ...

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)
## 
## 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)
## 
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(magrittr)
# Crear un resumen semanal de la generación de residuos

resumen_semanal <- datos_residuos %>%
  mutate(
    semana = floor_date(fecha, "week", week_start = 1),
    bagazo_malta_t = residuos_totales_t
  ) %>%
  group_by(semana) %>%
  summarise(
    total_bagazo_t = sum(bagazo_malta_t),
    promedio_diario_t = mean(bagazo_malta_t),
    n_dias = n()
  ) %>%
  ungroup()

# Ver las primeras filas del resumen semanal
head(resumen_semanal)
## # A tibble: 6 × 4
##   semana              total_bagazo_t promedio_diario_t n_dias
##   <dttm>                       <dbl>             <dbl>  <int>
## 1 2024-12-30 00:00:00           254.              50.8      5
## 2 2025-01-06 00:00:00           322.              46.0      7
## 3 2025-01-13 00:00:00           328.              46.8      7
## 4 2025-01-20 00:00:00           327.              46.7      7
## 5 2025-01-27 00:00:00           326.              46.6      7
## 6 2025-02-03 00:00:00           329.              47.0      7
View(resumen_semanal)
# Ver un resumen estadístico del total semanal de residuos
summary(resumen_semanal$total_bagazo_t)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   184.7   334.0   355.6   355.1   372.9   474.4

RESUMEN MENSUAL

# Crear un resumen mensual de la generación de residuos
resumen_mensual <- datos_residuos %>%
  mutate(
    mes = floor_date(fecha, "month"),
    bagazo_malta_t = residuos_totales_t
  ) %>%
  group_by(mes) %>%
  summarise(
    total_bagazo_t = sum(bagazo_malta_t),
    promedio_diario_t = mean(bagazo_malta_t),
    n_dias = n()
  ) %>%
  ungroup()                                        

# Ver las primeras filas del resumen mensual
head(resumen_mensual)
## # A tibble: 6 × 4
##   mes                 total_bagazo_t promedio_diario_t n_dias
##   <dttm>                       <dbl>             <dbl>  <int>
## 1 2025-01-01 00:00:00          1457.              47.0     31
## 2 2025-02-01 00:00:00          1312.              46.9     28
## 3 2025-03-01 00:00:00          1511.              48.7     31
## 4 2025-04-01 00:00:00          1463.              48.8     30
## 5 2025-05-01 00:00:00          1564.              50.5     31
## 6 2025-06-01 00:00:00          1499.              50.0     30
# Ver un resumen estadístico del total mensual de residuos
summary(resumen_mensual$total_bagazo_t)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1312    1490    1549    1568    1641    1871

compara día feriado vs día normal

# Comparar la generación de residuos entre días normales y feriados
comparacion_feriados <- datos_residuos %>%
  mutate(bagazo_malta_t = residuos_totales_t) %>%
  group_by(tipo_dia) %>%
  summarise(
    promedio_bagazo_t = mean(bagazo_malta_t),
    sd_bagazo_t = sd(bagazo_malta_t),
    minimo_bagazo_t = min(bagazo_malta_t),
    maximo_bagazo_t = max(bagazo_malta_t),
    n_dias = n()
  ) %>%
  ungroup()

# Ver la tabla de comparación entre días normales y feriados
comparacion_feriados
## # A tibble: 2 × 6
##   tipo_dia promedio_bagazo_t sd_bagazo_t minimo_bagazo_t maximo_bagazo_t n_dias
##   <chr>                <dbl>       <dbl>           <dbl>           <dbl>  <int>
## 1 Feriado               72.9        9.06            65.3            96.0     11
## 2 Normal                50.9        4.51            43.7            66.8    354

Gráficos inciales

# Histograma de residuos totales diarios
hist(
  datos_residuos$residuos_totales_t,
  main = "Distribución del bagazo de malta generado diariamente",
  xlab = "Bagazo de malta (t/día)",
  ylab = "Frecuencia"
)

#El histograma muestra una producción diaria concentrada mayoritariamente entre 45 y 55 t/día, alcanzando su pico máximo de frecuencia en el rango de 45-50 t/día. Presenta un marcado sesgo a la derecha, indicando que existen días excepcionales con producciones inusuales que llegan hasta las 100t/día.

# Boxplot para comparar residuos en días normales vs feriados
boxplot(
  residuos_totales_t ~ tipo_dia,
  data = datos_residuos,
  main = "Generación diaria de bagazo de malta: días normales vs feriados",
  xlab = "Tipo de día",
  ylab = "Bagazo de malta (t/día)"
)

#El diagrama de caja revela que la generación de bagazo es significativamente mayor en feriados (mediana ~69 t/día) que en días normales (mediana 50 t/día). Los días normales presentan una distribución más compacta y constante, mientras que los feriados muestran mayor variabilidad y valores máximos que superan las 90 t/día.

Seperar feriados normales

# Separar promedio de bagazo en días normales
promedio_normal <- comparacion_feriados %>%
  filter(tipo_dia == "Normal") %>%
  pull(promedio_bagazo_t)

# Separar promedio de bagazo en días feriados
promedio_feriado <- comparacion_feriados %>%
  filter(tipo_dia == "Feriado") %>%
  pull(promedio_bagazo_t)

# Variación absoluta (t/día)
variacion_absoluta <- promedio_feriado - promedio_normal

# Variación relativa (%)
variacion_relativa <- (variacion_absoluta / promedio_normal) * 100

# Mostrar resultados
promedio_normal
## [1] 50.89833
promedio_feriado
## [1] 72.93624
variacion_absoluta
## [1] 22.03791
variacion_relativa
## [1] 43.29789
# Crear un vector con los dos promedios
valores_promedio <- c(promedio_normal, promedio_feriado)   

# Crear un vector con los nombres de las categorías
nombres_tipos <- c("Normal", "Feriado")                    

# Hacer un gráfico de barras para comparar los promedios
barplot(
  valores_promedio,
  names.arg = nombres_tipos,
  main = "Promedio diario de bagazo de malta: dias normales vs feriados",
  xlab = "Tipo de dia",
  ylab = "Bagazo de malta (t/da)"
)

#La gráfica muestran que la generación de bagazo es significativamente mayor en feriados, con un promedio superior a 70 t/día, frente a las 50 t/día de los días normales. Mientras que los días normales son constantes y compactos, los feriados presentan una mayor dispersión de datos y valores máximos.

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
bagazo_ts <- ts(
  datos_residuos_ordenado$residuos_totales_t,
  start = c(2025, 1),
  frequency = 365
)

# Ver un resumen de la serie de tiempo
bagazo_ts                                      # Muestra parte de la serie en consola
## Time Series:
## Start = c(2025, 1) 
## End = c(2025, 365) 
## Frequency = 365 
##   [1] 66.73786 44.37000 45.11000 48.62000 49.08000 44.91000 43.74000 44.26000
##   [9] 45.03000 44.68000 49.44000 50.12000 44.31000 45.21000 44.86000 45.47000
##  [17] 46.02000 50.63000 51.18000 45.14000 44.89000 45.36000 44.71000 45.92000
##  [25] 50.08000 51.04000 44.65000 45.19000 44.88000 45.61000 46.09000 49.72000
##  [33] 50.31000 44.94000 45.28000 44.76000 45.49000 46.11000 50.84000 51.26000
##  [41] 45.03000 44.69000 45.41000 44.95000 46.08000 50.57000 51.33000 45.12000
##  [49] 44.88000 45.62000 44.91000 46.17000 50.96000 51.49000 45.06000 44.73000
##  [57] 45.58000 44.97000 46.24000 50.88000 51.37000 65.57069 65.26876 45.63000
##  [65] 44.84000 46.31000 51.02000 51.56000 45.27000 44.98000 45.71000 45.03000
##  [73] 46.44000 51.19000 51.73000 45.36000 45.02000 45.88000 45.14000 46.58000
##  [81] 51.27000 51.92000 45.41000 45.09000 45.97000 45.22000 46.69000 51.38000
##  [89] 52.01000 45.48000 46.12000 46.48000 47.05000 46.71000 50.84000 51.32000
##  [97] 46.19000 46.63000 47.14000 46.88000 47.46000 51.07000 51.54000 46.27000
## [105] 46.79000 47.21000 46.95000 67.13538 51.23000 51.88000 46.34000 46.91000
## [113] 47.36000 47.02000 47.69000 51.41000 52.03000 46.58000 47.12000 47.44000
## [121] 46.73000 68.50536 51.66000 52.21000 46.92000 47.31000 47.85000 47.46000
## [129] 48.02000 52.38000 52.94000 47.01000 47.54000 47.96000 47.63000 48.21000
## [137] 52.57000 53.09000 47.14000 47.68000 48.05000 47.74000 68.87025 52.71000
## [145] 53.26000 47.29000 47.82000 48.17000 47.93000 48.49000 52.88000 53.34000
## [153] 47.56000 48.04000 48.52000 48.11000 48.68000 53.01000 53.58000 47.73000
## [161] 48.26000 48.74000 48.35000 48.92000 53.19000 53.77000 47.88000 48.41000
## [169] 48.89000 48.52000 49.06000 53.41000 53.96000 47.97000 48.59000 49.02000
## [177] 48.66000 49.21000 53.58000 54.03000 48.14000 48.36000 48.91000 49.42000
## [185] 49.08000 53.61000 54.17000 48.44000 49.02000 49.53000 49.10000 49.78000
## [193] 54.03000 54.60000 48.51000 49.07000 49.64000 49.29000 49.96000 54.21000
## [201] 54.88000 48.63000 49.18000 49.72000 49.37000 50.05000 54.36000 54.97000
## [209] 48.74000 49.29000 49.84000 50.12000 48.91000 53.44000 54.02000 48.98000
## [217] 49.56000 50.07000 49.71000 50.34000 54.61000 55.19000 71.51872 49.68000
## [225] 50.21000 49.85000 50.49000 54.82000 55.40000 49.24000 49.83000 50.38000
## [233] 50.01000 50.66000 54.97000 55.58000 49.36000 49.92000 50.47000 50.12000
## [241] 50.79000 55.08000 55.65000 48.84000 49.41000 49.96000 49.61000 50.27000
## [249] 54.58000 55.12000 48.93000 49.49000 50.04000 49.69000 50.33000 54.66000
## [257] 55.21000 49.02000 49.58000 50.11000 49.77000 50.44000 54.73000 55.29000
## [265] 49.11000 49.67000 50.22000 49.88000 50.53000 54.86000 55.42000 49.19000
## [273] 49.75000 52.18000 52.74000 53.29000 57.61000 58.14000 52.27000 52.83000
## [281] 53.38000 53.02000 78.62655 57.96000 58.49000 52.34000 52.91000 53.44000
## [289] 53.09000 53.76000 58.03000 58.61000 52.47000 53.02000 53.59000 53.24000
## [297] 53.80000 58.16000 58.72000 52.58000 53.14000 53.69000 53.30000 54.01000
## [305] 58.32000 58.91000 76.82761 77.25600 53.86000 53.47000 54.12000 58.41000
## [313] 58.97000 52.84000 53.39000 53.96000 53.61000 54.28000 58.56000 59.13000
## [321] 52.91000 53.48000 54.02000 53.66000 54.31000 58.63000 59.21000 53.10000
## [329] 53.59000 54.14000 53.78000 54.45000 58.74000 59.29000 52.96000 53.54000
## [337] 54.08000 53.72000 54.35000 58.71000 59.28000 53.11000 53.66000 54.21000
## [345] 53.87000 54.52000 58.84000 59.41000 60.32000 60.88000 61.43000 61.07000
## [353] 61.74000 65.92000 66.45000 60.59000 61.14000 61.69000 95.98145 62.01000
## [361] 66.20000 66.78000 61.02000 61.58000 62.13000
# Ver clase del objeto (debe decir "ts")
class(bagazo_ts)
## [1] "ts"

graficas de series de tiempo

# Graficar la serie de tiempo diaria
plot(
  bagazo_ts,
  main = "Serie de tiempo de generacion diaria de bagazo de malta (2025)",
  xlab = "Tiempo (dias del anio 2025)",
  ylab = "Bagazo de malta (t/dia)"
)

#El gráfico muestra que la generación de bagazo es significativamente mayor en feriados, con un promedio superior a 70 t/día frente a las 50 t/día de días normales. La serie de tiempo revela una tendencia creciente anual, con picos de producción que se intensifican hacia finales de 2025 superando las 90 t/día.


#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
bagazo_ma7 <- rollmean(
  bagazo_ts,
  k = 7,
  align = "center",
  fill = NA
)

# Graficar serie original + promedio móvil
plot(
  bagazo_ts,
  main = "Bagazo de malta diario y promedio movil de 7 dias",
  xlab = "Tiempo (dias)",
  ylab = "Bagazo de malta (t/dia)"
)

#Los resultados muestran que la generación de bagazo es significativamente mayor en feriados, con un promedio superior a 70 t/día frente a las 50 t/día de los días normales. La serie de tiempo para el año 2025 revela una tendencia creciente, con picos estacionales que se intensifican hacia finales de año superando las 90 t/día. El promedio móvil de 7 días confirma esta estabilidad en días comunes y el incremento drástico durante fechas especiales.

# Crear una serie de tiempo mensual con el total de residuos por mes
bagazo_mensual_ts <- ts(
  resumen_mensual$total_bagazo_t,  # Usa la variable adaptada
  start = c(2025, 1),
  frequency = 12
)

# Ver la serie mensual
bagazo_mensual_ts
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2025 1457.338 1312.500 1511.219 1462.795 1564.026 1499.130 1567.880 1618.859
##           Sep      Oct      Nov      Dec
## 2025 1533.710 1712.437 1709.224 1871.191
# Graficar la serie mensual
plot(
  bagazo_mensual_ts,
  main = "Serie de tiempo mensual de bagazo de malta (2025)",
  xlab = "Tiempo (meses)",
  ylab = "Bagazo de malta (t/mes)"
)

#La serie de tiempo mensual de bagazo de malta (2025) revela una clara tendencia creciente durante el año. El volumen inicia cerca de las 1450 t/mes y finaliza superando las 1850 t/mes hacia el último periodo registrado.

Gráficos de de los 12 meses por días

#install.packages(c("ggplot2","tidyr"))

# Cargar paquetes necesarios
library(dplyr)       
library(lubridate)   
library(tidyr)       
## 
## Adjuntando el paquete: 'tidyr'
## The following object is masked from 'package:magrittr':
## 
##     extract
library(ggplot2)     

# 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),                 
    anio = year(fecha),                    
    mes_num = month(fecha),                 
    mes = factor(mes_num, levels = 1:12, labels = mes_labels),  
    dia_mes = day(fecha)                    
  ) %>%
  group_by(anio, mes, dia_mes) %>%          
  summarise(
    residuos_t = sum(residuos_totales_t),   
    .groups = "drop"
  ) %>%
  complete(                                 
    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) +
  geom_point(size = 1.2, na.rm = TRUE) +
  scale_x_continuous(breaks = seq(1, 31, 2)) +
  labs(
    title = "Patrn diario de generacion de bagazo de malta por mes (2025)",
    x = "Dia del mes",
    y = "Bagazo de malta (t/dia)",
    color = "Mes"
  ) +
  theme_minimal()

#El Patrón diario de generación de bagazo de malta por mes (2025) muestra que diciembre (línea rosa) lidera la producción, alcanzando un pico máximo superior a 95 t/día alrededor del día 25. Mientras la mayoría de los meses fluctúan en una base de 45 a 55 t/día, se observan picos pronunciados y aislados en diferentes momentos del mes.

diagrama 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)
  )

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 diaria del bagazo de malta por dia del mes (2025)",
    x = "Dia del mes",
    y = "Bagazo de malta (t/dia)"
  ) +
  theme_minimal()

#La Distribución diaria del bagazo de malta por día del mes (2025) muestra una mediana constante cercana a las 50 t/día durante los 31 días. Se observan numerosos valores atípicos superiores, destacando el día 25 con el máximo de generación que supera las 95 t/día. La variabilidad es mayor en los primeros y últimos días del mes, así como en fechas específicas como el día 10 y 25.

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 = "Heatmap diario de generación de bagazo de malta",
    x = "Semana ISO",
    y = "Día de la semana",
    fill = "Bagazo (t/día)"
  ) +
  theme_minimal()

#El Heatmap diario de generación de bagazo de malta muestra niveles de producción predominantemente estables, representados por tonos oscuros en el rango de 50 a 60 t/día. Se observan variaciones puntuales con mayor intensidad de color (azul claro) que indican valores máximos aislados que superan las 90 t/día.

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 = "Distribucion diaria de bagazo de malta por día de la semana",
    x = "Día de la semana",
    y = "Bagazo de malta generado (t/día)"
  ) +
  theme_minimal()

#La Distribución diaria de bagazo de malta por día de la semana muestra que los fines de semana (sábado y domingo) mantienen medianas de generación más elevadas, superando las 53 t/día. Los días laborables presentan mayor variabilidad extrema, destacando el jueves con los valores puntuales más altos de todo el análisis, por encima de las 95 t/día. A pesar de estos valores excepcionales, la base de producción en la mayoría de los días oscila consistentemente entre 45 y 55 t/día.

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 = "Distribucion mensual del bagazo de malta (2025)",
    x = "Mes",
    y = "Bagazo de malta (t/día)"
  ) +
  theme_minimal()

#La Distribución mensual del bagazo de malta (2025) evidencia un incremento progresivo tanto en la mediana como en la dispersión de los datos a lo largo del año. Mientras que en enero la generación se concentra cerca de las 45 t/día, para diciembre la mediana sube a 60 t/día, presentando además los valores máximos más extremos que superan las 95 t/día.
# 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(
  bagazo_mensual_ts                 
)

# Ver el resumen del modelo ARIMA ajustado
summary(
  modelo_arima                        
)
## Series: bagazo_mensual_ts 
## ARIMA(1,1,0) with drift 
## 
## Coefficients:
##           ar1    drift
##       -0.8620  40.2958
## s.e.   0.1498  11.0034
## 
## sigma^2 = 5165:  log likelihood = -62.21
## AIC=130.41   AICc=133.84   BIC=131.61
## 
## Training set error measures:
##                     ME    RMSE      MAE        MPE     MAPE MASE       ACF1
## Training set -5.576295 62.2404 51.36858 -0.5862299 3.293907  NaN 0.02741782
# Hacer un pronóstico de 12 meses (todo el año 2026)
pronostico_2026 <- forecast(
  modelo_arima,                       
  h = 12                              
)

# Ver los valores del pronóstico en consola
pronostico_2026                       
##          Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## Jan 2026       1806.605 1714.501 1898.709 1665.745 1947.466
## Feb 2026       1937.310 1844.333 2030.286 1795.114 2079.505
## Mar 2026       1899.673 1776.264 2023.081 1710.936 2088.410
## Apr 2026       2007.147 1881.766 2132.528 1815.393 2198.901
## May 2026       1989.535 1844.447 2134.622 1767.642 2211.427
## Jun 2026       2079.747 1931.756 2227.739 1853.414 2306.081
## Jul 2026       2077.014 1914.580 2239.448 1828.593 2325.436
## Aug 2026       2154.401 1988.367 2320.435 1900.475 2408.328
## Sep 2026       2162.724 1985.330 2340.119 1891.423 2434.026
## Oct 2026       2230.581 2049.107 2412.054 1953.041 2508.121
## Nov 2026       2247.119 2056.257 2437.981 1955.221 2539.017
## Dec 2026       2307.894 2112.648 2503.139 2009.292 2606.495
# Graficar el pronóstico junto con la serie histórica
plot(
  pronostico_2026,
  main = "Pronostico mensual de bagazo de malta (2026)",
  xlab = "Tiempo (meses)",
  ylab = "Bagazo de malta (t/mes)"
)

#El Pronóstico mensual de bagazo de malta (2026) proyecta la continuidad de la tendencia ascendente observada en el año anterior. La estimación central (línea azul) prevé que el volumen mensual inicie cerca de las 1800 toneladas en enero de 2026 y escale hasta aproximarse a las 2300 toneladas al finalizar el año. Las áreas sombreadas representan los intervalos de confianza, sugiriendo una variabilidad que podría alcanzar un límite superior de 2600 t/mes.
library(dplyr)

# Asegurarse de que los datos están ordenados por fecha
datos_residuos_ordenado <- datos_residuos %>%   
  arrange(fecha)                                

# Crear la serie de tiempo diaria con frecuencia semanal (7 días)
bagazo_diario_ts <- ts(
  datos_residuos_ordenado$residuos_totales_t,   
  start = c(2025, 1),                           
  frequency = 7                                 
)

# Descomponer la serie diaria (estacionalidad semanal)
descomp_diaria <- decompose(
  bagazo_diario_ts,                           
  type = "additive"                             
)

# Ver el gráfico con serie, tendencia, estacionalidad y residuo
plot(descomp_diaria)

#La gráfica Decomposition of additive time series desglosa la generación de bagazo en cuatro componentes: los datos observados, la tendencia, la estacionalidad y el residuo aleatorio. El panel de tendencia muestra un crecimiento escalonado y ascendente a largo plazo, mientras que el componente estacional revela un patrón cíclico perfectamente regular. El panel aleatorio captura variaciones bruscas e impredecibles que no corresponden a la tendencia ni a la estacionalidad.

Inciar cálculo de generación eléctrica

# 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                      

# 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_mes <- 300000    # Dato dado: 300000 kWh por mes por vivienda
# Ordenar la base por fecha y calcular energía diaria generable
datos_residuos_energia <- datos_residuos %>%           
  arrange(fecha) %>%                                   
  mutate(
    masa_residuos_kg = residuos_totales_t * 1000,       # t/día → kg/día
    energia_bruta_MJ = masa_residuos_kg * PCI_MJ_kg,    # Energía térmica diaria (MJ)
    energia_electrica_kWh =                             # Energía eléctrica diaria (kWh)
      energia_bruta_MJ * eficiencia_electrica / 3.6
  )

# Verificar resultados
head(datos_residuos_energia)
## # A tibble: 6 × 10
##   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             43.8
## 2 2025-01-02 00:00:00 Thursday   FALSE      Normal              44.4
## 3 2025-01-03 00:00:00 Friday     FALSE      Normal              45.1
## 4 2025-01-04 00:00:00 Saturday   FALSE      Normal              48.6
## 5 2025-01-05 00:00:00 Sunday     FALSE      Normal              49.1
## 6 2025-01-06 00:00:00 Monday     FALSE      Normal              44.9
## # ℹ 5 more variables: factor_incremento <dbl>, residuos_totales_t <dbl>,
## #   masa_residuos_kg <dbl>, energia_bruta_MJ <dbl>, energia_electrica_kWh <dbl>
View(datos_residuos_energia)
# Calcular la energía total anual producida (kWh/año)
energia_total_anual_kWh <- sum(
  datos_residuos_energia$energia_electrica_kWh,
  na.rm = TRUE
)

energia_total_anual_kWh
## [1] 10455727
# Crear un resumen semanal con residuos y energía
resumen_semanal_energia <- datos_residuos_energia %>%      
  mutate(
    semana = lubridate::floor_date(
      fecha, "week", week_start = 1
    )
  ) %>%
  group_by(semana) %>%                                     
  summarise(
    total_residuos_t = sum(residuos_totales_t),            
    total_energia_kWh = sum(energia_electrica_kWh),        
    promedio_diario_residuos_t = mean(residuos_totales_t), 
    promedio_diario_energia_kWh = mean(energia_electrica_kWh),
    n_dias = n()                                           
  ) %>%
  ungroup()

# Ver las primeras filas del resumen semanal
head(resumen_semanal_energia)
## # A tibble: 6 × 6
##   semana              total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2024-12-30 00:00:00             254.           141065.                    50.8
## 2 2025-01-06 00:00:00             322.           178989.                    46.0
## 3 2025-01-13 00:00:00             328.           182044.                    46.8
## 4 2025-01-20 00:00:00             327.           181744.                    46.7
## 5 2025-01-27 00:00:00             326.           181361.                    46.6
## 6 2025-02-03 00:00:00             329.           182600                     47.0
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 2 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>
# Crear un resumen mensual con residuos y energía
resumen_mensual_energia <- datos_residuos_energia %>%      
  mutate(
    mes = lubridate::floor_date(fecha, "month")            
  ) %>%
  group_by(mes) %>%                                        
  summarise(
    total_residuos_t = sum(residuos_totales_t),            
    total_energia_kWh = sum(energia_electrica_kWh),        
    promedio_diario_residuos_t = mean(residuos_totales_t), 
    promedio_diario_energia_kWh = mean(energia_electrica_kWh),
    n_dias = n()                                           
  ) %>%
  ungroup()

# Ver las primeras filas del resumen mensual
head(resumen_mensual_energia)
## # A tibble: 6 × 6
##   mes                 total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2025-01-01 00:00:00            1457.           809632.                    47.0
## 2 2025-02-01 00:00:00            1312.           729167.                    46.9
## 3 2025-03-01 00:00:00            1511.           839566.                    48.7
## 4 2025-04-01 00:00:00            1463.           812664.                    48.8
## 5 2025-05-01 00:00:00            1564.           868903.                    50.5
## 6 2025-06-01 00:00:00            1499.           832850                     50.0
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 2 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>

gráficos de nergia

# Ver las primeras filas del resumen mensual para comprobar su contenido
head(resumen_mensual_energia)   # Columnas: mes, total_energia_kWh, etc.
## # A tibble: 6 × 6
##   mes                 total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2025-01-01 00:00:00            1457.           809632.                    47.0
## 2 2025-02-01 00:00:00            1312.           729167.                    46.9
## 3 2025-03-01 00:00:00            1511.           839566.                    48.7
## 4 2025-04-01 00:00:00            1463.           812664.                    48.8
## 5 2025-05-01 00:00:00            1564.           868903.                    50.5
## 6 2025-06-01 00:00:00            1499.           832850                     50.0
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 2 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>
# Crear un gráfico de barras con la energía total mensual (kWh)
barplot(
  height = resumen_mensual_energia$total_energia_kWh,
  names.arg = format(resumen_mensual_energia$mes, "%b"),
  main = "Energia mensual generada a partir de residuos (kWh)",
  xlab = "Mes",
  ylab = "Energia generada (kWh/mes)"
)

#La gráfica Energía mensual generada a partir de residuos (kWh) muestra un crecimiento sostenido durante el año, con diciembre como el mes de mayor producción superando los $1.0 \times 10e6$ kWh/mes. El volumen inicia en enero cerca de los $8.0 \times 10^5$ kWh/mes, presentando ligeras fluctuaciones descendentes en febrero y junio antes de retomar su tendencia al alza. Esta progresión mensual refleja la capacidad incremental de aprovechamiento energético de los residuos generados hacia el cierre del periodo.
# Cargar dplyr por si no está cargado
library(dplyr)

# Consumo mensual de la empresa (kWh/mes) – valor ya definido por ti
consumo_mensual_empresa_kWh <- 300000

# Calcular porcentaje de autocobertura energética mensual
resumen_mensual_energia <- resumen_mensual_energia %>%
  mutate(
    porcentaje_autocobertura =
      (total_energia_kWh / consumo_mensual_empresa_kWh) * 100
  )

# Verificar resultados
head(resumen_mensual_energia)
## # 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            1457.           809632.                    47.0
## 2 2025-02-01 00:00:00            1312.           729167.                    46.9
## 3 2025-03-01 00:00:00            1511.           839566.                    48.7
## 4 2025-04-01 00:00:00            1463.           812664.                    48.8
## 5 2025-05-01 00:00:00            1564.           868903.                    50.5
## 6 2025-06-01 00:00:00            1499.           832850                     50.0
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 3 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   porcentaje_autocobertura <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()

#El Heatmap calendario de generación de energía (kWh/día) compara la producción Real 2025 frente a la Proyección 2026. Se observa un cambio notable en la intensidad del color, pasando de tonos oscuros predominantes en 2025 (rango de 25,000-30,000 kWh/día) a tonos azul claro constantes en 2026, lo que indica una generación superior a 45,000 kWh/día.

VALORIZACIÓN ENERGÉTICA CON VARIACIÓN MENSUAL

###############################################
# VALORIZACIÓN ENERGÉTICA CON VARIACIÓN MENSUAL

###############################################

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


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

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

masa_t_dia_base_ej   <- 100    # t/día 
PCI_MJ_kg_ej         <- 12     # MJ/kg 
ef_el_ej             <- 0.25   # 25 % 
ef_th_ej             <- 0.00   
disp_ej              <- 0.90   

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

#La gráfica Masa de residuos tratada por mes muestra un volumen de procesamiento estable durante la mayor parte del año, manteniéndose cerca de las 3000 t/mes. Se observa un incremento ligero en marzo y noviembre, pero el aumento más significativo ocurre en diciembre, donde la masa tratada alcanza su punto máximo superando las 3500 toneladas.

# 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 = "Energia electrica generada por mes",
    x = "Mes",
    y = "Energía electrica (MWh/mes)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 0, hjust = 0.5))

#La gráfica Energía eléctrica generada por mes muestra una producción estable durante la mayor parte del año, manteniéndose alrededor de los 2300 MWh/mes. Se observa un repunte moderado en marzo y noviembre, pero el valor máximo ocurre en diciembre, superando los 2800 MWh/mes.

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

#La Comparación relativa masa vs energía por mes muestra una correlación perfecta entre ambas variables, representadas por líneas superpuestas que siguen la misma trayectoria. Tras fluctuaciones moderadas entre 0.80 y 0.88 del valor normalizado durante el año, ambas alcanzan su punto máximo de 1.00 en diciembre.

########## 6. PROYECCIÓN MULTIANUAL CON PATRÓN MENSUAL ##########

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   
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 = "Proyeccion de energia electrica anual",
    x = "Anio",
    y = "Energia electrica (GWh/año)"
  ) +
  theme_minimal()

#La Proyección de energía eléctrica anual muestra un crecimiento lineal y sostenido desde el año 2025 hasta el 2035. La generación inicia en aproximadamente 28 GWh/año y escala de manera constante hasta alcanzar los 38 GWh/año al final de la década proyectada.

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

#La Masa total de residuos tratada por año muestra una proyección de crecimiento lineal constante desde 2025 hasta 2035. El volumen inicia en aproximadamente 38,000 t/año y aumenta progresivamente hasta alcanzar cerca de 51,000 t/año al final del periodo.

Análisis económico

library(dplyr)

# ===== 1) Totales anuales 2026 (proyectado) =====
energia_anual_2026_kWh <- sum(energia_2026$energia_kWh, na.rm = TRUE)
residuos_anual_2026_t <- sum(residuos_2026_diario$residuos_t_dia, na.rm = TRUE)


# Potencia promedio equivalente (para dimensionar CAPEX por kW)
MW_prom_2026 <- energia_anual_2026_kWh / 8760 / 1000

energia_anual_2026_kWh
## [1] 13833194
residuos_anual_2026_t
## [1] 24899.75
MW_prom_2026
## [1] 1.579132
# ===== 2) Función de evaluación financiera =====
eval_proyecto <- function(energia_kWh_y, residuos_t_y, MW_prom,
                          precio_usd_kWh,
                          gatefee_usd_t,
                          capex_usd_kW,
                          opex_fijo_pct,
                          opex_var_usd_t,
                          vida_anios = 20,
                          tasa_desc = 0.10){

  CAPEX0 <- MW_prom * 1000 * capex_usd_kW

  ingreso_elec <- energia_kWh_y * precio_usd_kWh
  ingreso_gate <- residuos_t_y * gatefee_usd_t

  OPEX_fijo <- CAPEX0 * opex_fijo_pct
  OPEX_var  <- residuos_t_y * opex_var_usd_t
  OPEX_total <- OPEX_fijo + OPEX_var

  neto_anual <- ingreso_elec + ingreso_gate - OPEX_total

  # Cashflows
  cf <- c(-CAPEX0, rep(neto_anual, vida_anios))
  years <- 0:vida_anios
  disc  <- (1 + tasa_desc)^years

  NPV <- sum(cf / disc)

  # Payback simple
  cum <- cumsum(cf)
  PB <- which(cum >= 0)[1] - 1
  if (is.na(PB)) PB <- NA_integer_

  # IRR
  IRR <- tryCatch({
    f <- function(r) sum(cf / (1 + r)^years)
    uniroot(f, interval = c(-0.9, 1.5))$root
  }, error = function(e) NA_real_)

  # LCOE (costo/energía) y LCOE neto considerando gate fee como “crédito”
  pv_costs  <- CAPEX0 + sum(c(0, rep(OPEX_total, vida_anios)) / disc)
  pv_energy <- sum(c(0, rep(energia_kWh_y, vida_anios)) / disc)
  LCOE <- pv_costs / pv_energy

  pv_gate <- sum(c(0, rep(ingreso_gate, vida_anios)) / disc)
  LCOE_neto <- (pv_costs - pv_gate) / pv_energy

  tibble(
    CAPEX_USD = CAPEX0,
    Ingreso_elec_USD_anual = ingreso_elec,
    Ingreso_gate_USD_anual = ingreso_gate,
    OPEX_USD_anual = OPEX_total,
    Neto_USD_anual = neto_anual,
    NPV_USD = NPV,
    IRR = IRR,
    Payback_anios = PB,
    LCOE_USD_kWh = LCOE,
    LCOE_neto_USD_kWh = LCOE_neto
  )
}

# ===== 3) Escenarios (ajusta a tu caso) =====

escenarios <- tibble(
  escenario = c("Conservador", "Base", "Optimista"),
  precio_usd_kWh = c(0.14, 0.16, 0.18),
  gatefee_usd_t   = c(20, 30, 40),
  capex_usd_kW    = c(5500, 5000, 4500),
  opex_fijo_pct   = c(0.04, 0.035, 0.03),
  opex_var_usd_t  = c(20, 15, 10),
  vida_anios      = c(20, 20, 20),
  tasa_desc       = c(0.10, 0.10, 0.10)
)

resultados <- escenarios %>%
  rowwise() %>%
  do(bind_cols(
    tibble(escenario = .$escenario),
    eval_proyecto(
      energia_kWh_y = energia_anual_2026_kWh,
      residuos_t_y  = residuos_anual_2026_t,
      MW_prom       = MW_prom_2026,
      precio_usd_kWh = .$precio_usd_kWh,
      gatefee_usd_t  = .$gatefee_usd_t,
      capex_usd_kW   = .$capex_usd_kW,
      opex_fijo_pct  = .$opex_fijo_pct,
      opex_var_usd_t = .$opex_var_usd_t,
      vida_anios     = .$vida_anios,
      tasa_desc      = .$tasa_desc
    )
  )) %>%
  ungroup()

# =========================
# 4) Resultados finales
# =========================
resultados_limpios <- resultados %>%
  mutate(
    IRR = round(IRR * 100, 2),
    NPV_USD = round(NPV_USD, 0),
    CAPEX_USD = round(CAPEX_USD, 0),
    Neto_USD_anual = round(Neto_USD_anual, 0),
    LCOE_USD_kWh = round(LCOE_USD_kWh, 3),
    LCOE_neto_USD_kWh = round(LCOE_neto_USD_kWh, 3)
  )

View(resultados_limpios)
head(resultados_limpios)
## # A tibble: 3 × 11
##   escenario   CAPEX_USD Ingreso_elec_USD_anual Ingreso_gate_USD_anual
##   <chr>           <dbl>                  <dbl>                  <dbl>
## 1 Conservador   8685225               1936647.                497995.
## 2 Base          7895659               2213311.                746992.
## 3 Optimista     7106093               2489975.                995990.
## # ℹ 7 more variables: OPEX_USD_anual <dbl>, Neto_USD_anual <dbl>,
## #   NPV_USD <dbl>, IRR <dbl>, Payback_anios <dbl>, LCOE_USD_kWh <dbl>,
## #   LCOE_neto_USD_kWh <dbl>