Dosen pengampu:

Bayutama Isnaini, S.Si., M.Si.

Anggota Kelompok B

  1. Adnan Faiz Taufiiqulfitroh (21108062610003)
  2. Andin Zulfa Syawaluna (21108062610010)
  3. Aura Brilliancy Zizdha (21108062610016)
  4. Dyah Vitaloka (21108062610029)
  5. Farah Octavia (21108062610033)

BAB I PENDAHULUAN

A. Tujuan Pembelajaran

  1. Mempelajari pengolahan dan pembersihan data menu Kedai Kopi Senja menggunakan bahasa R, khususnya dalam menangani data hilang (missing values).
  2. Menghitung besarnya persentase keuntungan tiap menu dari selisih harga jual dan biaya produksi.
  3. Menerapkan fungsi percabangan (conditional statement) di R untuk mengelompokkan menu berdasarkan tingkat keuntungan dan jumlah penjualannya.
  4. Menentukan tindakan atau rekomendasi bisnis yang tepat untuk masing-masing menu dengan mempertimbangkan keuntungan, total penjualan, dan rating pelanggan.

B. Dasar Teori

a) Algoritma

Algoritma merupakan langkah sistematis untuk menyelesaikan masalah. Di kasus ini, algoritma dipakai untuk mengolah data menu hingga mendapatkan keputusan dari angka keuntungan dan penjualan.

b) Objek dan Vektor

Objek dipakai untuk menyimpan nilai, sedangkan vektor (fungsi ⁠c()⁠) menampung kumpulan data seperti nama menu, harga, biaya, jumlah penjualan, dan rating.

c) Mengubah Tipe Data

Tipe data memengaruhi cara olah data. Fungsi ⁠as.numeric()⁠ digunakan untuk mengubah data ke bentuk angka supaya dapat dihitung.

d) Struktur Data

Struktur seperti ⁠data.frame⁠ dipakai untuk menyusun data penjualan serta merapikan informasi menu.

e) Missing Values

Nilai yang hilang ditandai dengan ⁠NA⁠, sementara hasil perhitungan yang tidak terdefinisi ditandai dengan ⁠NaN⁠.

f) Pernyataan Percabangan

⁠Menggunakan ⁠ifelse()⁠ untuk mengelompokkan data berdasarkan syarat tertentu misalnya dari kategori dan rating pelanggan.

g) Klasifikasi dengan ⁠case_when()⁠

Membuat program mengambil keputusan berdasarkan kondisi tertentu menggunakan case_when().

C. Studi Kasus

Kedai kopi “Kopi Senja” memiliki 5 menu. Pemilik ingin mengetahui menu mana yang perlu dipertahankan, dipromosikan, atau dihentikan berdasarkan data penjualan dan rating pelanggan. Data dari kasir tidak rapi dengan jumlah terjual tercatat sebagai teks (ada yang berisi “-”), dan rating menu yang belum punya ulasan bernilai 0/0. Data yang digunakan adalah data sintesis, dengan harga dan biaya dalam ribu rupiah.

Menu Harga Biaya Terjual Rating
Americano 20 5 180 4.6
Matcha Latte 30 15 120 4.5
Mocha 30 15 70 3.9
Teh Tarik 20 10 - 4.0
Roti Bakar 20 10 30 NaN

Persentase keuntungan = (harga-biaya)/harga x 100

Aturan kategori (kondisi dievaluasi berurutan):

kategori Kondisi
Laris Untung Tinggi Persentase keuntungan >=60 & terjual >=100
Sepi Untung Tinggi Persentase keuntungan >=60 & terjual <100
Laris Untung Rendah Persentase keuntungan <60 & terjual >=100
Sepi Untung Rendah Selain kondisi di atas

Aturan keputusan:

  1. Data terjual atau rating kosong (NA/NaN): “Perlu verifikasi data”.
  2. Laris Untung Tinggi: “Restock penuh”.
  3. Sepi Untung Tinggi: “Beri promo”.
  4. Laris Untung Rendah: “Naikkan harga” jika rating >= 4.5, selain itu “Harga tetap”.
  5. Sepi Untung Rendah: “Hentikan” jika terjual < 30 & rating < 3.5, selain itu “Uji coba”.

BAB II PEMBAHASAN

A. Tabel Menu

Data menu dibuat dari lima vektor (Menu, Harga, Biaya, Terjual, Rating) yang digabung menjadi Data_Menu dengan data.frame(). Dua data sengaja dibuat tidak lengkap untuk menguji penanganan data hilang:
  1. Teh Tarik tidak punya data penjualan (“-”).
  2. Roti Bakar tidak punya data rating (NaN). Satuan Harga dan Biaya diasumsikan ribuan rupiah.
Menu <- c("Americano", "Matcha Latte", "Mocha", "Teh Tarik", "Roti Bakar")
Harga <- c(20, 30, 30, 20, 20)
Biaya <- c(5, 15, 15, 10, 10)
Terjual <- c("180", "120", "70", "-", "30")
Rating <- c(4.6, 4.5, 3.9, 4.0, NaN)

Data_Menu <- data.frame(Menu,
                        Harga,
                        Biaya,
                        Terjual,
                        Rating)
kable(Data_Menu, align = "c")
Menu Harga Biaya Terjual Rating
Americano 20 5 180 4.6
Matcha Latte 30 15 120 4.5
Mocha 30 15 70 3.9
Teh Tarik 20 10 - 4.0
Roti Bakar 20 10 30 NaN

B. Persentase Keuntungan

Menentukan persentase keuntungan diperoleh dengan mengurangi Harga dengan Biaya kemudian dibagi Harga lalu dikali 100%. Pada persentase keuntungan, hasil yang ditampilkan sudah dalam persen.

