Introduction

Ketimpangan distribusi sarana dan tenaga kesehatan antar kecamatan di Provinsi DKI Jakarta masih menjadi persoalan yang perlu diperhatikan karena berdampak pada pemerataan akses layanan kesehatan masyarakat. Analisis ini bertujuan untuk mengelompokkan 44 kecamatan di Provinsi DKI Jakarta berdasarkan ketersediaan sarana dan tenaga kesehatan menggunakan metode Hierarchical Cluster Analysis (HCA), dengan jarak Euclidean dan pemilihan metode linkage terbaik berdasarkan koefisien korelasi cophenetic.

Data yang digunakan merupakan data sekunder dari publikasi Badan Pusat Statistik (BPS) masing-masing Kota/Kabupaten di Provinsi DKI Jakarta, dengan variabel sebagai berikut:

Tahapan analisis yang dilakukan meliputi statistika deskriptif, pengecekan multikolinieritas, standarisasi data, perhitungan jarak Euclidean, pemilihan metode linkage terbaik melalui koefisien korelasi cophenetic, penentuan jumlah klaster optimal melalui validitas klaster, hingga interpretasi karakteristik masing-masing klaster.

Load Libraries

library(psych)
library(GPArotation)
library(clValid)
library(ggplot2)
library(cluster)
library(factoextra)
library(tidyverse)
library(car)
library(readxl)
library(proxy)

Import Dataset

data <- read_excel("Data Fasilitas Kesehatan AKHIR.xlsx", sheet = 1)

head(data)
## # A tibble: 6 × 8
##   Kecamatan     `Rumah Sakit` Puskesmas Apotek Poliklinik `Tenaga Medis`
##   <chr>                 <dbl>     <dbl>  <dbl>      <dbl>          <dbl>
## 1 Tanah Abang               4         1     12         74            382
## 2 Menteng                  10         0     16         56            226
## 3 Senen                     7         1     10         27           2656
## 4 Johar Baru                1         2     17         14             90
## 5 Cempaka Putih             7         1     14         35            211
## 6 Kemayoran                 3         1     22         37            210
## # ℹ 2 more variables: `Tenaga Keperawatan` <dbl>, `Tenaga Kebidanan` <dbl>
datanew <- as.data.frame(data[,2:8])
rownames(datanew) <- data$Kecamatan
head(datanew)
##               Rumah Sakit Puskesmas Apotek Poliklinik Tenaga Medis
## Tanah Abang             4         1     12         74          382
## Menteng                10         0     16         56          226
## Senen                   7         1     10         27         2656
## Johar Baru              1         2     17         14           90
## Cempaka Putih           7         1     14         35          211
## Kemayoran               3         1     22         37          210
##               Tenaga Keperawatan Tenaga Kebidanan
## Tanah Abang                  698              117
## Menteng                      943              174
## Senen                       4159              277
## Johar Baru                   109               75
## Cempaka Putih                900              123
## Kemayoran                    548              127

Data terdiri dari 44 kecamatan di Provinsi DKI Jakarta dengan 7 variabel sarana dan tenaga kesehatan sebagaimana disebutkan pada bagian Pendahuluan.

Descriptive Statistics

