# Definir directorio de trabajo y cargar bases
setwd("C:/Users/s05e21/Downloads/Taller161025")
# 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)
La base de datos consolidada está compuesta por cinco variables principales: precio_carbon, precio_gas_natural, precio_petroleo, precio_gasolina y ipc, todas ellas expresadas en valores numéricos. Cada conjunto de datos incluye además una variable temporal (fecha), que permite el seguimiento mensual de los precios desde enero del año 2000 hasta enero de 2024, cubriendo un periodo de 24 años. En promedio, cada serie contiene alrededor de 288 observaciones, aunque algunas presentan valores faltantes (NA) —particularmente el IPC, con 24.906 observaciones faltantes debido a su extensión temporal más amplia. Las variables de precios están medidas en unidades monetarias nominales y muestran una evolución ascendente a lo largo del tiempo, con valores promedio que oscilan entre 96.9 y 118.3, dependiendo del tipo de combustible. En conjunto, la base permite realizar análisis comparativos y temporales de la evolución de los precios energéticos y su relación con la inflación en Colombia.
# 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)
Al aplicar la función que convierte precios nominales a precios
reales con base en diciembre de 2023, los valores
ajustados (por ejemplo
precio_gasolina_2023_12_transformada) resultan
significativamente mayores que los precios nominales
originales. Esto refleja que los precios de años anteriores, expresados
en moneda de su época, deben escalarse al nivel de poder adquisitivo de
diciembre de 2023 para eliminar el efecto inflacionario.
Por ejemplo, en el resumen obtenido:
| Variable | Mínimo | Media | Máximo |
|---|---|---|---|
precio_gasolina (nominal) |
61.65 | 109.17 | 166.10 |
precio_gasolina_2023_12_transformada (real, base
dic-2023) |
150.7 | 193.9 | 238.3 |
¿Cambian los resultados si se usa otro año-mes
base?
Sí. El ajuste depende directamente del valor del IPC en el
mes-año base. Cambiar el año-mes base modifica la
escala de los precios reales porque el factor
multiplicador (IPC_base / IPC_t) varía:
No obstante, las relaciones relativas entre series y las tendencias temporales se mantienen: la transformación altera niveles absolutos pero no las dinámicas o variaciones porcentuales entre periodos. En consecuencia, la elección del año-mes base afecta la interpretación en niveles (qué significa “100” unidades), pero no las conclusiones sobre tendencias o comparaciones relativas entre bienes.
# 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 |
# --- Cargar librerías ---
library(readr)
library(dplyr)
library(ggplot2)
# --- Cargar la base consolidada ---
ruta <- "C:/Users/s05e21/Downloads/TALLER BIG DATA/basedatos_consolidada_transformados.csv"
base <- read_csv(ruta)
## Rows: 289 Columns: 12
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (11): anio, mes, precio_carbon, precio_gas_natural, precio_petroleo, pr...
## 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.
# --- Filtrar por un año específico (por ejemplo 2023) ---
base_2023 <- base %>%
filter(anio == 2023)
# --- Gráfica de dispersión: precios reales de carbón vs gasolina ---
ggplot(base_2023, aes(x = precio_carbon_2023_12_transformada,
y = precio_gasolina_2023_12_transformada)) +
geom_point(color = "#2E86C1", alpha = 0.7) + # puntos de dispersión
geom_smooth(method = "lm", color = "#E74C3C", se = FALSE) + # línea de tendencia lineal
labs(
title = "Relación entre el precio real del carbón y la gasolina (Base dic-2023)",
subtitle = "Precios reales mensuales para el año 2023",
x = "Precio real del carbón (USD/tonelada)",
y = "Precio real de la gasolina (USD/barril)",
caption = "Fuente: Elaboración propia con base en datos consolidados"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 11),
axis.title = element_text(face = "bold")
)
## `geom_smooth()` using formula = 'y ~ x'
En la gráfica se observa la relación entre los precios reales del carbón y de la gasolina durante el año 2023, tomando como referencia valores constantes a precios de diciembre de 2023.
Los puntos azules representan los valores mensuales emparejados entre ambos productos, mientras que la línea roja muestra el ajuste lineal (tendencia promedio).
Si la pendiente de la línea es positiva, indica que a mayores precios del carbón también tienden a observarse precios más altos de la gasolina, sugiriendo una relación directa entre ambos combustibles.
Si la pendiente es casi nula o negativa, significa que no hay una correlación significativa entre los precios reales de estos bienes energéticos para ese año.
En general, esta visualización permite analizar la sincronía o independencia en la evolución de precios dentro del mercado energético, lo cual puede ser relevante para identificar efectos comunes de oferta, demanda o política energética.
library(readr)
library(dplyr)
library(tidyr)
library(ggplot2)
# --- Cargar base consolidada ---
ruta <- "C:/Users/s05e21/Downloads/TALLER BIG DATA/basedatos_consolidada_transformados.csv"
base <- read_csv(ruta)
## Rows: 289 Columns: 12
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (11): anio, mes, precio_carbon, precio_gas_natural, precio_petroleo, pr...
## 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.
# --- Filtrar por año 2023 ---
base_2023 <- base %>% filter(anio == 2023)
# --- Seleccionar variables reales de 2023 ---
base_2023_long <- base_2023 %>%
select(mes,
precio_carbon_2023_12_transformada,
precio_gas_natural_2023_12_transformada,
precio_petroleo_2023_12_transformada,
precio_gasolina_2023_12_transformada) %>%
pivot_longer(
cols = starts_with("precio"),
names_to = "combustible",
values_to = "precio_real"
)
# --- Renombrar para la gráfica ---
base_2023_long$combustible <- recode(base_2023_long$combustible,
"precio_carbon_2023_12_transformada" = "Carbón",
"precio_gas_natural_2023_12_transformada" = "Gas Natural",
"precio_petroleo_2023_12_transformada" = "Petróleo",
"precio_gasolina_2023_12_transformada" = "Gasolina Corriente"
)
# --- Gráfica de serie de tiempo ---
ggplot(base_2023_long, aes(x = mes, y = precio_real, color = combustible)) +
geom_line(size = 1) +
geom_point(size = 2, alpha = 0.8) +
labs(
title = "Evolución mensual de los precios reales de los combustibles - Año 2023",
subtitle = "Valores constantes (base diciembre 2023)",
x = "Mes",
y = "Precio real (USD)",
color = "Tipo de combustible",
caption = "Fuente: Elaboración propia con base en datos consolidados"
) +
scale_color_manual(values = c("Carbón" = "#1F77B4",
"Gas Natural" = "#2CA02C",
"Petróleo" = "#FF7F0E",
"Gasolina Corriente" = "#D62728")) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 11),
axis.title = element_text(face = "bold"),
legend.position = "bottom"
)
## 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.
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, expresados en valores constantes con base en diciembre de 2023.
Se observa que los precios del petróleo y la gasolina presentan mayor volatilidad y valores más altos en comparación con los del carbón y gas natural, lo que refleja su mayor sensibilidad a los cambios en los mercados internacionales de energía.
Por otro lado, el carbón mantiene un comportamiento más estable, posiblemente debido a contratos de largo plazo o menor exposición a variaciones externas.
En conjunto, la gráfica permite comparar la dinámica de los distintos combustibles y resalta la importancia de ajustar los precios a términos reales para identificar tendencias más precisas en el tiempo.