1. Introducción

La temperatura es una de las variables climáticas que más influye en la vida diaria de las personas. En una ciudad como Cali, ubicada en el Valle del Cauca, las condiciones térmicas afectan actividades cotidianas como la agricultura, el consumo de energía, la salud pública y la planificación urbana (IDEAM, 2023). Por esta razón, entender cómo se comporta la temperatura a lo largo del tiempo y, aún más importante, poder anticipar sus cambios, se convierte en una herramienta valiosa para la toma de decisiones. Por lo tanto, se plantea la siguiente pregunta de investigación, ¿Es posible y qué tan preciso resulta un modelo ARIMA para pronosticar la temperatura promedio diaria de la ciudad de Cali durante diciembre de 2018, y cuáles son sus principales beneficios y limitaciones?

El análisis de series de tiempo ofrece métodos estadísticos que permiten estudiar el comportamiento histórico de una variable y proyectarlo hacia el futuro (Hyndman & Athanasopoulos, 2018). Entre estos métodos, los modelos ARIMA (Autorregresivos Integrados de Media Móvil) son ampliamente utilizados porque logran capturar las dependencias temporales presentes en los datos, como la relación entre la temperatura de un día y la del día anterior.

Con base en esto, el presente trabajo aplica un modelo ARIMA (1,0,0)a la serie de temperatura promedio diaria registrada en Cali durante 2018, con el propósito de generar un pronóstico para el mes diciembre, desde el dia 8 hasta el dia 31 evaluando la precisión, beneficios y limitaciones del modelo. El informe se estructura en: introducción, metodología, análisis descriptivo, desarrollo del modelo, conclusiones y bibliografía.

2. Metodología

Para llevar a cabo este estudio, se siguieron varios pasos que permitieron pasar de los datos brutos a un modelo de pronóstico confiable. Todo el proceso se realizó en el entorno de programación R, utilizando librerías especializadas en el manejo de series de tiempo como forecast, tseries y xts.

2.1 Preparación de la base de datos

La base de datos original contiene registros horarios de variables climáticas y de calidad del aire para la ciudad de Cali durante el año 2018. Para este estudio, se seleccionó la variable Temperatura (C°), y los datos horarios se agregaron calculando el promedio diario, lo que permitió obtener una serie más estable y eliminar la variabilidad propia de las horas del día.

La serie diaria presentaba 21 valores faltantes principalmente en febrero, los cuales fueron estimados mediante interpolación lineal, un método que asume una transición suave entre los valores conocidos y que resulta adecuado para variables climáticas.Debido a que en el mes de febrero se presento un hueco prolongado de datos faltantes, este periodo fue excluido del modelamiento, ya que comprometía la confiabilidad.

Finalmente, en el desarrollo , la serie se dividió en dos partes: un conjunto de entrenamiento (desde el 1 de marzo hasta el 7 de diciembre de 2018) para construir el modelo, y un conjunto de prueba (desde el 8 de diciembre hasta el 31 de diciembre de 2018) para evaluar su capacidad predictiva.

library(readxl)
library(tidyverse)
library(lubridate)
library(tseries)
library(forecast)
library(fpp2)
library(gridExtra)
library(knitr)
library(kableExtra)
library(plotly)
library(xts)
library(zoo)

Compartir2_1_ <- read_excel("Compartir2 (1).xlsx",
              col_types = c("date", "numeric", "numeric",
              "numeric", "numeric", "numeric",
              "numeric", "numeric"))   #Leer la base de datos y cambiar el tipo de variables

data_temp <- Compartir2_1_ %>% 
  select("Fecha & Hora", "Temperatura (C°)") %>%
  rename(
    fecha = "Fecha & Hora",
    temperatura = "Temperatura (C°)") %>%
  mutate(fecha = as.Date(fecha)) %>%
  filter(fecha <= as.Date("2018-12-31")) #Filtra la base de datos en la serie de temperatura

data_diario <- data_temp %>%
  group_by(fecha) %>%
  summarise(temp_media = mean(temperatura, na.rm = TRUE))

data_diario <- data_diario %>%
  mutate(temp_media = ifelse(is.nan(temp_media), NA, temp_media))

2.2 Análisis de estacionariedad

Antes de ajustar el modelo, se verificó que la serie fuera estacionaria, es decir, que su comportamiento como la tendencia, media y varianza sean constantes a lo largo del tiempo. Para ello, se aplicaron dos pruebas: Dickey-Fuller Aumentada cuya hipótesis nula es que la serie tiene raíz unitaria y no es estacionaria y la prueba KPSS, cuya hipótesis nula es que la serie sí es estacionaria. El resultado de estas pruebas indicaba si la serie requiere diferenciación.

2.3 Creación y selección del modelo ARIMA

La selección del modelo se realizó comparando los resultados obtenidos mediante dos enfoques. Por un lado, se utilizó la función auto.arima(), la cual evalúa de forma automática múltiples combinaciones de parámetros (p, d, q) y selecciona aquella que mejor equilibra el ajuste a los datos con la simplicidad del modelo. Y por otro lado, se realizó un análisis manual a partir de los gráficos de autocorrelación (ACF) y autocorrelación parcial (PACF), con el fin de identificar posibles órdenes autorregresivos (p) y de medias móviles (q) consistentes con el comportamiento de la serie. Es decir, que los modelos obtenidos de las dos formas, fueron comparados y se eligió el modelo con menor valor en los criterios AIC, AICc Y BIC, teniendo mayor valor el AICc.

El modelo seleccionado fue un ARIMA(1,0,0), también conocido como modelo autorregresivo de orden 1. Este modelo establece que la temperatura de un día determinado depende de la temperatura del día anterior, más un término de error aleatorio. Su ecuación es:

\[y_t = C + ϕ1y_{t-1} + \varepsilon_t\]

donde \(y_{t}\)es la temperatura del dia t, \(y_{t-1}\) es la temperatura en el día anterior (t−1), \(C\) es una constante \(φ\) es el coeficiente que mide la influencia del día anterior, y \(ε_t\) es el error del modelo.

2.4 Pronóstico y evaluación

Con el modelo validado, se generaron pronósticos para los 24 días correspondientes al conjunto de prueba, desde el 8 de diciembre hasta el 24 de diciembre del 2018, los cuales fueron comparados contra los valores reales observados con el fin de cuantificar el error de predicción mediante el Error medio (ME),el error Cuadrático Medio (RMSE),el error absoluto medio (MAE) y el error porcentual Absoluto Medio (MAPE)

2.5 Validación del modelo

