Leer los datos

Instalar paquete para poder ejecutar comandos

# Instalar 'dplyr' (solo la primera vez, luego puedes comentar esta línea)
#install.packages("dplyr")

# Instalar 'lubridate' para trabajar con fechas (también solo la primera vez)
#install.packages("lubridate")

# Cargar el paquete dplyr para manipulación de datos
library(dplyr)
## 
## 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)

Resumenes semanales y mensuales

# Crear un resumen semanal de la generación de residuos

resumen_semanal <- datos_residuos %>%                     # Toma la base de datos original
  mutate(semana = floor_date(fecha, "week", week_start = 1)) %>% #Crea nueva columna semana con lunes de inicio
  group_by(semana) %>%                                    # Agrupa los datos por cada semana
  summarise(                                              # Resume las variables para cada grupo (cada semana)
    total_residuos_t = sum(residuos_totales_t),           # Suma total de residuos en la semana (toneladas)
    promedio_diario_t = mean(residuos_totales_t),         # Promedio diario de residuos en la semana
    n_dias = n()                                          # Número de días incluidos en esa semana
  ) %>%                                                   # Fin del resumen
  ungroup()                                               # Quita la agrupación para evitar problemas en pasos siguientes

# Ver las primeras filas del resumen semanal
head(resumen_semanal)
## # A tibble: 6 × 4
##   semana              total_residuos_t promedio_diario_t n_dias
##   <dttm>                         <dbl>             <dbl>  <int>
## 1 2024-12-30 00:00:00             11.0              2.21      5
## 2 2025-01-06 00:00:00             13.8              1.97      7
## 3 2025-01-13 00:00:00             12.3              1.76      7
## 4 2025-01-20 00:00:00             12.9              1.84      7
## 5 2025-01-27 00:00:00             11.4              1.63      7
## 6 2025-02-03 00:00:00             15.5              2.22      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. 
##    6.89   12.59   13.97   13.76   14.87   17.10

RESUMEN MENSUAL

# Crear un resumen mensual de la generación de residuos
resumen_mensual <- datos_residuos %>%               # Toma la base original
  mutate(mes = floor_date(fecha, "month")) %>%      # Crea una columna 'mes' con el primer día de cada mes
  group_by(mes) %>%                                 # Agrupa los datos por mes
  summarise(                                        # Resume las variables para cada mes
    total_residuos_t = sum(residuos_totales_t),     # Suma total de residuos en el mes (toneladas)
    promedio_diario_t = mean(residuos_totales_t),   # Promedio diario de residuos en el mes
    n_dias = n()                                    # Número de días incluidos en ese mes
  ) %>%                                             # Fin del resumen
  ungroup()                                               # Quita la agrupación

# Ver las primeras filas del resumen mensual
head(resumen_mensual)
## # A tibble: 6 × 4
##   mes                 total_residuos_t promedio_diario_t n_dias
##   <dttm>                         <dbl>             <dbl>  <int>
## 1 2025-01-01 00:00:00             58.9              1.90     31
## 2 2025-02-01 00:00:00             55.9              2.00     28
## 3 2025-03-01 00:00:00             61.7              1.99     31
## 4 2025-04-01 00:00:00             60.0              2.00     30
## 5 2025-05-01 00:00:00             61.3              1.98     31
## 6 2025-06-01 00:00:00             56.9              1.90     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. 
##   55.93   59.74   60.53   60.78   62.06   65.62

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                 2.58         0.714              1.44              3.67
## 2 Normal                  1.98         0.583              1.01              2.98
## # ℹ 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
)

#La figura compara la generación diaria de residuos de madera en INMAI entre días normales y feriados. Se observa que en los días feriados la mediana y la dispersión de los residuos son mayores, lo que indica una mayor acumulación de residuos asociada a variaciones en la operación de la empresa. En los días normales, la generación de residuos es menor y más estable. Desde el enfoque de la generación de energía mediante incineración, esta diferencia evidencia la necesidad de contar con un sistema de almacenamiento y regulación de la alimentación de biomasa, que permita aprovechar los picos de generación y asegurar un suministro constante de residuos al sistema de combustión para una producción energética continua 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] 0.6005984
# 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] 1.980311
promedio_feriado          # Promedio t/día en feriado
## [1] 2.580909
incremento_absoluto       # Cuántas toneladas más en feriado
## [1] 0.6005984
incremento_relativo       # % más de residuos en feriado
## [1] 30.32849
# 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
)

El diagrama muestra el promedio de residuos de madera generados diariamente en la empresa INMAI, diferenciando entre días normales y feriados. Se observa que en los días feriados el promedio de residuos es mayor que en los días normales, lo que confirma una mayor acumulación de biomasa residual en estos periodos. Desde la perspectiva de la generación de energía mediante incineración, este comportamiento indica un mayor potencial energético disponible en días feriados, el cual puede ser aprovechado mediante una adecuada planificación operativa, permitiendo almacenar el excedente de residuos y utilizarlos posteriormente para mantener una alimentación constante al sistema de combustión y una producción energética estable

Analizar series de tiempo

# Asegurarse de que los datos están ordenados por fecha
datos_residuos_ordenado <- datos_residuos %>%   # Usa la base original
  arrange(fecha)                                # Ordena las filas cronológicamente

# Crear un objeto de serie de tiempo (ts) con datos diarios
residuos_ts <- ts(
  datos_residuos_ordenado$residuos_totales_t,   # Vector numérico: residuos diarios
  start = c(2025, 1),                           # Año 2025, "período" 1 (día 1)
  frequency = 365                               # Frecuencia: 365 observaciones por año (diario)
)

