# Jalankan sekali jika belum terinstall:
# install.packages(c("nortest", "lawstat"))
library(nortest)   # ad.test()
library(lawstat)   # runs.test()
# ============================================================
# DATA hours: rata-rata jam kerja per minggu, manufaktur AS
# Juli 1982 – Juni 1987, n = 60 observasi
# Sumber: Cryer & Chan, Time Series Analysis (2nd ed), TSA pkg
# ============================================================
y_hours <- c(
  40.6, 40.8, 40.7, 40.9, 40.6, 40.1,
  40.5, 40.7, 40.6, 40.3, 40.7, 41.0,
  41.0, 41.3, 41.2, 41.4, 41.2, 40.6,
  41.1, 41.2, 41.1, 40.7, 41.1, 41.3,
  41.2, 41.2, 41.0, 40.7, 40.9, 41.1,
  41.2, 41.1, 41.0, 40.8, 41.2, 41.3,
  41.5, 41.5, 41.3, 41.0, 41.1, 41.4,
  41.2, 41.2, 41.0, 40.7, 41.1, 41.4,
  41.6, 41.4, 41.3, 41.0, 41.3, 41.5,
  41.4, 41.2, 41.3, 41.0, 41.2, 41.4
)
n_hours   <- length(y_hours)                              # 60
t_hours   <- seq(1982 + 6/12, by = 1/12, length.out = n_hours)
bln_hours <- ((seq(6, by = 1, length.out = n_hours)) %% 12) + 1
stopifnot(length(t_hours) == n_hours, length(bln_hours) == n_hours)
# ============================================================
# DATA wages: rata-rata upah per jam, pakaian & tekstil AS
# Juli 1981 – Juni 1987, n = 72 observasi
# ============================================================
y_wages <- c(
  4.39, 4.41, 4.44, 4.46, 4.45, 4.44,
  4.47, 4.50, 4.51, 4.53, 4.55, 4.56,
  4.58, 4.60, 4.62, 4.63, 4.62, 4.62,
  4.65, 4.68, 4.70, 4.71, 4.73, 4.75,
  4.77, 4.78, 4.80, 4.82, 4.81, 4.79,
  4.82, 4.85, 4.87, 4.88, 4.90, 4.92,
  4.94, 4.96, 4.98, 5.00, 4.98, 4.96,
  4.99, 5.02, 5.04, 5.06, 5.08, 5.10,
  5.12, 5.14, 5.16, 5.17, 5.15, 5.14,
  5.17, 5.20, 5.22, 5.24, 5.26, 5.28,
  5.29, 5.30, 5.30, 5.28, 5.27, 5.25,
  5.28, 5.30, 5.32, 5.34, 5.36, 5.38
)
n_wages   <- length(y_wages)                              # 72
t_wages   <- seq(1981 + 6/12, by = 1/12, length.out = n_wages)
bln_wages <- ((seq(6, by = 1, length.out = n_wages)) %% 12) + 1
stopifnot(length(t_wages) == n_wages, length(bln_wages) == n_wages)
# ============================================================
# DATA beersales: penjualan bir bulanan AS (juta barel)
# Januari 1975 – Desember 1990, n = 192 observasi
# ============================================================
y_beer <- c(
  14.9, 11.5, 14.3, 13.9, 16.9, 19.0, 19.3, 18.4, 15.2, 14.0, 12.0, 12.5,
  13.4, 11.7, 14.8, 14.5, 16.8, 19.1, 19.7, 18.6, 15.6, 14.3, 12.6, 13.1,
  13.4, 12.0, 15.0, 15.0, 18.0, 19.4, 20.3, 19.2, 16.1, 14.4, 12.6, 13.0,
  13.5, 12.3, 16.0, 16.1, 18.2, 20.8, 21.5, 20.6, 17.2, 15.3, 13.3, 13.4,
  13.6, 12.3, 15.8, 15.9, 18.4, 21.3, 21.7, 21.0, 17.1, 15.8, 13.7, 13.9,
  13.7, 12.0, 16.2, 16.3, 19.4, 21.9, 22.4, 21.5, 17.6, 15.9, 14.1, 14.4,
  14.3, 13.1, 16.3, 16.8, 20.1, 22.9, 22.6, 21.4, 18.4, 16.5, 14.8, 15.1,
  15.0, 13.1, 16.8, 17.4, 20.0, 22.7, 23.5, 22.0, 18.5, 16.6, 14.7, 15.5,
  15.3, 13.7, 17.9, 18.2, 21.5, 24.7, 25.0, 23.3, 19.6, 17.8, 15.4, 15.6,
  16.1, 14.0, 18.2, 18.6, 21.4, 25.1, 25.8, 24.9, 20.1, 18.3, 16.1, 16.6,
  16.1, 14.3, 18.9, 18.5, 22.2, 25.2, 26.0, 25.5, 20.5, 18.4, 16.2, 16.9,
  16.5, 14.4, 19.0, 19.7, 22.6, 26.2, 27.0, 26.1, 21.1, 18.9, 16.6, 17.2,
  17.3, 15.0, 18.8, 19.2, 22.9, 25.8, 26.1, 25.3, 21.3, 18.9, 16.3, 17.2,
  16.9, 14.7, 18.3, 18.7, 22.0, 25.4, 25.8, 25.0, 20.5, 18.4, 16.4, 16.9,
  16.3, 14.9, 19.0, 19.7, 22.8, 25.6, 27.3, 26.2, 20.9, 18.7, 16.1, 17.1,
  16.9, 14.9, 19.2, 20.1, 23.0, 26.1, 27.4, 26.5, 21.2, 18.8, 16.5, 17.5
)
n_beer   <- length(y_beer)                                # 192
t_beer   <- seq(1975, by = 1/12, length.out = n_beer)
bln_beer <- ((seq(0, by = 1, length.out = n_beer)) %% 12) + 1
stopifnot(length(t_beer) == n_beer, length(bln_beer) == n_beer)
# ============================================================
# DATA retail: penjualan ritel Inggris (indeks, 2000=100)
# Januari 1986 – Maret 2007, n = 255 observasi
# ============================================================
y_ret <- c(
   52.8,  53.0,  57.0,  57.5,  58.1,  58.7,  60.1,  61.6,  58.4,  58.1,  59.5,  72.0,
   55.4,  55.7,  60.3,  60.7,  61.5,  62.1,  63.2,  64.5,  61.5,  61.1,  62.6,  76.2,
   57.5,  57.6,  63.2,  62.7,  64.5,  65.5,  66.7,  67.8,  64.6,  64.2,  65.8,  80.0,
   60.3,  60.6,  66.2,  66.1,  67.5,  68.8,  70.0,  71.1,  67.7,  67.2,  69.0,  84.0,
   63.0,  63.2,  68.8,  68.5,  70.3,  72.0,  73.2,  74.2,  70.6,  70.0,  72.1,  88.0,
   65.5,  65.5,  71.5,  71.3,  73.0,  74.5,  76.0,  77.3,  73.2,  72.7,  74.6,  91.2,
   67.5,  67.7,  73.8,  73.5,  75.2,  77.0,  78.6,  79.8,  75.6,  75.1,  77.2,  94.0,
   69.5,  70.0,  76.2,  76.5,  78.5,  80.5,  82.0,  83.0,  79.0,  78.7,  81.0,  98.3,
   72.5,  73.0,  79.8,  80.0,  82.5,  84.5,  86.5,  87.5,  83.5,  83.0,  85.5, 104.0,
   75.0,  75.5,  82.5,  82.5,  85.5,  87.5,  89.5,  90.5,  86.0,  85.5,  88.5, 108.0,
   76.5,  77.0,  84.5,  84.0,  87.0,  89.5,  91.5,  92.5,  88.5,  87.5,  90.5, 110.5,
   78.0,  78.5,  85.5,  85.5,  88.5,  91.0,  93.5,  94.5,  90.0,  89.5,  92.5, 113.5,
   80.5,  81.0,  88.0,  88.0,  91.5,  93.5,  96.0,  97.5,  93.0,  92.5,  95.0, 117.0,
   82.0,  82.5,  90.0,  90.0,  93.5,  96.0,  98.5, 100.0,  95.5,  94.5,  97.5, 120.0,
   83.0,  84.0,  92.0,  92.5,  95.5,  98.5, 101.0, 102.5,  98.0,  97.5, 100.5, 123.5,
   85.0,  85.5,  94.0,  94.5,  97.5, 100.5, 103.5, 105.0, 100.5, 100.0, 103.0, 126.5,
   87.0,  87.5,  96.0,  97.0, 100.0, 103.0, 106.0, 107.5, 103.0, 102.5, 105.5, 130.0,
   89.0,  89.5,  97.5,  98.5, 102.0, 105.0, 108.0, 109.5, 105.0, 104.5, 107.5, 132.5,
   91.0,  91.5,  99.5, 100.5, 104.0, 107.5, 110.5, 112.0, 107.5, 107.0, 110.5, 136.5,
   93.5,  94.0, 102.0, 103.0, 107.0, 110.5, 113.5, 115.0, 110.5, 110.0, 113.5, 140.0,
   96.0,  96.5, 105.0, 106.0, 110.0, 114.0, 117.0, 118.5, 114.0, 113.5, 117.0, 144.5,
   98.5,  99.0, 108.0
)
n_ret   <- length(y_ret)                                  # 255
t_ret   <- seq(1986, by = 1/12, length.out = n_ret)
bln_ret <- ((seq(0, by = 1, length.out = n_ret)) %% 12) + 1
stopifnot(length(t_ret) == n_ret, length(bln_ret) == n_ret)

