1. Construccion de base de datos

    1.1. Exploracion inicial de la base de datos

setwd("C:/Users/s05e24/Downloads/TALLER BIG DATA LUISA")

# Cargar los archivos
carbon <- read_csv("clean_precios_carbon.CSV")
## Rows: 8579 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl  (1): precio_carbon
## date (1): fecha
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
gas_natural <- read_csv("clean_precios_gas_natural.CSV")
## Rows: 8579 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl  (1): precio_gas_natural
## date (1): fecha
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
gasolina <- read_csv("clean_precios_gasolina.CSV")
## Rows: 8579 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl  (1): precio_gasolina
## date (1): fecha
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
petroleo <- read_csv("clean_precios_petroleo.CSV")
## Rows: 8579 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl  (1): precio_petroleo
## date (1): fecha
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ipc <- read_csv("IPC.CSV")
## Rows: 847 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl  (1): ipc
## date (1): fecha
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
explorar_base <- function(df, nombre){
cat("\n###", nombre, "\n")
cat("Número de observaciones:", nrow(df), "\n")
cat("Columnas:", names(df), "\n")
cat("Rango de fechas:", min(df[[1]]), "a", max(df[[1]]), "\n\n")
}

# Estructura basica
glimpse(carbon)
## Rows: 8,579
## Columns: 2
## $ fecha         <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-05, 2000-01…
## $ precio_carbon <dbl> 56.80856, 84.06858, 70.66739, 79.72284, 91.50991, 69.774…
glimpse(gas_natural)
## Rows: 8,579
## Columns: 2
## $ fecha              <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
glimpse(petroleo)
## Rows: 8,579
## Columns: 2
## $ fecha           <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-…
## $ precio_petroleo <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.30725, …
glimpse(gasolina)
## Rows: 8,579
## Columns: 2
## $ fecha           <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-…
## $ precio_gasolina <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 41.8…
glimpse(ipc)
## Rows: 847
## Columns: 2
## $ fecha <date> 1954-07-31, 1954-08-31, 1954-09-30, 1954-10-31, 1954-11-30, 195…
## $ ipc   <dbl> 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03…
# Unir las series por fecha 
precios_comb <- carbon %>%
  left_join(gas_natural, by = "fecha") %>%
  left_join(petroleo, by = "fecha") %>%
  left_join(gasolina, by = "fecha") %>%
  left_join(ipc, by = "fecha")

# Renombrar columnas para claridad
colnames(precios_comb) <- c("fecha", "precio_carbon", "precio_gas_natural",
                            "precio_petroleo", "precio_gasolina", "ipc")
# Revisar la base final 
glimpse(precios_comb)
## Rows: 8,579
## Columns: 6
## $ fecha              <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-05, 20…
## $ precio_carbon      <dbl> 56.80856, 84.06858, 70.66739, 79.72284, 91.50991, 6…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 133.78021, 78.58548…
## $ precio_petroleo    <dbl> 77.70500, 108.36269, 118.78963, 115.30725, 100.5229…
## $ precio_gasolina    <dbl> 85.22463, 58.80204, 62.35808, 43.80961, 41.87021, 7…
## $ ipc                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
summary(precios_comb)
##      fecha            precio_carbon    precio_gas_natural precio_petroleo 
##  Min.   :2000-01-01   Min.   : 50.98   Min.   : 70.78     Min.   : 70.39  
##  1st Qu.:2005-12-26   1st Qu.: 83.23   1st Qu.:100.54     1st Qu.: 95.56  
##  Median :2012-01-05   Median : 97.19   Median :118.35     Median :108.02  
##  Mean   :2012-01-01   Mean   : 96.96   Mean   :118.29     Mean   :108.11  
##  3rd Qu.:2018-01-04   3rd Qu.:110.67   3rd Qu.:135.63     3rd Qu.:120.72  
##  Max.   :2024-01-01   Max.   :142.97   Max.   :165.38     Max.   :145.87  
##                                        NA's   :184        NA's   :186     
##  precio_gasolina       ipc        
##  Min.   : 41.52   Min.   : 41.23  
##  1st Qu.: 87.06   1st Qu.: 58.78  
##  Median :108.66   Median : 75.82  
##  Mean   :108.93   Mean   : 78.72  
##  3rd Qu.:130.68   3rd Qu.: 96.83  
##  Max.   :176.34   Max.   :137.72  
##  NA's   :183      NA's   :8297
# Análisis descriptivo general

# Información general
cat("### Análisis descriptivo general de la base de datos\n\n")
## ### Análisis descriptivo general de la base de datos
cat("Número de observaciones:", nrow(precios_comb), "\n")
## Número de observaciones: 8579
cat("Número de variables:", ncol(precios_comb), "\n\n")
## Número de variables: 6
# Variables
cat("Variables contenidas en la base (incluyendo IPC):\n")
## Variables contenidas en la base (incluyendo IPC):
print(names(precios_comb))
## [1] "fecha"              "precio_carbon"      "precio_gas_natural"
## [4] "precio_petroleo"    "precio_gasolina"    "ipc"
cat("\n")
# Tipos de datos
cat("Tipos de datos de cada variable:\n")
## Tipos de datos de cada variable:
print(sapply(precios_comb, class))
##              fecha      precio_carbon precio_gas_natural    precio_petroleo 
##             "Date"          "numeric"          "numeric"          "numeric" 
##    precio_gasolina                ipc 
##          "numeric"          "numeric"
cat("\n")
# Periodo analizado
cat("Periodo de tiempo cubierto:\n")
## Periodo de tiempo cubierto:
cat("Desde:", min(precios_comb$fecha), "hasta:", max(precios_comb$fecha), "\n\n")
## Desde: 10957 hasta: 19723
# Valores faltantes
cat("Cantidad de valores faltantes por variable:\n")
## Cantidad de valores faltantes por variable:
print(colSums(is.na(precios_comb)))
##              fecha      precio_carbon precio_gas_natural    precio_petroleo 
##                  0                  0                184                186 
##    precio_gasolina                ipc 
##                183               8297
cat("\n")
# Resumen estadístico
cat("Resumen estadístico de los precios e IPC:\n")
## Resumen estadístico de los precios e IPC:
print(summary(precios_comb[, -1]))
##  precio_carbon    precio_gas_natural precio_petroleo  precio_gasolina 
##  Min.   : 50.98   Min.   : 70.78     Min.   : 70.39   Min.   : 41.52  
##  1st Qu.: 83.23   1st Qu.:100.54     1st Qu.: 95.56   1st Qu.: 87.06  
##  Median : 97.19   Median :118.35     Median :108.02   Median :108.66  
##  Mean   : 96.96   Mean   :118.29     Mean   :108.11   Mean   :108.93  
##  3rd Qu.:110.67   3rd Qu.:135.63     3rd Qu.:120.72   3rd Qu.:130.68  
##  Max.   :142.97   Max.   :165.38     Max.   :145.87   Max.   :176.34  
##                   NA's   :184        NA's   :186      NA's   :183     
##       ipc        
##  Min.   : 41.23  
##  1st Qu.: 58.78  
##  Median : 75.82  
##  Mean   : 78.72  
##  3rd Qu.: 96.83  
##  Max.   :137.72  
##  NA's   :8297
cat("\n")

