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

1 Modul Praktikum: Penentuan Desil dan Prioritas Keluarga

1.1 Tujuan Pembelajaran

Setelah mempelajari modul ini, pembaca mampu:

  1. Menggunakan variabel, vektor, dan data frame di R.
  2. Menggunakan operator perbandingan dan aritmetika.
  3. Menyusun percabangan dengan ifelse() (termasuk percabangan bertingkat).
  4. Menyelesaikan kasus nyata: menentukan desil dan status prioritas keluarga berdasarkan skor.
  5. Mengekspor hasil analisis ke file Excel.

1.2 Deskripsi Kasus

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.

1.2.1 Aturan Penskoran

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

1.2.2 Aturan Desil dan Status Prioritas

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

2 Konsep Dasar

2.1 Variabel dan Operator Perbandingan

pendapatan <- 2000000

pendapatan <= 1500000
## [1] FALSE
pendapatan <= 3000000
## [1] TRUE

2.2 Percabangan dengan 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.

3 Penyelesaian Kasus

3.1 Langkah 1: Menyiapkan Data

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")
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

3.2 Langkah 2: Menghitung Skor Setiap Kriteria

3.2.1 Skor pendapatan

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

3.2.2 Skor jumlah anggota keluarga

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

3.2.3 Skor jumlah tanggungan

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

3.2.4 Skor status tempat tinggal

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

3.2.5 Skor jumlah anak sekolah/kuliah

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

3.2.6 Rasio dan skor pengeluaran

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

3.2.7 Skor kepemilikan kendaraan

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

3.3 Langkah 3: Menghitung Total Skor

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

3.4 Langkah 4: Menentukan Desil

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")
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

3.5 Langkah 5: Menentukan Status Prioritas

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

3.6 Langkah 6: Membuat Ranking

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 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

4 Hasil dan Pembahasan

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.

5 Ekspor Hasil ke Excel

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"

6 Kesimpulan

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.