1.1 Latar Belakang

Sebuah kantin menjual 6 menu makanan dan 4 menu minuman. Selama satu hari terjadi 14 transaksi. Setiap transaksi berisi satu jenis makanan dan, kadang, satu jenis minuman. Aturan promo kantin:

Total pesanan Promo
Kurang dari Rp20.000 Harga normal
Rp20.000 atau lebih Diskon 5%
Rp30.000 atau lebih Diskon 5% dan gratis satu Es Teh

Tugas program: menghitung total pesanan tiap transaksi, menentukan promonya, lalu menghitung total yang harus dibayar pelanggan.

2.1 Konsep Dasar

Konsep Penjelasan
Vector Kumpulan nilai bertipe sama, dibuat dengan c()
Data frame Tabel; tiap kolom adalah vector dengan panjang sama
Akses kolom nama_tabel$nama_kolom
Indexing harga[c(1, 4, 4)] mengambil elemen ke-1, ke-4, dan ke-4
NA Data kosong; hitungan yang melibatkan NA menghasilkan NA
ifelse() ifelse(kondisi, nilai_jika_benar, nilai_jika_salah), bekerja pada seluruh vector sekaligus

3.1 Langkah Praktik

3.1.1 Langkah 1: Membuat Data Menu

Urutan data menentukan nomor menu: Soto Ayam = 1, Nasi Goreng = 2, dan seterusnya sampai Air Mineral = 10. Nomor ini dipakai pada data transaksi.

id_menu   <- paste0("M0", sprintf("%01d", 1:10))

nama_menu <- c("Soto Ayam", "Nasi Goreng", "Mie Ayam", "Ayam Geprek", "Katsu",
               "Nasi Sayur", "Es Teh", "Es Jeruk", "Kopi", "Air Mineral")

kategori <- c("Makanan", "Makanan", "Makanan", "Makanan", "Makanan",
              "Makanan", "Minuman", "Minuman", "Minuman", "Minuman")

harga <- c(7000, 12000, 8000, 12000, 13000, 6000, 3000, 4000, 5000, 4000)

menu <- data.frame(id_menu, nama_menu, kategori, harga)
menu
##    id_menu   nama_menu kategori harga
## 1      M01   Soto Ayam  Makanan  7000
## 2      M02 Nasi Goreng  Makanan 12000
## 3      M03    Mie Ayam  Makanan  8000
## 4      M04 Ayam Geprek  Makanan 12000
## 5      M05       Katsu  Makanan 13000
## 6      M06  Nasi Sayur  Makanan  6000
## 7      M07      Es Teh  Minuman  3000
## 8      M08    Es Jeruk  Minuman  4000
## 9      M09        Kopi  Minuman  5000
## 10    M010 Air Mineral  Minuman  4000

3.1.2 Langkah 2: Mencatat Transaksi

makanan_terjual dan minuman_terjual berisi nomor menu, bukan nama. Kolom jml_... berisi jumlah porsi. Transaksi ke-1 dan ke-12 tidak membeli minuman, sehingga diisi NA.

Contoh membaca baris ke-3: menu nomor 3 (Mie Ayam) sebanyak 2 porsi dan menu nomor 7 (Es Teh) sebanyak 2 gelas.

kode_transaksi <- c(paste0("T0", 1:14))

makanan_terjual     <- c(1, 4, 3, 4, 2, 4, 5, 5, 1, 4, 6, 6, 3, 1)
jml_makanan_terjual <- c(1, 1, 2, 1, 2, 2, 1, 3, 1, 3, 2, 1, 2, 3)

minuman_terjual     <- c(NA, 7, 7, 10, 8, 7, 9, 9, 7, 10, 7, NA, 8, 8)
jml_minuman_terjual <- c(NA, 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, NA, 1, 1)

penjualan <- data.frame(kode_transaksi,
                        makanan_terjual, jml_makanan_terjual,
                        minuman_terjual, jml_minuman_terjual)
penjualan
##    kode_transaksi makanan_terjual jml_makanan_terjual minuman_terjual
## 1             T01               1                   1              NA
## 2             T02               4                   1               7
## 3             T03               3                   2               7
## 4             T04               4                   1              10
## 5             T05               2                   2               8
## 6             T06               4                   2               7
## 7             T07               5                   1               9
## 8             T08               5                   3               9
## 9             T09               1                   1               7
## 10           T010               4                   3              10
## 11           T011               6                   2               7
## 12           T012               6                   1              NA
## 13           T013               3                   2               8
## 14           T014               1                   3               8
##    jml_minuman_terjual
## 1                   NA
## 2                    1
## 3                    2
## 4                    1
## 5                    2
## 6                    2
## 7                    1
## 8                    2
## 9                    1
## 10                   2
## 11                   2
## 12                  NA
## 13                   1
## 14                   1

