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
## 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
## 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
## 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
## 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,
## 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
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)
}
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
## 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~
## # 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
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>
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)
}
## 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"
| 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.
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'
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.
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.
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.
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.
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.
| 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. |
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.