Librerias

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)

Definimos la ruta de trabajo

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"

Cagamos el Set de Datos

Data_Comercializacion = read.csv("Tabla Comercialización.csv")

Vizualizamos las primeras filas del Dataset

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

Ver estructura del Dataset

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  "" "" "" "" ...

Limpieza de los datos

Convertimos a fecha las columnas FECHA.SUSCRIPCION y FECHA.VENCIMIENTO

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")

Contar los valores NA por columna

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

Convertimos los valores NA en 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

Contar los valores NA por columna

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

Vemos el valor de Fecha Suscripcion en NA

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

Buscamos el valor NA y colocamos la fecha de diciembre

Data_Comercializacion$FECHA.SUSCRIPCION <- ifelse(is.na(Data_Comercializacion$FECHA.SUSCRIPCION), as.Date("2020-12-01"), Data_Comercializacion$FECHA.SUSCRIPCION)

validamos que no hayan NA

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)

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] "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."

Validamos que los meses de 2015 a 2023 estan todos

# 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

Analisis descriptivo

Resumen de los datos

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.

Eliminar valores

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

Calculamos la media y la desviación estándar de VALOR.CONTRATADO

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.

Visualización de Datos

Para una mejor comprensión, puedes visualizar la distribución de los valores con un histograma o un gráfico de caja (boxplot)

# 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.

Variación del valor contratado en el tiempo

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

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.

Ver en que año fue la mayor cantidad de venta

# 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.

Ver clientes a lo que mas se le ha vendido a lo largo del tiempo

# 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

Unificar los valores de “EJC” y “EJERCITO”

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.

Top 10 de los clientes con los contratos más grandes

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

Análisis de la Distribución del Valor Contratado por Fuerza o Dependencia

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.

Evolución del Valor Contratado por Año y Fuerza o Dependencia

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

Separación de los clientes más importantes

# 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), ]

Resumen de los data set Separados

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 Ponal

# 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 Fuerzas Especiales

# 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 Canal Civil

# 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

procedemos a crear una columna de trimestre

Data_Comercializacion$TRIMESTRE <- paste(year(Data_Comercializacion$FECHA.SUSCRIPCION), quarter(Data_Comercializacion$FECHA.SUSCRIPCION), sep = "-")

Filtramos las distintas dependencias para tener la columna de trimestre y hacer las series de tiempo de las dependencia

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), ]

Regresión lineal General

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.

Regresión lineal Policia Nacional

# 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

Regresión lineal Fuerzas Especiales

# 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

Regresión lineal Canal Civil

# 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

Creamos una Tabla con el Valor contratado y los trimestres, esta nos servirá para crear nuestras series de tiempo y Sumarizamos los Valores contratados por cada trimestre

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)

Nos seguramos que todos los set de datos tengan las mismas cantidad de trimestres

# 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)

Vemos los trimestres de cada año

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

Vemos el resumen de las tablas

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

Series de tiempo

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 ...

Creamos nuestra serie de tiempo que parta desde el 2015 al 2023 y le indicamos que la cree por trimestres

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

Prueba Dickey-Fuller probar estacionariedad

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.

Datos generales Comercialización

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.

Datos Policia Nacional

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.

Data Fuerzas Especiales

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.

Data Canal Civil

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.

Diferencia

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.

Diferencia generales Comercialización

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.

Diferencia Policia Nacional

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)

Diferencia Canal Civil

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)

Validamos la cantidad de autocorrelación y Autorregresivos

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.

autocorrelación y autoregresivos generales Comercialización

acf(dif_Comercializacion, frequency = 1)

pacf(dif_Comercializacion, frequency = 1)

autocorrelación y autoregresivos Policia Nacional

acf(dif_Ponal, frequency = 1)

pacf(dif_Ponal, frequency = 1)

autocorrelación y autoregresivos Fuerzas Especiales

acf(Fuerzas_Espec_ts, frequency = 1)

pacf(Fuerzas_Espec_ts, frequency = 1)

autocorrelación y autoregresivos Canal Civil

acf(dif_Canal_Civil, frequency = 1)

pacf(dif_Canal_Civil, frequency = 1)

Modelo Arima

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 Arima Data Comercialización

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 Arima Data Policia Nacional

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 Arima Data Fuerzas Especiales

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 Arima Data Canal Civil

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 del año 2024 que nos pudiera ayudar a predecir las ventas de ese año

Pronostico General Comercialización

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 Ventas a Policia Nacional

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 Ventas a Fuerzas especiales

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 Ventas a Canal Civil

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)