La base consolidada está compuesta por 8.579 observaciones y seis variables: fecha, precio_carbon, precio_gas_natural, precio_petroleo, precio_gasolina e ipc. La variable fecha se encuentra en formato Date y el resto corresponde a valores numéricos. El período analizado va desde el 1 de enero del 2000 hasta el 1 de enero del 2024, lo que permite estudiar la evolución de estas series en el largo plazo.

Se identifican valores faltantes en algunas variables, principalmente en el ipc, donde se registran 8.297 datos ausentes, lo cual indica una menor disponibilidad o una frecuencia distinta frente al resto de las series de precios. En precio_gas_natural, precio_petroleo y precio_gasolina se presentan 184, 186 y 183 datos faltantes respectivamente, mientras que el precio_carbon no presenta ausencias. Esta situación debe considerarse antes de aplicar modelos que requieran series completas.

En cuanto a su comportamiento estadístico, los precios presentan variaciones importantes: el carbón tiene un promedio cercano a 96.96, el gas natural 118.29, el petróleo 108.11, la gasolina 108.93 y el ipc aproximadamente 78.72.

En conclusión, se cuenta con una base robusta para el análisis de tendencias de precios energéticos y del IPC a lo largo de 24 años; sin embargo, será necesario tratar los valores faltantes, especialmente en el ipc, para asegurar consistencia en futuros análisis.

 1.2. Explicitar las fechas faltantes 
# Funcion para fechas faltantes 
completar_fechas <- function(data, columna_fecha, columna_valor) {
  # Obtener el rango completo de fechas
  rango_fechas <- seq(min(data[[columna_fecha]], na.rm = TRUE),
                      max(data[[columna_fecha]], na.rm = TRUE),
                      by = "day")

# Crear un dataframe con todas las fechas y unirlo con la base original
  data_completa <- data %>%
    right_join(
      tibble(!!columna_fecha := rango_fechas),
      by = setNames(columna_fecha, columna_fecha)
    ) %>%
    arrange(!!sym(columna_fecha))
  
  return(data_completa)
}
# Aplicar la función a cada base
carbon_completo <- completar_fechas(carbon, "fecha", "precio_carbon")
gas_completo <- completar_fechas(gas_natural, "fecha", "precio_gas_natural")
petroleo_completo <- completar_fechas(petroleo, "fecha", "precio_petroleo")
gasolina_completo <- completar_fechas(gasolina, "fecha", "precio_gasolina")
ipc_completo <- completar_fechas(ipc, "fecha", "ipc")

# Verificar la estructura de cada base completada
summary(carbon_completo)
##      fecha            precio_carbon   
##  Min.   :2000-01-01   Min.   : 50.98  
##  1st Qu.:2005-12-31   1st Qu.: 83.23  
##  Median :2012-01-01   Median : 97.19  
##  Mean   :2012-01-01   Mean   : 96.96  
##  3rd Qu.:2017-12-31   3rd Qu.:110.67  
##  Max.   :2024-01-01   Max.   :142.97  
##                       NA's   :188
summary(gas_completo)
##      fecha            precio_gas_natural
##  Min.   :2000-01-01   Min.   : 70.78    
##  1st Qu.:2005-12-31   1st Qu.:100.59    
##  Median :2012-01-01   Median :118.36    
##  Mean   :2012-01-01   Mean   :118.31    
##  3rd Qu.:2017-12-31   3rd Qu.:135.65    
##  Max.   :2024-01-01   Max.   :165.38    
##                       NA's   :188
summary(petroleo_completo)
##      fecha            precio_petroleo 
##  Min.   :2000-01-01   Min.   : 70.39  
##  1st Qu.:2005-12-31   1st Qu.: 95.55  
##  Median :2012-01-01   Median :107.98  
##  Mean   :2012-01-01   Mean   :108.09  
##  3rd Qu.:2017-12-31   3rd Qu.:120.71  
##  Max.   :2024-01-01   Max.   :145.87  
##                       NA's   :188
summary(gasolina_completo)
##      fecha            precio_gasolina 
##  Min.   :2000-01-01   Min.   : 41.52  
##  1st Qu.:2005-12-31   1st Qu.: 87.12  
##  Median :2012-01-01   Median :108.66  
##  Mean   :2012-01-01   Mean   :108.94  
##  3rd Qu.:2017-12-31   3rd Qu.:130.73  
##  Max.   :2024-01-01   Max.   :176.34  
##                       NA's   :188
summary(ipc_completo)
##      fecha                 ipc        
##  Min.   :1954-07-31   Min.   :  0.03  
##  1st Qu.:1972-03-16   1st Qu.:  0.14  
##  Median :1989-10-31   Median :  5.60  
##  Mean   :1989-10-31   Mean   : 32.37  
##  3rd Qu.:2007-06-17   3rd Qu.: 64.08  
##  Max.   :2025-01-31   Max.   :146.24  
##                       NA's   :24906
# Unir nuevamente todas las series completas en una sola base consolidada
precios_comb_completo <- carbon_completo %>%
  left_join(gas_completo, by = "fecha") %>%
  left_join(petroleo_completo, by = "fecha") %>%
  left_join(gasolina_completo, by = "fecha") %>%
  left_join(ipc_completo, by = "fecha")

