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 pelanggan yang akan digunakan merupakan data sintetis (simulasi)
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.
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
Analisis menunjukkan bahwa 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.
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.
Pemrosesan menggunakan R terbukti efektif mengotomatisasi perhitungan tagihan listrik secara presisi melalui struktur Data Frame dan operasi vektor. Penggunaan percabangan ifelse bertingkat mampu menentukan tarif, status subsidi, dan kategori pemakaian 8 pelanggan secara otomatis tanpa perulangan. Sehingga adanya R mampu menghadirkan solusi perhitungan yang cepat, transparan, dan minim risiko kesalahan manusia untuk pemrosesan data berskala lebih luas.