Dosen Pengampu: Bayutama Isnaini, S.Si., M.Si.
Disusun oleh: Kelompok C

Anggota Kelompok C
No. Nama NIM
1 Alisia Hanna Hulaila 21108062610006
2 Alvin Raditya Suryadi 21108062610007
3 Anisya Hanif Auliya 21108062610012
4 Deas Setiana Bakti 21108062610026
5 Dewi Cinta Azzahra 21108062610027

BAB 1: PENDAHULUAN

1.1 Latar Belakang

Pemrograman dalam R mengandalkan struktur kendali (control flow) untuk mengatur alur eksekusi perintah. Salah satu elemen mendasar dalam algoritma adalah struktur selection (percabangan), yang memungkinkan program menguji kriteria tertentu dan mengeksekusi blok kode sesuai hasil evaluasi logika. Melalui studi kasus pengolahan data pelanggan PT PLN (Persero), mahasiswa mempelajari cara memadukan tipe data vektor, pengorganisasian data frame, serta fungsi seleksi kondisi untuk menghasilkan laporan perhitungan tagihan secara otomatis.

1.2 Tujuan Pembelajaran

Setelah mempelajari modul ini, pembaca mampu:

  1. Memahami pembentukan dan manipulasi struktur data data frame pada R.
  2. Menggunakan operator perbandingan (==, >=, <=) dan operator logika (&, |) untuk pengujian kondisi.
  3. Mengimplementasikan percabangan bertingkat dengan fungsi ifelse().
  4. Menyusun modul praktikum berbasis kasus dan mempublikasikannya secara online ke platform RPubs.

BAB 2: DESKRIPSI KASUS DAN ALGORITMA

2.1 Deskripsi Kasus

PT PLN (Persero) memerlukan sistem otomatisasi untuk menghitung total tagihan listrik bulanan pelanggan berdasarkan kategori daya listrik (VA), status subsidi, dan jumlah energi listrik yang dikonsumsi (kWh). Sistem ini menentukan tarif listrik sesuai kategori pelanggan, menghitung biaya pemakaian, dan menghasilkan total tagihan yang harus dibayar. Dengan program ini, proses perhitungan diharapkan lebih cepat, akurat, dan efisien.

2.2 Aturan Bisnis dan Tarif Listrik

Tabel 2.1 Tarif Listrik per kWh
Daya Status Tarif per kWh
450 VA Subsidi Rp415
900 VA Subsidi Rp605
900 VA Non-subsidi Rp1.352
1300 VA dan 2200 VA Non-subsidi Rp1.444,7

Aturan tambahan:

  • Pajak Penerangan Jalan (PPJ): 5% dari biaya pemakaian listrik.
  • Klasifikasi kategori pemakaian: Hemat (< 100 kWh), Sedang (100-300 kWh), dan Tinggi (> 300 kWh).

2.3 Rancangan Algoritma (IPO)

  1. Input: data pelanggan dalam bentuk data frame (ID, Nama, Daya_VA, kWh, Subsidi).
  2. Process:
    1. Penentuan tarif per kWh dengan percabangan bertingkat (ifelse).
    2. Biaya Pemakaian = kWh × Tarif_per_kWh.
    3. PPJ = 5% × Biaya_Pemakaian.
    4. Total Tagihan = Biaya Pemakaian + PPJ.
    5. Pengkategorian tingkat pemakaian dengan percabangan bertingkat (ifelse).
  3. Output: tabel laporan rekapitulasi pembayaran listrik bulanan.

BAB 3: PENYELESAIAN KASUS

3.1 Langkah 1: Inisialisasi Data Frame Pelanggan

data_listrik <- data.frame(
  ID = c("PLN001", "PLN002", "PLN003", "PLN004", "PLN005", "PLN006", "PLN007", "PLN008"),
  Nama = c("Sagara", "Evander", "Dilan", "Milea", "Ancika", "Naila", "Zidan", "Jovan"),
  Daya_VA = c(450, 900, 900, 1300, 2200, 1300, 2200, 450),
  kWh = c(85, 150, 280, 350, 120, 386, 402, 93),
  Subsidi = c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE)
)