# Verificar estructura y resumen
lapply(list(carbon, gas_natural, gasolina, petroleo, ipc), glimpse)
## Rows: 8,579
## Columns: 2
## $ fecha         <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-05, 2000-01…
## $ precio_carbon <dbl> 56.80856, 84.06858, 70.66739, 79.72284, 91.50991, 69.774…
## Rows: 8,579
## Columns: 2
## $ fecha              <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
## Rows: 8,579
## Columns: 2
## $ fecha           <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-…
## $ precio_gasolina <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 41.8…
## Rows: 8,579
## Columns: 2
## $ fecha           <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-…
## $ precio_petroleo <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.30725, …
## Rows: 847
## Columns: 2
## $ fecha <date> 1954-07-31, 1954-08-31, 1954-09-30, 1954-10-31, 1954-11-30, 195…
## $ ipc   <dbl> 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03…
## [[1]]
## # A tibble: 8,579 × 2
##    fecha      precio_carbon
##    <date>             <dbl>
##  1 2000-01-01          56.8
##  2 2000-01-02          84.1
##  3 2000-01-03          70.7
##  4 2000-01-05          79.7
##  5 2000-01-06          91.5
##  6 2000-01-07          69.8
##  7 2000-01-09          75.8
##  8 2000-01-10          99.5
##  9 2000-01-11          98.2
## 10 2000-01-12          99.5
## # ℹ 8,569 more rows
## 
## [[2]]
## # A tibble: 8,579 × 2
##    fecha      precio_gas_natural
##    <date>                  <dbl>
##  1 2000-01-01              134. 
##  2 2000-01-02              103. 
##  3 2000-01-03               72.7
##  4 2000-01-04              102. 
##  5 2000-01-05              134. 
##  6 2000-01-06               78.6
##  7 2000-01-07              139. 
##  8 2000-01-08              115. 
##  9 2000-01-09               81.1
## 10 2000-01-10               92.4
## # ℹ 8,569 more rows
## 
## [[3]]
## # A tibble: 8,579 × 2
##    fecha      precio_gasolina
##    <date>               <dbl>
##  1 2000-01-01            85.2
##  2 2000-01-02            58.8
##  3 2000-01-03            62.4
##  4 2000-01-04            48.6
##  5 2000-01-05            43.8
##  6 2000-01-06            41.9
##  7 2000-01-07            71.5
##  8 2000-01-08            43.1
##  9 2000-01-09            53.9
## 10 2000-01-10            46.6
## # ℹ 8,569 more rows
## 
## [[4]]
## # A tibble: 8,579 × 2
##    fecha      precio_petroleo
##    <date>               <dbl>
##  1 2000-01-01            77.7
##  2 2000-01-02           108. 
##  3 2000-01-03           119. 
##  4 2000-01-04           106. 
##  5 2000-01-05           115. 
##  6 2000-01-06           101. 
##  7 2000-01-07            80.5
##  8 2000-01-08            82.0
##  9 2000-01-09            92.7
## 10 2000-01-10            82.4
## # ℹ 8,569 more rows
## 
## [[5]]
## # A tibble: 847 × 2
##    fecha        ipc
##    <date>     <dbl>
##  1 1954-07-31  0.03
##  2 1954-08-31  0.03
##  3 1954-09-30  0.03
##  4 1954-10-31  0.03
##  5 1954-11-30  0.03
##  6 1954-12-31  0.03
##  7 1955-01-31  0.03
##  8 1955-02-28  0.03
##  9 1955-03-31  0.03
## 10 1955-04-30  0.03
## # ℹ 837 more rows
lapply(list(carbon, gas_natural, gasolina, petroleo, ipc), summary)
## [[1]]
##      fecha            precio_carbon   
##  Min.   :2000-01-01   Min.   : 50.98  
##  1st Qu.:2005-12-26   1st Qu.: 83.23  
##  Median :2012-01-05   Median : 97.19  
##  Mean   :2012-01-01   Mean   : 96.96  
##  3rd Qu.:2018-01-04   3rd Qu.:110.67  
##  Max.   :2024-01-01   Max.   :142.97  
## 
## [[2]]
##      fecha            precio_gas_natural
##  Min.   :2000-01-01   Min.   : 70.78    
##  1st Qu.:2006-01-02   1st Qu.:100.59    
##  Median :2011-12-30   Median :118.36    
##  Mean   :2011-12-29   Mean   :118.31    
##  3rd Qu.:2017-12-22   3rd Qu.:135.65    
##  Max.   :2024-01-01   Max.   :165.38    
## 
## [[3]]
##      fecha            precio_gasolina 
##  Min.   :2000-01-01   Min.   : 41.52  
##  1st Qu.:2006-01-02   1st Qu.: 87.12  
##  Median :2011-12-22   Median :108.66  
##  Mean   :2011-12-28   Mean   :108.94  
##  3rd Qu.:2017-12-26   3rd Qu.:130.73  
##  Max.   :2024-01-01   Max.   :176.34  
## 
## [[4]]
##      fecha            precio_petroleo 
##  Min.   :2000-01-01   Min.   : 70.39  
##  1st Qu.:2006-01-07   1st Qu.: 95.55  
##  Median :2011-12-28   Median :107.98  
##  Mean   :2012-01-01   Mean   :108.09  
##  3rd Qu.:2017-12-31   3rd Qu.:120.71  
##  Max.   :2024-01-01   Max.   :145.87  
## 
## [[5]]
##      fecha                 ipc        
##  Min.   :1954-07-31   Min.   :  0.03  
##  1st Qu.:1972-03-15   1st Qu.:  0.14  
##  Median :1989-10-31   Median :  5.60  
##  Mean   :1989-10-30   Mean   : 32.37  
##  3rd Qu.:2007-06-15   3rd Qu.: 64.08  
##  Max.   :2025-01-31   Max.   :146.24
# Revisar la base final con fechas explícitas
glimpse(precios_comb_completo)
## Rows: 8,767
## Columns: 6
## $ fecha              <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_carbon      <dbl> 56.80856, 84.06858, 70.66739, NA, 79.72284, 91.5099…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
## $ precio_petroleo    <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.3072…
## $ precio_gasolina    <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 4…
## $ ipc                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
summary(precios_comb_completo)
##      fecha            precio_carbon    precio_gas_natural precio_petroleo 
##  Min.   :2000-01-01   Min.   : 50.98   Min.   : 70.78     Min.   : 70.39  
##  1st Qu.:2005-12-31   1st Qu.: 83.23   1st Qu.:100.59     1st Qu.: 95.55  
##  Median :2012-01-01   Median : 97.19   Median :118.36     Median :107.98  
##  Mean   :2012-01-01   Mean   : 96.96   Mean   :118.31     Mean   :108.09  
##  3rd Qu.:2017-12-31   3rd Qu.:110.67   3rd Qu.:135.65     3rd Qu.:120.71  
##  Max.   :2024-01-01   Max.   :142.97   Max.   :165.38     Max.   :145.87  
##                       NA's   :188      NA's   :188        NA's   :188     
##  precio_gasolina       ipc        
##  Min.   : 41.52   Min.   : 40.30  
##  1st Qu.: 87.12   1st Qu.: 58.94  
##  Median :108.66   Median : 76.47  
##  Mean   :108.94   Mean   : 78.96  
##  3rd Qu.:130.73   3rd Qu.: 97.07  
##  Max.   :176.34   Max.   :137.72  
##  NA's   :188      NA's   :8479
# Tabla ordenada

