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_kg = sum(residuos_totales_kg),           # Suma total de residuos en la semana (kilogramos)
    promedio_diario_kg = mean(residuos_totales_kg),         # 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_kg promedio_diario_kg n_dias
##   <dttm>                          <dbl>              <dbl>  <int>
## 1 2024-12-30 00:00:00              208.               41.7      5
## 2 2025-01-06 00:00:00              286.               40.8      7
## 3 2025-01-13 00:00:00              267.               38.1      7
## 4 2025-01-20 00:00:00              289.               41.3      7
## 5 2025-01-27 00:00:00              273.               39.1      7
## 6 2025-02-03 00:00:00              290.               41.5      7
View(resumen_semanal)
# Ver un resumen estadístico del total semanal de residuos
summary(resumen_semanal$total_residuos_kg)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   116.2   273.4   281.0   276.7   287.7   311.7

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_kg = sum(residuos_totales_kg),     # Suma total de residuos en el mes (toneladas)
    promedio_diario_kg = mean(residuos_totales_kg),   # 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_kg promedio_diario_kg n_dias
##   <dttm>                          <dbl>              <dbl>  <int>
## 1 2025-01-01 00:00:00             1238.               39.9     31
## 2 2025-02-01 00:00:00             1128.               40.3     28
## 3 2025-03-01 00:00:00             1176.               37.9     31
## 4 2025-04-01 00:00:00             1191.               39.7     30
## 5 2025-05-01 00:00:00             1249.               40.3     31
## 6 2025-06-01 00:00:00             1236.               41.2     30
# Ver un resumen estadístico del total mensual de residuos
summary(resumen_mensual$total_residuos_kg)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1128    1197    1237    1222    1249    1276

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_kg = mean(residuos_totales_kg),       # Promedio de residuos por día (toneladas)
    sd_residuos_kg = sd(residuos_totales_kg),               # Desviación estándar de residuos
    minimo_residuos_kg = min(residuos_totales_kg),          # Valor mínimo de residuos
    maximo_residuos_kg = max(residuos_totales_kg),          # 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_kg sd_residuos_kg minimo_residuos_kg
##   <chr>                   <dbl>          <dbl>              <dbl>
## 1 Feriado                  48.4          NA                  48.4
## 2 Normal                   40.2           4.82               32.1
## # ℹ 2 more variables: maximo_residuos_kg <dbl>, n_dias <int>

Gráficos inciales

# Histograma de residuos totales diarios
hist(
  datos_residuos$residuos_totales_kg,   # Vector numérico con residuos diarios
  main = "Histograma de residuos diarios (kg/día)",  # Título del gráfico
  xlab = "Residuos totales (kilogramos/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_kg ~ 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 (kg/dia)"                  # Etiqueta eje Y
)

Histograma de residuos diarios (kg/dia)
El histograma muestra la distribución de los residuos diarios generados por EcoKakao S.A., evidenciando una concentración principal entre valores medios. Esto indica una generacion relativamente estable de biomasa residual, lo cual es favorable para procesos de valorizacion energetica, ya que permite planificar sistemas de aprovechamiento continuo como biodigestión o combustión controlada sin grandes fluctuaciones operativas.

Residuos diarios: dia normal vs feriado
El diagrama de cajas compara la generación de residuos entre dias normales y feriados, evidenciando diferencias claras en la dispersión y la mediana. En días feriados se observa menor variabilidad operativa, lo que sugiere reducción de actividad productiva. Este comportamiento es clave para ajustar la capacidad de los sistemas de valorización y evitar sobredimensionamientos innecesarios.

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_kg)                        # 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_kg)                        # 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] 8.191374
# Calcular el incremento relativo (en porcentaje)
incremento_relativo <- (incremento_absoluto / promedio_normal) * 100   # Diferencia / normal * 100

