Pendahuluan

Tujuan Praktikum

Setelah mengerjakan modul ini, kamu diharapkan mampu:

  1. Membuat dan mengolah data dalam bentuk vektor dan data frame di R.
  2. Menggunakan percabangan (if, else if, else) dan case_when untuk mengambil keputusan berdasarkan kondisi.
  3. Menghitung jumlah, selisih, persentase, dan jumlah kumulatif dari data.
  4. Menyimpulkan hasil olahan data untuk membantu pengambilan keputusan.

Deskripsi Kasus

Sebuah konser menjual tiket selama dua hari penjualan. Tiket terbagi dalam empat kelas. Nomor kursi diberikan per kelas berdasarkan urutan pembelian. Artinya, pembeli pertama di kelas Gold mendapat Gold nomor 1, pembeli kedua di kelas Gold mendapat Gold nomor 2, dan seterusnya. Hal yang sama berlaku untuk kelas lain.

Kapasitas dan harga tiket hari ke-1:

Kelas Kapasitas kursi Harga hari ke-1 (Rp)
Gold 9 750.000
Silver 24 500.000
Bronze 32 350.000
Regular 115 150.000
Total 180

Data Pembeli

  1. Hari ke-1: 101 pembeli dengan ID 101 sampai 201.
  2. Hari ke-2: 60 pembeli dengan ID 202 sampai 261.

Pilihan kelas tiap pembeli sudah berurutan sesuai ID dan ditulis pada bagian data awal di bawah.

Aturan Perubahan Harga Hari ke-2

Harga hari ke-2 ditentukan per kelas berdasarkan persentase kursi kelas tersebut yang terjual pada hari ke-1:

Kursi kelas yang terjual di hari ke-1 Perubahan harga hari ke-2
Lebih dari 70% kapasitas kelas Harga naik 15%
30% sampai 70% (termasuk 30% dan 70%) Harga tetap
Kurang dari 30% kapasitas kelas Harga turun 15%

Daftar Pertanyaan

  1. Buatlah data frame hari ke-1 berisi ID, kelas, dan harga tiap pembeli.
  2. Tambahkan kolom nomor urut kursi per kelas dan harga kumulatif.
  3. Hitunglah jumlah terjual dan sisa kursi tiap kelas setelah hari ke-1.
  4. Tentukan harga tiap kelas pada hari ke-2 menggunakan percabangan.
  5. Buatlah data frame hari ke-2 (ID, kelas, harga, nomor urut kursi). Nomor urut melanjutkan hari ke-1.
  6. Gabungkan data kedua hari, hitung harga kumulatif keseluruhan, lalu buat tabel terpisah untuk tiap kelas.
  7. Kesimpulan: hitunglah total pendapatan, sisa kursi, dan persentase keterisian, lalu tentukan apakah seluruh tiket terjual habis serta berikan saran.

Persiapan dan Data Awal

Sebelum mengerjakan soal, panggil paket yang dibutuhkan dan siapkan data awal. Paket dplyr dipakai untuk fungsi case_when() dan filter().

library(dplyr)

# Supaya angka besar tidak tampil dalam bentuk ilmiah (contoh 5e+05)
options(scipen = 999)

# Kapasitas kursi tiap kelas
jumlah_kursi_gold    <- 9
jumlah_kursi_silver  <- 24
jumlah_kursi_bronze  <- 32
jumlah_kursi_regular <- 115
kapasitas_total_kursi <- jumlah_kursi_gold + jumlah_kursi_silver +
  jumlah_kursi_bronze + jumlah_kursi_regular

# Harga tiket hari ke-1
harga_gold_day1    <- 750000
harga_silver_day1  <- 500000
harga_bronze_day1  <- 350000
harga_regular_day1 <- 150000

# Data pembeli hari ke-1 (ID 101 sampai 201, 101 pembeli)
no_id_day1 <- 101:201

