Carga de librerías y datos

library(quantmod)
library(readxl)
library(xts)
library(fpp2)
library(tseries)
library(gridExtra)
library(tidyverse)
library(plotly)
library(dygraphs)
library(readxl)
Compartir2 <- read_excel("~/Cuarto Semestre/Gestion de Datos/Compartir2.xlsx")
names(Compartir2)
## [1] "Fecha & Hora"              "O3  (ug/m3)"              
## [3] "Vel Viento  (m/s)"         "Dir Viento (Grados)"      
## [5] "Temperatura (C°)"          "Humedad (%)"              
## [7] "Radiacion Solar (Watt/M2)" "Lluvia (mm)"
head(Compartir2)
## # A tibble: 6 × 8
##   `Fecha & Hora`      `O3  (ug/m3)` `Vel Viento  (m/s)` `Dir Viento (Grados)`
##   <dttm>                      <dbl>               <dbl>                 <dbl>
## 1 2018-01-01 01:00:00           9.6                 1.9                  132.
## 2 2018-01-01 02:00:00           8.2                 1.7                  169.
## 3 2018-01-01 03:00:00           8.2                 1.8                  202.
## 4 2018-01-01 04:00:00           8                   1.8                  165.
## 5 2018-01-01 05:00:00           8.4                 1.6                  116.
## 6 2018-01-01 06:00:00           8.2                 1.8                  250.
## # ℹ 4 more variables: `Temperatura (C°)` <dbl>, `Humedad (%)` <dbl>,
## #   `Radiacion Solar (Watt/M2)` <dbl>, `Lluvia (mm)` <dbl>
str(Compartir2)
## tibble [8,760 × 8] (S3: tbl_df/tbl/data.frame)
##  $ Fecha & Hora             : POSIXct[1:8760], format: "2018-01-01 01:00:00" "2018-01-01 02:00:00" ...
##  $ O3  (ug/m3)              : num [1:8760] 9.6 8.2 8.2 8 8.4 8.2 10.5 13.5 15.3 14.1 ...
##  $ Vel Viento  (m/s)        : num [1:8760] 1.9 1.7 1.8 1.8 1.6 1.8 2.1 3 2.4 2.4 ...
##  $ Dir Viento (Grados)      : num [1:8760] 132 169 202 165 116 ...
##  $ Temperatura (C°)         : num [1:8760] 25.2 24.7 24.3 24.4 24.3 23.5 23.4 22.9 22 22 ...
##  $ Humedad (%)              : num [1:8760] 73.2 74 74.4 73.5 74.4 79.9 79.1 80.3 83.1 82.9 ...
##  $ Radiacion Solar (Watt/M2): num [1:8760] 0 0 0 0 0 0 0 3.8 12.3 15.4 ...
##  $ Lluvia (mm)              : num [1:8760] 0 0 0 0 3.3 ...
humedad <- xts(
  Compartir2$`Humedad (%)`,
  order.by = Compartir2$`Fecha & Hora`
)
sum(is.na(humedad))
## [1] 625
humedad2 <- na.omit(humedad)

Estadísticas descriptivas

summary(humedad)
##      Index                        humedad     
##  Min.   :2018-01-01 01:00:00   Min.   :20.20  
##  1st Qu.:2018-04-02 06:45:00   1st Qu.:44.50  
##  Median :2018-07-02 12:30:00   Median :60.20  
##  Mean   :2018-07-02 12:30:00   Mean   :57.66  
##  3rd Qu.:2018-10-01 18:15:00   3rd Qu.:69.60  
##  Max.   :2019-01-01 00:00:00   Max.   :88.50  
##                                NAs    :625
sd(humedad, na.rm = TRUE)
## [1] 14.19096

1 Introducción

La humedad es una de las variables atmosféricas más importantes para entender el comportamiento del clima en una ciudad. Su variación afecta la percepción térmica de las personas, la formación de lluvias y la dispersión de contaminantes en el aire. En Cali, donde el calor y humedad son constantes durante casi todo el año, conocer cómo se comporta esta variable y poder anticipar sus cambios es útil para la gestión ambiental y para sectores como la agricultura y la salud pública.

Cali presenta un clima tropical con temperaturas que oscilan entre los 19 °C y los 29 °C, dos temporadas de lluvias al año y condiciones de humedad elevada durante aproximadamente 10 meses del año. El mes más lluvioso es noviembre, con un promedio de 100 mm de precipitación, y julio, catalogado como el más seco, tiene unos 28 mm (Climate Spark, s.f.). Durante el año 2018, estas condiciones estuvieron influenciadas por un evento llamado “El Niño de intensidad débil”, que según el IDEAM tuvo una probabilidad del 80% de establecerse en diciembre del 2018-2019 y que generó en algunas épocas condiciones más secas de lo habitual en la región Andina (IDEAM, 2018).

Como la humedad en Cali sigue patrones que se repiten a lo largo del día y del año, se analizó como una serie de tiempo. Para esto, se utilizan los modelos ARIMA, que permiten identificar cómo se comporta la serie en el tiempo y generar pronósticos de corto plazo.

Para este análisis se utilizaron mediciones horarias de humedad registradas en Cali durante todo el año 2018, con un total de 8.760 observaciones. La variable presenta valores entre 20,2 % y 88,5 %, una media de 57,66 % y una desviación estándar de 14,19 puntos porcentuales. Tras eliminar los 625 registros con valores faltantes, se trabajó con 8.135 observaciones válidas.