Persentase_Keuntungan <- c(((Harga - Biaya) / Harga) * 100)
Persentase_Keuntungan
## [1] 75 50 50 50 50

C. Pengkategorian dengan ifelse ()

Kategori ditentukan oleh dua kriteria, dan masing-masing dibandingkan dengan sebuah ambang, yaitu angka batas yang ditetapkan untuk memisahkan dua golongan:
  1. Jumlah terjual dengan ambang 100 : menu yang terjual 100 atau lebih dikategorikan Laris, sedangkan yang kurang dari 100 dikategorikan Sepi.
  2. Persentase keuntungan dengan ambang 60% : menu dengan keuntungan 60% atau lebih dikategorikan Untung Tinggi, sedangkan yang kurang dari 60% dikategorikan Untung Rendah.
Gabungan hasil kedua pengecekan ini menghasilkan empat kategori: Laris Untung Tinggi, Laris Untung Rendah, Sepi Untung Tinggi, dan Sepi Untung Rendah.
library(dplyr)
Kategori <- ifelse(as.numeric(Terjual) >= 100 & Persentase_Keuntungan >= 60, "Laris Untung Tinggi",
                   ifelse(as.numeric(Terjual) >= 100 & Persentase_Keuntungan < 60,"Laris Untung Rendah",
                          ifelse(as.numeric(Terjual) < 100  & Persentase_Keuntungan >= 60, "Sepi Untung Tinggi",
                                 "Sepi Untung Rendah")))
Kategori
## [1] "Laris Untung Tinggi" "Laris Untung Rendah" "Sepi Untung Rendah" 
## [4] NA                    "Sepi Untung Rendah"

Pada Teh Tarik, as.numeric(“-”) menghasilkan NA dan memunculkan warning “NAs introduced by coercion”. Karena kondisi jumlah terjualnya tidak bisa dinilai, ifelse() mengembalikan NA untuk kategorinya.

D. Penentuan Keputusan dengan case_when()

Case_when() dari paket dplyr dipilih karena melibatkan beberapa variabel (Kategori, Rating, dan Terjual), digunakan untuk menentukan keputusan menu yang akan dilakukan oleh cafe.

Keputusan <- case_when(
  Terjual == "-" | is.na(Rating) ~ "Perlu verifikasi data",
  Kategori == "Laris Untung Tinggi" ~ "Restock penuh",
  Kategori == "Laris Untung Rendah" & Rating >= 4.5 ~ "Naikkan harga",
  Kategori == "Sepi Untung Tinggi" ~ "Beri promo",
  Kategori == "Sepi Untung Rendah" & as.numeric(Terjual) < 30 & Rating < 3.5 ~ "Hentikan",
  Kategori == "Laris Untung Rendah" ~ "Harga tetap",
  TRUE ~  "Uji coba"
)
Keputusan
## [1] "Restock penuh"         "Naikkan harga"         "Uji coba"             
## [4] "Perlu verifikasi data" "Perlu verifikasi data"

Hasil keputusan :

  1. Americano: kategori Laris Untung Tinggi cocok dengan aturan kedua, sehingga keputusannya Restock penuh.
  2. Matcha Latte: kategori Laris Untung Rendah dengan rating 4,5 (≥ 4,5) cocok dengan aturan ketiga, sehingga Naikkan harga. Aturan “Harga tetap” tidak terpakai karena sudah didahului aturan kedua; inilah alasan urutan baris penting.
  3. Mocha: Sepi Untung Rendah, tetapi tidak memenuhi syarat “Hentikan” (terjual 70 tidak < 30 dan rating 3,9 tidak < 3,5). Tidak ada aturan lain yang cocok, jadi jatuh ke default Uji coba.
  4. Teh Tarik: kategori NA sehingga semua aturan berbasis kategori dilewati. Aturan Terjual == “-” bernilai TRUE, sehingga Perlu verifikasi data.
  5. Roti Bakar: Sepi Untung Rendah, tetapi rating NaN membuat aturan “Hentikan” tidak bisa dinilai. Aturan is.na(Rating) bernilai TRUE, sehingga Perlu verifikasi data. Aturan “Perlu verifikasi data” sengaja diletakkan sebagai pengaman untuk data tidak lengkap sebelum masuk ke default TRUE ~ “Uji coba”.

E. Tabel Akhir

Hanya satu menu yang layak langsung untuk diprioritaskan yaitu Americano, satu menu dapat dioptimalkan melalui harga yaitu Matcha Latte, dan dua menu belum bisa diputuskan karena datanya belum lengkap. Hasil akhir digabung dalam Data_Hasil:

Menu Harga Biaya Terjual Rating Kategori Keputusan
Americano 20 5 180 4.6 Laris Untung Tinggi Restock penuh
Matcha Latte 30 15 120 4.5 Laris Untung Rendah Naikkan harga
Mocha 30 15 70 3.9 Sepi Untung Rendah Uji coba
Teh Tarik 20 10 - 4.0 NA Perlu verifikasi data
Roti Bakar 20 10 30 NaN Sepi Untung Rendah Perlu verifikasi data

BAB III PENUTUP

A. Kesimpulan

Menu Americano layak untuk di-restock penuh karena laris dan keuntungannya tinggi, menu Matcha Latte bisa dinaikkan harganya, menu Mocha perlu diuji coba, sedangkan menu Teh Tarik dan menu Roti Bakar harus diverifikasi datanya karena belum lengkap. Kombinasi ifelse() bertingkat dan case_when() efektif untuk mengubah data penjualan menjadi keputusan otomatis, dengan syarat urutan aturannya tepat dan data kosong (NA/NaN) ditangani sejak awal.