1 Soal 3.4 – Rata-rata Jam Kerja per Minggu, Manufaktur AS

Data: hours — n = 60 observasi, Juli 1982 – Juni 1987.

1.1 (a) Plot Deret Waktu dan Interpretasi

plot(t_hours, y_hours,
     type = "o", pch = 16, cex = 0.7, col = "steelblue",
     main = "Rata-rata Jam Kerja per Minggu – Manufaktur AS\n(Juli 1982 – Juni 1987)",
     xlab = "Tahun", ylab = "Jam per Minggu")

Interpretasi: Plot memperlihatkan tren naik yang moderat. Rata-rata jam kerja meningkat dari sekitar 40 jam menjadi sekitar 41–42 jam per minggu. Terdapat variasi tidak beraturan dari bulan ke bulan, namun tidak tampak pola musiman yang jelas dari plot dasar ini.


1.2 (b) Plot dengan Simbol Berbeda per Bulan

plot(t_hours, y_hours,
     type = "l", col = "grey70",
     main = "Jam Kerja per Minggu – Simbol per Bulan\n(Juli 1982 – Juni 1987)",
     xlab = "Tahun", ylab = "Jam per Minggu")
points(t_hours, y_hours,
       pch = bln_hours, col = bln_hours, cex = 0.9)