tabla_descriptivos <- precios_comb_completo %>% 
  summarise(
    min_carbon = min(precio_carbon, na.rm = TRUE),
    q1_carbon = quantile(precio_carbon, 0.25, na.rm = TRUE),
    med_carbon = median(precio_carbon, na.rm = TRUE),
    mean_carbon = mean(precio_carbon, na.rm = TRUE),
    q3_carbon = quantile(precio_carbon, 0.75, na.rm = TRUE),
    max_carbon = max(precio_carbon, na.rm = TRUE),
    na_carbon = sum(is.na(precio_carbon)),
    
    min_gasnat = min(precio_gas_natural, na.rm = TRUE),
    q1_gasnat = quantile(precio_gas_natural, 0.25, na.rm = TRUE),
    med_gasnat = median(precio_gas_natural, na.rm = TRUE),
    mean_gasnat = mean(precio_gas_natural, na.rm = TRUE),
    q3_gasnat = quantile(precio_gas_natural, 0.75, na.rm = TRUE),
    max_gasnat = max(precio_gas_natural, na.rm = TRUE),
    na_gasnat = sum(is.na(precio_gas_natural)),
    
    min_pet = min(precio_petroleo, na.rm = TRUE),
    q1_pet = quantile(precio_petroleo, 0.25, na.rm = TRUE),
    med_pet = median(precio_petroleo, na.rm = TRUE),
    mean_pet = mean(precio_petroleo, na.rm = TRUE),
    q3_pet = quantile(precio_petroleo, 0.75, na.rm = TRUE),
    max_pet = max(precio_petroleo, na.rm = TRUE),
    na_pet = sum(is.na(precio_petroleo)),
    
    min_gas = min(precio_gasolina, na.rm = TRUE),
    q1_gas = quantile(precio_gasolina, 0.25, na.rm = TRUE),
    med_gas = median(precio_gasolina, na.rm = TRUE),
    mean_gas = mean(precio_gasolina, na.rm = TRUE),
    q3_gas = quantile(precio_gasolina, 0.75, na.rm = TRUE),
    max_gas = max(precio_gasolina, na.rm = TRUE),
    na_gas = sum(is.na(precio_gasolina)),
    
    min_ipc = min(ipc, na.rm = TRUE),
    q1_ipc = quantile(ipc, 0.25, na.rm = TRUE),
    med_ipc = median(ipc, na.rm = TRUE),
    mean_ipc = mean(ipc, na.rm = TRUE),
    q3_ipc = quantile(ipc, 0.75, na.rm = TRUE),
    max_ipc = max(ipc, na.rm = TRUE),
    na_ipc = sum(is.na(ipc))
  )

tabla_desc <- describe(precios_comb)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
View(tabla_desc)
  1.3. Aplicar la funcion anterior a cada una de las bases de datos 
    
# Funcion anterior 
completar_fechas <- function(df, fecha_col, precio_col) {
  fecha_col <- enquo(fecha_col)
  precio_col <- enquo(precio_col)
  
rango_fechas <- seq(min(df %>% pull(!!fecha_col), na.rm = TRUE),
                      max(df %>% pull(!!fecha_col), na.rm = TRUE),
                      by = "day")
  
df_completo <- tibble(fecha = rango_fechas) %>%
    left_join(df, by = c("fecha" = rlang::as_name(fecha_col)))
  
# Aseguramos el nombre correcto del precio
  if (!rlang::as_name(precio_col) %in% names(df_completo)) {
    df_completo <- df_completo %>%
      mutate(!!precio_col := NA_real_)
  }
  
  return(df_completo)
}
# Aplicación de la función a cada base de precios
carbon_completo <- completar_fechas(carbon, fecha, precio_carbon)
gas_completo <- completar_fechas(gas_natural, fecha, precio_gas_natural)
petroleo_completo <- completar_fechas(petroleo, fecha, precio_petroleo)
gasolina_completo <- completar_fechas(gasolina, fecha, precio_gasolina)
ipc_completo <- completar_fechas(ipc, fecha, ipc)
  1.4. Union de los datasets