Se procedió a verificar que los residuales (los errores de predicción dentro de la muestra) se comportaran como ruido blanco, es decir, que no presentan patrones sistemáticos ni autocorrelación. Esta validación se realizó mediante la prueba de Ljung-Box, que evalúa formalmente la presencia de autocorrelación en los residuales y la inspección visual de los gráficos de los residuos,entre los que se encuentran la función de autocorrelación (ACF) y el análisis de la normalidad mediante el histograma y la prueba de shapiro.Esta validación es fundamental para garantizar que el modelo captura adecuadamente la estructura de los datos y que sus predicciones son confiables.

3. Análisis Descriptivo

3.1 Descripción de la serie

La temperatura es una de las variables climáticas fundamentales para comprender el comportamiento ambiental de una ciudad. En el caso de Cali, capital del Valle del Cauca y tercera ciudad más grande de Colombia, las condiciones térmicas son determinantes para múltiples sectores como la salud pública, la agricultura, la planificación urbana y el consumo energético (IDEAM, 2023).

La serie analizada corresponde a registros horarios de temperatura recolectados durante el año 2018 en una estación meteorológica ubicada en la ciudad de Cali. Para facilitar el análisis y eliminar la variabilidad propia de las fluctuaciones hora a hora, los datos fueron agregados calculando el promedio diario de temperatura, obteniendo una serie de observaciones diarias que resume el comportamiento térmico de cada día del año.

El año 2018 fue climatológicamente relevante para Colombia y para el Valle del Cauca en particular. Las desviaciones de temperatura en 2018 fueron ligeras con respecto al promedio del período 1970-2017, aunque se registraron anomalías notables en los meses de agosto, octubre y noviembre. Adicionalmente, para el trimestre octubre-noviembre-diciembre de 2018 se previeron anomalías de temperatura mayores de +1.0°C en gran parte del territorio nacional, lo que indica que el cierre del año estuvo marcado por temperaturas por encima de lo habitual. Este contexto es relevante porque sugiere que la serie no transcurrió de forma completamente neutral, sino que estuvo influenciada por condiciones climáticas particulares que pudieron generar fluctuaciones en los datos observados (IDEAM, 2018).

La serie original presenta una característica importante que condiciona el análisis: el mes de febrero registra una cantidad considerable de valores faltantes, lo que limita la representatividad de esos datos para efectos de modelamiento. Esta situación, común en registros de estaciones meteorológicas, responde a interrupciones en la recolección de datos y no necesariamente a ausencias reales de temperatura. Por esta razón, el análisis posterior se concentra en el período marzo-diciembre de 2018, donde la serie cuenta con datos suficientes y continuos para construir un modelo confiable.

3.2 Estadísticas descriptivas

# Tabla descriptiva de la serie (original)
tabla_desc <- data.frame(
  Variable = "Temperatura (°C)",
  Media = round(mean(data_diario$temp_media, na.rm = TRUE), 2),
  Mediana = round(median(data_diario$temp_media, na.rm = TRUE), 2),
  `Desv. Estándar` = round(sd(data_diario$temp_media, na.rm = TRUE), 2),
  Mínimo = round(min(data_diario$temp_media, na.rm = TRUE), 2),
  Máximo = round(max(data_diario$temp_media, na.rm = TRUE), 2),
  `CV (%)` = round((sd(data_diario$temp_media, na.rm = TRUE) / 
                      mean(data_diario$temp_media, na.rm = TRUE)) * 100, 2)
)

tabla_desc %>%
  kable(format = "html",
        caption = "Estadísticas descriptivas - Temperatura diaria Cali 2018") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE,
                html_font = "Arial") %>%
  row_spec(0, background = "#5586B3", color = "white", bold = TRUE,
           extra_css = "border: 1px solid black;") %>%
  row_spec(1, extra_css = "border: 1px solid black;") %>%
  column_spec(1, bold = TRUE, color = "black",
              border_right = TRUE, border_left = TRUE) %>%
  column_spec(2:7, border_right = TRUE)
Estadísticas descriptivas - Temperatura diaria Cali 2018
Variable Media Mediana Desv..Estándar Mínimo Máximo CV….
Temperatura (°C) 28.28 28.43 1.21 24.34 30.93 4.26

El análisis descriptivo de la serie de temperatura promedio diaria en Cali durante 2018 revela un comportamiento térmico estable y homogéneo. La temperatura media del período completo disponible es de 28.28°C, mientras que al restringir el análisis al período marzo-diciembre que es el que se utiliza en el modelamiento, la media asciende a 28.34°C, una diferencia mínima de apenas 0.1°C que confirma que la exclusión de enero y febrero no afecta significativamente el comportamiento promedio de la serie.

La mediana de 28.43°C es muy cercana a la media, lo que indica una distribución simétrica sin valores extremos que distorsionen el promedio. La temperatura mínima registrada fue de 24.34°C y la máxima de 30.93°C, representando un rango de variación de apenas 6.59°C a lo largo de todo el período analizado. Este rango reducido es especialmente relevante desde el punto de vista del modelamiento estadístico: una serie con variabilidad reducida tiende a ser más predecible, lo que favorece la construcción de modelos ARIMA con mayor capacidad de pronóstico.

El coeficiente de variación de 4.06% confirma esta homogeneidad — la temperatura de Cali no presenta cambios bruscos entre días consecutivos, sino que oscila dentro de un rango estrecho y relativamente predecible. Este comportamiento es coherente con el régimen climático bimodal de Cali, que alterna entre dos temporadas húmedas (marzo-mayo y octubre-diciembre) y dos temporadas más secas (junio-agosto y enero-febrero), generando fluctuaciones graduales en la temperatura a lo largo del año en lugar de cambios abruptos.

3.3 Análisis de la serie original

A continuación, se presenta la serie de temperatura promedio diaria registrada en la ciudad de Cali durante el año 2018. Esta serie fue construida a partir de datos horarios, calculando el promedio diario de temperatura para cada fecha.