3.1.3 Langkah 3: Menghitung Total Makanan dan Minuman

harga[penjualan$makanan_terjual] mengambil harga satuan tiap transaksilalu dikalikan jumlah porsi. Karena harga[NA] bernilai NA, transaksi tanpa minuman akan bernilai NA pada total_minuman.

penjualan$total_makanan <- harga[penjualan$makanan_terjual] * penjualan$jml_makanan_terjual
penjualan$total_minuman <- harga[penjualan$minuman_terjual] * penjualan$jml_minuman_terjual

penjualan
##    kode_transaksi makanan_terjual jml_makanan_terjual minuman_terjual
## 1             T01               1                   1              NA
## 2             T02               4                   1               7
## 3             T03               3                   2               7
## 4             T04               4                   1              10
## 5             T05               2                   2               8
## 6             T06               4                   2               7
## 7             T07               5                   1               9
## 8             T08               5                   3               9
## 9             T09               1                   1               7
## 10           T010               4                   3              10
## 11           T011               6                   2               7
## 12           T012               6                   1              NA
## 13           T013               3                   2               8
## 14           T014               1                   3               8
##    jml_minuman_terjual total_makanan total_minuman
## 1                   NA          7000            NA
## 2                    1         12000          3000
## 3                    2         16000          6000
## 4                    1         12000          4000
## 5                    2         24000          8000
## 6                    2         24000          6000
## 7                    1         13000          5000
## 8                    2         39000         10000
## 9                    1          7000          3000
## 10                   2         36000          8000
## 11                   2         12000          6000
## 12                  NA          6000            NA
## 13                   1         16000          4000
## 14                   1         21000          4000

3.1.4 Langkah 4: Mengatasi NA dan Menghitung Total Pesanan

is.na() bernilai TRUE pada elemen kosong, lalu ifelse() menggantinya dengan 0. Tanpa langkah ini, total pesanan transaksi 1 dan 12 menjadi NA.

total_minuman_bersih <- ifelse(is.na(penjualan$total_minuman), 0, penjualan$total_minuman)

penjualan$total_pesan <- penjualan$total_makanan + total_minuman_bersih
penjualan
##    kode_transaksi makanan_terjual jml_makanan_terjual minuman_terjual
## 1             T01               1                   1              NA
## 2             T02               4                   1               7
## 3             T03               3                   2               7
## 4             T04               4                   1              10
## 5             T05               2                   2               8
## 6             T06               4                   2               7
## 7             T07               5                   1               9
## 8             T08               5                   3               9
## 9             T09               1                   1               7
## 10           T010               4                   3              10
## 11           T011               6                   2               7
## 12           T012               6                   1              NA
## 13           T013               3                   2               8
## 14           T014               1                   3               8
##    jml_minuman_terjual total_makanan total_minuman total_pesan
## 1                   NA          7000            NA        7000
## 2                    1         12000          3000       15000
## 3                    2         16000          6000       22000
## 4                    1         12000          4000       16000
## 5                    2         24000          8000       32000
## 6                    2         24000          6000       30000
## 7                    1         13000          5000       18000
## 8                    2         39000         10000       49000
## 9                    1          7000          3000       10000
## 10                   2         36000          8000       44000
## 11                   2         12000          6000       18000
## 12                  NA          6000            NA        6000
## 13                   1         16000          4000       20000
## 14                   1         21000          4000       25000

3.1.5 Langkah 5: Menghitung Diskon dan Promo (Rekap)

  • diskon bernilai 0,05 jika total pesanan minimal Rp20.000, selain itu 0.
  • esteh_gratis bernilai 1 jika total pesanan minimal Rp30.000. Kolom ini hanya penanda dan tidak mengurangi total bayar.
  • total_bayar = total pesanan x (1 - diskon).
  • keterangan memakai ifelse bertingkat. Syarat terbesar (Rp30.000) diperiksa lebih dulu, karena transaksi di atas Rp30.000 juga memenuhi syarat Rp20.000.
rekap <- data.frame(kode_transaksi, penjualan$total_pesan)
rekap$total_pesan <- penjualan$total_pesan

rekap$diskon       <- ifelse(rekap$total_pesan >= 20000, 0.05, 0)
rekap$esteh_gratis <- ifelse(rekap$total_pesan >= 30000, 1, 0)
rekap$total_bayar  <- rekap$total_pesan * (1 - rekap$diskon)
rekap$keterangan   <- ifelse(rekap$total_pesan >= 30000, "Diskon 5% + Gratis Es Teh",
                      ifelse(rekap$total_pesan >= 20000, "Diskon 5%", "Harga Normal"))
