Bagian A: Data Cuaca

Eksplorasi deskriptif untuk data suhu harian di Kota Semarang selama 10 hari terakhir.

# Menginput data deret suhu harian
suhu <- c(32, 33, 31, 34, 35, 30, 29, 33, 32, 34)

# a. Perhitungan statistik deskriptif dasar
rata_suhu   <- mean(suhu)
median_suhu <- median(suhu)
sd_suhu     <- sd(suhu)

cat("Rata-rata suhu       :", round(rata_suhu, 2), "°C\n")
#> Rata-rata suhu       : 32.3 °C
cat("Median suhu          :", median_suhu, "°C\n")
#> Median suhu          : 32.5 °C
cat("Standar deviasi suhu :", round(sd_suhu, 2), "°C\n")
#> Standar deviasi suhu : 1.89 °C
# b. Menentukan hari dengan temperatur tertinggi
idx_panas <- which.max(suhu)
cat("Suhu puncak tercatat pada hari ke-", idx_panas, "sebesar", suhu[idx_panas], "°C\n")
#> Suhu puncak tercatat pada hari ke- 5 sebesar 35 °C
# c. Menghitung frekuensi hari di atas rata-rata
hari_panas <- sum(suhu > rata_suhu)
cat("Banyaknya hari dengan suhu di atas rata-rata:", hari_panas, "hari\n")
#> Banyaknya hari dengan suhu di atas rata-rata: 5 hari

Bagian B: Data Transportasi

Analisis data operasional harian armada Trans Semarang (dalam satuan ribuan penumpang).

penumpang <- c(45, 52, 49, 60, 55, 70, 65)
hari      <- c("Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu")

# a. Pembuatan data frame transportasi
df_transport <- data.frame(
  hari = factor(hari, levels = hari),
  penumpang = penumpang
)
df_transport
#>     hari penumpang
#> 1  Senin        45
#> 2 Selasa        52
#> 3   Rabu        49
#> 4  Kamis        60
#> 5  Jumat        55
#> 6  Sabtu        70
#> 7 Minggu        65
# b. Rata-rata penumpang khusus hari kerja (Senin - Jumat)
hari_kerja <- c("Senin", "Selasa", "Rabu", "Kamis", "Jumat")
rata_weekdays <- mean(df_transport$penumpang[df_transport$hari %in% hari_kerja])
cat("Rata-rata volume penumpang hari kerja (Senin-Jumat):", round(rata_weekdays, 2), "ribu orang\n")
#> Rata-rata volume penumpang hari kerja (Senin-Jumat): 52.2 ribu orang
# c. Hari operasional dengan penumpang tertinggi
hari_puncak <- df_transport$hari[which.max(df_transport$penumpang)]
cat("Puncak kepadatan penumpang terjadi pada hari:", as.character(hari_puncak), "\n")
#> Puncak kepadatan penumpang terjadi pada hari: Sabtu
# d. Evaluasi persentase lonjakan penumpang dari Senin ke Sabtu
penumpang_senin <- df_transport$penumpang[df_transport$hari == "Senin"]
penumpang_sabtu <- df_transport$penumpang[df_transport$hari == "Sabtu"]

lonjakan_persen <- ((penumpang_sabtu - penumpang_senin) / penumpang_senin) * 100
cat("Kenaikan penumpang Senin ke Sabtu:", round(lonjakan_persen, 2), "%\n")
#> Kenaikan penumpang Senin ke Sabtu: 55.56 %

Bagian C: Data Ekonomi

Pemeriksaan volatilitas dan perubahan tren harga komoditas beras mingguan.

harga_beras <- c(12000, 12200, 12150, 12300, 12400, 12500, 12600, 12750)
minggu      <- 1:8

