Dosen Pengampu: Bayutama Isnaini, S.Si., M.Si.
Disusun oleh: 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 |
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.
Setelah mempelajari modul ini, pembaca mampu:
==,
>=, <=) dan operator logika
(&, |) untuk pengujian kondisi.ifelse().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.
| 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:
ifelse).ifelse).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)
)
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)))
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
data_listrik$Kategori <- ifelse(data_listrik$kWh < 100, "Hemat",
ifelse(data_listrik$kWh <= 300, "Sedang", "Tinggi"))
knitr::kable(data_listrik, caption = "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 |
knitr::kable(data_listrik, caption = "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")
| 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
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.
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
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.
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.