library(tseries)
library(readr)
library(ggplot2)
beer1 <- read_csv("C:/My Work/Data Analytics/GL/TSF/beer1.csv")
Parsed with column specification:
cols(
  OzBeer = col_double()
)
head(beer1)
ggplot(ts,aes(x=beer1$OzBeer,y=c(1:72)))+geom_line()

ts<-ts(beer1$OzBeer,frequency = 4,start=c(1990,1))
plot(ts,col="red")

cnt_ma12=ma(beer1$OzBeer,12)
cnt_ma6=ma(beer1$OzBeer,6)
cnt_ma4=ma(beer1$OzBeer,4)
ggplot() +
  geom_line(data = beer1, aes(x = c(1:72), y = ts, colour = "Actual Sales")) +
  geom_line(data = beer1, aes(x = c(1:72), y = cnt_ma12, colour = "Monthly Moving Average"))  +
  geom_line(data = beer1, aes(x = c(1:72), y = cnt_ma6, colour = "Hal-yearly Moving Average"))  +
  geom_line(data = beer1, aes(x = c(1:72), y = cnt_ma4, colour = "Quarterly Moving Average"))  +
  ylab('Beer Sales')

As we can see that the maximum smoothening is achived using ma(4).

kpss.test(ts)
p-value smaller than printed p-value

    KPSS Test for Level Stationarity

data:  ts
KPSS Level = 3.0456, Truncation lag parameter = 1, p-value = 0.01

So the series is not stationary

ndiffs(ts)
[1] 1
dif = diff(ts,differences = 1)
kpss.test(dif)
p-value greater than printed p-value

    KPSS Test for Level Stationarity

data:  dif
KPSS Level = 0.036853, Truncation lag parameter = 1, p-value = 0.1

After differenciating it once, we see that the series is stationary.

plot(dif,col = "blue")
abline(lm(dif~time(dif)),col = "red")

decom<-decompose(ts)
plot(decom,col = "blue")

Another test for stationarity, Dickey-Fuller test

adf.test(ts)

    Augmented Dickey-Fuller Test

data:  ts
Dickey-Fuller = -0.73068, Lag order = 4, p-value = 0.9633
alternative hypothesis: stationary

hence we accept NULL hypothesis

adf.test(dif)
p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  dif
Dickey-Fuller = -6.2957, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary

this proves that d = 1.

ma4<-ma(dif,4)
par(mfrow=c(2,1))
Acf(ma4, main='')
Pacf(ma4, main='')

from the above charts we can conclude that p = 1 and q = 3. but we must test the same with our model

auto.arima(ma4, seasonal=TRUE)
Series: ma4 
ARIMA(0,1,1)(0,0,1)[4] with drift 

Coefficients:
          ma1     sma1   drift
      -0.7671  -0.6583  0.0636
s.e.   0.1187   0.1073  0.0177

sigma^2 estimated as 2.123:  log likelihood=-120.82
AIC=249.65   AICc=250.27   BIC=258.64
fit<-arima(ma4,order =c(0,1,1),seasonal = list(order =c(0,0,1),period =4))
fit

Call:
arima(x = ma4, order = c(0, 1, 1), seasonal = list(order = c(0, 0, 1), period = 4))

Coefficients:
          ma1     sma1
      -0.5858  -0.5674
s.e.   0.1229   0.1095

sigma^2 estimated as 2.392:  log likelihood = -123.49,  aic = 252.98
tsdisplay(residuals(fit), lag.max=15, main='Seasonal Model Residuals')

fcast <- forecast(fit, h=8)
plot(fcast)