# Ver un resumen de la serie de tiempo
residuos_ts                                      # Muestra parte de la serie en consola
## Time Series:
## Start = c(2025, 1) 
## End = c(2025, 365) 
## Frequency = 365 
##   [1] 2.17 2.90 2.46 2.20 1.31 1.31 1.12 2.73 2.20 2.42 1.04 2.94 2.66 1.42 1.36
##  [16] 1.37 1.61 2.05 1.86 1.58 2.22 1.28 1.58 1.73 1.91 2.57 1.40 2.03 2.18 1.09
##  [31] 2.22 1.34 1.13 2.90 2.93 2.62 1.61 1.20 2.37 1.88 1.24 1.99 1.07 2.82 1.52
##  [46] 2.33 1.62 2.04 2.09 1.37 2.94 2.55 2.88 2.79 2.20 2.84 1.18 1.39 1.09 1.65
##  [61] 1.78 1.92 3.43 1.71 1.56 2.09 1.28 2.60 1.15 2.97 2.54 1.40 1.01 2.63 2.41
##  [76] 2.46 2.54 1.15 1.72 1.23 2.73 2.25 1.66 1.13 1.62 1.65 2.46 2.28 2.77 1.94
##  [91] 1.24 2.43 2.52 2.12 2.54 1.99 2.05 1.86 1.05 1.22 1.06 2.27 1.63 2.02 2.82
## [106] 1.50 1.82 3.02 1.46 1.15 1.58 1.32 2.86 2.62 2.27 2.74 2.61 1.37 2.79 2.08
## [121] 2.61 3.36 1.64 1.22 1.46 1.85 2.64 2.72 1.01 2.02 1.83 1.44 1.24 1.68 2.89
## [136] 1.65 2.04 2.41 1.73 2.94 2.92 1.50 2.55 1.60 1.57 1.07 2.22 2.01 1.10 1.56
## [151] 2.82 1.48 1.29 1.98 2.97 1.48 2.34 2.52 1.48 2.46 1.74 2.26 2.27 2.07 1.18
## [166] 2.67 1.64 1.37 1.08 2.18 2.36 1.03 2.02 1.45 2.29 1.35 2.38 1.77 2.87 1.28
## [181] 1.68 1.23 2.85 2.75 1.52 2.32 2.63 2.11 2.06 1.48 1.19 2.79 2.80 2.27 1.68
## [196] 1.70 2.45 2.79 2.77 2.56 2.28 1.17 1.32 2.80 2.21 1.02 1.20 2.33 1.01 1.32
## [211] 2.10 2.38 2.30 1.45 2.42 1.47 1.65 2.49 2.30 2.70 2.32 2.14 1.44 1.74 1.53
## [226] 1.49 2.95 1.79 2.78 2.26 2.59 2.01 2.15 1.99 1.39 2.44 1.56 1.05 2.29 1.35
## [241] 2.88 2.91 2.83 1.74 1.03 2.86 1.86 2.93 2.93 2.71 1.59 1.77 2.70 1.63 1.34
## [256] 2.11 2.87 2.39 2.14 1.19 2.23 2.98 1.28 2.04 2.75 2.48 2.39 2.40 1.72 1.59
## [271] 2.62 2.62 2.73 2.83 2.02 2.00 2.60 2.30 2.40 2.59 2.78 1.68 2.22 1.19 2.16
## [286] 1.07 1.93 2.09 1.57 2.18 1.06 1.07 2.65 1.72 1.25 2.04 2.54 1.43 2.25 1.17
## [301] 1.10 2.06 2.08 2.27 2.45 2.95 2.62 1.99 2.59 1.54 1.88 1.16 1.05 2.93 2.67
## [316] 2.39 1.82 1.35 1.31 1.50 2.10 2.43 2.32 1.56 2.91 2.48 2.11 2.22 1.84 1.50
## [331] 1.71 2.52 1.03 1.23 1.09 1.08 2.71 2.41 1.95 1.20 1.98 1.95 1.35 1.87 1.80
## [346] 2.23 2.27 1.09 1.75 2.25 2.01 2.71 2.32 1.33 1.14 2.28 1.05 2.17 3.67 2.15
## [361] 1.78 2.29 1.92 2.09 2.88
# Ver clase del objeto (debe decir "ts")
class(residuos_ts)
## [1] "ts"

graficas de series de tiempo

# Graficar la serie de tiempo diaria
plot(residuos_ts)

plot(
  residuos_ts,                                  # La serie de tiempo que creamos
  main = "Serie de tiempo de residuos diarios (2025)",  # Título del gráfico
  xlab = "Tiempo (días del año 2025)",          # Etiqueta eje X
  ylab = "Residuos totales (toneladas/día)"     # Etiqueta eje Y
)

# mejorar visualización

# Instalar el paquete 'zoo' para promedios móviles (solo la primera vez)
#install.packages("zoo")

# Cargar el paquete 'zoo'
library(zoo)
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
# Calcular un promedio móvil de 7 días (ventana semanal)
residuos_ma7 <- rollmean(
  residuos_ts,          # Serie de tiempo original
  k = 7,                # Tamaño de la ventana: 7 días
  align = "center",     # Centra la ventana en cada punto
  fill = NA             # Rellena bordes con NA para mantener la misma longitud
)

# Graficar serie original + promedio móvil
plot(
  residuos_ts,                                  # Serie original
  main = "Residuos diarios y promedio movil de 7 días",  # Título del gráfico
  xlab = "Tiempo (dias)",                       # Etiqueta eje X
  ylab = "Residuos (t/dia)"                     # Etiqueta eje Y
)

# Crear una serie de tiempo mensual con el total de residuos por mes
residuos_mensual_ts <- ts(
  resumen_mensual$total_residuos_t,    # Vector con el total mensual de residuos
  start = c(2025, 1),                  # Año 2025, mes 1 (enero)
  frequency = 12                       # 12 observaciones por año (mensual)
)

# Ver la serie mensual en consola
residuos_mensual_ts
##        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
## 2025 58.92 55.93 61.72 60.01 61.30 56.94 63.09 64.66 65.62 60.30 60.16 60.77
# Graficar la serie mensual
plot(
  residuos_mensual_ts,                # Serie mensual
  main = "Serie de tiempo mensual de residuos (2025)",  # Título
  xlab = "Tiempo (meses)",            # Eje X
  ylab = "Residuos totales (t/mes)"   # Eje Y
)

La imagen muestra la serie de tiempo mensual de residuos generados durante el año 2025, donde se observa que la producción acumulada fluctúa en un rango aproximado de entre 56 y 66 toneladas por mes. El gráfico revela una tendencia de crecimiento gradual que inicia en el segundo trimestre y alcanza su pico máximo alrededor del mes de julio, seguido de un descenso pronunciado y una posterior estabilización hacia el final del año. Este patrón sugiere variaciones en el ritmo de la actividad productiva de la empresa a escala mensual, lo cual es determinante para la gestión de un proyecto de valorización energética.

Graficos de de los 12 meses por días

# Instalar paquetes (solo la primera vez)
# install.packages(c("ggplot2","tidyr"))

# Cargar paquetes necesarios
library(dplyr)       # Manipulación de datos
library(lubridate)   # Extraer año/mes/día desde fecha
library(tidyr)       # Para completar días faltantes
## 
## Adjuntando el paquete: 'tidyr'
## The following object is masked from 'package:magrittr':
## 
##     extract
library(ggplot2)     # Gráficos

# Etiquetas de meses en español (estables, sin depender del locale)
mes_labels <- c("Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic")

# Preparar tabla: día del mes (1-31) y mes (1-12)
datos_dia_mes <- datos_residuos %>%
  mutate(
    fecha = as.Date(fecha),                 # Asegura que fecha sea tipo Date
    anio = year(fecha),                     # Extrae año
    mes_num = month(fecha),                 # Extrae mes como número (1-12)
    mes = factor(mes_num, levels = 1:12, labels = mes_labels),  # Mes como factor con etiquetas
    dia_mes = day(fecha)                    # Extrae día del mes (1-31)
  ) %>%
  group_by(anio, mes, dia_mes) %>%          # Agrupa por año, mes y día del mes
  summarise(
    residuos_t = sum(residuos_totales_t),   # Suma por si hay más de un registro por día
    .groups = "drop"
  ) %>%
  complete(                                 # Completa días 1:31 para cada mes (si faltan)
    anio, mes, dia_mes = 1:31,
    fill = list(residuos_t = NA_real_)
  )