p <- ggplot(data_diario, aes(x = fecha, y = temp_media)) +
  geom_line(color = "#5586B3", linewidth = 0.8, na.rm = TRUE) +
  geom_smooth(method = "loess", color = "#FC4E07",
              se = FALSE, linewidth = 0.8,
              linetype = "dashed", na.rm = TRUE) +
  scale_x_date(date_breaks = "1 month",
               date_labels = "%B",
               limits = c(as.Date("2018-01-01"),
                          as.Date("2018-12-31"))) +
  labs(title = "Temperatura promedio diaria - Cali 2018",
       x = "Mes",
       y = "Temperatura (°C)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(p)

La serie de temperatura promedio diaria en Cali durante 2018 muestra un comportamiento general estable con fluctuaciones diarias moderadas. La línea turquesa representa la temperatura real de cada día, mientras que la línea roja punteada es una curva de tendencia suavizada (LOESS) que permite identificar el comportamiento general de la serie eliminando el ruido de las variaciones diarias.

Lo primero que se observa en el gráfico es la ausencia de datos en febrero, reflejada en el quiebre de la línea turquesa al inicio de la serie. Esta interrupción corresponde a los períodos con valores faltantes en la base de datos original, y es precisamente la razón por la que el análisis posterior se concentra en el período marzo-diciembre, donde la serie es continua y representativa.

La línea de tendencia suavizada revela un patrón interesante: la temperatura muestra una tendencia ligeramente ascendente desde finales de enero hasta julio-agosto, donde alcanza su punto más alto alrededor de 28.9°C, para luego descender gradualmente hacia los últimos meses del año. Este comportamiento es coherente con el régimen climático bimodal de Cali durante la temporada seca de mitad de año (junio-agosto) la mayor exposición solar tiende a elevar las temperaturas, mientras que en las temporadas lluviosas de octubre-diciembre la nubosidad y las precipitaciones moderan el calor. Sin embargo, vale la pena señalar que según el IDEAM, el trimestre octubre-noviembre-diciembre de 2018 presentó anomalías de temperatura superiores a +1.0°C respecto al promedio histórico, lo que explica por qué la serie no desciende tan marcadamente al final del año como sería de esperar.

En cuanto a la variabilidad diaria, se observan fluctuaciones frecuentes entre 26°C y 30°C a lo largo de toda la serie, con algunos picos aislados que superan los 30°C particularmente en los meses de marzo y julio, y algunos valores mínimos que descienden hasta casi los 24°C en abril y noviembre. Estas oscilaciones son propias del comportamiento climático diario de una ciudad tropical, donde factores como la nubosidad, la lluvia y la radiación solar pueden generar diferencias notables entre días consecutivos sin que ello implique una tendencia estructural de la serie.

En conjunto, el gráfico confirma visualmente lo que las estadísticas descriptivas ya sugerían: la temperatura en Cali durante 2018 se mantuvo dentro de un rango estrecho y predecible, sin tendencias pronunciadas ni cambios abruptos estructurales, características que favorecen el uso de modelos autorregresivos como el ARIMA para su modelamiento y pronóstico.

3.4 Distribución mensual de la temperatura

Con el fin de profundizar en el comportamiento térmico de la ciudad a lo largo del año, se presenta a continuación la distribución mensual de la temperatura promedio diaria mediante diagramas de caja. Esta visualización permite identificar no solo el valor central de cada mes sino también su variabilidad interna, la presencia de valores atípicos y las diferencias entre meses, información que complementa lo observado en la serie temporal.

# Boxplot por mes
boxplot<-data_diario %>%
  mutate(mes = month(fecha, label = TRUE, abbr = FALSE)) %>%
  filter(!is.na(temp_media)) %>%
  ggplot(aes(x = mes, y = temp_media, fill = mes)) +
  geom_boxplot(show.legend = FALSE) +
  scale_fill_manual(values = colorRampPalette(c("#00AFBB", "#E7B800", "#FC4E07"))(12)) +
  labs(title = "Distribución mensual de temperatura - Cali 2018",
       x = "Mes",
       y = "Temperatura (°C)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(boxplot)

El gráfico de distribución mensual revela patrones importantes que no eran evidentes en la serie temporal. En términos de temperatura central, los meses de marzo, julio, agosto y septiembre presentan las medianas más altas, superando los 29°C, lo que los posiciona como los períodos más cálidos del año. Por el contrario, los meses de enero, abril y mayo muestran medianas más bajas, relativamente cercanas a los 28°C, coincidiendo con las temporadas lluviosas del régimen bimodal de Cali, donde la mayor nubosidad y precipitación moderan las temperaturas.

En cuanto a la variabilidad interna de cada mes, se observa que enero presenta la caja más amplia de toda la serie, lo que refleja una alta dispersión en sus datos. Vale la pena señalar que febrero es el mes que registra la mayor cantidad de valores faltantes en la base de datos original, lo que limita la representatividad de su distribución. Abril y mayo también muestran cajas relativamente amplias, sugiriendo mayor variabilidad térmica durante la transición entre la temporada seca y la primera temporada lluviosa. Se identifican además varios valores atípicos representados por puntos fuera de los bigotes, en meses como junio, julio, agosto, septiembre y diciembre. Estos valores corresponden a días con temperaturas inusualmente bajas respecto al comportamiento típico del mes, y son coherentes con episodios de lluvia intensa o mayor nubosidad que pueden reducir puntualmente la temperatura promedio diaria.

En conjunto, el boxplot confirma que aunque la temperatura de Cali se mantiene dentro de un rango estrecho a lo largo del año, existen diferencias mensuales identificables que responden al ciclo climático bimodal de la ciudad. Esta estructura temporal justifica el uso de un modelo que capture las dependencias entre observaciones consecutivas, como el modelo ARIMA, en lugar de asumir que todos los días son igualmente predecibles independientemente del mes en que ocurren.

3.5 Distribución de frecuencias de la temperatura

Para complementar el análisis de la serie y comprender mejor la estructura estadística de los datos, se presenta a continuación el histograma de la temperatura promedio diaria junto con su curva de densidad estimada. Esta visualización permite evaluar cómo se distribuyen los valores de temperatura a lo largo del año, identificar la forma de la distribución y detectar posibles asimetrías o comportamientos atípicos.

histograma<-data_diario %>%
  filter(!is.na(temp_media)) %>%
  ggplot(aes(x = temp_media)) +
  geom_histogram(aes(y = after_stat(density)), 
                 fill = "#00AFBB", color = "white", bins = 20) +
  geom_density(color = "#FC4E07", size = 1) +
  labs(title = "Distribución de la temperatura promedio diaria - Cali 2018",
       x = "Temperatura (°C)",
       y = "Densidad") +
  theme_minimal()

ggplotly(histograma)

El histograma revela que la distribución de la temperatura promedio diaria en Cali durante 2018 tiene una forma aproximadamente simétrica y acampanada, con la mayor concentración de valores ubicada entre 28°C y 29.5°C. La curva de densidad estimada representada en rojo confirma esta forma, mostrando un pico pronunciado alrededor de los 29°C que coincide con la zona de mayor frecuencia de observaciones.

Se observa sin embargo una ligera asimetría hacia la izquierda, la cola izquierda de la distribución es más larga que la derecha lo que indica que aunque la mayoría de los días registraron temperaturas entre 28°C y 30°C, hubo un número mayor de días con temperaturas inusualmente bajas (por debajo de 26°C) que de días con temperaturas inusualmente altas (por encima de 31°C). Estos valores extremos bajos corresponden principalmente a los días con mayor precipitación y nubosidad, donde la temperatura promedio diaria desciende por debajo de su rango habitual.

La concentración de la distribución en un rango estrecho, la gran mayoría de observaciones se ubica entre 27°C y 31°C, refuerza lo identificado en las estadísticas descriptivas: un coeficiente de variación de apenas 4.06% y una desviación estándar de 1.21°C. Esta distribución compacta es una característica favorable para el modelamiento, ya que sugiere que los valores de temperatura son predecibles y no presentan cambios drásticos en su comportamiento a lo largo del año.

En conjunto, tanto el histograma como la curva de densidad confirman que la temperatura en Cali durante 2018 siguió un comportamiento estadísticamente estable, con una distribución aproximadamente normal ligeramente sesgada hacia valores bajos. Esta característica, sumada a la ausencia de tendencias pronunciadas observada en la serie temporal y a las diferencias mensuales identificadas en el boxplot, proporciona una base sólida para justificar el uso de un modelo ARIMA en el análisis y pronóstico de esta serie.

3.6 Interpolación de la serie

La serie presentó 21 datos faltantes, concentrados en 19 días consecutivos en febrero y 2 días en abril, lo cual se debe posiblemente a fallas del sensor. Con el objetivo de mantener la continuidad de la serie, se aplicó la interpolación lineal con la función na.approx(), la cual toma el valor anterior y el siguiente conocido, y traza una línea recta entre ellos para estimar los valores intermedios.

serie_xts <- xts(data_diario$temp_media, order.by = as.Date(data_diario$fecha))
serie_temp <- na.approx(serie_xts)
plot(serie_temp, main = "Temperatura promedio diaria - Cali 2018 (interpolada)")

Al observar la serie interpolada se aprecia que los valores de temperatura oscilan entre 24°C y 30°C, sin evidenciar patrones de tendencia creciente o decreciente ni estacionalidad definida en el tiempo. Asimismo, no se observan cambios estructurales abruptos respecto al comportamiento identificado en la serie original.

Aunque la interpolación permite recuperar la continuidad de la serie, es importante considerar que su confiabilidad disminuye cuando los periodos sin observaciones son prolongados. Los 21 valores estimados representan aproximadamente el 5% del total de observaciones (21 de 365 días), el cual es un porcentaje bajo por lo que se espera un impacto limitado sobre las características generales de la serie, como su media, variabilidad y comportamiento global.

Cabe aclarar, que los 18 dias consecutivos que se presentan en el mes de Febrero, no es tratado en la ventana de entrenamiento,dado que un vacío tan prolongado la interpolación pierde confiabilidad .Por esta razón, como se explicó en la sección 3.1, dicho período fue excluido del análisis, y la ventana de prueba se construyó únicamente sobre el rango marzo-diciembre de 2018, donde los únicos valores interpolados corresponden a los 2 días puntuales de abril.

3.7 Conclusiones del análisis descriptivo

Los análisis realizados sobre la serie de temperatura promedio diaria en Cali durante 2018 permiten establecer conclusiones importantes que orientan el desarrollo del modelo. En primer lugar, la serie presenta un comportamiento térmico estable y homogéneo, con valores que oscilan dentro de un rango estrecho y sin tendencias estructurales pronunciadas, características que son favorables para el modelamiento mediante series de tiempo.

En segundo lugar, el análisis exploratorio evidenció que el mes de febrero presenta una cantidad considerable de valores faltantes que limita su representatividad para efectos de modelamiento. Dado que la interpolación lineal no es suficiente para reconstruir períodos extensos de datos ausentes sin introducir sesgos en el modelo, se tomó la decisión de restringir el análisis al período comprendido entre marzo y diciembre de 2018, donde la serie cuenta con datos suficientes y continuos. Esta decisión se ve respaldada por el hecho de que la exclusión de enero y febrero no afecta significativamente el comportamiento promedio de la serie, como lo confirmó la comparación entre la media del año completo (28.28°C) y la del período filtrado (28.34°C).

Dentro del período seleccionado, se identificaron algunos días aislados con valores faltantes. A diferencia del mes de febrero donde la ausencia de datos era extensa y continua, estos valores faltantes puntuales sí fueron susceptibles de ser estimados mediante interpolación lineal, método que asume una transición suave entre los valores conocidos anterior y posterior al dato ausente. Este procedimiento es adecuado para variables climáticas como la temperatura, donde los cambios entre días consecutivos son graduales y predecibles, garantizando así la continuidad de la serie sin introducir distorsiones significativas en su comportamiento.

Con base en estas evidencias, en la siguiente sección se presenta el desarrollo del modelo ARIMA aplicado a la serie filtrada, incluyendo el análisis de estacionariedad, la identificación de parámetros, el ajuste del modelo y la validación de sus supuestos.

4. Desarrollo

4.1 Clasificación de la ventana de entrenamiento y prueba

Para la definición de la ventana de entrenamiento, se estableció una región de tiempo desde el 1 de Marzo hasta el 7 de diciembre del 2018. Esto se debe a que a pesar de que se realizó la interpolación lineal, esta pierde confiabilidad en huecos de datos prolongados, como los 19 días consecutivos ausentes en febrero. Por lo tanto, se optó por una región de tiempo con pocos valores faltantes, garantizando mayor confiabilidad en el ajuste del modelo.

Entrenamiento <- window(serie_temp, start = "2018-03-01", end = "2018-12-07") # ventana de entrenamiento
Prueba<-window(serie_temp,start = "2018-12-08")
autoplot(Entrenamiento)

Al igual que en la serie completa, a simple vista la gráfica de la sección de entrenamiento se puede suponer como una serie estacionaria, pero para mayor comprobación, se realizarón dos pruebas: el test de dicky-fuller aumentado y el test Kwiatkowski-Phillips-Schmidt-Shin (KPSS)

# Paso 4: Mirar si es estacionaria

adf.test(Entrenamiento)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  Entrenamiento
## Dickey-Fuller = -3.7295, Lag order = 6, p-value = 0.02296
## alternative hypothesis: stationary
kpss.test(Entrenamiento)
## 
##  KPSS Test for Level Stationarity
## 
## data:  Entrenamiento
## KPSS Level = 0.29045, Truncation lag parameter = 5, p-value = 0.1
resultados <- data.frame(
  Prueba = c("Dickey-Fuller", "KPSS Level"),
  Estadistico = c(-3.73, 0.29),
  P_valor = c(0.02, 0.1),
  H0 = c("Serie NO es estacionaria", "Serie SI es estacionaria"),
  Decision = c("Rechaza H0", "No rechaza H0"),
  Conclusion = c("Estacionaria", "Estacionaria")
)

kable(resultados,
      col.names = c("Prueba", "Estadistico", "P-valor", "H0", "Decisión", "Conclusion"),
      caption = "Pruebas de estacionariedad",
      align = "c")%>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE,
                html_font = "Arial") %>%
  row_spec(0, background = "#5586B3", color = "white", bold = TRUE,
           extra_css = "border: 1px solid black;") %>%
  row_spec(1:nrow(resultados),, extra_css = "border: 1px solid black;") %>%
  column_spec(1, bold = TRUE, color = "black",
              border_right = TRUE, border_left = TRUE) %>%
  column_spec(2:ncol(resultados), border_right = TRUE)
Pruebas de estacionariedad
Prueba Estadistico P-valor H0 Decisión Conclusion
Dickey-Fuller -3.73 0.02 Serie NO es estacionaria Rechaza H0 Estacionaria
KPSS Level 0.29 0.10 Serie SI es estacionaria No rechaza H0 Estacionaria

El test de Dickey-Fuller Aumentado plantea dos hipótesis: H0 sostiene que la serie tiene raíz unitaria, por lo tanto no es estacionaria, y H1 plantea que la serie no tiene raíz unitaria, es decir, que sí es estacionaria. Si el p-valor es menor a 0.05 se rechaza la hipótesis nula y se concluye que la serie es estacionaria.

Por otro lado, el test KPSS es una prueba complementaria a la anterior, en donde H0 sostiene que la serie sí es estacionaria y H1 que la serie no es estacionaria. En este caso, para rechazar la hipótesis nula el p-valor también debe ser menor a 0.05.

Como se muestra en la tabla de pruebas de estacionariedad, la serie de entrenamiento obtuvo un p-valor de 0.023 en el test de Dickey-Fuller Aumentado, el cual al ser menor a 0.05 indica que hay suficiente evidencia para rechazar la hipótesis nula. Adicionalmente, el p-valor correspondiente al test KPSS fue de 0.1, mayor a 0.05, por lo que no existe suficiente evidencia para rechazar la hipótesis nula. Estos resultados nos permiten concluir que la serie de entrenamiento es estacionaria.

4.2 Modelo ARIMA

El modelo ARIMA (Autoregressive Integrated Moving Average) es un modelo estadístico utilizado para el análisis y pronóstico de series de tiempo. Este se compone de tres parámetros: p que representa el orden autorregresivo, es decir, el número de rezagos de la serie que se incluyen como predictores, d que indica el número de diferenciaciones necesarias para lograr la estacionariedad y q que corresponde al orden de la media móvil, es decir, el número de errores pasados que se incluyen en el modelo. Estos, tienen un orden de (p,d,q). Dado que la serie de entrenamiento resultó ser estacionaria y no se realizó ninguna diferenciación, el parámetro d seria igual a 0.

Para identificar el parámetro p y q de la serie, se realizaron los gráficos de autocorrelación (ACF) y autocorrelación parcial (PACF).La ACF mide la correlación entre la serie y sus rezagos, mientras que la PACF mide esa misma correlación eliminando el efecto de los rezagos intermedios.

grid.arrange(ggAcf(Entrenamiento),
             ggPacf(Entrenamiento),
             nrow=1
)

Al observar los gráficos de ACF Y PACF, identificamos que los datos siguen un modelo de ARIMA (p,d,0), ya que el gráfico ACF tiene un comportamiento sinusoidal. El valor de p corresponde al número de rezagos identificados en el gráfico PACF, es decir, la línea que sobresalen de la línea punteada, la cual representa el intervalo de confianza.

El gráfico muestra 2 rezagos significativos,correspondientes a los rezagos 1 y 2, los cuales superan el intervalo de confianza. Adicionalmente, se observa un rezago significativo en la posición 21, sin embargo, este se considera un valor atípico aislado y no representa una estructura autorregresiva real, ya que no hay rezagos significativos continuos antes que este. Por lo tanto, se considera propone dos modelos, ARIMA (1,0,0) y ARIMA (2,0,0).

Así mismo, se hace uso de la función auto.arima(), la cual propone un modelo ARIMA de forma automatizada, sin embargo, se va a comparar este con otros modelos para encontrar el mejor. El mejor modelo ARIMA sería el que tiene el menor valor de AIC, AICc, BIC.

Estos tres criterios, funcionan como un sistema de puntuación, donde el modelo que tenga menor valor en los 3 será el mejor, ya que estos premian la simplicidad ante la complejidad, debido a que si se usan parámetros necesarios, el modelo puede estar memorizando el ruido en lugar de aprender el patrón real.

El criterio de información de Akaike (AIC) es un estimador de la calidad relativa del modelo que tiene en cuenta su complejidad y penaliza los modelos complejos en favor de los sencillos. Por otro lado, el criterio de información de Akaike corregido (AICc), es parecido a AIC, solo que aplica una penalización más fuerte que el AIC, especialmente con muestras pequeñas. En último lugar, el Criterio de Información Bayesiano (BIC), el cual se utiliza para evaluar la bondad de ajuste de un modelo. Todos estos tres criterios tienen el objetivo de evitar el sobreajuste (IBM, s.f.).

modelo_auto <- auto.arima(Entrenamiento)
modelo1 <- Arima(Entrenamiento, order = c(1,0,0))
modelo2 <- Arima(Entrenamiento, order = c(2,0,0))

criterios <- data.frame(
  Modelo = c("Modelo 1", "Modelo 2", "Modelo 3"),
  arima= c("Auto ARIMA (1,0,0)", "ARIMA(1,0,0)", "ARIMA(2,0,0)"),
  AIC = c(modelo_auto$aic, modelo1$aic, modelo2$aic),
  AICc = c(modelo_auto$aicc, modelo1$aicc, modelo2$aicc),
  BIC = c(modelo_auto$bic, modelo1$bic, modelo2$bic),
  sigma = c(modelo_auto$sigma2, modelo1$sigma2, modelo2$sigma2),
  log_likelihood = c(modelo_auto$loglik, modelo1$loglik, modelo2$loglik)
)

kable(criterios,
      col.names = c("Modelo","ARIMA", "AIC", "AICc", "BIC", "sigma2", "Log-likelihood"),
      caption = "Comparacion de modelos ARIMA",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE) %>%
  row_spec(0, background = "#5586B3", color = "white") %>%
  row_spec(2, background = "#D5E8D4")
Comparacion de modelos ARIMA
Modelo ARIMA AIC AICc BIC sigma2 Log-likelihood
Modelo 1 Auto ARIMA (1,0,0) 738.8459 738.9322 749.7716 0.7913783 -366.4229
Modelo 2 ARIMA(1,0,0) 738.8459 738.9322 749.7716 0.7913783 -366.4229
Modelo 3 ARIMA(2,0,0) 740.1587 740.3031 754.7263 0.7922695 -366.0793

Como se evidencia en la tabla, el modelo propuesto por el auto.arima() coincide con nuestro modelo 2 propuesto, el cual se basa en ARIMA (1,0,0). Al comparar los valores de los diferentes se observa, que el modelo 2 tiene un valor de AIC de 738.85, siendo este un valor de aproximadamente 2 puntos menor al obtenido por el modelo 3 de 740.16. Lo mismo ocurre con el criterio de AICc, donde el modelo 2 obtuvo un 738.93 frente al valor del modelo 3 de 740.3 , y también en BIC, donde el modelo 3 tiene un valor de 754.73 alrededor de 5 puntos por encima del valor del modelo 2 de 749.77.

coeficientes <- data.frame(
  Modelo = c("ARIMA(1,0,0)", "ARIMA(2,0,0)"),
  ar1 = c(0.6521, 0.6196),
  ar2 = c("-", "0.0495"),
  media = c(28.3414, 28.3403),
  se_ar1 = c(0.0449, 0.0595),
  se_ar2 = c("-", "0.0597"),
  se_media = c(0.1507, 0.1581)
)

kable(coeficientes,
      col.names = c("Modelo", "ar1", "ar2", "Media", "SE ar1", "SE ar2", "SE Media"),
      caption = "Coeficientes de los modelos ARIMA",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE) %>%
  row_spec(0, background = "#5586B3", color = "white") %>%
  row_spec(1, background = "#D5E8D4")
Coeficientes de los modelos ARIMA
Modelo ar1 ar2 Media SE ar1 SE ar2 SE Media
ARIMA(1,0,0) 0.6521
28.3414 0.0449
0.1507
ARIMA(2,0,0) 0.6196 0.0495 28.3403 0.0595 0.0597 0.1581

La tabla anterior nos presenta los coeficientes de los dos modelos, se observa que el modelo ARIMA(1,0,0) presenta un coeficiente ar1 de 0.652, lo que indica que la temperatura de un día está relacionada con la temperatura del día anterior. Adicionalmente, se presenta una media estimada de la ventana de entrenamient de 28.34°, la cual es consistente con los valores observados durante este periodo.

Por otro lado, el modelo ARIMA(2,0,0) incorpora un segundo coeficiente ar2 de 0.049, el cual es muy cercano a cero, lo que sugiere que la temperatura de hace dos días no aporta información relevante para predecir la temperatura actual, una vez que ya se tiene en cuenta la temperatura del día anterior.

Frente a estos resultados, se concluyo que el mejor modelo es ARIMA (1,0,0), debido a que obtuvo los valores menores en los 3 criterios anterior y un alto valor en el coeficiente ar1. Este modelo sobresale por su simplicidad y su capacidad para reconocer el patrón de la serie con un único rezago autorregresivo.Se plantea la ecuación del modelo a partir de los coeficientes.

\[y_t = 9.85 + 0.652y_{t-1} + \varepsilon_t\]

donde \(C = 28.34 \times (1 - 0.652) = 9.85\) y \(\varepsilon_t\) es un ruido blanco con una desviación estándar de \(\sqrt{0.7914} = 0.889\).

Con la selección del modelo ARIMA(1,0,0), respaldada tanto por el análisis gráfico de ACF y PACF como por los criterios de información AIC, AICc y BIC, queda establecido que la serie de temperatura de Cali sí puede modelarse mediante un proceso ARIMA.

4.3 Pronóstico

Se procedió a realizar el pronóstico de la temperatura a partir del 8 de diciembre del 2018 en la ciudad de Cali.

dias <-length(Prueba) #dias a predecir

#Pronostico

pronostico<- modelo1%>% 
  forecast(h=dias,level = 0.95) 

tabla_comparativa <- data.frame(
  fecha      = index(Prueba),
  real       = as.numeric(Prueba),
  pronostico = as.numeric(pronostico$mean),
  lo_95      = as.numeric(pronostico$lower),
  hi_95      = as.numeric(pronostico$upper)
)

kable(tabla_comparativa,
      col.names = c("Fecha", "Real", "Pronóstico", "Li 95%", "Ls 95%"),
      caption = "Comparacion entre valores reales y pronosticados",
      align = "c",
      digits = 2)%>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE) %>%
  row_spec(0, background = "#5586B3", color = "white")
