Ejercicio 1
1.1. Exploración inicial de la base de datos
# Definir directorio de trabajo y cargar bases
setwd("C:/Users/s05e11/Downloads/Taller 1610")
# 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)
1.2 Se creóo una función que agregó las fechas faltantes y retornó
con las fechas completas
# 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)
}
1.3 Sé aplicó lo anterior a cada una de las bases de precios
# 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")
1.4 Se unieron los datasets y permitió juntar precios y fechas en
una misma base de datos
# 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)
1.5 Se crearon las columnas que corresponden al mes y año de las
observaciones
# 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)))
1.6. Se presentan los resultados en una tabla
# 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"))
Porcentaje de valores faltantes por columna
|
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()
1.7 Se agregaron los precios diarios a valores promedio por mes y
año, además se ajustó la base solo para valores entre 2000 hasta enero
de 2024
# 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.
1.8 Se utilizó la ecuación para convertir precios nominales en
precios reales y se creó una función con los parámetros: una columna de
una serie de un precio de la base de datos, un año, un mes y la columna
del IPC de Colombia
# 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)
}
1.9. Se aplicó la función anterior para todos los bienes
# 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)
1.10. Se exportó la base consolidada en un archivo .csv
# Guardar la base de datos consolidada
write.csv(basedatos_consolidada, "basedatos_consolidada_transformados.csv", row.names = FALSE)
Ejercicio 2
2.1. Tabla de estadísticas descriptivas, donde se evidencia el
número de observaciones, promedio, min, max, desviació estandar de los
precios nominales y reales de los combustibles
# 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")
Estadísticas Descriptivas de los precios de los combustibles
|
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
|
2.2. Gráfica de dispersión
library(ggplot2)
library(dplyr)
# Filtro para un año específico
año_base <- 2023
basedatos_consolidada <- basedatos_consolidada %>%
filter(año == año_base)
# Gráfica de dispersión
ggplot(basedatos_consolidada, aes(
x = Carbon_2023_12_transformada,
y = Gasolina_2023_12_transformada)) +
geom_point(color = "steelblue", alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") +
labs(
title = paste("Relación entre precios reales de Carbón y Gasolina en", año_base),
x = "Precio real del carbón (base dic 2023)",
y = "Precio real de la gasolina (base dic 2023)",
caption = "Fuente: elaboración propia con base en datos de precios e IPC"
) +
theme_minimal(base_size = 12)
## `geom_smooth()` using formula = 'y ~ x'

2.3. Gráfica de serie de tiempo con el precio real del Carbón, Gas
Natural, Petróleo y Gasolina Corriente para el año
# Convertimos los datos a formato largo para graficar más fácilmente
library(tidyr)
library(dplyr)
datos_tiempo <- basedatos_consolidada %>%
select(año, mes,
Carbon_2023_12_transformada,
GasNatural_2023_12_transformada,
Gasolina_2023_12_transformada,
Petroleo_2023_12_transformada) %>%
pivot_longer(
cols = c(Carbon_2023_12_transformada,
GasNatural_2023_12_transformada,
Gasolina_2023_12_transformada,
Petroleo_2023_12_transformada),
names_to = "variable",
values_to = "precio_real"
)
# Ajuste de nombres más legibles (opcional)
datos_tiempo$variable <- gsub("_2023_12_transformada", "", datos_tiempo$variable)
# Gráfica de líneas de precios reales
library(ggplot2)
# Creamos una variable de fecha para el eje x
datos_tiempo <- datos_tiempo %>%
mutate(fecha = as.Date(paste(año, mes, "01", sep = "-")))
# Gráfico
ggplot(datos_tiempo, aes(x = fecha, y = precio_real, color = variable)) +
geom_line(size = 1) +
labs(
title = "Evolución de los precios reales del carbón, gas natural, gasolina y petróleo",
x = "Fecha",
y = "Precio real (base dic 2023)",
color = "Producto",
caption = "Fuente: elaboración propia con base en datos de precios e IPC"
) +
theme_minimal(base_size = 13) +
theme(
plot.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.

```