Se cargó la base de datos de Café Borinquen. A continuación se le
hacen unos ajustes, como cambiar el orden de las fechas.
datos <- read.csv("Cafe_Borinquen.csv", header= T)
library(tidyverse)
datos <- datos %>%
mutate(fecha = as.Date(fecha,format="%m/%d/%Y"))
str(datos)
## 'data.frame': 132 obs. of 2 variables:
## $ fecha : Date, format: "2015-01-01" "2015-02-01" ...
## $ ventas: num 236 250 253 242 246 ...
La serie contiene 132 observaciones mensuales, desde el 2015 hasta
el 2025. Con la información disponible en la base de datos podemos decir
que la venta mínima mensual es de 236.3 K, mientras que la venta máxima
mensual es de 420.0 K. En promedio, Café Borinquen hace ventas mensuales
de 325.7 K; con la base de datos podemos observar que las ventas han
tenido un aumento, un buen indicador de que se puede dar la apertura de
nuevas sucursales. Tenemos una frecuencia de 12, lo que impicla que las
ventas se registran mensualmente. Cabe destacar que un café suele tener
temporadas pico que concuerdan con fechas festivas, como verano (Junio y
Julio). En resumen, tenemos una empresa que ha podido aumentar sus
ventas significativamente y tiene un aumento estable.
1. Exploración visual de la base de datos:
Comportamiento:
library(plotly)
library(dplyr)
# Gráfica interactiva con plotly
fig <- plot_ly(datos, x = ~fecha, y = ~ventas, type = 'scatter', mode = 'lines',
line = list(color = 'steelblue', width = 2)) %>%
layout(xaxis = list(title = "Año"),yaxis = list(title = "Ventas (%)"),
hovermode = "x unified")
fig
Interpretación:
Esta gráfica interactiva muestra cómo se comportaron las ventas de
Café Borinquen desde Enero del 2015 hasta Diciembre del 2025. Podemos
identificar su tendencia, estacionalidad e irregularidades. Claramente
tiene una tendencia positiva, ya que sus ventas han aumentado de manera
significativa a lo largo del tiempo. Tiene tambien una estacionalidad, o
comportamiento, que se repite todos los años de una manera bastante
pronunciada. Las ventas tienden a ser más altas en los meses de Junio y
Julio, mientras que las ventas tienden a caer siempre en los meses de
Septiembre a Diciembre, especialmente en Noviembre y Diciembre.
Descomposición:
descomp <- decompose(datos.ts)
plot(descomp)

Interpretación:
- Tendencia: En cuanto a esta sección de la gráfica, podemos apreciar
una línea casi recta hacia arriba; es una tendencia claramente
positiva.
- Estacionalidad: Los datos presentan estacionalidad, ya que hay un
patrón que se repite. Siempre hay ventas altas en los meses de verano
(Junio y Julio), mientras que en los meses de invierno (Noviembre y
Diciembre), las ventas siempre están bajas en comparación a los meses de
verano.
- Componente aleatorio: Hay pequeñas variaciones sin patrón definido,
y se puede observar una variación aproximadamente en el 2025 muy
diferente a los demás años.
Estacionalidad:
monthplot(datos.ts,
ylab = "Ventas (%)",
xlab = "Mes")

Interpretación:
Cuando observamos esta tabla, los meses de Junio y Julio son los que
tienen los valores más altos; Mayo y Agosto se acercan a Junio y Julio,
y todos los demás meses están entre los mismos valores. Esto nos deja
saber que los meses con ventas mayores son los de Junio y Julio, seguido
de Mayo y Agosto. Otro dato que es interesante, es que los meses con
ventas menores no se alejan tanto de los meses con ventas mayores. Esto
se puede interpretar como algo positivo, ya que es un café con ventas
mensuales relativamente estables. Como fue discutido en clase, es típico
de series de tiempo relacionadas al consumo.
Autocorrelaciones
Autocorrelación ACF:
# ACF
acf(datos.ts, lag.max = 36, main = "")

Interpretación:
La autocorrelación es muy alta en los primeros rezagos y disminuye
de forma gradual conforme aumenta la distancia temporal. Hay una fuerte
persistencia temporal en esta serie de tiempo, y el valor de las ventas
de un mes está muy relacionado al del siguiente mes. La ACF mide cómo
los valores presentes están relacionados a los pasados. El hecho de que
exista una disminución gradual y no rápida, es común en series no
estacionarias con tendencia. Por último, se observan las barras por
encima del intervalo de confianza, lo cual puede indicar a que no se
comportan como ruido blanco.
Autocorrelación PACF:
# PACF
pacf(datos.ts, lag.max = 36, main = "")