# (Opcional) Si solo quieres graficar 2025, filtra aquí:

datos_dia_mes <- datos_dia_mes %>% filter(anio == 2025)

# Gráfico: 12 líneas (una por mes) recorriendo días del mes
ggplot(datos_dia_mes, aes(x = dia_mes, y = residuos_t, color = mes, group = mes)) +
  geom_line(linewidth = 0.9, na.rm = TRUE) +      # Línea por mes
  geom_point(size = 1.2, na.rm = TRUE) +          # Puntos para ver datos reales
  scale_x_continuous(breaks = seq(1, 31, 2)) +    # Marcas en el eje X
  labs(
    title = "Patrón diario por mes (12 líneas)",
    x = "Día del mes",
    y = "Residuos totales (t/día)",
    color = "Mes"
  ) +
  theme_minimal()

La imagen presenta el patrón diario de generación de residuos desglosado por cada mes del año, donde se observa una superposición de doce líneas que representan la variabilidad de la producción a lo largo de los días del mes. Los valores muestran fluctuaciones intensas y recurrentes que se mantienen mayoritariamente entre 1 y 3.5 toneladas diarias, destacando un pico excepcional que se aproxima a las 4 toneladas cerca del día 25. Este comportamiento refleja una actividad operativa dinámica y continua, cuya regularidad a pesar de los picos individuales facilita la estimación del suministro de biomasa necesario para la generación de energía mediante incineración. En este contexto, el análisis de los doce meses permite identificar que no existen periodos de interrupción total en la generación, lo que respalda el diseño de un sistema de combustión estable que utilice el almacenamiento para gestionar los excedentes de los días de alta producción y garantizar un flujo constante de energía durante todo el año.

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

La figura presenta la distribución de residuos mediante un diagrama de cajas que muestra una generación mediana constante entre 1.5 y 2.5 toneladas diarias a lo largo del mes. Los valores presentan una dispersión regular con picos aislados que superan las 3.5 toneladas, lo que refleja una actividad productiva continua sin caídas drásticas en días específicos. Para la generación de energía por incineración, esta estabilidad estadística facilita la planificación del suministro, permitiendo que el uso de almacenamiento temporal compense la variabilidad diaria y asegure un flujo de biomasa previsible y constante para el funcionamiento del sistema.

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

La imagen muestra un mapa de calor tipo calendario que representa la intensidad de la generación de residuos diaria a lo largo de las semanas del año 2025. Los tonos azules más claros indican días con mayor producción, alcanzando picos de hasta 3.5 toneladas, mientras que los azules oscuros señalan jornadas de menor generación cercanas a las 1.5 toneladas. La distribución cromática revela que la actividad se mantiene constante durante todos los días de la semana, incluidos sábados y domingos, lo que confirma un flujo operativo ininterrumpido. Desde la perspectiva de la incineración para generar energía, esta visualización permite identificar patrones de regularidad semanal que aseguran un suministro continuo de biomasa, facilitando la programación de turnos de operación y el mantenimiento del sistema de combustión sin riesgos de desabastecimiento prolongado

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

La imagen presenta la distribución de los residuos generados según el día de la semana, mostrando una notable estabilidad operativa durante todo el ciclo semanal. Se observa que las medianas de generación se mantienen en un rango similar para todos los días, situándose aproximadamente entre 2.0 y 2.5 toneladas diarias, con una dispersión que evidencia la ausencia de periodos de inactividad total incluso en fines de semana.

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

La imagen presenta la distribución mensual de residuos mediante un diagrama de cajas que muestra una generación mediana relativamente estable a lo largo del año, situándose de manera general entre 1.8 y 2.4 toneladas diarias. Se observa que el mes de septiembre presenta la mediana más elevada, mientras que meses como mayo y junio muestran una mayor dispersión en sus datos, incluyendo picos que superan las 3 toneladas.

# 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
##       60.7850
## s.e.   0.7813
## 
## sigma^2 = 7.991:  log likelihood = -28.98
## AIC=61.95   AICc=63.28   BIC=62.92
## 
## Training set error measures:
##                        ME     RMSE    MAE        MPE    MAPE MASE      ACF1
## Training set 2.368531e-15 2.706555 2.0775 -0.1990211 3.42729  NaN 0.2068536
# Hacer un pronóstico de 12 meses (todo el año 2026)
pronostico_2026 <- forecast(
  modelo_arima,                       # Modelo previamente ajustado
  h = 12                              # Horizonte de pronóstico: 12 meses hacia adelante
)

# Ver los valores del pronóstico en consola
pronostico_2026                       # Muestra predicciones, error estándar y rangos de confianza
##          Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## Jan 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Feb 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Mar 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Apr 2026         60.785 57.16218 64.40782 55.24437 66.32563
## May 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Jun 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Jul 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Aug 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Sep 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Oct 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Nov 2026         60.785 57.16218 64.40782 55.24437 66.32563
## Dec 2026         60.785 57.16218 64.40782 55.24437 66.32563
# Graficar el pronóstico junto con la serie histórica
plot(
  pronostico_2026,                    # Objeto de pronóstico (forecast)
  main = "Pronóstico mensual de residuos para 2026",  # Título del gráfico
  xlab = "Tiempo (meses)",            # Etiqueta eje X
  ylab = "Residuos totales (t/mes)"   # Etiqueta eje Y
)

La imagen muestra el pronóstico mensual de generación de residuos para el año 2026, proyectado a partir del comportamiento histórico observado en 2025. La predicción central se representa con una línea horizontal azul que estima una producción estable de aproximadamente 61 toneladas mensuales, rodeada por bandas de sombra que indican los intervalos de confianza del 80% y 95%. Esta proyección sugiere que, aunque el año previo mostró fluctuaciones y un pico hacia mediados del ciclo, se espera que el suministro tienda a un equilibrio constante en el futuro cercano.

library(dplyr)

# Asegurarse de que los datos están ordenados por fecha
datos_residuos_ordenado <- datos_residuos %>%   # Usa tu data frame original
  arrange(fecha)                                # Ordena de la fecha más antigua a la más reciente

# Crear la serie de tiempo diaria con frecuencia semanal (7 días)
residuos_diario_ts <- ts(
  datos_residuos_ordenado$residuos_totales_t,   # Vector numérico: residuos diarios
  start = c(2025, 1),                           # Año 2025, día 1 (aprox.)
  frequency = 7                                 # Frecuencia semanal: 7 observaciones por “ciclo”
)

# Descomponer la serie diaria (estacionalidad semanal)
descomp_diaria <- decompose(
  residuos_diario_ts,                           # Serie de tiempo diaria
  type = "additive"                             # Modelo aditivo
)

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

Inciar calculo de genración electrica