# Mostrar los resultados en consola
promedio_normal           # Promedio kg/día en día normal
## [1] 40.15863
promedio_feriado          # Promedio kg/día en feriado
## [1] 48.35
incremento_absoluto       # Cuántos kilogramos más en feriado
## [1] 8.191374
incremento_relativo       # % más de residuos en feriado
## [1] 20.39754
# 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 (kg/dia)"# Etiqueta eje Y
)


Promedio de residuos diarios: dia normal vs feriado  
El grafico de barras permite visualizar de forma directa el promedio de residuos generados en dias normales frente a feriados. La diferencia entre ambos confirma que la operación productiva de EcoKakao S.A. influye directamente en la disponibilidad de biomasa residual, informacion esencial para estimar rendimientos energeticos reales y diseñar escenarios conservadores de aprovechamiento.

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_kg,   # 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] 48.35 39.00 40.55 40.58 40.01 44.68 44.31 39.96 45.78 36.51 37.37 37.01
##  [13] 42.75 33.65 40.48 37.63 37.54 34.95 39.78 46.61 47.00 38.91 46.01 33.46
##  [25] 32.06 45.11 42.84 32.17 43.68 33.04 35.94 47.88 37.84 38.31 38.06 46.24
##  [37] 44.31 34.08 45.49 43.84 37.14 44.20 34.98 40.25 39.76 44.16 33.58 43.30
##  [49] 41.22 42.77 39.47 47.25 36.64 35.36 45.21 32.33 39.48 32.34 42.26 35.47
##  [61] 38.39 32.51 39.11 35.90 39.95 35.48 37.44 34.07 40.13 37.96 42.32 32.18
##  [73] 39.20 33.73 37.44 39.46 37.25 32.83 32.84 43.66 32.97 32.93 45.78 34.13
##  [85] 43.55 45.79 40.17 38.75 44.48 40.05 33.96 33.24 39.19 38.40 33.02 46.55
##  [97] 47.92 43.84 32.72 34.76 38.06 45.66 33.57 34.51 32.06 36.56 45.30 45.10
## [109] 42.99 44.48 43.31 39.55 46.86 43.46 40.84 32.16 41.55 44.87 41.12 35.42
## [121] 35.36 32.79 33.07 47.36 41.53 35.72 46.70 42.85 37.00 42.32 47.24 41.64
## [133] 45.59 41.63 32.72 35.96 42.21 40.33 44.72 42.22 39.14 44.40 47.97 34.05
## [145] 34.95 39.71 43.93 39.32 41.78 36.46 38.55 33.83 47.98 47.72 37.21 36.92
## [157] 35.10 44.35 35.99 41.44 47.04 44.58 47.06 47.80 37.36 42.11 46.31 38.18
## [169] 42.94 42.87 39.14 43.95 42.61 40.05 34.71 46.12 40.46 39.89 35.31 41.61
## [181] 35.43 38.85 43.02 41.23 39.41 43.23 39.85 38.41 32.85 47.93 43.49 35.65
## [193] 36.09 42.35 46.99 45.21 33.81 43.40 43.68 43.53 40.82 46.55 38.47 39.99
## [205] 32.76 47.63 46.77 32.27 33.80 47.88 42.53 47.12 41.82 48.00 45.13 47.02
## [217] 45.82 32.97 44.34 33.56 40.12 42.00 43.68 39.75 33.59 43.20 33.08 47.81
## [229] 33.08 33.35 39.85 39.08 45.93 43.53 47.20 37.29 32.10 40.46 37.90 45.80
## [241] 32.74 32.25 41.70 40.19 35.45 43.47 43.22 47.70 44.96 35.58 34.51 47.66
## [253] 46.93 41.57 47.64 47.58 45.81 34.12 40.86 44.77 40.66 44.04 35.09 42.89
## [265] 33.97 40.01 47.23 46.62 42.81 35.20 40.73 42.06 36.75 35.22 40.32 43.03
## [277] 33.41 43.85 44.99 46.76 41.74 40.16 35.86 47.92 40.33 34.35 47.68 42.73
## [289] 34.32 41.19 35.50 40.56 33.63 32.09 47.70 39.01 46.77 37.09 38.81 33.80
## [301] 32.67 36.65 38.58 40.99 45.33 37.77 41.03 40.05 37.00 44.27 45.69 33.77
## [313] 32.43 36.37 41.07 44.78 46.39 47.03 37.45 46.84 33.85 33.70 38.91 46.28
## [325] 32.06 33.93 40.26 47.30 39.69 34.81 38.29 45.67 40.58 36.05 44.69 37.80
## [337] 47.34 41.55 47.49 34.17 32.13 46.40 34.73 42.62 35.20 47.28 46.84 44.72
## [349] 43.43 44.91 39.85 34.03 37.90 42.04 38.52 43.58 38.52 32.38 33.01 44.45
## [361] 47.12 33.27 38.69 35.62 41.94
# 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 (kilogramos/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 (kg/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_kg,    # Vector con el total mensual de residuos
  start = c(2025, 1),                  # Año 2025, mes 1 (enero)
  frequency = 12                       # 12 observaciones por año (mensual)
)

