# Definir directorio de trabajo y cargar bases
setwd("C:/Users/s05e18/Downloads/clase big data")
# 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)
#Gasolina
str(gasolina)
## 'data.frame': 8579 obs. of 2 variables:
## $ fecha : chr "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-04" ...
## $ Gasolina: num 85.2 58.8 62.4 48.6 43.8 ...
summary(gasolina)
## fecha Gasolina
## Length:8579 Min. : 41.52
## Class :character 1st Qu.: 87.12
## Mode :character Median :108.66
## Mean :108.94
## 3rd Qu.:130.73
## Max. :176.34
#Petróleo
str(petroleo)
## 'data.frame': 8579 obs. of 2 variables:
## $ fecha : chr "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-04" ...
## $ Petroleo: num 77.7 108.4 118.8 105.7 115.3 ...
summary(petroleo)
## fecha Petroleo
## Length:8579 Min. : 70.39
## Class :character 1st Qu.: 95.55
## Mode :character Median :107.98
## Mean :108.09
## 3rd Qu.:120.71
## Max. :145.87
#Carbón
str(carbon)
## 'data.frame': 8579 obs. of 2 variables:
## $ fecha : chr "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-05" ...
## $ Carbon: num 56.8 84.1 70.7 79.7 91.5 ...
summary(carbon)
## fecha Carbon
## Length:8579 Min. : 50.98
## Class :character 1st Qu.: 83.23
## Mode :character Median : 97.19
## Mean : 96.96
## 3rd Qu.:110.67
## Max. :142.97
#Gas Natural
str(gasnatural)
## 'data.frame': 8579 obs. of 2 variables:
## $ fecha : chr "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-04" ...
## $ GasNatural: num 134.1 102.8 72.7 101.5 133.8 ...
summary(gasnatural)
## fecha GasNatural
## Length:8579 Min. : 70.78
## Class :character 1st Qu.:100.59
## Mode :character Median :118.36
## Mean :118.31
## 3rd Qu.:135.65
## Max. :165.38
#IPC
str(ipc)
## 'data.frame': 847 obs. of 2 variables:
## $ fecha: chr "1954-07-31" "1954-08-31" "1954-09-30" "1954-10-31" ...
## $ IPC : num 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 0.03 ...
summary(ipc)
## fecha IPC
## Length:847 Min. : 0.03
## Class :character 1st Qu.: 0.14
## Mode :character Median : 5.60
## Mean : 32.37
## 3rd Qu.: 64.08
## Max. :146.24
#Interpretación Los resultados muestran que las cinco bases de datos fueron cargadas correctamente, con un número similar de observaciones para los precios de los energéticos (8.579 registros) y una menor cantidad para el IPC (847 registros), debido a su frecuencia mensual o trimestral.
Gasolina: presenta valores entre 41,52 y 176,34, con un promedio de 108,94. Esto refleja una alta volatilidad en el precio del combustible durante el periodo analizado (2000–2024), probablemente asociada a variaciones internacionales del petróleo y políticas internas de subsidios o impuestos.
Petróleo: oscila entre 70,39 y 145,87, con un promedio de 108,09, evidenciando una tendencia similar a la de la gasolina, lo cual anticipa una relación positiva entre ambos precios.
Carbón: tiene valores entre 50,98 y 142,97, con un promedio de 96,96, lo que sugiere una evolución más estable frente al petróleo y la gasolina.
Gas natural: registra precios entre 70,78 y 165,38, con un promedio de 118,31, siendo el energético con mayor valor medio durante el periodo analizado.
IPC: presenta valores entre 0,03 y 146,24, lo que confirma su largo rango temporal (desde 1954 hasta 2024), siendo útil para ajustar las series de precios a términos reales.
# 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)
}
carbon_completo <- fecha_completa(carbon, "fecha", "Carbon")
# Mostrar las primeras filas
head(carbon_completo)
#Interpretación general para el informe
La función aplicada permitió reconstruir una serie temporal completa y continua del precio real del carbón. De esta manera, se garantiza que no existan saltos o fechas perdidas, lo cual es esencial para realizar análisis econométricos y visualizaciones correctas.
El resultado evidencia que algunas fechas no contaban con registro de precios (representadas por NA), mostrando la importancia de este proceso previo de depuración antes de estimar modelos o graficar tendencias.
# 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 |
##2.2
# Parámetro: año a graficar
anio_graf <- 2012
# Asignar manualmente las columnas correctas
carbon_col <- "Carbon"
gasolina_col <- "Gasolina"
# Filtrar por año y quitar NAs
df_plot <- base_unida %>%
filter(año == anio_graf) %>%
select(fecha, mes, año, all_of(carbon_col), all_of(gasolina_col)) %>%
rename(carbon = all_of(carbon_col), gasolina = all_of(gasolina_col)) %>%
filter(!is.na(carbon) & !is.na(gasolina))
# Mensaje si no hay datos
if(nrow(df_plot) == 0){
stop("No hay observaciones para ese año después de filtrar NAs. Revisa la columna año o la disponibilidad de datos.")
}
# Ajuste lineal
fit <- lm(gasolina ~ carbon, data = df_plot)
fit_sum <- summary(fit)
r2 <- fit_sum$r.squared
pval <- coef(fit_sum)[2,4] # p-value del coeficiente de carbon
# Preparar etiqueta con estadísticas
label_text <- paste0("n = ", nrow(df_plot),
"\nR² = ", formatC(r2, digits = 3, format = "f"),
"\nP (slope) = ", formatC(pval, digits = 3, format = "e"))
# Gráfica
ggplot(df_plot, aes(x = carbon, y = gasolina)) +
geom_point(size = 2.3, alpha = 0.8, color = "blue") + # puntos azules
geom_smooth(method = "lm", se = TRUE, color = "red", linetype = "solid") +
labs(
title = paste0("Relación entre precio del carbón (X) y gasolina (Y) — ", anio_graf),
subtitle = "Puntos: observaciones del año seleccionado. Línea roja: ajuste lineal (OLS).",
x = paste0("Precio real del carbón (", anio_graf, ")"),
y = paste0("Precio real de la gasolina (", anio_graf, ")"),
caption = "Fuente: elaboración propia con base_unida (2000–2024)"
) +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold")) +
annotate("label",
x = Inf, y = -Inf,
label = label_text,
hjust = 1.05, vjust = -0.1,
size = 3.6, fill = "white", alpha = 0.9)
## `geom_smooth()` using formula = 'y ~ x'
#Interpretación — Punto 2.2
-El gráfico muestra 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 2012. Cada punto azul representa una observación mensual dentro del año seleccionado, mientras que la línea roja indica la tendencia lineal (ajuste OLS) estimada entre ambas variables.
Se observa una pendiente positiva en la línea de ajuste, lo que sugiere que, en promedio, cuando el precio real del carbón aumenta, también tiende a aumentar el precio real de la gasolina. Esta relación positiva indica que ambos combustibles presentan comportamientos similares frente a factores del mercado energético, como los costos de producción, la demanda o las condiciones internacionales del petróleo.
El valor de R², mostrado en la etiqueta del gráfico, mide el grado de asociación entre las dos variables. Un R² moderado o alto significa que una parte importante de la variación en el precio de la gasolina puede explicarse por los cambios en el precio del carbón. El p-valor del coeficiente de la pendiente (mostrado también en la etiqueta) indica si esta relación es estadísticamente significativa. Si el valor es menor a 0.05, se concluye que la relación positiva entre los precios es significativa.
##En conclusión - el gráfico evidencia que existe una relación directa entre el precio real del carbón y el precio real de la gasolina, coherente con la dinámica conjunta de los combustibles en los mercados energéticos internacionales.
##2.3 ## interpretacion
La gráfica muestra la evolución mensual de los precios reales de los principales recursos energéticos durante el año 2020. Se observa que:
El petróleo y la gasolina corriente experimentaron una fuerte caída en los precios entre marzo y mayo, coincidiendo con la crisis sanitaria mundial provocada por el COVID-19, la cual redujo drásticamente la demanda de combustibles y el transporte global.
Hacia el segundo semestre, ambos precios comienzan a recuperarse paulatinamente, reflejando la reapertura económica y la normalización gradual de la actividad productiva.
En contraste, los precios del carbón y del gas natural presentan una menor volatilidad, manteniéndose relativamente estables a lo largo del año.
En general, el comportamiento evidencia la alta sensibilidad de los derivados del petróleo a los choques internacionales, mientras que los recursos como el carbón responden con mayor estabilidad ante las perturbaciones del mercado.
# Año a graficar
anio_graf <- 2020
# Filtrar datos del año seleccionado (usa tu base unida)
df_serie <- base_unida %>%
filter(año == anio_graf) %>%
select(fecha, mes, año, Carbon, GasNatural, Petroleo, Gasolina)
# Reorganizar a formato largo
df_long <- df_serie %>%
tidyr::pivot_longer(
cols = c(Carbon, GasNatural, Petroleo, Gasolina),
names_to = "Recurso",
values_to = "Precio"
)
# Asegurar que la fecha sea tipo Date
df_long$fecha <- as.Date(df_long$fecha)
# --------------------------------------------------------
# Agregar promedio mensual por recurso
# --------------------------------------------------------
df_long_mensual <- df_long %>%
mutate(mes = lubridate::floor_date(fecha, "month")) %>%
group_by(mes, Recurso) %>%
summarise(Precio = mean(Precio, na.rm = TRUE), .groups = "drop")
# --------------------------------------------------------
# Gráfica mensual
# --------------------------------------------------------
ggplot(df_long_mensual, aes(x = mes, y = Precio, color = Recurso)) +
geom_line(linewidth = 1.2) +
geom_point(size = 2, alpha = 0.8) +
labs(
title = paste0("Evolución mensual de precios reales — ", anio_graf),
subtitle = "Promedios mensuales de Carbón, Gas Natural, Petróleo y Gasolina Corriente",
x = "Mes",
y = "Precio real (índice o valor ajustado)",
color = "Recurso energético",
caption = "Fuente: base_unida — precios reales entre 2000 y 2024"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 11),
legend.position = "bottom",
legend.title = element_text(face = "bold"),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "gray90"),
plot.margin = margin(10, 10, 10, 10)
)