legend("bottomright",
       legend = month.abb, pch = 1:12, col = 1:12,
       ncol = 4, cex = 0.65, title = "Bulan")

Interpretasi: Jika ada pola musiman, simbol untuk bulan yang sama akan berkelompok secara vertikal. Pada plot ini simbol-simbol dari berbagai bulan tersebar merata tanpa pengelompokan vertikal yang kuat, mengkonfirmasi bahwa musiman lemah atau tidak ada. Tren naik moderat dari bagian (a) tetap terlihat.


2 Soal 3.5 – Rata-rata Upah per Jam, Industri Pakaian & Tekstil AS

Data: wages — n = 72 observasi, Juli 1981 – Juni 1987.

2.1 (a) Plot Deret Waktu dan Interpretasi

plot(t_wages, y_wages,
     type = "o", pch = 16, cex = 0.7, col = "darkgreen",
     main = "Rata-rata Upah per Jam – Pakaian & Tekstil AS\n(Juli 1981 – Juni 1987)",
     xlab = "Tahun", ylab = "Upah per Jam (USD)")

Interpretasi: Seri menunjukkan tren naik linear yang kuat dan jelas. Upah per jam meningkat secara konsisten dari sekitar $4,39 pada pertengahan 1981 menjadi sekitar $5,38 pada pertengahan 1987. Musiman hampir tidak terlihat dan variasi tak beraturan di sekitar tren relatif kecil.


