Taller técnicas para series estacionarias

Los datos del archivo adjunto corresponden a datos reales de ventas de dos de productos de un supermercado. Realice una análisis y depuración de estos datos.

Aplicando los métodos desarrollados en esta sesión calcule el forecast de los siguientes 8 periodos para cada uno de los productos Seleccione la técnica que recomendaría en cada caso y haga un breve análisis de los resultados.

Si prefieren también pueden usar datos de productos o servicios de su empresa

Publique sus resultados en RPubs con el procedimiento que desarrolló, sus resultados y análisis. Comparta el vínculo de la publicación en el campo disponible.

Cojuntos de datos a estudiar

Carga de las bilbliotecas de trabajo

## Warning: package 'tidyverse' was built under R version 3.6.2
## Warning: package 'forecast' was built under R version 3.6.2
## Warning: package 'readxl' was built under R version 3.6.2
## Warning: package 'imputeTS' was built under R version 3.6.3

Lectura de archivos de Excel y conversión a objetos de series de tiempo

arrozSemanal <- read_excel("ARROZ_SEMANAL.xlsx")
productoNuevoDiario <- read_excel("PRODUCTO_NUEVO_DIARIO.xlsx")
arrozSemanal_ts<- ts(arrozSemanal, frequency = 7, start = c(1,3))
productoNuevoDiario_ts <- ts(productoNuevoDiario, frequency = 1)

Gráfica de las Series de tiempo

A continuacion se presenta las gráficas de las series temporales para comenzar a entender la estructura de las mismas

autoplot(arrozSemanal_ts)+
  ylab("Demanda de arroz semanal")+
  ggtitle("Serie temporal de la demanda de arroz semanal")

autoplot(productoNuevoDiario_ts)+
  ylab("Demanda del nuevo producto diario")+
  ggtitle("Serie temporal de la demanda del nuevo producto diario")

La serie de arroz semanal parece estacionaria, hay un par de observaciones que parecen ser atípicas, esto lo veremos en próximas secciones donde identificaremos si estos valores son atípicos o no.

Por su parte la serie del producto nuevo diario, presenta una tendencia, lueogo no parece estacionaria, para aplicar los métodos vistos en la sesion semanal, se deberá realizar una transformación sobre los datos para convertirla en una serie estacionaria.

Descomposición de las series temporales en sus componentes.

A continuación pasaremos a ver para cada una de las series como se descompone en sus componentes

#Descomposición de la serie de arroz semanal
autoplot(mstl(arrozSemanal_ts))

#Descomposición de la serie de nuevo producto diario
autoplot(mstl(productoNuevoDiario_ts))

Al observar la descomposición de ambas series se observ lo siguiente:

#Creación de la serie de diferencias para producto nuevo diario
productoNuevoDiario_ts_dif <- diff(productoNuevoDiario_ts)

autoplot(productoNuevoDiario_ts_dif)+
  ylab("Demanda del nuevo producto diario (Diferencias)")+
  ggtitle("Serie temporal de la demanda del nuevo producto diario en Diferencias")

autoplot(mstl(productoNuevoDiario_ts_dif))

Los gráficos anteriores muestra la serie de las diferencias de producto nuevo diario, se observa como ya no está presente en componente de tendencia.

Ahora pasaremos a ver los autocorrelogramas de ambas series y los gráficos de sub series respectivos

#Autocorrelograma de la serie
ggAcf(arrozSemanal_ts)

#Gráfica de las sub series
ggsubseriesplot(arrozSemanal_ts)

#Autocorrelograma de la serie
ggAcf(productoNuevoDiario_ts_dif)

Los Gráficos anteriores confirman la estacionalidad la serie de arroz, y ratifican que la serie de producto nuevo diario en diferencias es estacionaria

Para cerrar con la exploración de ambas series temporales, vamos a revisar los potenciales átipicos que se observaron en la gáfica de arroz semanal, a ver si los clasifiacamos como y los suavizamos, o si por el contrario los mantenemos en el análisis.

Identificar potenciales átipicos para la serie de arroz semanal

tsoutliers(arrozSemanal_ts)
## $index
## integer(0)
## 
## $replacements
## numeric(0)