kelas_day1 <- c(
  "Bronze", "Regular", "Regular", "Regular", "Silver", "Bronze", "Regular", "Regular", "Regular", "Gold",
  "Silver", "Silver", "Regular", "Bronze", "Regular", "Regular", "Silver", "Bronze", "Silver", "Bronze",
  "Regular", "Bronze", "Regular", "Silver", "Regular", "Bronze", "Bronze", "Bronze", "Regular", "Regular",
  "Regular", "Regular", "Regular", "Regular", "Regular", "Regular", "Gold", "Regular", "Regular", "Silver",
  "Regular", "Silver", "Regular", "Regular", "Regular", "Silver", "Regular", "Regular", "Regular", "Regular",
  "Regular", "Regular", "Regular", "Regular", "Regular", "Silver", "Silver", "Regular", "Regular", "Silver",
  "Gold", "Silver", "Regular", "Gold", "Regular", "Silver", "Regular", "Regular", "Regular", "Silver",
  "Regular", "Regular", "Regular", "Regular", "Regular", "Gold", "Regular", "Regular", "Regular", "Regular",
  "Regular", "Regular", "Regular", "Gold", "Regular", "Regular", "Regular", "Regular", "Gold", "Regular",
  "Regular", "Regular", "Regular", "Regular", "Regular", "Regular", "Regular", "Regular", "Regular", "Regular",
  "Regular"
)

# Data pembeli hari ke-2 (ID 202 sampai 261, 60 pembeli)
no_id_day2 <- 202:261

kelas_day2 <- c(
  "Silver", "Silver", "Regular", "Regular", "Regular", "Regular", "Regular",
  "Regular", "Regular", "Regular", "Regular", "Regular", "Regular", "Regular",
  "Regular", "Regular", "Regular", "Regular", "Regular", "Regular", "Regular",
  "Regular", "Regular", "Regular", "Regular", "Regular", "Regular", "Regular",
  "Regular", "Regular", "Silver", "Regular", "Silver", "Silver", "Bronze",
  "Bronze", "Bronze", "Bronze", "Bronze", "Bronze", "Bronze", "Bronze",
  "Bronze", "Bronze", "Bronze", "Bronze", "Bronze", "Bronze", "Bronze",
  "Bronze", "Bronze", "Bronze", "Bronze", "Bronze", "Bronze", "Gold", "Gold",
  "Silver", "Silver", "Regular"
)

Kita cek dulu bahwa jumlah pembeli di kedua hari sesuai dengan soal.

length(kelas_day1)   # harus 101
## [1] 101
length(kelas_day2)   # harus 60
## [1] 60

Soal 1: Data Frame Hari Ke-1

Pertanyaan: Buatlah data frame hari ke-1 berisi ID, kelas, dan harga tiap pembeli.

Petunjuk: Harga tiap pembeli bergantung pada kelasnya. Fungsi case_when() memeriksa kondisi satu per satu dari atas ke bawah dan memberi nilai sesuai kondisi yang pertama terpenuhi. Baris TRUE ~ ... berfungsi sebagai “selain itu” (seperti else).

Penyelesaian:

harga_day1 <- case_when(
  kelas_day1 == "Gold"   ~ harga_gold_day1,
  kelas_day1 == "Silver" ~ harga_silver_day1,
  kelas_day1 == "Bronze" ~ harga_bronze_day1,
  TRUE                   ~ harga_regular_day1
)

data_day1 <- data.frame(
  no_id = no_id_day1,
  kelas = kelas_day1,
  harga = harga_day1
)

head(data_day1, 10)

Soal 2: Nomor Urut Kursi dan Harga Kumulatif

Pertanyaan: Tambahkan kolom nomor urut kursi per kelas dan harga kumulatif.

Petunjuk:

  1. Nomor urut kursi per kelas didapat dengan menghitung berapa kali kelas tersebut sudah muncul sampai pembeli ke-i. Gunakan sum(kelas_day1[1:i] == "Gold") untuk menghitung jumlah Gold dari pembeli pertama sampai pembeli ke-i.
  2. Harga kumulatif adalah jumlah harga yang berjalan, dihitung dengan cumsum().

Penyelesaian:

# Nomor urut kursi per kelas
no_urut_tiap_kelas_day1 <- c()