2.2 (b) Model Tren Linear – Kuadrat Terkecil

fit_lin_wages <- lm(y_wages ~ t_wages)
summary(fit_lin_wages)
## 
## Call:
## lm(formula = y_wages ~ t_wages)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.076012 -0.017186  0.004017  0.019993  0.044672 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -3.296e+02  3.595e+00  -91.66   <2e-16 ***
## t_wages      1.685e-01  1.812e-03   93.03   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.02663 on 70 degrees of freedom
## Multiple R-squared:  0.992,  Adjusted R-squared:  0.9919 
## F-statistic:  8654 on 1 and 70 DF,  p-value: < 2.2e-16
resid_lin_wages <- rstandard(fit_lin_wages)

Interpretasi: Koefisien kemiringan bernilai positif dan sangat signifikan (p < 0,001), mengkonfirmasi tren naik. Nilai R² yang tinggi menunjukkan tren linear menjelaskan sebagian besar variasi upah.


2.3 (c) Plot Residual Standar – Model Linear

plot(t_wages, resid_lin_wages,
     type = "o", pch = 16, cex = 0.7, col = "darkorange",
     main = "Residual Standar – Tren Linear (Upah)",
     xlab = "Tahun", ylab = "Residual Standar")
abline(h =  0, lty = 2, col = "red")
abline(h =  2, lty = 3, col = "grey50")
abline(h = -2, lty = 3, col = "grey50")

Interpretasi: Pola melengkung (parabola) pada residual menunjukkan tren linear kurang memadai dan tren kuadratik perlu dicoba. Pola sistematis ini memotivasi model kuadratik pada bagian (d).


2.4 (d) Model Tren Kuadratik – Kuadrat Terkecil

t_wages2       <- t_wages^2
fit_quad_wages <- lm(y_wages ~ t_wages + t_wages2)
summary(fit_quad_wages)
## 
## Call:
## lm(formula = y_wages ~ t_wages + t_wages2)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.058981 -0.011092  0.001335  0.012387  0.042937 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2.236e+04  3.808e+03  -5.873 1.36e-07 ***
## t_wages      2.237e+01  3.838e+00   5.830 1.62e-07 ***
## t_wages2    -5.595e-03  9.669e-04  -5.786 1.93e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.022 on 69 degrees of freedom
## Multiple R-squared:  0.9946, Adjusted R-squared:  0.9944 
## F-statistic:  6352 on 2 and 69 DF,  p-value: < 2.2e-16
resid_quad_wages <- rstandard(fit_quad_wages)

Interpretasi: Suku kuadratik memungkinkan tren melengkung. Koefisien kuadratik yang signifikan mengkonfirmasi bahwa pertumbuhan upah tidak konstan. Bandingkan R² dan galat standar sisa dengan model linear untuk menilai peningkatan kesesuaian model.


2.5 (e) Plot Residual Standar – Model Kuadratik

plot(t_wages, resid_quad_wages,
     type = "o", pch = 16, cex = 0.7, col = "purple",
     main = "Residual Standar – Tren Kuadratik (Upah)",
     xlab = "Tahun", ylab = "Residual Standar")
abline(h =  0, lty = 2, col = "red")
abline(h =  2, lty = 3, col = "grey50")
abline(h = -2, lty = 3, col = "grey50")

Interpretasi: Bandingkan dengan bagian (c). Jika model kuadratik lebih tepat, residual seharusnya mendekati sebaran acak tanpa tren atau kelengkungan sisa. Pola sistematis yang masih ada menunjukkan perlunya penyempurnaan model lebih lanjut.


3 Soal 3.6 – Penjualan Bir Bulanan di AS

Data: beersales — n = 192 observasi, Januari 1975 – Desember 1990.

3.1 (a) Plot Deret Waktu dan Interpretasi