# a. Penyusunan data frame pergerakan harga
df_beras <- data.frame(minggu = minggu, harga = harga_beras)
df_beras
#>   minggu harga
#> 1      1 12000
#> 2      2 12200
#> 3      3 12150
#> 4      4 12300
#> 5      5 12400
#> 6      6 12500
#> 7      7 12600
#> 8      8 12750
# c. Menghitung fluktuasi/selisih antar minggu berurutan
selisih_harga <- diff(df_beras$harga)
cat("Perubahan harga antar minggu (diff):\n")
#> Perubahan harga antar minggu (diff):
selisih_harga
#> [1] 200 -50 150 100 100 100 150
# b. Rata-rata kenaikan harga per minggu
rata_naik <- mean(selisih_harga)
cat("Rata-rata pertumbuhan harga per minggu: Rp", round(rata_naik, 2), "\n")
#> Rata-rata pertumbuhan harga per minggu: Rp 107.14
# d. Periode dengan lompatan kenaikan tertinggi
# diff() bergeser 1 periode ke depan, sehingga minggu tujuan = index + 1
idx_lonjakan <- which.max(selisih_harga)
minggu_puncak <- df_beras$minggu[idx_lonjakan + 1]

cat("Lonjakan harga tertinggi terjadi pada minggu ke-", minggu_puncak,
    "sebesar Rp", max(selisih_harga), "\n")
#> Lonjakan harga tertinggi terjadi pada minggu ke- 2 sebesar Rp 200

Bagian D: Matriks Populasi

Manipulasi data kependudukan tabular menggunakan operasi matriks dan fungsi agregasi apply().

# Inisialisasi matriks kependudukan (ribuan jiwa)
populasi <- matrix(
  c(
    50, 55, 60, 65, # Kec_A
    40, 42, 45, 47, # Kec_B
    70, 72, 74, 76  # Kec_C
  ),
  nrow = 3,
  byrow = TRUE
)

rownames(populasi) <- c("Kec_A", "Kec_B", "Kec_C")
colnames(populasi) <- c("2019", "2020", "2021", "2022")
populasi
#>       2019 2020 2021 2022
#> Kec_A   50   55   60   65
#> Kec_B   40   42   45   47
#> Kec_C   70   72   74   76
# a. Rata-rata laju pertumbuhan penduduk per tahun tiap kecamatan
# MARGIN = 1 mengeksekusi fungsi per baris
laju_tumbuh <- apply(populasi, 1, function(baris) mean(diff(baris)))
cat("Pertumbuhan penduduk rata-rata tahunan tiap kecamatan:\n")
#> Pertumbuhan penduduk rata-rata tahunan tiap kecamatan:
round(laju_tumbuh, 2)
#> Kec_A Kec_B Kec_C 
#>  5.00  2.33  2.00
# b. Kecamatan dengan jumlah penduduk terbesar pada tahun 2022
pop_2022 <- populasi[, "2022"]
kec_terpadat <- names(which.max(pop_2022))
cat("Kecamatan dengan populasi terbesar pada tahun 2022:", kec_terpadat, 
    "(", max(pop_2022), "ribu jiwa)\n")
#> Kecamatan dengan populasi terbesar pada tahun 2022: Kec_C ( 76 ribu jiwa)
# c. Akumulasi total penduduk per tahun
# MARGIN = 2 mengeksekusi agregasi per kolom
total_tahunan <- apply(populasi, 2, sum)
cat("Total populasi keseluruhan per tahun:\n")
#> Total populasi keseluruhan per tahun:
total_tahunan
#> 2019 2020 2021 2022 
#>  160  169  179  188

Bagian E: Fungsi Custom

Pembuatan fungsi deteksi anomali/lonjakan harga berbasis ambang batas (threshold).

# Definisi fungsi deteksi lonjakan kenaikan harga
deteksi_kenaikan <- function(vektor_harga, ambang_batas = 200) {
  # Evaluasi diferensiasi harga mingguan
  delta <- diff(vektor_harga)
  
  # Cari indeks periode yang melebihi batas kenaikan
  minggu_terdeteksi <- which(delta > ambang_batas) + 1
  return(minggu_terdeteksi)
}

# Pengujian fungsi custom terhadap data harga beras
lonjakan_beras <- deteksi_kenaikan(df_beras$harga)
cat("Kenaikan harga di atas Rp 200 terjadi pada minggu ke-:", lonjakan_beras, "\n")
#> Kenaikan harga di atas Rp 200 terjadi pada minggu ke-: