options(repos = c(CRAN = "https://cloud.r-project.org"))
#install.packages("readxl") Instalar solo una vez
library(readxl)
datos_residuos <- read_excel("Generación_residuos_2024.xlsx")
datos_residuos
## # A tibble: 366 × 7
##    fecha               dia_semana es_feriado tipo_dia residuo_base_t
##    <dttm>              <chr>      <chr>      <chr>             <dbl>
##  1 2024-01-01 00:00:00 Monday     TRUE       Feriado            550.
##  2 2024-01-02 00:00:00 Tuesday    FALSE      Normal             680 
##  3 2024-01-03 00:00:00 Wednesday  FALSE      Normal             680 
##  4 2024-01-04 00:00:00 Thursday   FALSE      Normal             680 
##  5 2024-01-05 00:00:00 Friday     FALSE      Normal             680 
##  6 2024-01-06 00:00:00 Saturday   FALSE      Normal             540.
##  7 2024-01-07 00:00:00 Sunday     FALSE      Normal             540.
##  8 2024-01-08 00:00:00 Monday     FALSE      Normal             680 
##  9 2024-01-09 00:00:00 Tuesday    FALSE      Normal             680 
## 10 2024-01-10 00:00:00 Wednesday  FALSE      Normal             680 
## # ℹ 356 more rows
## # ℹ 2 more variables: factor_incremento <dbl>, residuos_totales_t <dbl>
View(datos_residuos)
head(datos_residuos)
## # A tibble: 6 × 7
##   fecha               dia_semana es_feriado tipo_dia residuo_base_t
##   <dttm>              <chr>      <chr>      <chr>             <dbl>
## 1 2024-01-01 00:00:00 Monday     TRUE       Feriado            550.
## 2 2024-01-02 00:00:00 Tuesday    FALSE      Normal             680 
## 3 2024-01-03 00:00:00 Wednesday  FALSE      Normal             680 
## 4 2024-01-04 00:00:00 Thursday   FALSE      Normal             680 
## 5 2024-01-05 00:00:00 Friday     FALSE      Normal             680 
## 6 2024-01-06 00:00:00 Saturday   FALSE      Normal             540.
## # ℹ 2 more variables: factor_incremento <dbl>, residuos_totales_t <dbl>
str(datos_residuos)
## tibble [366 × 7] (S3: tbl_df/tbl/data.frame)
##  $ fecha             : POSIXct[1:366], format: "2024-01-01" "2024-01-02" ...
##  $ dia_semana        : chr [1:366] "Monday" "Tuesday" "Wednesday" "Thursday" ...
##  $ es_feriado        : chr [1:366] "TRUE" "FALSE" "FALSE" "FALSE" ...
##  $ tipo_dia          : chr [1:366] "Feriado" "Normal" "Normal" "Normal" ...
##  $ residuo_base_t    : num [1:366] 550 680 680 680 680 ...
##  $ factor_incremento : num [1:366] 1.12 1 1 1 1 ...
##  $ residuos_totales_t: num [1:366] 618 680 680 680 680 ...
#install.packages("dplyr")# Instalar solo una vez 
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lubridate)
## 
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(magrittr)

Resumenes semanales y mensuales

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

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

# Ver las primeras filas del resumen semanal
head(resumen_semanal)
## # A tibble: 6 × 4
##   semana              total_residuos_t promedio_diario_t n_dias
##   <dttm>                         <dbl>             <dbl>  <int>
## 1 2024-01-01 00:00:00            4551.              650.      7
## 2 2024-01-08 00:00:00            4613.              659.      7
## 3 2024-01-15 00:00:00            4613.              659.      7
## 4 2024-01-22 00:00:00            4001.              572.      7
## 5 2024-01-29 00:00:00            4613.              659.      7
## 6 2024-02-05 00:00:00            4613.              659.      7
View(resumen_semanal)
# Ver un resumen estadístico del total semanal de residuos
summary(resumen_semanal$total_residuos_t)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1360    4613    4613    4534    4613    4676

RESUMEN MENSUAL

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

# Ver las primeras filas del resumen mensual
head(resumen_mensual)
## # A tibble: 6 × 4
##   mes                 total_residuos_t promedio_diario_t n_dias
##   <dttm>                         <dbl>             <dbl>  <int>
## 1 2024-01-01 00:00:00           19819.              639.     31
## 2 2024-02-01 00:00:00           19008.              655.     29
## 3 2024-03-01 00:00:00           20282.              654.     31
## 4 2024-04-01 00:00:00           19688.              656.     30
## 5 2024-05-01 00:00:00           20430.              659.     31
## 6 2024-06-01 00:00:00           19666.              656.     30
# Ver un resumen estadístico del total mensual de residuos
summary(resumen_mensual$total_residuos_t)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   19008   19727   20050   20027   20443   20555

