1.1 DESCRIPCIÓN y EXPLORACION DE LOS DATOS

Se cuenta con varias bases de datos que cuentan con informacion del precio del Petroleo Bren, del Gas natural, del Carbon, Gasolina Motor Correiente y finalmente del IPC para Colombia,

Los datos de carbon, gas natural, gasolina y petroleo son datos condos variables, y con estacionalidad diaria, mientras que la estacionalidad del IPC es mensual

  1. 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~
##      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
## Número de observaciones: 8579
## Rango de fechas: 10957 a 19723
## Número de fechas faltantes: 4
## Fechas faltantes:
## # A tibble: 4 x 1
##   fecha     
##   <date>    
## 1 2004-05-01
## 2 2005-07-01
## 3 2007-09-01
## 4 2020-02-01
  1. 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~
##      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
## Número de observaciones: 8579
## Rango de fechas: 10957 a 19723
## Número de fechas faltantes: 5
  1. 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~
##      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
## Número de observaciones: 8579
## Rango de fechas: 10957 a 19723
## Número de fechas faltantes: 3
  1. 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, ~
##      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
## Número de observaciones: 8579
## Rango de fechas: 10957 a 19723
## Número de fechas faltantes: 7

Como se observa, todas las bases de datos anteriores cuantan con 2 variables, estan en dias y cuantan con 8579 observaciones,

  1. 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~
##      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
## Número de observaciones: 847
## Rango de fechas: -5633 a 20119
## Número de fechas faltantes: 352

1.2 creacion funcion que tenga como parametros un data frame:

library(dplyr)
library(tidyr)
library(rlang)
## 
## Adjuntando el paquete: 'rlang'
## The following objects are masked from 'package:purrr':
## 
##     %@%, flatten, flatten_chr, flatten_dbl, flatten_int, flatten_lgl,
##     flatten_raw, invoke, splice
completar_fechas <- function(df, fecha_col, precio_col, frecuencia = "day") {
  # Convertir los nombres de columna a símbolos
  fecha_col <- ensym(fecha_col)
  precio_col <- ensym(precio_col)
  
  # Asegurar formato de fecha
  df <- df %>%
    mutate(!!fecha_col := as.Date(!!fecha_col))
  
  # Crear secuencia completa de fechas según la frecuencia elegida
  fechas_completas <- tibble(
    !!fecha_col := seq(
      from = min(df[[as_name(fecha_col)]], na.rm = TRUE),
      to   = max(df[[as_name(fecha_col)]], na.rm = TRUE),
      by   = frecuencia
    )
  )
  
  # Combinar con el dataset original
  df_completo <- fechas_completas %>%
    left_join(df, by = as_name(fecha_col)) %>%
    arrange(!!fecha_col)
  
  return(df_completo)
}

1.3

carbon_completo
## # A tibble: 8,767 x 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-04          NA  
##  5 2000-01-05          79.7
##  6 2000-01-06          91.5
##  7 2000-01-07          69.8
##  8 2000-01-08          NA  
##  9 2000-01-09          75.8
## 10 2000-01-10          99.5
## # i 8,757 more rows
gas_natural_completo
## # A tibble: 8,767 x 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
## # i 8,757 more rows
gasolina_completo
## # A tibble: 8,767 x 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
## # i 8,757 more rows
petroleo_completo
## # A tibble: 8,767 x 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
## # i 8,757 more rows
ipc_completo
## # A tibble: 25,753 x 2
##    fecha        ipc
##    <date>     <dbl>
##  1 1954-07-31  0.03
##  2 1954-08-01 NA   
##  3 1954-08-02 NA   
##  4 1954-08-03 NA   
##  5 1954-08-04 NA   
##  6 1954-08-05 NA   
##  7 1954-08-06 NA   
##  8 1954-08-07 NA   
##  9 1954-08-08 NA   
## 10 1954-08-09 NA   
## # i 25,743 more rows

1.4 Se unifican las tablas en una sola base de datos

## Rows: 25,753
## Columns: 6
## $ fecha              <date> 1954-07-31, 1954-08-01, 1954-08-02, 1954-08-03, 19~
## $ precio_carbon      <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ precio_gas_natural <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ precio_gasolina    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ precio_petroleo    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ ipc                <dbl> 0.03, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N~

