WP dan SAW

LIBRARY

# Membersihkan environment
rm(list = ls())

# Library yang diperlukan
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows

DATA

data <- suppressWarnings(
  read_excel("C:/Users/ASUS/Downloads/indeks-desa-membangun-tahun-2024-hasil-pemutakhiran (1).xlsx")
)
## New names:
## • `` -> `...15`
# Melihat struktur data
str(data)
## tibble [75,265 × 15] (S3: tbl_df/tbl/data.frame)
##  $ KODE_PROV      : num [1:75265] 11 11 11 11 11 11 11 11 11 11 ...
##  $ NAMA_PROVINSI  : chr [1:75265] "ACEH" "ACEH" "ACEH" "ACEH" ...
##  $ KODE_KAB       : num [1:75265] 1101 1101 1101 1101 1101 ...
##  $ NAMA_KABUPATEN : chr [1:75265] "ACEH SELATAN" "ACEH SELATAN" "ACEH SELATAN" "ACEH SELATAN" ...
##  $ KODE_KEC       : num [1:75265] 110101 110101 110101 110101 110101 ...
##  $ NAMA_KECAMATAN : chr [1:75265] "BAKONGAN" "BAKONGAN" "BAKONGAN" "BAKONGAN" ...
##  $ KODE_DESA      : num [1:75265] 1.1e+09 1.1e+09 1.1e+09 1.1e+09 1.1e+09 ...
##  $ NAMA_DESA      : chr [1:75265] "KEUDE BAKONGAN" "UJONG MANGKI" "X" "GAMPONG DRIEN" ...
##  $ IKS_2024       : num [1:75265] 0.8 0.663 0.703 0.674 0.703 ...
##  $ IKE_2024       : num [1:75265] 0.9 0.633 0.617 0.533 0.8 ...
##  $ IKL_2024       : num [1:75265] 0.533 0.533 0.533 0.6 0.667 ...
##  $ NILAI_IDM_2024 : num [1:75265] 0.744 0.61 0.618 0.603 0.723 ...
##  $ STATUS_IDM_2024: chr [1:75265] "MAJU" "BERKEMBANG" "BERKEMBANG" "BERKEMBANG" ...
##  $ Keterangan     : logi [1:75265] NA NA NA NA NA NA ...
##  $ ...15          : logi [1:75265] NA NA NA NA NA NA ...
data %>%
  head(10) %>%
  kable(
    caption = "Contoh Data Indeks Desa Membangun (IDM) Tahun 2024",
    digits = 3
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = FALSE,
    position = "center"
  )
Contoh Data Indeks Desa Membangun (IDM) Tahun 2024
KODE_PROV NAMA_PROVINSI KODE_KAB NAMA_KABUPATEN KODE_KEC NAMA_KECAMATAN KODE_DESA NAMA_DESA IKS_2024 IKE_2024 IKL_2024 NILAI_IDM_2024 STATUS_IDM_2024 Keterangan …15
11 ACEH 1101 ACEH SELATAN 110101 BAKONGAN 1101012001 KEUDE BAKONGAN 0.800 0.900 0.533 0.744 MAJU NA NA
11 ACEH 1101 ACEH SELATAN 110101 BAKONGAN 1101012002 UJONG MANGKI 0.663 0.633 0.533 0.610 BERKEMBANG NA NA
11 ACEH 1101 ACEH SELATAN 110101 BAKONGAN 1101012003 X 0.703 0.617 0.533 0.618 BERKEMBANG NA NA
11 ACEH 1101 ACEH SELATAN 110101 BAKONGAN 1101012004 GAMPONG DRIEN 0.674 0.533 0.600 0.603 BERKEMBANG NA NA
11 ACEH 1101 ACEH SELATAN 110101 BAKONGAN 1101012015 DARUL IKHSAN 0.703 0.800 0.667 0.723 MAJU NA NA
11 ACEH 1101 ACEH SELATAN 110101 BAKONGAN 1101012016 PADANG BEURAHAN 0.617 0.633 0.600 0.617 BERKEMBANG NA NA
11 ACEH 1101 ACEH SELATAN 110101 BAKONGAN 1101012017 GAMPONG BARO 0.577 0.667 0.600 0.615 BERKEMBANG NA NA
11 ACEH 1101 ACEH SELATAN 110102 KLUET UTARA 1101022001 FAJAR HARAPAN 0.811 0.617 0.667 0.698 BERKEMBANG NA NA
11 ACEH 1101 ACEH SELATAN 110102 KLUET UTARA 1101022002 KRUENG BATEE 0.846 0.783 0.800 0.810 MAJU NA NA
11 ACEH 1101 ACEH SELATAN 110102 KLUET UTARA 1101022003 PASI KUALA ASAHAN 0.760 0.633 0.667 0.687 BERKEMBANG NA NA