3.2 Langkah 2: Evaluasi Tarif dengan Percabangan Bertingkat

data_listrik$Tarif_per_kWh <- ifelse(data_listrik$Daya_VA == 450, 415,
                              ifelse(data_listrik$Daya_VA == 900 & data_listrik$Subsidi == TRUE, 605,
                              ifelse(data_listrik$Daya_VA == 900 & data_listrik$Subsidi == FALSE, 1352, 1444.7)))

3.3 Langkah 3: Perhitungan Biaya, PPJ, dan Total Tagihan

data_listrik$Biaya_Pemakaian <- data_listrik$kWh * data_listrik$Tarif_per_kWh
data_listrik$PPJ             <- 0.05 * data_listrik$Biaya_Pemakaian
data_listrik$Total_Tagihan   <- data_listrik$Biaya_Pemakaian + data_listrik$PPJ

3.4 Langkah 4: Kategori Pemakaian Listrik

data_listrik$Kategori <- ifelse(data_listrik$kWh < 100, "Hemat",
                         ifelse(data_listrik$kWh <= 300, "Sedang", "Tinggi"))

3.5 Langkah 5: Menampilkan Hasil Tabel

knitr::kable(data_listrik, caption = "Laporan Perhitungan Tagihan Listrik PLN")
Laporan Perhitungan Tagihan Listrik PLN
ID Nama Daya_VA kWh Subsidi Tarif_per_kWh Biaya_Pemakaian PPJ Total_Tagihan Kategori
PLN001 Sagara 450 85 TRUE 415.0 35275.0 1763.75 37038.75 Hemat
PLN002 Evander 900 150 TRUE 605.0 90750.0 4537.50 95287.50 Sedang
PLN003 Dilan 900 280 FALSE 1352.0 378560.0 18928.00 397488.00 Sedang
PLN004 Milea 1300 350 FALSE 1444.7 505645.0 25282.25 530927.25 Tinggi
PLN005 Ancika 2200 120 FALSE 1444.7 173364.0 8668.20 182032.20 Sedang
PLN006 Naila 1300 386 FALSE 1444.7 557654.2 27882.71 585536.91 Tinggi
PLN007 Zidan 2200 402 FALSE 1444.7 580769.4 29038.47 609807.87 Tinggi
PLN008 Jovan 450 93 TRUE 415.0 38595.0 1929.75 40524.75 Hemat

BAB 4: HASIL DAN PEMBAHASAN

4.1 Hasil

knitr::kable(data_listrik, caption = "Tabel 4.1 Hasil Perhitungan Tagihan Listrik")
Tabel 4.1 Hasil Perhitungan Tagihan Listrik
ID Nama Daya_VA kWh Subsidi Tarif_per_kWh Biaya_Pemakaian PPJ Total_Tagihan Kategori
PLN001 Sagara 450 85 TRUE 415.0 35275.0 1763.75 37038.75 Hemat
PLN002 Evander 900 150 TRUE 605.0 90750.0 4537.50 95287.50 Sedang
PLN003 Dilan 900 280 FALSE 1352.0 378560.0 18928.00 397488.00 Sedang
PLN004 Milea 1300 350 FALSE 1444.7 505645.0 25282.25 530927.25 Tinggi
PLN005 Ancika 2200 120 FALSE 1444.7 173364.0 8668.20 182032.20 Sedang
PLN006 Naila 1300 386 FALSE 1444.7 557654.2 27882.71 585536.91 Tinggi
PLN007 Zidan 2200 402 FALSE 1444.7 580769.4 29038.47 609807.87 Tinggi
PLN008 Jovan 450 93 TRUE 415.0 38595.0 1929.75 40524.75 Hemat
ringkasan <- data.frame(
  Ukuran = c("Total konsumsi (kWh)",
             "Rata-rata konsumsi (kWh)",
             "Total seluruh tagihan",
             "Rata-rata tagihan per pelanggan",
             "Total PPJ",
             "Tagihan tertinggi",
             "Tagihan terendah",
             "Pelanggan Hemat / Sedang / Tinggi"),
  Nilai = c(sum(df$kWh),
            mean(df$kWh),
            rupiah(sum(df$Total_Tagihan)),
            rupiah(mean(df$Total_Tagihan)),
            rupiah(sum(df$PPJ)),
            paste0(df$Nama[which.max(df$Total_Tagihan)], " (", rupiah(max(df$Total_Tagihan)), ")"),
            paste0(df$Nama[which.min(df$Total_Tagihan)], " (", rupiah(min(df$Total_Tagihan)), ")"),
            paste(table(df$Kategori), collapse = " / "))
)