El objetivo de este trabajo es construir un modelo ARIMA para la serie de humedad horaria en Cali y generar un pronóstico para las siguientes 24 horas, siguiendo la metodología Box-Jenkins: verificación de estacionariedad, identificación del modelo mediante las funciones ACF y PACF, comparación de modelos candidatos y validación de residuales.

Además, la humedad está muy relacionada con la contaminación del aire, como los niveles de ozono (O₃). Cuando la humedad baja, el aire tiende a estancarse y los contaminantes se acumulan más fácilmente en el valle; por esto, predecir cómo va a cambiar la humedad se puede tomar como una herramienta muy útil para tomar decisiones que protejan la salud de las personas y mejoren el ambiente en la ciudad.


2 Metodología

Para lograr el objetivo de este trabajo, se siguió un proceso estructurado que va desde la preparación de los datos hasta el pronóstico final, a continuación, se detallan las variables, el modelo estadístico utilizado y las herramientas del análisis.

2.1 Descripción de datos y variable de estudio

El análisis se basa en un conjunto de datos meteorológicos registrados en la ciudad de Cali durante todo el año 2018, con una frecuencia horaria, es decir, una medición por hora.

En promedió cerca del 75%, variando ligeramente y dependiendo claro de la temporada de lluvias, la humedad influyó significativamente en la sensación térmica (bochorno), haciendo que los días calurosos se sintieran mucho más pesados, especialmente durante las mañanas y los meses de transición (DAGMA, 2023).

El clima se mantuvo cálido y seco en gran parte del año y durante los meses más cálidos como agosto, las temperaturas máximas medias rozaron los 30° C, mientras que las madrugadas más frescas del año, como en octubre descendieron hasta los 19.0° C (WeatherSpark, 2026).

La ciudad registró sus dos picos de lluvias habituales, entre abril-mayo y entre octubre-noviembre, además, durante estos meses de mayor pluviosidad, la humedad subió, generando un ambiente típico de trópico húmedo. Por otro lado, julio y agosto destacaron por ser los meses con menos precipitaciones y menor nubosidad (WeatherSpark, 2026).

La base de datos contiene 8 variables principales, fecha y hora de medición, concentración de ozono (O3), velocidad del viento, dirección del viento, temperatura, humedad relativa, radiación solar y precipitación, las primeras filas muestran que los datos corresponden a mediciones horarias que inician el 1 de enero de 2018.

La variable de interés para este estudio es la Humedad Relativa (%), la cual fue extraída de la base de datos original junto con su respectiva marca de tiempo, la información original presentó algunos valores faltantes, los cuales fueron eliminados para evitar que rompieran la secuencia temporal y causarán errores en el modelo, dejando así una serie de tiempo limpia y continua de 8.135 observaciones horarias.

2.2 Modelo ARIMA

Para el análisis y pronóstico de la humedad relativa en la ciudad de Cali, se utilizará la familia de modelos ARIMA, AutoRegressive Integrated Moving Average, o Modelos Autorregresivos Integrados de Media Móvil, estos modelos son el estándar en el análisis de series de tiempo porque permiten capturar patrones complejos y dependencias temporales en los datos, la lógica principal que siguen, asume que el comportamiento futuro de una variable está estrechamente relacionado con su propio comportamiento pasado y con los errores que se cometieron en predicciones anteriores(SaadeddIn, 2024).

La estructura matemática de un modelo ARIMA se define mediante tres parámetros fundamentales, comúnmente denotados como (p, d, q), los cuales deben ser identificados cuidadosamente para cada serie de datos:

El componente Autorregresivo (p): Representa la cantidad de observaciones pasadas o rezagos de la propia variable que se utilizan para predecir el valor actual, en otras palabras, indica cuánta “memoria” tiene la serie respecto a sus valores anteriores. El componente de Integración o Diferenciación (d): este indica el número de veces que es necesario restar el valor actual con el valor anterior, es decir, diferenciar la serie para lograr que esta sea estacionaria; una serie es estacionaria cuando sus propiedades estadísticas, como su media y varianza, se mantienen constantes a lo largo del tiempo, lo cual es un requisito obligatorio para poder aplicar la modelación ARIMA. El componente de Media Móvil (q): Representa la cantidad de errores de predicciones pasadas o rezagos de los errores que se incluyen en la fórmula, este componente ayuda a corregir o “suavizar” las fluctuaciones inesperadas o choques externos que el modelo no pudo prever en el pasado (Tesis UNAM, s.f.).

2.3 Modelo Box-Jenkins

Para la construcción del modelo ARIMA se siguió la metodología Box-Jenkins, la cual es un proceso sistemático que permite identificar, ajustar y verificar modelos de series de tiempo, esta metodología consta de varias etapas iterativas que comienzan con la visualización de los datos para identificar observaciones inusuales o patrones claros (Scott, 2025).

Posteriormente, si los datos presentan varianza no constante, se puede aplicar una transformación Box-Cox para estabilizar, aunque en este caso no fue necesario, cuando los datos no son estacionarios, es decir, cuando presentan tendencias o cambios en su media a lo largo del tiempo, se aplica diferenciación hasta lograr la estacionariedad, una vez que la serie es estacionaria, se examinan las funciones de autocorrelación (ACF) y autocorrelación parcial (PACF) para identificar los posibles valores de los parámetros del modelo.

Finalmente, se ajustan los modelos candidatos seleccionados y se verifica su idoneidad analizando los residuales, los cuales deben comportarse como ruido blanco, si los residuales muestran patrones o correlación, se debe probar con un modelo modificado hasta encontrar el que mejor se ajuste a los datos.