Mengubah Format Angka

data <- data %>%
  mutate(
    IKS_2024 = as.numeric(gsub(",", ".", IKS_2024)),
    IKE_2024 = as.numeric(gsub(",", ".", IKE_2024)),
    IKL_2024 = as.numeric(gsub(",", ".", IKL_2024)),
    NILAI_IDM_2024 = as.numeric(gsub(",", ".", NILAI_IDM_2024))
  )

Menangani NA

desa tetap masuk ranking, hanya nilai NA diganti rata-rata.

data <- data %>%
  mutate(
    IKS_2024 = ifelse(is.na(IKS_2024), mean(IKS_2024, na.rm=TRUE), IKS_2024),
    IKE_2024 = ifelse(is.na(IKE_2024), mean(IKE_2024, na.rm=TRUE), IKE_2024),
    IKL_2024 = ifelse(is.na(IKL_2024), mean(IKL_2024, na.rm=TRUE), IKL_2024)
  )

Matriks Keputusan

X <- data %>%
  dplyr::select(IKS_2024, IKE_2024, IKL_2024)

X <- as.matrix(X)
storage.mode(X) <- "numeric"

Bobot Kriteria

w <- c(1/3, 1/3, 1/3)

METODE SAW

# normalisasi
norm_saw <- sweep(X, 2, apply(X, 2, max), FUN="/")
as.data.frame(norm_saw) %>%
  head(10) %>%
  kable(
    caption = "Matriks Normalisasi Metode SAW",
    digits = 4,
    col.names = c("IKS", "IKE", "IKL")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = FALSE
  )
Matriks Normalisasi Metode SAW
IKS IKE IKL
0.8000 0.9000 0.5333
0.6629 0.6333 0.5333
0.7029 0.6167 0.5333
0.6743 0.5333 0.6000
0.7029 0.8000 0.6667
0.6171 0.6333 0.6000
0.5771 0.6667 0.6000
0.8114 0.6167 0.6667
0.8457 0.7833 0.8000
0.7600 0.6333 0.6667
# preferensi
V_saw <- norm_saw %*% w
V_saw <- as.vector(V_saw)
# ranking
hasil_saw <- data.frame(
  Desa = data$NAMA_DESA,
  Skor_SAW = V_saw
)

hasil_saw <- hasil_saw[order(-hasil_saw$Skor_SAW),]

hasil_saw$Rank_SAW <- 1:nrow(hasil_saw)

hasil_saw %>%
  head(10) %>%
  kable(
    caption = "10 Desa dengan Skor SAW Tertinggi",
    digits = 4
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover"),
    full_width = FALSE
  )
10 Desa dengan Skor SAW Tertinggi
Desa Skor_SAW Rank_SAW
25438 PANJALU 1.0000 1
45915 MAS 1.0000 2
45918 PELIATAN 1.0000 3
23292 KEMANG 0.9981 4
24337 CIBIRU WETAN 0.9981 5
29191 SERANG 0.9981 6
46286 UBUNG KAJA 0.9981 7
27697 CIBENING 0.9962 8
38422 NGROTO 0.9962 9
38947 TEMBOKREJO 0.9962 10

Weighted Product (WP)

options(scipen = 999)
# menghitung nilai S
S <- apply(X, 1, function(x) prod(x^w))

# menghitung nilai preferensi V
V_wp <- S / sum(S)

# ranking WP
hasil_wp <- data.frame(
  Desa = data$NAMA_DESA,
  Skor_WP = V_wp
)

hasil_wp <- hasil_wp[order(-hasil_wp$Skor_WP),]

hasil_wp$Rank_WP <- 1:nrow(hasil_wp)

hasil_wp %>%
  head(10) %>%
  kable(
    caption = "10 Desa dengan Skor Weighted Product Tertinggi",
    digits = 6
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover"),
    full_width = FALSE
  )
10 Desa dengan Skor Weighted Product Tertinggi
Desa Skor_WP Rank_WP
25438 PANJALU 0.000019 1
45915 MAS 0.000019 2
45918 PELIATAN 0.000019 3
23292 KEMANG 0.000019 4
24337 CIBIRU WETAN 0.000019 5
29191 SERANG 0.000019 6
46286 UBUNG KAJA 0.000019 7
27697 CIBENING 0.000019 8
38422 NGROTO 0.000019 9
38947 TEMBOKREJO 0.000019 10

SOAL 1

membandingkan

