Setelah mengerjakan modul ini, kamu diharapkan mampu:
if, else if,
else) dan case_when untuk mengambil keputusan
berdasarkan kondisi.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 |
Pilihan kelas tiap pembeli sudah berurutan sesuai ID dan ditulis pada bagian data awal di bawah.
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% |
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
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)
Pertanyaan: Tambahkan kolom nomor urut kursi per kelas dan harga kumulatif.
Petunjuk:
i. Gunakan
sum(kelas_day1[1:i] == "Gold") untuk menghitung jumlah Gold
dari pembeli pertama sampai pembeli ke-i.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)
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
Pertanyaan: Tentukan harga tiap kelas pada hari ke-2 menggunakan percabangan.
Petunjuk:
terjual / kapasitas * 100.if / else if / else dengan urutan
kondisi: lebih dari 70% (naik 15%), lalu 30% atau lebih (tetap), lalu
selain itu (turun 15%).>= 30 untuk
mewakili rentang 30% sampai 70%.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%.
Pertanyaan: Buatlah data frame hari ke-2 (ID, kelas, harga, nomor urut kursi). Nomor urut melanjutkan hari ke-1.
Petunjuk:
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)
Pertanyaan: Gabungkan data kedua hari, hitung harga kumulatif keseluruhan, lalu buat tabel terpisah untuk tiap kelas.
Petunjuk:
rbind().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
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.
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
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 %
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
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.