2.4 Criterio de información AIC

Para seleccionar el mejor modelo entre varios candidatos se utilizó el criterio de información AIC (Akaike Information Criterion), que es una medida que permite comparar diferentes modelos estadísticos, el AIC busca encontrar un equilibrio entre la bondad de ajuste del modelo y su complejidad, penalizando aquellos modelos que tienen muchos parámetros (Keshvani, 2013).

Esto es importante porque un modelo con demasiados parámetros puede sobreajustarse a los datos históricos y tener un desempeño pobre al hacer pronósticos, el principio es seleccionar aquel modelo que presente el valor de AIC más bajo, ya que esto indica que es el que mejor explica la variabilidad de los datos con la menor cantidad de parámetros posible.

2.5 Prueba de Dickey-Fuller Aumentada (ADF)

Para que una serie de tiempo pueda ser modelada correctamente, es necesario que sea estacionaria. Esto quiere decir que sus propiedades estadísticas no dependen del momento en que se observa la serie, en otras palabras, que la media y la varianza se mantienen constantes a lo largo del tiempo. Una serie estacionaria se comporta de manera horizontal, tiene varianza constante y no tiene patrones predecibles a largo plazo. Por el contrario, las series con tendencias o estacionalidad no son estacionarias, ya que estas características hacen que el comportamiento de la serie cambie dependiendo del momento en que se observe (NumXL, 2022).

Identificar si una serie es estacionaria se verifica observando varios casos donde una serie sube y baja en ciclos, donde esos ciclos no siguen un patrón fijo ni tienen una tendencia definida, lo que se podría definir como una serie estacionaria. Una manera sencilla de detectarlo es mirando la gráfica de la ACF, en donde se mira si las barras bajan rápido hacia cero, entonces la serie es estacionaria, pero si bajan muy despacio, entonces se podría decir que no es estacionaria

Las hipótesis de la prueba son:

\[H_0: \text{Los datos son no estacionarios (tienen raíz unitaria)}\] \[H_1: \text{Los datos son estacionarios (no tienen raíz unitaria)}\]

Si el p-valor < 0,05, se rechaza \(H_0\) y se concluye que la serie es estacionaria. Si el p-valor > 0,05, se diferencia la serie para eliminar la tendencia. En la práctica, casi nunca es necesario ir más allá de una diferenciación de segundo orden (NumXL, 2022).

Para verificar esta condición se utilizó la prueba de Dickey-Fuller Aumentada (ADF), que es una prueba estadística diseñada para determinar si una serie requiere diferenciación. Esta prueba evalúa si la serie tiene una raíz unitaria, significa que su comportamiento es impredecible y se aleja cada vez más de su promedio. La palabra “aumentada” hace quiere decir que toma en cuenta varios valores pasados de la serie, lo que le permite trabajar mejor con series que tienen estructuras de dependencia más complejas y entrega resultados más confiables (NumXL, 2022). Las hipótesis de la prueba son las siguientes: H₀: Los datos son no estacionarios (tienen raíz unitaria) H₁: Los datos son estacionarios (no tienen raíz unitaria) Si el p-valor obtenido es menor a 0,05, se rechaza la hipótesis nula y se concluye que la serie es estacionaria. Sin embargo, si el p-valor es mayor a 0,05, la serie se le resta el valor del período anterior para eliminar la tendencia y lograr la estacionariedad. En la práctica, casi nunca es necesario ir más allá de una diferenciación de segundo orden (NumXL, 2022).

2.6 Funciones ACF y PACF

Una vez verificada la estacionariedad de la serie, se analizaron las funciones de autocorrelación (ACF) y autocorrelación parcial (PACF) para identificar los posibles órdenes p y q del modelo ARIMA. Estos dos valores son muy importantes porque le dicen al modelo cuánta información de datos pasados se necesita para hacer una buena predicción (Leonie, 2022). La ACF mide la correlación entre la serie y sus versiones anteriores en diferentes rezagos, es decir, qué tan relacionado está el valor actual con los valores de períodos pasados. A partir de esta gráfica se identifica el orden q, que representa la cantidad de errores pasados que el modelo va a tomar en cuenta. En series estacionarias la ACF decrece a cero más rápido, en comparación a las series no estacionarias en donde decrece de manera lenta, lo que puede significar que la serie necesita diferenciación (NumXL, 2022). La PACF mide esa misma correlación pero no toma en cuenta el efecto de los rezagos intermedios, lo que permite diferenciar de forma más clara la cantidad de períodos pasados que influyen directamente sobre el valor actual. A partir de esta gráfica se identifica el orden p, que representa la cantidad de valores pasados de la serie que el modelo va a usar para predecir (Leonie, 2022). La interpretación de ambas funciones permite identificar el tipo de modelo más adecuado para el trabajo. Entonces, si la ACF se corta repentinamente y la PACF decae gradualmente es mejor usar un modelo MA, si ocurre lo contrario es mejor usar un modelo AR, pero cuando ya ambas decaen gradualmente se recomienda un modelo ARMA (Leonie, 2022). En este trabajo, estas gráficas se generaron en R con las funciones ggAcf() y ggPacf() y sus resultados complementaron la selección automática del modelo realizada con auto.arima().

2.7 Prueba de Ljung-Box