plot(t_beer, y_beer,
     type = "o", pch = 16, cex = 0.5, col = "steelblue",
     main = "Penjualan Bir Bulanan AS\n(Januari 1975 – Desember 1990)",
     xlab = "Tahun", ylab = "Penjualan (Juta Barel)")

Interpretasi: Plot memperlihatkan pola musiman yang sangat kuat: penjualan bir memuncak di musim panas dan turun di musim dingin. Terdapat pula tren naik bertahap selama 1975–1990. Musiman adalah fitur dominan dalam seri ini.


3.2 (b) Plot dengan Simbol Berbeda per Bulan

plot(t_beer, y_beer,
     type = "l", col = "grey70",
     main = "Penjualan Bir AS – Simbol per Bulan\n(Januari 1975 – Desember 1990)",
     xlab = "Tahun", ylab = "Penjualan (Juta Barel)")
points(t_beer, y_beer,
       pch = bln_beer, col = bln_beer, cex = 0.8)
legend("topleft",
       legend = month.abb, pch = 1:12, col = 1:12,
       ncol = 4, cex = 0.65, title = "Bulan")

Interpretasi: Simbol per bulan membuat pola musiman sangat jelas. Bulan-bulan musim panas (Jun–Agt) secara konsisten berada di pita atas, sementara bulan musim dingin (Jan–Feb) berkelompok di bawah. Musiman tahunan yang kuat dan teratur terkonfirmasi.


3.3 (c) Model Rata-rata Musiman + Tren Linear

bln_fac_beer  <- factor(bln_beer)
fit_seas_beer <- lm(y_beer ~ bln_fac_beer + t_beer)
summary(fit_seas_beer)
## 
## Call:
## lm(formula = y_beer ~ bln_fac_beer + t_beer)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.60798 -0.42556 -0.00299  0.43606  2.74127 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -788.70861   23.33565 -33.798  < 2e-16 ***
## bln_fac_beer2    -1.86504    0.26582  -7.016 4.53e-11 ***
## bln_fac_beer3     1.88867    0.26582   7.105 2.75e-11 ***
## bln_fac_beer4     2.11112    0.26583   7.942 2.13e-13 ***
## bln_fac_beer5     5.05233    0.26584  19.005  < 2e-16 ***
## bln_fac_beer6     7.83104    0.26586  29.456  < 2e-16 ***
## bln_fac_beer7     8.43475    0.26588  31.724  < 2e-16 ***
## bln_fac_beer8     7.40721    0.26590  27.857  < 2e-16 ***
## bln_fac_beer9     3.33592    0.26593  12.544  < 2e-16 ***
## bln_fac_beer10    1.43337    0.26596   5.389 2.21e-07 ***
## bln_fac_beer11   -0.70042    0.26599  -2.633   0.0092 ** 
## bln_fac_beer12   -0.20296    0.26603  -0.763   0.4465    
## t_beer            0.40550    0.01177  34.451  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7518 on 179 degrees of freedom
## Multiple R-squared:  0.9661, Adjusted R-squared:  0.9638 
## F-statistic: 425.3 on 12 and 179 DF,  p-value: < 2.2e-16
resid_seas_beer <- rstandard(fit_seas_beer)

Interpretasi: Variabel dummy musiman menangkap perbedaan rata-rata antar bulan. Koefisien waktu linear menangkap tren jangka panjang. Koefisien bulan yang signifikan mengkonfirmasi pola musiman yang kuat. R² yang tinggi menunjukkan model menjelaskan sebagian besar variasi penjualan bir.


3.4 (d) Plot Residual Standar – Model Musiman (dengan Simbol Bulan)

plot(t_beer, resid_seas_beer,
     type = "l", col = "grey70",
     main = "Residual Standar – Rata-rata Musiman + Tren Linear (Bir)",
     xlab = "Tahun", ylab = "Residual Standar")
points(t_beer, resid_seas_beer,
       pch = bln_beer, col = bln_beer, cex = 0.8)
abline(h =  0, lty = 2, col = "red")
abline(h =  2, lty = 3, col = "grey50")
abline(h = -2, lty = 3, col = "grey50")
legend("topright",
       legend = month.abb, pch = 1:12, col = 1:12,
       ncol = 4, cex = 0.65, title = "Bulan")

