A continuación se presenta una descripción general de cada una de las bases de datos utilizadas en el análisis.
Esta base contiene información diaria sobre el precio del carbón. Presenta 8.579 observaciones y 2 variables: fecha (tipo texto, con formato AAAA-MM-DD) y precio_carbon (numérica continua, expresada en una unidad monetaria no especificada). Los registros comprenden un período aproximado desde el año 2000 en adelante. La base está estructurada en formato largo, donde cada fila representa el precio del carbón para un día determinado.
Esta base registra los precios diarios del gas natural, con 8.579 observaciones y 2 variables: fecha y precio_gas_natural. La primera corresponde a una fecha (tipo texto) y la segunda a un valor numérico continuo. Al igual que la anterior, cubre un rango temporal que inicia en el año 2000. Su estructura es simple y está lista para análisis temporal o comparación con otros energéticos.
Contiene los precios diarios de la gasolina, con 8.579 observaciones y 2 variables (fecha, precio_gasolina). La variable de fecha es de tipo texto y la de precio es numérica. El conjunto permite realizar estudios de tendencia, estacionalidad y variaciones diarias en el precio del combustible a lo largo del tiempo.
Registra los precios diarios del petróleo. Dispone de 8.579 observaciones y 2 variables: fecha y precio_petroleo. Las variables mantienen el mismo formato que las anteriores bases, facilitando su integración para análisis comparativos entre combustibles fósiles. El período cubierto también inicia en el año 2000.
Esta base contiene el Índice de Precios al Consumidor (IPC) con una frecuencia mensual, abarcando un extenso periodo desde 1954. Cuenta con 847 observaciones y 2 variables: fecha (tipo texto con formato AAAA-MM-DD) e ipc (numérica continua). Permite analizar la evolución histórica de la inflación o del poder adquisitivo a lo largo de las décadas.
# Cargar la base de IPC con el separador correcto y cambiar el formato decimal
ipc_df <- read_delim("IPC.csv", delim = ",", col_types = cols()) %>%
rename(fecha = 1, ipc = 2) %>% # Renombrar columnas
mutate(ipc = as.numeric(gsub(",", ".", ipc))) # Convertir IPC a numérico
# Guardar el archivo con el nuevo formato
write_csv(ipc_df, "IPC_formateado.csv")
# Cargar archivos
gasolina <- read.csv("clean_precios_gasolina.csv", stringsAsFactors = FALSE) %>%
rename(fecha = 1, Gasolina = 2)
petroleo <- read.csv("clean_precios_petroleo.csv", stringsAsFactors = FALSE) %>%
rename(fecha = 1, Petroleo = 2)
ipc <- read.csv("IPC_formateado.csv", stringsAsFactors = FALSE) %>%
rename(fecha = 1, IPC = 2)
carbon <- read.csv("clean_precios_carbon.csv", stringsAsFactors = FALSE) %>%
rename(fecha = 1, Carbon = 2)
gasnatural <- read.csv("clean_precios_gas_natural.csv", stringsAsFactors = FALSE) %>%
rename(fecha = 1, GasNatural = 2)
# Función para completar fechas faltantes
fecha_completa <- function(df, date_col, price_col) {
df[[date_col]] <- as.Date(df[[date_col]])
full_dates <- data.frame(seq(min(df[[date_col]], na.rm = TRUE),
max(df[[date_col]], na.rm = TRUE), by = "day"))
colnames(full_dates) <- date_col
df_complete <- full_dates %>%
left_join(df, by = date_col) %>%
arrange(.data[[date_col]])
return(df_complete)
}
# Se aplica la función a cada base
gasolina_completa <- fecha_completa(gasolina, "fecha", "Gasolina")
petroleo_completa <- fecha_completa(petroleo, "fecha", "Petroleo")
ipc_completa <- fecha_completa(ipc, "fecha", "IPC")
carbon_completa <- fecha_completa(carbon, "fecha", "Carbon")
gasnatural_completa <- fecha_completa(gasnatural, "fecha", "GasNatural")
# Unir bases con formato de columnas separadas por combustible
base_unida <- reduce(list(gasolina_completa, petroleo_completa, ipc_completa, carbon_completa, gasnatural_completa),
full_join, by = "fecha") %>%
arrange(fecha)
# Crear columnas de mes y año
base_unida <- base_unida %>%
mutate(mes = month(fecha),
año = year(fecha))
# Teniendo en cuenta que la base IPC contiene datos desde 1954, debemos filtrar la base
# para tener solo datos desde enero de 2000 hasta enero de 2024
base_unida <- base_unida %>%
filter(año >= 2000 & (año < 2024 | (año == 2024 & mes == 1)))
# Identificar valores faltantes en el precio de algún combustible (se deja por fuera
# el año, mes y el IPC ya que este es mensual y mostraría un porcentaje alto)
valores_faltantes <- base_unida %>%
summarise(across(where(is.numeric) & !all_of(c("año", "mes", "IPC")), ~mean(is.na(.)) * 100)) %>%
pivot_longer(cols = everything(), names_to = "Variable", values_to = "% faltante")
# Tabla Valores Faltantes
valores_faltantes %>%
kable("html", caption = "Porcentaje de valores faltantes por columna") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
| Variable | % faltante |
|---|---|
| Gasolina | 2.478118 |
| Petroleo | 2.478118 |
| Carbon | 2.478118 |
| GasNatural | 2.478118 |
# Agregar valores faltantes con el promedio mensual por combustible
base_unida <- base_unida %>%
group_by(año, mes) %>%
mutate(across(where(is.numeric), ~ifelse(is.na(.), mean(., na.rm = TRUE), .))) %>%
ungroup()
# Agregar información a valores promedios por mes y año
base_final_meses <- base_unida %>%
group_by(año, mes) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE)) %>%
ungroup()
## Warning: There was 1 warning in `summarise()`.
## i In argument: `across(where(is.numeric), mean, na.rm = TRUE)`.
## i In group 1: `año = 2000` `mes = 1`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
##
## # Previously
## across(a:b, mean, na.rm = TRUE)
##
## # Now
## across(a:b, \(x) mean(x, na.rm = TRUE))
## `summarise()` has grouped output by 'año'. You can override using the `.groups`
## argument.
# Función para convertir precios nominales a precios reales
convert_to_real <- function(price_col, year_base, month_base, ipc_col, df) {
ipc_base <- df %>% filter(año == year_base & mes == month_base) %>% pull({{ipc_col}})
if (length(ipc_base) == 0 || is.na(ipc_base)) {
stop("No se encontró un valor válido de IPC para el año-mes base especificado.")
}
real_price_col <- paste0(deparse(substitute(price_col)), "_", year_base, "_", month_base, "_transformada")
df <- df %>% mutate({{real_price_col}} := {{price_col}} * ipc_base / {{ipc_col}})
return(df)
}
# Aplicar función para convertir a precios reales con base en cualquier mes y año (definido)
año_base <- 2023
mes_base <- 12
basedatos_consolidada <- convert_to_real(Gasolina, año_base, mes_base, IPC, base_final_meses)
basedatos_consolidada <- convert_to_real(Petroleo, año_base, mes_base, IPC, basedatos_consolidada)
basedatos_consolidada <- convert_to_real(Carbon, año_base, mes_base, IPC, basedatos_consolidada)
basedatos_consolidada <- convert_to_real(GasNatural, año_base, mes_base, IPC, basedatos_consolidada)
# Guardar la base de datos consolidada
write.csv(basedatos_consolidada, "basedatos_consolidada_transformados.csv", row.names = FALSE)
# Inicialmente se filtran solo precios nominales y reales de combustibles
combustibles <- basedatos_consolidada %>%
select(año, mes, starts_with("Gasolina"), starts_with("Petroleo"), starts_with("Carbon"), starts_with("GasNatural"))
# Renombramos las variables con el sufijo "real y nominal"
colnames(combustibles) <- colnames(combustibles) %>%
str_replace("\\d{4}_\\d{2}_transformada", "") # Eliminar cualquier "AAAA_MM_transformada"
colnames(combustibles) <- ifelse(colnames(combustibles) %in% c("año", "mes"),
colnames(combustibles), # Mantener "Año" y "Mes" sin cambios
ifelse(str_detect(colnames(combustibles), "_"),
paste0(colnames(combustibles), "real"),
paste0(colnames(combustibles), "_nominal")))
# Se crea una base de estadísticas "Observaciones, Promedio, min, max y desviación"
estadisticas_combustibles <- combustibles %>%
summarise(across(c(starts_with("Gasolina"), starts_with("Petroleo"), starts_with("Carbon"), starts_with("GasNatural")), list(
"Observaciones" = ~sum(!is.na(.)),
"Promedio" = ~round(mean(., na.rm = TRUE),2),
"Mínimo" = ~round(min(., na.rm = TRUE),2),
"Máximo" = ~round(max(., na.rm = TRUE),2),
"Desviación estándar" = ~round(sd(., na.rm = TRUE),2)
), .names = "{.col},{.fn}"))
# Se ajusta el formato para crear la Tabla
estadisticas_combustibles <- estadisticas_combustibles %>%
pivot_longer(cols = everything(), names_to = c("Variable", "Estadística"), names_sep = ",") %>%
pivot_wider(names_from = Estadística, values_from = value)
# Se crea la Tabla
estadisticas_combustibles %>%
kable("html", caption = "Estadísticas Descriptivas de los precios de los combustibles") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(1, bold = TRUE, border_right = TRUE) %>%
row_spec(0, bold = TRUE, background = "#D3D3D3") %>%
scroll_box(height = "500px")
| Variable | Observaciones | Promedio | Mínimo | Máximo | Desviación estándar |
|---|---|---|---|---|---|
| Gasolina_nominal | 289 | 109.17 | 61.65 | 166.10 | 25.77 |
| Gasolina_real | 289 | 193.81 | 150.71 | 238.32 | 14.19 |
| Petroleo_nominal | 289 | 108.08 | 91.25 | 129.80 | 7.98 |
| Petroleo_real | 289 | 202.28 | 104.86 | 327.85 | 49.29 |
| Carbon_nominal | 289 | 96.98 | 74.21 | 123.16 | 12.68 |
| Carbon_real | 289 | 178.23 | 100.96 | 270.05 | 32.82 |
| GasNatural_nominal | 289 | 118.27 | 98.65 | 137.71 | 8.37 |
| GasNatural_real | 289 | 221.86 | 97.82 | 366.96 | 55.75 |
La tabla presenta un resumen de los principales indicadores estadísticos de los precios del carbón, gas natural, petróleo y gasolina, tanto en términos nominales (precios sin ajustar por inflación) como reales (precios ajustados por el Índice de Precios al Consumidor – IPC).
Cada variable cuenta con 289 observaciones, lo que sugiere una periodicidad mensual o semanal consistente a lo largo del período de análisis.
En general, se observa que:
Gasolina_real presenta un promedio de 193.81 y una desviación estándar de 14.19, lo que indica una moderada variabilidad en su precio real durante el periodo analizado.
Petróleo_real muestra un promedio más alto (202.28) y una mayor dispersión (49.29), evidenciando una alta volatilidad de su precio en el mercado internacional.
Carbón_real tiene un promedio de 178.23 y una desviación estándar de 32.82, mostrando también fluctuaciones significativas, aunque menores que las del petróleo.
GasNatural_real alcanza el mayor promedio (221.86) y la mayor desviación estándar (55.75), reflejando precios más elevados y con alta variabilidad en términos reales.
Al comparar los precios nominales y reales, se aprecia que los precios reales son sistemáticamente mayores, lo cual es coherente con el ajuste por inflación: el poder adquisitivo del dinero disminuye con el tiempo, y al ajustar los valores, los precios se expresan en términos constantes.
En resumen, los combustibles presentan comportamientos distintos:
El petróleo y el gas natural son los más volátiles, probablemente por su relación con factores internacionales y geopolíticos.
La gasolina y el carbón tienen variaciones más controladas, posiblemente debido a regulaciones locales o estructuras de precios internas.
# Librerías necesarias
library(dplyr)
library(ggplot2)
library(readr)
# 1️⃣ Cargar los datasets
carbon <- read_csv("clean_precios_carbon.csv")
## Rows: 8579 Columns: 2
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (1): precio_carbon
## date (1): fecha
##
## i Use `spec()` to retrieve the full column specification for this data.
## i 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
##
## i Use `spec()` to retrieve the full column specification for this data.
## i 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
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2️⃣ Crear índice relativo del IPC
ipc_base <- ipc %>%
mutate(ipc_rel = ipc / first(ipc))
# 3️⃣ Calcular precios reales de cada combustible
carbon_real <- carbon %>%
left_join(ipc_base, by = "fecha") %>%
mutate(precio_real_carbon = precio_carbon / ipc_rel)
gasolina_real <- gasolina %>%
left_join(ipc_base, by = "fecha") %>%
mutate(precio_real_gasolina = precio_gasolina / ipc_rel)
# 4️⃣ Unir ambos dataframes por la fecha
datos <- carbon_real %>%
inner_join(gasolina_real, by = "fecha")
# 5️⃣ Filtrar por año (por ejemplo 2020)
datos_2020 <- datos %>%
filter(format(as.Date(fecha), "%Y") == "2020")
# 6️⃣ Gráfica de dispersión con línea de ajuste lineal
ggplot(datos_2020, aes(x = precio_real_carbon, y = precio_real_gasolina)) +
geom_point(color = "steelblue", size = 2.5, alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, color = "darkred", linetype = "dashed") +
labs(
title = "Relación entre el precio real del Carbón y la Gasolina Corriente (2020)",
subtitle = "Precios ajustados por IPC",
x = "Precio real del Carbón",
y = "Precio real de la Gasolina Corriente",
caption = "Fuente: Elaboración propia con datos ajustados por IPC"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 11),
axis.title = element_text(size = 12)
)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 341 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 341 rows containing missing values or values outside the scale range
## (`geom_point()`).
La gráfica de dispersión permite visualizar la relación existente entre el precio real del carbón (eje X) y el precio real de la gasolina corriente (eje Y), ambos ajustados por el Índice de Precios al Consumidor (IPC) para reflejar valores constantes y comparables a lo largo del tiempo.
Cada punto azul representa una observación mensual del año 2020. La línea punteada roja corresponde a una línea de tendencia lineal, la cual presenta una pendiente positiva suave. Esto indica que, en general, a medida que aumenta el precio real del carbón, también tiende a incrementarse el precio real de la gasolina corriente, aunque la relación es moderada y no perfectamente lineal.
La dispersión de los puntos alrededor de la línea sugiere que existen otros factores económicos que influyen en los precios de ambos combustibles, tales como la demanda global, los costos de transporte o las políticas de subsidios.
# --- 1. Librerías necesarias ---
library(dplyr)
library(ggplot2)
library(readr)
library(tidyr)
# --- 2. Definir ruta donde están los CSV ---
ruta <- "C:/Users/s05e02/Downloads/"
# --- 3. Cargar archivos ---
gasolina <- read_csv(paste0(ruta, "clean_precios_gasolina.csv"))
## Rows: 8579 Columns: 2
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (1): precio_gasolina
## date (1): fecha
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
petroleo <- read_csv(paste0(ruta, "clean_precios_petroleo.csv"))
## Rows: 8579 Columns: 2
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (1): precio_petroleo
## date (1): fecha
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
carbon <- read_csv(paste0(ruta, "clean_precios_carbon.csv"))
## Rows: 8579 Columns: 2
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (1): precio_carbon
## date (1): fecha
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
gas_natural <- read_csv(paste0(ruta, "clean_precios_gas_natural.csv"))
## Rows: 8579 Columns: 2
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (1): precio_gas_natural
## date (1): fecha
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
ipc <- read_csv(paste0(ruta, "ipc.csv"))
## Rows: 847 Columns: 2
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (1): ipc
## date (1): fecha
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
# --- 4. Función para ajustar precio real ---
ajustar_precio_real <- function(df, col_precio) {
df <- df %>%
rename(precio = !!col_precio) %>% # renombrar columna a "precio"
inner_join(ipc, by = "fecha") %>%
mutate(ipc_rel = ipc / first(ipc),
precio_real = precio / ipc_rel) %>%
select(fecha, precio_real)
return(df)
}
# --- 5. Aplicar ajuste a cada combustible ---
gasolina_real <- ajustar_precio_real(gasolina, "precio_gasolina")
petroleo_real <- ajustar_precio_real(petroleo, "precio_petroleo")
carbon_real <- ajustar_precio_real(carbon, "precio_carbon")
gas_natural_real <- ajustar_precio_real(gas_natural, "precio_gas_natural")
# --- 6. Unir todos los datos en formato largo ---
datos_long <- gasolina_real %>% rename(Gasolina = precio_real) %>%
inner_join(petroleo_real %>% rename(Petroleo = precio_real), by = "fecha") %>%
inner_join(carbon_real %>% rename(Carbon = precio_real), by = "fecha") %>%
inner_join(gas_natural_real %>% rename(Gas_Natural = precio_real), by = "fecha") %>%
pivot_longer(cols = -fecha, names_to = "Combustible", values_to = "Precio_Real")
# --- 7. Filtrar año deseado ---
anio_deseado <- "2020"
datos_long <- datos_long %>%
mutate(anio = format(as.Date(fecha), "%Y")) %>%
filter(anio == anio_deseado)
# --- 8. Gráfica de serie de tiempo ---
ggplot(datos_long, aes(x = fecha, y = Precio_Real, color = Combustible)) +
geom_line(linewidth = 1) +
labs(
title = paste("Evolución de los precios reales de combustibles (", anio_deseado, ")", sep = ""),
subtitle = "Precios ajustados por IPC",
x = "Fecha",
y = "Precio real",
color = "Combustible",
caption = "Fuente: Datos propios ajustados por IPC"
) +
theme_minimal() +
scale_color_manual(values = c("Gasolina"="steelblue", "Petroleo"="darkred", "Carbon"="forestgreen", "Gas_Natural"="orange")) +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 11),
axis.title = element_text(size = 12)
)
La gráfica muestra la evolución mensual de los precios reales ajustados por IPC de los principales combustibles: carbón, gas natural, gasolina corriente y petróleo durante el año 2020. Este ajuste permite comparar los valores en términos constantes, eliminando el efecto de la inflación.
Se observa que los precios de todos los combustibles presentan una alta volatilidad a lo largo del año, reflejando los efectos de la coyuntura económica global ocasionada por la pandemia del COVID-19, que generó caídas abruptas en la demanda y fluctuaciones en los mercados energéticos internacionales.
Gasolina (línea azul): muestra el precio más alto y estable dentro del periodo, especialmente hacia finales de 2020, lo que refleja su dependencia directa del precio del petróleo y su demanda sostenida en el mercado interno.
Petróleo (línea roja): evidencia fuertes caídas a inicios de 2020, seguidas de recuperaciones irregulares, comportamiento coherente con las fluctuaciones observadas en los mercados internacionales durante ese año.
Gas natural (línea amarilla): presenta variaciones moderadas pero con picos notables en el segundo semestre, posiblemente asociados a ajustes en costos de transporte o producción.
Carbón (línea verde): mantiene los valores más bajos, con incrementos leves hacia el tercer trimestre del año, lo que sugiere estabilidad relativa frente a los otros combustibles.
En conjunto, la gráfica refleja que los precios reales de los combustibles no se comportan de manera uniforme, aunque todos responden a factores macroeconómicos comunes, como la inflación, la demanda energética y la dinámica del mercado internacional de hidrocarburos.