1.5

1.6

## # A tibble: 6 x 2
##   variable                   porcentaje_faltante
##   <chr>                                    <dbl>
## 1 porc_na_precio_carbon                     66.7
## 2 porc_na_precio_gas_natural                66.7
## 3 porc_na_precio_gasolina                   66.7
## 4 porc_na_precio_petroleo                   66.7
## 5 porc_na_ipc                               96.7
## 6 porc_na_año                                0

Sustitucion de datos faltantes por el promedio del mes del año del bien

##              fecha      precio_carbon precio_gas_natural    precio_gasolina 
##                  0              16956              16956              16956 
##    precio_petroleo                ipc                mes                año 
##              16956              24906                  0                  0

1.7

Base promedio:

## `summarise()` has grouped output by 'año'. You can override using the `.groups`
## argument.
## # A tibble: 6 x 11
##     año mes     precio_carbon precio_gas_natural precio_gasolina precio_petroleo
##   <dbl> <ord>           <dbl>              <dbl>           <dbl>           <dbl>
## 1  2000 enero            77.1               101.            61.6            95.9
## 2  2000 febrero          80.8               104.            71.3            92.7
## 3  2000 marzo            76.2               112.            66.9            94.6
## 4  2000 abril            74.7               106.            64.7            93.9
## 5  2000 mayo             77.6               111.            65.2            91.4
## 6  2000 junio            78.3               107.            66.2            92.0
## # i 5 more variables: IPC <dbl>, precio_carbon_real <dbl>,
## #   precio_gas_natural_real <dbl>, precio_gasolina_real <dbl>,
## #   precio_petroleo_real <dbl>

1.8 Transformación de precios nominales a reales

transformar_precios <- function(df, columna_precio, anio_base, mes_base, columna_ipc) {
  # Normalizar nombres de columnas (sin acentos ni mayúsculas)
  nombres <- names(df)
  nombres_limpios <- iconv(nombres, to = "ASCII//TRANSLIT") # "año" -> "ano"
  nombres_limpios <- tolower(nombres_limpios)
  names(df) <- nombres_limpios

  # Detectar nombre de año y mes
  col_anio <- if ("anio" %in% names(df)) "anio" else if ("ano" %in% names(df)) "ano" else stop("No se encontró columna de año ('anio' o 'año').")
  col_mes <- if ("mes" %in% names(df)) "mes" else stop("No se encontró columna 'mes'.")

  # Detectar IPC con independencia de mayúsculas
  col_ipc <- names(df)[tolower(names(df)) == tolower(columna_ipc)]
  if (length(col_ipc) == 0) stop(paste("No se encontró la columna IPC:", columna_ipc))

  # IPC base
  ipc_base <- df %>%
    filter(.data[[col_anio]] == anio_base, .data[[col_mes]] == mes_base) %>%
    summarise(ipc_base = mean(.data[[col_ipc]], na.rm = TRUE)) %>%
    pull(ipc_base)

  if (length(ipc_base) == 0 || is.na(ipc_base)) {
    stop("No se encontró un valor de IPC válido para el año y mes base indicados.")
  }

  # Nombre de columna de salida
  nuevo_nombre <- paste0(columna_precio, "_reales")

  # Cálculo
  df <- df %>%
    mutate(!!nuevo_nombre := .data[[columna_precio]] * ipc_base / .data[[col_ipc]])

  return(df)
}

1.9 Definir año y mes base explícitos