compara día feriado vs día normal

# Comparar la generación de residuos entre días normales y feriados
comparacion_feriados <- datos_residuos %>%                # Toma la base de datos original
  group_by(tipo_dia) %>%                                  # Agrupa por tipo de día: "Normal" o "Feriado"
  summarise(                                              # Calcula estadísticas por cada tipo de día
    promedio_residuos_t = mean(residuos_totales_t),       # Promedio de residuos por día (toneladas)
    sd_residuos_t = sd(residuos_totales_t),               # Desviación estándar de residuos
    minimo_residuos_t = min(residuos_totales_t),          # Valor mínimo de residuos
    maximo_residuos_t = max(residuos_totales_t),          # Valor máximo de residuos
    n_dias = n()                                          # Número de días en cada categoría
  ) %>%                                                   # Fin del resumen
  ungroup()                                               # Quita la agrupación

# Ver la tabla de comparación entre días normales y feriados
comparacion_feriados
## # A tibble: 2 × 6
##   tipo_dia promedio_residuos_t sd_residuos_t minimo_residuos_t maximo_residuos_t
##   <chr>                  <dbl>         <dbl>             <dbl>             <dbl>
## 1 Feriado                 642.          50.8              607.              743.
## 2 Normal                  657.          36.1              512.              680 
## # ℹ 1 more variable: n_dias <int>

Gráficos inciales

# Histograma de residuos totales diarios
hist(
  datos_residuos$residuos_totales_t,   # Vector numérico con residuos diarios
  main = "Histograma de residuos diarios (t/día)",  # Título del gráfico
  xlab = "Residuos totales (toneladas/día)",        # Etiqueta del eje X
  ylab = "Frecuencia"                               # Etiqueta del eje Y
)

#El histograma de residuos diarios de gabazo de palma evidencia que la mayor frecuencia de generación se concentra entre 650 y 680 toneladas/día en Queve Palma, lo que indica un nivel de producción relativamente estable de este residuo. Los valores menores y mayores presentan baja frecuencia, sugiriendo la presencia de pocos eventos atípicos en la generación diaria del gabazo.
# 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
)

#El diagrama de cajas de residuos diarios de gabazo de palma, muestra diferencias entre días normales y feriados en Queve Palma. En los días normales se observa mayor variabilidad y valores máximos más altos, mientras que en los feriados la generación es más estable y concentrada, indicando una producción más uniforme del residuo.

seperar feriados normales

# Filtrar el promedio de residuos en días normales
promedio_normal <- comparacion_feriados %>%        # Toma la tabla de comparación
  filter(tipo_dia == "Normal") %>%                 # Se queda solo con filas de tipo "Normal"
  pull(promedio_residuos_t)                        # Extrae el valor de la columna promedio_residuos_t

# Filtrar el promedio de residuos en feriados
promedio_feriado <- comparacion_feriados %>%       # Toma la misma tabla
  filter(tipo_dia == "Feriado") %>%                # Se queda solo con filas de tipo "Feriado"
  pull(promedio_residuos_t)                        # Extrae el promedio de residuos en feriados

# Calcular el incremento absoluto (en toneladas)
incremento_absoluto <- promedio_feriado - promedio_normal   # Diferencia entre promedios

incremento_absoluto
## [1] -15.34062
# Calcular el incremento relativo (en porcentaje)
incremento_relativo <- (incremento_absoluto / promedio_normal) * 100   # Diferencia / normal * 100

# Mostrar los resultados en consola
promedio_normal           # Promedio t/día en día normal
## [1] 657.1193
promedio_feriado          # Promedio t/día en feriado
## [1] 641.7787
incremento_absoluto       # Cuántas toneladas más en feriado
## [1] -15.34062
incremento_relativo       # % más de residuos en feriado
## [1] -2.334525
# Crear un vector con los dos promedios
valores_promedio <- c(promedio_normal, promedio_feriado)   # Vector con ambos promedios

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

# Hacer un gráfico de barras para comparar los promedios
barplot(
  valores_promedio,                # Altura de las barras (los promedios)
  names.arg = nombres_tipos,       # Nombres debajo de cada barra
  main = "Promedio de residuos diarios: día normal vs feriado",  # Título del gráfico
  xlab = "Tipo de dia",            # Etiqueta eje X
  ylab = "Residuos totales (t/dia)"# Etiqueta eje Y
)

#Muestra que el promedio diario de generación de gabazo de palma en Queve Palma es similar entre días normales y feriados, lo que indica que el tipo de día no influye de manera significativa en el volumen promedio de residuos generados.