Definitivamente no fueron identificados como atípicos.

Promedios Móviles Simple Serie arroz semanal

#Promedio móvil de orden 3
arrozSemanal_ts_ma3 <- ma(arrozSemanal_ts, 3)

autoplot(arrozSemanal_ts, series="Serie Original") +
  autolayer(arrozSemanal_ts_ma3, series="Promedio Móvil-3") +
  xlab("Semana") + ylab("Demanda de arroz semanal") +
  ggtitle("Serie temporal demanda de Arroz semanal - Promedio Móvil-3") +
  scale_colour_manual(values=c("Serie Original"="blue","Promedio Móvil-3"="red"),
                      breaks=c("Serie Original","Promedio Móvil-3"))
## Warning: Removed 2 rows containing missing values (geom_path).

#Promedio móvil de orden 4
arrozSemanal_ts_ma4 <- ma(arrozSemanal_ts, 4)

autoplot(arrozSemanal_ts, series="Serie Original") +
  autolayer(arrozSemanal_ts_ma4, series="Promedio Móvil-4") +
  xlab("Semana") + ylab("Demanda de arroz semanal") +
  ggtitle("Serie temporal demanda de Arroz semanal - Promedio Móvil-4") +
  scale_colour_manual(values=c("Serie Original"="blue","Promedio Móvil-4"="red"),
                      breaks=c("Serie Original","Promedio Móvil-4"))
## Warning: Removed 4 rows containing missing values (geom_path).

#Promedio móvil de orden 5
arrozSemanal_ts_ma5 <- ma(arrozSemanal_ts, 5)

autoplot(arrozSemanal_ts, series="Serie Original") +
  autolayer(arrozSemanal_ts_ma5, series="Promedio Móvil-5") +
  xlab("Semana") + ylab("Demanda de arroz semanal") +
  ggtitle("Serie temporal demanda de Arroz semanal - Promedio Móvil-5") +
  scale_colour_manual(values=c("Serie Original"="blue","Promedio Móvil-5"="red"),
                      breaks=c("Serie Original","Promedio Móvil-5"))
## Warning: Removed 4 rows containing missing values (geom_path).

Para realizar las prediccones usamos la función predic() y le pasamos como argumentos, el objeto que contiene el modelo y el período a predecir, esta función almacena tanto las predicciones, como los valores ajustados para las observaciones con las que se va calcularía el Error absoluto medio.

Predicciones para la serie arróz

Para evitar escribir el código tres (3) veces, escribimos una función para realizar las predicciones y se la aplicamos a loste tres modelos creados

#