# Ver la serie mensual en consola
residuos_mensual_ts
##          Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep
## 2025 1237.72 1127.75 1175.92 1191.03 1249.22 1236.07 1275.57 1244.15 1250.08
##          Oct     Nov     Dec
## 2025 1227.71 1198.65 1252.22
# 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 (kg/mes)"   # Eje Y
)


Serie de tiempo de residuos diarios (grafico base): 
La serie de tiempo muestra la evolucion diaria de los residuos a lo largo del año, revelando una alta variabilidad de corto plazo pero sin tendencias extremas. Este comportamiento es tipico de procesos agroindustriales y demuestra que los residuos de cacao pueden considerarse una fuente constante para valorización energética si se implementan sistemas de almacenamiento intermedio.

Serie de tiempo de residuos diarios (2025): 
Este grafico refuerza el analisis temporal anual, mostrando que, aunque existen picos diarios, la generacion de residuos se mantiene dentro de un rango relativamente acotado. Esto es fundamental para la valorizacion energetica, ya que permite prever una produccion energetica estable y facilita la integracion de los residuos en sistemas térmicos o eléctricos.

Residuos diarios y promedio móvil de 7 dias: 
El uso del promedio movil suaviza la variabilidad diaria y permite identificar el comportamiento real del sistema productivo. Esta tendencia suavizada es especialmente útil para la planificación energetica, ya que refleja mejor la disponibilidad efectiva de residuos para procesos como secado, generación eléctrica o producción de biogás en EcoKakao S.A.

Serie de tiempo mensual de residuos (2025): 
La agregación mensual evidencia variaciones estacionales en la generacion de residuos, posiblemente asociadas a ciclos agricolas del cacao. Esta información es clave para la valorizacion, ya que permite identificar meses de mayor disponibilidad de biomasa, facilitando estrategias de almacenamiento, co-procesamiento o ajustes operativos en sistemas energéticos.

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_kg = sum(residuos_totales_kg),   # 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_kg = 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_kg, 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 (kg/día)",
    color = "Mes"
  ) +
  theme_minimal()


Patron diario por mes:  
Este gráfico muestra el comportamiento diario de los residuos en cada mes del año, permitiendo identificar patrones recurrentes y diferencias mensuales. La ausencia de cambios abruptos refuerza la viabilidad de un sistema de valorización energetica continuo, ya que la biomasa residual presenta consistencia temporal suficiente para sostener procesos industriales.

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_kg)) +
  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 (kg/dia)"
  ) +
  theme_minimal()


Distribucion de residuos por día del mes:  
Los diagramas de caja por día del mes evidencian que no existen dias especificos con generacion anómala extrema de residuos. Esto indica que la producción residual no depende significativamente del calendario mensual, lo cual es positivo para la valorización, ya que reduce riesgos operativos y mejora la confiabilidad del suministro de biomasa.

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_kg = sum(residuos_totales_kg, 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_kg)) +
  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()