Analizar series de tiempo

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

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

# Ver un resumen de la serie de tiempo
residuos_ts                                      # Muestra parte de la serie en consola
## Time Series:
## Start = c(2024, 1) 
## End = c(2025, 1) 
## Frequency = 365 
##   [1] 617.7848 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
##   [9] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
##  [17] 680.0000 680.0000 680.0000 606.5884 606.5884 530.1200 514.4000 512.4500
##  [25] 551.2300 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
##  [33] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
##  [41] 606.5884 606.5884 617.7848 617.7848 680.0000 680.0000 680.0000 606.5884
##  [49] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
##  [57] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
##  [65] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
##  [73] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
##  [81] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
##  [89] 616.1344 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
##  [97] 606.5884 606.5884 680.0000 680.0000 617.7848 680.0000 680.0000 606.5884
## [105] 606.5884 680.0000 680.0000 680.0000 617.7848 680.0000 606.5884 606.5884
## [113] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
## [121] 680.0000 617.7848 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [129] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
## [137] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
## [145] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
## [153] 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884
## [161] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
## [169] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
## [177] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [185] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
## [193] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
## [201] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
## [209] 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884
## [217] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
## [225] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
## [233] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [241] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
## [249] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
## [257] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
## [265] 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884
## [273] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
## [281] 680.0000 680.0000 680.0000 742.6620 680.0000 606.5884 606.5884 680.0000
## [289] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [297] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000
## [305] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000
## [313] 680.0000 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000
## [321] 606.5884 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884
## [329] 606.5884 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884
## [337] 680.0000 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000
## [345] 680.0000 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
## [353] 680.0000 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000 742.6620
## [361] 680.0000 680.0000 606.5884 606.5884 680.0000 680.0000
# Ver clase del objeto (debe decir "ts")
class(residuos_ts)
## [1] "ts"

graficas de series de tiempo

# Graficar la serie de tiempo diaria
plot(residuos_ts)

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

#La serie de tiempo de residuos diarios de gabazo de palma, elaborada muestra una tendencia estable a lo largo del período 2024–2025, con fluctuaciones periódicas propias de la operación diaria. Se identifican picos y caídas puntuales, sin cambios estructurales significativos en la generación del residuo.

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

#El gráfico de residuos diarios y promedio móvil de 7 días, muestra que el promedio móvil suaviza las variaciones diarias y confirma una tendencia estable en la generación de gabazo de palma. Los picos y caídas puntuales no alteran el comportamiento general del residuo en Queve Palma.

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

# Ver la serie mensual en consola
residuos_mensual_ts
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2024 19818.69 19008.28 20282.02 19688.28 20430.49 19665.88 20492.71 20419.30
##           Sep      Oct      Nov      Dec
## 2024 19739.30 20555.37 19739.30 20481.96
# Graficar la serie mensual
plot(
  residuos_mensual_ts,                # Serie mensual
  main = "Serie de tiempo mensual de residuos (2024)",  # Título
  xlab = "Tiempo (meses)",            # Eje X
  ylab = "Residuos totales (t/mes)"   # Eje Y
)

#La serie de tiempo mensual de residuos de gabazo de palma en 2024 muestra variaciones entre meses, con valores que oscilan alrededor de un nivel promedio similar. No se identifica una tendencia clara creciente o decreciente, lo que sugiere estabilidad anual en la generación del residuo.

Graficos de de los 12 meses por días

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

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

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

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

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

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

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

#   El gráfico de patrón diario por mes, muestra que la generación diaria de gabazo de palma en Queve Palma mantiene un comportamiento similar entre los 12 meses, con valores concentrados alrededor de un mismo rango. Las variaciones puntuales corresponden a días específicos, sin evidenciar diferencias marcadas entre meses.

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 distribución de residuos por día del mes indica que la generación diaria de gabazo de palma en Queve Palma es homogénea a lo largo del mes, con medianas similares entre días. Se observan valores atípicos aislados, asociados a jornadas específicas, sin un patrón sistemático.

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

#EEl calendar heatmap muestra que la generación diaria de gabazo de palma en Queve Palma durante 2024 se mantiene mayormente estable, con valores concentrados entre 650 y 680 t/día a lo largo de las semanas y días de la semana. Predominan tonos claros que indican valores cercanos a 670–680 t/día, mientras que los descensos puntuales alcanzan aproximadamente 620–640 t/día, sin un patrón repetitivo.
#Para 2025, los pocos datos disponibles se sitúan alrededor de 670–680 t/día, coherentes con el comportamiento observado en 2024.

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