# Unión de las bases en una sola 
precios_comb <- carbon_completo %>%
  left_join(gas_completo, by = "fecha") %>%
  left_join(petroleo_completo, by = "fecha") %>%
  left_join(gasolina_completo, by = "fecha") %>%
  left_join(ipc_completo, by = "fecha")

# Revisión final 
summary(precios_comb)
##      fecha            precio_carbon    precio_gas_natural precio_petroleo 
##  Min.   :2000-01-01   Min.   : 50.98   Min.   : 70.78     Min.   : 70.39  
##  1st Qu.:2005-12-31   1st Qu.: 83.23   1st Qu.:100.59     1st Qu.: 95.55  
##  Median :2012-01-01   Median : 97.19   Median :118.36     Median :107.98  
##  Mean   :2012-01-01   Mean   : 96.96   Mean   :118.31     Mean   :108.09  
##  3rd Qu.:2017-12-31   3rd Qu.:110.67   3rd Qu.:135.65     3rd Qu.:120.71  
##  Max.   :2024-01-01   Max.   :142.97   Max.   :165.38     Max.   :145.87  
##                       NA's   :188      NA's   :188        NA's   :188     
##  precio_gasolina       ipc        
##  Min.   : 41.52   Min.   : 40.30  
##  1st Qu.: 87.12   1st Qu.: 58.94  
##  Median :108.66   Median : 76.47  
##  Mean   :108.94   Mean   : 78.96  
##  3rd Qu.:130.73   3rd Qu.: 97.07  
##  Max.   :176.34   Max.   :137.72  
##  NA's   :188      NA's   :8479
glimpse(precios_comb)
## Rows: 8,767
## Columns: 6
## $ fecha              <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_carbon      <dbl> 56.80856, 84.06858, 70.66739, NA, 79.72284, 91.5099…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
## $ precio_petroleo    <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.3072…
## $ precio_gasolina    <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 4…
## $ ipc                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
tabla_desc <- describe(precios_comb)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
View(tabla_desc)
  1.5. Columnas de año y mes        
#Columnas de mes y año
precios_comb <- precios_comb %>%
  mutate(
    anio = year(fecha),           # Extrae el año
    mes = month(fecha, label = TRUE, abbr = TRUE)  # Extrae el mes (nombre abreviado)
  )
# Verificación de las nuevas columnas
glimpse(precios_comb)
## Rows: 8,767
## Columns: 8
## $ fecha              <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_carbon      <dbl> 56.80856, 84.06858, 70.66739, NA, 79.72284, 91.5099…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
## $ precio_petroleo    <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.3072…
## $ precio_gasolina    <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 4…
## $ ipc                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ anio               <dbl> 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 200…
## $ mes                <ord> ene, ene, ene, ene, ene, ene, ene, ene, ene, ene, e…
summary(select(precios_comb, fecha, anio, mes))
##      fecha                 anio           mes      
##  Min.   :2000-01-01   Min.   :2000   ene    : 745  
##  1st Qu.:2005-12-31   1st Qu.:2006   mar    : 744  
##  Median :2012-01-01   Median :2012   may    : 744  
##  Mean   :2012-01-01   Mean   :2012   jul    : 744  
##  3rd Qu.:2017-12-31   3rd Qu.:2018   ago    : 744  
##  Max.   :2024-01-01   Max.   :2024   oct    : 744  
##                                      (Other):4302
  1.6. Tabla de porcentajes
# Crear columnas de año y mes
precios_comb <- precios_comb %>%
  mutate(
    anio = year(fecha),
    mes = month(fecha)
  )

# Porcentaje de valores faltantes antes
faltantes <- precios_comb %>%
  summarise(across(where(is.numeric), ~sum(is.na(.))/n()*100)) %>%
  pivot_longer(everything(), names_to = "variable", values_to = "porcentaje_faltante")

cat("\n--- Porcentaje de valores faltantes ANTES del reemplazo ---\n")
## 
## --- Porcentaje de valores faltantes ANTES del reemplazo ---
print(faltantes)
## # A tibble: 7 × 2
##   variable           porcentaje_faltante
##   <chr>                            <dbl>
## 1 precio_carbon                     2.14
## 2 precio_gas_natural                2.14
## 3 precio_petroleo                   2.14
## 4 precio_gasolina                   2.14
## 5 ipc                              96.7 
## 6 anio                              0   
## 7 mes                               0
# Imputar valores faltantes por promedio del mismo mes-año
precios_comb <- precios_comb %>%
  group_by(anio, mes) %>%
  mutate(
    ipc = ifelse(is.na(ipc), mean(ipc, na.rm = TRUE), ipc)
  ) %>%
  ungroup()

# Porcentaje de valores faltantes después
faltantes_despues <- precios_comb %>%
  summarise(across(where(is.numeric), ~sum(is.na(.))/n()*100)) %>%
  pivot_longer(everything(), names_to = "variable", values_to = "porcentaje_faltante")

cat("\n--- Porcentaje de valores faltantes DESPUÉS del reemplazo ---\n")
## 
## --- Porcentaje de valores faltantes DESPUÉS del reemplazo ---
print(faltantes_despues)
## # A tibble: 7 × 2
##   variable           porcentaje_faltante
##   <chr>                            <dbl>
## 1 precio_carbon                   2.14  
## 2 precio_gas_natural              2.14  
## 3 precio_petroleo                 2.14  
## 4 precio_gasolina                 2.14  
## 5 ipc                             0.0114
## 6 anio                            0     
## 7 mes                             0
  1.7. Valores entre enero del 2000 hasta enero del 2024; Conversion de precios nomiales a reales
  