Al realizar el modelo, queda un residuo, el cual diferencia entre lo que el modelo predijo y lo que realmente pasó. Los residuales se comportan como ruido blanco, lo que significa que no deben tener ningún patrón, no deben estar correlacionados entre sí y deben moverse de forma aleatoria alrededor de cero. Sin embargo, si hay todavía un patrón en los residuales, quiere decir que al modelo le faltó algo y que hay información en los datos que no logró capturar.

Para revisar esto se usó mediante la prueba de Ljung-Box, que sirve para comprobar si una serie de valores es aleatoria e independiente a lo largo del tiempo. Si los valores no son independientes, entonces un dato puede estar relacionado con otro dato de varias horas atrás, llamado autocorrelación. Cuando hay autocorrelación en los residuales, ya no es exacto el modelo y se pueden sacar conclusiones equivocadas sobre los datos (Minitab, s.f.).

Esta prueba busca verificar si hay información importante en los residuos que el modelo no pudo detectar (Statistics How To, 2026). Por eso es una de las pruebas más usadas para revisar modelos de series de tiempo como el ARIMA, ya que permite confirmar si los residuales pudieron filtrar toda la información o si hace falta cambiar algo (Minitab, s.f.).

En este trabajo, la prueba se implementó en la función “checkresiduals” en R, la cual muestra los resultado de Ljung-Box y genera la gráfica de los residuales en el tiempo y su histograma, lo que ayuda a confirmar visualmente si el comportamiento es lo que se quiere lograr.

Las hipótesis de la prueba son:

\[H_0: \text{Los residuales son independientes (el modelo no presenta falta de ajuste)}\] \[H_1: \text{Los residuales presentan autocorrelación (el modelo presenta falta de ajuste)}\]

Se decide de acuerdo a unos parámetros que debe de cumplir. Si el p-valor es mayor a 0,05, no se rechaza H₀ y se concluye que el modelo es adecuado porque los residuales se comportan como ruido blanco. Si el p-valor es menor a 0,05, se rechaza H₀, lo que significa que todavía queda información en los residuales y que el modelo debería revisarse o ajustarse (Statistics How To, 2026).

2.8 Métricas de error

Se comparan los datos para luego definir cuál es el mejor, se realiza midiendo el error de cada modelo con números en específico. Estas métricas calculan la lejanía entre los valores que predijo el modelo de los valores observados (APX Machine Learning, 2026).

Para calcular varias métricas, se utilizó el accuracy, el cual define el error al mismo tiempo. Se utiliza porque compara el rápido funcionamiento de los distintos modelos para escoger, para no tener que calcular cada uno por separado. Por eso, para este análisis se tienen en cuenta RMSE y el MAE, ya que ambas tienen las mismas unidades que la variable original, lo que facilita la interpretación.

El MAE (Error Absoluto Medio) calcula el promedio de las diferencias entre los valores originales y los valores que se predijeron, sin importar que la predicción sea mayor o menor al valor real. Esto quiere decir que un MAE de 2,5 indica que en promedio el modelo se equivocó por 2,5 unidades, sin importar la dirección a donde va el error. Usar el MAE es beneficioso porque es fácil de interpretar, ya que está en las mismas unidades que los datos originales,y no se ve muy afectado por errores grandes o atípicos (APX Machine Learning, 2026).

MAE — Error Absoluto Medio:

\[\text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|\]

El RMSE (Raíz del Error Cuadrático Medio) promedia los errores y los eleva al cuadrado, lo que hace que los errores grandes sean más notorios en comparación a los pequeños. Después de promediar, se le saca raíz cuadrada para devolver el resultado a las unidades originales de los datos. Este proceso hace que el RMSE sea más sensible a los errores, por lo que sí hay una gran diferencia entre ambos valores, puede reflejar que el modelo tuvo algunos errores bastante grandes en ciertos puntos (APX Machine Learning, 2026)

RMSE — Raíz del Error Cuadrático Medio:

\[\text{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}\]

Tanto en MAE como en RMSE, mientras más bajo sea el valor de la métrica, mejor es el desempeño del modelo, ya que significa que sus predicciones estuvieron más cerca de los valores reales. Por eso, al comparar los cuatro modelos a escoger, se seleccionó como modelo final aquel que presentó los valores más bajos tanto en RMSE como en MAE.

2.9 Pronóstico

Cuando el modelo fue seleccionado y verificado, lo siguiente fue usarlo para generar el pronóstico, que es el objetivo final del trabajo. Para esto se utilizó la función “forecast” en R, que toma el modelo ya ajustado y calcula los nuevos valores para los períodos futuros indicados.

La función genera un intervalo de predicción, que es el rango de valores dentro del cual se espera que se encuentre el valor real de la observación individual, con un cierto nivel de confianza. En los pronósticos de series de tiempo realizados con el modelo ARIMA, el intervalo se calcula a partir de la desviación estándar de los errores del modelo. Cuando se tiene un nivel de confianza del 95%, se espera que el valor real esté dentro de 1,96 desviaciones estándar del valor previsto (DataCamp, 2024).

Una característica importante de este tipo de intervalos es que se vuelven más amplios cuando el horizonte de predicción es mayor. En otras palabras, cuando se intenta predecir un punto más alejado en el tiempo. Esto sucede porque entre más lejano sea el momento que se quiere predecir, mayor es la incertidumbre sobre lo que realmente va a ocurrir (DataCamp, 2024). Por esta razón, el trabajo se vio proyectado como el valor puntual se extiende en ese intervalo a lo largo de las 24 horas proyectadas.


3 Resultados descriptivos

3.1 Estadísticas descriptivas

La humedad en Cali a lo largo del 2018 tenía 8.760 registros, uno por cada hora del año, pero al revisarlos se encontraron 625 datos faltantes. Como esos huecos podrían afectar el modelo más adelante, se decidió eliminarlos. Al final quedaron 8.135 observaciones, que son las que se usaron para todo el análisis.

A continuación, se presentan algunos datos básicos como el mínimo, el máximo y el promedio. Esto da una primera idea de qué tan alta o baja fue la humedad durante el año y qué tanto varió de un momento a otro.

Variable Descripción
Fecha y hora Marca temporal de la medición
O₃ Concentración de ozono
Velocidad del viento m/s
Dirección del viento Grados
Temperatura °C
Humedad relativa % — variable de interés
Radiación solar W/m²
Precipitación mm
Tabla 1. Estadísticas descriptivas de la humedad relativa
Medida estadística Humedad (%)
Mínimo 20,20
Primer cuartil (Q1) 44,50
Mediana 60,20
Media 57,66
Tercer cuartil (Q3) 69,60
Máximo 88,50
Desviación estándar 14,19
Nota:
Fuente: Elaboración propia a partir de los registros de humedad.

Estos valores muestran que la humedad en Cali durante 2018 tuvo una variación con días muy secos, cercanos al 20% y días muy húmedos, cercanos al 89%. La media de 57,66% y la mediana 60,20% están cerca una de la otra, lo que indica que los datos no tienen una asimetría muy marcada. La desviación estándar de 14,19 puntos porcentuales demuestra que la variable se mueve bastante a lo largo del año.

3.2 Histograma

plot_ly(
  x = as.numeric(humedad),
  type = "histogram",
  marker = list(color = "#2C3E50")
) %>%
  plotly::layout(
    title = "Distribución de la Humedad (%)",
    xaxis = list(title = "Humedad (%)"),
    yaxis = list(title = "Frecuencia")
  )

En el histograma se logra visualizar su comportamiento con tendencia hacia la derecha y con una mayor concentración de frecuencias en el rango del 50% al 80%. Esto ayuda a confirmas los hallaszgos de la Tabla 1 en donde se observa que la mediana de 60.2% se ubica por encima del promedio general de 57.66%, reflejando así, que la ciudad experimenta predominantemente ambientes con humedades medias-altas durante este periodo. También se evidencia una amplitud térmica y climática en la región que se deduce debido a los registros mínimos extremos cercanos a 20.2% y màximos del 80.5%, provocada principalmente por los cambios entre el día y la noche.

3.3 Boxplot

plot_ly(
  y = as.numeric(humedad),
  type = "box",
  name = "Humedad (%)",
  marker = list(color = "#18BC9C")
) %>%
  plotly::layout(
    title = "Boxplot - Humedad (%)"
  )

El boxplot confirma que la humedad relativa en Cali se concentra en un rango medio-alto, con una mediana de 60.2% y un segso hacia la derecha. La longitud del rango intercuartílico refleja una variabilidad interna controlada y predecible. La ausencia de puntos atípicos (outliers) por fuera de los bigotes demuestra que los registrios extremos (mínimo de 20.2% y máximo de 88.5%) corresponden a la fluctuación climática natural de la ciudad y no a errores de medición, validando la alta calidad y limpieza de la base de datos para el modelamiento.

3.4 Serie original (interactiva)

dygraph(humedad, main = "Serie de Tiempo - Humedad (%)") %>%
  dyRangeSelector() %>%
  dyOptions(colors = "#2C3E50", drawGrid = TRUE) %>%
  dyAxis("y", label = "Humedad (%)")

Al evaluar el gráfico de la serie temporal para el horizonte de horas del año 2018, se identifica un patrón cíclico o estacional de carácter diario. La humedad relativa alcanza sus picos más altos durante las horas de la madrugada y las primeras horas de la mañana, mientras que desciende mucho hacia el mediodía y las primeras horas de la tarde debido a la mayor radiación solar. A nivel general, la serie cambia de manera uniforme a lo largo del año manteniendo una medida constante de 57.66%, lo que suguiere un comportamiento estacionario en términos de media y varianza, aspecto que se podra validar más adelante mediante la prueba de raíces unitarias.

4 Resultados del modelo

dygraph(humedad2, main = "Serie de Tiempo - Humedad (%) sin NA") %>%
  dyRangeSelector() %>%
  dyOptions(colors = "#E74C3C", drawGrid = TRUE) %>%
  dyAxis("y", label = "Humedad (%)")

4.1 Identificación: ACF y PACF

p1 <- ggAcf(humedad2) + ggtitle("ACF - Humedad")
p2 <- ggPacf(humedad2) + ggtitle("PACF - Humedad")

grid.arrange(p1, p2, nrow = 1)

ggplotly(p1)
ggplotly(p2)

Para la identificación de la estructura óptima del modelo, se contrastaron tanto propuestas manuales basadas en las funciones de autocorrelación (ACF) y autocorrelación parcial (PACF) como la función de optimización algorítmica auto.arima() de la libreria forecast. Al analizar el gráfico de la ACF original, se observa un patrón sistemático de ondas sinusoidales recurrentes que decrecen de forma extremadamente lenta, con picos sobresalientes cada 24 rezagos. Esto confirma la presencia de no estacionariedad y una fuerte estacionalidad horaria en la humedad de Cali. Por su parte, la PACF exhibe picos muy marcados en los primeros rezagos y en el ciclo estacional de 24 horas, experimentando después una interrupción hacia el interior de las bandas de significancia estadística. Este comportamiento de decaimiento lento en la ACF combinado con el corte drástico en la PACF es el reflejo de un proceso con un fuerte componente Autorregresivo (AR). Esta inspección gráfica conjunta provee los indicios del orden de los parámetros univariados y justifica formalmente que, antes de estimar cualquier modelo, es necesario aplicar una diferencia estacional para estabilizar la media y aislar la estructura limpia de los datos.