Comparacion entre valores reales y pronosticados
Fecha Real Pronóstico Li 95% Ls 95%
2018-12-08 28.39 28.05 26.30 29.79
2018-12-09 28.94 28.15 26.07 30.23
2018-12-10 28.77 28.22 26.01 30.43
2018-12-11 28.70 28.26 26.00 30.52
2018-12-12 29.39 28.29 26.00 30.57
2018-12-13 27.88 28.31 26.01 30.60
2018-12-14 27.01 28.32 26.02 30.62
2018-12-15 28.36 28.33 26.03 30.63
2018-12-16 28.78 28.33 26.03 30.63
2018-12-17 28.93 28.34 26.04 30.63
2018-12-18 29.08 28.34 26.04 30.64
2018-12-19 29.11 28.34 26.04 30.64
2018-12-20 29.07 28.34 26.04 30.64
2018-12-21 28.49 28.34 26.04 30.64
2018-12-22 27.79 28.34 26.04 30.64
2018-12-23 28.49 28.34 26.04 30.64
2018-12-24 28.95 28.34 26.04 30.64
2018-12-25 29.76 28.34 26.04 30.64
2018-12-26 29.24 28.34 26.04 30.64
2018-12-27 29.09 28.34 26.04 30.64
2018-12-28 29.78 28.34 26.04 30.64
2018-12-29 29.55 28.34 26.04 30.64
2018-12-30 29.28 28.34 26.04 30.64
2018-12-31 29.69 28.34 26.04 30.64