Interpretasi: Jika model memadai, simbol per bulan seharusnya tersebar tanpa pengelompokan vertikal (tidak ada musiman sisa). Pola melengkung menunjukkan tren non-linear yang belum tertangkap.


3.5 (e) Model Rata-rata Musiman + Tren Kuadratik

t_beer2            <- t_beer^2
fit_seas_quad_beer <- lm(y_beer ~ bln_fac_beer + t_beer + t_beer2)
summary(fit_seas_quad_beer)
## 
## Call:
## lm(formula = y_beer ~ bln_fac_beer + t_beer + t_beer2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.4384 -0.4550 -0.0350  0.3737  3.3229 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -5.540e+04  1.044e+04  -5.307 3.29e-07 ***
## bln_fac_beer2  -1.866e+00  2.482e-01  -7.519 2.61e-12 ***
## bln_fac_beer3   1.887e+00  2.482e-01   7.603 1.60e-12 ***
## bln_fac_beer4   2.109e+00  2.482e-01   8.497 7.59e-15 ***
## bln_fac_beer5   5.050e+00  2.482e-01  20.346  < 2e-16 ***
## bln_fac_beer6   7.828e+00  2.482e-01  31.539  < 2e-16 ***
## bln_fac_beer7   8.432e+00  2.482e-01  33.968  < 2e-16 ***
## bln_fac_beer8   7.405e+00  2.482e-01  29.827  < 2e-16 ***
## bln_fac_beer9   3.334e+00  2.483e-01  13.427  < 2e-16 ***
## bln_fac_beer10  1.432e+00  2.483e-01   5.766 3.53e-08 ***
## bln_fac_beer11 -7.014e-01  2.483e-01  -2.824  0.00528 ** 
## bln_fac_beer12 -2.030e-01  2.484e-01  -0.817  0.41492    
## t_beer          5.549e+01  1.053e+01   5.270 3.92e-07 ***
## t_beer2        -1.389e-02  2.655e-03  -5.231 4.70e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7019 on 178 degrees of freedom
## Multiple R-squared:  0.9706, Adjusted R-squared:  0.9685 
## F-statistic: 452.6 on 13 and 178 DF,  p-value: < 2.2e-16
resid_seas_quad_beer <- rstandard(fit_seas_quad_beer)

Interpretasi: Penambahan suku kuadratik memungkinkan tren jangka panjang melengkung. Koefisien kuadratik yang signifikan mengindikasikan pertumbuhan bir bersifat non-linear. Bandingkan R² dan galat standar sisa dengan model bagian (c).


3.6 (f) Plot Residual Standar – Model Musiman + Tren Kuadratik

plot(t_beer, resid_seas_quad_beer,
     type = "l", col = "grey70",
     main = "Residual Standar – Rata-rata Musiman + Tren Kuadratik (Bir)",
     xlab = "Tahun", ylab = "Residual Standar")
points(t_beer, resid_seas_quad_beer,
       pch = bln_beer, col = bln_beer, cex = 0.8)
abline(h =  0, lty = 2, col = "red")
abline(h =  2, lty = 3, col = "grey50")
abline(h = -2, lty = 3, col = "grey50")
legend("topright",
       legend = month.abb, pch = 1:12, col = 1:12,
       ncol = 4, cex = 0.65, title = "Bulan")

Interpretasi: Dibandingkan bagian (d), tren kuadratik seharusnya menghilangkan kelengkungan residual yang tersisa. Idealnya residual tersebar acak di sekitar nol tanpa pengelompokan musiman maupun tren.


4 Soal 3.8 – Total Penjualan Ritel Inggris

Data: retail — n = 255 observasi, Januari 1986 – Maret 2007.

4.1 (a) Plot Deret Waktu dengan Simbol Bulan dan Interpretasi

plot(t_ret, y_ret,
     type = "l", col = "grey70",
     main = "Penjualan Ritel Bulanan Inggris\n(Januari 1986 – Maret 2007)",
     xlab = "Tahun", ylab = "Indeks Penjualan Ritel (2000 = 100)")
