Dosen Pengampu: Bayutama Isnaini, S.Si., M.Si.
Disusun oleh: Kelompok D
| Nama | NIM |
|---|---|
| Adelia Meytha Pramesti | 21108062610001 |
| Arlonnsy Reinzo Oriordan | 21108062610013 |
| Caraka Sakti Andaru | 21108062610019 |
| Davina Intan Diva Puteri | 21108062610025 |
| Ezra Filya Pasaribu | 21108062610030 |
Setelah mempelajari modul ini, pembaca mampu:
ifelse() (termasuk
percabangan bertingkat).Sebuah lembaga ingin menentukan keluarga mana yang paling membutuhkan bantuan pendidikan. Setiap keluarga dinilai dari 7 kriteria. Setiap kriteria diberi skor, semakin tinggi skor berarti semakin membutuhkan bantuan. Skor dari semua kriteria dijumlahkan menjadi total skor, lalu dikelompokkan menjadi desil (1 sampai 10) dan status prioritas.
| Kriteria | Aturan | Skor |
|---|---|---|
| Pendapatan orang tua/bulan | \(\le\) 1.500.000 | 3 |
| \(\le\) 3.000.000 | 2 | |
| selain itu | 1 | |
| Jumlah anggota keluarga | \(\ge\) 6 | 3 |
| \(\ge\) 3 | 2 | |
| selain itu | 1 | |
| Jumlah tanggungan | \(\ge\) 5 | 3 |
| \(\ge\) 3 | 2 | |
| selain itu | 1 | |
| Status tempat tinggal | Menumpang | 3 |
| Kontrak | 2 | |
| selain itu (milik sendiri) | 1 | |
| Jumlah anak sekolah/kuliah | \(\ge\) 4 | 4 |
| 3 | 3 | |
| 2 | 2 | |
| selain itu | 1 | |
| Rasio pengeluaran (pengeluaran : pendapatan) | \(\ge\) 1 | 4 |
| \(\ge\) 0,75 | 3 | |
| \(\ge\) 0,50 | 2 | |
| selain itu | 1 | |
| Kepemilikan kendaraan | Tidak punya | 3 |
| 1 motor | 2 | |
| selain itu | 1 |
| Total Skor | Desil | Desil | Status Prioritas | |
|---|---|---|---|---|
| \(\ge\) 20 | 1 | 1 sampai 3 | Sangat Prioritas | |
| 18 sampai 19 | 2 | 4 sampai 7 | Prioritas Sedang | |
| 16 sampai 17 | 3 | 8 sampai 10 | Prioritas Rendah | |
| 14 sampai 15 | 4 | |||
| 12 sampai 13 | 5 | |||
| 10 sampai 11 | 6 | |||
| 8 sampai 9 | 7 | |||
| 6 sampai 7 | 8 | |||
| 4 sampai 5 | 9 | |||
| \(<\) 4 | 10 |
pendapatan <- 2000000
pendapatan <= 1500000
## [1] FALSE
pendapatan <= 3000000
## [1] TRUE
ifelse()Bentuk umumnya:
ifelse(kondisi, nilai_jika_benar, nilai_jika_salah). Fungsi
ini bekerja pada seluruh isi vektor sekaligus, jadi cocok untuk data
banyak baris.
pendapatan <- c(1000000, 2500000, 5000000)
ifelse(pendapatan <= 1500000, 3,
ifelse(pendapatan <= 3000000, 2, 1)
)
## [1] 3 2 1
Percabangan di atas bertingkat: jika kondisi pertama salah, R memeriksa kondisi kedua, dan seterusnya.
Data yang dipakai berupa data sintesis (buatan
sendiri) berisi 20 keluarga. Jika file data_keluarga.xlsx
tersedia di folder yang sama dengan file Rmd ini, maka data akan dibaca
dari file tersebut.
file_data <- "data_keluarga.xlsx"
if (file.exists(file_data)) {
# Data asli dibaca dari Excel
library(readxl)
data_keluarga <- read_excel(file_data)
} else {
# Data sintesis
set.seed(2026)
n <- 20
anggota <- sample(2:8, n, replace = TRUE)
tanggungan <- pmin(sample(1:6, n, replace = TRUE), anggota - 1)
anak <- pmin(sample(0:4, n, replace = TRUE), tanggungan)
pendapatan <- sample(seq(800000, 8000000, by = 100000), n, replace = TRUE)
data_keluarga <- data.frame(
ID = paste0("K", sprintf("%02d", 1:n)),
`Pendapatan Orang Tua/Bulan` = pendapatan,
`Jumlah Anggota Keluarga` = anggota,
`Jumlah Tanggungan` = tanggungan,
`Status Tempat Tinggal` = sample(c("Menumpang", "Kontrak", "Milik sendiri"),
n, replace = TRUE),
`Jumlah Anak Sekolah/Kuliah` = anak,
`Pengeluaran/Bulan` = round(pendapatan * runif(n, 0.4, 1.2), -3),
`Kepemilikan Kendaraan` = sample(c("Tidak punya", "1 motor", "Lebih dari 1 kendaraan"),
n, replace = TRUE),
check.names = FALSE
)
}
knitr::kable(data_keluarga, caption = "Data keluarga")
| ID | Pendapatan Orang Tua/Bulan | Jumlah Anggota Keluarga | Jumlah Tanggungan | Status Tempat Tinggal | Jumlah Anak Sekolah/Kuliah | Pengeluaran/Bulan | Kepemilikan Kendaraan |
|---|---|---|---|---|---|---|---|
| K01 | 3600000 | 6 | 2 | Milik sendiri | 2 | 1452000 | Tidak punya |
| K02 | 5400000 | 2 | 1 | Menumpang | 1 | 2842000 | Lebih dari 1 kendaraan |
| K03 | 5900000 | 2 | 1 | Menumpang | 0 | 4759000 | 1 motor |
| K04 | 4300000 | 7 | 6 | Menumpang | 3 | 3643000 | 1 motor |
| K05 | 3200000 | 6 | 2 | Menumpang | 2 | 2141000 | Tidak punya |
| K06 | 3800000 | 8 | 5 | Menumpang | 0 | 3643000 | 1 motor |
| K07 | 7100000 | 4 | 3 | Menumpang | 3 | 4457000 | Lebih dari 1 kendaraan |
| K08 | 7200000 | 5 | 4 | Kontrak | 1 | 5772000 | 1 motor |
| K09 | 7700000 | 5 | 4 | Milik sendiri | 0 | 7032000 | Tidak punya |
| K10 | 5200000 | 6 | 3 | Kontrak | 2 | 5870000 | 1 motor |
| K11 | 1100000 | 8 | 4 | Menumpang | 1 | 506000 | Tidak punya |
| K12 | 1500000 | 5 | 3 | Milik sendiri | 3 | 838000 | Lebih dari 1 kendaraan |
| K13 | 6300000 | 3 | 2 | Menumpang | 2 | 5735000 | 1 motor |
| K14 | 7700000 | 3 | 2 | Menumpang | 2 | 7215000 | 1 motor |
| K15 | 5800000 | 4 | 3 | Milik sendiri | 3 | 2580000 | Tidak punya |
| K16 | 3000000 | 8 | 4 | Kontrak | 3 | 1594000 | 1 motor |
| K17 | 800000 | 6 | 2 | Menumpang | 0 | 351000 | 1 motor |
| K18 | 2400000 | 7 | 2 | Kontrak | 0 | 2848000 | Lebih dari 1 kendaraan |
| K19 | 4200000 | 2 | 1 | Kontrak | 1 | 3479000 | Tidak punya |
| K20 | 2700000 | 5 | 4 | Menumpang | 4 | 2709000 | 1 motor |
data_keluarga$Skor_Pendapatan <- ifelse(
data_keluarga$`Pendapatan Orang Tua/Bulan` <= 1500000, 3,
ifelse(data_keluarga$`Pendapatan Orang Tua/Bulan` <= 3000000, 2, 1)
)
data_keluarga$Skor_Pendapatan
## [1] 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 2 3 2 1 2
data_keluarga$Skor_Anggota <- ifelse(
data_keluarga$`Jumlah Anggota Keluarga` >= 6, 3,
ifelse(data_keluarga$`Jumlah Anggota Keluarga` >= 3, 2, 1)
)
data_keluarga$Skor_Anggota
## [1] 3 1 1 3 3 3 2 2 2 3 3 2 2 2 2 3 3 3 1 2
data_keluarga$Skor_Tanggungan <- ifelse(
data_keluarga$`Jumlah Tanggungan` >= 5, 3,
ifelse(data_keluarga$`Jumlah Tanggungan` >= 3, 2, 1)
)
data_keluarga$Skor_Tanggungan
## [1] 1 1 1 3 1 3 2 2 2 2 2 2 1 1 2 2 1 1 1 2
Pada kriteria ini yang dibandingkan adalah teks, sehingga memakai
operator ==.
data_keluarga$Skor_Tempat_Tinggal <- ifelse(
data_keluarga$`Status Tempat Tinggal` == "Menumpang", 3,
ifelse(data_keluarga$`Status Tempat Tinggal` == "Kontrak", 2, 1)
)
data_keluarga$Skor_Tempat_Tinggal
## [1] 1 3 3 3 3 3 3 2 1 2 3 1 3 3 1 2 3 2 2 3
data_keluarga$Skor_Anak <- ifelse(
data_keluarga$`Jumlah Anak Sekolah/Kuliah` >= 4, 4,
ifelse(
data_keluarga$`Jumlah Anak Sekolah/Kuliah` >= 3, 3,
ifelse(data_keluarga$`Jumlah Anak Sekolah/Kuliah` >= 2, 2, 1)
)
)
data_keluarga$Skor_Anak
## [1] 2 1 1 3 2 1 3 1 1 2 1 3 2 2 3 3 1 1 1 4
Rasio pengeluaran dihitung dengan membagi pengeluaran bulanan dengan pendapatan bulanan.
data_keluarga$Rasio_Pengeluaran <-
data_keluarga$`Pengeluaran/Bulan` /
data_keluarga$`Pendapatan Orang Tua/Bulan`
data_keluarga$Skor_Pengeluaran <- ifelse(
data_keluarga$Rasio_Pengeluaran >= 1, 4,
ifelse(
data_keluarga$Rasio_Pengeluaran >= 0.75, 3,
ifelse(data_keluarga$Rasio_Pengeluaran >= 0.50, 2, 1)
)
)
round(data_keluarga$Rasio_Pengeluaran, 2)
## [1] 0.40 0.53 0.81 0.85 0.67 0.96 0.63 0.80 0.91 1.13 0.46 0.56 0.91 0.94 0.44
## [16] 0.53 0.44 1.19 0.83 1.00
data_keluarga$Skor_Pengeluaran
## [1] 1 2 3 3 2 3 2 3 3 4 1 2 3 3 1 2 1 4 3 4
data_keluarga$Skor_Kendaraan <- ifelse(
data_keluarga$`Kepemilikan Kendaraan` == "Tidak punya", 3,
ifelse(data_keluarga$`Kepemilikan Kendaraan` == "1 motor", 2, 1)
)
data_keluarga$Skor_Kendaraan
## [1] 3 1 2 2 3 2 1 2 3 2 3 1 2 2 3 2 2 1 3 2
data_keluarga$Total_Skor <-
data_keluarga$Skor_Pendapatan +
data_keluarga$Skor_Anggota +
data_keluarga$Skor_Tanggungan +
data_keluarga$Skor_Tempat_Tinggal +
data_keluarga$Skor_Anak +
data_keluarga$Skor_Pengeluaran +
data_keluarga$Skor_Kendaraan
data_keluarga$Total_Skor
## [1] 12 10 12 18 15 16 14 13 13 16 16 14 14 14 13 16 14 14 12 19
data_keluarga$Desil <- ifelse(
data_keluarga$Total_Skor >= 20, 1,
ifelse(
data_keluarga$Total_Skor >= 18, 2,
ifelse(
data_keluarga$Total_Skor >= 16, 3,
ifelse(
data_keluarga$Total_Skor >= 14, 4,
ifelse(
data_keluarga$Total_Skor >= 12, 5,
ifelse(
data_keluarga$Total_Skor >= 10, 6,
ifelse(
data_keluarga$Total_Skor >= 8, 7,
ifelse(
data_keluarga$Total_Skor >= 6, 8,
ifelse(data_keluarga$Total_Skor >= 4, 9, 10)
)
)
)
)
)
)
)
)
Tabel hasil skor, total skor, dan desil:
hasil <- data_keluarga[, c(
"ID",
"Skor_Pendapatan",
"Skor_Anggota",
"Skor_Tanggungan",
"Skor_Tempat_Tinggal",
"Skor_Anak",
"Skor_Pengeluaran",
"Skor_Kendaraan",
"Total_Skor",
"Desil"
)]
knitr::kable(hasil, caption = "Hasil penskoran dan desil")
| ID | Skor_Pendapatan | Skor_Anggota | Skor_Tanggungan | Skor_Tempat_Tinggal | Skor_Anak | Skor_Pengeluaran | Skor_Kendaraan | Total_Skor | Desil |
|---|---|---|---|---|---|---|---|---|---|
| K01 | 1 | 3 | 1 | 1 | 2 | 1 | 3 | 12 | 5 |
| K02 | 1 | 1 | 1 | 3 | 1 | 2 | 1 | 10 | 6 |
| K03 | 1 | 1 | 1 | 3 | 1 | 3 | 2 | 12 | 5 |
| K04 | 1 | 3 | 3 | 3 | 3 | 3 | 2 | 18 | 2 |
| K05 | 1 | 3 | 1 | 3 | 2 | 2 | 3 | 15 | 4 |
| K06 | 1 | 3 | 3 | 3 | 1 | 3 | 2 | 16 | 3 |
| K07 | 1 | 2 | 2 | 3 | 3 | 2 | 1 | 14 | 4 |
| K08 | 1 | 2 | 2 | 2 | 1 | 3 | 2 | 13 | 5 |
| K09 | 1 | 2 | 2 | 1 | 1 | 3 | 3 | 13 | 5 |
| K10 | 1 | 3 | 2 | 2 | 2 | 4 | 2 | 16 | 3 |
| K11 | 3 | 3 | 2 | 3 | 1 | 1 | 3 | 16 | 3 |
| K12 | 3 | 2 | 2 | 1 | 3 | 2 | 1 | 14 | 4 |
| K13 | 1 | 2 | 1 | 3 | 2 | 3 | 2 | 14 | 4 |
| K14 | 1 | 2 | 1 | 3 | 2 | 3 | 2 | 14 | 4 |
| K15 | 1 | 2 | 2 | 1 | 3 | 1 | 3 | 13 | 5 |
| K16 | 2 | 3 | 2 | 2 | 3 | 2 | 2 | 16 | 3 |
| K17 | 3 | 3 | 1 | 3 | 1 | 1 | 2 | 14 | 4 |
| K18 | 2 | 3 | 1 | 2 | 1 | 4 | 1 | 14 | 4 |
| K19 | 1 | 1 | 1 | 2 | 1 | 3 | 3 | 12 | 5 |
| K20 | 2 | 2 | 2 | 3 | 4 | 4 | 2 | 19 | 2 |
data_keluarga$Status_Prioritas <- ifelse(
data_keluarga$Desil <= 3, "Sangat Prioritas",
ifelse(data_keluarga$Desil <= 7, "Prioritas Sedang", "Prioritas Rendah")
)
table(data_keluarga$Status_Prioritas)
##
## Prioritas Sedang Sangat Prioritas
## 14 6
Keluarga diurutkan dari total skor tertinggi. Tanda minus pada
-Total_Skor membuat skor terbesar mendapat ranking 1.
data_keluarga$Ranking <- rank(
-data_keluarga$Total_Skor,
ties.method = "first"
)
data_keluarga <- data_keluarga[order(data_keluarga$Ranking), ]
tabel_ranking <- data_keluarga[, c(
"Ranking", "ID", "Total_Skor", "Desil", "Status_Prioritas"
)]
knitr::kable(tabel_ranking, row.names = FALSE, caption = "Ranking keluarga")
| Ranking | ID | Total_Skor | Desil | Status_Prioritas |
|---|---|---|---|---|
| 1 | K20 | 19 | 2 | Sangat Prioritas |
| 2 | K04 | 18 | 2 | Sangat Prioritas |
| 3 | K06 | 16 | 3 | Sangat Prioritas |
| 4 | K10 | 16 | 3 | Sangat Prioritas |
| 5 | K11 | 16 | 3 | Sangat Prioritas |
| 6 | K16 | 16 | 3 | Sangat Prioritas |
| 7 | K05 | 15 | 4 | Prioritas Sedang |
| 8 | K07 | 14 | 4 | Prioritas Sedang |
| 9 | K12 | 14 | 4 | Prioritas Sedang |
| 10 | K13 | 14 | 4 | Prioritas Sedang |
| 11 | K14 | 14 | 4 | Prioritas Sedang |
| 12 | K17 | 14 | 4 | Prioritas Sedang |
| 13 | K18 | 14 | 4 | Prioritas Sedang |
| 14 | K08 | 13 | 5 | Prioritas Sedang |
| 15 | K09 | 13 | 5 | Prioritas Sedang |
| 16 | K15 | 13 | 5 | Prioritas Sedang |
| 17 | K01 | 12 | 5 | Prioritas Sedang |
| 18 | K03 | 12 | 5 | Prioritas Sedang |
| 19 | K19 | 12 | 5 | Prioritas Sedang |
| 20 | K02 | 10 | 6 | Prioritas Sedang |
cat("Total keluarga :", nrow(data_keluarga), "\n")
## Total keluarga : 20
cat("Skor tertinggi :", max(data_keluarga$Total_Skor), "\n")
## Skor tertinggi : 19
cat("Skor terendah :", min(data_keluarga$Total_Skor), "\n")
## Skor terendah : 10
cat("Rata-rata skor :", round(mean(data_keluarga$Total_Skor), 2), "\n")
## Rata-rata skor : 14.25
Visualisasi jumlah keluarga pada setiap status prioritas:
barplot(
table(data_keluarga$Status_Prioritas),
main = "Jumlah Keluarga per Status Prioritas",
xlab = "Status Prioritas",
ylab = "Jumlah Keluarga",
col = c("tomato", "gold", "skyblue")
)
Keluarga dengan ranking teratas adalah keluarga dengan total skor tertinggi, yaitu keluarga yang paling membutuhkan bantuan menurut kriteria yang dipakai.
Hasil analisis disimpan ke file Excel dengan 3 sheet: Dashboard, Hasil Analisis, dan Data Awal. File akan tersimpan di folder yang sama dengan file Rmd ini.
library(openxlsx)
wb <- createWorkbook()
addWorksheet(wb, "Dashboard")
addWorksheet(wb, "Hasil Analisis")
addWorksheet(wb, "Data Awal")
# Dashboard
writeData(wb, "Dashboard", "HASIL ANALISIS DESIL KELUARGA", 1, 1)
writeData(wb, "Dashboard", "Total Keluarga", 4, 1)
writeData(wb, "Dashboard", nrow(data_keluarga), 4, 2)
writeData(wb, "Dashboard", "Skor Tertinggi", 5, 1)
writeData(wb, "Dashboard", max(data_keluarga$Total_Skor), 5, 2)
writeDataTable(
wb, "Dashboard", tabel_ranking,
startRow = 8, startCol = 1,
tableStyle = "TableStyleMedium2"
)
# Hasil analisis
writeDataTable(
wb, "Hasil Analisis", data_keluarga,
startRow = 1, startCol = 1,
tableStyle = "TableStyleMedium2"
)
# Data awal
data_awal <- data_keluarga[, c(
"ID",
"Pendapatan Orang Tua/Bulan",
"Jumlah Anggota Keluarga",
"Jumlah Tanggungan",
"Status Tempat Tinggal",
"Jumlah Anak Sekolah/Kuliah",
"Pengeluaran/Bulan",
"Kepemilikan Kendaraan"
)]
writeDataTable(
wb, "Data Awal", data_awal,
startRow = 1, startCol = 1,
tableStyle = "TableStyleMedium2"
)
# Lebar kolom
setColWidths(wb, "Dashboard", 1:5, "auto")
setColWidths(wb, "Hasil Analisis", 1:ncol(data_keluarga), "auto")
setColWidths(wb, "Data Awal", 1:ncol(data_awal), "auto")
# Simpan
saveWorkbook(wb, "Hasil_Analisis_Desil.xlsx", overwrite = TRUE)
print("File berhasil dibuat")
## [1] "File berhasil dibuat"
Dengan variabel, operator perbandingan, dan percabangan bertingkat
(ifelse), kita dapat mengubah data mentah keluarga menjadi
skor, desil, dan status prioritas secara otomatis. Pendekatan yang sama
dapat dipakai untuk kasus lain yang membutuhkan klasifikasi berdasarkan
aturan, seperti penentuan diskon belanja atau grade nilai.