Se evidencia en la tabla, que a partir del día 18 de diciembre de 2018, la temperatura pronósticada se empieza a estabilizar alrededor de 28.34°C, valor que corresponde a la media estimada de la ventana de entrenamiento. Esto es un comportamiento esperado del modelo ARIMA (1,0,0), ya que a medida que el tiempo del pronóstico se alarga, los pronósticos convergen hacia la media de la serie, convirtiéndose en una limitación del modelo.

El intervalo de confianza del 95% es bastante amplio, oscilando entre aproximadamente 26°C y 30.6°C. Se puede observar que todos los valores de la temperatura reales están dentro de este intervalo, lo que indica que aunque el pronóstico puntual realizado por el modelo no es exacto, este se ubica correctamente en el intervalo.

De forma general, el modelo presenta buenos resultados a corto plazo, especialmente en los primeros 10 días, donde los valores pronosticados tienen ligeras diferencias con los verdaderos. Sin embargo, a mediano plazo presenta limitaciones, ya que los valores pronósticados empiezan a converger en la media de la temperatura de la ventana de entrenamiento. Esto se debe a que el modelo ARIMA (1,0,0) indica que el valor de la temperatura de hoy depende del valor de ayer, por lo tanto, a partir del día 10, el modelo ya no tiene valores reales de referencia, sólo sus propios pronósticos anteriores para trabajar.