Calendar heatmap de residuos diarios:  
El mapa de calor permite identificar patrones semanales y estacionales de generacion de residuos. Se observa una distribucion relativamente homogenea a lo largo del año, con ligeras variaciones por dia de la semana. Esta visualización confirma que los residuos de cacao de EcoKakao S.A. tienen alto potencial para valorización energetica sostenida y planificada.

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_kg)) +
  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 (kg/día)"
  ) +
  theme_minimal()


Residuos por dia de la semana:  
Este grafico muestra la distribucion de residuos generados segun el dia de la semana. Se observa una produccion relativamente constante entre lunes y viernes, mientras que fines de semana presentan ligeras variaciones. Esto indica que la disponibilidad de residuos de cacao es estable, favoreciendo la planificacion continua de procesos de valorizacion energetica y reduciendo riesgos por desabastecimiento.

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_kg)) +
  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 (kg/día)"
  ) +
  theme_minimal()


Residuos por mes:
El grafico evidencia la variabilidad mensual en la generacion de residuos de cacao. Se identifican meses con mayor produccion, asociados posiblemente a ciclos de cosecha y procesamiento. Esta informacion es clave para ajustar la capacidad de sistemas de valorizacion, permitiendo maximizar el aprovechamiento energetico en meses de mayor disponibilidad de biomasa.
# 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
##       1222.1742
## s.e.    11.4235
## 
## sigma^2 = 1708:  log likelihood = -61.16
## AIC=126.33   AICc=127.66   BIC=127.3
## 
## Training set error measures:
##                         ME     RMSE      MAE        MPE     MAPE MASE      ACF1
## Training set -2.273737e-13 39.57182 32.55778 -0.1086218 2.705326  NaN 0.3043862
# 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       1222.174 1169.206 1275.143 1141.166 1303.182
## Feb 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Mar 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Apr 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## May 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Jun 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Jul 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Aug 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Sep 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Oct 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Nov 2026       1222.174 1169.206 1275.143 1141.166 1303.182
## Dec 2026       1222.174 1169.206 1275.143 1141.166 1303.182
# 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 (kg/mes)"   # Etiqueta eje Y
)


Pronostico mensual de residuos para 2026:   
El pronostico muestra una tendencia estable de generacion de residuos para el ano 2026, con rangos de incertidumbre controlados. Esto brinda confianza para inversiones en tecnologias de valorizacion energetica, ya que se espera una oferta constante de residuos que garantice la viabilidad tecnica y economica del sistema proyectado.
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_kg,   # 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)


Decomposition of additive time series:   
La descomposicion de la serie temporal permite separar el comportamiento observado en componentes de tendencia, estacionalidad y ruido. Se evidencia una estacionalidad regular y una tendencia estable, lo cual confirma que los residuos de cacao pueden ser considerados un recurso energetico predecible y adecuado para procesos de valorizacion sostenida.

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 <- 12.90                      # Supuesto: 12.90 MJ por kg de residuo

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

# Definir el consumo promedio mensual de una vivienda en kWh/mes
consumo_mensual_kWh_planta <- 3333    # Dato dado: 3333 kWh por mes por planta

# Aproximar el consumo diario de una planta (suponiendo 30 días/mes)
consumo_diario_kWh_planta <- consumo_mensual_kWh_planta / 30   # kWh/día por planta

# Calcular el consumo anual de una planta (12 meses)
consumo_anual_kWh_planta <- consumo_mensual_kWh_planta * 12    # kWh/año por planta
# Ordenar la base por fecha y calcular energía diaria y plantas 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_kg * 1000,      # Convertir kilogramos/día a t/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
    plantas_equivalentes_dia =                      # Número de plantas que se podrían abastecer ese día =
      energia_electrica_kWh / consumo_diario_kWh_planta # kWh disponibles / kWh por planta 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_kg