knitr::kable(ringkasan, caption = "Tabel 4.2 Ringkasan Hasil")
Tabel 4.2 Ringkasan Hasil
Ukuran Nilai
Total konsumsi (kWh) 1866
Rata-rata konsumsi (kWh) 233.25
Total seluruh tagihan Rp2.478.643
Rata-rata tagihan per pelanggan Rp309.830
Total PPJ Rp118.031
Tagihan tertinggi Zidan (Rp609.808)
Tagihan terendah Sagara (Rp37.039)
Pelanggan Hemat / Sedang / Tinggi 2 / 3 / 3
ggplot(df, aes(x = reorder(Nama, Total_Tagihan), y = Total_Tagihan, fill = Kategori)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = rupiah(Total_Tagihan)), hjust = -0.1, size = 3.4) +
  coord_flip() +
  scale_fill_manual(values = warna) +
  scale_y_continuous(labels = rupiah, expand = expansion(mult = c(0, 0.25))) +
  labs(title = "Total Tagihan Listrik per Pelanggan",
       subtitle = "Warna menunjukkan kategori pemakaian",
       x = NULL, y = "Total tagihan", fill = "Kategori") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom")
Gambar 4.1 Total tagihan per pelanggan

Gambar 4.1 Total tagihan per pelanggan

Program menghitung tagihan listrik bulanan untuk 8 pelanggan PT PLN dengan daya 450 VA sampai 2200 VA. Total konsumsi seluruh pelanggan adalah 1.866 kWh dengan rata-rata 233,25 kWh per pelanggan. Konsumsi terendah dimiliki Sagara (85 kWh) dan tertinggi Zidan (402 kWh).

Dari konsumsi tersebut, total seluruh tagihan mencapai Rp2.478.643,23 dengan rata-rata Rp309.830,40 per pelanggan, di mana Rp118.030,63 di antaranya adalah PPJ. Tagihan tertinggi dimiliki Zidan sebesar Rp609.807,87 dan terendah Sagara sebesar Rp37.038,75, sehingga tagihan tertinggi sekitar 16,5 kali tagihan terendah.

Berdasarkan Gambar 4.1, tiga pelanggan dengan tagihan terbesar (Zidan, Naila, Milea) semuanya berkategori Tinggi dan non-subsidi, sedangkan tiga pelanggan bersubsidi (Sagara, Jovan, Evander) memiliki tiga tagihan terkecil dan hanya menyumbang sekitar 7% dari total tagihan. Berdasarkan kategori, terdapat 2 pelanggan Hemat, 3 Sedang, dan 3 Tinggi.

4.2 Pembahasan

Perhitungan berjalan sesuai rumus: biaya pemakaian = kWh × tarif, PPJ = 5% dari biaya pemakaian, sehingga total tagihan selalu 1,05 kali biaya pemakaian.

Besar tagihan lebih ditentukan oleh tarif daripada jumlah kWh. Pada Gambar 4.2, titik dengan tarif sama berada pada garis lurus yang sama, sedangkan tarif lebih tinggi membuat garisnya lebih curam. Contohnya Ancika (120 kWh, tarif Rp1.444,7) membayar Rp182.032,20, hampir dua kali tagihan Evander (150 kWh, tarif Rp605) yang membayar Rp95.287,50. Dilan (non-subsidi) juga membayar sekitar 4,2 kali tagihan Evander (bersubsidi) walau konsumsinya hanya 1,9 kali. Selain itu, daya terpasang tidak menentukan besar tagihan: Ancika berdaya 2200 VA tetapi tagihannya lebih kecil daripada Milea yang berdaya 1300 VA dan memakai 350 kWh.