# Cargar dplyr por si no está cargado
library(dplyr)

# Definir el poder calorífico inferior (PCI) en MJ/kg (puedes cambiarlo)
PCI_MJ_kg <- 8                      # Supuesto: 8 MJ por kg de residuo

# Definir la eficiencia eléctrica de la planta (fracción entre 0 y 1)
eficiencia_electrica <- 0.25        # Supuesto: 25% de la energía térmica se convierte en electricidad

# Definir el consumo promedio mensual de una vivienda en kWh/mes
consumo_mensual_kWh_hogar <- 170    # Dato dado: 170 kWh por mes por vivienda

# Aproximar el consumo diario de una vivienda (suponiendo 30 días/mes)
consumo_diario_kWh_hogar <- consumo_mensual_kWh_hogar / 30   # kWh/día por vivienda

# Calcular el consumo anual de una vivienda (12 meses)
consumo_anual_kWh_hogar <- consumo_mensual_kWh_hogar * 12    # kWh/año por vivienda
# Ordenar la base por fecha y calcular energía diaria y viviendas equivalentes
datos_residuos_energia <- datos_residuos %>%           # Tomar la base original de residuos
  arrange(fecha) %>%                                   # Ordenar por fecha cronológicamente
  mutate(
    masa_residuos_kg = residuos_totales_t * 1000,      # Convertir toneladas/día a kg/día
    energia_bruta_MJ = masa_residuos_kg * PCI_MJ_kg,   # Energía térmica diaria en MJ
    energia_electrica_kWh = energia_bruta_MJ *         # Energía eléctrica diaria en kWh =
      eficiencia_electrica / 3.6,                      # (MJ * eficiencia) / 3.6 MJ/kWh
    viviendas_equivalentes_dia =                      # Número de viviendas que se podrían abastecer ese día =
      energia_electrica_kWh / consumo_diario_kWh_hogar # kWh disponibles / kWh por vivienda por día
  )

View(datos_residuos_energia)
# Ver algunas filas para comprobar los cálculos
head(datos_residuos_energia)                           # Muestra las primeras filas de la tabla con energía
## # A tibble: 6 × 11
##   fecha               dia_semana es_feriado tipo_dia residuos_base_t
##   <dttm>              <chr>      <lgl>      <chr>              <dbl>
## 1 2025-01-01 00:00:00 Wednesday  TRUE       Feriado             1.75
## 2 2025-01-02 00:00:00 Thursday   FALSE      Normal              2.9 
## 3 2025-01-03 00:00:00 Friday     FALSE      Normal              2.46
## 4 2025-01-04 00:00:00 Saturday   FALSE      Normal              2.2 
## 5 2025-01-05 00:00:00 Sunday     FALSE      Normal              1.31
## 6 2025-01-06 00:00:00 Monday     FALSE      Normal              1.31
## # ℹ 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] 405233.3
viviendas_equivalentes_anual                           # Viviendas equivalentes abastecidas en el año
## [1] 198.6438
# Crear un resumen semanal con residuos, energía y viviendas equivalentes
resumen_semanal_energia <- datos_residuos_energia %>%      # Tomar la tabla con energía diaria
  mutate(
    semana = lubridate::floor_date(                        # Crear una columna de semana
      fecha, "week", week_start = 1                        # La semana empieza el lunes (1 = lunes)
    )
  ) %>%
  group_by(semana) %>%                                     # Agrupar por semana
  summarise(
    total_residuos_t = sum(residuos_totales_t),            # Suma semanal de residuos (toneladas)
    total_energia_kWh = sum(energia_electrica_kWh),        # Suma semanal de energía (kWh)
    promedio_diario_residuos_t = mean(residuos_totales_t), # Promedio diario de residuos en esa semana
    promedio_diario_energia_kWh = mean(energia_electrica_kWh), # Promedio diario de energía en esa semana
    n_dias = n()                                           # Número de días en esa semana (normalmente 7)
  ) %>%
  ungroup() %>%                                            # Quitar la agrupación
  mutate(
    consumo_semanal_kWh_hogar =                            # Consumo semanal por vivienda
      consumo_diario_kWh_hogar * 7,                        # kWh/día * 7 días
    viviendas_equivalentes_semana =                        # Viviendas equivalentes por semana
      total_energia_kWh / consumo_semanal_kWh_hogar        # kWh semanales disponibles / kWh semanales por vivienda
  )

# Ver las primeras filas del resumen semanal
head(resumen_semanal_energia)                              # Muestra tabla semanal con energía y viviendas
## # A tibble: 6 × 8
##   semana              total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2024-12-30 00:00:00             11.0             6133.                    2.21
## 2 2025-01-06 00:00:00             13.8             7644.                    1.97
## 3 2025-01-13 00:00:00             12.3             6850                     1.76
## 4 2025-01-20 00:00:00             12.9             7150                     1.84
## 5 2025-01-27 00:00:00             11.4             6328.                    1.63
## 6 2025-02-03 00:00:00             15.5             8617.                    2.22
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 4 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   consumo_semanal_kWh_hogar <dbl>, viviendas_equivalentes_semana <dbl>
# Crear un resumen mensual con residuos, energía y viviendas equivalentes
resumen_mensual_energia <- datos_residuos_energia %>%      # Tomar la tabla diaria con energía
  mutate(
    mes = lubridate::floor_date(fecha, "month")            # Crear columna con el primer día del mes
  ) %>%
  group_by(mes) %>%                                        # Agrupar por mes
  summarise(
    total_residuos_t = sum(residuos_totales_t),            # Suma mensual de residuos (toneladas)
    total_energia_kWh = sum(energia_electrica_kWh),        # Suma mensual de energía (kWh)
    promedio_diario_residuos_t = mean(residuos_totales_t), # Promedio diario de residuos en el mes
    promedio_diario_energia_kWh = mean(energia_electrica_kWh), # Promedio diario de energía en el mes
    n_dias = n()                                           # Número de días en ese mes (28–31)
  ) %>%
  ungroup() %>%                                            # Quitar agrupación
  mutate(
    viviendas_equivalentes_mes =                           # Viviendas equivalentes por mes
      total_energia_kWh / consumo_mensual_kWh_hogar        # kWh mensuales disponibles / 170 kWh/mes por vivienda
  )

# Ver las primeras filas del resumen mensual
head(resumen_mensual_energia)                              # Muestra la tabla mensual con energía y viviendas
## # A tibble: 6 × 7
##   mes                 total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2025-01-01 00:00:00             58.9            32733.                    1.90
## 2 2025-02-01 00:00:00             55.9            31072.                    2.00
## 3 2025-03-01 00:00:00             61.7            34289.                    1.99
## 4 2025-04-01 00:00:00             60.0            33339.                    2.00
## 5 2025-05-01 00:00:00             61.3            34056.                    1.98
## 6 2025-06-01 00:00:00             56.9            31633.                    1.90
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 3 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   viviendas_equivalentes_mes <dbl>

