library(readxl)
library(factoextra)
x <- "https://raw.githubusercontent.com/lihardodicky/dickygirsang/main/DATA%20PSD%20UAS.csv"
data <- read.csv(url(x))
colnames(data)[1] = "Kabupaten/kota"
data_bersih = data[,-1]
colnames(data_bersih)[1] = "PendudukMiskin"
colnames(data_bersih)[2] = "IndeksPengeluaran"
colnames(data_bersih)[3] = "IPM"
colnames(data_bersih)[4] = "SanitasiLayak"
colnames(data_bersih)[5] = "IndeksPendidikan"
data_bersih$PendudukMiskin <- as.numeric(as.character(data_bersih$PendudukMiskin))
data_bersih$IndeksPengeluaran <- as.numeric(as.character(data_bersih$IndeksPengeluaran))
data_bersih$IPM <- as.numeric(as.character(data_bersih$IPM))
data_bersih$SanitasiLayak <- as.numeric(as.character(data_bersih$SanitasiLayak))
data_bersih$IndeksPendidikan <- as.numeric(as.character(data_bersih$IndeksPendidikan))
head(data_bersih)
## PendudukMiskin IndeksPengeluaran IPM SanitasiLayak IndeksPendidikan
## 1 8.13 71.36 70.60 63.91 62.39
## 2 7.70 66.40 67.07 64.35 57.67
## 3 11.18 63.52 65.56 58.52 57.30
## 4 7.15 71.06 72.73 64.51 65.51
## 5 10.65 63.17 66.45 43.73 58.52
## 6 11.15 62.66 65.90 49.35 59.77
#new
data_bersih2 = data
colnames(data_bersih2)[2] = "PendudukMiskin"
colnames(data_bersih2)[3] = "IndeksPengeluaran"
colnames(data_bersih2)[4] = "IPM"
colnames(data_bersih2)[5] = "SanitasiLayak"
colnames(data_bersih2)[6] = "IndeksPendidikan"
data_bersih2$PendudukMiskin <- as.numeric(as.character(data_bersih2$PendudukMiskin))
data_bersih2$IndeksPengeluaran <- as.numeric(as.character(data_bersih2$IndeksPengeluaran))
data_bersih2$IPM <- as.numeric(as.character(data_bersih2$IPM))
data_bersih2$SanitasiLayak <- as.numeric(as.character(data_bersih2$SanitasiLayak))
data_bersih2$IndeksPendidikan <- as.numeric(as.character(data_bersih2$IndeksPendidikan))
Setelah itu, dilakukan standarisasi dengan menggunakan z-score standarization
data_std <- scale(data_bersih)
head(data_std)
## PendudukMiskin IndeksPengeluaran IPM SanitasiLayak IndeksPendidikan
## [1,] -0.2901787 -0.0725762 -0.2804275 -0.5357278 -0.3033690
## [2,] -0.4387880 -0.9032946 -1.0187576 -0.5085653 -0.9949851
## [3,] 0.7639110 -1.3856472 -1.3345872 -0.8684684 -1.0492008
## [4,] -0.6288698 -0.1228213 0.1650804 -0.4986880 0.1538010
## [5,] 0.5807413 -1.4442665 -1.1484360 -1.7814988 -0.8704356
## [6,] 0.7535429 -1.5296831 -1.2634732 -1.4345596 -0.6872745
par(mfrow=c(1,2))
fviz_nbclust(data_std, FUNcluster = kmeans, method = "wss")
fviz_nbclust(data_std, kmeans, method = "silhouette")
Berdasarkan output di atas, metode Elbow dengan nilai K yang turun secara drastis dan membentuk siku, yaitu terdapat pada K=2. Dengan metode silhoutte diperoleh nilai K=3. Disimpulkan bahwa nilai K yang optimal adalah 3, dengan asumsi jika K=2 masih cenderung kecil.
#Ditetapkan k=3
clustering = kmeans(data_std,centers=3)
clustering
## K-means clustering with 3 clusters of sizes 11, 6, 10
##
## Cluster means:
## PendudukMiskin IndeksPengeluaran IPM SanitasiLayak IndeksPendidikan
## 1 0.5471236 -0.07607813 -0.3568655 0.6502746 -0.5378151
## 2 -1.4012928 1.33931011 1.4897519 0.4425339 1.4205429
## 3 0.2389398 -0.71990012 -0.5012991 -0.9808224 -0.2607291
##
## Clustering vector:
## [1] 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 2 3 1 2 3 2 1 2 2 2 3 1
##
## Within cluster sum of squares by cluster:
## [1] 14.24036 15.30180 20.15790
## (between_SS / total_SS = 61.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(clustering, data = data_std)+ggtitle("Visualisasi dengan K=3")
Lalu, setiap nilai means/centroid yang masih ada di dalam nilai yang terstandarisasi, nilainya perlu dikembalikan ke nilai awal guna diketahui karakteristik sebenarnya dari tiap klaster.
data_akhir <- cbind(data_bersih2, cluster = clustering$cluster)
data_akhir
## Kabupaten/kota PendudukMiskin IndeksPengeluaran IPM SanitasiLayak
## 1 Bogor 8.13 71.36 70.60 63.91
## 2 Sukabumi 7.70 66.40 67.07 64.35
## 3 Cianjur 11.18 63.52 65.56 58.52
## 4 Bandung 7.15 71.06 72.73 64.51
## 5 Garut 10.65 63.17 66.45 43.73
## 6 Tasikmalaya 11.15 62.66 65.90 49.35
## 7 Ciamis 7.97 67.78 70.93 66.59
## 8 Kuningan 13.10 68.27 69.71 80.98
## 9 Cirebon 12.30 71.24 69.12 83.41
## 10 Majalengka 12.33 68.86 67.81 80.59
## 11 Sumedang 10.71 70.93 71.80 87.87
## 12 Indramayu 13.04 69.55 67.64 89.75
## 13 Subang 10.03 72.64 69.13 85.82
## 14 Purwakarta 8.83 74.85 70.98 72.61
## 15 Karawang 8.95 74.47 70.94 77.19
## 16 Bekasi 5.21 73.98 74.45 81.02
## 17 Bandung Barat 11.30 65.33 68.29 63.78
## 18 Pangandaran 9.65 67.14 68.28 81.49
## 19 Kota Bogor 7.24 74.98 76.59 75.35
## 20 Kota Sukabumi 8.25 72.89 74.60 39.64
## 21 Kota Bandung 4.37 86.34 81.96 48.90
## 22 Kota Cirebon 10.03 75.22 75.25 92.71
## 23 Kota Bekasi 4.74 84.31 81.95 97.54
## 24 Kota Depok 2.58 83.37 81.37 97.06
## 25 Kota Cimahi 5.35 75.76 78.06 78.67
## 26 Kota Tasikmalaya 13.13 70.78 73.31 52.62
## 27 Kota Banjar 7.11 71.56 71.92 81.92
## IndeksPendidikan cluster
## 1 62.39 3
## 2 57.67 3
## 3 57.30 3
## 4 65.51 3
## 5 58.52 3
## 6 59.77 3
## 7 65.78 3
## 8 59.97 1
## 9 57.75 1
## 10 58.34 1
## 11 64.46 1
## 12 55.79 1
## 13 56.23 1
## 14 60.67 1
## 15 59.54 1
## 16 67.39 2
## 17 60.33 3
## 18 59.72 1
## 19 72.38 2
## 20 70.42 3
## 21 76.11 2
## 22 70.21 1
## 23 76.87 2
## 24 76.89 2
## 25 75.29 2
## 26 69.12 3
## 27 66.01 1
data_kab <- data.frame("kab/kota"= data_akhir$'Kabupaten/kota',"klaster"= data_akhir$cluster)
data_kab
## kab.kota klaster
## 1 Bogor 3
## 2 Sukabumi 3
## 3 Cianjur 3
## 4 Bandung 3
## 5 Garut 3
## 6 Tasikmalaya 3
## 7 Ciamis 3
## 8 Kuningan 1
## 9 Cirebon 1
## 10 Majalengka 1
## 11 Sumedang 1
## 12 Indramayu 1
## 13 Subang 1
## 14 Purwakarta 1
## 15 Karawang 1
## 16 Bekasi 2
## 17 Bandung Barat 3
## 18 Pangandaran 1
## 19 Kota Bogor 2
## 20 Kota Sukabumi 3
## 21 Kota Bandung 2
## 22 Kota Cirebon 1
## 23 Kota Bekasi 2
## 24 Kota Depok 2
## 25 Kota Cimahi 2
## 26 Kota Tasikmalaya 3
## 27 Kota Banjar 1