## Rows: 288
## Columns: 11
## $ ano                       <dbl> 2000, 2000, 2000, 2000, 2000, 2000, 2000, 20~
## $ mes                       <ord> enero, febrero, marzo, abril, mayo, junio, j~
## $ precio_carbon             <dbl> 77.14800, 80.84513, 76.15327, 74.68102, 77.6~
## $ precio_gas_natural        <dbl> 100.88929, 103.81583, 111.72406, 105.95752, ~
## $ precio_gasolina           <dbl> 61.64844, 71.34806, 66.94471, 64.65914, 65.1~
## $ precio_petroleo           <dbl> 95.93641, 92.69394, 94.61639, 93.94664, 91.3~
## $ ipc                       <dbl> 40.30, 41.23, 41.93, 42.35, 42.57, 42.56, 42~
## $ precio_carbon_reales      <dbl> 81.45528, 83.43343, 77.27931, 75.03370, 77.5~
## $ precio_gas_natural_reales <dbl> 106.52207, 107.13955, 113.37607, 106.45791, ~
## $ precio_gasolina_reales    <dbl> 65.09035, 73.63230, 67.93459, 64.96450, 65.1~
## $ precio_petroleo_reales    <dbl> 101.29267, 95.66158, 96.01544, 94.39031, 91.~
## Rows: 288
## Columns: 11
## $ ano                       <dbl> 2000, 2000, 2000, 2000, 2000, 2000, 2000, 20~
## $ mes                       <ord> enero, febrero, marzo, abril, mayo, junio, j~
## $ precio_carbon             <dbl> 77.14800, 80.84513, 76.15327, 74.68102, 77.6~
## $ precio_gas_natural        <dbl> 100.88929, 103.81583, 111.72406, 105.95752, ~
## $ precio_gasolina           <dbl> 61.64844, 71.34806, 66.94471, 64.65914, 65.1~
## $ precio_petroleo           <dbl> 95.93641, 92.69394, 94.61639, 93.94664, 91.3~
## $ ipc                       <dbl> 40.30, 41.23, 41.93, 42.35, 42.57, 42.56, 42~
## $ precio_carbon_reales      <dbl> 81.45528, 83.43343, 77.27931, 75.03370, 77.5~
## $ precio_gas_natural_reales <dbl> 106.52207, 107.13955, 113.37607, 106.45791, ~
## $ precio_gasolina_reales    <dbl> 65.09035, 73.63230, 67.93459, 64.96450, 65.1~
## $ precio_petroleo_reales    <dbl> 101.29267, 95.66158, 96.01544, 94.39031, 91.~
## [1] "año"                "mes"                "precio_carbon"     
## [4] "precio_gas_natural" "precio_gasolina"    "precio_petroleo"   
## [7] "IPC"

1.10

EJERCICIO 2 - ANALISI DE DATOS Y PRESENTACION DE INFORME

Punto 2.1

Estadísticas Descriptivas de los precios de los combustibles
Variable Observaciones Promedio Minimo Maximo Desviacion
carbon 288 96.96 74.21 123.16 12.70
carbon_reales 288 55.15 35.89 83.43 10.06
gas_natural 288 118.33 98.65 137.71 8.31
gas_natural_reales 288 68.68 39.13 113.38 17.11
gasolina 288 108.97 61.65 158.90 25.60
gasolina_reales 288 59.91 46.56 73.63 4.36
petroleo 288 108.09 91.25 129.80 8.00
petroleo_reales 288 62.60 35.81 101.29 15.15

El análisis de las estadísticas descriptivas muestra que los precios de los combustibles en Colombia presentan diferencias importantes entre sus valores nominales y reales. Todos los combustibles cuentan con 288 observaciones, lo que indica una cobertura completa en la serie temporal analizada. Al ajustar los precios por inflación, se observa que los valores reales son significativamente menores que los nominales; por ejemplo, el precio promedio del carbón pasa de 96.96 a 55.15, y el de la gasolina de 108.97 a 59.91, reflejando una reducción de aproximadamente 40–45% y evidenciando el efecto de la inflación acumulada durante el periodo estudiado.

En cuanto a la dispersión, los precios reales muestran comportamientos distintos según el combustible. La gasolina presenta la menor variabilidad relativa (desviación estándar = 4.36), lo que sugiere estabilidad en su precio real, posiblemente por regulación local. Por otro lado, el gas natural y el petróleo muestran alta dispersión en precios reales (SD = 17.11 y 15.15 respectivamente), indicando sensibilidad a factores internacionales y fluctuaciones de oferta y demanda. En general, el ajuste por IPC permite comparar de manera más precisa la evolución de los precios a lo largo del tiempo y comprender las verdaderas tendencias del mercado.

Punto 2.2

library(ggplot2)
library(dplyr)