for (i in 1:length(no_id_day1)) {
  if (kelas_day1[i] == "Gold") {
    no_urut_tiap_kelas_day1[i] <- sum(kelas_day1[1:i] == "Gold")
  } else if (kelas_day1[i] == "Silver") {
    no_urut_tiap_kelas_day1[i] <- sum(kelas_day1[1:i] == "Silver")
  } else if (kelas_day1[i] == "Bronze") {
    no_urut_tiap_kelas_day1[i] <- sum(kelas_day1[1:i] == "Bronze")
  } else {
    no_urut_tiap_kelas_day1[i] <- sum(kelas_day1[1:i] == "Regular")
  }
}

# Harga kumulatif hari ke-1
harga_kumulatif_day1 <- cumsum(harga_day1)

data_day1$no_urut <- no_urut_tiap_kelas_day1
data_day1$harga_kumulatif <- harga_kumulatif_day1

head(data_day1, 10)

Soal 3: Jumlah Terjual dan Sisa Kursi Setelah Hari Ke-1

Pertanyaan: Hitunglah jumlah terjual dan sisa kursi tiap kelas setelah hari ke-1.

Petunjuk: Mulai dari kapasitas penuh, lalu kurangi sisa kursi satu per satu setiap ada pembeli di kelas tersebut. Jumlah terjual adalah kapasitas awal dikurangi sisa.

Penyelesaian:

# Kapasitas awal tiap kelas
total_gold    <- jumlah_kursi_gold
total_silver  <- jumlah_kursi_silver
total_bronze  <- jumlah_kursi_bronze
total_regular <- jumlah_kursi_regular

# Sisa kursi dimulai dari kapasitas penuh
sisa_gold    <- total_gold
sisa_silver  <- total_silver
sisa_bronze  <- total_bronze
sisa_regular <- total_regular

for (i in 1:length(kelas_day1)) {
  if (kelas_day1[i] == "Gold") {
    sisa_gold <- sisa_gold - 1
  } else if (kelas_day1[i] == "Silver") {
    sisa_silver <- sisa_silver - 1
  } else if (kelas_day1[i] == "Bronze") {
    sisa_bronze <- sisa_bronze - 1
  } else {
    sisa_regular <- sisa_regular - 1
  }
}

# Jumlah terjual = kapasitas awal dikurangi sisa
terjual_gold_day1    <- total_gold - sisa_gold
terjual_silver_day1  <- total_silver - sisa_silver
terjual_bronze_day1  <- total_bronze - sisa_bronze
terjual_regular_day1 <- total_regular - sisa_regular

tabel_terjual_day1 <- data.frame(
  kelas     = c("Gold", "Silver", "Bronze", "Regular"),
  kapasitas = c(total_gold, total_silver, total_bronze, total_regular),
  terjual   = c(terjual_gold_day1, terjual_silver_day1,
                terjual_bronze_day1, terjual_regular_day1),
  sisa      = c(sisa_gold, sisa_silver, sisa_bronze, sisa_regular)
)

tabel_terjual_day1

Soal 4: Harga Tiap Kelas pada Hari Ke-2

Pertanyaan: Tentukan harga tiap kelas pada hari ke-2 menggunakan percabangan.

Petunjuk:

  1. Hitung dahulu persentase kursi yang terjual tiap kelas: terjual / kapasitas * 100.
  2. Gunakan percabangan if / else if / else dengan urutan kondisi: lebih dari 70% (naik 15%), lalu 30% atau lebih (tetap), lalu selain itu (turun 15%).
  3. Urutan kondisi penting. Karena kondisi pertama sudah menangkap nilai di atas 70%, kondisi kedua cukup memeriksa >= 30 untuk mewakili rentang 30% sampai 70%.
  4. Harga naik 15% dihitung 1.15 * harga, dan harga turun 15% dihitung 0.85 * harga. Hasilnya dibulatkan dengan round() agar tidak muncul angka desimal panjang.

Penyelesaian:

# Persentase terjual tiap kelas pada hari ke-1
persen_gold_day1    <- terjual_gold_day1 / total_gold * 100
persen_silver_day1  <- terjual_silver_day1 / total_silver * 100
persen_bronze_day1  <- terjual_bronze_day1 / total_bronze * 100
persen_regular_day1 <- terjual_regular_day1 / total_regular * 100

# Harga Gold hari ke-2
if (persen_gold_day1 > 70) {
  harga_gold_day2 <- round(1.15 * harga_gold_day1)
} else if (persen_gold_day1 >= 30) {
  harga_gold_day2 <- harga_gold_day1
} else {
  harga_gold_day2 <- round(0.85 * harga_gold_day1)
}

# Harga Silver hari ke-2
if (persen_silver_day1 > 70) {
  harga_silver_day2 <- round(1.15 * harga_silver_day1)
} else if (persen_silver_day1 >= 30) {
  harga_silver_day2 <- harga_silver_day1
} else {
  harga_silver_day2 <- round(0.85 * harga_silver_day1)
}

# Harga Bronze hari ke-2
if (persen_bronze_day1 > 70) {
  harga_bronze_day2 <- round(1.15 * harga_bronze_day1)
} else if (persen_bronze_day1 >= 30) {
  harga_bronze_day2 <- harga_bronze_day1
} else {
  harga_bronze_day2 <- round(0.85 * harga_bronze_day1)
}

# Harga Regular hari ke-2
if (persen_regular_day1 > 70) {
  harga_regular_day2 <- round(1.15 * harga_regular_day1)
} else if (persen_regular_day1 >= 30) {
  harga_regular_day2 <- harga_regular_day1
} else {
  harga_regular_day2 <- round(0.85 * harga_regular_day1)
}

tabel_harga_day2 <- data.frame(
  kelas          = c("Gold", "Silver", "Bronze", "Regular"),
  persen_terjual = round(c(persen_gold_day1, persen_silver_day1,
                           persen_bronze_day1, persen_regular_day1), 2),
  harga_day1     = c(harga_gold_day1, harga_silver_day1,
                     harga_bronze_day1, harga_regular_day1),
  harga_day2     = c(harga_gold_day2, harga_silver_day2,
                     harga_bronze_day2, harga_regular_day2)
)

tabel_harga_day2

Interpretasi: Gold terjual di atas 70% sehingga harganya naik 15%. Silver dan Regular berada di rentang 30% sampai 70% sehingga harganya tetap. Bronze terjual kurang dari 30% sehingga harganya turun 15%.


Soal 5: Data Frame Hari Ke-2

Pertanyaan: Buatlah data frame hari ke-2 (ID, kelas, harga, nomor urut kursi). Nomor urut melanjutkan hari ke-1.

Petunjuk:

  1. Sebelum menghitung, periksa dengan percabangan bahwa jumlah pembeli tiap kelas di hari ke-2 tidak melebihi sisa kursi kelas tersebut.
  2. Harga tiap pembeli memakai harga hari ke-2 dari Soal 4.
  3. Nomor urut kursi hari ke-2 melanjutkan hari ke-1, sehingga hitungannya ditambah jumlah kursi yang sudah terjual di hari ke-1. Contoh: jika Gold terjual 7 di hari ke-1, pembeli Gold pertama di hari ke-2 mendapat nomor 8.

Penyelesaian:

# Pengecekan: pembeli hari ke-2 tidak boleh melebihi sisa kursi
if (sum(kelas_day2 == "Gold") > sisa_gold |
    sum(kelas_day2 == "Silver") > sisa_silver |
    sum(kelas_day2 == "Bronze") > sisa_bronze |
    sum(kelas_day2 == "Regular") > sisa_regular) {
  print("PERINGATAN: ada kelas yang pembelinya melebihi sisa kursi")
} else {
  print("Pengecekan aman: tidak ada kelas yang kelebihan pembeli")
}
## [1] "Pengecekan aman: tidak ada kelas yang kelebihan pembeli"
# Harga tiap pembeli hari ke-2
harga_day2 <- case_when(
  kelas_day2 == "Gold"   ~ harga_gold_day2,
  kelas_day2 == "Silver" ~ harga_silver_day2,
  kelas_day2 == "Bronze" ~ harga_bronze_day2,
  TRUE                   ~ harga_regular_day2
)

# Nomor urut kursi: melanjutkan hari ke-1
no_urut_tiap_kelas_day2 <- c()

