2.1 Presenten una tabla de estadísticas descriptivas donde
evidencien el número de observaciones, promedio, min, max, desviación
estándar de los precios nominales y reales de los combustibles.
Expliquen e interpreten en el documento los valores más importantes de
la tabla. Es decir, su tabla debe tener 5 columnas y 9 filas.
# 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 - Correlaciones y gráfica detallada (Carbón vs Gasolina -
reales) Presenten una gráfica de dispersión de puntos (scatter) donde en
el eje X esté el precio del carbón y en el eje Y el precio de la
gasolina, ambos reales, para un año determinado. Añadan una línea de
ajuste lineal, título, labels y demás elementos que permitan una gráfica
autocontenida. Expliquen e interpreten en el documento los elementos más
importantes de gráfica.
# Paquetes (instalan si faltan)
pkgs <- c("dplyr","ggplot2","ggpmisc","ggpubr","corrplot")
for (p in pkgs) if (!requireNamespace(p, quietly = TRUE)) install.packages(p)
lapply(pkgs, require, character.only = TRUE)
## [[1]]
## [1] TRUE
##
## [[2]]
## [1] TRUE
##
## [[3]]
## [1] TRUE
##
## [[4]]
## [1] TRUE
##
## [[5]]
## [1] TRUE
# 0) Validación básica
if (!exists("basedatos_consolidada")) stop("ERROR: 'basedatos_consolidada' no existe. Ejecuta la sección que la crea.")
# 1) Detectar columnas reales de Carbón y Gasolina (varias nomenclaturas)
nombres <- names(basedatos_consolidada)
# patrones comunes
pattern_carbon <- c("carbon.*real", "carbon.*r$", "\\bcarbon\\b")
pattern_gasolina <- c("gasolin.*real", "gasolin.*r$", "\\bgasolina\\b", "gasoline.*real")
find_first <- function(patterns, names_vec) {
for (pat in patterns) {
hit <- grep(pat, names_vec, value = TRUE, ignore.case = TRUE)
if (length(hit) > 0) return(hit[1])
}
return(NA_character_)
}
carbon_col <- find_first(pattern_carbon, nombres)
gasolina_col <- find_first(pattern_gasolina, nombres)
if (is.na(carbon_col) || is.na(gasolina_col)) {
cat("Columnas detectadas:\n")
cat("Carbon_col =", carbon_col, "\n")
cat("Gasolina_col =", gasolina_col, "\n")
stop("No se detectaron automáticamente las columnas 'reales' de Carbon o Gasolina. Ajusta los patrones o renombra tus columnas.")
}
cat("Usando columnas - Carbón (real):", carbon_col, " | Gasolina (real):", gasolina_col, "\n")
## Usando columnas - Carbón (real): Carbon | Gasolina (real): Gasolina
# 2) Preparar datos: asegurar numéricos y eliminar NAs
df_plot <- basedatos_consolidada %>%
select(any_of(c("año", "mes", "fecha", carbon_col, gasolina_col))) %>%
rename(precio_carbon_real = !!sym(carbon_col),
precio_gasolina_real = !!sym(gasolina_col)) %>%
mutate(
precio_carbon_real = as.numeric(precio_carbon_real),
precio_gasolina_real = as.numeric(precio_gasolina_real),
fecha = if("fecha" %in% names(.) ) as.Date(fecha) else NA
) %>%
drop_na(precio_carbon_real, precio_gasolina_real)
if (nrow(df_plot) == 0) stop("El subconjunto para graficar quedó vacío tras eliminar NAs.")
# 3) (Opcional) Filtrar a un año concreto si quieres — aquí dejo opción interactiva:
# Si quieres fijar un año específico, asigna valor a `anio_focus`. Si NULL, se usa todo el período.
anio_focus <- NULL # p. ej. 2020; si NULL -> no filtra por año
if (!is.null(anio_focus) && "año" %in% names(df_plot)) {
df_plot <- df_plot %>% filter(año == anio_focus)
if (nrow(df_plot) == 0) stop(paste("No hay datos para el año", anio_focus))
}
# 4) Estadísticas de relación: correlación y regresión lineal
# Correlación Pearson y p-value
cor_test <- cor.test(df_plot$precio_carbon_real, df_plot$precio_gasolina_real, method = "pearson")
r_val <- cor_test$estimate[[1]]
p_val <- cor_test$p.value
# Regresión lineal (para línea de ajuste y R^2)
lm_fit <- lm(precio_gasolina_real ~ precio_carbon_real, data = df_plot)
r2 <- summary(lm_fit)$r.squared
coef_int <- coef(lm_fit)[1]; coef_slope <- coef(lm_fit)[2]
# Formato de las anotaciones
lab_r <- paste0("r = ", formatC(r_val, format = "f", digits = 3))
lab_p <- paste0("p = ", formatC(p_val, format = "g", digits = 3))
lab_eq <- paste0("y = ", formatC(coef_slope, digits = 3, format = "f"), " x + ", formatC(coef_int, digits = 3, format = "f"))
lab_r2 <- paste0("R² = ", formatC(r2, digits = 3, format = "f"))
# 5) Gráfica detallada con ggplot2 + anotaciones
p <- ggplot(df_plot, aes(x = precio_carbon_real, y = precio_gasolina_real)) +
geom_point(size = 2.5, alpha = 0.75) +
geom_smooth(method = "lm", se = TRUE, linewidth = 0.9, color = "#D62828", fill = alpha("#D62828", 0.15)) +
stat_poly_eq(
aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
formula = y ~ x, parse = TRUE, label.x.npc = "left", label.y.npc = 0.95,
size = 3.8, color = "black"
) +
annotate("text", x = Inf, y = -Inf, label = paste(lab_r, lab_p, sep = " | "),
hjust = 1.05, vjust = -1.1, size = 3.8, color = "black") +
labs(
title = ifelse(is.null(anio_focus),
"Dispersión: Precio real del Carbón vs Precio real de la Gasolina (todo el período)",
paste0("Dispersión: Carbón vs Gasolina (año ", anio_focus, ")")),
subtitle = "Puntos mensuales (o frecuencia de la serie). Línea: ajuste lineal (lm) con banda de confianza",
x = "Precio real del Carbón (unidad de la base de datos)",
y = "Precio real de la Gasolina (unidad de la base de datos)",
caption = paste0("Coef. Pearson: ", formatC(r_val, digits=3),
" | p-value: ", formatC(p_val, digits=3),
" | Ecuación: ", lab_eq, " | R²: ", formatC(r2, digits=3),
"\nFuente: basedatos_consolidada")
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 10, color = "gray30"),
plot.caption = element_text(size = 9, color = "gray40"),
axis.title = element_text(size = 11),
panel.grid.minor = element_blank()
)
# Mostrar la gráfica
print(p)

