=============================================================================

ETS KOMPUTASI STATISTIKA - SEMESTER GENAP 2025/2026

Soal 1 - Dataset: AirPassengers

—————————————————————————–

Petunjuk umum:

1. Kerjakan menggunakan bahasa pemrograman R.

2. Setiap nomor dikerjakan dalam file R script terpisah.

3. Format penamaan file: Nomor_NRP_Nama.R (mis. 1_5003221001_Budi.R)

4. Ikuti ketentuan penggunaan fungsi built-in pada masing-masing sub-soal.

—————————————————————————–

Nama : Ancova Wilcah Diawara Amar

NRP : 5003251041

Kelas : D

=============================================================================

—————————————————————————–

Persiapan data

—————————————————————————–

AirPassengers: jumlah penumpang bulanan 1949-1960 (dalam ribuan).

Restruktur sebagai matriks: tiap kolom = 1 tahun, tiap baris = 1 bulan.

df <- matrix(AirPassengers, nrow = 12, ncol = 12)
colnames(df) <- 1949:1960
rownames(df) <- month.abb

=============================================================================

(a) Fungsi arith_mean() - TANPA fungsi built-in mean() dan sum()

=============================================================================

Rumus: Y_bar = (1/n) * sum_{i=1}^n Y_i

Terapkan ke tiap kolom (tahun) -> simpan ke vektor Y_bar (panjang 12).

arith_mean <- function(x) {
  total <- 0
  n <- length(x)
  
  for(i in 1:n){
    total <- total + x[i]
  }
  
  total / n
}

TODO: gunakan arith_mean() untuk menghitung rata-rata tiap kolom df

Y_bar <- c()

for(i in 1:ncol(df)){
  Y_bar[i] <- arith_mean(df[, i])
}

Tampilkan hasil

names(Y_bar) <- 1949:1960
print(Y_bar)
##     1949     1950     1951     1952     1953     1954     1955     1956 
## 126.6667 139.6667 170.1667 197.0000 225.0000 238.9167 284.0000 328.2500 
##     1957     1958     1959     1960 
## 368.4167 381.0000 428.3333 476.1667

Validasi jawaban

print(colMeans(df) == Y_bar)
## 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 
## TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

=============================================================================

(b) Fungsi geo_mean_growth() - Geometric Mean Growth

=============================================================================

Langkah:

(i) Hitung faktor pertumbuhan r_t = Y_t / Y_{t-1}, untuk t = 2..n

(ii) GM = (r_2 * r_3 * … * r_n)^(1/(n-1))

(iii) g_bar = (GM - 1) * 100%

geo_mean_growth <- function(y) {
  n <- length(y)
  
  r <- c()
  
  for(i in 2:n){
    r[i - 1] <- y[i] / y[i - 1]
  }
  
  hasil <- 1
  
  for(i in 1:length(r)){
    hasil <- hasil * r[i]
  }
  
  GM <- hasil^(1 / (n - 1))
  
  g_bar <- (GM - 1) * 100
  
  list(r = r, GM = GM, g_bar = g_bar)
  
}

Hitung geometric mean growth

results_GM <- geo_mean_growth(Y_bar)
print(results_GM$g_bar)
## [1] 12.79284

=============================================================================

(c) Arithmetic Mean dari faktor pertumbuhan r_t

=============================================================================

AM = (1/(n-1)) * sum(r_t), t = 2..n -> gunakan arith_mean()

g_AM = (AM - 1) * 100%

AM       <- arith_mean(results_GM$r)
g_bar_AM <- (AM - 1) * 100
print(g_bar_AM)
## [1] 12.90563

=============================================================================

(d) Prediksi Y_bar_1960 dan perbandingan

=============================================================================

Y_hat_1960 = Y_bar_1949 * (1 + g_bar)^11

Hitung untuk g_bar dari GM (b) dan dari AM (c).

Lalu hitung selisih absolut terhadap nilai aktual Y_bar_1960.

Y_1949 <- Y_bar[1]
Y_1960 <- Y_bar[12]

Y_hat_GM <- Y_1949 * (1 + results_GM$g_bar / 100)^11
Y_hat_AM <- Y_1949 * (1 + g_bar_AM / 100)^11

err_GM <- abs(Y_hat_GM - Y_1960)
err_AM <- abs(Y_hat_AM - Y_1960)

{
  cat(sprintf("Y_hat_GM : %10.3f \n", Y_hat_GM))
  cat(sprintf("Y_hat_AM : %10.3f", Y_hat_AM))
  cat("\n\n")
  cat(sprintf("err_GM : %10.3f \n", err_GM ))
  cat(sprintf("err_AM : %10.3f", err_AM))
}
## Y_hat_GM :    476.167 
## Y_hat_AM :    481.431
## 
## err_GM :      0.000 
## err_AM :      5.264