Ejercicio 1

1.1 Análisis descriptivo de la base de datos

# 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.

1.2 Función para explicitar las fechas faltantes

# 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 Aplicar la función completar_fechas a cada base 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.41.4 Unión de las bases en una sola

# 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 Creación de 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 Identificar porcentaje de valores faltantes en cada variable numérica

# 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 Agregación mensual y filtrado temporal de la base de datos

# 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 Convertir precios nominales en precios reales — convertir precios nominales en precios reales

# 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 Transformar todos los precios a valores reales con base diciembre 2023

# 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.

1.10 Base de datos consolidada

# Guardar la base de datos consolidada
write.csv(basedatos_consolidada, "basedatos_consolidada_transformados.csv", row.names = FALSE)

Ejercicio 2

2.1 Tabla de estadísticos descriptivas

# 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

# --- 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.

2.3 Gráfica de serie de tiempo con el precio real

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.