##   <dttm>              <chr>      <chr>      <chr>               <dbl>
## 1 2025-01-01 00:00:00 Wednesday  VERDADERO  Feriado              38.6
## 2 2025-01-02 00:00:00 Thursday   FALSO      Normal               39  
## 3 2025-01-03 00:00:00 Friday     FALSO      Normal               40.6
## 4 2025-01-04 00:00:00 Saturday   FALSO      Normal               40.6
## 5 2025-01-05 00:00:00 Sunday     FALSO      Normal               40.0
## 6 2025-01-06 00:00:00 Monday     FALSO      Normal               44.7
## # ℹ 6 more variables: factor_incremento <dbl>, residuos_totales_kg <dbl>,
## #   masa_residuos_kg <dbl>, energia_bruta_MJ <dbl>,
## #   energia_electrica_kWh <dbl>, plantas_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 plantas puedo abastecer en promedio en el año
planta_equivalentes_anual <-                        # Número de planta equivalentes en el año
  energia_total_anual_kWh / consumo_anual_kWh_planta    # kWh anuales disponibles / kWh por planta por año

# Ver resultados anuales en consola
energia_total_anual_kWh                                # Energía total anual en kWh
## [1] 15766047
planta_equivalentes_anual                           # Planta equivalentes abastecidas en el año
## [1] 394.1906
# 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_kg = sum(residuos_totales_kg),            # Suma semanal de residuos (kilogramos)
    total_energia_kWh = sum(energia_electrica_kWh),        # Suma semanal de energía (kWh)
    promedio_diario_residuos_kg = mean(residuos_totales_kg), # 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_planta =                            # Consumo semanal por planta
      consumo_diario_kWh_planta * 7,                        # kWh/día * 7 días
    planta_equivalentes_semana =                        # Planta equivalentes por semana
      total_energia_kWh / consumo_semanal_kWh_planta        # kWh semanales disponibles / kWh semanales por planta
  )

# Ver las primeras filas del resumen semanal
head(resumen_semanal_energia)                              # Muestra tabla semanal con energía y planta
## # A tibble: 6 × 8
##   semana              total_residuos_kg total_energia_kWh promedio_diario_resi…¹
##   <dttm>                          <dbl>             <dbl>                  <dbl>
## 1 2024-12-30 00:00:00              208.           224127.                   41.7
## 2 2025-01-06 00:00:00              286.           307042.                   40.8
## 3 2025-01-13 00:00:00              267.           286788.                   38.1
## 4 2025-01-20 00:00:00              289.           310847                    41.3
## 5 2025-01-27 00:00:00              273.           293894.                   39.1
## 6 2025-02-03 00:00:00              290.           312105.                   41.5
## # ℹ abbreviated name: ¹​promedio_diario_residuos_kg
## # ℹ 4 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   consumo_semanal_kWh_planta <dbl>, planta_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_kg = sum(residuos_totales_kg),            # Suma mensual de residuos (kilogramos)
    total_energia_kWh = sum(energia_electrica_kWh),        # Suma mensual de energía (kWh)
    promedio_diario_residuos_kg = mean(residuos_totales_kg), # 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(
    planta_equivalentes_mes =                           # Planta equivalentes por mes
      total_energia_kWh / consumo_mensual_kWh_planta        # kWh mensuales disponibles / 170 kWh/mes por planta
  )