#Este gráfico muestra que la generación diaria de gabazo de palma varía según el día de la semana. De lunes a miércoles, los valores se concentran principalmente entre 660 y 680 t/día, con medianas cercanas a 675 t/día, lo que refleja una operación estable. El jueves presenta una ligera disminución, con valores promedio alrededor de 645–650 t/día. El viernes registra los valores más bajos, con medianas cercanas a 610–615 t/día, indicando una reducción puntual en la generación. Durante sábados y domingos, la producción se recupera, alcanzando nuevamente valores entre 670 y 680 t/día, similares a los días laborables.

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

#El diagrama de cajas por mes evidencia que la generación de gabazo de palma se mantiene relativamente constante durante todo el año. Las medianas mensuales se sitúan mayoritariamente entre 670 y 680 t/día, mientras que los valores mínimos alcanzan aproximadamente 600 t/día y los máximos superan ligeramente los 680 t/día. La dispersión es similar entre meses, y no se observa una estacionalidad marcada, lo que indica estabilidad anual en la producción del residuo.
# Instalar el paquete 'forecast' (solo la primera vez)
#install.packages("forecast")

# Cargar el paquete 'forecast'
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
# Ajustar un modelo ARIMA automáticamente a la serie mensual
modelo_arima <- auto.arima(
  residuos_mensual_ts                 # Serie mensual de entrada para el modelo
)

# Ver el resumen del modelo ARIMA ajustado
summary(
  modelo_arima                        # Muestra coeficientes, AIC, etc.
)
## Series: residuos_mensual_ts 
## ARIMA(0,0,0) with non-zero mean 
## 
## Coefficients:
##             mean
##       20026.7971
## s.e.    133.7669
## 
## sigma^2 = 234241:  log likelihood = -90.69
## AIC=185.38   AICc=186.71   BIC=186.35
## 
## Training set error measures:
##                         ME     RMSE      MAE         MPE     MAPE MASE
## Training set -8.185452e-12 463.3802 416.8433 -0.05434883 2.091642  NaN
##                   ACF1
## Training set -0.368564
# Hacer un pronóstico de 12 meses (todo el año 2025)
pronostico_2025 <- forecast(
  modelo_arima,                       # Modelo previamente ajustado
  h = 12                              # Horizonte de pronóstico: 12 meses hacia adelante
)

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

#El gráfico de pronóstico muestra que la generación total mensual de residuos para 2025 se mantendría estable, con valores promedio cercanos a 20 000–20 500 toneladas por mes. La línea central del pronóstico presenta pequeñas oscilaciones al inicio del año y luego se estabiliza, mientras que la banda de confianza indica una variabilidad moderada. No se identifica una tendencia creciente o decreciente significativa, lo que sugiere que el comportamiento observado en 2024 continuaría en 2025.
library(dplyr)

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

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

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

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

#La descomposición de la serie temporal aditiva muestra que la serie observada oscila alrededor de valores cercanos a 650–670 unidades, con fluctuaciones periódicas marcadas. La tendencia se mantiene prácticamente constante en un rango aproximado de 655 a 665 unidades, aunque se identifican descensos puntuales que alcanzan valores cercanos a 640 unidades, lo que podría asociarse a eventos operativos excepcionales. El componente estacional presenta variaciones regulares con amplitudes aproximadas de ±25 a ±30 unidades, confirmando una estacionalidad fuerte y persistente. Finalmente, el componente aleatorio muestra fluctuaciones reducidas, generalmente dentro del rango de –50 a +50 unidades, indicando que el ruido no domina el comportamiento de la serie.

Inciar calculo de genración electrica

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

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

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

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

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

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

View(datos_residuos_energia)
# Ver algunas filas para comprobar los cálculos
head(datos_residuos_energia)                           # Muestra las primeras filas de la tabla con energía
## # A tibble: 6 × 11
##   fecha               dia_semana es_feriado tipo_dia residuo_base_t
##   <dttm>              <chr>      <chr>      <chr>             <dbl>
## 1 2024-01-01 00:00:00 Monday     TRUE       Feriado            550.
## 2 2024-01-02 00:00:00 Tuesday    FALSE      Normal             680 
## 3 2024-01-03 00:00:00 Wednesday  FALSE      Normal             680 
## 4 2024-01-04 00:00:00 Thursday   FALSE      Normal             680 
## 5 2024-01-05 00:00:00 Friday     FALSE      Normal             680 
## 6 2024-01-06 00:00:00 Saturday   FALSE      Normal             540.
## # ℹ 6 more variables: factor_incremento <dbl>, residuos_totales_t <dbl>,
## #   masa_residuos_kg <dbl>, energia_bruta_MJ <dbl>,
## #   energia_electrica_kWh <dbl>, viviendas_equivalentes_dia <dbl>
# Calcular la energía total anual producida
energia_total_anual_kWh <- sum(                        # Sumar toda la energía del año
  datos_residuos_energia$energia_electrica_kWh         # Vector de energía diaria en kWh
)