# 6) (Opcional) Guardar la imagen en el directorio del proyecto
try({
ggsave(filename = "scatter_carbon_gasolina_reales.png", plot = p, width = 8, height = 6, dpi = 300)
cat("Figura guardada como scatter_carbon_gasolina_reales.png\n")
}, silent = TRUE)
## Figura guardada como scatter_carbon_gasolina_reales.png
# 7) Si hay más de 2 series reales, mostrar matriz de correlación entre todas las reales
real_cols <- grep("real", nombres, value = TRUE, ignore.case = TRUE)
real_cols <- intersect(real_cols, nombres) # garantía
if (length(real_cols) >= 2) {
df_real_all <- basedatos_consolidada %>% select(any_of(real_cols)) %>% mutate(across(everything(), as.numeric))
mat_cor_real <- cor(df_real_all, use = "pairwise.complete.obs", method = "pearson")
cat("\nMatriz de correlación (series reales detectadas):\n")
print(round(mat_cor_real, 3))
# Mostrar heatmap pequeño
try({
corrplot::corrplot(mat_cor_real, method = "color", addCoef.col = "black", number.cex = 0.7,
tl.cex = 0.8, title = "Correlaciones - series reales", mar = c(0,0,1,0))
}, silent = TRUE)
}
# 8) Interpretación automática breve (texto en consola; pega en tu documento si quieres)
cat("\nInterpretación breve:\n")
##
## Interpretación breve:
cat("- r (Pearson) =", formatC(r_val, digits=3), " ; p-value =", formatC(p_val, digits=3), "\n")
## - r (Pearson) = 0.969 ; p-value = 3.11e-177
if (abs(r_val) >= 0.8) {
cat("- Interpretación: correlación muy fuerte.\n")
} else if (abs(r_val) >= 0.6) {
cat("- Interpretación: correlación fuerte.\n")
} else if (abs(r_val) >= 0.4) {
cat("- Interpretación: correlación moderada.\n")
} else if (abs(r_val) >= 0.2) {
cat("- Interpretación: correlación débil.\n")
} else {
cat("- Interpretación: correlación muy débil o nula.\n")
}
## - Interpretación: correlación muy fuerte.
2.3 - Gráfica de dispersión entre precios reales del Carbón y la
Gasolina Presenten una gráfica de serie de tiempo con el precio real del
Carbón, Gas Natural, Petróleo y Gasolina Corriente para un mismo año,
asegúrense de que tenga el título, labels, colores y demás elementos que
permitan una gráfica autocontenida. Expliquen e interpreten en el
documento los elementos más importantes de la gráfica.
# ===========================================
# PUNTO 2.3 - VERSIÓN FINAL CORREGIDA
# ===========================================
# Cargar librerías necesarias
library(dplyr)
library(ggplot2)
library(ggpmisc)
# --- 1) Seleccionar el año a analizar ---
anio_filtro <- 2020 # 🔹 Cambia el año si deseas graficar otro
# --- 2) Detectar columnas de carbón y gasolina ---
nombres <- names(basedatos_consolidada)
col_carbon <- grep("carbon", nombres, value = TRUE, ignore.case = TRUE)[1]
col_gasolina <- grep("gasolin", nombres, value = TRUE, ignore.case = TRUE)[1]
cat("Columnas detectadas:\n")
## Columnas detectadas:
cat(" - Carbón:", col_carbon, "\n")
## - Carbón: Carbon
cat(" - Gasolina:", col_gasolina, "\n\n")
## - Gasolina: Gasolina
if (is.na(col_carbon) || is.na(col_gasolina)) {
stop("❌ No se detectaron columnas que contengan 'carbon' o 'gasolin' en el nombre.")
}
# --- 3) Verificar columna 'año' ---
if (!"año" %in% nombres) {
stop("❌ No se encontró la columna 'año' en la base de datos.")
}
# --- 4) Preparar los datos ---
df_disp <- basedatos_consolidada %>%
select(año,
precio_carbon = all_of(col_carbon),
precio_gasolina = all_of(col_gasolina)) %>%
filter(año == anio_filtro) %>%
mutate(across(everything(), as.numeric)) %>%
drop_na()
if (nrow(df_disp) == 0) stop(paste("⚠️ No hay datos disponibles para el año", anio_filtro))
# --- 5) Calcular correlación y modelo lineal ---
modelo <- lm(precio_gasolina ~ precio_carbon, data = df_disp)
r_val <- cor(df_disp$precio_carbon, df_disp$precio_gasolina, use = "pairwise.complete.obs")
r2_val <- summary(modelo)$r.squared
cat("Coeficiente de correlación de Pearson (r):", round(r_val, 3), "\n")
## Coeficiente de correlación de Pearson (r): 0.307
cat("Coeficiente de determinación (R²):", round(r2_val, 3), "\n\n")
## Coeficiente de determinación (R²): 0.094
# --- 6) Crear la gráfica de dispersión ---
ggplot(df_disp, aes(x = precio_carbon, y = precio_gasolina)) +
geom_point(color = "blue", size = 2.8, alpha = 0.75) +
geom_smooth(method = "lm", se = TRUE, color = "pink", linewidth = 1) +
stat_poly_eq(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
formula = y ~ x, parse = TRUE, label.x.npc = "left", label.y.npc = 0.95,
size = 4, color = "black") +
labs(
title = paste("Relación entre precios reales del Carbón y la Gasolina -", anio_filtro),
subtitle = "Gráfica de dispersión con línea de ajuste lineal (modelo lm)",
x = paste0("Precio real del Carbón (", col_carbon, ")"),
y = paste0("Precio real de la Gasolina (", col_gasolina, ")"),
caption = paste0("Fuente: elaboración propia con base en datos del taller\n",
"r = ", round(r_val, 3), " | R² = ", round(r2_val, 3))
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(size = 14, face = "bold"),
plot.subtitle = element_text(size = 11, color = "gray30"),
plot.caption = element_text(size = 9, color = "gray40"),
panel.grid.minor = element_blank()
)