LS0tDQp0aXRsZTogIkJ1aWxkaW5nIEFSSU1BIG1vZGVsIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQpgYGB7cn0NCmxpYnJhcnkodHNlcmllcykNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KYGBge3J9DQpiZWVyMSA8LSByZWFkX2NzdigiQzovTXkgV29yay9EYXRhIEFuYWx5dGljcy9HTC9UU0YvYmVlcjEuY3N2IikNCmhlYWQoYmVlcjEpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QodHMsYWVzKHg9YmVlcjEkT3pCZWVyLHk9YygxOjcyKSkpK2dlb21fbGluZSgpDQpgYGANCg0KDQpgYGB7cn0NCnRzPC10cyhiZWVyMSRPekJlZXIsZnJlcXVlbmN5ID0gNCxzdGFydD1jKDE5OTAsMSkpDQpwbG90KHRzLGNvbD0icmVkIikNCmBgYA0KDQpgYGB7cn0NCmNudF9tYTEyPW1hKGJlZXIxJE96QmVlciwxMikNCmNudF9tYTY9bWEoYmVlcjEkT3pCZWVyLDYpDQpjbnRfbWE0PW1hKGJlZXIxJE96QmVlciw0KQ0KZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGJlZXIxLCBhZXMoeCA9IGMoMTo3MiksIHkgPSB0cywgY29sb3VyID0gIkFjdHVhbCBTYWxlcyIpKSArDQogIGdlb21fbGluZShkYXRhID0gYmVlcjEsIGFlcyh4ID0gYygxOjcyKSwgeSA9IGNudF9tYTEyLCBjb2xvdXIgPSAiTW9udGhseSBNb3ZpbmcgQXZlcmFnZSIpKSAgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGJlZXIxLCBhZXMoeCA9IGMoMTo3MiksIHkgPSBjbnRfbWE2LCBjb2xvdXIgPSAiSGFsLXllYXJseSBNb3ZpbmcgQXZlcmFnZSIpKSAgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGJlZXIxLCBhZXMoeCA9IGMoMTo3MiksIHkgPSBjbnRfbWE0LCBjb2xvdXIgPSAiUXVhcnRlcmx5IE1vdmluZyBBdmVyYWdlIikpICArDQogIHlsYWIoJ0JlZXIgU2FsZXMnKQ0KYGBgDQpBcyB3ZSBjYW4gc2VlIHRoYXQgdGhlIG1heGltdW0gc21vb3RoZW5pbmcgaXMgYWNoaXZlZCB1c2luZyBtYSg0KS4NCg0KYGBge3J9DQprcHNzLnRlc3QodHMpDQpgYGANCg0KU28gdGhlIHNlcmllcyBpcyBub3Qgc3RhdGlvbmFyeQ0KDQpgYGB7cn0NCm5kaWZmcyh0cykNCmBgYA0KDQoNCmBgYHtyfQ0KZGlmID0gZGlmZih0cyxkaWZmZXJlbmNlcyA9IDEpDQprcHNzLnRlc3QoZGlmKQ0KYGBgDQoNCkFmdGVyIGRpZmZlcmVuY2lhdGluZyBpdCBvbmNlLCB3ZSBzZWUgdGhhdCB0aGUgc2VyaWVzIGlzIHN0YXRpb25hcnkuDQoNCmBgYHtyfQ0KcGxvdChkaWYsY29sID0gImJsdWUiKQ0KYWJsaW5lKGxtKGRpZn50aW1lKGRpZikpLGNvbCA9ICJyZWQiKQ0KYGBgDQoNCg0KYGBge3J9DQpkZWNvbTwtZGVjb21wb3NlKHRzKQ0KcGxvdChkZWNvbSxjb2wgPSAiYmx1ZSIpDQpgYGANCg0KQW5vdGhlciB0ZXN0IGZvciBzdGF0aW9uYXJpdHksIERpY2tleS1GdWxsZXIgdGVzdA0KDQpgYGB7cn0NCmFkZi50ZXN0KHRzKQ0KYGBgDQpoZW5jZSB3ZSBhY2NlcHQgTlVMTCBoeXBvdGhlc2lzDQoNCmBgYHtyfQ0KYWRmLnRlc3QoZGlmKQ0KYGBgDQoNCnRoaXMgcHJvdmVzIHRoYXQgZCA9IDEuDQoNCmBgYHtyfQ0KbWE0PC1tYShkaWYsNCkNCnBhcihtZnJvdz1jKDIsMSkpDQpBY2YobWE0LCBtYWluPScnKQ0KUGFjZihtYTQsIG1haW49JycpDQpgYGANCg0KZnJvbSB0aGUgYWJvdmUgY2hhcnRzIHdlIGNhbiBjb25jbHVkZSB0aGF0IHAgPSAxIGFuZCBxID0gMy4gYnV0IHdlIG11c3QgdGVzdCB0aGUgc2FtZSB3aXRoIG91ciBtb2RlbA0KDQpgYGB7cn0NCmF1dG8uYXJpbWEobWE0LCBzZWFzb25hbD1UUlVFKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmZpdDwtYXJpbWEobWE0LG9yZGVyID1jKDAsMSwxKSxzZWFzb25hbCA9IGxpc3Qob3JkZXIgPWMoMCwwLDEpLHBlcmlvZCA9NCkpDQpmaXQNCmBgYA0KDQoNCmBgYHtyfQ0KdHNkaXNwbGF5KHJlc2lkdWFscyhmaXQpLCBsYWcubWF4PTE1LCBtYWluPSdTZWFzb25hbCBNb2RlbCBSZXNpZHVhbHMnKQ0KYGBgDQoNCmBgYHtyfQ0KZmNhc3QgPC0gZm9yZWNhc3QoZml0LCBoPTgpDQpwbG90KGZjYXN0KQ0KDQpgYGANCg0K