hasil <- data.frame(
  Desa = data$NAMA_DESA,
  Status_IDM = data$STATUS_IDM_2024,
  Nilai_IDM = data$NILAI_IDM_2024,
  SAW = V_saw,
  Rank_SAW = as.integer(rank(-V_saw, ties.method = "first")),
  WP = V_wp,
  Rank_WP = as.integer(rank(-V_wp, ties.method = "first"))
)
hasil %>%
  head(10) %>%
  kable(
    caption = "Perbandingan Skor dan Ranking Desa Berdasarkan Metode SAW dan Weighted Product",
    digits = c(0,0,4,4,0,8,0),
    col.names = c(
      "Desa",
      "Status IDM",
      "Nilai IDM",
      "Skor SAW",
      "Rank SAW",
      "Skor WP",
      "Rank WP"
    )
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = FALSE,
    position = "center"
  )
Perbandingan Skor dan Ranking Desa Berdasarkan Metode SAW dan Weighted Product
Desa Status IDM Nilai IDM Skor SAW Rank SAW Skor WP Rank WP
KEUDE BAKONGAN MAJU 0.7444 0.7444 30664 0.00001375 32716
UJONG MANGKI BERKEMBANG 0.6098 0.6098 63031 0.00001149 61477
X BERKEMBANG 0.6176 0.6176 61671 0.00001161 60388
GAMPONG DRIEN BERKEMBANG 0.6025 0.6025 64275 0.00001135 62646
DARUL IKHSAN MAJU 0.7232 0.7232 35572 0.00001365 34112
PADANG BEURAHAN BERKEMBANG 0.6168 0.6168 61823 0.00001167 59879
GAMPONG BARO BERKEMBANG 0.6146 0.6146 62172 0.00001161 60434
FAJAR HARAPAN BERKEMBANG 0.6983 0.6983 43392 0.00001312 42316
KRUENG BATEE MAJU 0.8097 0.8097 18377 0.00001531 17164
PASI KUALA ASAHAN BERKEMBANG 0.6867 0.6867 46703 0.00001296 44997

Top hasil

## Top 10 Hasil SAW dan WP

# Top 10 SAW
top10_saw <- hasil %>%
  arrange(desc(SAW)) %>%
  mutate(Rank_SAW = row_number()) %>%
  select(Desa, Status_IDM, SAW, Rank_SAW, WP, Rank_WP) %>%
  slice_head(n = 10)

# Top 10 WP
top10_wp <- hasil %>%
  arrange(desc(WP)) %>%
  mutate(Rank_WP = row_number()) %>%
  select(Desa, Status_IDM, SAW, Rank_SAW, WP, Rank_WP) %>%
  slice_head(n = 10)

kable(top10_saw, caption = "Top 10 Desa Berdasarkan Metode SAW")
Top 10 Desa Berdasarkan Metode SAW
Desa Status_IDM SAW Rank_SAW WP Rank_WP
PANJALU MANDIRI 1.0000 1 0.0000189 1
MAS MANDIRI 1.0000 2 0.0000189 2
PELIATAN MANDIRI 1.0000 3 0.0000189 3
KEMANG MANDIRI 0.9981 4 0.0000189 4
CIBIRU WETAN MANDIRI 0.9981 5 0.0000189 5
SERANG MANDIRI 0.9981 6 0.0000189 6
UBUNG KAJA MANDIRI 0.9981 7 0.0000189 7
CIBENING MANDIRI 0.9962 8 0.0000189 8
NGROTO MANDIRI 0.9962 9 0.0000189 9
TEMBOKREJO MANDIRI 0.9962 10 0.0000189 10
kable(top10_wp, caption = "Top 10 Desa Berdasarkan Metode Weighted Product")
Top 10 Desa Berdasarkan Metode Weighted Product
Desa Status_IDM SAW Rank_SAW WP Rank_WP
PANJALU MANDIRI 1.0000 1 0.0000189 1
MAS MANDIRI 1.0000 2 0.0000189 2
PELIATAN MANDIRI 1.0000 3 0.0000189 3
KEMANG MANDIRI 0.9981 4 0.0000189 4
CIBIRU WETAN MANDIRI 0.9981 5 0.0000189 5
SERANG MANDIRI 0.9981 6 0.0000189 6
UBUNG KAJA MANDIRI 0.9981 7 0.0000189 7
CIBENING MANDIRI 0.9962 8 0.0000189 8
NGROTO MANDIRI 0.9962 9 0.0000189 9
TEMBOKREJO MANDIRI 0.9962 10 0.0000189 10

SOAL 2

Kategori SAW dan WP

hasil <- hasil %>%
  mutate(
    
    # normalisasi WP supaya skalanya 0–1
    WP_norm = WP / max(WP),
    
    kategori_SAW = case_when(
      SAW < 0.4907 ~ "SANGAT TERTINGGAL",
      SAW < 0.5989 ~ "TERTINGGAL",
      SAW < 0.7072 ~ "BERKEMBANG",
      SAW < 0.8155 ~ "MAJU",
      TRUE ~ "MANDIRI"
    ),
    
    kategori_WP = case_when(
      WP_norm < 0.4907 ~ "SANGAT TERTINGGAL",
      WP_norm < 0.5989 ~ "TERTINGGAL",
      WP_norm < 0.7072 ~ "BERKEMBANG",
      WP_norm < 0.8155 ~ "MAJU",
      TRUE ~ "MANDIRI"
    )
    
  )