View(energia_total_anual_kWh)
# Calcular cuántas viviendas puedo abastecer en promedio en el año
viviendas_equivalentes_anual <-                        # Número de viviendas equivalentes en el año
  energia_total_anual_kWh / consumo_anual_kWh_hogar    # kWh anuales disponibles / kWh por vivienda por año

# Ver resultados anuales en consola
energia_total_anual_kWh                                # Energía total anual en kWh
## [1] 180241174
viviendas_equivalentes_anual                           # Viviendas equivalentes abastecidas en el año
## [1] 60080.39
# Crear un resumen semanal con residuos, energía y viviendas equivalentes
resumen_semanal_energia <- datos_residuos_energia %>%      # Tomar la tabla con energía diaria
  mutate(
    semana = lubridate::floor_date(                        # Crear una columna de semana
      fecha, "week", week_start = 1                        # La semana empieza el lunes (1 = lunes)
    )
  ) %>%
  group_by(semana) %>%                                     # Agrupar por semana
  summarise(
    total_residuos_t = sum(residuos_totales_t),            # Suma semanal de residuos (toneladas)
    total_energia_kWh = sum(energia_electrica_kWh),        # Suma semanal de energía (kWh)
    promedio_diario_residuos_t = mean(residuos_totales_t), # Promedio diario de residuos en esa semana
    promedio_diario_energia_kWh = mean(energia_electrica_kWh), # Promedio diario de energía en esa semana
    n_dias = n()                                           # Número de días en esa semana (normalmente 7)
  ) %>%
  ungroup() %>%                                            # Quitar la agrupación
  mutate(
    consumo_semanal_kWh_hogar =                            # Consumo semanal por vivienda
      consumo_diario_kWh_hogar * 7,                        # kWh/día * 7 días
    viviendas_equivalentes_semana =                        # Viviendas equivalentes por semana
      total_energia_kWh / consumo_semanal_kWh_hogar        # kWh semanales disponibles / kWh semanales por vivienda
  )

# Ver las primeras filas del resumen semanal
head(resumen_semanal_energia)                              # Muestra tabla semanal con energía y viviendas
## # A tibble: 6 × 8
##   semana              total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2024-01-01 00:00:00            4551.          3413221.                    650.
## 2 2024-01-08 00:00:00            4613.          3459883.                    659.
## 3 2024-01-15 00:00:00            4613.          3459883.                    659.
## 4 2024-01-22 00:00:00            4001.          3001033.                    572.
## 5 2024-01-29 00:00:00            4613.          3459883.                    659.
## 6 2024-02-05 00:00:00            4613.          3459883.                    659.
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 4 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   consumo_semanal_kWh_hogar <dbl>, viviendas_equivalentes_semana <dbl>
# Crear un resumen mensual con residuos, energía y viviendas equivalentes
resumen_mensual_energia <- datos_residuos_energia %>%      # Tomar la tabla diaria con energía
  mutate(
    mes = lubridate::floor_date(fecha, "month")            # Crear columna con el primer día del mes
  ) %>%
  group_by(mes) %>%                                        # Agrupar por mes
  summarise(
    total_residuos_t = sum(residuos_totales_t),            # Suma mensual de residuos (toneladas)
    total_energia_kWh = sum(energia_electrica_kWh),        # Suma mensual de energía (kWh)
    promedio_diario_residuos_t = mean(residuos_totales_t), # Promedio diario de residuos en el mes
    promedio_diario_energia_kWh = mean(energia_electrica_kWh), # Promedio diario de energía en el mes
    n_dias = n()                                           # Número de días en ese mes (28–31)
  ) %>%
  ungroup() %>%                                            # Quitar agrupación
  mutate(
    viviendas_equivalentes_mes =                           # Viviendas equivalentes por mes
      total_energia_kWh / consumo_mensual_kWh_hogar        # kWh mensuales disponibles / 170 kWh/mes por vivienda
  )

# Ver las primeras filas del resumen mensual
head(resumen_mensual_energia)                              # Muestra la tabla mensual con energía y viviendas
## # A tibble: 6 × 7
##   mes                 total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2024-01-01 00:00:00           19819.         14864019.                    639.
## 2 2024-02-01 00:00:00           19008.         14256208.                    655.
## 3 2024-03-01 00:00:00           20282.         15211514.                    654.
## 4 2024-04-01 00:00:00           19688.         14766208.                    656.
## 5 2024-05-01 00:00:00           20430.         15322869.                    659.
## 6 2024-06-01 00:00:00           19666.         14749413.                    656.
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 3 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   viviendas_equivalentes_mes <dbl>

