Construccion de base de datos
1.1. Exploracion inicial de la base de datos
setwd("C:/Users/s05e24/Downloads/TALLER BIG DATA LUISA")
# Cargar los archivos
carbon <- read_csv("clean_precios_carbon.CSV")
## Rows: 8579 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (1): precio_carbon
## date (1): fecha
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
gas_natural <- read_csv("clean_precios_gas_natural.CSV")
## Rows: 8579 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (1): precio_gas_natural
## date (1): fecha
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
gasolina <- read_csv("clean_precios_gasolina.CSV")
## Rows: 8579 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (1): precio_gasolina
## date (1): fecha
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
petroleo <- read_csv("clean_precios_petroleo.CSV")
## Rows: 8579 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (1): precio_petroleo
## date (1): fecha
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ipc <- read_csv("IPC.CSV")
## Rows: 847 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (1): ipc
## date (1): fecha
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
explorar_base <- function(df, nombre){
cat("\n###", nombre, "\n")
cat("Número de observaciones:", nrow(df), "\n")
cat("Columnas:", names(df), "\n")
cat("Rango de fechas:", min(df[[1]]), "a", max(df[[1]]), "\n\n")
}
# Estructura basica
glimpse(carbon)
## Rows: 8,579
## Columns: 2
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-05, 2000-01…
## $ precio_carbon <dbl> 56.80856, 84.06858, 70.66739, 79.72284, 91.50991, 69.774…
glimpse(gas_natural)
## Rows: 8,579
## Columns: 2
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
glimpse(petroleo)
## Rows: 8,579
## Columns: 2
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-…
## $ precio_petroleo <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.30725, …
glimpse(gasolina)
## Rows: 8,579
## Columns: 2
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-…
## $ precio_gasolina <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 41.8…
glimpse(ipc)
## Rows: 847
## Columns: 2
## $ fecha <date> 1954-07-31, 1954-08-31, 1954-09-30, 1954-10-31, 1954-11-30, 195…
## $ ipc <dbl> 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03…
# Unir las series por fecha
precios_comb <- carbon %>%
left_join(gas_natural, by = "fecha") %>%
left_join(petroleo, by = "fecha") %>%
left_join(gasolina, by = "fecha") %>%
left_join(ipc, by = "fecha")
# Renombrar columnas para claridad
colnames(precios_comb) <- c("fecha", "precio_carbon", "precio_gas_natural",
"precio_petroleo", "precio_gasolina", "ipc")
# Revisar la base final
glimpse(precios_comb)
## Rows: 8,579
## Columns: 6
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-05, 20…
## $ precio_carbon <dbl> 56.80856, 84.06858, 70.66739, 79.72284, 91.50991, 6…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 133.78021, 78.58548…
## $ precio_petroleo <dbl> 77.70500, 108.36269, 118.78963, 115.30725, 100.5229…
## $ precio_gasolina <dbl> 85.22463, 58.80204, 62.35808, 43.80961, 41.87021, 7…
## $ ipc <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
summary(precios_comb)
## fecha precio_carbon precio_gas_natural precio_petroleo
## Min. :2000-01-01 Min. : 50.98 Min. : 70.78 Min. : 70.39
## 1st Qu.:2005-12-26 1st Qu.: 83.23 1st Qu.:100.54 1st Qu.: 95.56
## Median :2012-01-05 Median : 97.19 Median :118.35 Median :108.02
## Mean :2012-01-01 Mean : 96.96 Mean :118.29 Mean :108.11
## 3rd Qu.:2018-01-04 3rd Qu.:110.67 3rd Qu.:135.63 3rd Qu.:120.72
## Max. :2024-01-01 Max. :142.97 Max. :165.38 Max. :145.87
## NA's :184 NA's :186
## precio_gasolina ipc
## Min. : 41.52 Min. : 41.23
## 1st Qu.: 87.06 1st Qu.: 58.78
## Median :108.66 Median : 75.82
## Mean :108.93 Mean : 78.72
## 3rd Qu.:130.68 3rd Qu.: 96.83
## Max. :176.34 Max. :137.72
## NA's :183 NA's :8297
# Análisis descriptivo general
# Información general
cat("### Análisis descriptivo general de la base de datos\n\n")
## ### Análisis descriptivo general de la base de datos
cat("Número de observaciones:", nrow(precios_comb), "\n")
## Número de observaciones: 8579
cat("Número de variables:", ncol(precios_comb), "\n\n")
## Número de variables: 6
# Variables
cat("Variables contenidas en la base (incluyendo IPC):\n")
## Variables contenidas en la base (incluyendo IPC):
print(names(precios_comb))
## [1] "fecha" "precio_carbon" "precio_gas_natural"
## [4] "precio_petroleo" "precio_gasolina" "ipc"
cat("\n")
# Tipos de datos
cat("Tipos de datos de cada variable:\n")
## Tipos de datos de cada variable:
print(sapply(precios_comb, class))
## fecha precio_carbon precio_gas_natural precio_petroleo
## "Date" "numeric" "numeric" "numeric"
## precio_gasolina ipc
## "numeric" "numeric"
cat("\n")
# Periodo analizado
cat("Periodo de tiempo cubierto:\n")
## Periodo de tiempo cubierto:
cat("Desde:", min(precios_comb$fecha), "hasta:", max(precios_comb$fecha), "\n\n")
## Desde: 10957 hasta: 19723
# Valores faltantes
cat("Cantidad de valores faltantes por variable:\n")
## Cantidad de valores faltantes por variable:
print(colSums(is.na(precios_comb)))
## fecha precio_carbon precio_gas_natural precio_petroleo
## 0 0 184 186
## precio_gasolina ipc
## 183 8297
cat("\n")
# Resumen estadístico
cat("Resumen estadístico de los precios e IPC:\n")
## Resumen estadístico de los precios e IPC:
print(summary(precios_comb[, -1]))
## precio_carbon precio_gas_natural precio_petroleo precio_gasolina
## Min. : 50.98 Min. : 70.78 Min. : 70.39 Min. : 41.52
## 1st Qu.: 83.23 1st Qu.:100.54 1st Qu.: 95.56 1st Qu.: 87.06
## Median : 97.19 Median :118.35 Median :108.02 Median :108.66
## Mean : 96.96 Mean :118.29 Mean :108.11 Mean :108.93
## 3rd Qu.:110.67 3rd Qu.:135.63 3rd Qu.:120.72 3rd Qu.:130.68
## Max. :142.97 Max. :165.38 Max. :145.87 Max. :176.34
## NA's :184 NA's :186 NA's :183
## ipc
## Min. : 41.23
## 1st Qu.: 58.78
## Median : 75.82
## Mean : 78.72
## 3rd Qu.: 96.83
## Max. :137.72
## NA's :8297
cat("\n")
La base consolidada está compuesta por 8.579 observaciones y seis variables: fecha, precio_carbon, precio_gas_natural, precio_petroleo, precio_gasolina e ipc. La variable fecha se encuentra en formato Date y el resto corresponde a valores numéricos. El período analizado va desde el 1 de enero del 2000 hasta el 1 de enero del 2024, lo que permite estudiar la evolución de estas series en el largo plazo.
Se identifican valores faltantes en algunas variables, principalmente en el ipc, donde se registran 8.297 datos ausentes, lo cual indica una menor disponibilidad o una frecuencia distinta frente al resto de las series de precios. En precio_gas_natural, precio_petroleo y precio_gasolina se presentan 184, 186 y 183 datos faltantes respectivamente, mientras que el precio_carbon no presenta ausencias. Esta situación debe considerarse antes de aplicar modelos que requieran series completas.
En cuanto a su comportamiento estadístico, los precios presentan variaciones importantes: el carbón tiene un promedio cercano a 96.96, el gas natural 118.29, el petróleo 108.11, la gasolina 108.93 y el ipc aproximadamente 78.72.
En conclusión, se cuenta con una base robusta para el análisis de tendencias de precios energéticos y del IPC a lo largo de 24 años; sin embargo, será necesario tratar los valores faltantes, especialmente en el ipc, para asegurar consistencia en futuros análisis.
1.2. Explicitar las fechas faltantes
# Funcion para fechas faltantes
completar_fechas <- function(data, columna_fecha, columna_valor) {
# Obtener el rango completo de fechas
rango_fechas <- seq(min(data[[columna_fecha]], na.rm = TRUE),
max(data[[columna_fecha]], na.rm = TRUE),
by = "day")
# Crear un dataframe con todas las fechas y unirlo con la base original
data_completa <- data %>%
right_join(
tibble(!!columna_fecha := rango_fechas),
by = setNames(columna_fecha, columna_fecha)
) %>%
arrange(!!sym(columna_fecha))
return(data_completa)
}
# Aplicar la función a cada base
carbon_completo <- completar_fechas(carbon, "fecha", "precio_carbon")
gas_completo <- completar_fechas(gas_natural, "fecha", "precio_gas_natural")
petroleo_completo <- completar_fechas(petroleo, "fecha", "precio_petroleo")
gasolina_completo <- completar_fechas(gasolina, "fecha", "precio_gasolina")
ipc_completo <- completar_fechas(ipc, "fecha", "ipc")
# Verificar la estructura de cada base completada
summary(carbon_completo)
## fecha precio_carbon
## Min. :2000-01-01 Min. : 50.98
## 1st Qu.:2005-12-31 1st Qu.: 83.23
## Median :2012-01-01 Median : 97.19
## Mean :2012-01-01 Mean : 96.96
## 3rd Qu.:2017-12-31 3rd Qu.:110.67
## Max. :2024-01-01 Max. :142.97
## NA's :188
summary(gas_completo)
## fecha precio_gas_natural
## Min. :2000-01-01 Min. : 70.78
## 1st Qu.:2005-12-31 1st Qu.:100.59
## Median :2012-01-01 Median :118.36
## Mean :2012-01-01 Mean :118.31
## 3rd Qu.:2017-12-31 3rd Qu.:135.65
## Max. :2024-01-01 Max. :165.38
## NA's :188
summary(petroleo_completo)
## fecha precio_petroleo
## Min. :2000-01-01 Min. : 70.39
## 1st Qu.:2005-12-31 1st Qu.: 95.55
## Median :2012-01-01 Median :107.98
## Mean :2012-01-01 Mean :108.09
## 3rd Qu.:2017-12-31 3rd Qu.:120.71
## Max. :2024-01-01 Max. :145.87
## NA's :188
summary(gasolina_completo)
## fecha precio_gasolina
## Min. :2000-01-01 Min. : 41.52
## 1st Qu.:2005-12-31 1st Qu.: 87.12
## Median :2012-01-01 Median :108.66
## Mean :2012-01-01 Mean :108.94
## 3rd Qu.:2017-12-31 3rd Qu.:130.73
## Max. :2024-01-01 Max. :176.34
## NA's :188
summary(ipc_completo)
## fecha ipc
## Min. :1954-07-31 Min. : 0.03
## 1st Qu.:1972-03-16 1st Qu.: 0.14
## Median :1989-10-31 Median : 5.60
## Mean :1989-10-31 Mean : 32.37
## 3rd Qu.:2007-06-17 3rd Qu.: 64.08
## Max. :2025-01-31 Max. :146.24
## NA's :24906
# Unir nuevamente todas las series completas en una sola base consolidada
precios_comb_completo <- carbon_completo %>%
left_join(gas_completo, by = "fecha") %>%
left_join(petroleo_completo, by = "fecha") %>%
left_join(gasolina_completo, by = "fecha") %>%
left_join(ipc_completo, by = "fecha")
# Verificar estructura y resumen
lapply(list(carbon, gas_natural, gasolina, petroleo, ipc), glimpse)
## Rows: 8,579
## Columns: 2
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-05, 2000-01…
## $ precio_carbon <dbl> 56.80856, 84.06858, 70.66739, 79.72284, 91.50991, 69.774…
## Rows: 8,579
## Columns: 2
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
## Rows: 8,579
## Columns: 2
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-…
## $ precio_gasolina <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 41.8…
## Rows: 8,579
## Columns: 2
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-…
## $ precio_petroleo <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.30725, …
## Rows: 847
## Columns: 2
## $ fecha <date> 1954-07-31, 1954-08-31, 1954-09-30, 1954-10-31, 1954-11-30, 195…
## $ ipc <dbl> 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03…
## [[1]]
## # A tibble: 8,579 × 2
## fecha precio_carbon
## <date> <dbl>
## 1 2000-01-01 56.8
## 2 2000-01-02 84.1
## 3 2000-01-03 70.7
## 4 2000-01-05 79.7
## 5 2000-01-06 91.5
## 6 2000-01-07 69.8
## 7 2000-01-09 75.8
## 8 2000-01-10 99.5
## 9 2000-01-11 98.2
## 10 2000-01-12 99.5
## # ℹ 8,569 more rows
##
## [[2]]
## # A tibble: 8,579 × 2
## fecha precio_gas_natural
## <date> <dbl>
## 1 2000-01-01 134.
## 2 2000-01-02 103.
## 3 2000-01-03 72.7
## 4 2000-01-04 102.
## 5 2000-01-05 134.
## 6 2000-01-06 78.6
## 7 2000-01-07 139.
## 8 2000-01-08 115.
## 9 2000-01-09 81.1
## 10 2000-01-10 92.4
## # ℹ 8,569 more rows
##
## [[3]]
## # A tibble: 8,579 × 2
## fecha precio_gasolina
## <date> <dbl>
## 1 2000-01-01 85.2
## 2 2000-01-02 58.8
## 3 2000-01-03 62.4
## 4 2000-01-04 48.6
## 5 2000-01-05 43.8
## 6 2000-01-06 41.9
## 7 2000-01-07 71.5
## 8 2000-01-08 43.1
## 9 2000-01-09 53.9
## 10 2000-01-10 46.6
## # ℹ 8,569 more rows
##
## [[4]]
## # A tibble: 8,579 × 2
## fecha precio_petroleo
## <date> <dbl>
## 1 2000-01-01 77.7
## 2 2000-01-02 108.
## 3 2000-01-03 119.
## 4 2000-01-04 106.
## 5 2000-01-05 115.
## 6 2000-01-06 101.
## 7 2000-01-07 80.5
## 8 2000-01-08 82.0
## 9 2000-01-09 92.7
## 10 2000-01-10 82.4
## # ℹ 8,569 more rows
##
## [[5]]
## # A tibble: 847 × 2
## fecha ipc
## <date> <dbl>
## 1 1954-07-31 0.03
## 2 1954-08-31 0.03
## 3 1954-09-30 0.03
## 4 1954-10-31 0.03
## 5 1954-11-30 0.03
## 6 1954-12-31 0.03
## 7 1955-01-31 0.03
## 8 1955-02-28 0.03
## 9 1955-03-31 0.03
## 10 1955-04-30 0.03
## # ℹ 837 more rows
lapply(list(carbon, gas_natural, gasolina, petroleo, ipc), summary)
## [[1]]
## fecha precio_carbon
## Min. :2000-01-01 Min. : 50.98
## 1st Qu.:2005-12-26 1st Qu.: 83.23
## Median :2012-01-05 Median : 97.19
## Mean :2012-01-01 Mean : 96.96
## 3rd Qu.:2018-01-04 3rd Qu.:110.67
## Max. :2024-01-01 Max. :142.97
##
## [[2]]
## fecha precio_gas_natural
## Min. :2000-01-01 Min. : 70.78
## 1st Qu.:2006-01-02 1st Qu.:100.59
## Median :2011-12-30 Median :118.36
## Mean :2011-12-29 Mean :118.31
## 3rd Qu.:2017-12-22 3rd Qu.:135.65
## Max. :2024-01-01 Max. :165.38
##
## [[3]]
## fecha precio_gasolina
## Min. :2000-01-01 Min. : 41.52
## 1st Qu.:2006-01-02 1st Qu.: 87.12
## Median :2011-12-22 Median :108.66
## Mean :2011-12-28 Mean :108.94
## 3rd Qu.:2017-12-26 3rd Qu.:130.73
## Max. :2024-01-01 Max. :176.34
##
## [[4]]
## fecha precio_petroleo
## Min. :2000-01-01 Min. : 70.39
## 1st Qu.:2006-01-07 1st Qu.: 95.55
## Median :2011-12-28 Median :107.98
## Mean :2012-01-01 Mean :108.09
## 3rd Qu.:2017-12-31 3rd Qu.:120.71
## Max. :2024-01-01 Max. :145.87
##
## [[5]]
## fecha ipc
## Min. :1954-07-31 Min. : 0.03
## 1st Qu.:1972-03-15 1st Qu.: 0.14
## Median :1989-10-31 Median : 5.60
## Mean :1989-10-30 Mean : 32.37
## 3rd Qu.:2007-06-15 3rd Qu.: 64.08
## Max. :2025-01-31 Max. :146.24
# Revisar la base final con fechas explícitas
glimpse(precios_comb_completo)
## Rows: 8,767
## Columns: 6
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_carbon <dbl> 56.80856, 84.06858, 70.66739, NA, 79.72284, 91.5099…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
## $ precio_petroleo <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.3072…
## $ precio_gasolina <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 4…
## $ ipc <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
summary(precios_comb_completo)
## fecha precio_carbon precio_gas_natural precio_petroleo
## Min. :2000-01-01 Min. : 50.98 Min. : 70.78 Min. : 70.39
## 1st Qu.:2005-12-31 1st Qu.: 83.23 1st Qu.:100.59 1st Qu.: 95.55
## Median :2012-01-01 Median : 97.19 Median :118.36 Median :107.98
## Mean :2012-01-01 Mean : 96.96 Mean :118.31 Mean :108.09
## 3rd Qu.:2017-12-31 3rd Qu.:110.67 3rd Qu.:135.65 3rd Qu.:120.71
## Max. :2024-01-01 Max. :142.97 Max. :165.38 Max. :145.87
## NA's :188 NA's :188 NA's :188
## precio_gasolina ipc
## Min. : 41.52 Min. : 40.30
## 1st Qu.: 87.12 1st Qu.: 58.94
## Median :108.66 Median : 76.47
## Mean :108.94 Mean : 78.96
## 3rd Qu.:130.73 3rd Qu.: 97.07
## Max. :176.34 Max. :137.72
## NA's :188 NA's :8479
# Tabla ordenada
tabla_descriptivos <- precios_comb_completo %>%
summarise(
min_carbon = min(precio_carbon, na.rm = TRUE),
q1_carbon = quantile(precio_carbon, 0.25, na.rm = TRUE),
med_carbon = median(precio_carbon, na.rm = TRUE),
mean_carbon = mean(precio_carbon, na.rm = TRUE),
q3_carbon = quantile(precio_carbon, 0.75, na.rm = TRUE),
max_carbon = max(precio_carbon, na.rm = TRUE),
na_carbon = sum(is.na(precio_carbon)),
min_gasnat = min(precio_gas_natural, na.rm = TRUE),
q1_gasnat = quantile(precio_gas_natural, 0.25, na.rm = TRUE),
med_gasnat = median(precio_gas_natural, na.rm = TRUE),
mean_gasnat = mean(precio_gas_natural, na.rm = TRUE),
q3_gasnat = quantile(precio_gas_natural, 0.75, na.rm = TRUE),
max_gasnat = max(precio_gas_natural, na.rm = TRUE),
na_gasnat = sum(is.na(precio_gas_natural)),
min_pet = min(precio_petroleo, na.rm = TRUE),
q1_pet = quantile(precio_petroleo, 0.25, na.rm = TRUE),
med_pet = median(precio_petroleo, na.rm = TRUE),
mean_pet = mean(precio_petroleo, na.rm = TRUE),
q3_pet = quantile(precio_petroleo, 0.75, na.rm = TRUE),
max_pet = max(precio_petroleo, na.rm = TRUE),
na_pet = sum(is.na(precio_petroleo)),
min_gas = min(precio_gasolina, na.rm = TRUE),
q1_gas = quantile(precio_gasolina, 0.25, na.rm = TRUE),
med_gas = median(precio_gasolina, na.rm = TRUE),
mean_gas = mean(precio_gasolina, na.rm = TRUE),
q3_gas = quantile(precio_gasolina, 0.75, na.rm = TRUE),
max_gas = max(precio_gasolina, na.rm = TRUE),
na_gas = sum(is.na(precio_gasolina)),
min_ipc = min(ipc, na.rm = TRUE),
q1_ipc = quantile(ipc, 0.25, na.rm = TRUE),
med_ipc = median(ipc, na.rm = TRUE),
mean_ipc = mean(ipc, na.rm = TRUE),
q3_ipc = quantile(ipc, 0.75, na.rm = TRUE),
max_ipc = max(ipc, na.rm = TRUE),
na_ipc = sum(is.na(ipc))
)
tabla_desc <- describe(precios_comb)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
View(tabla_desc)
1.3. Aplicar la funcion anterior a cada una de las bases de datos
# Funcion anterior
completar_fechas <- function(df, fecha_col, precio_col) {
fecha_col <- enquo(fecha_col)
precio_col <- enquo(precio_col)
rango_fechas <- seq(min(df %>% pull(!!fecha_col), na.rm = TRUE),
max(df %>% pull(!!fecha_col), na.rm = TRUE),
by = "day")
df_completo <- tibble(fecha = rango_fechas) %>%
left_join(df, by = c("fecha" = rlang::as_name(fecha_col)))
# Aseguramos el nombre correcto del precio
if (!rlang::as_name(precio_col) %in% names(df_completo)) {
df_completo <- df_completo %>%
mutate(!!precio_col := NA_real_)
}
return(df_completo)
}
# Aplicación de la función a cada base de precios
carbon_completo <- completar_fechas(carbon, fecha, precio_carbon)
gas_completo <- completar_fechas(gas_natural, fecha, precio_gas_natural)
petroleo_completo <- completar_fechas(petroleo, fecha, precio_petroleo)
gasolina_completo <- completar_fechas(gasolina, fecha, precio_gasolina)
ipc_completo <- completar_fechas(ipc, fecha, ipc)
1.4. Union de los datasets
# Unión de las bases en una sola
precios_comb <- carbon_completo %>%
left_join(gas_completo, by = "fecha") %>%
left_join(petroleo_completo, by = "fecha") %>%
left_join(gasolina_completo, by = "fecha") %>%
left_join(ipc_completo, by = "fecha")
# Revisión final
summary(precios_comb)
## fecha precio_carbon precio_gas_natural precio_petroleo
## Min. :2000-01-01 Min. : 50.98 Min. : 70.78 Min. : 70.39
## 1st Qu.:2005-12-31 1st Qu.: 83.23 1st Qu.:100.59 1st Qu.: 95.55
## Median :2012-01-01 Median : 97.19 Median :118.36 Median :107.98
## Mean :2012-01-01 Mean : 96.96 Mean :118.31 Mean :108.09
## 3rd Qu.:2017-12-31 3rd Qu.:110.67 3rd Qu.:135.65 3rd Qu.:120.71
## Max. :2024-01-01 Max. :142.97 Max. :165.38 Max. :145.87
## NA's :188 NA's :188 NA's :188
## precio_gasolina ipc
## Min. : 41.52 Min. : 40.30
## 1st Qu.: 87.12 1st Qu.: 58.94
## Median :108.66 Median : 76.47
## Mean :108.94 Mean : 78.96
## 3rd Qu.:130.73 3rd Qu.: 97.07
## Max. :176.34 Max. :137.72
## NA's :188 NA's :8479
glimpse(precios_comb)
## Rows: 8,767
## Columns: 6
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_carbon <dbl> 56.80856, 84.06858, 70.66739, NA, 79.72284, 91.5099…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
## $ precio_petroleo <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.3072…
## $ precio_gasolina <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 4…
## $ ipc <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
tabla_desc <- describe(precios_comb)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
View(tabla_desc)
1.5. Columnas de año y mes
#Columnas de mes y año
precios_comb <- precios_comb %>%
mutate(
anio = year(fecha), # Extrae el año
mes = month(fecha, label = TRUE, abbr = TRUE) # Extrae el mes (nombre abreviado)
)
# Verificación de las nuevas columnas
glimpse(precios_comb)
## Rows: 8,767
## Columns: 8
## $ fecha <date> 2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 20…
## $ precio_carbon <dbl> 56.80856, 84.06858, 70.66739, NA, 79.72284, 91.5099…
## $ precio_gas_natural <dbl> 134.10288, 102.80182, 72.73675, 101.51064, 133.7802…
## $ precio_petroleo <dbl> 77.70500, 108.36269, 118.78963, 105.69747, 115.3072…
## $ precio_gasolina <dbl> 85.22463, 58.80204, 62.35808, 48.59105, 43.80961, 4…
## $ ipc <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ anio <dbl> 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 200…
## $ mes <ord> ene, ene, ene, ene, ene, ene, ene, ene, ene, ene, e…
summary(select(precios_comb, fecha, anio, mes))
## fecha anio mes
## Min. :2000-01-01 Min. :2000 ene : 745
## 1st Qu.:2005-12-31 1st Qu.:2006 mar : 744
## Median :2012-01-01 Median :2012 may : 744
## Mean :2012-01-01 Mean :2012 jul : 744
## 3rd Qu.:2017-12-31 3rd Qu.:2018 ago : 744
## Max. :2024-01-01 Max. :2024 oct : 744
## (Other):4302
1.6. Tabla de porcentajes
# Crear columnas de año y mes
precios_comb <- precios_comb %>%
mutate(
anio = year(fecha),
mes = month(fecha)
)
# Porcentaje de valores faltantes antes
faltantes <- precios_comb %>%
summarise(across(where(is.numeric), ~sum(is.na(.))/n()*100)) %>%
pivot_longer(everything(), names_to = "variable", values_to = "porcentaje_faltante")
cat("\n--- Porcentaje de valores faltantes ANTES del reemplazo ---\n")
##
## --- Porcentaje de valores faltantes ANTES del reemplazo ---
print(faltantes)
## # A tibble: 7 × 2
## variable porcentaje_faltante
## <chr> <dbl>
## 1 precio_carbon 2.14
## 2 precio_gas_natural 2.14
## 3 precio_petroleo 2.14
## 4 precio_gasolina 2.14
## 5 ipc 96.7
## 6 anio 0
## 7 mes 0
# Imputar valores faltantes por promedio del mismo mes-año
precios_comb <- precios_comb %>%
group_by(anio, mes) %>%
mutate(
ipc = ifelse(is.na(ipc), mean(ipc, na.rm = TRUE), ipc)
) %>%
ungroup()
# Porcentaje de valores faltantes después
faltantes_despues <- precios_comb %>%
summarise(across(where(is.numeric), ~sum(is.na(.))/n()*100)) %>%
pivot_longer(everything(), names_to = "variable", values_to = "porcentaje_faltante")
cat("\n--- Porcentaje de valores faltantes DESPUÉS del reemplazo ---\n")
##
## --- Porcentaje de valores faltantes DESPUÉS del reemplazo ---
print(faltantes_despues)
## # A tibble: 7 × 2
## variable porcentaje_faltante
## <chr> <dbl>
## 1 precio_carbon 2.14
## 2 precio_gas_natural 2.14
## 3 precio_petroleo 2.14
## 4 precio_gasolina 2.14
## 5 ipc 0.0114
## 6 anio 0
## 7 mes 0
1.7. Valores entre enero del 2000 hasta enero del 2024; Conversion de precios nomiales a reales
# --- 1.7 Agregación mensual y filtrado temporal de la base de datos ---
precios_mensual <- precios_comb %>%
group_by(anio, mes) %>%
summarise(
precio_carbon = mean(precio_carbon, na.rm = TRUE),
precio_gas_natural = mean(precio_gas_natural, na.rm = TRUE),
precio_petroleo = mean(precio_petroleo, na.rm = TRUE),
precio_gasolina = mean(precio_gasolina, na.rm = TRUE),
ipc = mean(ipc, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
fecha = make_date(year = anio, month = mes, day = 1)
) %>%
select(fecha, anio, mes, precio_carbon, precio_gas_natural, precio_petroleo, precio_gasolina, ipc)
# Filtrar entre 2000-01-01 y 2024-01-31
precios_mensual_filtrado <- precios_mensual %>%
filter(fecha >= as.Date("2000-01-01") & fecha <= as.Date("2024-01-31"))
# Verificación rápida
cat("Observaciones (mensual filtrado):", nrow(precios_mensual_filtrado), "\n")
## Observaciones (mensual filtrado): 289
cat("Periodo:", min(precios_mensual_filtrado$fecha), "a", max(precios_mensual_filtrado$fecha), "\n\n")
## Periodo: 10957 a 19723
head(precios_mensual_filtrado, 6)
## # A tibble: 6 × 8
## fecha anio mes precio_carbon precio_gas_natural precio_petroleo
## <date> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2000-01-01 2000 1 77.1 101. 95.9
## 2 2000-02-01 2000 2 80.8 104. 92.7
## 3 2000-03-01 2000 3 76.2 112. 94.6
## 4 2000-04-01 2000 4 74.7 106. 93.9
## 5 2000-05-01 2000 5 77.6 111. 91.4
## 6 2000-06-01 2000 6 78.3 107. 92.0
## # ℹ 2 more variables: precio_gasolina <dbl>, ipc <dbl>
summary(precios_mensual_filtrado)
## fecha anio mes precio_carbon
## Min. :2000-01-01 Min. :2000 Min. : 1.000 Min. : 74.21
## 1st Qu.:2006-01-01 1st Qu.:2006 1st Qu.: 3.000 1st Qu.: 86.29
## Median :2012-01-01 Median :2012 Median : 6.000 Median : 96.99
## Mean :2011-12-31 Mean :2012 Mean : 6.481 Mean : 96.98
## 3rd Qu.:2018-01-01 3rd Qu.:2018 3rd Qu.: 9.000 3rd Qu.:107.72
## Max. :2024-01-01 Max. :2024 Max. :12.000 Max. :123.16
##
## precio_gas_natural precio_petroleo precio_gasolina ipc
## Min. : 98.65 Min. : 91.25 Min. : 61.65 Min. : 40.30
## 1st Qu.:112.15 1st Qu.:101.00 1st Qu.: 87.29 1st Qu.: 58.94
## Median :118.20 Median :107.97 Median :108.46 Median : 76.47
## Mean :118.27 Mean :108.08 Mean :109.17 Mean : 78.96
## 3rd Qu.:124.81 3rd Qu.:114.50 3rd Qu.:130.80 3rd Qu.: 97.07
## Max. :137.71 Max. :129.80 Max. :166.10 Max. :137.72
## NA's :1
1.8. Valores nominales de la serie en precios constantes
# Función corregida y robusta
convertir_a_precios_reales <- function(data, columna_precio, columna_ipc, anio_base, mes_base) {
# Verificar que las columnas existan
if (!(columna_precio %in% names(data)) | !(columna_ipc %in% names(data))) {
stop("Las columnas especificadas no existen en el dataset.")
}
# Asegurar que las columnas anio y mes existan
if (!("anio" %in% names(data)) | !("mes" %in% names(data))) {
stop("El dataset debe contener las columnas 'anio' y 'mes'.")
}
# Buscar IPC base exacto o el más cercano anterior
ipc_base <- data %>%
filter((anio < anio_base) | (anio == anio_base & mes <= mes_base)) %>%
arrange(desc(anio), desc(mes)) %>%
slice(1) %>%
pull(!!sym(columna_ipc))
# Validar IPC base
if (is.na(ipc_base) | length(ipc_base) == 0) {
stop("No se encontró un valor válido de IPC para el año y mes base especificado.")
}
# Mostrar el IPC base que se está usando
message("Usando IPC base = ", round(ipc_base, 2), " para ", anio_base, "-", mes_base)
# Crear el nombre de la nueva columna
nuevo_nombre <- paste0(columna_precio, "_", anio_base, "_", mes_base, "_transformada")
# Calcular precios reales
data <- data %>%
mutate(!!nuevo_nombre := .data[[columna_precio]] * ipc_base / .data[[columna_ipc]])
return(data)
}
# Aplicar la función a cada serie de precios (base enero 2020)
precios_reales <- precios_mensual_filtrado %>%
convertir_a_precios_reales("precio_carbon", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_gas_natural", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_petroleo", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_gasolina", "ipc", 2023, 12)
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
names(precios_reales)
## [1] "fecha"
## [2] "anio"
## [3] "mes"
## [4] "precio_carbon"
## [5] "precio_gas_natural"
## [6] "precio_petroleo"
## [7] "precio_gasolina"
## [8] "ipc"
## [9] "precio_carbon_2023_12_transformada"
## [10] "precio_gas_natural_2023_12_transformada"
## [11] "precio_petroleo_2023_12_transformada"
## [12] "precio_gasolina_2023_12_transformada"
precios_reales %>%
select(fecha, starts_with("precio_carbon")) %>%
head(10)
## # A tibble: 10 × 3
## fecha precio_carbon precio_carbon_2023_12_transformada
## <date> <dbl> <dbl>
## 1 2000-01-01 77.1 264.
## 2 2000-02-01 80.8 270.
## 3 2000-03-01 76.2 250.
## 4 2000-04-01 74.7 243.
## 5 2000-05-01 77.6 251.
## 6 2000-06-01 78.3 253.
## 7 2000-07-01 77.5 251.
## 8 2000-08-01 74.4 240.
## 9 2000-09-01 74.7 240.
## 10 2000-10-01 77.5 249.
View(precios_reales)
1.9. Aplicacion de la funcion del literal anterior con base a diciembre 2023
#Transformar
precios_reales_2023 <- precios_mensual_filtrado %>%
convertir_a_precios_reales("precio_carbon", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_gas_natural", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_petroleo", "ipc", 2023, 12) %>%
convertir_a_precios_reales("precio_gasolina", "ipc", 2023, 12)
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
## Usando IPC base = 137.72 para 2023-12
names(precios_reales_2023)
## [1] "fecha"
## [2] "anio"
## [3] "mes"
## [4] "precio_carbon"
## [5] "precio_gas_natural"
## [6] "precio_petroleo"
## [7] "precio_gasolina"
## [8] "ipc"
## [9] "precio_carbon_2023_12_transformada"
## [10] "precio_gas_natural_2023_12_transformada"
## [11] "precio_petroleo_2023_12_transformada"
## [12] "precio_gasolina_2023_12_transformada"
# Gráfico: petróleo nominal vs real; Base diciembre 2023
ggplot(precios_reales_2023, aes(x = fecha)) +
geom_line(aes(y = precio_petroleo,
color = "Precio nominal")) +
geom_line(aes(y = precio_petroleo_2023_12_transformada,
color = "Precio real (base dic-2023)")) +
labs(title = "Evolución del precio del petróleo: nominal vs real (base dic-2023)",
x = "Fecha",
y = "Precio",
color = "Tipo de precio") +
scale_color_manual(values = c("Precio nominal" = "red",
"Precio real (base dic-2023)" = "blue")) +
theme_minimal()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
# Visualización de resultados: precios de gasolina nominal vs real
precios_reales_2023 %>%
select(fecha, starts_with("precio_gasolina")) %>%
head(10)
## # A tibble: 10 × 3
## fecha precio_gasolina precio_gasolina_2023_12_transformada
## <date> <dbl> <dbl>
## 1 2000-01-01 61.6 211.
## 2 2000-02-01 71.3 238.
## 3 2000-03-01 66.9 220.
## 4 2000-04-01 64.7 210.
## 5 2000-05-01 65.2 211.
## 6 2000-06-01 66.2 214.
## 7 2000-07-01 69.4 225.
## 8 2000-08-01 64.3 208.
## 9 2000-09-01 66.6 214.
## 10 2000-10-01 70.8 227.
summary(precios_reales_2023[, grepl("precio_gasolina", names(precios_reales_2023))])
## precio_gasolina precio_gasolina_2023_12_transformada
## Min. : 61.65 Min. :150.7
## 1st Qu.: 87.29 1st Qu.:186.3
## Median :108.46 Median :194.9
## Mean :109.17 Mean :193.9
## 3rd Qu.:130.80 3rd Qu.:202.7
## Max. :166.10 Max. :238.3
## NA's :1
1.10. Exportacion de base de datos consolidada en un archivo csv
write_csv(precios_comb, "precios_consolidados.csv")
Analisis de datos a partir de la base consolidad
2.1. Tabla de estadisticas descriptivas
base <- read.csv("precios_consolidados.csv", header = TRUE, sep = ";")
# ===========================================
# 2.1 Estadísticas descriptivas: precios nominales y reales
# ===========================================
# Calcular precios reales
precios_mensual <- precios_mensual %>%
mutate(
precio_carbon_real = precio_carbon / ipc * 100,
precio_gas_natural_real = precio_gas_natural / ipc * 100,
precio_petroleo_real = precio_petroleo / ipc * 100,
precio_gasolina_real = precio_gasolina / ipc * 100
)
# Variables a analizar
vars <- c("precio_carbon", "precio_gas_natural", "precio_petroleo", "precio_gasolina",
"precio_carbon_real", "precio_gas_natural_real", "precio_petroleo_real", "precio_gasolina_real")
# Generar estadísticas descriptivas
tabla_estadisticas <- precios_mensual %>%
summarise(across(all_of(vars),
list(
Observaciones = ~sum(!is.na(.)),
Promedio = ~mean(., na.rm = TRUE),
Min = ~min(., na.rm = TRUE),
Max = ~max(., na.rm = TRUE),
DesvEstandar = ~sd(., na.rm = TRUE)
),
.names = "{.col}_{.fn}"
))
# Ordenar tabla final
tabla_final <- data.frame(
Variable = vars,
Observaciones = as.numeric(tabla_estadisticas[1, grep("Observaciones", names(tabla_estadisticas))]),
Promedio = as.numeric(tabla_estadisticas[1, grep("Promedio", names(tabla_estadisticas))]),
Minimo = as.numeric(tabla_estadisticas[1, grep("Min", names(tabla_estadisticas))]),
Maximo = as.numeric(tabla_estadisticas[1, grep("Max", names(tabla_estadisticas))]),
Desv_Estandar = as.numeric(tabla_estadisticas[1, grep("DesvEstandar", names(tabla_estadisticas))])
)
# mostrar tabla
kable(tabla_final, caption = "Tabla 2.1. Estadísticas descriptivas de precios nominales y reales de combustibles")
| Variable | Observaciones | Promedio | Minimo | Maximo | Desv_Estandar |
|---|---|---|---|---|---|
| precio_carbon | 289 | 96.97914 | 74.21067 | 123.1634 | 12.677787 |
| precio_gas_natural | 289 | 118.26501 | 98.64794 | 137.7059 | 8.372448 |
| precio_petroleo | 289 | 108.07939 | 91.24837 | 129.8050 | 7.984368 |
| precio_gasolina | 289 | 109.16889 | 61.64844 | 166.0969 | 25.773982 |
| precio_carbon_real | 288 | 129.60804 | 84.35153 | 196.0833 | 23.643155 |
| precio_gas_natural_real | 288 | 161.40814 | 91.97212 | 266.4538 | 40.201329 |
| precio_petroleo_real | 288 | 147.12141 | 84.15660 | 238.0556 | 35.605746 |
| precio_gasolina_real | 288 | 140.80407 | 109.43081 | 173.0489 | 10.242478 |
2.2 Grafica de dispersion de puntos
# ===========================================
# 2.2 Gráfica de dispersión precios reales
# ===========================================
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ purrr 1.1.0 ✔ tibble 3.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%() masks ggplot2::%+%()
## ✖ psych::alpha() masks ggplot2::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ tibble::view() masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Filtrar datos para un año determinado
anio_filtro <- 2023
datos_2023 <- precios_mensual %>%
filter(anio == anio_filtro)
# Gráfica de dispersión
library(ggplot2)
ggplot(datos_2023, aes(x = precio_carbon_real, y = precio_gasolina_real)) +
geom_point(color = "#1f78b4", size = 4, alpha = 0.8, shape = 21, fill = "#a6cee3", stroke = 0.8) + # puntos con borde
geom_smooth(method = "lm", se = TRUE, color = "#e31a1c", fill = "#fbb4b9", linewidth = 1.2) + # línea de ajuste con banda de confianza
labs(
title = paste("Relación entre precios reales del carbón y gasolina en", anio_filtro),
subtitle = "Gráfico de dispersión con línea de ajuste lineal",
x = "Precio real del carbón (base IPC = 100)",
y = "Precio real de la gasolina (base IPC = 100)",
caption = "Fuente: Elaboración propia con base en datos consolidados"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", size = 16, color = "#333333"),
plot.subtitle = element_text(color = "#555555", size = 13),
plot.caption = element_text(color = "#777777", size = 10),
panel.grid.major = element_line(color = "gray85"),
panel.grid.minor = element_blank(),
axis.title = element_text(face = "bold", color = "#333333")
)
## `geom_smooth()` using formula = 'y ~ x'
La gráfica muestra la relación entre el precio real del carbón y el
precio real de la gasolina en 2023. Se observa una tendencia positiva
suave, lo que indica que cuando el precio del carbón aumenta, el de la
gasolina también tiende a subir. Sin embargo, la dispersión de los
puntos sugiere que la relación es débil, ya que otros factores también
influyen en los precios.
2.3 Presente una grafica de serie de tiemo real para todas las variables excepto IPC
# Filtrar un año específico
anio_filtro <- 2023
datos_2023 <- precios_mensual %>%
filter(anio == anio_filtro) %>%
select(fecha, precio_carbon_real, precio_gas_natural_real,
precio_petroleo_real, precio_gasolina_real) %>%
pivot_longer(
cols = starts_with("precio_"),
names_to = "combustible",
values_to = "precio_real"
)
# Limpiar nombres para la leyenda
datos_2023 <- datos_2023 %>%
mutate(combustible = case_when(
combustible == "precio_carbon_real" ~ "Carbón",
combustible == "precio_gas_natural_real" ~ "Gas Natural",
combustible == "precio_petroleo_real" ~ "Petróleo",
combustible == "precio_gasolina_real" ~ "Gasolina Corriente"
))
# Gráfica de serie de tiempo
ggplot(datos_2023, aes(x = fecha, y = precio_real, color = combustible)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
labs(
title = paste("Evolución mensual de los precios reales de combustibles en", anio_filtro),
subtitle = "Valores reales ajustados por IPC (base 100)",
x = "Mes",
y = "Precio real (base IPC = 100)",
color = "Combustible",
caption = "Fuente: Elaboración propia con base en datos consolidados"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
plot.subtitle = element_text(color = "gray30"),
legend.position = "bottom"
)
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,
ajustados por el IPC. Se observa que la Gasolina Corriente mantiene los
valores más altos a lo largo del año, con leves fluctuaciones que
evidencian una tendencia ligeramente creciente. El Gas Natural presenta
un comportamiento más inestable, con incrementos marcados a comienzos
del año y descensos hacia el segundo semestre. El Petróleo se mantiene
en niveles intermedios, destacando un repunte en julio, mientras que el
Carbón exhibe los precios reales más bajos y una trayectoria estable. En
conjunto, la gráfica refleja diferencias claras en la dinámica de cada
combustible y sugiere que los precios responden tanto a factores del
mercado internacional como a ajustes internos en los costos
energéticos.