mismatch <- hasil %>%
  filter(
    Status_IDM != kategori_SAW |
    Status_IDM != kategori_WP
  )

hasil %>%
  select(Desa, Status_IDM, SAW, WP_norm, kategori_SAW, kategori_WP) %>%
  head(10) %>%
  kable(
    caption = "Hasil Kategori Desa Berdasarkan Metode SAW dan Weighted Product",
    digits = 4
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = FALSE,
    position = "center"
  )
Hasil Kategori Desa Berdasarkan Metode SAW dan Weighted Product
Desa Status_IDM SAW WP_norm kategori_SAW kategori_WP
KEUDE BAKONGAN MAJU 0.7444 0.7268 MAJU MAJU
UJONG MANGKI BERKEMBANG 0.6098 0.6072 BERKEMBANG BERKEMBANG
X BERKEMBANG 0.6176 0.6137 BERKEMBANG BERKEMBANG
GAMPONG DRIEN BERKEMBANG 0.6025 0.5998 BERKEMBANG BERKEMBANG
DARUL IKHSAN MAJU 0.7232 0.7211 MAJU MAJU
PADANG BEURAHAN BERKEMBANG 0.6168 0.6167 BERKEMBANG BERKEMBANG
GAMPONG BARO BERKEMBANG 0.6146 0.6134 BERKEMBANG BERKEMBANG
FAJAR HARAPAN BERKEMBANG 0.6983 0.6936 BERKEMBANG BERKEMBANG
KRUENG BATEE MAJU 0.8097 0.8092 MAJU MAJU
PASI KUALA ASAHAN BERKEMBANG 0.6867 0.6846 BERKEMBANG BERKEMBANG
tab_saw <- table(hasil$Status_IDM, hasil$kategori_SAW)

tab_saw %>%
  as.data.frame.matrix() %>%
  kable(
    caption = "Perbandingan Status IDM dengan Kategori Hasil Metode SAW"
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = FALSE,
    position = "center"
  )
Perbandingan Status IDM dengan Kategori Hasil Metode SAW
BERKEMBANG MAJU MANDIRI SANGAT TERTINGGAL TERTINGGAL
BERKEMBANG 24531 1 0 0 0
MAJU 0 23063 0 0 0
MANDIRI 0 0 17203 0 0
SANGAT TERTINGGAL 0 0 0 4363 0
TERTINGGAL 16 0 0 0 6084
tab_wp <- table(hasil$Status_IDM, hasil$kategori_WP)

tab_wp %>%
  as.data.frame.matrix() %>%
  kable(
    caption = "Perbandingan Status IDM dengan Kategori Hasil Metode Weighted Product"
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = FALSE,
    position = "center"
  )
Perbandingan Status IDM dengan Kategori Hasil Metode Weighted Product
BERKEMBANG MAJU MANDIRI SANGAT TERTINGGAL TERTINGGAL
BERKEMBANG 22473 1 0 2 2056
MAJU 2336 20727 0 0 0
MANDIRI 0 1822 15381 0 0
SANGAT TERTINGGAL 0 0 0 4363 0
TERTINGGAL 0 0 0 1290 4810

SOAL 3

Rentang Skor SAW

rentang_saw <- hasil %>%
  group_by(kategori_SAW) %>%
  summarise(
    min = min(SAW),
    max = max(SAW)
  )

rentang_saw %>%
  kable(
    caption = "Rentang Skor SAW Berdasarkan Kategori Desa",
    digits = 4
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover"),
    full_width = FALSE
  )
Rentang Skor SAW Berdasarkan Kategori Desa
kategori_SAW min max
BERKEMBANG 0.5989 0.7071
MAJU 0.7073 0.8154
MANDIRI 0.8155 1.0000
SANGAT TERTINGGAL 0.2176 0.4907
TERTINGGAL 0.4908 0.5989

Rentang Skor WP

## Rentang Skor WP
rentang_wp <- hasil %>%
  group_by(kategori_WP) %>%
  summarise(
    min = min(WP_norm),
    max = max(WP_norm)
  ) %>%
  arrange(min)

rentang_wp %>%
  kable(
    caption = "Rentang Skor Weighted Product Berdasarkan Kategori Desa",
    digits = 4
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover"),
    full_width = FALSE
  )
Rentang Skor Weighted Product Berdasarkan Kategori Desa
kategori_WP min max
SANGAT TERTINGGAL 0.0000 0.4906
TERTINGGAL 0.4907 0.5989
BERKEMBANG 0.5989 0.7072
MAJU 0.7073 0.8155
MANDIRI 0.8157 1.0000