# Ver las primeras filas del resumen mensual
head(resumen_mensual_energia)                              # Muestra la tabla mensual con energía y planta
## # A tibble: 6 × 7
##   mes                 total_residuos_kg total_energia_kWh promedio_diario_resi…¹
##   <dttm>                          <dbl>             <dbl>                  <dbl>
## 1 2025-01-01 00:00:00             1238.          1330549                    39.9
## 2 2025-02-01 00:00:00             1128.          1212331.                   40.3
## 3 2025-03-01 00:00:00             1176.          1264114                    37.9
## 4 2025-04-01 00:00:00             1191.          1280357.                   39.7
## 5 2025-05-01 00:00:00             1249.          1342912.                   40.3
## 6 2025-06-01 00:00:00             1236.          1328775.                   41.2
## # ℹ abbreviated name: ¹​promedio_diario_residuos_kg
## # ℹ 3 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   planta_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, planta_equivalentes_mes
## # A tibble: 6 × 7
##   mes                 total_residuos_kg total_energia_kWh promedio_diario_resi…¹
##   <dttm>                          <dbl>             <dbl>                  <dbl>
## 1 2025-01-01 00:00:00             1238.          1330549                    39.9
## 2 2025-02-01 00:00:00             1128.          1212331.                   40.3
## 3 2025-03-01 00:00:00             1176.          1264114                    37.9
## 4 2025-04-01 00:00:00             1191.          1280357.                   39.7
## 5 2025-05-01 00:00:00             1249.          1342912.                   40.3
## 6 2025-06-01 00:00:00             1236.          1328775.                   41.2
## # ℹ abbreviated name: ¹​promedio_diario_residuos_kg
## # ℹ 3 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   planta_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 planta_equivalentes_mes existe
head(resumen_mensual_energia$planta_equivalentes_mes)  # Muestra algunos valores de planta por mes
## [1] 399.2046 363.7357 379.2721 384.1456 402.9137 398.6724
# Crear un gráfico de barras con planta equivalentes por mes
barplot(
  height = resumen_mensual_energia$planta_equivalentes_mes,   # Altura = número de planta equivalentes por mes
  names.arg = format(resumen_mensual_energia$mes, "%b"),         # Etiquetas de los meses en el eje X
  main = "Planta equivalentes abastecidas por mes",           # Título del gráfico
  xlab = "Mes",                                                  # Etiqueta del eje X
  ylab = "Planta equivalentes (unidad)"                       # Etiqueta del eje Y
)


Plantas equivalentes abastecidas por mes:   
Este grafico traduce la valorizacion energetica de los residuos en unidades funcionales comprensibles, como plantas equivalentes abastecidas. Se observa una capacidad relativamente constante durante el ano, lo que demuestra el impacto positivo del aprovechamiento de residuos de cacao en la generacion energetica y en la reduccion de dependencia de fuentes convencionales.

Energia mensual generada a partir de residuos (kWh):   
El grafico muestra la energia mensual obtenida a partir de la valorizacion de residuos de cacao. Las variaciones siguen el patron de disponibilidad de biomasa, evidenciando una conversion eficiente. Este resultado respalda la factibilidad tecnica de transformar residuos agroindustriales en energia util para autoconsumo o inyeccion a sistemas internos.
# Cargar dplyr por si no está cargado
library(dplyr)

# Definir el consumo mensual promedio por planta en kWh/mes
consumo_mensual_kWh_planta <- 3333      # Dato que tú diste: 3333 kWh por mes

# Calcular el consumo diario promedio por planta (aprox. 30 días/mes)
consumo_diario_kWh_planta <- consumo_mensual_kWh_planta / 30   # kWh por día por planta

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