graficos de nergia

# Ver las primeras filas del resumen mensual para comprobar su contenido
head(resumen_mensual_energia)   # Debe tener columnas como mes, total_energia_kWh, viviendas_equivalentes_mes
## # A tibble: 6 × 7
##   mes                 total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2025-01-01 00:00:00             58.9            32733.                    1.90
## 2 2025-02-01 00:00:00             55.9            31072.                    2.00
## 3 2025-03-01 00:00:00             61.7            34289.                    1.99
## 4 2025-04-01 00:00:00             60.0            33339.                    2.00
## 5 2025-05-01 00:00:00             61.3            34056.                    1.98
## 6 2025-06-01 00:00:00             56.9            31633.                    1.90
## # ℹ 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] 192.5490 182.7778 201.6993 196.1111 200.3268 186.0784
# 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
)

El gráfico de energía mensual generada a partir de residuos evidencia que Inmaia S.A, mantiene una producción energética relativamente constante a lo largo del año, con valores que oscilan aproximadamente entre 30.000 y 35.000 kWh mensuales. Se observan ligeros incrementos en los meses de mitad de año, lo que sugiere un mayor nivel de actividad productiva o una mayor disponibilidad de residuos aprovechables, mientras que en otros meses la generación se mantiene estable sin caídas significativas. Este comportamiento refleja una operación continua y controlada, propia de una empresa con procesos productivos consolidados, y demuestra que la valorización energética de los residuos representa un aporte relevante y sostenido dentro de la gestión ambiental y energética de Inmaia S.A.

# Cargar dplyr por si no está cargado
library(dplyr)

# Definir el consumo mensual promedio por vivienda en kWh/mes
consumo_mensual_kWh_hogar <- 170      # Dato que tú diste: 170 kWh por mes

# Calcular el consumo diario promedio por vivienda (aprox. 30 días/mes)
consumo_diario_kWh_hogar <- consumo_mensual_kWh_hogar / 30   # kWh por día por vivienda

# Crear una nueva columna con viviendas equivalentes promedio por día en cada mes
resumen_mensual_energia <- resumen_mensual_energia %>%              # Tomar el resumen mensual que ya tienes
  mutate(
    viviendas_promedio_diarias =                                     # Nueva columna: viviendas promedio por día en el mes
      promedio_diario_energia_kWh / consumo_diario_kWh_hogar         # Energía diaria promedio / consumo diario por vivienda
  )

# Ver las primeras filas para comprobar las nuevas columnas
head(resumen_mensual_energia)    # Debes ver 'promedio_diario_energia_kWh' y 'viviendas_promedio_diarias'
## # A tibble: 6 × 8
##   mes                 total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2025-01-01 00:00:00             58.9            32733.                    1.90
## 2 2025-02-01 00:00:00             55.9            31072.                    2.00
## 3 2025-03-01 00:00:00             61.7            34289.                    1.99
## 4 2025-04-01 00:00:00             60.0            33339.                    2.00
## 5 2025-05-01 00:00:00             61.3            34056.                    1.98
## 6 2025-06-01 00:00:00             56.9            31633.                    1.90
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 4 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   viviendas_equivalentes_mes <dbl>, viviendas_promedio_diarias <dbl>

ultimo

library(dplyr)
library(tidyr)
library(lubridate)
library(ggplot2)

# =========================
# 1) ENERGÍA DIARIA REAL 2025 (kWh/día)
# =========================
energia_2025 <- datos_residuos_energia %>%
  mutate(fecha = as.Date(fecha)) %>%
  group_by(fecha) %>%
  summarise(energia_kWh = sum(energia_electrica_kWh, na.rm = TRUE), .groups = "drop") %>%
  filter(year(fecha) == 2025)

# =========================
# 2) PESOS POR DÍA DE SEMANA (a partir de 2025)
#    Esto se usa para repartir el total mensual pronosticado de 2026 en días
# =========================
pesos_dow <- datos_residuos %>%
  mutate(fecha = as.Date(fecha)) %>%
  filter(year(fecha) == 2025) %>%
  mutate(dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)) %>%
  group_by(dia_sem) %>%
  summarise(media_t = mean(residuos_totales_t, na.rm = TRUE), .groups = "drop") %>%
  mutate(peso = media_t / mean(media_t, na.rm = TRUE)) %>%
  select(dia_sem, peso)

# =========================
# 3) RESIDUOS MENSUALES PROYECTADOS 2026 (desde forecast)
# =========================
residuos_2026_mensual <- tibble(
  mes = seq.Date(as.Date("2026-01-01"), by = "month", length.out = 12),
  total_residuos_t = as.numeric(pronostico_2026$mean)   # <-- total t/mes pronosticado
)
# Alias para compatibilidad de nombre (evita error en knit)
residuos_2026_mes <- residuos_2026_mensual
# =========================
# 4) DESAGREGAR A DIARIO 2026 CONSERVANDO TOTALES MENSUALES
#    usando el patrón de día de semana de 2025
# =========================
residuos_2026_diario <- residuos_2026_mensual %>%
  rowwise() %>%
  mutate(
    fechas = list(seq.Date(mes, ceiling_date(mes, "month") - days(1), by = "day"))
  ) %>%
  unnest(fechas) %>%
  rename(fecha = fechas) %>%
  mutate(
    dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)
  ) %>%
  left_join(pesos_dow, by = "dia_sem") %>%
  group_by(mes) %>%
  mutate(
    # normalizar pesos dentro del mes para que la suma diaria = total mensual
    peso_norm = peso / sum(peso, na.rm = TRUE),
    residuos_t_dia = total_residuos_t * peso_norm
  ) %>%
  ungroup()

# =========================
# 5) PASAR RESIDUOS 2026 -> ENERGÍA 2026 (kWh/día)
# =========================
energia_2026 <- residuos_2026_diario %>%
  mutate(
    masa_kg = residuos_t_dia * 1000,
    energia_bruta_MJ = masa_kg * PCI_MJ_kg,
    energia_kWh = energia_bruta_MJ * eficiencia_electrica / 3.6
  ) %>%
  select(fecha, energia_kWh)

# =========================
# 6) UNIR 2025 (real) + 2026 (proyectado)
# =========================
energia_all <- bind_rows(
  energia_2025 %>% mutate(tipo = "Real 2025"),
  energia_2026 %>% mutate(tipo = "Proyección 2026")
) %>%
  mutate(
    anio = year(fecha),
    # semana del año basada en lunes (sin problemas de ISO-year)
    semana_inicio = floor_date(fecha, "week", week_start = 1),
    semana0 = floor_date(as.Date(paste0(anio, "-01-01")), "week", week_start = 1),
    semana = as.integer(difftime(semana_inicio, semana0, units = "weeks")) + 1,
    dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)
  )