summary(datanew)
##   Rumah Sakit       Puskesmas        Apotek        Poliklinik    
##  Min.   : 0.000   Min.   :0.00   Min.   : 0.00   Min.   :  0.00  
##  1st Qu.: 2.000   1st Qu.:1.00   1st Qu.:16.75   1st Qu.: 21.75  
##  Median : 4.000   Median :1.00   Median :24.00   Median : 35.50  
##  Mean   : 4.205   Mean   :1.25   Mean   :26.34   Mean   : 37.27  
##  3rd Qu.: 7.000   3rd Qu.:1.00   3rd Qu.:31.75   3rd Qu.: 48.50  
##  Max.   :10.000   Max.   :5.00   Max.   :59.00   Max.   :103.00  
##   Tenaga Medis    Tenaga Keperawatan Tenaga Kebidanan
##  Min.   :  16.0   Min.   :  33.0     Min.   : 20.0   
##  1st Qu.: 204.2   1st Qu.: 437.5     1st Qu.:122.8   
##  Median : 363.0   Median : 714.5     Median :166.0   
##  Mean   : 520.4   Mean   : 873.9     Mean   :163.7   
##  3rd Qu.: 618.8   3rd Qu.:1042.5     3rd Qu.:207.5   
##  Max.   :2656.0   Max.   :4159.0     Max.   :354.0
describe(datanew)
##                    vars  n   mean     sd median trimmed    mad min  max range
## Rumah Sakit           1 44   4.20   2.62    4.0    4.08   2.97   0   10    10
## Puskesmas             2 44   1.25   0.97    1.0    1.08   0.00   0    5     5
## Apotek                3 44  26.34  14.83   24.0   25.47  11.12   0   59    59
## Poliklinik            4 44  37.27  21.66   35.5   36.25  20.76   0  103   103
## Tenaga Medis          5 44 520.39 507.03  363.0  433.58 258.71  16 2656  2640
## Tenaga Keperawatan    6 44 873.86 806.83  714.5  733.50 490.00  33 4159  4126
## Tenaga Kebidanan      7 44 163.66  74.04  166.0  162.64  64.49  20  354   334
##                    skew kurtosis     se
## Rumah Sakit        0.41    -0.77   0.39
## Puskesmas          2.66     7.73   0.15
## Apotek             0.55    -0.53   2.24
## Poliklinik         0.63     0.38   3.27
## Tenaga Medis       2.13     5.40  76.44
## Tenaga Keperawatan 2.08     5.10 121.63
## Tenaga Kebidanan   0.15    -0.20  11.16

Ringkasan hasil statistika deskriptif:

Variabel Minimum Rata-rata Maksimum
Jumlah Rumah Sakit 0 4,21 10
Jumlah Puskesmas 0 1,25 5
Jumlah Apotek 0 24 59
Jumlah Poliklinik 0 37,27 103
Jumlah Tenaga Medis 16 520,4 2656
Jumlah Tenaga Keperawatan 33 873,9 4159
Jumlah Tenaga Kebidanan 20 163,7 354

Rata-rata setiap kecamatan di DKI Jakarta memiliki sekitar 4 rumah sakit, 1 puskesmas, 24 apotek, dan 37 poliklinik. Kecamatan Menteng memiliki jumlah rumah sakit terbanyak (10 unit), sedangkan Kepulauan Seribu Selatan tidak memiliki rumah sakit sama sekali. Kecamatan Sawah Besar dan Penjaringan memiliki puskesmas terbanyak (5 unit), sementara Menteng, Koja, dan Setiabudi tidak memiliki puskesmas. Duren Sawit unggul pada jumlah apotek (59 unit) dan tenaga kebidanan (354 jiwa), sedangkan Kebayoran Baru memiliki poliklinik terbanyak (103 unit). Untuk tenaga medis dan tenaga keperawatan, Kecamatan Senen mencatat jumlah tertinggi (2656 tenaga medis dan 4159 tenaga keperawatan), sedangkan Kepulauan Seribu Utara memiliki jumlah tenaga medis dan keperawatan paling sedikit.

Multicollinearity Test

Sebelum melakukan analisis klaster, perlu dipastikan bahwa tidak terdapat multikolinieritas yang serius antar variabel. Pengecekan dilakukan dengan melihat matriks korelasi Pearson antar variabel, di mana suatu variabel dikatakan bermasalah jika memiliki korelasi ≥ 0,8 dengan variabel lain.

model_vif <- lm(datanew[,1] ~ ., data = datanew)
vif(model_vif)
##        `Rumah Sakit`            Puskesmas               Apotek 
##             2.085551             1.048260             1.766053 
##           Poliklinik       `Tenaga Medis` `Tenaga Keperawatan` 
##             1.604642             3.214498             5.491275 
##   `Tenaga Kebidanan` 
##             3.165229

Pearson Correlation

cor_matrix <- cor(datanew)
cor_matrix
##                    Rumah Sakit  Puskesmas      Apotek Poliklinik Tenaga Medis
## Rumah Sakit          1.0000000 -0.1582625  0.29921658  0.4108802    0.4873818
## Puskesmas           -0.1582625  1.0000000 -0.11142758 -0.1309599   -0.1215662
## Apotek               0.2992166 -0.1114276  1.00000000  0.2652692    0.1535442
## Poliklinik           0.4108802 -0.1309599  0.26526922  1.0000000    0.1318816
## Tenaga Medis         0.4873818 -0.1215662  0.15354417  0.1318816    1.0000000
## Tenaga Keperawatan   0.5892066 -0.1460265 -0.03190082  0.1347002    0.7958191
## Tenaga Kebidanan     0.6134333 -0.2026515  0.41521088  0.5214179    0.4571255
##                    Tenaga Keperawatan Tenaga Kebidanan
## Rumah Sakit                0.58920656        0.6134333
## Puskesmas                 -0.14602652       -0.2026515
## Apotek                    -0.03190082        0.4152109
## Poliklinik                 0.13470019        0.5214179
## Tenaga Medis               0.79581908        0.4571255
## Tenaga Keperawatan         1.00000000        0.5956476
## Tenaga Kebidanan           0.59564759        1.0000000

Interpretasi: Seluruh nilai korelasi antar variabel berada di bawah 0,8 (nilai tertinggi terdapat pada pasangan \(X_5\) dan \(X_6\), yaitu 0,79). Artinya tidak ditemukan indikasi multikolinieritas yang serius, sehingga ketujuh variabel (\(X_1\)\(X_7\)) dapat digunakan seluruhnya dalam analisis klaster tanpa perlu direduksi.

Data Standardization

Karena ketujuh variabel memiliki satuan pengukuran yang berbeda (unit fasilitas dan jumlah jiwa), data perlu distandarisasi ke dalam bentuk z-score agar tidak ada variabel yang mendominasi proses pengelompokan hanya karena skalanya lebih besar.

datastand <- scale(datanew)
rownames(datastand) <- rownames(datanew)

Euclidean Distance

Jarak Euclidean digunakan untuk mengukur tingkat kemiripan antar kecamatan berdasarkan data yang telah distandarisasi. Semakin kecil jarak antar dua kecamatan, semakin mirip karakteristik ketersediaan sarana dan tenaga kesehatannya.

jarak <- dist(datastand, method = "euclidean")

Cophenetic Correlation

Koefisien korelasi cophenetic digunakan untuk menentukan metode linkage terbaik dari lima metode agglomerative: single, average, complete, centroid, dan Ward. Semakin nilainya mendekati 1, semakin baik metode tersebut merepresentasikan struktur jarak data asli.

d1 <- dist(datanew, method = "euclidean")

## Single Linkage
hc_single <- hclust(d1, method = "single")
cors <- cor(d1, cophenetic(hc_single))

## Average Linkage
hc_average <- hclust(d1, method = "average")
corave <- cor(d1, cophenetic(hc_average))

## Complete Linkage
hc_complete <- hclust(d1, method = "complete")
corcomp <- cor(d1, cophenetic(hc_complete))

## Centroid Linkage
hc_centroid <- hclust(d1, method = "centroid")
corcen <- cor(d1, cophenetic(hc_centroid))

## Ward Linkage
hc_ward <- hclust(d1, method = "ward.D")
corward <- cor(d1, cophenetic(hc_ward))

# Gabungkan hasil korelasi cophenetic
KorCop <- data.frame(
  Single = cors,
  Average = corave,
  Complete = corcomp,
  Centroid = corcen,
  Ward = corward
)
KorCop
##      Single   Average Complete  Centroid      Ward
## 1 0.9219845 0.9293642 0.845533 0.9167857 0.7691483

Hasil koefisien korelasi cophenetic:

Metode Koefisien Korelasi
Single Linkage 0,9220
Average Linkage 0,9294
Complete Linkage 0,8455
Centroid Method 0,9168
Ward Method 0,7691

Metode Average Linkage memiliki koefisien korelasi cophenetic tertinggi, yaitu 0,929 (92,9%), sehingga dipilih sebagai metode terbaik dan digunakan pada tahap pengelompokan selanjutnya.

Internal Cluster Validation

Penentuan jumlah klaster optimal dilakukan menggunakan tiga indeks validitas: Connectivity (semakin kecil semakin baik), Dunn Index (semakin besar semakin baik), dan Silhouette Index (semakin mendekati 1 semakin baik).

inval <- clValid(datastand, 2:6, clMethods = "hierarchical",
                 validation = "internal", metric = "euclidean", method = "average")
summary(inval)
## 
## Clustering Methods:
##  hierarchical 
## 
## Cluster sizes:
##  2 3 4 5 6 
## 
## Validation Measures:
##                                  2       3       4       5       6
##                                                                   
## hierarchical Connectivity   5.9813 10.5893 19.1536 27.3472 29.1806
##              Dunn           0.3320  0.3200  0.2615  0.3236  0.3236
##              Silhouette     0.3828  0.3453  0.2257  0.2739  0.2639
## 
## Optimal Scores:
## 
##              Score  Method       Clusters
## Connectivity 5.9813 hierarchical 2       
## Dunn         0.3320 hierarchical 2       
## Silhouette   0.3828 hierarchical 2
optimalScores(inval)
##                  Score       Method Clusters
## Connectivity 5.9813492 hierarchical        2
## Dunn         0.3319573 hierarchical        2
## Silhouette   0.3828209 hierarchical        2

Hasil validitas klaster:

Indeks Validitas k=2 k=3 k=4 k=5 k=6
Connectivity 5,98 10,59 19,15 27,35 29,18
Dunn 0,33 0,32 0,26 0,32 0,32
Silhouette 0,38 0,34 0,23 0,27 0,26

Ketiga indeks validitas secara konsisten menunjukkan bahwa jumlah klaster optimal adalah k = 2, dengan nilai Connectivity terkecil (5,98), nilai Dunn Index terbesar (0,33), dan nilai Silhouette Index tertinggi (0,38) di antara jumlah klaster yang diuji.

Visualisasi Final Cluster

hirave <- hclust(dist(datastand), method = "average")
plot(hirave, labels = rownames(datastand), hang = 1,
     main = "Dendogram Cluster Kecamatan",
     xlab = "Kecamatan", ylab = "Jarak", col = "blue")

Proses penggabungan diawali dari kecamatan-kecamatan dengan jarak terdekat, misalnya Jatinegara dan Kemayoran yang bergabung pertama kali pada jarak 0,364, kemudian Kepulauan Seribu Utara dan Kepulauan Seribu Selatan pada jarak 0,387. Proses ini berlanjut hingga seluruh 44 kecamatan tergabung menjadi satu klaster besar. Garis potong (cut-off) ditentukan pada jarak sekitar 4,8, karena pada titik tersebut masih terlihat pemisahan yang jelas antara dua kelompok besar sebelum seluruh kecamatan menyatu menjadi satu klaster.

Anggota Cluster

anggotaave <- data.frame(
  Kecamatan = rownames(datastand),
  Cluster = cutree(hirave, k = 2)
)
anggotaave
##                                         Kecamatan Cluster
## Tanah Abang                           Tanah Abang       1
## Menteng                                   Menteng       1
## Senen                                       Senen       2
## Johar Baru                             Johar Baru       1
## Cempaka Putih                       Cempaka Putih       1
## Kemayoran                               Kemayoran       1
## Sawah Besar                           Sawah Besar       1
## Gambir                                     Gambir       1
## Penjaringan                           Penjaringan       1
## Pademangan                             Pademangan       1
## Tanjung Priok                       Tanjung Priok       1
## Koja                                         Koja       1
## Kelapa Gading                       Kelapa Gading       1
## Cilincing                               Cilincing       1
## Pasar Rebo                             Pasar Rebo       1
## Ciracas                                   Ciracas       1
## Cipayung                                 Cipayung       1
## Makasar                                   Makasar       1
## Kramat Jati                           Kramat Jati       1
## Jatinegara                             Jatinegara       1
## Duren Sawit                           Duren Sawit       1
## Cakung                                     Cakung       1
## Pulo Gadung                           Pulo Gadung       1
## Matraman                                 Matraman       1
## Kembangan                               Kembangan       1
## Kebon Jeruk                           Kebon Jeruk       1
## Palmerah                                 Palmerah       2
## Grogol Petamburan               Grogol Petamburan       1
## Tambora                                   Tambora       1
## Taman Sari                             Taman Sari       1
## Cengkareng                             Cengkareng       1
## Kali Deres                             Kali Deres       1
## Jagakarsa                               Jagakarsa       1
## Pasar Minggu                         Pasar Minggu       1
## Cilandak                                 Cilandak       2
## Pesanggrahan                         Pesanggrahan       1
## Kebayoran Lama                     Kebayoran Lama       1
## Kebayoran Baru                     Kebayoran Baru       1
## Mampang Prapatan                 Mampang Prapatan       1
## Pancoran                                 Pancoran       1
## Tebet                                       Tebet       1
## Setia Budi                             Setia Budi       1
## Kepulauan Seribu Selatan Kepulauan Seribu Selatan       1
## Kepulauan Seribu Utara     Kepulauan Seribu Utara       1

Pemotongan dendrogram pada jarak 4,8 menghasilkan dua klaster utama:

Visualisasi Dendrogram

clus_hier <- eclust(datastand, FUNcluster = "hclust",
                    k = 2, hc_method = "average", graph = TRUE)
fviz_dend(clus_hier, rect = TRUE, cex = 0.5)

Profilling Cluster

idclus <- clus_hier$cluster
aggregate(datanew, list(Cluster = idclus), mean)
##   Cluster Rumah Sakit Puskesmas   Apotek Poliklinik Tenaga Medis
## 1       1    4.024390  1.268293 26.65854   38.68293     420.9512
## 2       2    6.666667  1.000000 22.00000   18.00000    1879.3333
##   Tenaga Keperawatan Tenaga Kebidanan
## 1           710.8049         158.5366
## 2          3102.3333         233.6667

Rata-rata variabel tiap klaster:

Variabel Klaster 1 Klaster 2
Jumlah Rumah Sakit 4,02 6,70
Jumlah Puskesmas 1,27 1,00
Jumlah Apotek 26,87 22,00
Jumlah Poliklinik 38,68 18,00
Jumlah Tenaga Medis 420,95 1879,30
Jumlah Tenaga Keperawatan 710,81 3102,30
Jumlah Tenaga Kebidanan 158,54 233,73

Klaster 1 (41 kecamatan) memiliki rata-rata jumlah puskesmas, apotek, dan poliklinik yang lebih tinggi dibandingkan Klaster 2, sehingga menggambarkan kecamatan-kecamatan dengan layanan kesehatan dasar yang relatif merata namun dengan jumlah rumah sakit dan tenaga kesehatan yang lebih terbatas.

Klaster 2 (Senen, Palmerah, dan Cilandak) justru unggul pada rata-rata jumlah rumah sakit serta seluruh kategori tenaga kesehatan (tenaga medis, keperawatan, dan kebidanan). Sebagai gambaran, Kecamatan Senen tercatat memiliki 2656 tenaga medis dan 4159 tenaga keperawatan, sedangkan Kecamatan Palmerah memiliki 3011 tenaga keperawatan. Ketiga kecamatan ini berperan sebagai pusat layanan kesehatan dengan fasilitas dan tenaga kesehatan yang jauh lebih lengkap, sejalan dengan keberadaan rumah sakit besar seperti RSUP Fatmawati, RS Bhakti Mulia, dan RS Dr. Cipto Mangunkusumo di wilayah-wilayah tersebut.

Kesimpulan

Berdasarkan koefisien korelasi cophenetic, metode Average Linkage terpilih sebagai metode terbaik dengan nilai korelasi 0,929, dan hasil validitas internal klaster (Connectivity, Dunn, dan Silhouette) secara konsisten menunjukkan jumlah klaster optimal adalah k = 2.

Hasil pengelompokan menunjukkan adanya ketimpangan distribusi sarana dan tenaga kesehatan antar kecamatan di Provinsi DKI Jakarta: - Klaster 1 (41 kecamatan) unggul pada rata-rata jumlah puskesmas, apotek, dan poliklinik — mencerminkan pemerataan layanan kesehatan dasar di sebagian besar wilayah. - Klaster 2 (Senen, Palmerah, Cilandak) unggul pada rata-rata jumlah rumah sakit serta tenaga kesehatan (medis, keperawatan, kebidanan) — mencerminkan konsentrasi fasilitas kesehatan rujukan/lanjutan pada wilayah tertentu saja.

Hasil ini dapat dijadikan bahan pertimbangan bagi pemerintah daerah dalam merumuskan kebijakan pemerataan sarana dan tenaga kesehatan, khususnya bagi kecamatan-kecamatan pada Klaster 1 yang masih terbatas jumlah rumah sakit dan tenaga kesehatannya. Untuk penelitian selanjutnya, disarankan menambahkan variabel lain serta mempertimbangkan metode klaster berbeda agar hasil pengelompokan lebih tajam.