for (i in 1:length(no_id_day2)) {
  if (kelas_day2[i] == "Gold") {
    no_urut_tiap_kelas_day2[i] <- sum(kelas_day2[1:i] == "Gold") + terjual_gold_day1
  } else if (kelas_day2[i] == "Silver") {
    no_urut_tiap_kelas_day2[i] <- sum(kelas_day2[1:i] == "Silver") + terjual_silver_day1
  } else if (kelas_day2[i] == "Bronze") {
    no_urut_tiap_kelas_day2[i] <- sum(kelas_day2[1:i] == "Bronze") + terjual_bronze_day1
  } else {
    no_urut_tiap_kelas_day2[i] <- sum(kelas_day2[1:i] == "Regular") + terjual_regular_day1
  }
}

# Harga kumulatif hari ke-2
harga_kumulatif_day2 <- cumsum(harga_day2)

data_day2 <- data.frame(
  no_id           = no_id_day2,
  kelas           = kelas_day2,
  harga           = harga_day2,
  no_urut         = no_urut_tiap_kelas_day2,
  harga_kumulatif = harga_kumulatif_day2
)

head(data_day2, 10)

Soal 6: Gabungan Data dan Tabel per Kelas

Pertanyaan: Gabungkan data kedua hari, hitung harga kumulatif keseluruhan, lalu buat tabel terpisah untuk tiap kelas.

Petunjuk:

  1. Gabungkan dua data frame yang kolomnya sama dengan rbind().
  2. Harga kumulatif keseluruhan harus dihitung ulang dari data gabungan, karena kumulatif hari ke-2 sebelumnya dimulai dari nol.
  3. Tabel per kelas dibuat dengan filter() dari paket dplyr.

Penyelesaian:

data_gabungan <- rbind(data_day1, data_day2)
data_gabungan$harga_kumulatif <- cumsum(data_gabungan$harga)

# Sepuluh baris terakhir untuk memastikan kumulatif tidak ada yang NA
tail(data_gabungan, 10)

Tabel terpisah untuk tiap kelas:

tabel_gold    <- data_gabungan %>% filter(kelas == "Gold")
tabel_silver  <- data_gabungan %>% filter(kelas == "Silver")
tabel_bronze  <- data_gabungan %>% filter(kelas == "Bronze")
tabel_regular <- data_gabungan %>% filter(kelas == "Regular")

Tabel Gold

tabel_gold

Tabel Silver

tabel_silver

Tabel Bronze

tabel_bronze

Tabel Regular

tabel_regular

Soal 7: Kesimpulan

Pertanyaan: Hitunglah (a) total pendapatan tiap hari dan keseluruhan, (b) sisa kursi tiap kelas setelah hari ke-2, (c) persentase keterisian tiap kelas dan keseluruhan. Apakah seluruh tiket terjual habis? Kelas mana yang habis dan mana yang masih tersisa? Berikan kesimpulan atau saran dari hasil tersebut.

7(a) Total Pendapatan

pendapatan_day1  <- sum(data_day1$harga)
pendapatan_day2  <- sum(data_day2$harga)
pendapatan_total <- pendapatan_day1 + pendapatan_day2

cat("Pendapatan hari ke-1 : Rp", format(pendapatan_day1, big.mark = ".", decimal.mark = ","), "\n")
## Pendapatan hari ke-1 : Rp 26.400.000
cat("Pendapatan hari ke-2 : Rp", format(pendapatan_day2, big.mark = ".", decimal.mark = ","), "\n")
## Pendapatan hari ke-2 : Rp 15.972.500
cat("Pendapatan total     : Rp", format(pendapatan_total, big.mark = ".", decimal.mark = ","), "\n")
## Pendapatan total     : Rp 42.372.500

7(b) dan 7(c) Sisa Kursi dan Persentase Keterisian

terjual_gold_total    <- sum(data_gabungan$kelas == "Gold")
terjual_silver_total  <- sum(data_gabungan$kelas == "Silver")
terjual_bronze_total  <- sum(data_gabungan$kelas == "Bronze")
terjual_regular_total <- sum(data_gabungan$kelas == "Regular")