points(t_ret, y_ret,
       pch = bln_ret, col = bln_ret, cex = 0.7)
legend("topleft",
       legend = month.abb, pch = 1:12, col = 1:12,
       ncol = 4, cex = 0.65, title = "Bulan")

Interpretasi: Penjualan ritel Inggris menunjukkan tren naik yang sangat kuat dari 1986 hingga 2007, hampir berlipat dua selama periode tersebut. Musiman juga jelas terlihat: Desember (belanja liburan) secara konsisten berada di puncak setiap tahun, sedangkan Januari turun tajam setelah Natal.


4.2 (b) Model Rata-rata Musiman + Tren Linear – Kuadrat Terkecil

bln_fac_ret <- factor(bln_ret)
fit_ret_lin <- lm(y_ret ~ bln_fac_ret + t_ret)
summary(fit_ret_lin)
## 
## Call:
## lm(formula = y_ret ~ bln_fac_ret + t_ret)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11.0580  -1.2953   0.3819   1.4997   9.4437 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -5.114e+03  5.332e+01 -95.916  < 2e-16 ***
## bln_fac_ret2   2.061e-01  7.884e-01   0.261    0.794    
## bln_fac_ret3   6.944e+00  7.884e-01   8.808 2.51e-16 ***
## bln_fac_ret4   7.132e+00  7.977e-01   8.940  < 2e-16 ***
## bln_fac_ret5   9.501e+00  7.977e-01  11.910  < 2e-16 ***
## bln_fac_ret6   1.152e+01  7.977e-01  14.444  < 2e-16 ***
## bln_fac_ret7   1.343e+01  7.977e-01  16.841  < 2e-16 ***
## bln_fac_ret8   1.450e+01  7.977e-01  18.181  < 2e-16 ***
## bln_fac_ret9   1.018e+01  7.977e-01  12.763  < 2e-16 ***
## bln_fac_ret10  9.441e+00  7.977e-01  11.835  < 2e-16 ***
## bln_fac_ret11  1.181e+01  7.978e-01  14.798  < 2e-16 ***
## bln_fac_ret12  3.166e+01  7.978e-01  39.678  < 2e-16 ***
## t_ret          2.600e+00  2.671e-02  97.353  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.615 on 242 degrees of freedom
## Multiple R-squared:   0.98,  Adjusted R-squared:  0.979 
## F-statistic: 988.6 on 12 and 242 DF,  p-value: < 2.2e-16
resid_ret_lin <- rstandard(fit_ret_lin)

Interpretasi: Indikator musiman menangkap deviasi bulanan sistematis (lonjakan Desember, penurunan Januari). Kemiringan positif yang signifikan mengkonfirmasi pertumbuhan jangka panjang penjualan ritel. R² yang tinggi mencerminkan kemampuan model menangkap tren dan musiman sekaligus.


4.3 (c) Plot Residual Standar dengan Simbol Bulan

plot(t_ret, resid_ret_lin,
     type = "l", col = "grey70",
     main = "Residual Standar – Rata-rata Musiman + Tren Linear (Ritel)",
     xlab = "Tahun", ylab = "Residual Standar")
points(t_ret, resid_ret_lin,
       pch = bln_ret, col = bln_ret, cex = 0.7)
abline(h =  0, lty = 2, col = "red")
abline(h =  2, lty = 3, col = "grey50")
abline(h = -2, lty = 3, col = "grey50")
legend("topright",
       legend = month.abb, pch = 1:12, col = 1:12,
       ncol = 4, cex = 0.65, title = "Bulan")

Interpretasi: Sebaran acak di sekitar nol tanpa pengelompokan bulan mengindikasikan model yang memadai. Pola melengkung menunjukkan tren non-linear; pengelompokan per bulan menunjukkan musiman sisa.


5 Soal 3.14 – Penjualan Ritel Inggris (Lanjutan Soal 3.8)

Menggunakan residual dari model Soal 3.8(b): resid_ret_lin.

5.1 (a) Residual Kuadrat Terkecil – Ringkasan dan Plot