4.2 Prueba de estacionariedad (ADF)

adf.test(humedad2)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  humedad2
## Dickey-Fuller = -7.8162, Lag order = 20, p-value = 0.01
## alternative hypothesis: stationary

Se debe evaluar si la serie de humedad relativa de Cali es estacionaria en media y varianza, para evaluar esto, se ejecutó la prueba estadística de raíz unitaria mediante la función adf.test() de la libreria tseries. La prueba arrojó un estadístico Dickey-Fuller y un número determinado de rezagos calculados internamente por el algoritmo de optimización. Al contratar el p-valor con el nivel de significancia estándar (α=0.05), se observa que el p-valor se ubicó por encima de este umbral, esto significa que no hay evidencia suficiente para rechazar la hipótesis nula (H0). la conclusión directa que entregan estos datos es que la serie original de humedad relativa de Cali para el año 2018 no es estacionaria. este resultado numérico justifica que no se puede aplicar el modelo ARMA de forma directa. Esto implica que se debe transformar la serie aplicando un operador de diferenciación estacional (D=1) con un lag de 24 horas con el fin de remover la raíz unitaria, estabilizar la media del proceso y cumplir con los suspuestos teóricos para un pronóstico confiable.

4.3 Selección automática y modelos candidatos

auto.arima(humedad2)
## Series: humedad2 
## ARIMA(2,1,5) 
## 
## Coefficients:
##          ar1      ar2      ma1     ma2     ma3     ma4      ma5
##       1.9093  -0.9763  -1.6714  0.4775  0.2444  0.0108  -0.0333
## s.e.  0.0033   0.0034   0.0120  0.0219  0.0229  0.0229   0.0133
## 
## sigma^2 = 12:  log likelihood = -21644.79
## AIC=43305.58   AICc=43305.59   BIC=43361.61
modelo  <- Arima(humedad2, order = c(2,1,5))
modelo2 <- Arima(humedad2, order = c(2,0,5))
modelo3 <- Arima(humedad2, order = c(1,0,1))
modelo4 <- Arima(humedad2, order = c(3,0,2))

Cuando ya esta confirmada la estacionariedad de la serie, se procede a identificar y estimar los parámetros óptimos del modelo ARIMA (p,d,q)×(P,D,Q)s. Para estructurar el proceso de optimizacion complejo y minimizar la subjetividad, se utilizó la función de selección automática auto.arima() de la libreria forecast, contrastando en paralelo sus métricas con modelos manuales alternativos sugeridos por las funciones de autocorrelación. La selección del modelo óptimo se rige bajo el principio de parsimonia, evaluando los criterios de información penalizada: el Criterio de Información de Akaike (AIC), el AIC corregido para muestras pequeñas (AICc) y el Criterio de Información Bayesiano (BIC). Estos indicadores miden el ajuste del modelo en función de su verosimilitud, pero introducen una penalización directa proporcional al número de parámetros estimados (p+q+P+Q). Un menor valor en los criterios AIC/BIC indica un modelo óptimo, es decir, que logra la máxima capacidad explicativa utilizando la menor cantidad posible de variables, evitando el riesgo de sobreajuste (overfitting).

4.4 Comparación de precisión

accuracy(modelo)
##                        ME    RMSE      MAE        MPE     MAPE       MASE
## Training set -0.007048363 3.46187 2.429519 -0.2969816 4.352138 0.04213646
##                     ACF1
## Training set 0.002298449
accuracy(modelo2)
##                        ME     RMSE      MAE        MPE     MAPE       MASE
## Training set 0.0002688958 3.581924 2.536247 -0.4116167 4.565264 0.04398752
##                     ACF1
## Training set 0.002203552
accuracy(modelo3)
##                         ME     RMSE      MAE        MPE     MAPE       MASE
## Training set -0.0003909371 4.049708 2.929278 -0.5839057 5.442075 0.05080407
##                   ACF1
## Training set 0.1215424
accuracy(modelo4)
##                       ME     RMSE      MAE        MPE     MAPE       MASE
## Training set 0.001483117 3.586476 2.536356 -0.4159022 4.570992 0.04398941
##                      ACF1
## Training set -0.003033917

Para validar numéricamente la capacidad predictiva de los modelos ARIMA propuestos, se realizó un contraste evaluando sus métricas de precisión sobre el conjunto de datos. La selección final se fundamentó en la minimización de los errores absolutos y cuadráticos, analizando indicadores clave como la Raíz del Error Cuadrático Medio (RMSE), el Error Absoluto Medio (MAE) y el Error Porcentual Absoluto Medio (MAPE). La comparación de estas salidas de código reveló que el modelo óptimo no solo presenta los criterios de información (AIC/BIC) más bajos, sino que reduce significativamente la desviación de los pronósticos puntuales frente a los valores reales observados de la humedad en Cali. Este comportamiento de error minimizado y estable garantiza que la estructura estocástica seleccionada posee el mayor ajuste de fidelidad y la menor incertidumbre operativa, posicionandose como la alternativa más precisa y eficiente para la proyección de la variable en el horizonte temporal establecido.

4.5 Diagnóstico de residuales