sisa_gold_akhir    <- total_gold - terjual_gold_total
sisa_silver_akhir  <- total_silver - terjual_silver_total
sisa_bronze_akhir  <- total_bronze - terjual_bronze_total
sisa_regular_akhir <- total_regular - terjual_regular_total

tabel_ringkasan <- data.frame(
  kelas     = c("Gold", "Silver", "Bronze", "Regular"),
  kapasitas = c(total_gold, total_silver, total_bronze, total_regular),
  terjual   = c(terjual_gold_total, terjual_silver_total,
                terjual_bronze_total, terjual_regular_total),
  sisa      = c(sisa_gold_akhir, sisa_silver_akhir,
                sisa_bronze_akhir, sisa_regular_akhir)
)
tabel_ringkasan$persen_terisi <- round(tabel_ringkasan$terjual /
                                         tabel_ringkasan$kapasitas * 100, 2)

terjual_total <- sum(tabel_ringkasan$terjual)
sisa_total    <- sum(tabel_ringkasan$sisa)
persen_total  <- round(terjual_total / kapasitas_total_kursi * 100, 2)

tabel_ringkasan
cat("Total terjual:", terjual_total, "dari", kapasitas_total_kursi,
    "kursi, sisa", sisa_total, "kursi\n")
## Total terjual: 161 dari 180 kursi, sisa 19 kursi
cat("Persentase keterisian keseluruhan:", persen_total, "%\n")
## Persentase keterisian keseluruhan: 89.44 %

Apakah Seluruh Tiket Terjual Habis?

Pemeriksaan dilakukan dengan percabangan, baik untuk keseluruhan tiket maupun untuk tiap kelas.

if (sisa_total == 0) {
  cat("Seluruh tiket terjual habis.\n")
} else {
  cat("Tidak semua tiket terjual habis.\n")
}
## Tidak semua tiket terjual habis.
for (i in 1:nrow(tabel_ringkasan)) {
  if (tabel_ringkasan$sisa[i] == 0) {
    cat("Kelas", tabel_ringkasan$kelas[i], ": HABIS TERJUAL\n")
  } else {
    cat("Kelas", tabel_ringkasan$kelas[i], ": masih tersisa",
        tabel_ringkasan$sisa[i], "kursi\n")
  }
}
## Kelas Gold : HABIS TERJUAL
## Kelas Silver : masih tersisa 2 kursi
## Kelas Bronze : masih tersisa 2 kursi
## Kelas Regular : masih tersisa 15 kursi

Kesimpulan dan Saran

  1. Tiket belum terjual habis secara keseluruhan. Dari 180 kursi, 161 kursi terjual (89,44%) dan 19 kursi masih tersisa. Hanya kelas Gold yang terjual habis (100%).
  2. Permintaan Gold sangat kuat. Gold habis terjual walaupun harganya naik 15% di hari ke-2. Penyelenggara bisa mempertimbangkan menambah jumlah kursi Gold atau menaikkan harganya lebih tinggi pada penjualan berikutnya.
  3. Silver dan Bronze hampir penuh. Keduanya terisi di atas 90% dan masing-masing menyisakan 2 kursi. Penurunan harga Bronze sebesar 15% di hari ke-2 tampak efektif, karena kelas ini yang awalnya baru terjual 28,12% akhirnya terisi 93,75%.
  4. Regular punya sisa kursi terbanyak. Ada 15 kursi tersisa dengan tingkat keterisian terendah (86,96%). Perlu promosi tambahan atau paket harga khusus agar kursi yang tersisa terisi.
  5. Strategi harga dinamis per kelas cukup berhasil. Total pendapatan mencapai Rp42.372.500 dengan keterisian hampir 90%, sehingga pola harga berdasarkan persentase terjual di hari pertama layak dipertahankan dan disempurnakan.

Penutup

Modul ini memperlihatkan bagaimana vektor, data frame, percabangan, dan jumlah kumulatif dapat dipakai bersama untuk menyelesaikan kasus penjualan tiket yang nyata. Mahasiswa dapat mencoba mengubah data atau aturan harga (misalnya batas 70% dan 30%, atau besar kenaikan harga), lalu melihat bagaimana pendapatan dan keterisian ikut berubah.