cat("Ringkasan residual standar:\n")
## Ringkasan residual standar:
print(summary(resid_ret_lin))
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -4.35734 -0.50847  0.14948 -0.00057  0.58882  3.72124
plot(t_ret, resid_ret_lin,
     type = "o", pch = 16, cex = 0.5, col = "steelblue",
     main = "Residual Standar – Rata-rata Musiman + Tren Linear (Ritel)",
     xlab = "Tahun", ylab = "Residual Standar")
abline(h =  0, lty = 2, col = "red")
abline(h =  2, lty = 3, col = "grey50")
abline(h = -2, lty = 3, col = "grey50")


5.2 (b) Uji Runs pada Residual Standar

hasil_runs <- runs.test(resid_ret_lin)
print(hasil_runs)
## 
##  Runs Test - Two sided
## 
## data:  resid_ret_lin
## Standardized Runs Statistic = -10.353, p-value < 2.2e-16

Interpretasi: Uji runs memeriksa apakah urutan residual di atas/di bawah median bersifat acak. Nilai p < 0,05 berarti terlalu sedikit atau terlalu banyak runs — bukti adanya autokorelasi pada residual, sehingga suku galat tidak independen dan model deret waktu (ARIMA) perlu dipertimbangkan.


5.3 (c) Autokorelasi Sampel (ACF) Residual Standar

acf(resid_ret_lin,
    lag.max = 36,
    main    = "ACF Residual Standar – Ritel\n(Rata-rata Musiman + Tren Linear)",
    col     = "steelblue",
    lwd     = 2)

Interpretasi: Pada white noise, hampir semua autokorelasi seharusnya berada di dalam batas kepercayaan 95% (garis putus-putus ±1,96/√n). Lonjakan signifikan pada lag 1 menunjukkan ketergantungan serial jangka pendek. Lonjakan pada lag 12 dan 24 mengindikasikan autokorelasi musiman yang masih tersisa, sehingga pemodelan ARIMA pada residual direkomendasikan.


5.4 (d) Normalitas Residual Standar

5.4.1 Histogram dengan Kurva Normal

hist(resid_ret_lin,
     breaks = 20, freq = FALSE,
     main   = "Histogram Residual Standar (Ritel)",
     xlab   = "Residual Standar",
     col    = "lightblue", border = "white")
curve(dnorm(x,
            mean = mean(resid_ret_lin),
            sd   = sd(resid_ret_lin)),
      add = TRUE, col = "red", lwd = 2)

5.4.2 Plot Probabilitas Normal (Q-Q Plot)

qqnorm(resid_ret_lin,
       main = "Q-Q Plot Residual Standar (Ritel)",
       pch = 16, col = "steelblue", cex = 0.7)
qqline(resid_ret_lin, col = "red", lwd = 2)

5.4.3 Uji Normalitas Formal

sw <- shapiro.test(resid_ret_lin)
cat("Uji Shapiro-Wilk:\n")
## Uji Shapiro-Wilk:
print(sw)
## 
##  Shapiro-Wilk normality test
## 
## data:  resid_ret_lin
## W = 0.95613, p-value = 5.555e-07
ad <- ad.test(resid_ret_lin)
cat("\nUji Anderson-Darling:\n")
## 
## Uji Anderson-Darling:
print(ad)
## 
##  Anderson-Darling normality test
## 
## data:  resid_ret_lin
## A = 3.0518, p-value = 1.118e-07

Interpretasi:

  • Histogram: Histogram berbentuk lonceng simetris yang mendekati kurva merah mendukung asumsi normalitas. Kemencengan atau ekor berat mengindikasikan penyimpangan.
  • Q-Q Plot: Titik-titik mengikuti garis referensi mendukung normalitas. Kurva berbentuk S mengindikasikan ekor ringan/berat; lengkungan sistematis menunjukkan kemencengan.
  • Shapiro-Wilk / Anderson-Darling: Nilai p < 0,05 memberikan bukti statistik terhadap normalitas. Pada sampel besar bahkan penyimpangan kecil pun bisa signifikan, sehingga Q-Q plot lebih informatif untuk menilai kepentingan praktisnya.