# Ver las primeras filas para comprobar las nuevas columnas
head(resumen_mensual_energia)    # Debes ver 'promedio_diario_energia_kWh' y 'planta_promedio_diarias'
## # A tibble: 6 × 8
##   mes                 total_residuos_kg total_energia_kWh promedio_diario_resi…¹
##   <dttm>                          <dbl>             <dbl>                  <dbl>
## 1 2025-01-01 00:00:00             1238.          1330549                    39.9
## 2 2025-02-01 00:00:00             1128.          1212331.                   40.3
## 3 2025-03-01 00:00:00             1176.          1264114                    37.9
## 4 2025-04-01 00:00:00             1191.          1280357.                   39.7
## 5 2025-05-01 00:00:00             1249.          1342912.                   40.3
## 6 2025-06-01 00:00:00             1236.          1328775.                   41.2
## # ℹ abbreviated name: ¹​promedio_diario_residuos_kg
## # ℹ 4 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   planta_equivalentes_mes <dbl>, planta_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_kg = mean(residuos_totales_kg, na.rm = TRUE), .groups = "drop") %>%
  mutate(peso = media_kg / mean(media_kg, 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_kg = as.numeric(pronostico_2026$mean)   # <-- total kg/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_kg_dia = total_residuos_kg * peso_norm
  ) %>%
  ungroup()

# =========================
# 5) PASAR RESIDUOS 2026 -> ENERGÍA 2026 (kWh/día)
# =========================
energia_2026 <- residuos_2026_diario %>%
  mutate(
    masa_kg = residuos_kg_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()


Heatmap calendario de generacion de energia 2025 real vs 2026 proyectado:   
El mapa de calor permite comparar el comportamiento energetico diario entre el ano real y el proyectado. Se observa una distribucion homogena de generacion, con ligeras variaciones semanales. Esto confirma que la valorizacion de residuos de cacao puede mantenerse estable en el tiempo, facilitando la planificacion operativa y energetica anual.

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 planta (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_kg_dia,
                                   PCI_MJ_kg,
                                   eficiencia_electrica = 0.30,
                                   eficiencia_termica  = 0.00,
                                   disponibilidad       = 0.90) {
  # masa en kg/día
  masa_t_dia <- masa_kg_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_kg_dia            = masa_kg_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_kg_dia_base,
  PCI_MJ_kg,
  eficiencia_electrica = 0.30,
  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_kg_dia_mes     <- numeric(n_meses)
  masa_kg_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_kg_dia_mes[i] <- masa_kg_dia_base * multip_mes[i]
    
    # energía diaria para ese mes
    res_dia <- energia_residuo_diaria(
      masa_kg_dia         = masa_kg_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_kg_mes[i]         <- masa_kg_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_kg_dia        = masa_kg_dia_mes,
    masa_kg_mes        = masa_kg_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_kg_dia_base: promedio diario de residuos (kg/día)
# - PCI: buen poder calorífico (MJ/kg)

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

resultado_ano_base <- calcular_ano_mensual(
  masa_kg_dia_base      = masa_kg_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_kg_dia masa_kg_mes
## 1    1      Enero       31       1.00         100        3100
## 2    2    Febrero       28       1.10         110        3080
## 3    3      Marzo       31       1.05         105        3255
## 4    4      Abril       30       1.00         100        3000
## 5    5       Mayo       31       1.00         100        3100
## 6    6      Junio       30       1.00         100        3000
## 7    7      Julio       31       1.00         100        3100
## 8    8     Agosto       31       1.00         100        3100
## 9    9 Septiembre       30       1.00         100        3000
## 10  10    Octubre       31       1.00         100        3100
## 11  11  Noviembre       30       1.08         108        3240
## 12  12  Diciembre       31       1.20         120        3720
##    energia_el_kWh_dia energia_el_kWh_mes
## 1                90.0             2790.0
## 2                99.0             2772.0
## 3                94.5             2929.5
## 4                90.0             2700.0
## 5                90.0             2790.0
## 6                90.0             2700.0
## 7                90.0             2790.0
## 8                90.0             2790.0
## 9                90.0             2700.0
## 10               90.0             2790.0
## 11               97.2             2916.0
## 12              108.0             3348.0
resultado_ano_base$energia_el_GWh_anio  # energía anual en GWh (escenario base)
## [1] 0.0340155
########## 5. GRÁFICAS PARA EL AÑO BASE ##########

# 5.1. Masa de residuos por mes (kg/mes)
ggplot(tabla_mensual_base, aes(x = nombre_mes, y = masa_kg_mes)) +
  geom_col(fill = "darkgreen") +
  labs(
    title = "Masa de residuos tratada por mes",
    x = "Mes",
    y = "Masa de residuos (kg/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 (kg/mes) y energía (MWh/mes) normalizadas
tabla_mensual_base$masa_norm  <- tabla_mensual_base$masa_kg_mes / max(tabla_mensual_base$masa_kg_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 (kg/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 (kg/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_kg_dia_base,
  PCI_MJ_kg,
  eficiencia_electrica = 0.30,
  eficiencia_termica  = 0.00,
  disponibilidad      = 0.90,
  multip_mes          = rep(1, 12),
  tasa_crecimiento    = 0.02,    # 2 % anual
  n_anios             = 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_kg_dia  = numeric(n_total),
    masa_kg_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_kg_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_kg_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_kg_dia[idx]        <- tab_m$masa_kg_dia[m]
      df$masa_kg_mes[idx]        <- tab_m$masa_kg_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_kg_dia_base      = masa_kg_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_kg_dia masa_kg_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             2790.0             2.7900
## 2             2772.0             2.7720
## 3             2929.5             2.9295
## 4             2700.0             2.7000
## 5             2790.0             2.7900
## 6             2700.0             2.7000
########## 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_kg_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_kg_anio[i]         <- sum(sub_i$masa_kg_mes)
}

resumen_anual
##    anio energia_el_kWh_anio energia_el_GWh_anio masa_kg_anio
## 1  2025            34015.50          0.03401550     37795.00
## 2  2026            35035.96          0.03503596     38928.85
## 3  2027            36087.04          0.03608704     40096.72
## 4  2028            37169.66          0.03716966     41299.62
## 5  2029            38284.74          0.03828474     42538.61
## 6  2030            39433.29          0.03943329     43814.76
## 7  2031            40616.29          0.04061629     45129.21
## 8  2032            41834.77          0.04183477     46483.08
## 9  2033            43089.82          0.04308982     47877.58
## 10 2034            44382.51          0.04438251     49313.90
## 11 2035            45713.99          0.04571399     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_kg_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 (kg/anio)"
  ) +
  theme_minimal()


Masa de residuos tratada por mes: 
Este grafico refleja la cantidad mensual de residuos de cacao tratados. Se evidencia una gestion constante con picos en determinados meses. Esta informacion es fundamental para evaluar la eficiencia del sistema de tratamiento y para dimensionar adecuadamente equipos de valorizacion como calderas, digestores o sistemas de conversion energetica.

Energia electrica generada por mes: 
El grafico muestra la energia electrica mensual generada a partir de residuos, expresada en MWh. La estabilidad de los valores demuestra una relacion directa entre masa tratada y energia producida. Esto respalda el potencial de los residuos de cacao como fuente renovable para suplir demandas energeticas internas de EcoKakao S.A.

Comparacion relativa masa vs energia por mes: 
La comparacion normalizada entre masa de residuos y energia generada evidencia una correlacion directa entre ambas variables. Esto indica que el proceso de valorizacion mantiene una eficiencia consistente a lo largo del ano, reforzando la viabilidad tecnica del sistema y su alineacion con principios de economia circular y aprovechamiento sostenible.

Proyeccion de energia electrica anual: 
La grafica muestra una tendencia creciente en la generacion anual de energia electrica a partir de residuos de cacao entre los anos 2025 y 2035. Este comportamiento refleja una mejora progresiva en el aprovechamiento de la biomasa residual, asociada al incremento en la disponibilidad de residuos y a una gestion mas eficiente del proceso de valorizacion energetica, fortaleciendo la sostenibilidad del sistema productivo.

Masa total de residuos tratada por anio: 
La evolucion anual de la masa total de residuos tratados evidencia un crecimiento constante en la cantidad de biomasa procesada por EcoKakao S.A. Este aumento sugiere una mayor capacidad operativa y una gestion mas estructurada de los residuos de cacao, lo cual resulta fundamental para garantizar un suministro continuo de materia prima destinada a procesos de valorizacion energetica a largo plazo.