Dalam konteks pembangunan global, kesenjangan tingkat kesejahteraan antarnegara masih menjadi isu yang menonjol. Ada negara yang sudah mencapai tingkat pendapatan dan kualitas kesehatan yang tinggi, sementara negara lain masih bergulat dengan kemiskinan, angka kematian anak yang tinggi, serta akses layanan kesehatan yang terbatas.
Untuk menyusun prioritas bantuan secara objektif, diperlukan analisis yang tidak hanya melihat satu indikator saja, melainkan berbagai indikator sosial ekonomi dan kesehatan secara bersamaan, seperti: pendapatan per kapita, GDP per kapita, inflasi, angka kematian anak, angka harapan hidup, tingkat fertilitas, serta proporsi ekspor dan impor terhadap PDB.
Salah satu teknik analisis multivariat yang digunakan untuk tujuan pengelompokan adalah analisis cluster non-hierarki (K-Means). Pada laporan ini digunakan dataset “Unsupervised Learning on Country Data” dari Kaggle, yang berisi 167 negara dengan beberapa variabel sosio-ekonomi dan kesehatan.
Tujuan analisis:
library(readxl)
library(tidyverse)
library(factoextra)
Catatan: Sesuaikan nama/path file
Country-data.xlsxdengan lokasi file di komputer Anda.
# Import data
Country_data <- read_excel("Country-data.xlsx")
# Melihat struktur dan beberapa observasi awal
glimpse(Country_data)
## Rows: 167
## Columns: 10
## $ country <chr> "Afghanistan", "Albania", "Algeria", "Angola", "Antigua and…
## $ child_mort <dbl> 90.2, 16.6, 27.3, 119.0, 10.3, 14.5, 18.1, 4.8, 4.3, 39.2, …
## $ exports <dbl> 10.0, 28.0, 38.4, 62.3, 45.5, 18.9, 20.8, 19.8, 51.3, 54.3,…
## $ health <dbl> 7.58, 6.55, 4.17, 2.85, 6.03, 8.10, 4.40, 8.73, 11.00, 5.88…
## $ imports <dbl> 44.9, 48.6, 31.4, 42.9, 58.9, 16.0, 45.3, 20.9, 47.8, 20.7,…
## $ income <dbl> 1610, 9930, 12900, 5900, 19100, 18700, 6700, 41400, 43200, …
## $ inflation <dbl> 9.440, 4.490, 16.100, 22.400, 1.440, 20.900, 7.770, 1.160, …
## $ life_expec <dbl> 56.2, 76.3, 76.5, 60.1, 76.8, 75.8, 73.3, 82.0, 80.5, 69.1,…
## $ total_fer <dbl> 5.82, 1.65, 2.89, 6.16, 2.13, 2.37, 1.69, 1.93, 1.44, 1.92,…
## $ gdpp <dbl> 553, 4090, 4460, 3530, 12200, 10300, 3220, 51900, 46900, 58…
head(Country_data)
## # A tibble: 6 × 10
## country child_mort exports health imports income inflation life_expec
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Afghanistan 90.2 10 7.58 44.9 1610 9.44 56.2
## 2 Albania 16.6 28 6.55 48.6 9930 4.49 76.3
## 3 Algeria 27.3 38.4 4.17 31.4 12900 16.1 76.5
## 4 Angola 119 62.3 2.85 42.9 5900 22.4 60.1
## 5 Antigua and Bar… 10.3 45.5 6.03 58.9 19100 1.44 76.8
## 6 Argentina 14.5 18.9 8.1 16 18700 20.9 75.8
## # ℹ 2 more variables: total_fer <dbl>, gdpp <dbl>
colSums(is.na(Country_data))
## country child_mort exports health imports income inflation
## 0 0 0 0 0 0 0
## life_expec total_fer gdpp
## 0 0 0
Jika semua bernilai 0, berarti tidak ada missing value pada dataset.
Variabel country bersifat kategorik sehingga tidak
distandarisasi.
country_names <- Country_data$country
data_num <- Country_data %>%
select(-country)
summary(data_num)
## child_mort exports health imports
## Min. : 2.60 Min. : 0.109 Min. : 1.810 Min. : 0.0659
## 1st Qu.: 8.25 1st Qu.: 23.800 1st Qu.: 4.920 1st Qu.: 30.2000
## Median : 19.30 Median : 35.000 Median : 6.320 Median : 43.3000
## Mean : 38.27 Mean : 41.109 Mean : 6.816 Mean : 46.8902
## 3rd Qu.: 62.10 3rd Qu.: 51.350 3rd Qu.: 8.600 3rd Qu.: 58.7500
## Max. :208.00 Max. :200.000 Max. :17.900 Max. :174.0000
## income inflation life_expec total_fer
## Min. : 609 Min. : -4.210 Min. :32.10 Min. :1.150
## 1st Qu.: 3355 1st Qu.: 1.810 1st Qu.:65.30 1st Qu.:1.795
## Median : 9960 Median : 5.390 Median :73.10 Median :2.410
## Mean : 17145 Mean : 7.782 Mean :70.56 Mean :2.948
## 3rd Qu.: 22800 3rd Qu.: 10.750 3rd Qu.:76.80 3rd Qu.:3.880
## Max. :125000 Max. :104.000 Max. :82.80 Max. :7.490
## gdpp
## Min. : 231
## 1st Qu.: 1330
## Median : 4660
## Mean : 12964
## 3rd Qu.: 14050
## Max. :105000
# Standarisasi data numerik
data_scaled <- scale(data_num)
summary(as.data.frame(data_scaled))
## child_mort exports health imports
## Min. :-0.8845 Min. :-1.4957 Min. :-1.8223 Min. :-1.9341
## 1st Qu.:-0.7444 1st Qu.:-0.6314 1st Qu.:-0.6901 1st Qu.:-0.6894
## Median :-0.4704 Median :-0.2229 Median :-0.1805 Median :-0.1483
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.5909 3rd Qu.: 0.3736 3rd Qu.: 0.6496 3rd Qu.: 0.4899
## Max. : 4.2086 Max. : 5.7964 Max. : 4.0353 Max. : 5.2504
## income inflation life_expec total_fer
## Min. :-0.8577 Min. :-1.1344 Min. :-4.3242 Min. :-1.1877
## 1st Qu.:-0.7153 1st Qu.:-0.5649 1st Qu.:-0.5910 1st Qu.:-0.7616
## Median :-0.3727 Median :-0.2263 Median : 0.2861 Median :-0.3554
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.2934 3rd Qu.: 0.2808 3rd Qu.: 0.7021 3rd Qu.: 0.6157
## Max. : 5.5947 Max. : 9.1023 Max. : 1.3768 Max. : 3.0003
## gdpp
## Min. :-0.69471
## 1st Qu.:-0.63475
## Median :-0.45307
## Mean : 0.00000
## 3rd Qu.: 0.05924
## Max. : 5.02140
Jumlah cluster ditentukan menggunakan metode Elbow dan Silhouette.
set.seed(123)
# Metode Elbow
fviz_nbclust(data_scaled, kmeans, method = "wss") +
ggtitle("Metode Elbow untuk Menentukan k")
# Metode Silhouette
fviz_nbclust(data_scaled, kmeans, method = "silhouette") +
ggtitle("Metode Silhouette untuk Menentukan k")
Berdasarkan kedua plot tersebut, dipilih jumlah cluster optimal:
k_optimal <- 3
k_optimal
## [1] 3
set.seed(123)
kmeans_result <- kmeans(
x = data_scaled,
centers = k_optimal,
nstart = 25
)
# Menambahkan label cluster ke data asli
data_clustered <- Country_data %>%
mutate(cluster = factor(kmeans_result$cluster))
# Ukuran masing-masing cluster
table(data_clustered$cluster)
##
## 1 2 3
## 36 84 47
cluster_list <- data_clustered %>%
arrange(cluster) %>%
select(country, cluster)
head(cluster_list, 20)
## # A tibble: 20 × 2
## country cluster
## <chr> <fct>
## 1 Australia 1
## 2 Austria 1
## 3 Bahrain 1
## 4 Belgium 1
## 5 Brunei 1
## 6 Canada 1
## 7 Cyprus 1
## 8 Czech Republic 1
## 9 Denmark 1
## 10 Finland 1
## 11 France 1
## 12 Germany 1
## 13 Greece 1
## 14 Iceland 1
## 15 Ireland 1
## 16 Israel 1
## 17 Italy 1
## 18 Japan 1
## 19 Kuwait 1
## 20 Luxembourg 1
cluster_profile <- data_clustered %>%
group_by(cluster) %>%
summarise(
mean_child_mort = mean(child_mort),
mean_income = mean(income),
mean_gdpp = mean(gdpp),
mean_life_expec = mean(life_expec),
mean_inflation = mean(inflation),
mean_exports = mean(exports),
mean_imports = mean(imports),
mean_health = mean(health),
mean_total_fer = mean(total_fer),
.groups = "drop"
)
cluster_profile
## # A tibble: 3 × 10
## cluster mean_child_mort mean_income mean_gdpp mean_life_expec mean_inflation
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 5 45672. 42494. 80.1 2.67
## 2 2 21.9 12306. 6486. 72.8 7.60
## 3 3 93.0 3942. 1922. 59.2 12.0
## # ℹ 4 more variables: mean_exports <dbl>, mean_imports <dbl>,
## # mean_health <dbl>, mean_total_fer <dbl>
Anda dapat menambahkan visualisasi profil cluster (misalnya barplot atau radar chart) bila diperlukan.
fviz_cluster(
kmeans_result,
data = data_scaled,
geom = "point",
ellipse.type = "norm",
main = "Visualisasi Cluster Negara (K-Means)"
)
Untuk menilai ketertinggalan, digunakan kombinasi beberapa indikator utama: - child_mort (semakin tinggi → semakin tertinggal) - life_expec (semakin rendah → semakin tertinggal) - income (semakin rendah → semakin tertinggal) - gdpp (semakin rendah → semakin tertinggal)
cluster_profile_rank <- cluster_profile %>%
mutate(
# Semakin tinggi child_mort = semakin tertinggal (rank desc)
rank_child_mort = dense_rank(desc(mean_child_mort)),
# Semakin rendah life_expec/income/gdpp = semakin tertinggal (rank naik)
rank_life_expec = dense_rank(mean_life_expec),
rank_income = dense_rank(mean_income),
rank_gdpp = dense_rank(mean_gdpp),
# Skor total ketertinggalan (semakin besar = semakin tertinggal)
skor_ketertinggalan = rank_child_mort + rank_life_expec +
rank_income + rank_gdpp
) %>%
arrange(desc(skor_ketertinggalan))
cluster_profile_rank
## # A tibble: 3 × 15
## cluster mean_child_mort mean_income mean_gdpp mean_life_expec mean_inflation
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 5 45672. 42494. 80.1 2.67
## 2 2 21.9 12306. 6486. 72.8 7.60
## 3 3 93.0 3942. 1922. 59.2 12.0
## # ℹ 9 more variables: mean_exports <dbl>, mean_imports <dbl>,
## # mean_health <dbl>, mean_total_fer <dbl>, rank_child_mort <int>,
## # rank_life_expec <int>, rank_income <int>, rank_gdpp <int>,
## # skor_ketertinggalan <int>
Cluster dengan skor ketertinggalan tertinggi dianggap sebagai cluster paling tertinggal.
cluster_tertinggal <- cluster_profile_rank$cluster[1]
cluster_tertinggal
## [1] 1
## Levels: 1 2 3
negara_cluster_tertinggal <- data_clustered %>%
filter(cluster == cluster_tertinggal) %>%
select(country, cluster, child_mort, income, gdpp, life_expec) %>%
arrange(desc(child_mort))
negara_cluster_tertinggal
## # A tibble: 36 × 6
## country cluster child_mort income gdpp life_expec
## <chr> <fct> <dbl> <dbl> <dbl> <dbl>
## 1 Kuwait 1 10.8 75200 38500 78.2
## 2 Brunei 1 10.5 80600 35300 77.1
## 3 Qatar 1 9 125000 70300 79.5
## 4 Bahrain 1 8.6 41100 20700 76
## 5 United Arab Emirates 1 8.6 57600 35000 76.5
## 6 United States 1 7.3 49400 48400 78.7
## 7 Slovak Republic 1 7 25200 16600 75.5
## 8 Malta 1 6.8 28300 21100 80.3
## 9 New Zealand 1 6.2 32300 33700 80.9
## 10 Canada 1 5.6 40700 47400 81.3
## # ℹ 26 more rows
Secara umum, data menunjukkan adanya kesenjangan besar antarnegara:
Secara kualitatif (dapat disesuaikan dengan output
cluster_profile):
k = 3
menghasilkan tiga cluster negara: