Packages
Import Data
data <- read_excel("C:\\Users\\Diva\\Documents\\SEMESTER 5\\PSD\\p11\\faskes jabar.xlsx")
head(data)## # A tibble: 6 × 11
## kabkot perawat bidan puskesmas_nonri `puskesmas-ri` dokspes dokgi dokum rs
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 KABUPA… 4374 1950 71 30 1008 79 596 30
## 2 KABUPA… 2167 1516 48 10 199 21 173 9
## 3 KABUPA… 1678 1476 39 8 74 9 90 5
## 4 KABUPA… 2310 876 57 5 303 28 247 15
## 5 KABUPA… 2464 1460 34 33 133 8 98 7
## 6 KABUPA… 1091 1140 21 19 30 27 32 2
## # ℹ 2 more variables: klinik <dbl>, toko_obat <dbl>
Statistika Deskriptif
summary(data)## kabkot perawat bidan puskesmas_nonri
## Length:27 Min. : 494 Min. : 190 Min. : 0.00
## Class :character 1st Qu.:1232 1st Qu.: 667 1st Qu.:14.00
## Mode :character Median :1648 Median : 962 Median :23.00
## Mean :2255 Mean : 979 Mean :28.59
## 3rd Qu.:3039 3rd Qu.:1360 3rd Qu.:38.50
## Max. :6645 Max. :1950 Max. :73.00
## puskesmas-ri dokspes dokgi dokum
## Min. : 0.0 Min. : 20.0 Min. : 1.00 Min. : 12.0
## 1st Qu.: 1.5 1st Qu.: 84.5 1st Qu.: 9.00 1st Qu.: 94.0
## Median : 8.0 Median : 178.0 Median : 19.00 Median : 128.0
## Mean :10.3 Mean : 418.4 Mean : 41.15 Mean : 292.1
## 3rd Qu.:14.0 3rd Qu.: 441.5 3rd Qu.: 44.50 3rd Qu.: 320.0
## Max. :33.0 Max. :2132.0 Max. :244.00 Max. :2286.0
## rs klinik toko_obat
## Min. : 1.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 6.00 1st Qu.: 6.00 1st Qu.: 4.50
## Median :11.00 Median : 9.00 Median : 20.00
## Mean :15.11 Mean : 20.85 Mean : 26.67
## 3rd Qu.:18.50 3rd Qu.: 17.00 3rd Qu.: 38.00
## Max. :53.00 Max. :131.00 Max. :119.00
dataku<-data[-1]Terdapat perbedaan range dari peubah-peubah yang digunakan, hal ini menandakan bahwa terdapat perbedaan persebaran masing-masing peubah di tiap kabupaten/kota.
Pada beberapa peubah nilai minimumnya adalah 0, artinya tidak ada jumlah sama sekali fasilitas tersebut di kab/kota tertentu. Hal ini menandakan ada beberapa daerah yang belum tersedia fasilitas tersebut.
Eksplorasi Data
Cek missing value
data %>%
is.na() %>%
colSums()## kabkot perawat bidan puskesmas_nonri puskesmas-ri
## 0 0 0 0 0
## dokspes dokgi dokum rs klinik
## 0 0 0 0 0
## toko_obat
## 0
Tidak terdapat missing value, sehingga dapat dilanjutkan ke proses analisis.
hist(data$`puskesmas-ri`, col = "#4682B4", border = "black", main = "Histogram of Puskesmas Rawat Inap", xlab = "Jumlah Puskesmas Rawat Inap", ylab = "Frequency")Boxplot masing-masing peubah
# membagi jendela grafik menajdi 2 baris dan 3 kolom
par(mfrow=c(2,3))
# Looping Box-Plot
type <- c("perawat", "bidan", "puskesmas_nonri", "puskesmas-ri","dokspes","dokgi","dokum", "rs","klinik","toko_obat")
for (i in type){
boxplot(dataku[,i],
main = paste("Variabel", i))
}Terlihat terdapat beberapa peubah yang memiliki outlier sehingga menandakan terdapat ketidakmerataan fasilitas yang ada di kab/kota provinsi Jawa Barat. Hal ini sesuai dengan eksplorasi pada summary(data) di atas.
Matriks Korelasi
ggcorr(dataku, label = TRUE)
Terdapat korelasi yang tinggi dan bersifat positif diantaranta yaitu
antara dokter umum dengan dokter gigi dan dokter umum dengan dokter
spesiaslis yaitu sebesar 0.9, artinya jika suatu daerah memiliki jumlah
dokter umum yang tinggi maka jumlah dokter gigi dan jumlah dokter
spesialisnya akan cenderung memiliki jumlah yang tinggi juga, begitu
pula sebaliknya.
Terdapat korelasi yang sedang dan bersifat positif antara bidan dengan puskesmas non rawat inap serta perawat dengan bidan.
Terdapat korelasi yang lemah dan bersifat positif antara dokter gigi dengan toko obat dan bidan dengan klinik.
Terdapat beberapa varibel yang tidak memiliki korelasi, nilai korelasi 0, yaitu antara perawat dengan puskesmas dengan klinik dan antara perawat dengan puskesmas rawat inap.
Terdapat peubah-peubah dengan nilai korelasi 1 sehingga apakah terdapat permasalahan multikolinearitas, multikolinearitas ini berarti terdapat hubungan antara variabel independennya.
Analisis Kluster
Uji Multikolinieritas
CekVIF <- function(data) {
corr = as.matrix(cor(data))
VIF = diag(solve(corr))
return(VIF)
}
CekVIF(data[-1])## perawat bidan puskesmas_nonri puskesmas-ri dokspes
## 45.901966 5.768074 4.348137 2.795499 109.082360
## dokgi dokum rs klinik toko_obat
## 57.332032 29.567795 15.443747 4.887629 3.644508
Terdapat beberapa peubah dengan nilai VIF>10 sehingga mengindikasikan adanya multikolinieritas sesuai dengan matriks korelasi di atas. Akan tetapi, tujuan cluster kali ini ingin mengamati semua kab/kota di Jawa Barat mengenai fasilitas kesehatanya sehingga tidak dilakukan penanganan untuk peubah-peubah tersebut.
Grafik Jarak Antar Objek
library(factoextra)
distance<-get_dist(dataku)
fviz_dist(distance, gradient=list(low="green", mid="white",high="red"))
## Penentuan Jumlah Klaster ### Metode Elbow
fviz_nbclust(dataku, kmeans, method = "wss")
Pada dasarnya nilai k optimum dapat ditentukan sendiri oleh peneliti,
selain itu nilai k dapat ditentukan juga menggunakan bantuan grafik
Elbow berikut. Dimana k minimum akan didapat ketika grafik sudah tidak
bergerak menurun dengan tajam.Dari hasil diatas didapatkan nilai K
optimum adalah 2.
Metode Silhouette
fviz_nbclust(dataku, kmeans, method = "silhouette")
Berdasarkan metode sillhoute juga dihasilkan jumlah klaster yang sama
yaitu 2
Ditentukan sendiri oleh peneliti
Dalam hal ini peneliti ingin menguji juga menggunakan 3 dan 4 klaster. Sehingga akan dianalisis clustering dengan klaster 2,3,4
Pemodelan K-Means menggunakan 2 klaster
kmeans_clustering = kmeans(dataku, 2, nstart = 5)
kmeans_clustering## K-means clustering with 2 clusters of sizes 8, 19
##
## Cluster means:
## perawat bidan puskesmas_nonri puskesmas-ri dokspes dokgi dokum
## 1 4208.875 1319.1250 45.00000 11 1091.8750 100.25000 712.75
## 2 1432.579 835.8421 21.68421 10 134.8421 16.26316 115.00
## rs klinik toko_obat
## 1 31.875000 53.000000 45.37500
## 2 8.052632 7.315789 18.78947
##
## Clustering vector:
## [1] 1 2 2 2 2 2 2 2 1 2 2 2 2 2 1 1 2 2 1 2 1 2 1 1 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 18602400 8142660
## (between_SS / total_SS = 66.0 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(kmeans_clustering, data=dataku)Insight :
Dari hasil visualisasi nampak jelas bahwa tiap klaster memiliki daerah tertentu yang terpisah dari klaster lain.
Terlihat bahwa klaster 2 memiliki wilayah yang lebih luas tetapi dengan jumlah kab/kota yang lebih sedikit. Sedangkan pada klaster 1 cenderung mengumpul.
letak= data.frame(dataku,kmeans_clustering$cluster)
colnames(letak)[colnames(letak)=="kluster.cluster"] = "Cluster"
letak## perawat bidan puskesmas_nonri puskesmas.ri dokspes dokgi dokum rs klinik
## 1 4374 1950 71 30 1008 79 596 30 14
## 2 2167 1516 48 10 199 21 173 9 5
## 3 1678 1476 39 8 74 9 90 5 8
## 4 2310 876 57 5 303 28 247 15 15
## 5 2464 1460 34 33 133 8 98 7 9
## 6 1091 1140 21 19 30 27 32 2 3
## 7 1207 773 13 22 84 8 63 6 0
## 8 1418 1023 31 6 178 17 125 12 10
## 9 3049 1560 49 11 353 17 321 12 18
## 10 1242 1099 23 9 84 7 63 5 10
## 11 944 763 18 17 85 7 69 3 0
## 12 1648 1101 0 0 60 9 126 12 0
## 13 1324 962 15 25 112 40 107 11 9
## 14 1835 674 13 7 241 18 180 11 15
## 15 3313 1577 19 31 530 49 319 26 98
## 16 4444 1632 37 9 1198 126 556 53 17
## 17 1091 660 26 6 171 18 128 11 7
## 18 562 450 4 11 20 3 12 1 2
## 19 3029 633 25 0 879 78 373 22 22
## 20 1221 298 15 0 113 13 119 6 5
## 21 6645 1261 73 7 2132 244 2286 39 131
## 22 1322 459 22 0 271 22 154 11 17
## 23 5445 1178 48 0 1624 138 819 47 70
## 24 3372 762 38 0 1011 71 432 26 54
## 25 1604 268 12 1 261 34 242 8 9
## 26 1597 693 13 9 112 19 118 14 7
## 27 494 190 8 2 31 1 39 4 8
## toko_obat kmeans_clustering.cluster
## 1 119 1
## 2 20 2
## 3 8 2
## 4 5 2
## 5 71 2
## 6 0 2
## 7 30 2
## 8 44 2
## 9 5 1
## 10 37 2
## 11 11 2
## 12 0 2
## 13 28 2
## 14 20 2
## 15 4 1
## 16 20 1
## 17 39 2
## 18 7 2
## 19 54 1
## 20 0 2
## 21 0 1
## 22 23 2
## 23 104 1
## 24 57 1
## 25 11 2
## 26 0 2
## 27 3 2
table(kmeans_clustering$cluster)##
## 1 2
## 8 19
Klaster 1 berjumlah 19.
Klaster 2 berjumlah 8.
Pemodelan K-Means menggunakan 3 klaster
kmeans_clustering2 = kmeans(dataku, 3, nstart = 5)
kmeans_clustering2## K-means clustering with 3 clusters of sizes 7, 4, 16
##
## Cluster means:
## perawat bidan puskesmas_nonri puskesmas-ri dokspes dokgi dokum
## 1 2814.857 1197.7143 38.57143 12.85714 486.8571 38.85714 280.4286
## 2 5227.000 1505.2500 57.25000 11.50000 1490.5000 146.75000 1064.2500
## 3 1267.375 751.8125 17.06250 8.87500 120.4375 15.75000 104.1875
## rs klinik toko_obat
## 1 16.71429 31.57143 30.85714
## 2 42.25000 58.00000 60.75000
## 3 7.62500 6.87500 16.31250
##
## Clustering vector:
## [1] 2 1 3 1 1 3 3 3 1 3 3 3 3 3 1 2 3 3 1 3 2 3 2 1 3 3 3
##
## Within cluster sum of squares by cluster:
## [1] 3304036 6593661 4301091
## (between_SS / total_SS = 82.0 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(kmeans_clustering2, data=dataku)Insight :
Dari hasil visualisasi nampak jelas bahwa tiap klaster memiliki daerah tertentu yang terpisah dari klaster lain.
Perbedaanya dengan 2 klaster, pada klaster 3 ini wilayah klaster 2 lebih mengecil dan sebagian kab/kota nya menjadi masuk menjadi klaster 1. Sedangkan klaster 3 wilayah klasternya semakin mengecil dan beberapa kab/kota sebelumnya masuk ke dalam klaster 1.
letak2= data.frame(dataku,kmeans_clustering2$cluster)
colnames(letak2)[colnames(letak2)=="kluster.cluster"] = "Cluster"
letak## perawat bidan puskesmas_nonri puskesmas.ri dokspes dokgi dokum rs klinik
## 1 4374 1950 71 30 1008 79 596 30 14
## 2 2167 1516 48 10 199 21 173 9 5
## 3 1678 1476 39 8 74 9 90 5 8
## 4 2310 876 57 5 303 28 247 15 15
## 5 2464 1460 34 33 133 8 98 7 9
## 6 1091 1140 21 19 30 27 32 2 3
## 7 1207 773 13 22 84 8 63 6 0
## 8 1418 1023 31 6 178 17 125 12 10
## 9 3049 1560 49 11 353 17 321 12 18
## 10 1242 1099 23 9 84 7 63 5 10
## 11 944 763 18 17 85 7 69 3 0
## 12 1648 1101 0 0 60 9 126 12 0
## 13 1324 962 15 25 112 40 107 11 9
## 14 1835 674 13 7 241 18 180 11 15
## 15 3313 1577 19 31 530 49 319 26 98
## 16 4444 1632 37 9 1198 126 556 53 17
## 17 1091 660 26 6 171 18 128 11 7
## 18 562 450 4 11 20 3 12 1 2
## 19 3029 633 25 0 879 78 373 22 22
## 20 1221 298 15 0 113 13 119 6 5
## 21 6645 1261 73 7 2132 244 2286 39 131
## 22 1322 459 22 0 271 22 154 11 17
## 23 5445 1178 48 0 1624 138 819 47 70
## 24 3372 762 38 0 1011 71 432 26 54
## 25 1604 268 12 1 261 34 242 8 9
## 26 1597 693 13 9 112 19 118 14 7
## 27 494 190 8 2 31 1 39 4 8
## toko_obat kmeans_clustering.cluster
## 1 119 1
## 2 20 2
## 3 8 2
## 4 5 2
## 5 71 2
## 6 0 2
## 7 30 2
## 8 44 2
## 9 5 1
## 10 37 2
## 11 11 2
## 12 0 2
## 13 28 2
## 14 20 2
## 15 4 1
## 16 20 1
## 17 39 2
## 18 7 2
## 19 54 1
## 20 0 2
## 21 0 1
## 22 23 2
## 23 104 1
## 24 57 1
## 25 11 2
## 26 0 2
## 27 3 2
table(kmeans_clustering2$cluster)##
## 1 2 3
## 7 4 16
Klaster 1 berjumlah 7
Klaster 2 berjumlah 4.
Klaster 3 berjumlah 16
Pemodelan K-Means menggunakan 4 klaster
kmeans_clustering3 = kmeans(dataku, 4, nstart = 5)
kmeans_clustering3## K-means clustering with 4 clusters of sizes 3, 16, 7, 1
##
## Cluster means:
## perawat bidan puskesmas_nonri puskesmas-ri dokspes dokgi dokum
## 1 4754.333 1586.6667 52.00000 13.00000 1276.6667 114.33333 657.0000
## 2 1267.375 751.8125 17.06250 8.87500 120.4375 15.75000 104.1875
## 3 2814.857 1197.7143 38.57143 12.85714 486.8571 38.85714 280.4286
## 4 6645.000 1261.0000 73.00000 7.00000 2132.0000 244.00000 2286.0000
## rs klinik toko_obat
## 1 43.33333 33.66667 81.00000
## 2 7.62500 6.87500 16.31250
## 3 16.71429 31.57143 30.85714
## 4 39.00000 131.00000 0.00000
##
## Clustering vector:
## [1] 1 3 2 3 3 2 2 2 3 2 2 2 2 2 3 1 2 2 3 2 4 2 1 3 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 1269216 4301091 3304036 0
## (between_SS / total_SS = 88.7 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(kmeans_clustering3, data=dataku)
Dari hasil visualisasi nampak jelas bahwa tiap klaster memiliki daerah
tertentu yang terpisah dari klaster lain.
Perbedaan pada klaster sebelumnya, pada 3 klaster ini amatan 21 terpisah menjadi 1 klaster sehingga terbentuk klaster 4 berjumlah 3 amatan.
table(kmeans_clustering3$cluster)##
## 1 2 3 4
## 3 16 7 1
Klaster 1 berjumlah 7.
Klaster 2 berjumlah 16.
Klaster 3 berjumlah 1.
Klaster 4 berjumlah 3.
letak3= data.frame(dataku,kmeans_clustering3$cluster)
colnames(letak3)[colnames(letak3)=="kluster.cluster"] = "Cluster"
letak## perawat bidan puskesmas_nonri puskesmas.ri dokspes dokgi dokum rs klinik
## 1 4374 1950 71 30 1008 79 596 30 14
## 2 2167 1516 48 10 199 21 173 9 5
## 3 1678 1476 39 8 74 9 90 5 8
## 4 2310 876 57 5 303 28 247 15 15
## 5 2464 1460 34 33 133 8 98 7 9
## 6 1091 1140 21 19 30 27 32 2 3
## 7 1207 773 13 22 84 8 63 6 0
## 8 1418 1023 31 6 178 17 125 12 10
## 9 3049 1560 49 11 353 17 321 12 18
## 10 1242 1099 23 9 84 7 63 5 10
## 11 944 763 18 17 85 7 69 3 0
## 12 1648 1101 0 0 60 9 126 12 0
## 13 1324 962 15 25 112 40 107 11 9
## 14 1835 674 13 7 241 18 180 11 15
## 15 3313 1577 19 31 530 49 319 26 98
## 16 4444 1632 37 9 1198 126 556 53 17
## 17 1091 660 26 6 171 18 128 11 7
## 18 562 450 4 11 20 3 12 1 2
## 19 3029 633 25 0 879 78 373 22 22
## 20 1221 298 15 0 113 13 119 6 5
## 21 6645 1261 73 7 2132 244 2286 39 131
## 22 1322 459 22 0 271 22 154 11 17
## 23 5445 1178 48 0 1624 138 819 47 70
## 24 3372 762 38 0 1011 71 432 26 54
## 25 1604 268 12 1 261 34 242 8 9
## 26 1597 693 13 9 112 19 118 14 7
## 27 494 190 8 2 31 1 39 4 8
## toko_obat kmeans_clustering.cluster
## 1 119 1
## 2 20 2
## 3 8 2
## 4 5 2
## 5 71 2
## 6 0 2
## 7 30 2
## 8 44 2
## 9 5 1
## 10 37 2
## 11 11 2
## 12 0 2
## 13 28 2
## 14 20 2
## 15 4 1
## 16 20 1
## 17 39 2
## 18 7 2
## 19 54 1
## 20 0 2
## 21 0 1
## 22 23 2
## 23 104 1
## 24 57 1
## 25 11 2
## 26 0 2
## 27 3 2
Berdasarkan visualisasi data hasil cluster, penulis memilih klaster 3 sebagai jumlah klaster yang digunakan karena menurut penulis paling pas pembagianya. Tidak ada amatan yang terpisah jauh sendirian.
Interpretasi dan Profiling klaster
Dengan menggunakan visualisasi data, dapat memudahkan dalam melakukan profiling.
dataku$Cluster <- kmeans_clustering2$cluster
ggRadar(
data = dataku,
mapping = aes(colours = Cluster),
interactive = T
)Berdasarkan hasil diatas dapat diketahui bahwa karakteristik dari masing-masing klaster adalah sebagai berikut:
Klaster 1: Memiliki jumlah puskesmas rawat inap dan bidan yang banyak dari pada fasilitas lain sedangkan jumlah dokter umum dan dokteer gigi yang cukup rendah.
Klaster 2: Memiliki jumlah rumah sakit, perawat, dan puskesmas non rawat inap banyak
Klaster 3: Memiliki jumlah bidan dan puskesmas rawat inap yang banyak dari pada fasilitas lain sedangkan jumlah dokter gigi dan klinik yang sedikit
cluster_means <- aggregate(dataku[,1:ncol(dataku)-1], list(kmeans_clustering$cluster), mean)
print(cluster_means)## Group.1 perawat bidan puskesmas_nonri puskesmas-ri dokspes dokgi
## 1 1 4208.875 1319.1250 45.00000 11 1091.8750 100.25000
## 2 2 1432.579 835.8421 21.68421 10 134.8421 16.26316
## dokum rs klinik toko_obat
## 1 712.75 31.875000 53.000000 45.37500
## 2 115.00 8.052632 7.315789 18.78947
Hasil yang didapat tidak berbeda dengan menggunakan visualisasi sebelumnya, dengan menggunakan summarise data karakteristik dari masing-masing klaster dapat dilihat melalui angka sehingga dapat diketahui nilai tertinggi dan terendah secara detail.
Kesimpulan
Dari hasil analisis dan pembahasan yang telah diuraikan sebelumnya, maka diperoleh kesimpulan sebagai berikut :
Berdasarkan nilai wss diperoleh jumlah klaster untuk kasus ini adalah sebanyak 2. Akan tetapi, peneliti mencoba klaster lain dan dipilih yang terbaik adalah klaster 3
Berdasarkan jumlah k = 3, maka dibuat 3 klaster. Rincian dari ke 3 klaster adalah pada berikut :
Klaster 1 berjumlah 7 kab/kota.Klater 2 berjumlah 4 kab/kota dan klaster 3 berjumlah 16 kab/kota. Berdasarkan profiling klaster dapat diperoleh sebagai berikut : 1. Klaster 1 : Daerah dengan fasilitas kesehatan baik 2. Klaster 2 : Daerah dengan fasilitas kesehatan sangat baik 3. Klaster 3 : Daerah dengan fasilitas kesehatan kurang baik