modelo1 %>%
  forecast(h = dias, level = 0.95) %>%
  autoplot(include = 80) 

En el gráfico se presenta el pronóstico generado por el modelo desde el 8 de diciembre hasta el 31 de diciembre, un total de 24 observaciones. La línea de color negro muestra el comportamiento de los últimos 80 días de la serie de entrenamiento previos al pronóstico, lo que permite identificar el comportamiento histórico de la temperatura. Por otro lado, la línea azul oscura representa los valores pronosticados y la región azul clara corresponde al intervalo de confianza del 95%, dentro del cual se encuentra el valor real de la temperatura. Como se evidencia, los valores pronosticados se estabilizan rápidamente alrededor de la media de 28.34°C, perdiendo la variabilidad característica de la serie histórica.

accuracy(pronostico, Prueba) 
##                        ME      RMSE       MAE        MPE     MAPE      MASE
## Training set -0.002367437 0.8864342 0.6846227 -0.1094531 2.448347 0.9173829
## Test set      0.548518646 0.8393777 0.7391228  1.8519017 2.548739 0.9904122
##                     ACF1
## Training set -0.03143513
## Test set              NA
tabla_accuracy <-data.frame(
  ventana=c("Entrenamiento", "Prueba"),
  ME=c(-0.0024,0.5485),
  RMSE=c(0.8864, 0.8394),
  MAE=c(0.6846, 0.7391),
  MPE=c(-0.1095,  1.8519),
  MAPE=c(2.4483, 2.5487),
  MASE=c(0.9174, 0.9904),
  ACF1=c(-0.0314, "NA")
)

  kable(tabla_accuracy,
      col.names = c("Ventana", "ME", "RMSE", "MAE", "MPE", "MAPE", "MASE", "ACF1"),
      caption = "Resultados del accuracy",
      align = "c",
      digits = 4) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE) %>%
  row_spec(0, background = "#5586B3", color = "white")