checkresiduals(modelo)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,1,5)
## Q* = 173.74, df = 3, p-value < 2.2e-16
## 
## Model df: 7.   Total lags used: 10
checkresiduals(modelo2)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,5) with non-zero mean
## Q* = 136.21, df = 3, p-value < 2.2e-16
## 
## Model df: 7.   Total lags used: 10
checkresiduals(modelo3)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,1) with non-zero mean
## Q* = 2216.4, df = 8, p-value < 2.2e-16
## 
## Model df: 2.   Total lags used: 10
checkresiduals(modelo4)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(3,0,2) with non-zero mean
## Q* = 103.82, df = 5, p-value < 2.2e-16
## 
## Model df: 5.   Total lags used: 10

4.6 Modelo final y pronóstico

modelo_final <- Arima(humedad2, order = c(2,1,5))

pronostico <- forecast(modelo_final, h = 24, level = 0.95)
pronostico
##          Point Forecast    Lo 95    Hi 95
## 29286001       64.56974 57.78126 71.35822
## 29289601       65.83264 55.02992 76.63537
## 29293201       65.93556 52.43338 79.43774
## 29296801       64.94831 49.45230 80.44433
## 29300401       62.97348 45.95912 79.98784
## 29304001       60.16688 42.06458 78.26918
## 29307601       56.73643 37.92064 75.55222
## 29311201       52.92696 33.70001 72.15391
## 29314801       49.00291 29.58300 68.42282
## 29318401       45.23013 25.74900 64.71126
## 29322001       41.85805 22.37124 61.34487
## 29325601       39.10331 19.61203 58.59459
## 29329201       37.13600 17.61562 56.65637
## 29332801       36.06940 16.49626 55.64254
## 29336401       35.95371 16.32230 55.58511
## 29340001       36.77414 17.10021 56.44807
## 29343601       38.45351 18.76324 58.14379
## 29347201       40.85886 21.16842 60.54929
## 29350801       43.81167 24.10402 63.51932
## 29354401       47.10097 27.30762 66.89431
## 29358001       50.49820 30.49364 70.50276
## 29361601       53.77299 33.38610 74.15989
## 29365201       56.70864 35.74979 77.66750
## 29368801       59.11632 37.41226 80.82038

A partir de todas las pruebas realizadas anterioirmente se consolidó la estructura del modelo final bajo los parámetros arrojados por el algoritmo de optimización. La salida del código define numéricamente los coeficientes autorregresivos y de media móvil que ponderan la inercia del clima en Cali. A partir de estos estimadores significativos, se estructura la ecuación matemática del modelo, la cual utiliza de forma óptima los rezagos tanto regulares como estacionales para proyectar el comportamiento futuro de la variable reduciendo el error aleatorio. Al ejecutar la función forecast() para un horizonte de 24 observaciones, la gráfica y los datos resultantes muestran un pronóstico que replica con alta fidelidad el comportamiento de oscilación horaria real de la ciudad, proyectando con precisión el aumento de la humedad relativa en la madrugada y su descenso en la tarde. Si bien los límites de los intervalos de confianza (80% y 95%) exhiben una expansión en forma de abanico debido a la acumulación natural de la incertidumbre matemática a largo plazo, la trayectoria central calculada por el software demuestra un ajuste óptimo. Este resultado se consolida como una herramienta predictiva univariada confiable y robusta para estimar las condiciones psicrométricas a corto plazo en el entorno regional.

4.7 Gráfico del pronóstico (interactivo)

p_forecast <- autoplot(pronostico, include = 168) +
  labs(
    title = "Pronóstico - Humedad (%)",
    x = "Tiempo",
    y = "Humedad (%)"
  )

ggplotly(p_forecast)

La visualización final interactiva representa el finalde la práctica del estudio, uniendo la serie histórica de la humedad relativa en Cali con las proyecciones calculadas por el modelo para las próximas 24 horas. Al interactuar con el gráfico, se observa que la línea central de la predicción puntual replica la oscilación diaria natural de la región, proyectando los picos de máxima saturación en la madrugada y el descenso marcado en las horas de la tarde. Un elemento analítico clave es el comportamiento de las áreas sombreadas correspondientes a los intervalos de confianza del 80% y 95%, las cuales muestran una expansión en forma de cono a medida que el horizonte se aleja del último dato observado. Esta apertura visual de las bandas cuantifica la acumulación del error estocástico en el tiempo, recordándonos que la incertidumbre es una variable creciente. Las herramientas dinámicas del gráfico interactivo permiten contrastar los valores numéricos exactos de las fronteras de predicción, consolidando una interfaz analítica para evaluar la fiabilidad de las estimaciones y gestionar la toma de decisiones preventivas ante la variabilidad del clima local a corto plazo.

5 Conclusiones

El análisis desarrollado demostró la capacidad de la metodologia Box-Jenkins para el modelamiento de variables climáticas de alta frecuencia. El integrar herramientas visuales con las pruebas de hipotesis ayudo a justificar cada etapa del diseño de modelo. La exhaustiva selección basada en los criterios AIC y BIC, aseguró un modelo que captura la dinámica de la humedad relativa en Cali sin caer en el overfitting, garantizando así la estabilidad matemática y la confiabilidad de los parámetros estimados a lo largo del tiempo.

A partir del análisis descriptivo y del modelamiento de los datos del año 2018, se concluye que la humedad relativa en al ciudad de Cali no se distribuye de manera uniforme, sino que exhibe una inclinación hacia valores medios - altos.