# (opcional) completar días faltantes para que el heatmap no quede "hueco"
energia_all <- energia_all %>%
  group_by(anio, tipo) %>%
  complete(
    fecha = seq.Date(min(fecha), max(fecha), by = "day")
  ) %>%
  ungroup() %>%
  mutate(
    semana_inicio = floor_date(fecha, "week", week_start = 1),
    semana0 = floor_date(as.Date(paste0(year(fecha), "-01-01")), "week", week_start = 1),
    semana = as.integer(difftime(semana_inicio, semana0, units = "weeks")) + 1,
    dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)
  )

# =========================
# 7) HEATMAP (ENERGÍA kWh/día) 2025 vs 2026
# =========================
ggplot(energia_all, aes(x = semana, y = dia_sem, fill = energia_kWh)) +
  geom_tile(color = NA) +
  facet_wrap(~ tipo, ncol = 1) +
  labs(
    title = "Heatmap calendario de generación de energía (kWh/día): 2025 real vs 2026 proyectado",
    x = "Semana del año (inicio lunes)",
    y = "Día de la semana",
    fill = "kWh/día"
  ) +
  theme_minimal()

VALORIZACIÓN ENERGÉTICA CON VARIACIÓN MENSUAL

###############################################
# VALORIZACIÓN ENERGÉTICA CON VARIACIÓN MENSUAL
# Ecuador: más residuos en feriados (Carnaval, Semana Santa, Finados, Navidad)
###############################################

########## 0. LIBRERÍAS ##########

# Ejecutar solo una vez si no está instalado:
# install.packages("ggplot2")

library(ggplot2)


########## 1. CONSTANTES Y PARÁMETROS GLOBALES ##########

MJ_por_kWh  <- 3.6           # 1 kWh = 3,6 MJ
dias_anio   <- 365
horas_anio  <- 8760          # 24*365

# Días por mes (año no bisiesto)
dias_mes <- c(
  31, # Enero
  28, # Febrero
  31, # Marzo
  30, # Abril
  31, # Mayo
  30, # Junio
  31, # Julio
  31, # Agosto
  30, # Septiembre
  31, # Octubre
  30, # Noviembre
  31  # Diciembre
)

nombres_mes <- c(
  "Enero", "Febrero", "Marzo", "Abril",
  "Mayo", "Junio", "Julio", "Agosto",
  "Septiembre", "Octubre", "Noviembre", "Diciembre"
)

# Consumo típico de un hogar (ajusta a tu realidad)
consumo_hogar_kWh_anio <- 4000   # kWh/año por vivienda (ejemplo)


########## 2. FUNCIÓN BÁSICA: ENERGÍA DIARIA A PARTIR DE RESIDUOS ##########

# Calcula energía bruta y útil (solo a nivel diario)
energia_residuo_diaria <- function(masa_t_dia,
                                   PCI_MJ_kg,
                                   eficiencia_electrica = 0.25,
                                   eficiencia_termica  = 0.00,
                                   disponibilidad       = 0.90) {
  # masa en kg/día
  masa_kg_dia <- masa_t_dia * 1000
  
  # energía bruta en el residuo
  energia_bruta_MJ_dia  <- masa_kg_dia * PCI_MJ_kg
  energia_bruta_kWh_dia <- energia_bruta_MJ_dia / MJ_por_kWh
  
  # energía útil diaria
  energia_el_kWh_dia <- energia_bruta_kWh_dia * eficiencia_electrica * disponibilidad
  energia_th_kWh_dia <- energia_bruta_kWh_dia * eficiencia_termica  * disponibilidad
  
  list(
    masa_t_dia            = masa_t_dia,
    PCI_MJ_kg             = PCI_MJ_kg,
    eficiencia_electrica  = eficiencia_electrica,
    eficiencia_termica    = eficiencia_termica,
    disponibilidad        = disponibilidad,
    energia_bruta_MJ_dia  = energia_bruta_MJ_dia,
    energia_bruta_kWh_dia = energia_bruta_kWh_dia,
    energia_el_kWh_dia    = energia_el_kWh_dia,
    energia_th_kWh_dia    = energia_th_kWh_dia
  )
}


########## 3. TABLA MENSUAL PARA UN AÑO (CON VARIACIÓN POR MES) ##########

# multip_mes: vector de 12 factores (1 = igual al promedio anual)
# Ejemplo Ecuador (puedes ajustar):
# - Febrero (Carnaval)        -> 1.10
# - Marzo (Semana Santa aprox)-> 1.05
# - Noviembre (Finados)       -> 1.08
# - Diciembre (Navidad/Año Nuevo) -> 1.20

calcular_ano_mensual <- function(
  masa_t_dia_base,
  PCI_MJ_kg,
  eficiencia_electrica = 0.25,
  eficiencia_termica  = 0.00,
  disponibilidad      = 0.90,
  multip_mes          = c(
    1.00, # Ene
    1.10, # Feb (Carnaval)
    1.05, # Mar (Semana Santa aproximada)
    1.00, # Abr
    1.00, # May
    1.00, # Jun
    1.00, # Jul
    1.00, # Ago
    1.00, # Sep
    1.00, # Oct
    1.08, # Nov (Finados)
    1.20  # Dic (Navidad / Año Nuevo)
  )
) {
  if (length(multip_mes) != 12) {
    stop("El vector multip_mes debe tener 12 valores (uno por mes).")
  }
  
  n_meses <- 12
  masa_t_dia_mes     <- numeric(n_meses)
  masa_t_mes         <- numeric(n_meses)
  energia_el_kWh_dia <- numeric(n_meses)
  energia_el_kWh_mes <- numeric(n_meses)
  
  for (i in 1:n_meses) {
    # masa diaria ajustada por mes
    masa_t_dia_mes[i] <- masa_t_dia_base * multip_mes[i]
    
    # energía diaria para ese mes
    res_dia <- energia_residuo_diaria(
      masa_t_dia         = masa_t_dia_mes[i],
      PCI_MJ_kg          = PCI_MJ_kg,
      eficiencia_electrica = eficiencia_electrica,
      eficiencia_termica   = eficiencia_termica,
      disponibilidad       = disponibilidad
    )
    
    energia_el_kWh_dia[i] <- res_dia$energia_el_kWh_dia
    
    # masa y energía mensual
    masa_t_mes[i]         <- masa_t_dia_mes[i] * dias_mes[i]
    energia_el_kWh_mes[i] <- energia_el_kWh_dia[i] * dias_mes[i]
  }
  
  energia_el_kWh_anio <- sum(energia_el_kWh_mes)
  energia_el_GWh_anio <- energia_el_kWh_anio / 1e6
  
  tabla <- data.frame(
    mes               = 1:12,
    nombre_mes        = factor(nombres_mes, levels = nombres_mes),
    dias_mes          = dias_mes,
    multip_mes        = multip_mes,
    masa_t_dia        = masa_t_dia_mes,
    masa_t_mes        = masa_t_mes,
    energia_el_kWh_dia = energia_el_kWh_dia,
    energia_el_kWh_mes = energia_el_kWh_mes
  )
  
  list(
    tabla_mensual       = tabla,
    energia_el_kWh_anio = energia_el_kWh_anio,
    energia_el_GWh_anio = energia_el_GWh_anio
  )
}


