# ========================================================================
# 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   :  shella yuastari
# NRP    :  5003251193
# Kelas  :  statistika D
# =============================================================================

# -----------------------------------------------------------------------------
# Persiapan data
# -----------------------------------------------------------------------------
# AirPassengers: jumlah penumpang bulanan 1949-1960 (dalam ribuan).
# Restruktur sebagai matriks: tiap kolom = 1 tahun, tiap baris = 1 bulan.

data(AirPassengers)

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]
  }
  
  rata_rata <- total / n
  
  return(rata_rata)
}

# gunakan arith_mean() untuk menghitung rata-rata tiap kolom df

Y_bar <- numeric(12)

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

# Tampilkan hasil
names(Y_bar) <- 1949:1960
print(Y_bar)
    1949     1950     1951     1952     1953     1954     1955 
126.6667 139.6667 170.1667 197.0000 225.0000 238.9167 284.0000 
    1956     1957     1958     1959     1960 
328.2500 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)
  
  # faktor pertumbuhan
  r <- numeric(n - 1)
  
  for(i in 2:n){
    r[i-1] <- y[i] / y[i-1]
  }
  
  # hitung geometric mean
  hasil_kali <- 1
  
  for(i in 1:length(r)){
    hasil_kali <- hasil_kali * r[i]
  }
  
  GM <- hasil_kali^(1/(n-1))
  
  # persen pertumbuhan
  g_bar <- (GM - 1) * 100
  
  return(list(
    r = r,
    GM = GM,
    g_bar = g_bar
  ))
}

# Hitung geometric mean growth
results_GM <- geo_mean_growth(Y_bar)

print(results_GM$r)
 [1] 1.102632 1.218377 1.157689 1.142132 1.061852 1.188699 1.155810
 [8] 1.122366 1.034155 1.124234 1.111673
print(results_GM$GM)
[1] 1.127928
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
# g_AM   = (AM - 1) * 100%

AM <- arith_mean(results_GM$r)

g_bar_AM <- (AM - 1) * 100

print(AM)
[1] 1.129056
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]

# prediksi dengan geometric mean
Y_hat_GM <- Y_1949 * (results_GM$GM)^11

# prediksi dengan arithmetic mean
Y_hat_AM <- Y_1949 * (AM)^11

# error absolut
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 \n", Y_hat_AM))
  
  cat("\n")
  
  cat(sprintf("err_GM   : %10.3f \n", err_GM))
  cat(sprintf("err_AM   : %10.3f \n", err_AM))
}
Y_hat_GM :    476.167 
Y_hat_AM :    481.431 

