Cargamos los paquetes que estaremos utilizando.
Listamos los archivos que descargamos.
Leemos los archivos.
Fitramos los datos que se leyeron correctamente.
Unimos todas las bases de datos y vemos el resultado.
# 1. Cargar los paquetes necesarios
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(magrittr)
library(stringr)
# 1.1 Lista de archivos CSV
archivos_csv <- c("P_2018_T1.csv", "P_2018_T2.csv", "P_2018_T3.csv", "P_2018_T4.csv",
"P_2019_T1.csv", "P_2019_T2.csv", "P_2019_T3.csv", "P_2019_T4.csv",
"P_2020_T1.csv", "P_2020_T2.csv", "P_2020_T3.csv", "P_2020_T4.csv",
"P_2021_T1.csv", "P_2021_T2.csv", "P_2021_T3.csv", "P_2021_T4.csv",
"P_2022_T1.csv", "P_2022_T2.csv", "P_2022_T3.csv", "P_2022_T4.csv",
"P_2023_T1.csv", "P_2023_T2.csv", "P_2023_T3.csv", "P_2023_T4.csv",
"P_2024_T1.csv", "P_2024_T2.csv")
# 1.2 Leer todos los archivos CSV en una lista de dataframes
lista_bases_datos <- lapply(archivos_csv, function(archivo) {
df <- tryCatch(read.csv(archivo), error = function(e) NULL)
if (is.null(df)) {
message(paste("Error al leer el archivo:", archivo))
}
return(df)
})
# 1.3 Filtrar solo los dataframes que se leyeron correctamente
lista_bases_datos <- Filter(Negate(is.null), lista_bases_datos)
# 1.4 Unir todas las bases de datos usando bind_rows para conservar todas las columnas
base_unida <- bind_rows(lista_bases_datos)
# Ver el resultado
head(base_unida)
## BANDERA NOMBRE.COMERCIAL PRODUCTO FECHA.REGISTRO
## 1 TERPEL ESTACION DE SERVICIO AVENIDA SEXTA GASOLINA MOTOR 01-Jan-2018
## 2 TERPEL ESTACION DE SERVICIO AVENIDA SEXTA DIESEL 01-Jan-2018
## 3 BIOMAX EDS ESSO BELLO MADERA EXTRA 01-Jan-2018
## 4 BIOMAX EDS ESSO BELLO MADERA DIESEL 01-Jan-2018
## 5 BIOMAX EDS ESSO BELLO MADERA GASOLINA MOTOR 01-Jan-2018
## 6 TERPEL ESTACION DE SERVICIO BOMBA VILLA LUZ DIESEL 01-Jan-2018
## DEPARTAMENTO MUNICIPIO VALOR.PRECIO
## 1 AMAZONAS LETICIA 9030
## 2 AMAZONAS LETICIA 8250
## 3 ANTIOQUIA BELLO 11390
## 4 ANTIOQUIA BELLO 8220
## 5 ANTIOQUIA BELLO 8320
## 6 ANTIOQUIA BETULIA 9050
Observamos las dimensiones de la base de datos.
# 2. Dimensiones de la base de datos
dim(base_unida)
## [1] 1655022 7
Observamos los nombre de todas las columnas que se encuentran en la base de datos
# 3. Nombre de las columnas
nombres1<- names(base_unida); nombres1 #Nombres de las columnas
## [1] "BANDERA" "NOMBRE.COMERCIAL" "PRODUCTO" "FECHA.REGISTRO"
## [5] "DEPARTAMENTO" "MUNICIPIO" "VALOR.PRECIO"
Pedimos que nos muestre el tipo de variable de cada una de las columnas.
# 4. Tipo de variables
base_unida %>% glimpse #Tipos de variables
## Rows: 1,655,022
## Columns: 7
## $ BANDERA <chr> "TERPEL", "TERPEL", "BIOMAX", "BIOMAX", "BIOMAX", "TE…
## $ NOMBRE.COMERCIAL <chr> "ESTACION DE SERVICIO AVENIDA SEXTA", "ESTACION DE SE…
## $ PRODUCTO <chr> "GASOLINA MOTOR", "DIESEL", "EXTRA", "DIESEL", "GASOL…
## $ FECHA.REGISTRO <chr> "01-Jan-2018", "01-Jan-2018", "01-Jan-2018", "01-Jan-…
## $ DEPARTAMENTO <chr> "AMAZONAS", "AMAZONAS", "ANTIOQUIA", "ANTIOQUIA", "AN…
## $ MUNICIPIO <chr> "LETICIA", "LETICIA", "BELLO", "BELLO", "BELLO", "BET…
## $ VALOR.PRECIO <dbl> 9030, 8250, 11390, 8220, 8320, 9050, 9760, 8040, 9020…
Observamos que en las colmunas no tenemos el mes, por lo tanto es un valor “NULL”
unique(base_unida$mes)
## NULL
Reducimos el sombre de San Andrés Islas
# 5. Cambiamos de nombre a San Andrés
base_unida$DEPARTAMENTO[base_unida$DEPARTAMENTO
== "ARCHIPIELAGO DE SAN ANDRES, SANTA CATALINA Y PROVIDENCIA"] <- "SAN ANDRES ISLAS"
Nos muestra los departamentos
# 6. Departamentos
base_unida$DEPARTAMENTO %<>% str_replace_all("\\?","Ñ");unique(base_unida$DEPARTAMENTO)
## [1] "AMAZONAS" "ANTIOQUIA" "ATLANTICO"
## [4] "BOGOTA D.C." "BOLIVAR" "BOYACA"
## [7] "CALDAS" "CAQUETA" "CASANARE"
## [10] "CAUCA" "CESAR" "CORDOBA"
## [13] "CUNDINAMARCA" "HUILA" "LA GUAJIRA"
## [16] "MAGDALENA" "META" "NARIÑO"
## [19] "NORTE DE SANTANDER" "PUTUMAYO" "QUINDIO"
## [22] "RISARALDA" "SANTANDER" "SUCRE"
## [25] "TOLIMA" "VALLE DEL CAUCA" "VICHADA"
## [28] "-" "ARAUCA" "SAN ANDRES ISLAS"
## [31] "CHOCO" "GUAINIA" "GUAVIARE"
## [34] "VAUPES"
Nos muestra el tipo de producto
# 7. Tipo de producto
base_unida$MUNICIPIO %<>% str_replace_all("\\?","Ñ")
unique(base_unida$PRODUCTO)
## [1] "GASOLINA MOTOR" "DIESEL" "EXTRA"
Verificamos los valores “NA”
# 8. Verifiar los NA:
nas<-!complete.cases(base_unida) #Determinar filas con al menos un NA
Nas_tabla<-base_unida[nas,] #Tabla registros con NA, 3 datos faltantes en nombre comercial
"El nombre comercial es una variable categórica que posría ser reemplazada consultando con el dueño de la data"
## [1] "El nombre comercial es una variable categórica que posría ser reemplazada consultando con el dueño de la data"
Observamos los datos atípicos y se realiza un boxplot de esos valores
# 9. Observar datos atípicos:
summary(base_unida)
## BANDERA NOMBRE.COMERCIAL PRODUCTO FECHA.REGISTRO
## Length:1655022 Length:1655022 Length:1655022 Length:1655022
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## DEPARTAMENTO MUNICIPIO VALOR.PRECIO
## Length:1655022 Length:1655022 Min. : 0
## Class :character Class :character 1st Qu.: 8460
## Mode :character Mode :character Median : 9220
## Mean : 10256
## 3rd Qu.: 10920
## Max. :14750147
## NA's :20
boxplot(base_unida$VALOR.PRECIO) #Existe un dato atípico en los precios, valor muy alto
Se buscan los datos atípicos de los precios y se realiza un boxplot
# 10. Datos atípicos en los precios
require(dplyr)
atip<-filter(base_unida, VALOR.PRECIO>50000);atip #Detección de datos atípico en precios
## BANDERA
## 1 COOMULPINORT
## 2 BIOMAX
## 3 TERPEL
## 4 TERPEL
## 5 TERPEL
## 6 PRIMAX
## 7 TEXACO
## 8 PRIMAX
## 9 PETROMIL
## 10 TERPEL
## 11 PETRDECOL
## 12 ECOS
## 13 PUMA
## 14 BIOMAX
## 15 TERPEL
## 16 TERPEL
## 17 BIOMAX
## 18 TERPEL
## 19 TERPEL
## 20 TERPEL
## 21 TERPEL
## 22 PETROMIL
## 23 TERPEL
## 24 PRIMAX
## 25 PUMA
## 26 PRIMAX
## 27 ECOS
## 28 BRIO
## 29 TERPEL
## 30 TERPEL
## 31 PETROMIL
## 32 PETROMIL
## 33 TERPEL
## 34 PETROMIL
## 35 PETROMIL
## 36 PETROMIL
## 37 TERPEL
## 38 TERPEL
## 39 TERPEL
## 40 TERPEL
## 41 TERPEL
## 42 TERPEL
## 43 TERPEL
## 44 TERPEL
## 45 TERPEL
## 46 TERPEL
## 47 TERPEL
## 48 TERPEL
## 49 PETROMIL
## 50 PETROMIL
## 51 PETROMIL
## 52 AYATAWACOOP
## 53 AYATAWACOOP
## 54 AYATAWACOOP
## 55 AYATAWACOOP
## 56 AYATAWACOOP
## 57 AYATAWACOOP
## 58 AYATAWACOOP
## 59 AYATAWACOOP
## 60 AYATAWACOOP
## 61 AYATAWACOOP
## 62 AYATAWACOOP
## 63 AYATAWACOOP
## 64 PETROMIL
## NOMBRE.COMERCIAL
## 1 ESTACION DE SERVICIO LOS ADIOSES
## 2 ESTACION DE SERVICIO SAN DIEGO GUACHUCAL
## 3 ESTACIÓN DE SERVICIO EL PASO COROZAL
## 4 EDS TERPEL AEROPUERTO COROZAL
## 5 EDS TERPEL AEROPUERTO COROZAL
## 6 EDS COESCO EL LIDO
## 7 ESTACION DE SERVICIO SAN NICOLAS DQ
## 8 ESTACION DE SERVICIO DISTRIBUIDORA SERVICENTRO LAS AVENIDAS S.A.S.
## 9 ESTACION DE SERVICIO AUTOMOTRIZ SANTA MONICA J M
## 10 ESTACION DE SERVICIO LUIS LOZANO
## 11 SERVICENTRO EL PORTAL
## 12 ESTACION DE SERVICIO SAN JOSE DN
## 13 ESTACION DE SERVICIO AUTOMOTRIZ EL GRAN WIPAMA
## 14 ESTACION DE SERVICIO LA SOFIA DANIELA
## 15 ESTACION DE SERVICIO EL CERRO
## 16 ESTACIÓN DE SERVICIO EL PASO COROZAL
## 17 EDS DOÑA DANIELA
## 18 ESTACION DE SERVICIO ESTACION DE LLENADO SAN MARCEL
## 19 ESTACION DE SERVICIO LA CRISTALINA CENTRAL
## 20 ESTACION DE SERVICIO AUTOMOTRIZ ROUND POINT
## 21 ESTACION DE SERVICIO AUTOMOTRIZ ROUND POINT
## 22 ESTACION DE SERVICIO GUANENTA
## 23 TERPEL JAIME ROOKE
## 24 ESTACION DE SERVICIO AUTOCENTRO SANTANA SAS
## 25 INVERSIONES Y ESTACIÓN DE SERVICIOS AUTOMOTRIZ DOÑA CORI SAS
## 26 ESTACION DE SERVICIO LA VORAGINE
## 27 ESTACION DE SERVICIO SAN JOSE CARTAGENA
## 28 BRIO PEAJE
## 29 ESTACION DE SERVICIO COROZAL JORGE SANCHEZ
## 30 LA PRIMAVERA EDS
## 31 ESTACION DE SERVICIO GUANENTA
## 32 ESTACION DE SERVICIO GUANENTA
## 33 ESTACION DE SERVICIO LA CABRERA
## 34 ESTACION DE SERVICIO GUANENTA
## 35 ESTACION DE SERVICIO GUANENTA
## 36 ESTACION DE SERVICIO GUANENTA
## 37 EDS AVENIDA SIERRA NEVADA
## 38 EDS AVENIDA SIERRA NEVADA
## 39 EDS AVENIDA SIERRA NEVADA
## 40 EDS AVENIDA SIERRA NEVADA
## 41 EDS AVENIDA SIERRA NEVADA
## 42 EDS AVENIDA SIERRA NEVADA
## 43 EDS AVENIDA SIERRA NEVADA
## 44 EDS AVENIDA SIERRA NEVADA
## 45 EDS AVENIDA SIERRA NEVADA
## 46 EDS AVENIDA SIERRA NEVADA
## 47 EDS AVENIDA SIERRA NEVADA
## 48 EDS AVENIDA SIERRA NEVADA
## 49 ESTACION DE SERVICIO GUANENTA
## 50 ESTACION DE SERVICIO GUANENTA
## 51 ESTACION DE SERVICIO GUANENTA
## 52 ESTACION DE SERVICIO EL BOSQUE
## 53 ESTACION DE SERVICIO EL BOSQUE
## 54 ESTACION DE SERVICIO EL BOSQUE
## 55 ESTACION DE SERVICIO EL BOSQUE
## 56 ESTACION DE SERVICIO EL BOSQUE
## 57 ESTACION DE SERVICIO EL BOSQUE
## 58 ESTACION DE SERVICIO EL BOSQUE
## 59 ESTACION DE SERVICIO EL BOSQUE
## 60 ESTACION DE SERVICIO EL BOSQUE
## 61 ESTACION DE SERVICIO EL BOSQUE
## 62 ESTACION DE SERVICIO EL BOSQUE
## 63 ESTACION DE SERVICIO EL BOSQUE
## 64 ESTACION DE SERVICIO GUANENTA
## PRODUCTO FECHA.REGISTRO DEPARTAMENTO MUNICIPIO
## 1 GASOLINA MOTOR 01-Dec-2021 NORTE DE SANTANDER PAMPLONA
## 2 GASOLINA MOTOR 01-Feb-2022 NARIÑO GUACHUCAL
## 3 GASOLINA MOTOR 01-Jul-2023 NORTE DE SANTANDER LOS PATIOS
## 4 GASOLINA MOTOR 01-Jul-2023 SUCRE COROZAL
## 5 DIESEL 01-Jul-2023 SUCRE COROZAL
## 6 DIESEL 01-Jul-2023 VALLE DEL CAUCA CALI
## 7 GASOLINA MOTOR 02-Jul-2023 RISARALDA DOSQUEBRADAS
## 8 GASOLINA MOTOR 03-Jul-2023 NARIÑO PASTO
## 9 GASOLINA MOTOR 05-Jul-2023 MAGDALENA SANTA MARTA
## 10 DIESEL 06-Jul-2023 ANTIOQUIA PUERTO TRIUNFO
## 11 GASOLINA MOTOR 06-Jul-2023 NARIÑO SANTA BÁRBARA
## 12 DIESEL 08-Jul-2023 BOLIVAR SAN JUAN NEPOMUCENO
## 13 DIESEL 08-Jul-2023 MAGDALENA ARIGUANÍ
## 14 DIESEL 09-Jul-2023 CAUCA GUACHENÉ
## 15 DIESEL 15-Jul-2023 CESAR AGUACHICA
## 16 DIESEL 15-Jul-2023 NORTE DE SANTANDER LOS PATIOS
## 17 GASOLINA MOTOR 01-Sep-2023 BOLIVAR MONTECRISTO
## 18 DIESEL 01-Sep-2023 CALDAS MANIZALES
## 19 DIESEL 01-Sep-2023 CESAR CURUMANÍ
## 20 DIESEL 01-Sep-2023 HUILA ALTAMIRA
## 21 GASOLINA MOTOR 01-Sep-2023 HUILA ALTAMIRA
## 22 EXTRA 01-Sep-2023 SANTANDER PINCHOTE
## 23 DIESEL 01-Sep-2023 TOLIMA IBAGUÉ
## 24 DIESEL 02-Sep-2023 BOGOTA D.C. BOGOTÁ, D.C.
## 25 GASOLINA MOTOR 02-Sep-2023 BOLIVAR ARROYOHONDO
## 26 DIESEL 02-Sep-2023 META VILLAVICENCIO
## 27 GASOLINA MOTOR 07-Sep-2023 BOLIVAR TURBACO
## 28 DIESEL 11-Sep-2023 CUNDINAMARCA SOACHA
## 29 EXTRA 20-Sep-2023 NORTE DE SANTANDER LOS PATIOS
## 30 GASOLINA MOTOR 21-Sep-2023 CORDOBA COTORRA
## 31 EXTRA 02-Oct-2023 SANTANDER PINCHOTE
## 32 EXTRA 02-Nov-2023 SANTANDER PINCHOTE
## 33 DIESEL 01-Dec-2023 NORTE DE SANTANDER SAN JOSÉ DE CÚCUTA
## 34 EXTRA 01-Dec-2023 SANTANDER PINCHOTE
## 35 EXTRA 02-Jan-2024 SANTANDER PINCHOTE
## 36 EXTRA 01-Feb-2024 SANTANDER PINCHOTE
## 37 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 38 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 39 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 40 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 41 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 42 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 43 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 44 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 45 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 46 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 47 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 48 GASOLINA MOTOR 28-Feb-2024 CESAR VALLEDUPAR
## 49 EXTRA 02-Mar-2024 SANTANDER PINCHOTE
## 50 EXTRA 01-Apr-2024 SANTANDER PINCHOTE
## 51 EXTRA 02-May-2024 SANTANDER PINCHOTE
## 52 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 53 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 54 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 55 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 56 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 57 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 58 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 59 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 60 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 61 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 62 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 63 DIESEL 07-May-2024 LA GUAJIRA DIBULLA
## 64 EXTRA 01-Jun-2024 SANTANDER PINCHOTE
## VALOR.PRECIO
## 1 74900
## 2 81690
## 3 115120
## 4 128600
## 5 86990
## 6 102420
## 7 133000
## 8 111160
## 9 132400
## 10 94100
## 11 115000
## 12 85100
## 13 92500
## 14 97000
## 15 86900
## 16 96150
## 17 14750147
## 18 91340
## 19 82000
## 20 94600
## 21 140580
## 22 160000
## 23 93700
## 24 98340
## 25 146650
## 26 91415
## 27 135900
## 28 87300
## 29 195000
## 30 148000
## 31 160000
## 32 160000
## 33 71590
## 34 200000
## 35 120000
## 36 120000
## 37 88190
## 38 88190
## 39 88190
## 40 88190
## 41 88190
## 42 88190
## 43 88190
## 44 88190
## 45 88190
## 46 88190
## 47 88190
## 48 88190
## 49 120000
## 50 70000
## 51 70000
## 52 79484
## 53 79484
## 54 79484
## 55 79484
## 56 79484
## 57 79484
## 58 79484
## 59 79484
## 60 79484
## 61 79484
## 62 79484
## 63 79484
## 64 70000
library(tidyr)
##
## Adjuntando el paquete: 'tidyr'
## The following object is masked from 'package:magrittr':
##
## extract
base_unida$VALOR.PRECIO[base_unida$VALOR.PRECIO>50000]<-NA #Atípico como NA
#Reemplazar NA con la mediana de los precios
base_unida$VALOR.PRECIO <- replace_na(base_unida$VALOR.PRECIO,median(base_unida$VALOR.PRECIO,na.rm = T))
boxplot(base_unida$VALOR.PRECIO) #Mejora la distribución de los datos
Se realiza un boxplot de la distrubición de los precios por el tipo de combustible.
# 11. Boxplot distribución de precios por el tipo de combustible
library(ggplot2)
base_unida_filtered <- base_unida %>%
filter(VALOR.PRECIO < 20000) # Ajusta el umbral según sea necesario
ggplot(base_unida_filtered, aes(x = PRODUCTO, y = VALOR.PRECIO, fill = PRODUCTO)) +
geom_boxplot(outlier.shape = NA) + # Elimina la visualización de valores atípicos extremos
labs(title = "Distribucion de Precios por Tipo de Combustible",
x = "Producto",
y = "Precio") +
theme_minimal() +
theme(legend.position = "none",
axis.text.x = element_text(angle = 45, hjust = 1), # Gira el texto para mejorar la legibilidad
plot.title = element_text(hjust = 0.5)) + # Centra el título
scale_y_continuous(labels = scales::comma) # Añade separadores de miles al eje y
Se realiza una gráfica de distrubución del precio promedio segun el tipo de combustible
# 12. Distribución, precio del combustible según tipo:
resum2 <- base_unida %>% group_by(PRODUCTO,FECHA.REGISTRO) %>%
summarise(p_prom2=mean(VALOR.PRECIO))
## `summarise()` has grouped output by 'PRODUCTO'. You can override using the
## `.groups` argument.
ggplot(resum2, aes(x = p_prom2, fill = PRODUCTO)) +
geom_density(alpha = 0.4) +
xlab("Precio promedio") +
ylab("Densidad") +
ggtitle("Distribucion precio promedio combustibles segun el tipo") +
theme_minimal()