rekap
##    kode_transaksi penjualan.total_pesan total_pesan diskon esteh_gratis
## 1             T01                  7000        7000   0.00            0
## 2             T02                 15000       15000   0.00            0
## 3             T03                 22000       22000   0.05            0
## 4             T04                 16000       16000   0.00            0
## 5             T05                 32000       32000   0.05            1
## 6             T06                 30000       30000   0.05            1
## 7             T07                 18000       18000   0.00            0
## 8             T08                 49000       49000   0.05            1
## 9             T09                 10000       10000   0.00            0
## 10           T010                 44000       44000   0.05            1
## 11           T011                 18000       18000   0.00            0
## 12           T012                  6000        6000   0.00            0
## 13           T013                 20000       20000   0.05            0
## 14           T014                 25000       25000   0.05            0
##    total_bayar                keterangan
## 1         7000              Harga Normal
## 2        15000              Harga Normal
## 3        20900                 Diskon 5%
## 4        16000              Harga Normal
## 5        30400 Diskon 5% + Gratis Es Teh
## 6        28500 Diskon 5% + Gratis Es Teh
## 7        18000              Harga Normal
## 8        46550 Diskon 5% + Gratis Es Teh
## 9        10000              Harga Normal
## 10       41800 Diskon 5% + Gratis Es Teh
## 11       18000              Harga Normal
## 12        6000              Harga Normal
## 13       19000                 Diskon 5%
## 14       23750                 Diskon 5%

3.1.6 Langkah 6: Ringkasan Keseluruhan (rekap_total)

Satu baris data frame yang merangkum seluruh transaksi hari itu:

Kolom Rumus Arti
total_transaksi nrow(rekap) Jumlah transaksi (jumlah baris)
total_pesanan sum(rekap$total_pesan) Jumlah nilai pesanan sebelum diskon
total_diskon sum(rekap$total_pesan * rekap$diskon) Total rupiah potongan diskon
total_pendapatan sum(rekap$total_bayar) Total uang yang diterima kantin
transaksi_diskon sum(rekap$diskon > 0) Banyak transaksi yang mendapat diskon
transaksi_esteh sum(rekap$esteh_gratis) Banyak transaksi yang mendapat Es Teh gratis

rekap$diskon > 0 menghasilkan vector TRUE/FALSE, dan sum() menghitung TRUE sebagai 1, sehingga hasilnya adalah banyaknya transaksi yang memenuhi syarat.

rekap_total <- data.frame(
  total_transaksi  = nrow(rekap),
  total_pesanan    = sum(rekap$total_pesan),
  total_diskon     = sum(rekap$total_pesan * rekap$diskon),
  total_pendapatan = sum(rekap$total_bayar),
  transaksi_diskon = sum(rekap$diskon > 0),
  transaksi_esteh  = sum(rekap$esteh_gratis)
)

rekap_total
##   total_transaksi total_pesanan total_diskon total_pendapatan transaksi_diskon
## 1              14        312000        11100           300900                7
##   transaksi_esteh
## 1               4

4.1 Hasil Program

Isi rekap (nilai dihitung dari data pada program):

kode_transaksi total_pesan diskon esteh_gratis total_bayar keterangan
T01 7000 0 0 7000 Harga Normal
T02 15000 0 0 15000 Harga Normal
T03 22000 0,05 0 20900 Diskon 5%
T04 16000 0 0 16000 Harga Normal
T05 32000 0,05 1 30400 Diskon 5% + Gratis Es Teh
T06 30000 0,05 1 28500 Diskon 5% + Gratis Es Teh
T07 18000 0 0 18000 Harga Normal
T08 49000 0,05 1 46550 Diskon 5% + Gratis Es Teh
T09 10000 0 0 10000 Harga Normal
T010 44000 0,05 1 41800 Diskon 5% + Gratis Es Teh
T011 18000 0 0 18000 Harga Normal
T012 6000 0 0 6000 Harga Normal
T013 20000 0,05 0 19000 Diskon 5%
T014 25000 0,05 0 23750 Diskon 5%

Isi rekap_total:

total_transaksi total_pesanan total_diskon total_pendapatan transaksi_diskon transaksi_esteh
14 312000 11100 300900 7 4

5.1 Rangkuman

Konsep Fungsi / sintaks Dipakai untuk
Membuat vector c(), paste0() Data menu dan transaksi
Membuat tabel data.frame() menu, penjualan, rekap, rekap_total
Akses kolom $ Membaca dan menambah kolom
Indexing vector harga[nomor_menu] Mencari harga dari nomor menu
Deteksi data kosong is.na() Transaksi tanpa minuman
Percabangan vektor ifelse() Mengganti NA, diskon, keterangan
Ringkasan sum(), nrow() Total dan jumlah transaksi (rekap_total)

Alur program: data menu, data transaksi, total makanan dan minuman, total pesanan (NA diganti 0), diskon dan promo, total bayar, lalu ringkasan keseluruhan (rekap_total).