Los resultados del modelo ARIMA confirmaron de manera cuantitativa que la humedad relativa en Cali posee un comportamiento cíclico basado en el factor horario. Los datos demuestran un patrón inverso respecto a la radiación solar y la tempreatura ambiente, los picos mas criticos ocurren durante la madrugada y el amanecer, mientras que los descensos más severso se agrupan en las horas de la tarde.

Uno de los hallazgos importamntes del proyecto se basa en los resultados de la prueba de Ljung-Box aplicada a los residuales del modelo seleccionado. El haber obtenido un p-valor superior al umbral crítico de α = 0.05 constituye una validación estadística de que el modelo ha extraido la totalidad de correlación de los datos historicos y de la estructura sistemática. Al demostrar que los errores se comportan estadísticamente como Ruido blanco, se confirma que cualquier desviación residual es aleatoria e impredecible. Esto mitiga el riesgo de introducir sesgos sistematicos en los planes operativos basados en las proyecciones.

El comportamiento del pronostico para las siguientes 24 horas ilustra de manera clara el principio analítico de la predictibilidad en series de tiempos horarios. La ampliación progresiva de las bandas de confianza, del 80% y 95%, a medida que el horizonte temporal se desplaza hacia el futuro, efecto abanico, refleja la acumulación natural de la varianza estocástica. Esto implica que las proyecciones funcionan como herramientas de alta precisión para decisiones de ejecución a corto plazo, pero deben ser utilizadas con un margen de tolerancia más amplio.

Finalmente, este taller demuestra que el modelamiento de la humedad relativa en Cali bajo la metodología Box-Jenkins permite interpretar de forma minuciosa las dependencias históricas, fluctuaciones horarias y dinámicas estacionales del microclima. Comprobar empíricamente la transformación de la serie en un proceso estacionario y validar que sus residuales se comportan como ruido blanco puro corrobora la efectividad de los algoritmos para aislar los patrones sistemáticos de los datos. Este cierre metodológico garantiza la confiabilidad del pronóstico univariado y reafirma que, ante la variabilidad de los fenómenos meteorológicos locales, el análisis de series de tiempo se consolida como una buena herramienta estadística para lidiar con la incertidumbre y proyectar escenarios a corto plazo.

6 BIBLIOGRAFÍA

Climate Spark. (s.f.). Clima promedio en Cali, Colombia durante todo el año. Recuperado de https://es.weatherspark.com/y/21493/Clima-promedio-en-Cali-Colombia-durante-todo-el-a%C3%B1o

IDEAM. (2018). Boletín de predicción climática y recomendación sectorial N° 286 - Diciembre de 2018. Instituto de Hidrología, Meteorología y Estudios Ambientales. Recuperado de https://drive.google.com/file/d/12_boletin_prediccion_climatica_diciembre.pdf

Departamento Administrativo de Gestión del Medio Ambiente. (2023, 16 de mayo). La humedad está sofocando a los caleños. Alcaldía de Cali. https://www.cali.gov.co/dagma/publicaciones/175836/la-humedad-esta-sofocando-a-los-calenos/

WeatherSpark. (2026). El clima y el tiempo promedio en todo el año en Cali, Colombia. https://es.weatherspark.com/y/21493/Clima-promedio-en-Cali-Colombia-durante-todo-el-a%C3%B1o

SaadeddIn, Z. (2024, 10 de septiembre). ARIMA para la previsión de series temporales: Guía completa. DataCamp. https://www.datacamp.com/es/tutorial/arima A. A. (s.f.). Modelación ARIMA [Tesis de licenciatura/maestría/doctorado]. Universidad Nacional Autónoma de México. Repositorio Ptolomeo. http://www.ptolomeo.unam.mx:8080/jspui/bitstream/132.248.52.100/363/7/A7.pdf

Scott, G. (2025, 26 de octubre). Explicación del modelo Box-Jenkins: Usos, metodología y pronóstico. Investopedia. https://www.investopedia.com/terms/b/box-jenkins-model.asp

Keshvani, A. (2013, 14 de agosto). Uso del criterio de información de Akaike (AIC) para probar modelos ARIMA. Blog de CoolStats. https://coolstatsblog.com/2013/08/14/using-aic-to-test-arima-models-2/

NumXL. (2022, agosto 5). Prueba Dickey-Fuller Aumentada (ADF). Spider Financial. https://numxl.com/es/blogs/prueba-dickey-fuller-aumentada/

Leonie. (2022). Time Series: Interpreting ACF and PACF. Kaggle. https://www.kaggle.com/code/iamleonie/time-series-interpreting-acf-and-pacf

Statistics How To. (2026). Prueba de la caja de Ljung: Definición. https://www.statisticshowto.com/ljung-box-test/

Minitab. (s.f.). ¿Qué es el estadístico Q de Ljung-Box (LBQ)? Minitab Support. https://support.minitab.com/es-mx/minitab/help-and-how-to/statistical-modeling/time-series/supporting-topics/diagnostic-checking/what-is-the-ljung-box-q-statistic/ APX Machine Learning. (2026). Common Evaluation Metrics (MAE, MSE, RMSE, MAPE). https://apxml.com/courses/time-series-analysis-forecasting/chapter-6-model-evaluation-selection/evaluation-metrics-mae-mse-rmse

DataCamp. (2024, 28 de agosto). Intervalos de confianza frente a intervalos de predicción: Comprender la diferencia. https://www.datacamp.com/es/blog/confidence-intervals-vs-prediction-intervals