# ========================================================================
# 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