library(ggplot2)
library(tidyverse)
library(ggcorrplot)
library(forecast)
library(tseries)
library(lubridate)
library(tidyverse)
library(car)
library(astsa)
library(foreign)
library(timsac)
library(vars)
library(lmtest)
library(mFilter)
library(dynlm)
library(nlme)
library(lmtest)
library(broom)
library(kableExtra)
library(knitr)
library(MASS)
library(parallel)
library(car)
library(mlogit)
library(dplyr)
library(tidyr)
library(forecast)
library(fpp2)
library(stats)
library(quantmod)
# Evitamos que nos los Datos se Carguen en notación cientifica
options(scipen = 999)
setwd("C:/Users/ronal/OneDrive - Universidad APEC - Académico/Documentos/Master Big Data & Business Intelligence/Directorio R/TFM/Data/TFM MASTER BD&BI-20240319T225551Z-001/TFM MASTER BD&BI")
getwd()
## [1] "C:/Users/ronal/OneDrive - Universidad APEC - Académico/Documentos/Master Big Data & Business Intelligence/Directorio R/TFM/Data/TFM MASTER BD&BI-20240319T225551Z-001/TFM MASTER BD&BI"
Data_Comercializacion = read.csv("Tabla Comercialización.csv")
head(Data_Comercializacion)
## FUERZA.O.DEPENDENCIA CONTRATO.No.
## 1 EJC 03-RO-MDN-EJC-JEAVE
## 2 ARC 284-ARC-DIABA-2014
## 3 PONAL PN-DIRAN No. 02-5-10116-14
## 4 EJC 02/14-RO-MDN-EJC-JEAVE-2014
## 5 EJC 212-JEAVE-2014
## 6 UNION TEMPORAL PW121 PROCESO SIMPLIFICADO
## OBJETO
## 1 MODIFICATORIO 3 y ADICION 1 / Valor del contrato y forma de pago / Plazo y lugar de ejecuci\xa2n / Garant\xa1as
## 2 MODIFICATORIO 1 ADICION Y PRORROGA / Valor del contrato y forma de pago / Plazo de ejecuci\xa2n / Garant\xa1as
## 3 MODIFICATORIO OBJETO PARA INCLUIR EL SIGUIENTE TEXTO: "Los bienes objeto de mantenimiento, bajo la normatividad del articulo 428 del Estatuto Tributario Literal D en concordancia con el Decreto 695 de 1983, relacionados con la importaci\xa2n de bienes para la Seguridad y Defensa Nacional. Los cuales se encuentran excluidos del impuesto al valor agregado IVA"
## 4 MODIFICATORIO 2 / Plazo y lugar de ejecuci\xa2n / Garant\xa1as/ Clausula Octava/
## 5 MODIFICATORIO 4 /Plazo de Ejecuci\xa2n / GARANTIAS
## 6 Instalaci\xa2n Motor, helice, ensamble reglaje y pruebas
## MES FECHA.SUSCRIPCION FECHA.DE.VENCIMIENTO VALOR.CONTRATADO
## 1 FEBRERO 2/27/2015 4/30/2015 1188905179
## 2 FEBRERO 2/26/2015 11/30/2015 300000000
## 3 MARZO 3/18/2015 7/1/2015 NA
## 4 MARZO 3/27/2015 6/10/2015 NA
## 5 MARZO 3/31/2015 5/10/2015 NA
## 6 MARZO 3/3/2015 3/3/2015 9000000
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## 1 19577510818
## 2 22845129676
## 3
## 4
## 5
## 6 9000000
## FUERZA.PUBLICA CANAL.CIVIL
## 1 1188905179 NA
## 2 300000000 NA
## 3 NA NA
## 4 NA NA
## 5 NA NA
## 6 NA 9000000
## PROCESO X
## 1 SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS
## 2 SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS
## 3 SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS
## 4 SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS
## 5 SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS
## 6 SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS
str(Data_Comercializacion)
## 'data.frame': 319 obs. of 12 variables:
## $ FUERZA.O.DEPENDENCIA : chr "EJC" "ARC" "PONAL" "EJC" ...
## $ CONTRATO.No. : chr "03-RO-MDN-EJC-JEAVE" "284-ARC-DIABA-2014" "PN-DIRAN No. 02-5-10116-14 " " 02/14-RO-MDN-EJC-JEAVE-2014 " ...
## $ OBJETO : chr "MODIFICATORIO 3 y ADICION 1 / Valor del contrato y forma de pago / Plazo y lugar de ejecuci\xa2n / Garant\xa1as" "MODIFICATORIO 1 ADICION Y PRORROGA / Valor del contrato y forma de pago / Plazo de ejecuci\xa2n / Garant\xa1as" "MODIFICATORIO OBJETO PARA INCLUIR EL SIGUIENTE TEXTO: \"Los bienes objeto de mantenimiento, bajo la normatividad del articulo 4 "MODIFICATORIO 2 / Plazo y lugar de ejecuci\xa2n / Garant\xa1as/ Clausula Octava/" ...
## $ MES : chr "FEBRERO" "FEBRERO" "MARZO" "MARZO" ...
## $ FECHA.SUSCRIPCION : chr "2/27/2015" "2/26/2015" "3/18/2015" "3/27/2015" ...
## $ FECHA.DE.VENCIMIENTO : chr "4/30/2015" "11/30/2015" "7/1/2015" "6/10/2015" ...
## $ VALOR.CONTRATADO : num 1188905179 300000000 NA NA NA ...
## $ VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO: chr "19577510818" "22845129676" "" "" ...
## $ FUERZA.PUBLICA : num 1188905179 300000000 NA NA NA ...
## $ CANAL.CIVIL : num NA NA NA NA NA ...
## $ PROCESO : chr "SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS" "SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS" "SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS" "SERVICIOS ASOCIADOS - COMERCIALIZACION DE BIENES Y SERVICIOS" ...
## $ X : chr "" "" "" "" ...
Data_Comercializacion$FECHA.SUSCRIPCION <- as.Date(Data_Comercializacion$FECHA.SUSCRIPCION, format = "%m/%d/%Y")
Data_Comercializacion$FECHA.DE.VENCIMIENTO <- as.Date(Data_Comercializacion$FECHA.DE.VENCIMIENTO, format = "%m/%d/%Y")
na_por_columna <- sapply(Data_Comercializacion, function(x) sum(is.na(x)))
print("Número de valores NA por columna:")
## [1] "Número de valores NA por columna:"
print(na_por_columna)
## FUERZA.O.DEPENDENCIA
## 0
## CONTRATO.No.
## 0
## OBJETO
## 0
## MES
## 0
## FECHA.SUSCRIPCION
## 1
## FECHA.DE.VENCIMIENTO
## 1
## VALOR.CONTRATADO
## 69
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## 0
## FUERZA.PUBLICA
## 128
## CANAL.CIVIL
## 250
## PROCESO
## 0
## X
## 0
Data_Comercializacion$VALOR.CONTRATADO[is.na(Data_Comercializacion$VALOR.CONTRATADO)] <- 0
Data_Comercializacion$FUERZA.PUBLICA[is.na(Data_Comercializacion$FUERZA.PUBLICA)] <- 0
Data_Comercializacion$CANAL.CIVIL[is.na(Data_Comercializacion$CANAL.CIVIL)] <- 0
na_por_columna <- sapply(Data_Comercializacion, function(x) sum(is.na(x)))
print("Número de valores NA por columna:")
## [1] "Número de valores NA por columna:"
print(na_por_columna)
## FUERZA.O.DEPENDENCIA
## 0
## CONTRATO.No.
## 0
## OBJETO
## 0
## MES
## 0
## FECHA.SUSCRIPCION
## 1
## FECHA.DE.VENCIMIENTO
## 1
## VALOR.CONTRATADO
## 0
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## 0
## FUERZA.PUBLICA
## 0
## CANAL.CIVIL
## 0
## PROCESO
## 0
## X
## 0
registro_na_fecha <- subset(Data_Comercializacion, is.na(FECHA.SUSCRIPCION))
print(registro_na_fecha)
## FUERZA.O.DEPENDENCIA CONTRATO.No. OBJETO
## 209 FAC 086-00-J-EMAVI-GRUTE-2020 MODIFICATORIO 3 RESERVA
## MES FECHA.SUSCRIPCION FECHA.DE.VENCIMIENTO VALOR.CONTRATADO
## 209 DICIEMBRE <NA> 2021-01-30 0
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## 209 393868104
## FUERZA.PUBLICA CANAL.CIVIL PROCESO X
## 209 0 0 DILOA
Vemos que la fecha NA pertenece al mes de diciembre del 2020, como vamos a utilizar la data para hacer un modelo predictivo con series de tiempo que sería de manera mensual, trimestral o anual pudieramos hacer una imputación a este campo ya sabiendo que pertenece a Diciembre del 2020
Data_Comercializacion$FECHA.SUSCRIPCION <- ifelse(is.na(Data_Comercializacion$FECHA.SUSCRIPCION), as.Date("2020-12-01"), Data_Comercializacion$FECHA.SUSCRIPCION)
registro_na_fecha <- subset(Data_Comercializacion, is.na(FECHA.SUSCRIPCION))
print(registro_na_fecha)
## [1] FUERZA.O.DEPENDENCIA
## [2] CONTRATO.No.
## [3] OBJETO
## [4] MES
## [5] FECHA.SUSCRIPCION
## [6] FECHA.DE.VENCIMIENTO
## [7] VALOR.CONTRATADO
## [8] VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## [9] FUERZA.PUBLICA
## [10] CANAL.CIVIL
## [11] PROCESO
## [12] X
## <0 rows> (or 0-length row.names)
fechas_fuera_rango <- subset(Data_Comercializacion, FECHA.SUSCRIPCION < as.Date("2015-01-01") | FECHA.SUSCRIPCION > as.Date("2023-12-31"))
# Verificar si hay filas fuera del rango
if (nrow(fechas_fuera_rango) == 0) {
print("Todas las fechas de suscripción están dentro del rango 2015-2023.")
} else {
print("Hay fechas de suscripción fuera del rango 2015-2023:")
print(fechas_fuera_rango)
}
## [1] "Hay fechas de suscripción fuera del rango 2015-2023:"
## FUERZA.O.DEPENDENCIA CONTRATO.No. OBJETO MES
## 63 INVIAS 1741 DE 2015 MODIFICATORIO 2 ADICION Y PRORROGA OCTUBRE
## FECHA.SUSCRIPCION FECHA.DE.VENCIMIENTO VALOR.CONTRATADO
## 63 11599 2016-11-30 25000000
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## 63 89397235
## FUERZA.PUBLICA CANAL.CIVIL PROCESO X
## 63 0 25000000 COMERCIALIZACION DE BIENES Y SERVICIOS
Vemos que hay una fecha fuera del rango y colocamos el rango correspondiente y que esta corresponde al 4 de octubre de 2016, por tanto a este campo le colocamos la fecha correspondiente
# Reemplazar la fecha "2001-10-04" por "2016-10-04"
Data_Comercializacion$FECHA.SUSCRIPCION[Data_Comercializacion$FECHA.SUSCRIPCION == as.Date("2001-10-04")] <- as.Date("2016-10-04")
Data_Comercializacion$FECHA.SUSCRIPCION <- as.Date(Data_Comercializacion$FECHA.SUSCRIPCION)
Volvemos a Validar que las fechas estan en el rango del 2015 al 2023
fechas_fuera_rango <- subset(Data_Comercializacion, FECHA.SUSCRIPCION < as.Date("2015-01-01") | FECHA.SUSCRIPCION > as.Date("2023-12-31"))
# Verificar si hay filas fuera del rango
if (nrow(fechas_fuera_rango) == 0) {
print("Todas las fechas de suscripción están dentro del rango 2015-2023.")
} else {
print("Hay fechas de suscripción fuera del rango 2015-2023:")
print(fechas_fuera_rango)
}
## [1] "Todas las fechas de suscripción están dentro del rango 2015-2023."
# Extraer año y mes de FECHA.SUSCRIPCION
Data_Comercializacion$Year <- format(Data_Comercializacion$FECHA.SUSCRIPCION, "%Y")
Data_Comercializacion$Month <- format(Data_Comercializacion$FECHA.SUSCRIPCION, "%m")
# Crear una secuencia de todos los meses de 2015 a 2023
all_months <- expand.grid(
Year = as.character(2015:2023),
Month = sprintf("%02d", 1:12)
)
# Verificar los meses presentes en la data frame
present_months <- unique(Data_Comercializacion[, c("Year", "Month")])
# Identificar los meses faltantes
missing_months <- setdiff(paste(all_months$Year, all_months$Month), paste(present_months$Year, present_months$Month))
if (length(missing_months) == 0) {
cat("Todos los meses de 2015 a 2023 están presentes en la columna FECHA.SUSCRIPCION.\n")
} else {
cat("Los siguientes meses faltan en la columna FECHA.SUSCRIPCION:\n")
print(missing_months)
}
## Los siguientes meses faltan en la columna FECHA.SUSCRIPCION:
## [1] "2015 01" "2017 01" "2021 01" "2023 01" "2018 02" "2021 02" "2019 04"
## [8] "2020 05" "2015 10" "2020 10"
Vemos que nos algunos meses nos hacen falta en algunos años pero, los trimestres de cada año pudieran estar completo, por tanto más adelante al aplicar las series de tiempo los datos puedieran colocarse de maneta trimestral
summary(Data_Comercializacion)
## FUERZA.O.DEPENDENCIA CONTRATO.No. OBJETO MES
## Length:319 Length:319 Length:319 Length:319
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## FECHA.SUSCRIPCION FECHA.DE.VENCIMIENTO VALOR.CONTRATADO
## Min. :2015-02-26 Min. :2015-03-03 Min. :-1437724335
## 1st Qu.:2016-12-28 1st Qu.:2017-06-30 1st Qu.: 0
## Median :2018-12-28 Median :2019-06-30 Median : 93868104
## Mean :2019-06-06 Mean :2019-11-01 Mean : 2389013294
## 3rd Qu.:2021-11-30 3rd Qu.:2022-01-21 3rd Qu.: 1700546775
## Max. :2023-12-29 Max. :2026-07-30 Max. :87011405656
## NA's :1
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## Length:319
## Class :character
## Mode :character
##
##
##
##
## FUERZA.PUBLICA CANAL.CIVIL PROCESO
## Min. :-1437724335 Min. :-343743400 Length:319
## 1st Qu.: 0 1st Qu.: 0 Class :character
## Median : 0 Median : 0 Mode :character
## Mean : 2325046088 Mean : 61078986
## 3rd Qu.: 1468750000 3rd Qu.: 0
## Max. :87011405656 Max. :3617600000
##
## X Year Month
## Length:319 Length:319 Length:319
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
El resumen de los datos nos muestra que la fecha donde se inicio el primer contrato dentro de nuestro data set fue el 26 de febrero y la fecha mas lejada corresponde al 29 de diciembre del 2023 cerca del cierre del año.
Por otro lado vemos que el valor minimo en VALOR.CONTRATADO corresponde a -1437724335, esto debido que existen valores negativos dentro de esta columna, eso valores negativos corresponden a reducciones que se realizan sobre el contrato firmado incialmente y que se vizualiza en la tabla “VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO FUERZA.PUBLICA”, por tanto estos valores negativos pudieramos excluirlo de los datos.
Data_Comercializacion <- Data_Comercializacion %>%
filter(VALOR.CONTRATADO >= 0)
summary(Data_Comercializacion)
## FUERZA.O.DEPENDENCIA CONTRATO.No. OBJETO MES
## Length:296 Length:296 Length:296 Length:296
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## FECHA.SUSCRIPCION FECHA.DE.VENCIMIENTO VALOR.CONTRATADO
## Min. :2015-02-26 Min. :2015-03-03 Min. : 0
## 1st Qu.:2016-12-19 1st Qu.:2017-06-30 1st Qu.: 0
## Median :2018-12-12 Median :2019-03-31 Median : 259702795
## Mean :2019-04-22 Mean :2019-09-12 Mean : 2596386770
## 3rd Qu.:2021-09-05 3rd Qu.:2021-12-31 3rd Qu.: 1940075000
## Max. :2023-12-29 Max. :2026-07-30 Max. :87011405656
## NA's :1
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## Length:296
## Class :character
## Mode :character
##
##
##
##
## FUERZA.PUBLICA CANAL.CIVIL PROCESO
## Min. : 0 Min. : 0 Length:296
## 1st Qu.: 0 1st Qu.: 0 Class :character
## Median : 0 Median : 0 Mode :character
## Mean : 2526287844 Mean : 66986284
## 3rd Qu.: 1864750000 3rd Qu.: 0
## Max. :87011405656 Max. :3617600000
##
## X Year Month
## Length:296 Length:296 Length:296
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
Eliminamos los valores negativos
mean_valor_contratado <- mean(Data_Comercializacion$VALOR.CONTRATADO, na.rm = TRUE)
sd_valor_contratado <- sd(Data_Comercializacion$VALOR.CONTRATADO, na.rm = TRUE)
cat("Media de VALOR.CONTRATADO:", mean_valor_contratado, "\n")
## Media de VALOR.CONTRATADO: 2596386770
cat("Desviación Estándar de VALOR.CONTRATADO:", sd_valor_contratado, "\n")
## Desviación Estándar de VALOR.CONTRATADO: 6805841667
La desviación estándar es una medida estadística que indica cuánta variación o dispersión existe respecto a la media (promedio). En este caso, la desviación estándar de la columna VALOR.CONTRATADO es 6,805,841,667 Una desviación estándar alta, como en este caso, indica que los valores en la columna VALOR.CONTRATADO están muy dispersos en torno a la media. Esto significa que hay una gran variabilidad en los valores contratados, es decir, algunos contratos pueden ser mucho más grandes o más pequeños que otros.
Aproximadamente el 68% de los valores contratados se encuentran dentro de una desviación estándar de la media, es decir,Aproximadamente el 95% de los valores contratados se encuentran dentro de dos desviaciones estándar de la media.
# Generar nuevos gráficos
hist(Data_Comercializacion$VALOR.CONTRATADO, breaks = 50, main = "Distribución de VALOR.CONTRATADO", xlab = "VALOR.CONTRATADO", col = "blue")
boxplot(Data_Comercializacion$VALOR.CONTRATADO, main = "Boxplot de VALOR.CONTRATADO", ylab = "VALOR.CONTRATADO")
# Transformación logarítmica
Data_Comercializacion$log_VALOR_CONTRATADO <- log(Data_Comercializacion$VALOR.CONTRATADO + 1)
# Histograma de los valores transformados logarítmicamente
hist(Data_Comercializacion$log_VALOR_CONTRATADO, breaks = 50, main = "Distribución Logarítmica de VALOR.CONTRATADO", xlab = "Log(VALOR.CONTRATADO)", col = "blue")
# Boxplot de los valores transformados logarítmicamente
boxplot(Data_Comercializacion$log_VALOR_CONTRATADO, main = "Boxplot de Log(VALOR.CONTRATADO)", ylab = "Log(VALOR.CONTRATADO)")
La presencia de numerosos outliers y la concentración de la mayoría de los datos cerca del extremo inferior sugieren que:
Alta variabilidad y dispersión: Existen contratos con valores extremadamente altos que son significativamente diferentes de la mayoría de los contratos. Sesgo positivo, la mayoría de los contratos tienen valores bajos, mientras que algunos pocos tienen valores extremadamente altos, lo que genera una distribución sesgada positivamente. Impacto en medidas estadísticas: La media y la desviación estándar son altamente influenciadas por estos outliers, lo que puede distorsionar la interpretación si no se consideran adecuadamente.
Transformación logaritmica
Realizamos la transformación logarítmica se aplica a la variable “VALOR.CONTRATADO” con el fin de visualizar mejor la distribución de los datos y de identificar valores atípicos de manera más efectiva. La transformación logarítmica puede hacer que los valores extremadamente grandes se vuelvan más manejables y se destaquen menos en los gráficos.
La mayoría de los valores contratados logarítmicos están concentrados en un rango estrecho. Esto podría indicar una relativa consistencia en los valores contratados una vez que se normalizan con la transformación logarítmica. Sesgo: La mediana cerca del límite superior de la caja sugiere una posible asimetría en la distribución, con una mayor concentración de valores en la parte inferior del rango de valores logarítmicos. Rango: La ausencia de valores atípicos extremos implica que los datos están bastante bien contenidos dentro del rango esperado.
ggplot(Data_Comercializacion, aes(x = FECHA.SUSCRIPCION, y = VALOR.CONTRATADO)) +
geom_line() +
labs(title = "Tendencia del Valor Contratado a lo largo del tiempo",
x = "Fecha de Suscripción",
y = "Valor Contratado")
El gráfico que has generado muestra la tendencia del valor contratado a
lo largo del tiempo, con algunos picos muy altos. Para hacer el gráfico
más informativo y fácil de interpretar, podemos agregar algunas mejoras
y ajustar el eje para manejar mejor los valores extremos.
Filtrar valores atípicos, Si los picos extremos están distorsionando el gráfico, podemos optar por filtrar esos valores, Agregamos una línea de tendencia suavizada, Esto puede ayudar a identificar tendencias generales a lo largo del tiempo y por ultimo Agregamos puntos en el gráfico de líneas Para hacer más visibles los valores individuales.
# Calcular el IQR
iqr_valor_contratado <- IQR(Data_Comercializacion$VALOR.CONTRATADO, na.rm = TRUE)
q1 <- quantile(Data_Comercializacion$VALOR.CONTRATADO, 0.25, na.rm = TRUE)
q3 <- quantile(Data_Comercializacion$VALOR.CONTRATADO, 0.75, na.rm = TRUE)
lower_bound <- q1 - 1.5 * iqr_valor_contratado
upper_bound <- q3 + 1.5 * iqr_valor_contratado
# Filtrar los valores fuera del rango intercuartílico
datos_filtrados <- Data_Comercializacion %>%
filter(VALOR.CONTRATADO >= lower_bound & VALOR.CONTRATADO <= upper_bound)
# Crear el gráfico de líneas con datos filtrados y una línea de tendencia suavizada
ggplot(datos_filtrados, aes(x = FECHA.SUSCRIPCION, y = VALOR.CONTRATADO)) +
geom_line(color = "blue") +
geom_point(color = "red", size = 1) +
geom_smooth(method = "loess", se = FALSE, color = "green", size = 1) +
labs(title = "Tendencia del Valor Contratado a lo largo del tiempo (Filtrado)",
x = "Fecha de Suscripción",
y = "Valor Contratado") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
El gráfico filtrado muestra una tendencia general del valor contratado a lo largo del tiempo, y aunque la mayoría de los valores extremos han sido eliminados, aún se pueden observar picos significativos. En la línea de tendencia suavizada (en verde) proporciona una vista general de cómo los valores contratados han cambiado con el tiempo.
Los Picos y fluctuaciones Aunque se han filtrado algunos valores extremos, todavía hay muchos picos que indican variaciones significativas en el valor contratado. Estos picos pueden ser resultado de contratos importantes firmados en ciertas fechas.
La línea de tendencia suavizada sugiere que, en promedio, los valores contratados han mostrado una ligera tendencia al alza hasta alrededor de 2020, seguidos por una tendencia plana o ligeramente descendente. Esto podría estar relacionado con cambios en las políticas de contratación, presupuesto disponible, o prioridades del gobierno.
# Extraer el año de la fecha de suscripción
datos_filtrados <- Data_Comercializacion %>%
mutate(ANIO = year(ymd(FECHA.SUSCRIPCION)))
ventas_por_anio <- datos_filtrados %>%
group_by(ANIO) %>%
summarise(Total_Valor_Contratado = sum(VALOR.CONTRATADO, na.rm = TRUE)) %>%
arrange(desc(Total_Valor_Contratado))
# Ver el año con más ventas
anio_con_mas_ventas <- ventas_por_anio %>%
slice(1)
print(anio_con_mas_ventas)
## # A tibble: 1 × 2
## ANIO Total_Valor_Contratado
## <dbl> <dbl>
## 1 2023 145411539828
# Crear el gráfico de barras
ggplot(ventas_por_anio, aes(x = factor(ANIO), y = Total_Valor_Contratado)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(title = "Valor Contratado por Año",
x = "Año",
y = "Total Valor Contratado") +
theme_minimal()
Vemos que el año con mas venta es el 2023.
# Agrupar y resumir los datos por FUERZA.O.DEPENDENCIA
listado_fuerza_valor <- datos_filtrados %>%
group_by(FUERZA.O.DEPENDENCIA) %>%
summarise(Total_Valor_Contratado = sum(VALOR.CONTRATADO, na.rm = TRUE)) %>%
arrange(desc(Total_Valor_Contratado))
# Ver el listado
print(listado_fuerza_valor)
## # A tibble: 26 × 2
## FUERZA.O.DEPENDENCIA Total_Valor_Contratado
## <chr> <dbl>
## 1 PONAL 478494154952.
## 2 FAC 127881052332.
## 3 EJC 83854637656.
## 4 ARC 51734863378
## 5 AIRBUS 7795611335
## 6 EJERCITO 6613954560.
## 7 UAE DE SALUD DE ARAUCA 5789176638
## 8 PAE 3045025900
## 9 IGAC 1031942522
## 10 MINTRANSPORTE 855000000
## # ℹ 16 more rows
Vemos que el cliente quee más se le ha vendido es al PONAL que la Policia Nacional de Colombia, por otro lado vemos dos datos que estan por separado pero representan lo mismo que el “EJC” y “EJERCITO”, por lo cual puedieramos agrupar estos datos y ver el valor contratado en general
Data_Comercializacion <- Data_Comercializacion %>%
mutate(FUERZA.O.DEPENDENCIA = ifelse(FUERZA.O.DEPENDENCIA %in% c("EJC", "EJERCITO"), "EJC", FUERZA.O.DEPENDENCIA))
# Agrupar y resumir los datos por FUERZA.O.DEPENDENCIA
listado_fuerza_valor <- Data_Comercializacion %>%
group_by(FUERZA.O.DEPENDENCIA) %>%
summarise(Total_Valor_Contratado = sum(VALOR.CONTRATADO, na.rm = TRUE)) %>%
arrange(desc(Total_Valor_Contratado))
# Ver el listado
print(listado_fuerza_valor)
## # A tibble: 25 × 2
## FUERZA.O.DEPENDENCIA Total_Valor_Contratado
## <chr> <dbl>
## 1 PONAL 478494154952.
## 2 FAC 127881052332.
## 3 EJC 90468592216.
## 4 ARC 51734863378
## 5 AIRBUS 7795611335
## 6 UAE DE SALUD DE ARAUCA 5789176638
## 7 PAE 3045025900
## 8 IGAC 1031942522
## 9 MINTRANSPORTE 855000000
## 10 INVIAS 381067235
## # ℹ 15 more rows
Vemos que el Valor del Ejercito aumento significativamente.
Vemos que hay clientes con contratos mas significativos que otros, por tanto para una mejor vizualización hacer un grafico con los 10 clientes más importantes
# Seleccionar el top 10
top_10 <- listado_fuerza_valor %>%
top_n(10, Total_Valor_Contratado)
# Crear el gráfico de barras
ggplot(top_10, aes(x = reorder(FUERZA.O.DEPENDENCIA, -Total_Valor_Contratado), y = Total_Valor_Contratado)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(title = "Top 10 Fuerzas o Dependencias por Valor Contratado",
x = "Fuerza o Dependencia",
y = "Total Valor Contratado") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) # Rotar etiquetas del eje x
El gráfico de caja y bigotes muestra la distribución del valor contratado por cada fuerza o dependencia. Este análisis es útil para identificar cómo se distribuyen los montos contratados entre las diferentes fuerzas y dependencias, y para detectar posibles outliers o valores atípicos.
# Crear un gráfico de caja y bigotes
ggplot(Data_Comercializacion, aes(x = reorder(FUERZA.O.DEPENDENCIA, VALOR.CONTRATADO, FUN = median), y = VALOR.CONTRATADO)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Distribución del Valor Contratado por Fuerza o Dependencia",
x = "Fuerza o Dependencia",
y = "Valor Contratado") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) # Rotar etiquetas del eje x
El gráfico muestra las Fuerzas o Dependencias con Mayor Valor Contratado, el EJC (Ejército Nacional de Colombia) y PONAL (Policía Nacional de Colombia) presentan los valores contratados más altos y una gran dispersión en sus datos, indicando una variabilidad significativa en los montos de los contratos. FAC (Fuerza Aérea Colombiana) y ARC (Armada Nacional Colombiana) también tienen valores contratados considerables, pero con menos dispersión comparado con EJC y PONAL.
Muchas de las otras dependencias tienen valores contratados significativamente menores en comparación con las principales fuerzas mencionadas anteriormente. Algunas dependencias tienen valores de contratos muy bajos o casi nulos, indicando poca actividad de contratación en comparación con las principales fuerzas.
Se observa que una gran parte del presupuesto de contratación está concentrado en unas pocas fuerzas, particularmente en EJC, PONAL, FAC, y ARC. Esto guarda relación debido que el principal cliente de la CIAC son las fuerzas publicas.
Data_Comercializacion$ANIO <- format(Data_Comercializacion$FECHA.SUSCRIPCION, "%Y")
# Agrupar por año y fuerza o dependencia, y calcular el valor total contratado
data_anual <- Data_Comercializacion %>%
group_by(ANIO, FUERZA.O.DEPENDENCIA) %>%
summarise(Total_Valor_Contratado = sum(VALOR.CONTRATADO, na.rm = TRUE)) %>%
arrange(ANIO, desc(Total_Valor_Contratado))
## `summarise()` has grouped output by 'ANIO'. You can override using the
## `.groups` argument.
ggplot(data_anual, aes(x = ANIO, y = Total_Valor_Contratado, color = FUERZA.O.DEPENDENCIA)) +
geom_line() +
geom_point() +
labs(title = "Evolución del Valor Contratado por Año y Fuerza o Dependencia",
x = "Año",
y = "Valor Contratado") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
scale_y_continuous(labels = scales::comma)
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?
Algunas fuerzas o dependencias tienen una participación más frecuente en los contratos, por ejemplo, “EJC” y “PONAL”, ya que sus colores aparecen más a menudo en el gráfico. Es evidente que ciertas fuerzas o dependencias tienen valores contratados significativamente más altos que otras. Vemos que la policia Nacional ha tenido el contrato con el monto más alto y se efectuo en el 2023.
Vemos que PONAL(Policia nacional de Colombia), FAC(Fuerza Aera Colombiana), EJC (Ejercito Nacional de Colombia) y ARC (Armada nacional de combia) representan la mayor cantidad de contratos, especialmente la policia que es el principal cliente de la CIAC, por tanto para que nuestro analisis sea mas exacto procederemos a dividirlos en 3 data Sets, 1ro el de PONAL (Policia Nacional) que tiene los contratos mas grandes, 2do para FAC, EJC y ARC como fuerzas especiales del estado colombiano y 3ra para los demas clientes
# Filtrar las filas donde FUERZA.O.DEPENDENCIA contiene "PONAL"
data_ponal <- Data_Comercializacion[grepl("PONAL", Data_Comercializacion$FUERZA.O.DEPENDENCIA), ]
# Filtrar las filas donde FUERZA.O.DEPENDENCIA contiene "FAC", "EJC" o "ARC"
data_Fuerzas_Espec <- Data_Comercializacion[grepl("FAC|EJC|ARC", Data_Comercializacion$FUERZA.O.DEPENDENCIA), ]
# Filtrar las filas donde FUERZA.O.DEPENDENCIA no contiene "FAC", "EJC", "ARC" o "PONAL"
data_Canal_Civil <- Data_Comercializacion[!grepl("FAC|EJC|ARC|PONAL", Data_Comercializacion$FUERZA.O.DEPENDENCIA), ]
summary(data_ponal)
## FUERZA.O.DEPENDENCIA CONTRATO.No. OBJETO MES
## Length:93 Length:93 Length:93 Length:93
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## FECHA.SUSCRIPCION FECHA.DE.VENCIMIENTO VALOR.CONTRATADO
## Min. :2015-03-18 Min. :2015-07-01 Min. : 0
## 1st Qu.:2017-10-13 1st Qu.:2018-06-30 1st Qu.: 0
## Median :2019-12-09 Median :2020-01-25 Median : 980000000
## Mean :2019-11-27 Mean :2020-04-06 Mean : 5145098440
## 3rd Qu.:2022-04-18 3rd Qu.:2022-07-31 3rd Qu.: 6466000000
## Max. :2023-12-28 Max. :2024-07-31 Max. :87011405656
## NA's :1
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## Length:93
## Class :character
## Mode :character
##
##
##
##
## FUERZA.PUBLICA CANAL.CIVIL PROCESO X
## Min. : 0 Min. :0 Length:93 Length:93
## 1st Qu.: 0 1st Qu.:0 Class :character Class :character
## Median : 980000000 Median :0 Mode :character Mode :character
## Mean : 5135192954 Mean :0
## 3rd Qu.: 6466000000 3rd Qu.:0
## Max. :87011405656 Max. :0
##
## Year Month log_VALOR_CONTRATADO ANIO
## Length:93 Length:93 Min. : 0.00 Length:93
## Class :character Class :character 1st Qu.: 0.00 Class :character
## Mode :character Mode :character Median :20.70 Mode :character
## Mean :13.69
## 3rd Qu.:22.59
## Max. :25.19
##
summary(data_Fuerzas_Espec)
## FUERZA.O.DEPENDENCIA CONTRATO.No. OBJETO MES
## Length:126 Length:126 Length:126 Length:126
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## FECHA.SUSCRIPCION FECHA.DE.VENCIMIENTO VALOR.CONTRATADO
## Min. :2015-02-26 Min. :2015-04-30 Min. : 0
## 1st Qu.:2016-09-29 1st Qu.:2016-12-20 1st Qu.: 0
## Median :2018-12-27 Median :2019-03-31 Median : 603909269
## Mean :2019-03-24 Mean :2019-10-10 Mean : 2144509978
## 3rd Qu.:2021-10-22 3rd Qu.:2022-02-13 3rd Qu.: 1874250000
## Max. :2023-12-29 Max. :2026-07-30 Max. :22140662758
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## Length:126
## Class :character
## Mode :character
##
##
##
## FUERZA.PUBLICA CANAL.CIVIL PROCESO X
## Min. : 0 Min. :0 Length:126 Length:126
## 1st Qu.: 0 1st Qu.:0 Class :character Class :character
## Median : 603909269 Median :0 Mode :character Mode :character
## Mean : 2144509978 Mean :0
## 3rd Qu.: 1874250000 3rd Qu.:0
## Max. :22140662758 Max. :0
## Year Month log_VALOR_CONTRATADO ANIO
## Length:126 Length:126 Min. : 0.00 Length:126
## Class :character Class :character 1st Qu.: 0.00 Class :character
## Mode :character Mode :character Median :20.22 Mode :character
## Mean :14.02
## 3rd Qu.:21.35
## Max. :23.82
summary(data_Canal_Civil)
## FUERZA.O.DEPENDENCIA CONTRATO.No. OBJETO MES
## Length:77 Length:77 Length:77 Length:77
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## FECHA.SUSCRIPCION FECHA.DE.VENCIMIENTO VALOR.CONTRATADO
## Min. :2015-03-03 Min. :2015-03-03 Min. : 0
## 1st Qu.:2017-03-10 1st Qu.:2017-05-03 1st Qu.: 7140
## Median :2018-01-26 Median :2018-07-31 Median : 25000000
## Mean :2018-09-16 Mean :2018-11-24 Mean : 257507427
## 3rd Qu.:2020-06-01 3rd Qu.:2020-07-01 3rd Qu.: 195762420
## Max. :2023-11-23 Max. :2023-12-27 Max. :3617600000
## VALOR.TOTAL.DEL.CONTRATO..SI.HAY.MODIFICACIONES.O.ADICIONES.DE.DINERO
## Length:77
## Class :character
## Mode :character
##
##
##
## FUERZA.PUBLICA CANAL.CIVIL PROCESO X
## Min. :0 Min. : 0 Length:77 Length:77
## 1st Qu.:0 1st Qu.: 0 Class :character Class :character
## Median :0 Median : 25000000 Mode :character Mode :character
## Mean :0 Mean : 257505715
## 3rd Qu.:0 3rd Qu.: 195762420
## Max. :0 Max. :3617600000
## Year Month log_VALOR_CONTRATADO ANIO
## Length:77 Length:77 Min. : 0.000 Length:77
## Class :character Class :character 1st Qu.: 8.874 Class :character
## Mode :character Mode :character Median :17.034 Mode :character
## Mean :13.422
## 3rd Qu.:19.092
## Max. :22.009
# Desviación estandar
mean_valor_contratado <- mean(data_ponal$VALOR.CONTRATADO, na.rm = TRUE)
sd_valor_contratado <- sd(data_ponal$VALOR.CONTRATADO, na.rm = TRUE)
cat("Media de VALOR.CONTRATADO:", mean_valor_contratado, "\n")
## Media de VALOR.CONTRATADO: 5145098440
cat("Desviación Estándar de VALOR.CONTRATADO:", sd_valor_contratado, "\n")
## Desviación Estándar de VALOR.CONTRATADO: 10750191483
hist(data_ponal$VALOR.CONTRATADO, breaks = 50, main = "Distribución de VALOR.CONTRATADO", xlab = "VALOR.CONTRATADO", col = "blue")
boxplot(data_ponal$VALOR.CONTRATADO, main = "Boxplot de VALOR.CONTRATADO", ylab = "VALOR.CONTRATADO")
La desviación estándar de la Policia Nacional es aproximadamente 10.75
mil millones. Una desviación estándar alta indica que los valores están
muy dispersos alrededor de la media. En este caso, una desviación
estándar mayor que la media sugiere que hay una gran variabilidad en los
valores de los contratos. Esto puede deberse a la presencia de contratos
con valores extremadamente altos que están elevando la media y la
desviación estándar.
# Desviación estandar
mean_valor_contratado <- mean(data_Fuerzas_Espec$VALOR.CONTRATADO, na.rm = TRUE)
sd_valor_contratado <- sd(data_Fuerzas_Espec$VALOR.CONTRATADO, na.rm = TRUE)
cat("Media de VALOR.CONTRATADO:", mean_valor_contratado, "\n")
## Media de VALOR.CONTRATADO: 2144509978
cat("Desviación Estándar de VALOR.CONTRATADO:", sd_valor_contratado, "\n")
## Desviación Estándar de VALOR.CONTRATADO: 3952012559
hist(data_Fuerzas_Espec$VALOR.CONTRATADO, breaks = 50, main = "Distribución de VALOR.CONTRATADO", xlab = "VALOR.CONTRATADO", col = "blue")
boxplot(data_Fuerzas_Espec$VALOR.CONTRATADO, main = "Boxplot de VALOR.CONTRATADO", ylab = "VALOR.CONTRATADO")
Para las fuerzas especiales en promedio, los contratos tienen un valor de unos 2.14 mil millones. La desviación estándar es aproximadamente 3.95 mil millones. En este caso, una desviación estándar alta indica que los valores de los contratos están bastante dispersos alrededor de la media al igual que en PONAL.
# Desviación estandar
mean_valor_contratado <- mean(data_Canal_Civil$VALOR.CONTRATADO, na.rm = TRUE)
sd_valor_contratado <- sd(data_Canal_Civil$VALOR.CONTRATADO, na.rm = TRUE)
cat("Media de VALOR.CONTRATADO:", mean_valor_contratado, "\n")
## Media de VALOR.CONTRATADO: 257507427
cat("Desviación Estándar de VALOR.CONTRATADO:", sd_valor_contratado, "\n")
## Desviación Estándar de VALOR.CONTRATADO: 615056099
hist(data_Canal_Civil$VALOR.CONTRATADO, breaks = 50, main = "Distribución de VALOR.CONTRATADO", xlab = "VALOR.CONTRATADO", col = "blue")
boxplot(data_Canal_Civil$VALOR.CONTRATADO, main = "Boxplot de VALOR.CONTRATADO", ylab = "VALOR.CONTRATADO")
La media indica el valor promedio de los contratos para el Canal Civil es de alrededor de 257,507,427. La desviación estándar e En este caso, la desviación estándar de aproximadamente 615,056,099 indica que los valores de los contratos tienden a dispersarse bastante con respecto a la media. Lo cual se vizualiza el Boxplot con los outliers
Data_Comercializacion$TRIMESTRE <- paste(year(Data_Comercializacion$FECHA.SUSCRIPCION), quarter(Data_Comercializacion$FECHA.SUSCRIPCION), sep = "-")
data_ponal <- Data_Comercializacion[grepl("PONAL", Data_Comercializacion$FUERZA.O.DEPENDENCIA), ]
data_Fuerzas_Espec <- Data_Comercializacion[grepl("FAC|EJC|ARC", Data_Comercializacion$FUERZA.O.DEPENDENCIA), ]
data_Canal_Civil <- Data_Comercializacion[!grepl("FAC|EJC|ARC|PONAL", Data_Comercializacion$FUERZA.O.DEPENDENCIA), ]
Vamos a proceder directamente a construir el modelo de regresión lineal utilizando las variable MES como predictores del valor contratado.
# Ajustar un modelo de regresión lineal
modelo_regresion <- lm(VALOR.CONTRATADO ~ TRIMESTRE, data = Data_Comercializacion)
# Resumen del modelo
summary(modelo_regresion)
##
## Call:
## lm(formula = VALOR.CONTRATADO ~ TRIMESTRE, data = Data_Comercializacion)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10123221051 -2440481446 -1041727898 274454514 76888184605
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 226734626 2601808819 0.087 0.93062
## TRIMESTRE2015-2 2602291598 3328245024 0.782 0.43500
## TRIMESTRE2015-3 2213746820 3273870969 0.676 0.49952
## TRIMESTRE2015-4 3158056074 3562673451 0.886 0.37621
## TRIMESTRE2016-1 2083102655 3469078426 0.600 0.54871
## TRIMESTRE2016-2 680023797 4030704891 0.169 0.86616
## TRIMESTRE2016-3 2222521529 3562673451 0.624 0.53328
## TRIMESTRE2016-4 912794186 3119459188 0.293 0.77005
## TRIMESTRE2017-1 2953957706 3829758885 0.771 0.44122
## TRIMESTRE2017-2 122146772 3562673451 0.034 0.97268
## TRIMESTRE2017-3 3000822172 3469078426 0.865 0.38783
## TRIMESTRE2017-4 1654921710 3227146663 0.513 0.60852
## TRIMESTRE2018-1 320753565 4030704891 0.080 0.93663
## TRIMESTRE2018-2 503630053 3679513319 0.137 0.89124
## TRIMESTRE2018-3 569940059 3273870969 0.174 0.86193
## TRIMESTRE2018-4 3276165631 3066261099 1.068 0.28631
## TRIMESTRE2019-1 1014765374 3829758885 0.265 0.79124
## TRIMESTRE2019-2 692558270 4750231269 0.146 0.88420
## TRIMESTRE2019-3 4257572737 3679513319 1.157 0.24829
## TRIMESTRE2019-4 2192917747 3328245024 0.659 0.51056
## TRIMESTRE2020-1 2658748781 4750231269 0.560 0.57616
## TRIMESTRE2020-2 495163048 4314611815 0.115 0.90872
## TRIMESTRE2020-3 4705656616 3679513319 1.279 0.20208
## TRIMESTRE2020-4 271746765 3679513319 0.074 0.94118
## TRIMESTRE2021-1 1071558231 4750231269 0.226 0.82171
## TRIMESTRE2021-2 6986988134 3469078426 2.014 0.04503 *
## TRIMESTRE2021-3 2095095723 3469078426 0.604 0.54641
## TRIMESTRE2021-4 2390772898 3091409532 0.773 0.44001
## TRIMESTRE2022-1 200026797 3829758885 0.052 0.95839
## TRIMESTRE2022-2 1058979660 3679513319 0.288 0.77373
## TRIMESTRE2022-3 242533372 3469078426 0.070 0.94432
## TRIMESTRE2022-4 4071693439 3328245024 1.223 0.22230
## TRIMESTRE2023-1 1006598708 4750231269 0.212 0.83235
## TRIMESTRE2023-2 780591524 4750231269 0.164 0.86960
## TRIMESTRE2023-3 4328953678 3829758885 1.130 0.25937
## TRIMESTRE2023-4 9896486425 3328245024 2.973 0.00322 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6884000000 on 260 degrees of freedom
## Multiple R-squared: 0.09835, Adjusted R-squared: -0.02302
## F-statistic: 0.8103 on 35 and 260 DF, p-value: 0.7695
El modelo de regresión lineal ajustado utilizando solo la variable MES como predictor del valor contratado tiene el siguiente resultado. Cada coeficiente está asociado a un mes específico y representa el cambio esperado en el valor contratado para ese mes en comparación con el mes de referencia (intercepto). Por ejemplo, el coeficiente para MESAGOSTO es -932636216, lo que sugiere que se espera una disminución de aproximadamente 932,636,216 en el valor contratado en agosto en comparación con el mes de referencia.
Los valores p asociados a los coeficientes indican la significancia estadística de cada coeficiente. Por ejemplo, los coeficientes para Enero y Febrero tienen valores p > 0.05, lo que sugiere que no son estadísticamente significativos en la predicción del valor contratado.
El R-cuadrado ajustado es 0.02991, lo que significa que aproximadamente el 2.99% de la variabilidad en el valor contratado es explicada por el modelo. Este valor es bastante bajo, lo que sugiere que el modelo no se ajusta muy bien a los datos.
F-statistic: El valor p asociado al estadístico F es 1.817, lo que sugiere que el modelo en su conjunto es estadísticamente significativo al nivel de significancia del 0.05. Sin embargo, dado que el R-cuadrado ajustado es bajo, este resultado debe interpretarse con precaución.
En resumen, el modelo de regresión lineal utilizando solo el mes como predictor no parece ser muy efectivo para predecir el valor contratado. por lo que procedemos a un métodos de modelado más sofisticados para mejorar su capacidad predictiva.
# Ajustar un modelo de regresión lineal
modelo_regresion_PONAL <- lm(VALOR.CONTRATADO ~ TRIMESTRE, data = data_ponal)
# Resumen del modelo
summary(modelo_regresion_PONAL)
##
## Call:
## lm(formula = VALOR.CONTRATADO ~ TRIMESTRE, data = data_ponal)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15287343665 -2933333333 0 1139559244 71724061991
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0001180 11759596424.0039711 0.000 1.000
## TRIMESTRE2015-2 6187752871.9998550 13147628496.0181293 0.471 0.640
## TRIMESTRE2015-3 4332597086.6665668 12701815856.9823856 0.341 0.734
## TRIMESTRE2016-1 16262215472.9998913 16630580750.8605556 0.978 0.332
## TRIMESTRE2016-2 849999999.9998755 16630580750.8605061 0.051 0.959
## TRIMESTRE2016-3 5977395752.9998665 13578812321.9200764 0.440 0.661
## TRIMESTRE2016-4 3298719737.4998894 14402505409.9337349 0.229 0.820
## TRIMESTRE2017-1 7274999999.9998817 14402505409.9337177 0.505 0.615
## TRIMESTRE2017-2 504382043.4998760 16630580750.8605232 0.030 0.976
## TRIMESTRE2017-3 9606847482.4999275 14402505409.9337578 0.667 0.507
## TRIMESTRE2017-4 7108168498.3332319 13578812321.9201241 0.523 0.603
## TRIMESTRE2018-2 1577584249.3332291 13578812321.9201679 0.116 0.908
## TRIMESTRE2018-3 7829999999.9998512 16630580750.8605289 0.471 0.639
## TRIMESTRE2018-4 4092228641.4998784 12472935563.1454372 0.328 0.744
## TRIMESTRE2019-1 3724499999.9998832 14402505409.9337406 0.259 0.797
## TRIMESTRE2019-3 7543257499.9998808 13147628496.0181427 0.574 0.568
## TRIMESTRE2019-4 2080005989.6832108 12701815856.9823227 0.164 0.870
## TRIMESTRE2020-1 4178225109.4998803 14402505409.9337330 0.290 0.773
## TRIMESTRE2020-2 -0.0001201 16630580750.8605595 0.000 1.000
## TRIMESTRE2020-3 16701999999.9998646 14402505409.9337215 1.160 0.251
## TRIMESTRE2020-4 770853062.4998785 14402505409.9337349 0.054 0.957
## TRIMESTRE2021-2 17749999999.9999008 14402505409.9337330 1.232 0.223
## TRIMESTRE2021-3 3521223813.9998817 16630580750.8605518 0.212 0.833
## TRIMESTRE2021-4 6243925650.2498732 13147628496.0181408 0.475 0.637
## TRIMESTRE2022-1 -0.0001228 13578812321.9201050 0.000 1.000
## TRIMESTRE2022-2 1499999999.9998739 12701815856.9823303 0.118 0.906
## TRIMESTRE2022-3 -0.0001190 12701815856.9823456 0.000 1.000
## TRIMESTRE2022-4 2933333333.3332152 13578812321.9201050 0.216 0.830
## TRIMESTRE2023-1 -0.0001201 16630580750.8605595 0.000 1.000
## TRIMESTRE2023-2 1499999999.9998815 14402505409.9337292 0.104 0.917
## TRIMESTRE2023-3 -0.0001052 16630580750.8605556 0.000 1.000
## TRIMESTRE2023-4 15287343665.1427422 12571537378.6728230 1.216 0.229
##
## Residual standard error: 11760000000 on 61 degrees of freedom
## Multiple R-squared: 0.2066, Adjusted R-squared: -0.1966
## F-statistic: 0.5124 on 31 and 61 DF, p-value: 0.9777
# Ajustar un modelo de regresión lineal
modelo_regresion_Fuerzas_Espec <- lm(VALOR.CONTRATADO ~ TRIMESTRE, data = data_Fuerzas_Espec)
# Resumen del modelo
summary(modelo_regresion_Fuerzas_Espec)
##
## Call:
## lm(formula = VALOR.CONTRATADO ~ TRIMESTRE, data = data_Fuerzas_Espec)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7033666667 -1434577382 -283644148 510744821 17646674698
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 372226295 2024234727 0.184 0.8545
## TRIMESTRE2015-2 537527559 2537512520 0.212 0.8327
## TRIMESTRE2015-3 176139511 2613275795 0.067 0.9464
## TRIMESTRE2015-4 4121761765 2613275795 1.577 0.1182
## TRIMESTRE2016-1 173781587 2613275795 0.066 0.9471
## TRIMESTRE2016-2 1375994476 3506077393 0.392 0.6956
## TRIMESTRE2016-3 -233215732 3092069620 -0.075 0.9400
## TRIMESTRE2016-4 1482461033 2613275795 0.567 0.5719
## TRIMESTRE2017-1 1844847130 3506077393 0.526 0.6001
## TRIMESTRE2017-2 266252880 3506077393 0.076 0.9396
## TRIMESTRE2017-3 2802407039 3092069620 0.906 0.3672
## TRIMESTRE2017-4 515237558 3092069620 0.167 0.8680
## TRIMESTRE2018-1 1547873705 4526326451 0.342 0.7332
## TRIMESTRE2018-2 -212326295 3506077393 -0.061 0.9518
## TRIMESTRE2018-3 52773705 2862700204 0.018 0.9853
## TRIMESTRE2018-4 3958107888 2537512520 1.560 0.1223
## TRIMESTRE2019-1 -372226295 3506077393 -0.106 0.9157
## TRIMESTRE2019-2 547066601 3092069620 0.177 0.8600
## TRIMESTRE2019-3 116131678 3506077393 0.033 0.9736
## TRIMESTRE2019-4 4338421976 3092069620 1.403 0.1640
## TRIMESTRE2020-1 -72226295 4526326451 -0.016 0.9873
## TRIMESTRE2020-2 1067273705 3506077393 0.304 0.7615
## TRIMESTRE2020-3 174707757 3506077393 0.050 0.9604
## TRIMESTRE2020-4 -52726295 2862700204 -0.018 0.9853
## TRIMESTRE2021-1 727773705 3506077393 0.208 0.8360
## TRIMESTRE2021-2 5747291605 2862700204 2.008 0.0477 *
## TRIMESTRE2021-3 3034074889 2715795871 1.117 0.2669
## TRIMESTRE2021-4 1784526025 2479171100 0.720 0.4735
## TRIMESTRE2022-1 481296551 3092069620 0.156 0.8767
## TRIMESTRE2022-2 -372226295 4526326451 -0.082 0.9346
## TRIMESTRE2022-3 1035577697 3092069620 0.335 0.7385
## TRIMESTRE2022-4 4438112295 2479171100 1.790 0.0768 .
## TRIMESTRE2023-1 1477773705 3506077393 0.421 0.6744
## TRIMESTRE2023-2 -350247845 4526326451 -0.077 0.9385
## TRIMESTRE2023-3 7611440372 3092069620 2.462 0.0157 *
## TRIMESTRE2023-4 1064107039 3092069620 0.344 0.7315
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4048000000 on 90 degrees of freedom
## Multiple R-squared: 0.2444, Adjusted R-squared: -0.04941
## F-statistic: 0.8318 on 35 and 90 DF, p-value: 0.7258
# Ajustar un modelo de regresión lineal
modelo_regresion_Canal_Civil <- lm(VALOR.CONTRATADO ~ TRIMESTRE, data = data_Canal_Civil)
# Resumen del modelo
summary(modelo_regresion_Canal_Civil)
##
## Call:
## lm(formula = VALOR.CONTRATADO ~ TRIMESTRE, data = data_Canal_Civil)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1648477746 -63362192 -4294368 5082455 1969122254
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 49118600 363546539 0.135 0.89306
## TRIMESTRE2015-4 8080018 514132446 0.016 0.98752
## TRIMESTRE2016-1 576017780 514132446 1.120 0.26781
## TRIMESTRE2016-2 44556685 514132446 0.087 0.93128
## TRIMESTRE2016-3 573296545 514132446 1.115 0.27005
## TRIMESTRE2016-4 14243592 406457387 0.035 0.97218
## TRIMESTRE2017-1 884970 514132446 0.002 0.99863
## TRIMESTRE2017-2 152823558 430154066 0.355 0.72385
## TRIMESTRE2017-3 28485453 445251759 0.064 0.94924
## TRIMESTRE2017-4 18686445 412223028 0.045 0.96402
## TRIMESTRE2018-1 155216638 445251759 0.349 0.72882
## TRIMESTRE2018-2 -19118600 514132446 -0.037 0.97048
## TRIMESTRE2018-3 -44819142 412223028 -0.109 0.91385
## TRIMESTRE2018-4 -48439866 469336563 -0.103 0.91820
## TRIMESTRE2019-1 -49118600 514132446 -0.096 0.92426
## TRIMESTRE2019-3 191286990 629681076 0.304 0.76253
## TRIMESTRE2019-4 -47020928 514132446 -0.091 0.92749
## TRIMESTRE2020-2 -40527904 629681076 -0.064 0.94893
## TRIMESTRE2020-3 -39495070 469336563 -0.084 0.93327
## TRIMESTRE2020-4 620545010 629681076 0.985 0.32904
## TRIMESTRE2021-1 1645759970 629681076 2.614 0.01175 *
## TRIMESTRE2021-2 1599359146 469336563 3.408 0.00129 **
## TRIMESTRE2021-3 65462533 469336563 0.139 0.88962
## TRIMESTRE2021-4 404462747 430154066 0.940 0.35151
## TRIMESTRE2023-3 1642446311 514132446 3.195 0.00240 **
## TRIMESTRE2023-4 -14092700 629681076 -0.022 0.98223
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 514100000 on 51 degrees of freedom
## Multiple R-squared: 0.5311, Adjusted R-squared: 0.3013
## F-statistic: 2.311 on 25 and 51 DF, p-value: 0.005654
Trim_Comercializacion = Data_Comercializacion[c("VALOR.CONTRATADO", "TRIMESTRE")]
Trim_ponal = data_ponal[c("VALOR.CONTRATADO", "TRIMESTRE")]
Trim_Fuerzas_Espec = data_Fuerzas_Espec[c("VALOR.CONTRATADO", "TRIMESTRE")]
Trim_Canal_Civil = data_Canal_Civil[c("VALOR.CONTRATADO", "TRIMESTRE")]
Trim_Comercializacion <- aggregate(VALOR.CONTRATADO ~ TRIMESTRE, data = Trim_Comercializacion, FUN = sum, na.rm = TRUE)
Trim_ponal <- aggregate(VALOR.CONTRATADO ~ TRIMESTRE, data = Trim_ponal, FUN = sum, na.rm = TRUE)
Trim_Fuerzas_Espec <- aggregate(VALOR.CONTRATADO ~ TRIMESTRE, data = Trim_Fuerzas_Espec, FUN = sum, na.rm = TRUE)
Trim_Canal_Civil <- aggregate(VALOR.CONTRATADO ~ TRIMESTRE, data = Trim_Canal_Civil, FUN = sum, na.rm = TRUE)
# Crear un vector de trimestres completos en el formato deseado
years <- rep(2015:2023, each = 4)
quarters <- rep(1:4, times = length(2015:2023))
trimestres_completos <- paste(years, quarters, sep = "-")
# Crear dataframes con los trimestres completos y rellenar los valores faltantes con ceros
completa_trim <- function(df, trimestres_completos) {
df_completo <- merge(data.frame(TRIMESTRE = trimestres_completos), df, by = "TRIMESTRE", all.x = TRUE)
df_completo$VALOR.CONTRATADO[is.na(df_completo$VALOR.CONTRATADO)] <- 0
return(df_completo)
}
# Asegurarse de que los trimestres estén en el formato correcto
Trim_Comercializacion$TRIMESTRE <- gsub("-", "-", Trim_Comercializacion$TRIMESTRE)
Trim_ponal$TRIMESTRE <- gsub("-", "-", Trim_ponal$TRIMESTRE)
Trim_Fuerzas_Espec$TRIMESTRE <- gsub("-", "-", Trim_Fuerzas_Espec$TRIMESTRE)
Trim_Canal_Civil$TRIMESTRE <- gsub("-", "-", Trim_Canal_Civil$TRIMESTRE)
# Completar los trimestres faltantes con ceros
Trim_Comercializacion_completo <- completa_trim(Trim_Comercializacion, trimestres_completos)
Trim_ponal_completo <- completa_trim(Trim_ponal, trimestres_completos)
Trim_Fuerzas_Espec_completo <- completa_trim(Trim_Fuerzas_Espec, trimestres_completos)
Trim_Canal_Civil_completo <- completa_trim(Trim_Canal_Civil, trimestres_completos)
print(Trim_Comercializacion_completo)
## TRIMESTRE VALOR.CONTRATADO
## 1 2015-1 1587142379
## 2 2015-2 31119288464
## 3 2015-3 29285777352
## 4 2015-4 27078325596
## 5 2016-1 20788535521
## 6 2016-2 4533792111
## 7 2016-3 19594049237
## 8 2016-4 18232460980
## 9 2017-1 19084153990
## 10 2017-2 2791051184
## 11 2017-3 29048011175
## 12 2017-4 24461532364
## 13 2018-1 2737440951
## 14 2018-2 5112552748
## 15 2018-3 9560096209
## 16 2018-4 63052204615
## 17 2019-1 7449000000
## 18 2019-2 2757878687
## 19 2019-3 31390151536
## 20 2019-4 26616176095
## 21 2020-1 8656450219
## 22 2020-2 2887590696
## 23 2020-3 34526738694
## 24 2020-4 3489369735
## 25 2021-1 3894878570
## 26 2021-2 64923504838
## 27 2021-3 20896473134
## 28 2021-4 44497627893
## 29 2022-1 2560568538
## 30 2022-2 9000000000
## 31 2022-3 4223411976
## 32 2022-4 47282708714
## 33 2023-1 3700000000
## 34 2023-2 3021978450
## 35 2023-3 27334129822
## 36 2023-4 111355431556
summary(Trim_Comercializacion_completo)
## TRIMESTRE VALOR.CONTRATADO
## Length:36 Min. : 1587142379
## Class :character 1st Qu.: 3846158928
## Mode :character Median : 18658307485
## Mean : 21348069001
## 3rd Qu.: 29107452719
## Max. :111355431556
summary(Trim_ponal_completo)
## TRIMESTRE VALOR.CONTRATADO
## Length:36 Min. : 0
## Class :character 1st Qu.: 0
## Mode :character Median : 7639500000
## Mean : 13291504304
## 3rd Qu.: 19741397598
## Max. :107011405656
summary(Trim_Fuerzas_Espec_completo)
## TRIMESTRE VALOR.CONTRATADO
## Length:36 Min. : 0
## Class :character 1st Qu.: 1277739588
## Mode :character Median : 3077523644
## Mean : 7505784922
## 3rd Qu.: 9924955992
## Max. :38482708714
summary(Trim_Canal_Civil_completo)
## TRIMESTRE VALOR.CONTRATADO
## Length:36 Min. : 0
## Class :character 1st Qu.: 0
## Mode :character Median : 79118600
## Mean : 550779775
## 3rd Qu.: 547589054
## Max. :4945433238
Las series de tiempo deden tener datos estacionarios, como vimos anteriormente en la Data hay Meses que nos faltan, por tanto procedemos tomar los datos trimestalmente
str(Trim_Comercializacion_completo)
## 'data.frame': 36 obs. of 2 variables:
## $ TRIMESTRE : chr "2015-1" "2015-2" "2015-3" "2015-4" ...
## $ VALOR.CONTRATADO: num 1587142379 31119288464 29285777352 27078325596 20788535521 ...
Comerciallizacion_ts = ts(Trim_Comercializacion_completo$VALOR.CONTRATADO, start = c(2015,1), end = c(2023,4), frequency = 4)
Ponal_ts = ts(Trim_ponal_completo$VALOR.CONTRATADO, start = c(2015,1), frequency = 4)
Fuerzas_Espec_ts = ts(Trim_Fuerzas_Espec_completo$VALOR.CONTRATADO, start = c(2015,1), frequency = 4)
Canal_Civil_ts = ts(Trim_Canal_Civil_completo$VALOR.CONTRATADO, start = c(2015,1), frequency = 4)
Comerciallizacion_ts
## Qtr1 Qtr2 Qtr3 Qtr4
## 2015 1587142379 31119288464 29285777352 27078325596
## 2016 20788535521 4533792111 19594049237 18232460980
## 2017 19084153990 2791051184 29048011175 24461532364
## 2018 2737440951 5112552748 9560096209 63052204615
## 2019 7449000000 2757878687 31390151536 26616176095
## 2020 8656450219 2887590696 34526738694 3489369735
## 2021 3894878570 64923504838 20896473134 44497627893
## 2022 2560568538 9000000000 4223411976 47282708714
## 2023 3700000000 3021978450 27334129822 111355431556
plot(Comerciallizacion_ts, ylab = "VALOR.CONTRATADO")
Ponal_ts
## Qtr1 Qtr2 Qtr3 Qtr4
## 2015 0 24751011488 25995582520 0
## 2016 16262215473 850000000 17932187259 6597439475
## 2017 14550000000 504382044 19213694965 21324505495
## 2018 0 4732752748 7830000000 32737829132
## 2019 7449000000 0 30173030000 12480035938
## 2020 8356450219 0 33404000000 1541706125
## 2021 0 35500000000 3521223814 24975702601
## 2022 0 9000000000 0 8800000000
## 2023 0 3000000000 0 107011405656
start(Ponal_ts); end(Ponal_ts)
## [1] 2015 1
## [1] 2023 4
plot(Ponal_ts, ylab = "VALOR.CONTRATADO Policia Nacional")
Fuerzas_Espec_ts
## Qtr1 Qtr2 Qtr3 Qtr4
## 2015 1488905179 6368276976 3290194832 26963928361
## 2016 3276047288 3496441541 417031688 11128123969
## 2017 4434146850 1276958350 9523900000 2662391557
## 2018 1920100000 319800000 1700000000 30312339281
## 2019 0 2757878687 976715946 14131944812
## 2020 300000000 2879000000 1093868104 1278000000
## 2021 2200000000 24478071600 17031505920 17254018557
## 2022 2560568538 0 4223411976 38482708714
## 2023 3700000000 21978450 23951000000 4309000000
plot(Fuerzas_Espec_ts, ylab = "VALOR.CONTRATADO Fuerzas especializadas")
Canal_Civil_ts
## Qtr1 Qtr2 Qtr3 Qtr4
## 2015 98237200 0 0 114397235
## 2016 1250272760 187350570 1244830290 506897536
## 2017 100007140 1009710790 310416210 474635312
## 2018 817340951 60000000 30096209 2036202
## 2019 0 0 240405590 4195345
## 2020 0 8590696 28870590 669663610
## 2021 1694878570 4945433238 343743400 2267906735
## 2022 0 0 0 0
## 2023 0 0 3383129822 35025900
plot(Canal_Civil_ts, ylab = "VALOR.CONTRATADO Canal Civil")
En el grafico rapidamente podemos identificar que los datos parecen no ser estacionarios
La prueba de Dickey-Fuller (ADF) es utilizada para verificar si una serie de tiempo es estacionaria, es decir, si sus propiedades estadísticas como la media y la varianza son constantes a lo largo del tiempo.
adf.test(Comerciallizacion_ts,alternative = "stationary")
##
## Augmented Dickey-Fuller Test
##
## data: Comerciallizacion_ts
## Dickey-Fuller = -2.7057, Lag order = 3, p-value = 0.2986
## alternative hypothesis: stationary
El p-valor es la clave para decidir si rechazar o no la hipótesis nula. Normalmente, si el p-valor es menor a un nivel de significancia (0.05), rechazamos la hipótesis nula y concluimos que la serie es estacionaria. Sin embargo, en este caso p-valor = 0.2876, Esto es mucho mayor que 0.05, por lo que no podemos rechazar la hipótesis nula. Con base en estos resultados, no hay suficiente evidencia para rechazar la hipótesis nula de que la serie de tiempo no es estacionaria. En otras palabras, la serie de tiempo estamos analizando no es estacionaria.
adf.test(Ponal_ts,alternative = "stationary")
##
## Augmented Dickey-Fuller Test
##
## data: Ponal_ts
## Dickey-Fuller = -2.8038, Lag order = 3, p-value = 0.2604
## alternative hypothesis: stationary
El p-valor es la clave para decidir si rechazar o no la hipótesis nula. Normalmente, si el p-valor es menor a un nivel de significancia (0.05), rechazamos la hipótesis nula y concluimos que la serie es estacionaria. Sin embargo, en este caso p-valor = 0.5365, Esto es mucho mayor que 0.05, por lo que no podemos rechazar la hipótesis nula. Con base en estos resultados, no hay suficiente evidencia para rechazar la hipótesis nula de que la serie de tiempo no es estacionaria. En otras palabras, la serie de tiempo estamos analizando no es estacionaria.
adf.test(Fuerzas_Espec_ts,alternative = "stationary")
##
## Augmented Dickey-Fuller Test
##
## data: Fuerzas_Espec_ts
## Dickey-Fuller = -3.7224, Lag order = 3, p-value = 0.0377
## alternative hypothesis: stationary
El p-valor es la clave para decidir si rechazar o no la hipótesis nula. Normalmente, si el p-valor es menor a un nivel de significancia (0.05), rechazamos la hipótesis nula y concluimos que la serie es estacionaria. en este caso p-valor = 0.0377, Esto es menor que 0.05, por lo que podemos rechazar la hipótesis nula. En otras palabras, la serie de tiempo estamos analizando es estacionaria.
adf.test(Canal_Civil_ts,alternative = "stationary")
##
## Augmented Dickey-Fuller Test
##
## data: Canal_Civil_ts
## Dickey-Fuller = -3.3796, Lag order = 3, p-value = 0.07622
## alternative hypothesis: stationary
El p-valor es la clave para decidir si rechazar o no la hipótesis nula. Normalmente, si el p-valor es menor a un nivel de significancia (0.05), rechazamos la hipótesis nula y concluimos que la serie es estacionaria. Sin embargo, en este caso p-valor = 0.0762, Esto es mayor que 0.05, por lo que no podemos rechazar la hipótesis nula. Con base en estos resultados, no hay suficiente evidencia para rechazar la hipótesis nula de que la serie de tiempo no es estacionaria. En otras palabras, la serie de tiempo estamos analizando no es estacionaria.
La diferenciación es una técnica utilizada en el análisis de series de tiempo para transformar una serie no estacionaria en una serie estacionaria.
dif_Comercializacion = diff (Comerciallizacion_ts)
adf.test(dif_Comercializacion)
##
## Augmented Dickey-Fuller Test
##
## data: dif_Comercializacion
## Dickey-Fuller = -4.0382, Lag order = 3, p-value = 0.01968
## alternative hypothesis: stationary
plot(dif_Comercializacion)
Dado que el valor p es menor que 0.05, concluimos que la serie diferenciada es estacionaria. Esto implica que las características estadísticas de la serie, como la media y la varianza, no cambian con el tiempo y lo cual se puede vizualizar mejor en el grafico, lo que es un requisito importante para muchos modelos de series temporales, como ARIMA.
dif_Ponal = diff (Ponal_ts, differences = 2)
adf.test(dif_Ponal, alternative = "stationary")
## Warning in adf.test(dif_Ponal, alternative = "stationary"): p-value smaller
## than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: dif_Ponal
## Dickey-Fuller = -5.0542, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary
plot(dif_Ponal)
dif_Canal_Civil = diff (Canal_Civil_ts, differences = 1)
adf.test(dif_Canal_Civil)
##
## Augmented Dickey-Fuller Test
##
## data: dif_Canal_Civil
## Dickey-Fuller = -3.2524, Lag order = 3, p-value = 0.09508
## alternative hypothesis: stationary
plot(dif_Canal_Civil)
Para validar la cantidad de componentes de autocorrelación (MA) y autoregresivos (AR) en el modelo ARIMA, se puede utilizar las funciones de autocorrelación (ACF) y autocorrelación parcial (PACF). Estas funciones ayudan a identificar el número de retrasos significativos en los componentes AR y MA de una serie temporal.
acf(dif_Comercializacion, frequency = 1)
pacf(dif_Comercializacion, frequency = 1)
acf(dif_Ponal, frequency = 1)
pacf(dif_Ponal, frequency = 1)
acf(Fuerzas_Espec_ts, frequency = 1)
pacf(Fuerzas_Espec_ts, frequency = 1)
acf(dif_Canal_Civil, frequency = 1)
pacf(dif_Canal_Civil, frequency = 1)
Ademas de las funcionciones ACF y PACF R tiene una funcion llamada auto arima que nos ayuda a identificar automaticamente los parametros que les corresponden a cada modelo,
Modelo_Comerciallizacion_ts = arima(Comerciallizacion_ts, order = c(4, 1, 0))
Auto_Comerciallizacion_ts = auto.arima(Comerciallizacion_ts, seasonal = FALSE, stepwise = FALSE, approximation = FALSE)
Box.test(residuals(Modelo_Comerciallizacion_ts), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(Modelo_Comerciallizacion_ts)
## X-squared = 0.0089617, df = 1, p-value = 0.9246
Box.test(residuals(Auto_Comerciallizacion_ts), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(Auto_Comerciallizacion_ts)
## X-squared = 0.080802, df = 1, p-value = 0.7762
tsdiag(Modelo_Comerciallizacion_ts)
Auto_Comerciallizacion_ts
## Series: Comerciallizacion_ts
## ARIMA(4,0,0) with zero mean
##
## Coefficients:
## ar1 ar2 ar3 ar4
## 0.1181 0.0279 0.1787 0.5679
## s.e. 0.1872 0.1603 0.1737 0.1698
##
## sigma^2 = 585077053647899721728: log likelihood = -910.87
## AIC=1831.75 AICc=1833.75 BIC=1839.67
tsdiag(Auto_Comerciallizacion_ts)
Modelo_Ponal_ts = arima(Ponal_ts, order = c(1, 1, 0))
Auto_Ponal_ts = auto.arima(Comerciallizacion_ts, seasonal = FALSE, stepwise = FALSE, approximation = FALSE)
Auto_Ponal_ts
## Series: Comerciallizacion_ts
## ARIMA(4,0,0) with zero mean
##
## Coefficients:
## ar1 ar2 ar3 ar4
## 0.1181 0.0279 0.1787 0.5679
## s.e. 0.1872 0.1603 0.1737 0.1698
##
## sigma^2 = 585077053647899721728: log likelihood = -910.87
## AIC=1831.75 AICc=1833.75 BIC=1839.67
Box.test(residuals(Modelo_Ponal_ts), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(Modelo_Ponal_ts)
## X-squared = 0.54296, df = 1, p-value = 0.4612
Box.test(residuals(Auto_Ponal_ts), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(Auto_Ponal_ts)
## X-squared = 0.080802, df = 1, p-value = 0.7762
tsdiag(Modelo_Ponal_ts)
tsdiag(Auto_Ponal_ts)
Modelo_Fuerzas_Espec_ts = arima(Fuerzas_Espec_ts, order = c(0, 1, 1))
Auto_Fuerzas_Espec_ts = auto.arima(Comerciallizacion_ts, seasonal = FALSE, stepwise = FALSE, approximation = FALSE)
Auto_Fuerzas_Espec_ts
## Series: Comerciallizacion_ts
## ARIMA(4,0,0) with zero mean
##
## Coefficients:
## ar1 ar2 ar3 ar4
## 0.1181 0.0279 0.1787 0.5679
## s.e. 0.1872 0.1603 0.1737 0.1698
##
## sigma^2 = 585077053647899721728: log likelihood = -910.87
## AIC=1831.75 AICc=1833.75 BIC=1839.67
Box.test(residuals(Modelo_Fuerzas_Espec_ts), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(Modelo_Fuerzas_Espec_ts)
## X-squared = 0.67048, df = 1, p-value = 0.4129
Box.test(residuals(Auto_Fuerzas_Espec_ts), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(Auto_Fuerzas_Espec_ts)
## X-squared = 0.080802, df = 1, p-value = 0.7762
tsdiag(Modelo_Fuerzas_Espec_ts)
tsdiag(Auto_Fuerzas_Espec_ts)
Modelo_Canal_Civil_ts = arima(Canal_Civil_ts, order = c(2, 1, 2))
Auto_Canal_Civil_ts = auto.arima(Comerciallizacion_ts, seasonal = FALSE, stepwise = FALSE, approximation = FALSE)
Box.test(residuals(Modelo_Canal_Civil_ts), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(Modelo_Canal_Civil_ts)
## X-squared = 0.049516, df = 1, p-value = 0.8239
Box.test(residuals(Auto_Canal_Civil_ts), type = "Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(Auto_Canal_Civil_ts)
## X-squared = 0.080802, df = 1, p-value = 0.7762
tsdiag(Modelo_Canal_Civil_ts)
tsdiag(Auto_Canal_Civil_ts)
Los resultados del test de Box-Ljung indican que los residuales del modelo no muestran autocorrelación significativa. Esto es una buena señal de que el modelo ha capturado adecuadamente la estructura de los datos y que los residuales se comportan como ruido blanco, por tanto lo podemos utilizar para realizar el modelo
Pronostico_Comercializacion <- forecast::forecast(Modelo_Comerciallizacion_ts, h = 4)
Pronostico_Comercializacion
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2024 Q1 18907757384 -10331115313 48146630081 -25809239556 63624754324
## 2024 Q2 12577624738 -16789077335 41944326811 -32334870362 57490119838
## 2024 Q3 39341347451 9952080494 68730614409 -5605657662 84288352565
## 2024 Q4 75043181520 45082940714 105003422326 29222947261 120863415779
plot(Pronostico_Comercializacion)
Pronostico_Ponal <- forecast::forecast(Modelo_Ponal_ts, h = 4)
Pronostico_Ponal
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2024 Q1 42521183743 13003849061 72038518425 -2621684052 87664051538
## 2024 Q2 81386094421 49623898985 113148289858 32810008371 129962180471
## 2024 Q3 57964229257 19069559869 96858898646 -1520034382 117448492897
## 2024 Q4 72079372151 30026705762 114132038539 7765368882 136393375420
plot(Pronostico_Ponal)
Pronostico_Fuerzas_Espec <- forecast::forecast(Auto_Fuerzas_Espec_ts, h = 4)
Pronostico_Fuerzas_Espec
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2024 Q1 16554968762 -14443669657 47553607180 -30853357601 63963295124
## 2024 Q2 11663980215 -19550075400 42878035830 -36073798320 59401758750
## 2024 Q3 37260855179 6019838492 68501871867 -10518156758 85039867116
## 2024 Q4 70924361369 39150512366 102698210373 22330452726 119518270012
plot(Pronostico_Fuerzas_Espec)
Pronostico_Canal_Civil <- forecast::forecast(Modelo_Canal_Civil_ts, h = 4)
Pronostico_Canal_Civil
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2024 Q1 1412507673 90235410 2734779936 -609733244 3434748590
## 2024 Q2 350737215 -980662708 1682137139 -1685463254 2386937684
## 2024 Q3 849378549 -558901224 2257658322 -1304399504 3003156602
## 2024 Q4 480505107 -928608768 1889618982 -1674548595 2635558809
plot(Pronostico_Canal_Civil)