########## 4. EJEMPLO: AÑO BASE CON VARIACIÓN MENSUAL ##########

# Aquí defines TU ESCENARIO BASE:
# - masa_t_dia_base: promedio diario de residuos (t/día)
# - PCI: buen poder calorífico (MJ/kg)

masa_t_dia_base_ej   <- 100    # t/día (ejemplo, se puede cambiar )
PCI_MJ_kg_ej         <- 12     # MJ/kg (RSU con buen PCI)
ef_el_ej             <- 0.25   # 25 % eficiencia eléctrica
ef_th_ej             <- 0.00   # no uso calor en este ejemplo
disp_ej              <- 0.90   # 90 % disponibilidad

resultado_ano_base <- calcular_ano_mensual(
  masa_t_dia_base      = masa_t_dia_base_ej,
  PCI_MJ_kg            = PCI_MJ_kg_ej,
  eficiencia_electrica = ef_el_ej,
  eficiencia_termica   = ef_th_ej,
  disponibilidad       = disp_ej
)

tabla_mensual_base <- resultado_ano_base$tabla_mensual
tabla_mensual_base
##    mes nombre_mes dias_mes multip_mes masa_t_dia masa_t_mes energia_el_kWh_dia
## 1    1      Enero       31       1.00        100       3100              75000
## 2    2    Febrero       28       1.10        110       3080              82500
## 3    3      Marzo       31       1.05        105       3255              78750
## 4    4      Abril       30       1.00        100       3000              75000
## 5    5       Mayo       31       1.00        100       3100              75000
## 6    6      Junio       30       1.00        100       3000              75000
## 7    7      Julio       31       1.00        100       3100              75000
## 8    8     Agosto       31       1.00        100       3100              75000
## 9    9 Septiembre       30       1.00        100       3000              75000
## 10  10    Octubre       31       1.00        100       3100              75000
## 11  11  Noviembre       30       1.08        108       3240              81000
## 12  12  Diciembre       31       1.20        120       3720              90000
##    energia_el_kWh_mes
## 1             2325000
## 2             2310000
## 3             2441250
## 4             2250000
## 5             2325000
## 6             2250000
## 7             2325000
## 8             2325000
## 9             2250000
## 10            2325000
## 11            2430000
## 12            2790000
resultado_ano_base$energia_el_GWh_anio  # energía anual en GWh (escenario base)
## [1] 28.34625
########## 5. GRÁFICAS PARA EL AÑO BASE ##########