Interpretación:
Esta gráfica nos muestra la correlación de la serie luego de
eliminar la influencia de rezagos intermedios. Tenemos el primer rezago
muy sobresaliente,el cual nos deja saber que hay una fuerte relación.
Los demás rezagos son pequeños y dentro de las bandas; la mayoría está
dentro del intervalo de confianza. Estas dos gráficas nos han sugerido
que podemos estar trabajando con una serie de tiempo no estacionaria y
que contiene una tendencia.
2. Selección y ajuste del modelo:
Interpretación:
En esta gráfica la tendencia fue eliminada, por eso en el eje de y
tenemos el 0 en el centro y no hay inclinación ascendente ni
descendente. Seguimos observando patrones de estacionalidad, y la
gráfica muestra picos y caídas que se repiten cada año. Tenemos una
serie más ruidosa con estructura temporal, lo cual nos puede guiar a la
posibilidad de que el modelo ARIMA es el indicado para esta serie de
tiempo.
Se evaluan los modelos AR, MA, ARMA, y ARIMA con el AIC.
datos.ar <- arima(datos.ts, order = c(1, 0, 0))
datos.ma <- arima(datos.ts, order = c(0, 0, 1))
datos.arma <- arima(datos.ts, order = c(1, 0, 1))
datos.arima <- arima(datos.ts, order = c(1, 1, 1))
AIC(datos.ma,datos.ar,datos.arma, datos.arima)
## df AIC
## datos.ma 3 1262.173
## datos.ar 3 1023.526
## datos.arma 4 1016.218
## datos.arima 3 1004.351
Interpretación:
Para seleccionar uno de los modelos evaluados, utilizamos el AIC
para comparar. Buscamos el que tenga el AIC más bajo, y en este caso es
el modelo ARIMA. El Ma es el peor de todos, ya que tiene el AIC más
alto. Le sigue el AR, ya que tiene un AIC menor que el MA. Aunque el
ARMA y el ARIMA son los mejores, se escoge el ARIMA con el AIC más
bajo.
Prueba de estacionariedad:
library(tseries)
adf.test(datos.ts)
##
## Augmented Dickey-Fuller Test
##
## data: datos.ts
## Dickey-Fuller = -8.3348, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
Interpretación:
El Augmented Dickey-Fuller Test evalua si la serie de tiempo es
estacionaria o no. Tenemos la hipótesis nula (H0) = la serie no es
estacionaria, y la H1 = la serie es estacionaria. En este caso tenemos
un resultado negativo; esto nos indica que se debe rechazar la hipótesis
nula y concluimos que la serie es estacionaria.
Mejor modelo ARIMA:
library(forecast)
mod_arima <- auto.arima(datos.ts,stepwise = T, approximation = T)
mod_arima
## Series: datos.ts
## ARIMA(2,0,1)(1,1,1)[12] with drift
##
## Coefficients:
## ar1 ar2 ma1 sar1 sma1 drift
## 0.4390 0.0897 0.2443 -0.2147 -0.4845 1.2623
## s.e. 0.9802 0.6383 0.9668 0.3414 0.3241 0.0512
##
## sigma^2 = 28.71: log likelihood = -371.96
## AIC=757.93 AICc=758.93 BIC=777.44
Interpretación:
Entre los cuatro modelos, el mejor es el ARIMA, ya que tiene el
valor más pequeño. Luego de considerar el mejor modelo, podemos decir
que existe una dependencia moderada con valores anteriores y una
tendencia claramente positiva.
3. Pronósticos:
prediccion <- forecast(mod_arima, h=12)
autoplot(prediccion)

Interpretación:
La gráfica muestra un pronóstico para el año siguiente que incluye
intervalos de confianza. Podemos decir que no se pronostica una caida o
subida muy drástica, las ventas van a seguir la tendencia y
estacionalidad como de costumbre. Van a tener los meses en los que hacen
más ventas en verano y los meses en los que las ventas no están igual de
altas. Sin embargo, se puede notar que vana a aumentar de manera general
y la tendencia ascendente va a continuar para la empresa. Tenemos los
intervalos de confianza, las sombras azules. Al no tener cambios muy
significativos, podemos asumir que el modelo captó bien la dinámica del
pasado y no se esperan comportamientos fuera de lo normal para las
ventas mensuales y no es una empresa volátil o riesgosa para invertir en
ella.