LIBRARY
# Membersihkan environment
rm(list = ls())
# Library yang diperlukan
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
## 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
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'knitr' was built under R version 4.3.3
## 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
|
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"
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
| 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
| 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
|