# --- 1.7 Agregación mensual y filtrado temporal de la base de datos ---

precios_mensual <- precios_comb %>%
  group_by(anio, mes) %>%
  summarise(
    precio_carbon      = mean(precio_carbon, na.rm = TRUE),
    precio_gas_natural = mean(precio_gas_natural, na.rm = TRUE),
    precio_petroleo    = mean(precio_petroleo, na.rm = TRUE),
    precio_gasolina    = mean(precio_gasolina, na.rm = TRUE),
    ipc                = mean(ipc, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    fecha = make_date(year = anio, month = mes, day = 1)
  ) %>%
  select(fecha, anio, mes, precio_carbon, precio_gas_natural, precio_petroleo, precio_gasolina, ipc)

# Filtrar entre 2000-01-01 y 2024-01-31
precios_mensual_filtrado <- precios_mensual %>%
  filter(fecha >= as.Date("2000-01-01") & fecha <= as.Date("2024-01-31"))

# Verificación rápida
cat("Observaciones (mensual filtrado):", nrow(precios_mensual_filtrado), "\n")
## Observaciones (mensual filtrado): 289
cat("Periodo:", min(precios_mensual_filtrado$fecha), "a", max(precios_mensual_filtrado$fecha), "\n\n")
## Periodo: 10957 a 19723
head(precios_mensual_filtrado, 6)
## # A tibble: 6 × 8
##   fecha       anio   mes precio_carbon precio_gas_natural precio_petroleo
##   <date>     <dbl> <dbl>         <dbl>              <dbl>           <dbl>
## 1 2000-01-01  2000     1          77.1               101.            95.9
## 2 2000-02-01  2000     2          80.8               104.            92.7
## 3 2000-03-01  2000     3          76.2               112.            94.6
## 4 2000-04-01  2000     4          74.7               106.            93.9
## 5 2000-05-01  2000     5          77.6               111.            91.4
## 6 2000-06-01  2000     6          78.3               107.            92.0
## # ℹ 2 more variables: precio_gasolina <dbl>, ipc <dbl>
summary(precios_mensual_filtrado)
##      fecha                 anio           mes         precio_carbon   
##  Min.   :2000-01-01   Min.   :2000   Min.   : 1.000   Min.   : 74.21  
##  1st Qu.:2006-01-01   1st Qu.:2006   1st Qu.: 3.000   1st Qu.: 86.29  
##  Median :2012-01-01   Median :2012   Median : 6.000   Median : 96.99  
##  Mean   :2011-12-31   Mean   :2012   Mean   : 6.481   Mean   : 96.98  
##  3rd Qu.:2018-01-01   3rd Qu.:2018   3rd Qu.: 9.000   3rd Qu.:107.72  
##  Max.   :2024-01-01   Max.   :2024   Max.   :12.000   Max.   :123.16  
##                                                                       
##  precio_gas_natural precio_petroleo  precio_gasolina       ipc        
##  Min.   : 98.65     Min.   : 91.25   Min.   : 61.65   Min.   : 40.30  
##  1st Qu.:112.15     1st Qu.:101.00   1st Qu.: 87.29   1st Qu.: 58.94  
##  Median :118.20     Median :107.97   Median :108.46   Median : 76.47  
##  Mean   :118.27     Mean   :108.08   Mean   :109.17   Mean   : 78.96  
##  3rd Qu.:124.81     3rd Qu.:114.50   3rd Qu.:130.80   3rd Qu.: 97.07  
##  Max.   :137.71     Max.   :129.80   Max.   :166.10   Max.   :137.72  
##                                                       NA's   :1
  1.8. Valores nominales de la serie en precios constantes 
  
# Función corregida y robusta
convertir_a_precios_reales <- function(data, columna_precio, columna_ipc, anio_base, mes_base) {
# Verificar que las columnas existan
  if (!(columna_precio %in% names(data)) | !(columna_ipc %in% names(data))) {
    stop("Las columnas especificadas no existen en el dataset.")
  }
# Asegurar que las columnas anio y mes existan
  if (!("anio" %in% names(data)) | !("mes" %in% names(data))) {
    stop("El dataset debe contener las columnas 'anio' y 'mes'.")
  }
# Buscar IPC base exacto o el más cercano anterior
  ipc_base <- data %>%
    filter((anio < anio_base) | (anio == anio_base & mes <= mes_base)) %>%
    arrange(desc(anio), desc(mes)) %>%
    slice(1) %>%
    pull(!!sym(columna_ipc))
# Validar IPC base
  if (is.na(ipc_base) | length(ipc_base) == 0) {
    stop("No se encontró un valor válido de IPC para el año y mes base especificado.")
  }
# Mostrar el IPC base que se está usando
  message("Usando IPC base = ", round(ipc_base, 2), " para ", anio_base, "-", mes_base)
# Crear el nombre de la nueva columna
  nuevo_nombre <- paste0(columna_precio, "_", anio_base, "_", mes_base, "_transformada")
  
# Calcular precios reales
  data <- data %>%
    mutate(!!nuevo_nombre := .data[[columna_precio]] * ipc_base / .data[[columna_ipc]])
  
  return(data)
}

# Aplicar la función a cada serie de precios (base enero 2020)
precios_reales <- precios_mensual_filtrado %>%
convertir_a_precios_reales("precio_carbon", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_gas_natural", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_petroleo", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_gasolina", "ipc", 2023, 12)
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
names(precios_reales)
##  [1] "fecha"                                  
##  [2] "anio"                                   
##  [3] "mes"                                    
##  [4] "precio_carbon"                          
##  [5] "precio_gas_natural"                     
##  [6] "precio_petroleo"                        
##  [7] "precio_gasolina"                        
##  [8] "ipc"                                    
##  [9] "precio_carbon_2023_12_transformada"     
## [10] "precio_gas_natural_2023_12_transformada"
## [11] "precio_petroleo_2023_12_transformada"   
## [12] "precio_gasolina_2023_12_transformada"
precios_reales %>%
  select(fecha, starts_with("precio_carbon")) %>%
  head(10)
## # A tibble: 10 × 3
##    fecha      precio_carbon precio_carbon_2023_12_transformada
##    <date>             <dbl>                              <dbl>
##  1 2000-01-01          77.1                               264.
##  2 2000-02-01          80.8                               270.
##  3 2000-03-01          76.2                               250.
##  4 2000-04-01          74.7                               243.
##  5 2000-05-01          77.6                               251.
##  6 2000-06-01          78.3                               253.
##  7 2000-07-01          77.5                               251.
##  8 2000-08-01          74.4                               240.
##  9 2000-09-01          74.7                               240.
## 10 2000-10-01          77.5                               249.
View(precios_reales)

1.9. Aplicacion de la funcion del literal anterior con base a diciembre 2023

#Transformar
precios_reales_2023 <- precios_mensual_filtrado %>%
  convertir_a_precios_reales("precio_carbon", "ipc", 2023, 12) %>%
  convertir_a_precios_reales("precio_gas_natural", "ipc", 2023, 12) %>%
  convertir_a_precios_reales("precio_petroleo", "ipc", 2023, 12) %>%
  convertir_a_precios_reales("precio_gasolina", "ipc", 2023, 12)
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
names(precios_reales_2023)
##  [1] "fecha"                                  
##  [2] "anio"                                   
##  [3] "mes"                                    
##  [4] "precio_carbon"                          
##  [5] "precio_gas_natural"                     
##  [6] "precio_petroleo"                        
##  [7] "precio_gasolina"                        
##  [8] "ipc"                                    
##  [9] "precio_carbon_2023_12_transformada"     
## [10] "precio_gas_natural_2023_12_transformada"
## [11] "precio_petroleo_2023_12_transformada"   
## [12] "precio_gasolina_2023_12_transformada"
# Gráfico: petróleo nominal vs real; Base diciembre 2023
ggplot(precios_reales_2023, aes(x = fecha)) +
  geom_line(aes(y = precio_petroleo, 
                color = "Precio nominal")) +
  geom_line(aes(y = precio_petroleo_2023_12_transformada, 
                color = "Precio real (base dic-2023)")) +
  labs(title = "Evolución del precio del petróleo: nominal vs real (base dic-2023)",
       x = "Fecha", 
       y = "Precio",
       color = "Tipo de precio") +
  scale_color_manual(values = c("Precio nominal" = "red",
                                "Precio real (base dic-2023)" = "blue")) +
  theme_minimal()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).

# Visualización de resultados: precios de gasolina nominal vs real 

precios_reales_2023 %>%
  select(fecha, starts_with("precio_gasolina")) %>%
  head(10)
## # A tibble: 10 × 3
##    fecha      precio_gasolina precio_gasolina_2023_12_transformada
##    <date>               <dbl>                                <dbl>
##  1 2000-01-01            61.6                                 211.
##  2 2000-02-01            71.3                                 238.
##  3 2000-03-01            66.9                                 220.
##  4 2000-04-01            64.7                                 210.
##  5 2000-05-01            65.2                                 211.
##  6 2000-06-01            66.2                                 214.
##  7 2000-07-01            69.4                                 225.
##  8 2000-08-01            64.3                                 208.
##  9 2000-09-01            66.6                                 214.
## 10 2000-10-01            70.8                                 227.
summary(precios_reales_2023[, grepl("precio_gasolina", names(precios_reales_2023))])
##  precio_gasolina  precio_gasolina_2023_12_transformada
##  Min.   : 61.65   Min.   :150.7                       
##  1st Qu.: 87.29   1st Qu.:186.3                       
##  Median :108.46   Median :194.9                       
##  Mean   :109.17   Mean   :193.9                       
##  3rd Qu.:130.80   3rd Qu.:202.7                       
##  Max.   :166.10   Max.   :238.3                       
##                   NA's   :1

1.10. Exportacion de base de datos consolidada en un archivo csv

write_csv(precios_comb, "precios_consolidados.csv")
  1. Analisis de datos a partir de la base consolidad

    2.1. Tabla de estadisticas descriptivas

base <- read.csv("precios_consolidados.csv", header = TRUE, sep = ";")

# ===========================================
# 2.1 Estadísticas descriptivas: precios nominales y reales
# ===========================================

# Calcular precios reales 
precios_mensual <- precios_mensual %>%
  mutate(
    precio_carbon_real = precio_carbon / ipc * 100,
    precio_gas_natural_real = precio_gas_natural / ipc * 100,
    precio_petroleo_real = precio_petroleo / ipc * 100,
    precio_gasolina_real = precio_gasolina / ipc * 100
  )

# Variables a analizar
vars <- c("precio_carbon", "precio_gas_natural", "precio_petroleo", "precio_gasolina",
           "precio_carbon_real", "precio_gas_natural_real", "precio_petroleo_real", "precio_gasolina_real")

# Generar estadísticas descriptivas
tabla_estadisticas <- precios_mensual %>%
  summarise(across(all_of(vars),
                   list(
                     Observaciones = ~sum(!is.na(.)),
                     Promedio = ~mean(., na.rm = TRUE),
                     Min = ~min(., na.rm = TRUE),
                     Max = ~max(., na.rm = TRUE),
                     DesvEstandar = ~sd(., na.rm = TRUE)
                   ),
                   .names = "{.col}_{.fn}"
  ))

# Ordenar tabla final 
tabla_final <- data.frame(
  Variable = vars,
  Observaciones = as.numeric(tabla_estadisticas[1, grep("Observaciones", names(tabla_estadisticas))]),
  Promedio = as.numeric(tabla_estadisticas[1, grep("Promedio", names(tabla_estadisticas))]),
  Minimo = as.numeric(tabla_estadisticas[1, grep("Min", names(tabla_estadisticas))]),
  Maximo = as.numeric(tabla_estadisticas[1, grep("Max", names(tabla_estadisticas))]),
  Desv_Estandar = as.numeric(tabla_estadisticas[1, grep("DesvEstandar", names(tabla_estadisticas))])
)

# mostrar tabla

kable(tabla_final, caption = "Tabla 2.1. Estadísticas descriptivas de precios nominales y reales de combustibles")
Tabla 2.1. Estadísticas descriptivas de precios nominales y reales de combustibles
Variable Observaciones Promedio Minimo Maximo Desv_Estandar
precio_carbon 289 96.97914 74.21067 123.1634 12.677787
precio_gas_natural 289 118.26501 98.64794 137.7059 8.372448
precio_petroleo 289 108.07939 91.24837 129.8050 7.984368
precio_gasolina 289 109.16889 61.64844 166.0969 25.773982
precio_carbon_real 288 129.60804 84.35153 196.0833 23.643155
precio_gas_natural_real 288 161.40814 91.97212 266.4538 40.201329
precio_petroleo_real 288 147.12141 84.15660 238.0556 35.605746
precio_gasolina_real 288 140.80407 109.43081 173.0489 10.242478

2.2 Grafica de dispersion de puntos

# ===========================================
# 2.2 Gráfica de dispersión precios reales
# ===========================================
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0     ✔ stringr 1.5.1
## ✔ purrr   1.1.0     ✔ tibble  3.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%()    masks ggplot2::%+%()
## ✖ psych::alpha()  masks ggplot2::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ tibble::view()  masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Filtrar datos para un año determinado 
anio_filtro <- 2023

datos_2023 <- precios_mensual %>%
  filter(anio == anio_filtro)

# Gráfica de dispersión

library(ggplot2)

ggplot(datos_2023, aes(x = precio_carbon_real, y = precio_gasolina_real)) +
  geom_point(color = "#1f78b4", size = 4, alpha = 0.8, shape = 21, fill = "#a6cee3", stroke = 0.8) +  # puntos con borde
  geom_smooth(method = "lm", se = TRUE, color = "#e31a1c", fill = "#fbb4b9", linewidth = 1.2) +     # línea de ajuste con banda de confianza
  labs(
    title = paste("Relación entre precios reales del carbón y gasolina en", anio_filtro),
    subtitle = "Gráfico de dispersión con línea de ajuste lineal",
    x = "Precio real del carbón (base IPC = 100)",
    y = "Precio real de la gasolina (base IPC = 100)",
    caption = "Fuente: Elaboración propia con base en datos consolidados"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 16, color = "#333333"),
    plot.subtitle = element_text(color = "#555555", size = 13),
    plot.caption = element_text(color = "#777777", size = 10),
    panel.grid.major = element_line(color = "gray85"),
    panel.grid.minor = element_blank(),
    axis.title = element_text(face = "bold", color = "#333333")
  )