# 5.1. Masa de residuos por mes (t/mes)
ggplot(tabla_mensual_base, aes(x = nombre_mes, y = masa_t_mes)) +
  geom_col(fill = "darkgreen") +
  labs(
    title = "Masa de residuos tratada por mes",
    x = "Mes",
    y = "Masa de residuos (t/mes)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 0, hjust = 0.5))

# 5.2. Energía eléctrica por mes (MWh/mes)
tabla_mensual_base$energia_el_MWh_mes <- tabla_mensual_base$energia_el_kWh_mes / 1000

ggplot(tabla_mensual_base, aes(x = nombre_mes, y = energia_el_MWh_mes)) +
  geom_col(fill = "steelblue") +
  labs(
    title = "Energía eléctrica generada por mes",
    x = "Mes",
    y = "Energía eléctrica (MWh/mes)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 0, hjust = 0.5))

# 5.3. Línea comparando masa (t/mes) y energía (MWh/mes) normalizadas
tabla_mensual_base$masa_norm  <- tabla_mensual_base$masa_t_mes / max(tabla_mensual_base$masa_t_mes)
tabla_mensual_base$energia_norm <- tabla_mensual_base$energia_el_MWh_mes / max(tabla_mensual_base$energia_el_MWh_mes)

ggplot(tabla_mensual_base, aes(x = mes)) +
  geom_line(aes(y = masa_norm,  colour = "Masa (t/mes)")) +
  geom_line(aes(y = energia_norm, colour = "Energía (MWh/mes)")) +
  scale_x_continuous(breaks = 1:12, labels = nombres_mes) +
  labs(
    title = "Comparación relativa masa vs energía por mes",
    x = "Mes",
    y = "Valor normalizado"
  ) +
  scale_colour_manual(values = c("Masa (t/mes)" = "darkgreen",
                                 "Energía (MWh/mes)" = "steelblue")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

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

# Esta función proyecta varios años:
# - La masa base se multiplica por (1 + tasa_crecimiento)^año
# - El patrón mensual (multip_mes) se mantiene igual cada año

proyectar_meses_varios_anios <- function(
  masa_t_dia_base,
  PCI_MJ_kg,
  eficiencia_electrica = 0.25,
  eficiencia_termica  = 0.00,
  disponibilidad      = 0.90,
  multip_mes          = rep(1, 12),
  tasa_crecimiento    = 0.02,    # 2 % anual
  n_anios             = 10,
  anio_inicio         = 2025
) {
  # Data.frame vacío "largo": año-mes
  n_total <- (n_anios + 1) * 12   # año 0 + n_anios
  df <- data.frame(
    anio        = integer(n_total),
    anio_rel    = integer(n_total),
    mes         = integer(n_total),
    nombre_mes  = character(n_total),
    dias_mes    = integer(n_total),
    masa_t_dia  = numeric(n_total),
    masa_t_mes  = numeric(n_total),
    energia_el_kWh_mes = numeric(n_total),
    stringsAsFactors = FALSE
  )
  
  idx <- 1
  
  for (a in 0:n_anios) {         # a = 0 es el año base
    masa_base_anio <- masa_t_dia_base * (1 + tasa_crecimiento) ^ a
    anio_cal <- anio_inicio + a
    
    # Calculamos el año completo con la función de antes
    res_anio <- calcular_ano_mensual(
      masa_t_dia_base      = masa_base_anio,
      PCI_MJ_kg            = PCI_MJ_kg,
      eficiencia_electrica = eficiencia_electrica,
      eficiencia_termica   = eficiencia_termica,
      disponibilidad       = disponibilidad,
      multip_mes           = multip_mes
    )
    
    tab_m <- res_anio$tabla_mensual
    
    for (m in 1:12) {
      df$anio[idx]              <- anio_cal
      df$anio_rel[idx]          <- a
      df$mes[idx]               <- m
      df$nombre_mes[idx]        <- as.character(tab_m$nombre_mes[m])
      df$dias_mes[idx]          <- tab_m$dias_mes[m]
      df$masa_t_dia[idx]        <- tab_m$masa_t_dia[m]
      df$masa_t_mes[idx]        <- tab_m$masa_t_mes[m]
      df$energia_el_kWh_mes[idx] <- tab_m$energia_el_kWh_mes[m]
      idx <- idx + 1
    }
  }
  
  df$energia_el_MWh_mes <- df$energia_el_kWh_mes / 1000
  
  df
}


########## 7. EJEMPLO DE PROYECCIÓN: 10 AÑOS ##########

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

# Usamos el mismo multip_mes del año base (feriados)
multip_mes_ej <- c(
  1.00, # Ene
  1.10, # Feb
  1.05, # Mar
  1.00, # Abr
  1.00, # May
  1.00, # Jun
  1.00, # Jul
  1.00, # Ago
  1.00, # Sep
  1.00, # Oct
  1.08, # Nov
  1.20  # Dic
)

proyeccion_meses <- proyectar_meses_varios_anios(
  masa_t_dia_base      = masa_t_dia_base_ej,
  PCI_MJ_kg            = PCI_MJ_kg_ej,
  eficiencia_electrica = ef_el_ej,
  eficiencia_termica   = ef_th_ej,
  disponibilidad       = disp_ej,
  multip_mes           = multip_mes_ej,
  tasa_crecimiento     = tasa_crec_ej,
  n_anios              = n_anios_ej,
  anio_inicio          = anio_inicio_ej
)

head(proyeccion_meses)
##   anio anio_rel mes nombre_mes dias_mes masa_t_dia masa_t_mes
## 1 2025        0   1      Enero       31        100       3100
## 2 2025        0   2    Febrero       28        110       3080
## 3 2025        0   3      Marzo       31        105       3255
## 4 2025        0   4      Abril       30        100       3000
## 5 2025        0   5       Mayo       31        100       3100
## 6 2025        0   6      Junio       30        100       3000
##   energia_el_kWh_mes energia_el_MWh_mes
## 1            2325000            2325.00
## 2            2310000            2310.00
## 3            2441250            2441.25
## 4            2250000            2250.00
## 5            2325000            2325.00
## 6            2250000            2250.00
########## 8. RESUMEN ANUAL DE LA PROYECCIÓN ##########

# Calculamos energía anual sumando todos los meses

anios_unicos <- unique(proyeccion_meses$anio)
n_anios_tot <- length(anios_unicos)

resumen_anual <- data.frame(
  anio               = anios_unicos,
  energia_el_kWh_anio = numeric(n_anios_tot),
  energia_el_GWh_anio = numeric(n_anios_tot),
  masa_t_anio         = numeric(n_anios_tot)
)

for (i in 1:n_anios_tot) {
  anio_i <- anios_unicos[i]
  sub_i  <- proyeccion_meses[proyeccion_meses$anio == anio_i, ]
  
  resumen_anual$energia_el_kWh_anio[i] <- sum(sub_i$energia_el_kWh_mes)
  resumen_anual$energia_el_GWh_anio[i] <- resumen_anual$energia_el_kWh_anio[i] / 1e6
  resumen_anual$masa_t_anio[i]         <- sum(sub_i$masa_t_mes)
}

resumen_anual
##    anio energia_el_kWh_anio energia_el_GWh_anio masa_t_anio
## 1  2025            28346250            28.34625    37795.00
## 2  2026            29196638            29.19664    38928.85
## 3  2027            30072537            30.07254    40096.72
## 4  2028            30974713            30.97471    41299.62
## 5  2029            31903954            31.90395    42538.61
## 6  2030            32861073            32.86107    43814.76
## 7  2031            33846905            33.84690    45129.21
## 8  2032            34862312            34.86231    46483.08
## 9  2033            35908181            35.90818    47877.58
## 10 2034            36985427            36.98543    49313.90
## 11 2035            38094990            38.09499    50793.32
########## 9. GRÁFICAS DE LA PROYECCIÓN ##########

# 9.1 Energía eléctrica anual (GWh/año)
ggplot(resumen_anual, aes(x = anio, y = energia_el_GWh_anio)) +
  geom_line() +
  geom_point(size = 2) +
  labs(
    title = "Proyección de energa elctrica anual",
    x = "Anio",
    y = "Energía eléctrica (GWh/año)"
  ) +
  theme_minimal()

# 9.2 Masa total de residuos por año (t/año)
ggplot(resumen_anual, aes(x = anio, y = masa_t_anio)) +
  geom_line(color = "darkgreen") +
  geom_point(size = 2, color = "darkgreen") +
  labs(
    title = "Masa total de residuos tratada por anio",
    x = "Anio",
    y = "Masa de residuos (t/anio)"
  ) +
  theme_minimal()

El gráfico de proyección de energía eléctrica anual para la empresa Inmaia S.A. muestra una tendencia claramente creciente en el consumo energético a lo largo del periodo proyectado, pasando aproximadamente de 28 GWh en 2025 hasta cerca de 38 GWh en 2035. Este crecimiento sostenido sugiere un escenario de expansión progresiva de las operaciones productivas y un aumento continuo de la demanda energética asociado al crecimiento de la capacidad instalada o del volumen de producción. La tendencia lineal indica que, de mantenerse las condiciones actuales, la empresa deberá anticipar mayores requerimientos de energía en el mediano y largo plazo, lo que hace recomendable la planificación de estrategias de eficiencia energética, optimización de procesos y evaluación de fuentes alternativas o renovables de energía, con el fin de garantizar la sostenibilidad operativa y el control de costos energéticos futuros.

#Analisis economicom

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_mes$residuos_total_t, na.rm = TRUE)
## Warning: Unknown or uninitialised column: `residuos_total_t`.
# Potencia promedio equivalente (para dimensionar CAPEX por kW)
MW_prom_2026 <- energia_anual_2026_kWh / 8760 / 1000

energia_anual_2026_kWh
## [1] 405233.3
residuos_anual_2026_t
## [1] 0
MW_prom_2026
## [1] 0.04625951
# ===== 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) =====
# precio_usd_kWh:
# - 0.0747 ~ 74.7 USD/MWh (precio preferente municipal WtE)
# - 0.10525 ~ biomasa en ¢USD/kWh
# gatefee_usd_t:
# - 29.15 referencial Quito (relleno)
# capex_usd_kW y opex_fijo_pct: base desde literatura (7000 y 4%)

escenarios <- tibble(
  escenario = c("Conservador", "Base", "Optimista"),
  precio_usd_kWh = c(0.0747, 0.0900, 0.10525),
  gatefee_usd_t   = c(10, 29.15, 40),
  capex_usd_kW    = c(9000, 7000, 6000),
  opex_fijo_pct   = c(0.05, 0.04, 0.04),
  opex_var_usd_t  = c(35, 25, 15),
  vida_anios      = c(15, 20, 20),
  tasa_desc       = c(0.12, 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()

resultados
## # A tibble: 3 × 11
##   escenario   CAPEX_USD Ingreso_elec_USD_anual Ingreso_gate_USD_anual
##   <chr>           <dbl>                  <dbl>                  <dbl>
## 1 Conservador   416336.                 30271.                      0
## 2 Base          323817.                 36471                       0
## 3 Optimista     277557.                 42651.                      0
## # ℹ 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>