# Filtrar un año específico
datos_2023 <- base_transformada %>% filter(ano == 2023)

ggplot(datos_2023, aes(x = precio_carbon_reales, y = precio_gasolina_reales)) +
  geom_point(color = "#FFCC00", alpha = 0.6) +
  geom_smooth(method = "lm", se = TRUE, color = "#003366") +
  labs(
    title = "Relación entre precio real del carbón y gasolina (2023)",
    x = "Precio real del carbón",
    y = "Precio real de la gasolina"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Análisis del Gráfico: Relación entre precio real del carbón y gasolina (2023)

Este gráfico muestra la relación entre el precio real del carbón y el precio real de la gasolina en el año 2023.

Resumen del Análisis

El gráfico de dispersión, con una línea de regresión y una banda de confianza, indica una correlación positiva débil entre ambas variables.

Variables

  • Eje X: Precio real del carbón.
  • Eje Y: Precio real de la gasolina.

Observación de la Tendencia

La línea de regresión muestra una tendencia al alza muy leve, sugiriendo que un aumento en el precio del carbón está marginalmente asociado con un aumento en el precio de la gasolina. Sin embargo, la banda de confianza es muy ancha y la dispersión de los puntos es alta, lo que subraya la falta de una relación lineal fuerte y consistente.


El gráfico presentado ilustra la relación entre el precio real del carbón (eje X) y el precio real de la gasolina (eje Y) durante el año 2023, mostrando una ligera tendencia positiva indicada por la línea de regresión. A pesar de esta tendencia, la dispersión de los puntos de datos es notablemente amplia, y la banda de confianza gris es extensa, lo que sugiere que el precio real del carbón no establece una correlación fuerte ni constante con el precio real de la gasolina en este período, indicando que otros factores probablemente influyen más en las variaciones del precio de la gasolina.

Punto 2.3

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

# Filtrar un año específico
datos_2023 <- base_transformada %>% filter(ano == 2023)

# Transformar a formato largo
datos_largos <- datos_2023 %>%
  select(mes, precio_carbon_reales, precio_gas_natural_reales, precio_gasolina_reales, precio_petroleo_reales) %>%
  pivot_longer(cols = -mes, names_to = "combustible", values_to = "precio")

colores_uc <- c(
  "precio_carbon_reales"      = "#003366",
  "precio_gas_natural_reales" = "#FFCC00",
  "precio_gasolina_reales"    = "#6699CC",
  "precio_petroleo_reales"    = "#666666"
)


ggplot(datos_largos, aes(x = mes, y = precio, color = combustible, group = combustible)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  scale_color_manual(values = colores_uc) +
  labs(
    title = "Serie de tiempo de precios reales de combustibles (2023)",
    x = "Mes",
    y = "Precio real",
    color = "Combustible"
  ) +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## i Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Análisis de la Serie de Tiempo: Precios Reales de Combustibles (2023)

Este gráfico es una serie de tiempo que compara la evolución de los precios reales de cuatro combustibles (carbón, gas natural, gasolina y petróleo) a lo largo de los meses de 2023.

Tendencias de Precios por Combustible

Combustible Rango Aproximado de Precios Tendencia a lo largo de 2023
Gasolina (azul claro) 46.5 a 50.0 Muestra el precio real más alto consistentemente. Pico anual en septiembre.
Gas Natural (amarillo) 39.0 a 44.5 Mostró gran volatilidad con picos en febrero/abril y noviembre.
Petróleo (gris) 36.0 a 41.5 Rango de precios intermedio, con su pico en julio.
Carbón (azul oscuro) 36.5 a 38.0 Registró el precio real más bajo y se mantuvo relativamente estable.

Relaciones Clave Observadas

  • Liderazgo de Precios: La gasolina se mantuvo como el combustible más caro en términos reales durante todo el año.
  • Volatilidad: El gas natural es el más volátil, con las mayores fluctuaciones entre meses.
  • Estabilidad Relativa: El carbón presentó las variaciones más pequeñas y el precio más bajo.

En resumen, el 2023 estuvo marcado por precios de gasolina elevados y un mercado de gas natural muy inestable, mientras que el carbón se mantuvo consistentemente en el rango de precios más bajo.