graficos de nergia

# Ver las primeras filas del resumen mensual para comprobar su contenido
head(resumen_mensual_energia)   # Debe tener columnas como mes, total_energia_kWh, viviendas_equivalentes_mes
## # A tibble: 6 × 7
##   mes                 total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2024-01-01 00:00:00           19819.         14864019.                    639.
## 2 2024-02-01 00:00:00           19008.         14256208.                    655.
## 3 2024-03-01 00:00:00           20282.         15211514.                    654.
## 4 2024-04-01 00:00:00           19688.         14766208.                    656.
## 5 2024-05-01 00:00:00           20430.         15322869.                    659.
## 6 2024-06-01 00:00:00           19666.         14749413.                    656.
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 3 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   viviendas_equivalentes_mes <dbl>
# Crear un gráfico de barras con la energía total mensual (kWh)
barplot(
  height = resumen_mensual_energia$total_energia_kWh,     # Altura de cada barra = energía total del mes en kWh
  names.arg = format(resumen_mensual_energia$mes, "%b"),  # Etiquetas del eje X = abreviatura del mes (Ene, Feb, etc.)
  main = "Energia mensual generada a partir de residuos (kWh)",  # Título del gráfico
  xlab = "Mes",                                           # Etiqueta del eje X
  ylab = "Energía generada (kWh/mes)"                     # Etiqueta del eje Y
)

#El gráfico de energía mensual generada a partir del gabazo de palma, la producción eléctrica es relativamente constante a lo largo del año, con ligeras variaciones entre meses. Esto indica un potencial estable de aprovechamiento energético de los residuos generados en Queve Palma.


# Verificar que la columna viviendas_equivalentes_mes existe
head(resumen_mensual_energia$viviendas_equivalentes_mes)  # Muestra algunos valores de viviendas por mes
## [1] 59456.08 57024.83 60846.06 59064.83 61291.48 58997.65
# Crear un gráfico de barras con viviendas equivalentes por mes
barplot(
  height = resumen_mensual_energia$viviendas_equivalentes_mes,   # Altura = número de viviendas equivalentes por mes
  names.arg = format(resumen_mensual_energia$mes, "%b"),         # Etiquetas de los meses en el eje X
  main = "Viviendas equivalentes abastecidas por mes",           # Título del gráfico
  xlab = "Mes",                                                  # Etiqueta del eje X
  ylab = "Viviendas equivalentes (unidad)"                       # Etiqueta del eje Y
)

#l gráfico de viviendas equivalentes abastecidas por mes evidencia que el número de viviendas se mantiene relativamente estable, con valores que oscilan entre aproximadamente 52 000 y 56 000 viviendas equivalentes. Los valores más bajos se observan en febrero, cercanos a 52 000, mientras que los meses con mayor abastecimiento corresponden a marzo, julio y diciembre, con valores aproximados de 55 000 a 56 000 viviendas. Estas variaciones moderadas reflejan ajustes normales en la demanda y no comprometen la continuidad del servicio.
# Cargar dplyr por si no está cargado
library(dplyr)

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

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

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

# Ver las primeras filas para comprobar las nuevas columnas
head(resumen_mensual_energia)    # Debes ver 'promedio_diario_energia_kWh' y 'viviendas_promedio_diarias'
## # A tibble: 6 × 8
##   mes                 total_residuos_t total_energia_kWh promedio_diario_resid…¹
##   <dttm>                         <dbl>             <dbl>                   <dbl>
## 1 2024-01-01 00:00:00           19819.         14864019.                    639.
## 2 2024-02-01 00:00:00           19008.         14256208.                    655.
## 3 2024-03-01 00:00:00           20282.         15211514.                    654.
## 4 2024-04-01 00:00:00           19688.         14766208.                    656.
## 5 2024-05-01 00:00:00           20430.         15322869.                    659.
## 6 2024-06-01 00:00:00           19666.         14749413.                    656.
## # ℹ abbreviated name: ¹​promedio_diario_residuos_t
## # ℹ 4 more variables: promedio_diario_energia_kWh <dbl>, n_dias <int>,
## #   viviendas_equivalentes_mes <dbl>, viviendas_promedio_diarias <dbl>

ULTIMO

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

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

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

