#Menyiapkan data dengan input data di excel atau juga bisa langsung dari R

library(readr) #Membaca data
library(dplyr) #Data processing
## 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(DT) #Menampilkan tabel agar mudah dilihat di browser
## Warning: package 'DT' was built under R version 4.3.3
library(cluster)
## Warning: package 'cluster' was built under R version 4.3.3
#import data excel ke R
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
dataset <- read_excel("D:/3SD2/APG/Praktikum/P11/praktikum11.xlsx")
head(dataset)
## # A tibble: 6 × 6
##   `Kabupaten/Kota` Kriminalitas JumlahRumahSakit KepadatanPenduduk   IPM     UMK
##   <chr>                   <dbl>            <dbl>             <dbl> <dbl>   <dbl>
## 1 Cilacap                   394                9               804  69.6 1841209
## 2 Banyumas                  895               16              1265  71.3 1589000
## 3 Purbalingga               193                4              1190  68.4 1655200
## 4 Banjarnegara              183                3               858  66.5 1490000
## 5 Kebumen                   256               10               932  68.8 1560000
## 6 Purworejo                 159                8               692  71.9 1573000
#Standarisasi variabel
datatable(dataset, caption = "Variabel")
data_standardized <- round(scale(dataset[,2:6]),4) #Hanya memilih kolom/variabel yang berisikan indikator yang akan digunakan
datatable(data_standardized, caption = "Data Hasil Standardisasi")
head(data_standardized)
##      Kriminalitas JumlahRumahSakit KepadatanPenduduk     IPM     UMK
## [1,]      -0.3831           0.2195           -0.4905 -0.3726 -0.0509
## [2,]       0.2998           1.3299           -0.2828 -0.0135 -0.5360
## [3,]      -0.6572          -0.5737           -0.3166 -0.6100 -0.4087
## [4,]      -0.6708          -0.7323           -0.4662 -0.9959 -0.7263
## [5,]      -0.5713           0.3781           -0.4328 -0.5295 -0.5917
## [6,]      -0.7035           0.0608           -0.5410  0.1041 -0.5667

Standarisasi data dilakukan untuk menyamakan semua satuan pengukuran variabel, karena data yang digunakan memiliki satuan dan rentang yang berbeda sehingga perlu dinormalisasi sebelum masuk ke analisis klaster

#Menentukan Jumlah Klaster

jumlah_klaster <- c(1:9) #Vektor yang berisikan jumlah klaster yang ingin dilihat nilai dari total within-cluster sum of squares
within_ss <- c() #Vektor kosong yang akan diisi nilai total within-cluster sum of squares
for (i in jumlah_klaster) {
 within_ss <- c(within_ss, kmeans(x = data_standardized, centers = i, nstart =
25)$tot.withinss)
}
plot(x = jumlah_klaster, y = within_ss, type = "b", xlab = "Number of Cluster",
 ylab = "Total Within Sum of Squares", main = "Elbow Plot")
abline(v = 7, col = 'red')

Dari Elbow Plot di atas, dapat dilihat bahwa pada titik ke tujuh nilai total WSS mulai menunjukkan penurunan yang kurang berarti, sehingga berdasarkan plot tersebut akan ditentukan jumlah klaster yang akan dibentuk adalah tujuh klaster.

#Analisis Cluster

set.seed(123)
kmeans_clustering <- kmeans(x = data_standardized, centers = 7, nstart = 25) #parameter nstart digunakan untuk memberitahu fungsi berapa kali inisiasi centroid awal (secara acak) yang akan dibentuk.
kmeans_clustering
## K-means clustering with 7 clusters of sizes 9, 3, 20, 3, 8, 2, 28
## 
## Cluster means:
##   Kriminalitas JumlahRumahSakit KepadatanPenduduk         IPM        UMK
## 1 -0.190166667       -0.4855444         1.5870444  1.20640000 -0.1813778
## 2 -0.005533333        0.8539667        -0.2922333  0.08483333  3.2804000
## 3 -0.369370000       -0.2008950        -0.3604250  0.26878500 -0.2267200
## 4  1.072800000        1.2770333         2.5272000  2.13080000  0.5421333
## 5  1.121025000        0.7945375        -0.4590375 -0.37238750  0.1712375
## 6  4.164650000        4.1059000         1.7895500  1.90995000  3.2936000
## 7 -0.407153571       -0.4490357        -0.4888000 -0.84718214 -0.4734857
## 
## Clustering vector:
##  [1] 3 5 7 7 7 3 7 7 3 3 3 7 3 3 7 7 7 3 3 3 3 3 7 3 7 7 7 7 7 1 4 1 4 1 3 7 7 7
## [39] 5 3 5 5 7 5 5 7 7 5 2 6 2 5 3 3 3 7 7 7 3 2 7 7 7 7 1 1 4 1 1 1 1 6 3
## 
## Within cluster sum of squares by cluster:
## [1]  9.475125  4.117009 13.178720 10.603871 12.497746  5.350801 15.614834
##  (between_SS / total_SS =  80.3 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Pengelompokan objek ke dalam 7 klaster berdasarkan nilai centroid dari masing-masing variabel. Objek objek dengan nilai centroid yang hampir sama akan dikelompokkan dalam satu klaster sehingga didapat pembagian klasternya sebagai berikut:

K-means clustering with 7 clusters of sizes 9, 3, 20, 3, 8, 2, 28

Dari output diatas dapat di ketahui bahwa klaster pertama beranggotakan 9 observasi, klaster kedua 3 observasi, klaster ketiga 20 observasi, klaster ke empat 3 observasi, klaster kelima 8 observasi, klaster keenam 2 observasi, dan terakhir klaster ketujuh 28 observasi.

Selanjutnya output diatas menunjukkan nomor klaster untuk setiap observasi. Dari output di atas dapat dilihat bahwa mayoritas kabupaten/kota baik di Jawa Tengah maupun Jawa Timur di kelompokkan dalam klaster 7 dan 3, sedangkan klaster yang paling sedikit pengelompokannya adalah klaster 2, 4 dan 6.

Clustering vector: Observasi pertama ([1]) termasuk ke dalam klaster 3. Observasi kedua ([2]) termasuk ke dalam klaster 5. Observasi ketiga ([3]) termasuk ke dalam klaster 7, dan seterusnya.

Within cluster sum of squares by cluster memberikan ukuran seberapa “kompak”(observasi lebih dekat ke centroidnya) observasi dalam klaster.

Nilai between_SS / total_SS = 80.3% menunjukkan proporsi variasi total data yang dijelaskan oleh pengelompokan klaster.

#Untuk mendapatkan nilai centroid sesuai data aslinya, maka kita bisa melakukan langkah berikut: Setelah cluster terbentuk, selanjutnya mengembalikan nilai centroid ke satuan pengukuran awal masing masing variabel untuk melihat rata-rata asli dari variabel tersebut.

dataset %>%
  mutate(Klaster = kmeans_clustering$cluster) %>%
  group_by(Klaster) %>% 
  summarise(
    Mean_kriminalitas = mean(Kriminalitas), 
    Mean_jumlahRS = mean(JumlahRumahSakit), 
    Mean_kepadatanpnddk = mean(KepadatanPenduduk), 
    Mean_IPM = mean(IPM), 
    Mean_UMK = mean(UMK)
  )
## # A tibble: 7 × 6
##   Klaster Mean_kriminalitas Mean_jumlahRS Mean_kepadatanpnddk Mean_IPM Mean_UMK
##     <int>             <dbl>         <dbl>               <dbl>    <dbl>    <dbl>
## 1       1              536.          4.56               5415.     77.2 1773388.
## 2       2              671          13                  1244      71.8 3573506.
## 3       3              404.          6.35               1093.     72.7 1749804.
## 4       4             1462          15.7                7501      81.7 2149620.
## 5       5             1497.         12.6                 874.     69.6 1956743.
## 6       6             3730          33.5                5864      80.6 3580371.
## 7       7              376.          4.79                808.     67.3 1621483.

#Pengelompokan objek ke dalam cluster

dataset %>%
  mutate(Klaster = kmeans_clustering$cluster) %>%
  select(`Kabupaten/Kota`, Klaster) %>%
  arrange(Klaster)
## # A tibble: 73 × 2
##    `Kabupaten/Kota` Klaster
##    <chr>              <int>
##  1 KotaMagelang           1
##  2 KotaSalatiga           1
##  3 KotaPekalongan         1
##  4 KotaKediri             1
##  5 KotaBlitar             1
##  6 KotaProbolinggo        1
##  7 KotaPasuruan           1
##  8 KotaMojokerto          1
##  9 KotaMadiun             1
## 10 Pasuruan               2
## # ℹ 63 more rows
View(dataset %>%
       mutate (Klaster = kmeans_clustering$cluster) %>%
       select(`Kabupaten/Kota`, Klaster) %>%
       arrange(Klaster))