predicciones_MA <- function(modelo, serioOriginal, horizonte){
  pred <- predict(modelo, nrow(serioOriginal)+horizonte)
  for (i in (nrow(serioOriginal)+1):(nrow(serioOriginal)+horizonte)){
  print("La predicción usando un promedio móvil de orden 3 para el período")
  print(i-nrow(serioOriginal))
  print("es: ")
  print(pred$mean[i])
}
}
predicciones_MA(arrozSemanal_ts_ma3, arrozSemanal_ts, 8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 1
## [1] "es: "
## [1] 43.69214
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 2
## [1] "es: "
## [1] 52.00641
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 3
## [1] "es: "
## [1] 57.75978
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 4
## [1] "es: "
## [1] 51.90381
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 5
## [1] "es: "
## [1] 46.99289
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 6
## [1] "es: "
## [1] 41.8849
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 7
## [1] "es: "
## [1] 40.46527
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 8
## [1] "es: "
## [1] 43.69214
predicciones_MA(arrozSemanal_ts_ma4, arrozSemanal_ts, 8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 1
## [1] "es: "
## [1] 40.09223
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 2
## [1] "es: "
## [1] 44.25832
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 3
## [1] "es: "
## [1] 48.26043
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 4
## [1] "es: "
## [1] 49.88879
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 5
## [1] "es: "
## [1] 48.87492
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 6
## [1] "es: "
## [1] 44.76899
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 7
## [1] "es: "
## [1] 39.44687
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 8
## [1] "es: "
## [1] 40.09223
predicciones_MA(arrozSemanal_ts_ma5, arrozSemanal_ts, 8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 1
## [1] "es: "
## [1] 43.04186
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 2
## [1] "es: "
## [1] 47.3482
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 3
## [1] "es: "
## [1] 49.36555
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 4
## [1] "es: "
## [1] 49.09481
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 5
## [1] "es: "
## [1] 51
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 6
## [1] "es: "
## [1] 47.80118
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 7
## [1] "es: "
## [1] 42.04424
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 8
## [1] "es: "
## [1] 43.04186

Cálculo del Error Medio Absoluto para los tres modelos

#predicciones para el modelo de promedios móviles de orden 3
pred_ma3 <- predict(arrozSemanal_ts_ma3, nrow(arrozSemanal_ts)+8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
#predicciones para el modelo de promedios móviles de orden 4
pred_ma4 <- predict(arrozSemanal_ts_ma4, nrow(arrozSemanal_ts)+8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
#predicciones para el modelo de promedios móviles de orden 5
pred_ma5 <- predict(arrozSemanal_ts_ma5, nrow(arrozSemanal_ts)+8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
#Error Medio Absoluto para promedios móviles de orden 3
MAD_ma3 <- mean(abs(arrozSemanal_ts - pred_ma3$fitted))

#Error Medio Absoluto para promedios móviles de orden 4
MAD_ma4 <- mean(abs(arrozSemanal_ts - pred_ma4$fitted))

#Error Medio Absoluto para promedios móviles de orden 5
MAD_ma5 <- mean(abs(arrozSemanal_ts - pred_ma5$fitted))

MAD_all <- c(MAD_ma3, MAD_ma4, MAD_ma5)
print(MAD_all)
## [1] 8.533036 9.050014 9.675354
print("El Error Medio Absoluto menor es:")
## [1] "El Error Medio Absoluto menor es:"
print(min(MAD_all))
## [1] 8.533036
print("Que corresponde con el modelo de promedio móvil de orden,")
## [1] "Que corresponde con el modelo de promedio móvil de orden,"
print(which.min(MAD_all)+2)
## [1] 3

Luego entre los modelos de promedios móvil para la serie de arroz semanal, es que produce el mejor ajuste es el de promedios móviles de orden 5

Serie del Nuevo producto de uso diario

Aunque observamos que la serie tiene tendencia y por lo tanto no es estacionaria, para efectos de este ejercio, realizaremos el ajuste con la serie original

#Promedio móvil de orden 3
productoNuevoDiario_ts_ma3 <- ma(productoNuevoDiario_ts, 3)

autoplot(productoNuevoDiario_ts, series="Serie Original") +
  autolayer(productoNuevoDiario_ts_ma3, series="Promedio Móvil-3") +
  xlab("Semana") + ylab("Demanda del Producto nuevo de uso diario") +
  ggtitle("Serie temporal demanda del Producto nuevo de uso diario - Promedio Móvil-3") +
  scale_colour_manual(values=c("Serie Original"="blue","Promedio Móvil-3"="red"),
                      breaks=c("Serie Original","Promedio Móvil-3"))
## Warning: Removed 2 rows containing missing values (geom_path).

#Promedio móvil de orden 4
productoNuevoDiario_ts_ma4 <- ma(productoNuevoDiario_ts, 4)

autoplot(productoNuevoDiario_ts, series="Serie Original") +
  autolayer(productoNuevoDiario_ts_ma4, series="Promedio Móvil-4") +
  xlab("Semana") + ylab("Demanda del Producto nuevo de uso diario") +
  ggtitle("Serie temporal demanda del Producto nuevo de uso diario - Promedio Móvil-4") +
  scale_colour_manual(values=c("Serie Original"="blue","Promedio Móvil-4"="red"),
                      breaks=c("Serie Original","Promedio Móvil-4"))
## Warning: Removed 4 rows containing missing values (geom_path).

#Promedio móvil de orden 5
productoNuevoDiario_ts_ma5 <- ma(productoNuevoDiario_ts, 5)

autoplot(productoNuevoDiario_ts, series="Serie Original") +
  autolayer(productoNuevoDiario_ts_ma5, series="Promedio Móvil-5") +
  xlab("Semana") + ylab("Demanda del Producto nuevo de uso diario") +
  ggtitle("Serie temporal demanda del Producto nuevo de uso diario - Promedio Móvil-5") +
  scale_colour_manual(values=c("Serie Original"="blue","Promedio Móvil-5"="red"),
                      breaks=c("Serie Original","Promedio Móvil-5"))
## Warning: Removed 4 rows containing missing values (geom_path).

Para encontrar las predicciones usamos la función que escribimos arriba, la cual se codificó de forma genérica para poder reusar el código adecuadamente

predicciones_MA(productoNuevoDiario_ts_ma3, productoNuevoDiario_ts, 8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 1
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 2
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 3
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 4
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 5
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 6
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 7
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 8
## [1] "es: "
## [1] 765.3317
predicciones_MA(productoNuevoDiario_ts_ma4, productoNuevoDiario_ts, 8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 1
## [1] "es: "
## [1] 1201.788
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 2
## [1] "es: "
## [1] 1213.869
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 3
## [1] "es: "
## [1] 1225.951
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 4
## [1] "es: "
## [1] 1238.032
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 5
## [1] "es: "
## [1] 1250.114
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 6
## [1] "es: "
## [1] 1262.196
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 7
## [1] "es: "
## [1] 1274.277
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 8
## [1] "es: "
## [1] 1286.359
predicciones_MA(productoNuevoDiario_ts_ma3, productoNuevoDiario_ts, 8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 1
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 2
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 3
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 4
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 5
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 6
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 7
## [1] "es: "
## [1] 765.3317
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 8
## [1] "es: "
## [1] 765.3317

Ahora calcularemos el Error Medio Absoluto

Cálculo del Error Medio Absoluto para los tres modelos

#predicciones para el modelo de promedios móviles de orden 3

pred_ma3 <- predict(productoNuevoDiario_ts_ma3, nrow(productoNuevoDiario_ts)+8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
#predicciones para el modelo de promedios móviles de orden 4
pred_ma4 <- predict(productoNuevoDiario_ts_ma4, nrow(productoNuevoDiario_ts)+8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
#predicciones para el modelo de promedios móviles de orden 5
pred_ma5 <- predict(productoNuevoDiario_ts_ma5, nrow(productoNuevoDiario_ts)+8)
## Warning in ets(object, lambda = lambda, biasadj = biasadj,
## allow.multiplicative.trend = allow.multiplicative.trend, : Missing values
## encountered. Using longest contiguous portion of time series
#Error Medio Absoluto para promedios móviles de orden 3
MAD_ma3 <- mean(abs(productoNuevoDiario_ts - pred_ma3$fitted))

#Error Medio Absoluto para promedios móviles de orden 4
MAD_ma4 <- mean(abs(productoNuevoDiario_ts - pred_ma4$fitted))

#Error Medio Absoluto para promedios móviles de orden 5
MAD_ma5 <- mean(abs(productoNuevoDiario_ts - pred_ma5$fitted))

MAD_all <- c(MAD_ma3, MAD_ma4, MAD_ma5)
print(MAD_all)
## [1] 36.52107 37.57826 41.46523
print("El Error Medio Absoluto menor es:")
## [1] "El Error Medio Absoluto menor es:"
print(min(MAD_all))
## [1] 36.52107
print("Que corresponde con el modelo de promedio móvil de orden,")
## [1] "Que corresponde con el modelo de promedio móvil de orden,"
print(which.min(MAD_all)+2)
## [1] 3

Suavizamiento exponencial simple

Para hacer este ajuste se usa la función ses() del paquete forecast, se le pasa como argumentos, el objeto serie de tiempo el número de períodos h a predecir

arrozSemanal_ts_ses <- ses(arrozSemanal_ts, h = 8,  initial = "optimal")

autoplot(arrozSemanal_ts, series="Serie Original") +
  autolayer(arrozSemanal_ts_ses$fitted, series="Suavizamiento exponencial simple") +
  xlab("Semana") + ylab("Demanda Arroz Semanal") +
  ggtitle("Serie temporal demanda de Arroz semanal - Suavizamiento exponecial simple") +
  scale_colour_manual(values=c("Serie Original"="blue","Suavizamiento exponencial simple"="red"),
                      breaks=c("Serie Original","Suavizamiento exponencial simple"))

Predicciones para los 8 períodos indicados

for (i in 1:nrow(as.data.frame(arrozSemanal_ts_ses))){
  print("La predicción usando un promedio móvil de orden 3 para el período")
  print(i)
  print("es: ")
  print(arrozSemanal_ts_ses$mean[i])
}
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 1
## [1] "es: "
## [1] 53.90224
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 2
## [1] "es: "
## [1] 53.90224
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 3
## [1] "es: "
## [1] 53.90224
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 4
## [1] "es: "
## [1] 53.90224
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 5
## [1] "es: "
## [1] 53.90224
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 6
## [1] "es: "
## [1] 53.90224
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 7
## [1] "es: "
## [1] 53.90224
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 8
## [1] "es: "
## [1] 53.90224

Para obtener el error medio absoluto se puede usar la función accuracy() del paquete forecast(), veamos el resultado

accuracy(arrozSemanal_ts_ses)
##                       ME     RMSE      MAE      MPE     MAPE      MASE
## Training set 0.001056202 16.02683 11.89247 -9.57708 25.28576 0.8176072
##                   ACF1
## Training set 0.2282962

Se observa que el valor del Error Absoluto Medio (MAE) es de 11.89247, recordemos que para el caso del model de promedios móviles simples de orden tres el valor del Error Absoluto Medio que se obtuvo fue de 8.533036, el cual es menor, lo que sugiere que el mejor modelo es el de promedios móviles de orden 3 entre los evaluados

Veamos ahora cómo se comporta el modelo de suavizamiento expononecial simple para la serie de Producto Nuevo de Uso Diario

productoNuevoDiario_ts_ses <- ses(productoNuevoDiario_ts, h = 8,  initial = "optimal")

autoplot(productoNuevoDiario_ts, series="Serie Original") +
  autolayer(productoNuevoDiario_ts_ses$fitted, series="Suavizamiento exponencial simple") +
  xlab("Semana") + ylab("Demanda del Producto nuevo de uso diario") +
  ggtitle("Serie temporal demanda del Producto nuevo de uso diario - Suavizamiento exponecial simple") +
  scale_colour_manual(values=c("Serie Original"="blue","Suavizamiento exponencial simple"="red"),
                      breaks=c("Serie Original","Suavizamiento exponencial simple"))

Predicciones para los 8 períodos indicados

for (i in 1:nrow(as.data.frame(productoNuevoDiario_ts_ses))){
  print("La predicción usando un promedio móvil de orden 3 para el período")
  print(i)
  print("es: ")
  print(productoNuevoDiario_ts_ses$mean[i])
}
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 1
## [1] "es: "
## [1] 757.7484
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 2
## [1] "es: "
## [1] 757.7484
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 3
## [1] "es: "
## [1] 757.7484
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 4
## [1] "es: "
## [1] 757.7484
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 5
## [1] "es: "
## [1] 757.7484
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 6
## [1] "es: "
## [1] 757.7484
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 7
## [1] "es: "
## [1] 757.7484
## [1] "La predicción usando un promedio móvil de orden 3 para el período"
## [1] 8
## [1] "es: "
## [1] 757.7484

Error Absoluto Medio

accuracy(productoNuevoDiario_ts_ses)
##                    ME     RMSE      MAE      MPE     MAPE      MASE        ACF1
## Training set 20.82855 66.64141 52.23031 2.494784 9.030839 0.8374076 -0.08044777

El Error Medio Absoluto para el modelo ajustado por suavizamiento exponencial simples es de 52.23031, mientras que el obtenido por el método de promedios móviles simples es de 36.52107, lo que indica que el modelo de promedios móviles de orden 3 es más confiable que el de suvizamiento exponencial simple.

Conclusión

A la luz de los resultados obtenios, se puede concluir que en para ambas seres de tiempo, el mejor modelo entre los evaluados es el de Promedios Móviles de Orden 3.