Resultados del accuracy
Ventana ME RMSE MAE MPE MAPE MASE ACF1
Entrenamiento -0.0024 0.8864 0.6846 -0.1095 2.4483 0.9174 -0.0314
Prueba 0.5485 0.8394 0.7391 1.8519 2.5487 0.9904 NA

La tabla de métricas de precisión presenta los resultados tanto para la ventana de entrenamiento como para la ventana de prueba, que fue la ventana pronósticada. En términos del Error medio (ME), el entrenamiento presenta un valor de -0.0024, muy cercano a cero, lo que indica que el modelo no tiende a sobreestimar ni subestimar significativamente los datos.Sin embargo, la ventana de prueba tuvo un valor de 0.5485, lo que sugiere que el modelo tiende subestimar ligeramente la temperatura real.

La Raíz del Error Cuadrático Medio (RMSE), es el error promedio pero penalizando más los errores grandes, es decir, mientras más bajo mejor. El valor del entrenamiento y de prueba son 0.8864 y 0.8394 respectivamente. Estos resultados nos indican que el modelo generaliza bien y no presenta sobreajuste, ya que en promedio,el modelo se equivoca 0.8864° y 0.8394° siendo un valor bajo.

El error absoluto medio (MAE) fue de 0.6846 en entrenamiento y 0.7391 en prueba, esto indica que en promedio el modelo se equivoca aproximadamente 0.70°C, lo cual es un error bastante bajo considerando que la serie oscila entre 26°C y 30°C.

El Error Porcentual Absoluto Medio (MAPE) de 2.4483% en entrenamiento y 2.5487% en prueba indica que el error porcentual promedio es menor al 3%, lo que se considera un pronóstico de buena precisión. Finalmente, el MASE cercano a 1 en ambas ventanas confirma que el modelo ARIMA(1,0,0) tiene un desempeño comparable a un modelo de referencia naive, siendo ligeramente mejor en entrenamiento y prácticamente equivalente en prueba.

Todos estos resultados permiten responder qué tan preciso resulta ser el modelo ARIMA(1,0,0) al pronosticar la temperatura promedio diaria de Cali desde el 8 de diciembre del 2018 hasta el 31 de diciembre del 2018. El valor de MAPE de 2.55% es uno de los principales beneficios del modelo, ya que indica un nivel de precisión alto. Sin embargo, también se evidencia una limitación importante, ya que a partir del décimo día el pronóstico converge hacia la media histórica del rango de entrenamiento, perdiendo la capacidad de capturar la variabilidad real de la temperatura a medida que el tiempo de pronóstico se alarga.

4.4 Pruebas en Residuales

checkresiduals(modelo1)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,0) with non-zero mean
## Q* = 8.0779, df = 9, p-value = 0.5263
## 
## Model df: 1.   Total lags used: 10

Se generaron 3 gráficos para observar el comportamiento de los residuos del modelo. El primer gráfico ubicado en la parte superior muestra el patrón que tuvieron los residuos durante el transcurso del tiempo, se evidencia que no tienen ningún comportamiento particular, como tendencia ni estacionalidad. Los residuos oscilan entre -2° y 2° , lo que sugiere que el modelo capturó correctamente la estructura de la serie.

El segundo gráfico de abajo a la izquierda corresponde al ACF de los residuos, es decir, mide la correlación entre los residuos y sus rezagos.Se evidencia que la mayoría de los rezagos se ubican dentro del intervalo de confianza exceptuando un rezago en la posición 20. Este comportamiento no es preocupante, ya que no se evidencian rezagos significativos consecutivos,por lo tanto, este resultado es normal en muestras grandes. A partir de estos, se concluye que los residuos se comportan como ruido blanco.

El último gráfico, es un histograma de la distribución de los residuos, se busca determinar si los residuos siguen una distribución normal centrada de 0 y simétrica. La línea roja indica el comportamiento esperado de los residuos y las barras grises el verdadero comportamiento. Como se evidencia en el gráfico, los residuos presentan una leve asimetría hacia el lado derecho del gráfico, donde se ven más agrupación de los estos en ese lado, por lo tanto, los residuos no siguen de forma estricta al comportamiento teórico esperado.

Para confirmar formalmente si los residuos siguen una distribución normal, se aplica la prueba de Shapiro-Wilk, la cual plantea las siguientes hipótesis: H0 sostiene que los residuos siguen una distribución normal y H1 que los residuos no siguen una distribución normal. Si el p-valor es mayor a 0.05 no se rechaza H0 y se concluye que los residuos son normales, de lo contrario se rechaza H0 y se concluye que los residuos no siguen una distribución normal.