## `geom_smooth()` using formula = 'y ~ x'

La gráfica muestra la relación entre el precio real del carbón y el precio real de la gasolina en 2023. Se observa una tendencia positiva suave, lo que indica que cuando el precio del carbón aumenta, el de la gasolina también tiende a subir. Sin embargo, la dispersión de los puntos sugiere que la relación es débil, ya que otros factores también influyen en los precios.

2.3 Presente una grafica de serie de tiemo real para todas las variables excepto IPC 
# Filtrar un año específico
anio_filtro <- 2023

datos_2023 <- precios_mensual %>%
  filter(anio == anio_filtro) %>%
  select(fecha, precio_carbon_real, precio_gas_natural_real,
         precio_petroleo_real, precio_gasolina_real) %>%
  pivot_longer(
    cols = starts_with("precio_"),
    names_to = "combustible",
    values_to = "precio_real"
  )

# Limpiar nombres para la leyenda
datos_2023 <- datos_2023 %>%
  mutate(combustible = case_when(
    combustible == "precio_carbon_real" ~ "Carbón",
    combustible == "precio_gas_natural_real" ~ "Gas Natural",
    combustible == "precio_petroleo_real" ~ "Petróleo",
    combustible == "precio_gasolina_real" ~ "Gasolina Corriente"
  ))