err_GM   :      0.000 
err_AM   :      5.264 
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQotLS0NCg0KYGBge3J9DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBFVFMgS09NUFVUQVNJIFNUQVRJU1RJS0EgLSBTRU1FU1RFUiBHRU5BUCAyMDI1LzIwMjYNCiMgU29hbCAxIC0gRGF0YXNldDogQWlyUGFzc2VuZ2Vycw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUGV0dW5qdWsgdW11bToNCiMgIDEuIEtlcmpha2FuIG1lbmdndW5ha2FuIGJhaGFzYSBwZW1yb2dyYW1hbiBSLg0KIyAgMi4gU2V0aWFwIG5vbW9yIGRpa2VyamFrYW4gZGFsYW0gZmlsZSBSIHNjcmlwdCB0ZXJwaXNhaC4NCiMgIDMuIEZvcm1hdCBwZW5hbWFhbiBmaWxlOiBOb21vcl9OUlBfTmFtYS5SICAobWlzLiAxXzUwMDMyMjEwMDFfQnVkaS5SKQ0KIyAgNC4gSWt1dGkga2V0ZW50dWFuIHBlbmdndW5hYW4gZnVuZ3NpIGJ1aWx0LWluIHBhZGEgbWFzaW5nLW1hc2luZyBzdWItc29hbC4NCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTmFtYSAgIDogIHNoZWxsYSB5dWFzdGFyaQ0KIyBOUlAgICAgOiAgNTAwMzI1MTE5Mw0KIyBLZWxhcyAgOiAgc3RhdGlzdGlrYSBEDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUGVyc2lhcGFuIGRhdGENCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQWlyUGFzc2VuZ2VyczoganVtbGFoIHBlbnVtcGFuZyBidWxhbmFuIDE5NDktMTk2MCAoZGFsYW0gcmlidWFuKS4NCiMgUmVzdHJ1a3R1ciBzZWJhZ2FpIG1hdHJpa3M6IHRpYXAga29sb20gPSAxIHRhaHVuLCB0aWFwIGJhcmlzID0gMSBidWxhbi4NCg0KZGF0YShBaXJQYXNzZW5nZXJzKQ0KDQpkZiA8LSBtYXRyaXgoQWlyUGFzc2VuZ2VycywgbnJvdyA9IDEyLCBuY29sID0gMTIpDQpjb2xuYW1lcyhkZikgPC0gMTk0OToxOTYwDQpyb3duYW1lcyhkZikgPC0gbW9udGguYWJiDQoNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAoYSkgRnVuZ3NpIGFyaXRoX21lYW4oKSAtIFRBTlBBIGZ1bmdzaSBidWlsdC1pbiBtZWFuKCkgZGFuIHN1bSgpDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIFJ1bXVzOiBZX2JhciA9ICgxL24pICogc3VtX3tpPTF9Xm4gWV9pDQojIFRlcmFwa2FuIGtlIHRpYXAga29sb20gKHRhaHVuKSAtPiBzaW1wYW4ga2UgdmVrdG9yIFlfYmFyIChwYW5qYW5nIDEyKS4NCg0KYXJpdGhfbWVhbiA8LSBmdW5jdGlvbih4KSB7DQogIA0KICB0b3RhbCA8LSAwDQogIG4gPC0gbGVuZ3RoKHgpDQogIA0KICBmb3IoaSBpbiAxOm4pew0KICAgIHRvdGFsIDwtIHRvdGFsICsgeFtpXQ0KICB9DQogIA0KICByYXRhX3JhdGEgPC0gdG90YWwgLyBuDQogIA0KICByZXR1cm4ocmF0YV9yYXRhKQ0KfQ0KDQojIGd1bmFrYW4gYXJpdGhfbWVhbigpIHVudHVrIG1lbmdoaXR1bmcgcmF0YS1yYXRhIHRpYXAga29sb20gZGYNCg0KWV9iYXIgPC0gbnVtZXJpYygxMikNCg0KZm9yKGogaW4gMTpuY29sKGRmKSl7DQogIFlfYmFyW2pdIDwtIGFyaXRoX21lYW4oZGZbLGpdKQ0KfQ0KDQojIFRhbXBpbGthbiBoYXNpbA0KbmFtZXMoWV9iYXIpIDwtIDE5NDk6MTk2MA0KcHJpbnQoWV9iYXIpDQoNCiMgVmFsaWRhc2kgamF3YWJhbg0KcHJpbnQoY29sTWVhbnMoZGYpID09IFlfYmFyKQ0KYGBgDQoNCg0KYGBge3J9DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIChiKSBGdW5nc2kgZ2VvX21lYW5fZ3Jvd3RoKCkgLSBHZW9tZXRyaWMgTWVhbiBHcm93dGgNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgTGFuZ2thaDoNCiMgIChpKSAgIEhpdHVuZyBmYWt0b3IgcGVydHVtYnVoYW4gcl90ID0gWV90IC8gWV97dC0xfSwgdW50dWsgdCA9IDIuLm4NCiMgIChpaSkgIEdNID0gKHJfMiAqIHJfMyAqIC4uLiAqIHJfbileKDEvKG4tMSkpDQojICAoaWlpKSBnX2JhciA9IChHTSAtIDEpICogMTAwJQ0KDQpnZW9fbWVhbl9ncm93dGggPC0gZnVuY3Rpb24oeSkgew0KICANCiAgbiA8LSBsZW5ndGgoeSkNCiAgDQogICMgZmFrdG9yIHBlcnR1bWJ1aGFuDQogIHIgPC0gbnVtZXJpYyhuIC0gMSkNCiAgDQogIGZvcihpIGluIDI6bil7DQogICAgcltpLTFdIDwtIHlbaV0gLyB5W2ktMV0NCiAgfQ0KICANCiAgIyBoaXR1bmcgZ2VvbWV0cmljIG1lYW4NCiAgaGFzaWxfa2FsaSA8LSAxDQogIA0KICBmb3IoaSBpbiAxOmxlbmd0aChyKSl7DQogICAgaGFzaWxfa2FsaSA8LSBoYXNpbF9rYWxpICogcltpXQ0KICB9DQogIA0KICBHTSA8LSBoYXNpbF9rYWxpXigxLyhuLTEpKQ0KICANCiAgIyBwZXJzZW4gcGVydHVtYnVoYW4NCiAgZ19iYXIgPC0gKEdNIC0gMSkgKiAxMDANCiAgDQogIHJldHVybihsaXN0KA0KICAgIHIgPSByLA0KICAgIEdNID0gR00sDQogICAgZ19iYXIgPSBnX2Jhcg0KICApKQ0KfQ0KDQojIEhpdHVuZyBnZW9tZXRyaWMgbWVhbiBncm93dGgNCnJlc3VsdHNfR00gPC0gZ2VvX21lYW5fZ3Jvd3RoKFlfYmFyKQ0KDQpwcmludChyZXN1bHRzX0dNJHIpDQpwcmludChyZXN1bHRzX0dNJEdNKQ0KcHJpbnQocmVzdWx0c19HTSRnX2JhcikNCmBgYA0KDQpgYGB7cn0NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIChjKSBBcml0aG1ldGljIE1lYW4gZGFyaSBmYWt0b3IgcGVydHVtYnVoYW4gcl90DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBBTSAgICAgPSAoMS8obi0xKSkgKiBzdW0ocl90KSwgIHQgPSAyLi5uDQojIGdfQU0gICA9IChBTSAtIDEpICogMTAwJQ0KDQpBTSA8LSBhcml0aF9tZWFuKHJlc3VsdHNfR00kcikNCg0KZ19iYXJfQU0gPC0gKEFNIC0gMSkgKiAxMDANCg0KcHJpbnQoQU0pDQpwcmludChnX2Jhcl9BTSkNCg0KYGBgDQoNCmBgYHtyfQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgKGQpIFByZWRpa3NpIFlfYmFyXzE5NjAgZGFuIHBlcmJhbmRpbmdhbg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgWV9oYXRfMTk2MCA9IFlfYmFyXzE5NDkgKiAoMSArIGdfYmFyKV4xMQ0KIyBIaXR1bmcgdW50dWsgZ19iYXIgZGFyaSBHTSAoYikgZGFuIGRhcmkgQU0gKGMpLg0KIyBMYWx1IGhpdHVuZyBzZWxpc2loIGFic29sdXQgdGVyaGFkYXAgbmlsYWkgYWt0dWFsIFlfYmFyXzE5NjAuDQoNCllfMTk0OSA8LSBZX2JhclsxXQ0KWV8xOTYwIDwtIFlfYmFyWzEyXQ0KDQojIHByZWRpa3NpIGRlbmdhbiBnZW9tZXRyaWMgbWVhbg0KWV9oYXRfR00gPC0gWV8xOTQ5ICogKHJlc3VsdHNfR00kR00pXjExDQoNCiMgcHJlZGlrc2kgZGVuZ2FuIGFyaXRobWV0aWMgbWVhbg0KWV9oYXRfQU0gPC0gWV8xOTQ5ICogKEFNKV4xMQ0KDQojIGVycm9yIGFic29sdXQNCmVycl9HTSA8LSBhYnMoWV9oYXRfR00gLSBZXzE5NjApDQplcnJfQU0gPC0gYWJzKFlfaGF0X0FNIC0gWV8xOTYwKQ0KDQp7DQogIGNhdChzcHJpbnRmKCJZX2hhdF9HTSA6ICUxMC4zZiBcbiIsIFlfaGF0X0dNKSkNCiAgY2F0KHNwcmludGYoIllfaGF0X0FNIDogJTEwLjNmIFxuIiwgWV9oYXRfQU0pKQ0KICANCiAgY2F0KCJcbiIpDQogIA0KICBjYXQoc3ByaW50ZigiZXJyX0dNICAgOiAlMTAuM2YgXG4iLCBlcnJfR00pKQ0KICBjYXQoc3ByaW50ZigiZXJyX0FNICAgOiAlMTAuM2YgXG4iLCBlcnJfQU0pKQ0KfQ0KYGBgDQoNCg0K