# =========================
# 3) RESIDUOS MENSUALES PROYECTADOS 2025 (desde forecast)
# =========================
residuos_2025_mensual <- tibble(
  mes = seq.Date(as.Date("2025-01-01"), by = "month", length.out = 12),
  total_residuos_t = as.numeric(pronostico_2025$mean)   # <-- total t/mes pronosticado
)

# =========================
# 4) DESAGREGAR A DIARIO 2025 CONSERVANDO TOTALES MENSUALES
#    usando el patrón de día de semana de 2024
# =========================
residuos_2025_diario <- residuos_2025_mensual %>%
  rowwise() %>%
  mutate(
    fechas = list(seq.Date(mes, ceiling_date(mes, "month") - days(1), by = "day"))
  ) %>%
  unnest(fechas) %>%
  rename(fecha = fechas) %>%
  mutate(
    dia_sem = wday(fecha, week_start = 1, label = TRUE, abbr = TRUE)
  ) %>%
  left_join(pesos_dow, by = "dia_sem") %>%
  group_by(mes) %>%
  mutate(
    # normalizar pesos dentro del mes para que la suma diaria = total mensual
    peso_norm = peso / sum(peso, na.rm = TRUE),
    residuos_t_dia = total_residuos_t * peso_norm
  ) %>%
  ungroup()

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

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

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

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

#El heatmap calendario de generación de energía muestra que, durante el año 2024, la generación diaria se sitúa mayoritariamente entre 480 000 y 520 000 kWh/día, con algunos descensos puntuales que alcanzan valores cercanos a 460 000 kWh/día en determinados días de la semana. En la proyección para 2025, los valores se incrementan ligeramente, alcanzando rangos aproximados de 500 000 a 560 000 kWh/día, con una mayor variabilidad entre semanas. Este comportamiento sugiere una expectativa de aumento en la producción energética, aunque con fluctuaciones operativas más marcadas.

VALORIZACIÓN ENERGÉTICA CON VARIACIÓN MENSUAL

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

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

# Ejecutar solo una vez si no está instalado:
install.packages("ggplot2")
## Warning: package 'ggplot2' is in use and will not be installed
library(ggplot2)


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

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

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

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

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

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

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


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

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

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


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

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

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

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

tabla_mensual_base <- resultado_ano_base$tabla_mensual
tabla_mensual_base
##    mes nombre_mes dias_mes multip_mes masa_t_dia masa_t_mes energia_el_kWh_dia
## 1    1      Enero       31       1.00      150.0       4650           168750.0
## 2    2    Febrero       28       1.15      172.5       4830           194062.5
## 3    3      Marzo       31       1.30      195.0       6045           219375.0
## 4    4      Abril       30       1.00      150.0       4500           168750.0
## 5    5       Mayo       31       1.00      150.0       4650           168750.0
## 6    6      Junio       30       1.00      150.0       4500           168750.0
## 7    7      Julio       31       1.00      150.0       4650           168750.0
## 8    8     Agosto       31       1.00      150.0       4650           168750.0
## 9    9 Septiembre       30       1.00      150.0       4500           168750.0
## 10  10    Octubre       31       1.00      150.0       4650           168750.0
## 11  11  Noviembre       30       1.10      165.0       4950           185625.0
## 12  12  Diciembre       31       1.00      150.0       4650           168750.0
##    energia_el_kWh_mes
## 1             5231250
## 2             5433750
## 3             6800625
## 4             5062500
## 5             5231250
## 6             5062500
## 7             5231250
## 8             5231250
## 9             5062500
## 10            5231250
## 11            5568750
## 12            5231250
resultado_ano_base$energia_el_GWh_anio  # energía anual en GWh (escenario base)
## [1] 64.37812
########## 5. GRÁFICAS PARA EL AÑO BASE ##########

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

##El gráfico de masa de residuos tratada por mes indica que el sistema procesa entre 4 500 y 5 200 toneladas por mes. Los valores mínimos se presentan en abril y septiembre, con aproximadamente 4 500–4 600 t/mes, mientras que los valores máximos se registran en diciembre, alcanzando alrededor de 5 200 t/mes. En términos generales, se observa una tendencia ligeramente creciente hacia el final del año, lo que sugiere un incremento estacional en la generación de residuos.

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