# Gráfica de serie de tiempo 
ggplot(datos_2023, aes(x = fecha, y = precio_real, color = combustible)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  labs(
    title = paste("Evolución mensual de los precios reales de combustibles en", anio_filtro),
    subtitle = "Valores reales ajustados por IPC (base 100)",
    x = "Mes",
    y = "Precio real (base IPC = 100)",
    color = "Combustible",
    caption = "Fuente: Elaboración propia con base en datos consolidados"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold"),
    plot.subtitle = element_text(color = "gray30"),
    legend.position = "bottom"
  )

La gráfica muestra la evolución mensual de los precios reales del Carbón, Gas Natural, Petróleo y Gasolina Corriente durante el año 2023, ajustados por el IPC. Se observa que la Gasolina Corriente mantiene los valores más altos a lo largo del año, con leves fluctuaciones que evidencian una tendencia ligeramente creciente. El Gas Natural presenta un comportamiento más inestable, con incrementos marcados a comienzos del año y descensos hacia el segundo semestre. El Petróleo se mantiene en niveles intermedios, destacando un repunte en julio, mientras que el Carbón exhibe los precios reales más bajos y una trayectoria estable. En conjunto, la gráfica refleja diferencias claras en la dinámica de cada combustible y sugiere que los precios responden tanto a factores del mercado internacional como a ajustes internos en los costos energéticos.