ggplot(df, aes(x = kWh, y = Total_Tagihan, color = factor(Tarif_per_kWh))) +
  geom_vline(xintercept = c(100, 300), linetype = "dashed", color = "grey50") +
  geom_point(size = 4) +
  geom_text(aes(label = Nama), vjust = -1, size = 3.3, show.legend = FALSE) +
  annotate("text", x = 50,  y = Inf, label = "Hemat",  vjust = 1.8, color = "grey30") +
  annotate("text", x = 200, y = Inf, label = "Sedang", vjust = 1.8, color = "grey30") +
  annotate("text", x = 350, y = Inf, label = "Tinggi", vjust = 1.8, color = "grey30") +
  scale_y_continuous(labels = rupiah, expand = expansion(mult = c(0.05, 0.15))) +
  labs(title = "Konsumsi (kWh) vs Total Tagihan",
       subtitle = "Garis putus-putus = batas kategori (100 dan 300 kWh)",
       x = "Konsumsi (kWh)", y = "Total tagihan", color = "Tarif per kWh (Rp)") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom")
Gambar 4.2 Konsumsi (kWh) vs total tagihan

Gambar 4.2 Konsumsi (kWh) vs total tagihan

Kategori pemakaian ditentukan hanya dari kWh (Hemat < 100, Sedang 100-300, Tinggi > 300), bukan dari rupiah. Karena itu satu kategori bisa berisi tagihan yang jauh berbeda, misalnya kategori Sedang berkisar dari Rp95.287,50 sampai Rp397.488,00.

Keterbatasan program ini: nominal subsidi belum dihitung (subsidi hanya memengaruhi tarif), tarif masih ditulis manual di dalam ifelse(), dan datanya hanya 8 pelanggan sehingga bersifat ilustrasi.


BAB 5: KESIMPULAN

Berdasarkan praktikum yang telah dilakukan, bahasa R terbukti dapat digunakan untuk mengotomatisasi perhitungan tagihan listrik menggunakan data frame dan operasi vektor. Program menghitung biaya pemakaian, PPJ, total tagihan, dan kategori pemakaian untuk 8 pelanggan sekaligus tanpa loop, dengan total tagihan seluruh pelanggan sebesar Rp2.478.643,23 dan rata-rata Rp309.830,40 per pelanggan. Percabangan ifelse() bertingkat mampu menentukan tarif per kWh berdasarkan daya dan status subsidi serta mengelompokkan pelanggan ke dalam kategori Hemat, Sedang, dan Tinggi secara otomatis, dengan hasil 2 pelanggan Hemat, 3 Sedang, dan 3 Tinggi.

Hasil juga menunjukkan bahwa besar tagihan lebih dipengaruhi oleh golongan tarif dan jumlah kWh yang dipakai daripada daya terpasang. Dilan yang non-subsidi mengonsumsi sekitar 1,9 kali Evander yang bersubsidi, tetapi membayar sekitar 4,2 kali lipat. Tagihan tertinggi dimiliki Zidan sebesar Rp609.807,87 dan terendah Sagara sebesar Rp37.038,75, sedangkan pelanggan bersubsidi hanya menyumbang sekitar 7% dari total tagihan. Visualisasi dalam bentuk grafik membantu memperlihatkan perbedaan antar pelanggan dan pengaruh tarif dengan lebih jelas dibandingkan tabel saja.

Untuk pengembangan selanjutnya, program dapat ditambahkan perhitungan nominal subsidi, tabel tarif terpisah agar tarif tidak ditulis manual di dalam ifelse(), validasi input, serta penggunaan case_when() agar percabangan lebih mudah dibaca.