shapiro.test(residuals(modelo1))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo1)
## W = 0.9642, p-value = 1.858e-06
normalidad <-data.frame(
  datos=c("w", "p-value"),
  ME=c(0.9642,1.858e-06)
)

  kable(normalidad,
      col.names = c("Medidas", "Valor"),
      caption = "Testd de Shapiro",
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE) %>%
  row_spec(0, background = "#5586B3", color = "white")
Testd de Shapiro
Medidas Valor
w 0.9642000
p-value 0.0000019

Los resultados del test de shapiro sobre los residuos del modelo, confirman que los residuos no siguen una distribución normal, debido a que el p-value obtenido fue de aproximadamente 1.858e-06, un valor menor a 0.05, por lo tanto, existe suficiente evidencia para rechazar H0 y concluir que los residuos no siguen una distribución normal.

Adicionalmente, se realizó una prueba de Ljung-Box, la cual plantea las siguientes hipótesis: H0 sostiene que los residuos son independientes entre sí, es decir, no presentan autocorrelación, y H1 que los residuos presentan autocorrelación. Si el p-valor es mayor a 0.05 no se rechaza H0 y se concluye que los residuos son independientes.

Ljung_box <-data.frame(
  ventana=c("Q", "df", "p-value", "Model df", "Total lags used"),
  ME=c(8.08,9,0.5263,1,10)
)

  kable(Ljung_box,
      col.names = c("Estadistico", "Valor"),
      caption = "Ljung-box test",
      align = "c",
      digits = 2) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE) %>%
  row_spec(0, background = "#5586B3", color = "white")
Ljung-box test
Estadistico Valor
Q 8.08
df 9.00
p-value 0.53
Model df 1.00
Total lags used 10.00

Los resultados de la prueba evidencia, que los residuos son independientes entre si y se comportan como ruido blanco, debido a se obtuvo un valor de Q de 8.08 con 9 grados de libertad y un p-valor de 0.5263,este ultimo valor siendo superior a 0.05. Por lo tanto, no existe suficiente evidencia para rechazar H0.

Es importante señalar como limitación del modelo que, aunque la prueba de Ljung-Box confirmó que los residuos se comportan como ruido blanco, la prueba de Shapiro-Wilk indicó que estos no siguen una distribución normal. Esto implica que los intervalos de confianza del pronóstico, los cuales asumen normalidad en los errores, deben interpretarse con cautela. Sin embargo, esta limitación no invalida el modelo, ya que el pronóstico puntual y las métricas de precisión siguen siendo válidas y confiables.Con esto se puede responder de forma parcial a la pregunta, sobre si el modelo para pronosticar la temperatura del mes de diciembre del 2018 cuenta con limitaciones.

5. Conclusión

Los resultados indican que la temperatura promedio diaria de Cali durante 2018 puede describirse de manera adecuada mediante un modelo ARIMA(1,0,0). Esto se debe a que la serie presentó un comportamiento relativamente estable a lo largo del año, sin tendencias marcadas ni cambios bruscos en su estructura, lo que permitió que un modelo sencillo como este capturara gran parte de la información contenida en los datos. En otras palabras, la temperatura de un día estuvo fuertemente relacionada con la del día anterior, una característica esperable en una ciudad como Cali, donde las condiciones climáticas suelen cambiar de manera gradual y no de forma extrema de un día para otro; el coeficiente autorregresivo obtenido nos confirma esta relación, ya que indica que una parte importante de la temperatura observada en una jornada se transmite a la siguiente. Por ejemplo, cuando se presenta un día más caluroso o más fresco de lo habitual, es probable que esa condición influya en la temperatura del día siguiente. Esta persistencia térmica explica por qué fue suficiente utilizar un rezago para representar la dinámica de la serie.

Las diferencias entre las temperaturas observadas y las pronosticadas fueron pequeñas, lo que nos confirma que el modelo representa adecuadamente el comportamiento de la serie: el Error Porcentual Absoluto Medio (MAPE) fue de 2.45% en el conjunto de entrenamiento y de 2.55% en el conjunto de prueba, ambos por debajo del 3%, lo que demuestra una capacidad predictiva adecuada para rangos de tiempo de corto plazo. El hecho de que los errores en los datos de entrenamiento y de prueba fueran similares indica que el modelo no se limitó a memorizar la información histórica, sino que logró mantener un buen desempeño al enfrentarse a observaciones nuevas.

También se identificó que a medida que el tiempo pronósticado aumenta, los pronósticos tienden a acercarse rápidamente a la temperatura promedio de la serie de entrenamiento de 28.34 °C, perdiendo parte de las fluctuaciones que sí ocurren en la realidad. Esto significa que el modelo es útil para describir el comportamiento general de la temperatura, pero tiene dificultades para anticipar eventos particulares asociados a fenómenos meteorológicos específicos, como periodos de lluvia intensa, cambios en la nubosidad o anomalías climáticas. De igual forma, aunque los residuos se comportaron como ruido blancos,no se distribuyen de forma normal, por lo que los intervalos de confianza del pronóstico deben interpretarse con cierta precaución. Además, una limitación de los datos, fue el extenso rango de tiempo de datos faltantes, 21 en total y 19 ubicados en febrero de 2018, lo que llevo a que se excluyara este mes y enero de la ventana de entrenamiento.

Aunque el pronóstico fue preciso, concluimos que el éxito de un modelo de series de tiempo no depende únicamente de obtener errores pequeños, sino de comprender qué características de los datos permiten construir el modelo y cuáles son sus límites de aplicación. En este caso, el ARIMA(1,0,0) resultó adecuado para representar el comportamiento térmico de Cali y generar pronósticos confiables a corto plazo. Sin embargo, para explicar con mayor profundidad las variaciones observadas en la temperatura sería necesario incorporar variables externas relacionadas con las condiciones meteorológicas, lo que permitiría una representación más completa del clima.

6. Bibliografía

CAR (Corporación Autónoma Regional). (2018). Boletín Estadístico de Hidrología y Climatología 2018. https://www.car.gov.co/uploads/boletines/BOLETIN_CAR_2018/web/Boletin/index.html

Hyndman, R. J., & Athanasopoulos, G. (2018). Forecasting: Principles and practice (2nd ed.). OTexts. https://otexts.com/fpp2/

IBM. (s.f.). Criterios de información. IBM Documentation. https://www.ibm.com/docs/es/spss-statistics/32.0.0?topic=effect-information-criteria

IDEAM. (2018). Boletín Clima y Salud, Edición No. 10. Instituto Nacional de Salud. https://www.ins.gov.co/BibliotecaDigital/boletin-clima-y-salud-2018-octubre.pdf

Instituto de Hidrología, Meteorología y Estudios Ambientales - IDEAM. (2023). Resumen Estudio Nacional del Agua 2022. https://www.ideam.gov.co/sites/default/files/prensa/boletines/2024-08-23/resumen_ejecutivo_estudio_nacional_del_agua_2022_0.pdf