#La gráfica de Energía eléctrica generada por mes detalla la producción absoluta en MWh/mes, donde se observa que la mayoría de los meses mantienen un rendimiento estable situado aproximadamente en los 5,000 MWh. El comportamiento destaca un pico máximo excepcional durante el mes de Marzo, donde la generación se dispara significativamente alcanzando casi los 7,000 MWh, lo que representa el punto de mayor eficiencia o disponibilidad de combustible del año. Por el contrario, los meses de Abril, Junio y Septiembre registran los niveles de producción más bajos, situándose ligeramente por debajo de la barrera de los 5,000 MWh. Esta distribución permite identificar a Noviembre como el segundo mes de mayor producción (superando los 5,500 MWh), consolidando una tendencia donde, a pesar de la estabilidad general, existen variaciones estacionales importantes que deben ser consideradas para los compromisos de suministro energético.
# 5.3. Línea comparando masa (t/mes) y energía (MWh/mes) normalizadas
tabla_mensual_base$masa_norm  <- tabla_mensual_base$masa_t_mes / max(tabla_mensual_base$masa_t_mes)
tabla_mensual_base$energia_norm <- tabla_mensual_base$energia_el_MWh_mes / max(tabla_mensual_base$energia_el_MWh_mes)

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

#La gráfica de Comparación relativa masa vs energía por mes muestra una fluctuación estacional donde la producción de energía y la masa de residuos guardan una relación directa, operando con un valor normalizado que oscila entre el 0.80 y el 1.00. Se identifica un valle operativo en los meses de abril, junio y septiembre, donde la actividad cae a su punto más bajo (aproximadamente 80% de la capacidad máxima), mientras que se observa una recuperación gradual hacia el cierre del año. El punto crítico de máxima exigencia ocurre en diciembre, mes en el que el sistema alcanza su 100% de capacidad (valor 1.00), lo que indica que la planta debe procesar su mayor volumen de carga y generar su máximo potencial eléctrico en este periodo.
########## 6. PROYECCIÓN MULTIANUAL CON PATRÓN MENSUAL ##########

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

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


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

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

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

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

head(proyeccion_meses)
##   anio anio_rel mes nombre_mes dias_mes masa_t_dia masa_t_mes
## 1 2024        0   1      Enero       31      150.0       4650
## 2 2024        0   2    Febrero       28      172.5       4830
## 3 2024        0   3      Marzo       31      195.0       6045
## 4 2024        0   4      Abril       30      150.0       4500
## 5 2024        0   5       Mayo       31      150.0       4650
## 6 2024        0   6      Junio       30      150.0       4500
##   energia_el_kWh_mes energia_el_MWh_mes
## 1            5231250           5231.250
## 2            5433750           5433.750
## 3            6800625           6800.625
## 4            5062500           5062.500
## 5            5231250           5231.250
## 6            5062500           5062.500
########## 8. RESUMEN ANUAL DE LA PROYECCIÓN ##########

# Calculamos energía anual sumando todos los meses

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

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

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

resumen_anual
##    anio energia_el_kWh_anio energia_el_GWh_anio masa_t_anio
## 1  2024            64378125            64.37812    57225.00
## 2  2025            66309469            66.30947    58941.75
## 3  2026            68298753            68.29875    60710.00
## 4  2027            70347715            70.34772    62531.30
## 5  2028            72458147            72.45815    64407.24
## 6  2029            74631891            74.63189    66339.46
## 7  2030            76870848            76.87085    68329.64
## 8  2031            79176973            79.17697    70379.53
## 9  2032            81552283            81.55228    72490.92
## 10 2033            83998851            83.99885    74665.65
## 11 2034            86518817            86.51882    76905.61
## 12 2035            89114381            89.11438    79212.78
## 13 2036            91787813            91.78781    81589.17
## 14 2037            94541447            94.54145    84036.84
## 15 2038            97377690            97.37769    86557.95
## 16 2039           100299021           100.29902    89154.69
########## 9. GRÁFICAS DE LA PROYECCIÓN ##########

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

#La gráfica muestra la capacidad de generación eléctrica, la cual guarda una correlación directa con la cantidad de residuos tratados, escalando de aproximadamente 64 GWh/año a casi 100 GWh/año al final del periodo. El hecho de que la pendiente sea idéntica a la de la masa tratada indica que se está asumiendo un Poder Calorífico Inferior (PCI) constante en los residuos y una eficiencia tecnológica estable en las turbinas de conversión. Este gráfico es fundamental para proyecciones financieras, ya que permite estimar los ingresos por venta de energía y la recuperación de la inversión (ROI) del proyecto.

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

#La gráfica revela una proyección de crecimiento lineal constante en la recepción de residuos, partiendo desde unas 57,000 toneladas en 2024 hasta superar las 85,000 toneladas para el año 2039. Este incremento sostenido sugiere que el sistema de recolección o la zona de influencia prevé un aumento demográfico o de consumo estable, lo que garantiza el suministro de materia prima para la planta a largo plazo. Operativamente, esto implica que la infraestructura debe diseñarse con la flexibilidad suficiente para absorber un aumento de carga cercano al 50% durante los próximos 15 años.