Pengelompokan Negara Berdasarkan Indikator Kebahagiaan Dunia Menggunakan K-Means

Leri Oktavia Amara

28 November 2024


Library:

> # install.packages("knitr")
> # install.packages("rmarkdown")
> # install.packages("prettydoc")
> # install.packages("equatiomatic")

1 PENDAHULUAN

1.1 Latar Belakang

Kebahagiaan merupakan sebuah hal yang dianggap penting oleh masyarakat saat ini, kebahagiaan bersifat domino yang berarti bahwa kebahagiaan suatu individu bisa memengaruhi individu lainnya, termasuk dalam urusan kebahagiaan suatu negara juga dipengaruhi oleh kesejahteraan masyarakatnya. Indeks Kebahagiaan adalah pengukuran yang dilakukan untuk mengetahui kesejahteraan secara subjektif yaitu seberapa bahagia seseorang beserta penyebabnya (Kumalasari & Yasa, 2020). Oleh karena itu, banyak penelitian yang mengukur kebahagiaan berdasarkan faktor-faktor tertentu secara subjektif.

Salah satunya adalah Laporan Kebahagiaan Dunia (World Happiness Report) yang diterbitkan oleh Perserikatan Bangsa-Bangsa (PBB) sejak tahun 2012. World Happiness Report adalah sebuah laporan kebahagiaan yang telah dikaji oleh para ahli dan pakar terkemuka di bidang psikologi, ekonomi, dan statistik, yang bertujuan untuk mengukur tingkat kebahagiaan di negara-negara di seluruh dunia (Hamidah & Voutama, 2023). Laporan tersebut dirancang untuk memahami faktor-faktor yang memengaruhi kebahagiaan di dunia, tak hanya itu, laporan tersebut juga mengurutkan negara-negara di dunia berdasarkan negara yang paling bahagia dan paling tidak bahagia. Oleh karena itu, informasi mengenai kedekatan karakteristik/variabel negara-negara yang memiliki tingkat kebahagiaan yang tinggi atau rendah penting untuk diketahui.

1.2 Tujuan

Tujuan dari analisis ini adalah untuk mengelompokkan negara-negara yang termasuk dalam Laporan Kebahagiaan Dunia (World Happiness Report) ke dalam k cluster dan mengetahui karakteristik setiap cluster.

1.3 Metode

Banyak metode analisis yang digunakan untuk menganalisis dataset tersebut, salah satunya adalah clustering. Clustering adalah salah satu metode yang digunakan untuk mengklasifikasikan data dengan cara mengelompokkan data dalam suatu set data baru yang tidak diketahui sebelumnya (Wakhidah, 2010). Algoritma K-Means merupakan algoritma untuk mengelompokkan (cluster) berjumlah n observasi berdasarkan atribut menjadi k partisi di mana k < n (Wakhidah, 2010).

  1. Langkah-langkah untuk melakukan K-Means clustering adalah sebagai berikut:

  2. Menentukan jumlah cluster

  3. Menentukan nilai centroid

  4. Menghitung jarak titik centroid ke titik setiap objek

  5. Mengelompokkan objek berdasarkan kedekatan dengan centroid

  6. Mengulangi langkah 2-4 hingga nilai centroid tetap dan objek tidak berpindah cluster (konsisten).

1.4 Data

Data yang digunakan adalah data “Laporan Kebahagiaan Dunia (World Happiness Report)” tahun 2015 yang diperoleh secara sekunder dari website Kaggle. Data dapat dilihat pada tabel berikut.

2 SOURCE CODE

2.1 Library

library(rmarkdown)
library(readxl)      
library(factoextra)  
library(cluster)    
library(ggplot2)

2.2 Struktur Data

DataUAP <- read_excel("C:/Users/WINDOWS 11/Documents/Anmul UAP.xlsx", sheet = 2)
DataUAP
str(DataUAP)

Impor data dari excel dengan nama file Anmul UAP dan sheet yang dipilih adalah sheet 2

2.3 Statistika Deskriptif

summary(DataUAP)

2.4 Standarisasi Data

DataUAP_standard <- scale(DataUAP[, c(-1)])

Karena data setiap variabel memiliki satuan yang berbeda maka perlu distandarisasi terlebih dahulu. c(-1) berisikan perintah untuk menghapus kolom pertama (bukan numerik)

2.5 Menentukan Jumlah Cluster Optimal

fviz_nbclust(DataUAP_standard, kmeans, method = "silhouette") + 
  ggtitle("Determining Optimal Clusters using Silhouette Method") + 
  theme_minimal()

Penentuan cluster optimal dengan metode silhoutte, di mana digunakan k adalah angka yang dipotong oleh garis putus-putus

2.6 K-Means Clustering

set.seed(123)  
kmeans_DataUAP <- kmeans(DataUAP_standard, centers = 3, nstart = 25)

Melakukan clustering dengan centers adalah k yang diperoleh pada step sebelumnya, dan nstart sebanyak 25 iterasi.

2.7 Visualisasi Hasil Clustering

fviz_cluster(kmeans_DataUAP, data = DataUAP_standard) +
  ggtitle("Cluster Visualization") + 
  theme_minimal()

Dilakukan visualisasi dari hasil clustering yang sudah diperoleh

2.8 Validasi silhouette width

silhouette_score <- silhouette(kmeans_DataUAP$cluster, dist(DataUAP_standard))
fviz_silhouette(silhouette_score) +
  ggtitle("Silhouette Plot for Clustering") + 
  theme_minimal()

Validasi dengan metode silhoutte width

2.9 Menambahkan Hasil Clustering ke Data Asli

DataUAP$cluster <- kmeans_DataUAP$cluster
View(DataUAP)

2.10 Menghitung Rata-rata tiap Cluster

cluster_means <- aggregate(
  DataUAP,
  by = list(Cluster = DataUAP$cluster),
  FUN = mean
)
print(cluster_means)

Untuk mengetahui karakteristik dari masing-masing cluster, digunakan salah satu fungsi agregat, yaitu Rata-rata.

2.11 Menampilkan Daftar Negara berdasarkan Cluster

negara_per_cluster <- split(DataUAP$Country, DataUAP$cluster)
print(negara_per_cluster)

3 HASIL DAN PEMBAHASAN

3.1 Library

> library(rmarkdown)
> library(readxl)      
> library(factoextra)  
> library(cluster)    
> library(ggplot2)

3.2 Struktur Data

> DataUAP <- read_excel("C:/Users/WINDOWS 11/Documents/Anmul UAP.xlsx", sheet = 2)
> DataUAP
# A tibble: 158 × 5
   Country     `Economy (GDP per Capita)` Freedom Trust (Government Corruption…¹
   <chr>                            <dbl>   <dbl>                          <dbl>
 1 Switzerland                       1.40   0.666                          0.420
 2 Iceland                           1.30   0.629                          0.141
 3 Denmark                           1.33   0.649                          0.484
 4 Norway                            1.46   0.670                          0.365
 5 Canada                            1.33   0.633                          0.330
 6 Finland                           1.29   0.642                          0.414
 7 Netherlands                       1.33   0.616                          0.318
 8 Sweden                            1.33   0.660                          0.438
 9 New Zealand                       1.25   0.639                          0.429
10 Australia                         1.33   0.651                          0.356
# ℹ 148 more rows
# ℹ abbreviated name: ¹​`Trust (Government Corruption)`
# ℹ 1 more variable: `Health (Life Expectancy)` <dbl>
> str(DataUAP)
tibble [158 × 5] (S3: tbl_df/tbl/data.frame)
 $ Country                      : chr [1:158] "Switzerland" "Iceland" "Denmark" "Norway" ...
 $ Economy (GDP per Capita)     : num [1:158] 1.4 1.3 1.33 1.46 1.33 ...
 $ Freedom                      : num [1:158] 0.666 0.629 0.649 0.67 0.633 ...
 $ Trust (Government Corruption): num [1:158] 0.42 0.141 0.484 0.365 0.33 ...
 $ Health (Life Expectancy)     : num [1:158] 0.941 0.948 0.875 0.885 0.906 ...

Data memiliki 5 variabel dengan variabel Country memiliki tipe data character dan sisanya numerik, memiliki 158 observasi

3.3 Statistika Deskriptif

> summary(DataUAP)
   Country          Economy (GDP per Capita)    Freedom      
 Length:158         Min.   :0.0000           Min.   :0.0000  
 Class :character   1st Qu.:0.5458           1st Qu.:0.3283  
 Mode  :character   Median :0.9102           Median :0.4355  
                    Mean   :0.8461           Mean   :0.4286  
                    3rd Qu.:1.1584           3rd Qu.:0.5491  
                    Max.   :1.6904           Max.   :0.6697  
 Trust (Government Corruption) Health (Life Expectancy)
 Min.   :0.00000               Min.   :0.0000          
 1st Qu.:0.06168               1st Qu.:0.4392          
 Median :0.10722               Median :0.6967          
 Mean   :0.14342               Mean   :0.6303          
 3rd Qu.:0.18025               3rd Qu.:0.8110          
 Max.   :0.55191               Max.   :1.0252          

Menampilkan deskripsi data yang berisi nilai minimum, kuartil, rata-rata, dan maksimum dari masing-masing variabel bertipe numerik.

3.4 Standarisasi Data

> DataUAP_standard <- scale(DataUAP[, c(-1)])

Standarisasi hanya dilakukan pada data numerik, yaitu semua variabel kecuali variabel Country (variabel kolom pertama (c(-1))). Data yang telah distandarisasi, selanjutnya akan digunakan dalam perhitungan clustering.

3.5 Jumlah Cluster Optimal

> fviz_nbclust(DataUAP_standard, kmeans, method = "silhouette") + 
+   ggtitle("Determining Optimal Clusters using Silhouette Method") + 
+   theme_minimal()

Berdasarkan plot yang ditampilkan dengan metode silhouette, diperoleh garis putus putus pada k=3, sehingga jumlah cluster yang optimal adalah 3

3.6 K-Means Clustering

> set.seed(123)  
> kmeans_DataUAP <- kmeans(DataUAP_standard, centers = 3, nstart = 25)

Melakukan clustering dengan k adalah 3 dan sebanyak 25 iterasi

3.7 Visualisasi Hasil Clustering

> fviz_cluster(kmeans_DataUAP, data = DataUAP_standard) +
+   ggtitle("Cluster Visualization") + 
+   theme_minimal()

Diperoleh 3 cluster, cluster 1 berwarna merah, cluster 2 berwarna hijau, dan cluster 3 berwarna biru. Sekilas terlihat dari visualisasi, ukuran cluster tidak jauh berbeda dan jarak antar cluster tidak terlalu jauh.

3.8 Validasi Hasil Clustering

> silhouette_score <- silhouette(kmeans_DataUAP$cluster, dist(DataUAP_standard))
> fviz_silhouette(silhouette_score) +
+   ggtitle("Silhouette Plot for Clustering") + 
+   theme_minimal()
  cluster size ave.sil.width
1       1   35          0.36
2       2   78          0.35
3       3   45          0.40

Untuk mengevaluasi hasil clustering yang dilakukan, digunakan validitas silhouette width dan diperoleh ukuran cluster 1 adalah 35 observasi, cluster 2 adalah 78 observasi, dan cluster 3 adalah 45 observasi. ave.sil.width digunakan untuk melihat ukuran atau kedekatan antar cluster, ave.sil.width bernilai dari -1 sampai 1, apabila bernilai -1 atau mendekati -1 maka terdapat indikasi adanya penempatan cluster yang salah, jika bernilai 0 atau mendekati 0 maka cluster tidak cukup baik atau tidak cukup terpisah dari cluster lain, indikasi adanya tumpang tindih, dan jika bernilai 1 maka cluster dianggap sangat baik dalam memisahkan atau mengelompokkan data.

Berdasarkan hasil tersebut, seluruh ave.sil.width bernilai <0.50 mengindikasikan pemisahan cluster tidak cukup baik, meskipun tidak terlihat tumpang tindih pada visualisasi cluster, tetapi ketiga cluster terlihat sangat dekat.

3.9 Menambahkan Hasil Clustering ke Data Asli

> DataUAP$cluster <- kmeans_DataUAP$cluster
> View(DataUAP)

Memasukkan hasil clustering ke data asli (data awal) dengan menambah kolom baru bernama cluster pada DataUAP, kemudian digunakan View(DataUAP) untuk memastikan dan melihat bahwa hasil clustering memang sudah ditambahkan.

3.10 Rata-rata tiap Cluster

> cluster_means <- aggregate(
+   DataUAP[, c(-1)],
+   by = list(Cluster = DataUAP$cluster),
+   FUN = mean
+ )
> print(cluster_means)
  Cluster Economy (GDP per Capita)   Freedom Trust (Government Corruption)
1       1                1.2434640 0.5854520                     0.3208660
2       2                0.9498965 0.4026400                     0.0799400
3       3                0.3572558 0.3516538                     0.1154449
  Health (Life Expectancy) cluster
1                0.8355960       1
2                0.7279482       2
3                0.3012258       3

Berdasarkan hasil tersebut, diketahui bahwa sebagian besar negara yang memiliki GDP per Kapita terendah adalah cluster 3, yaitu 0.3572558, sedangkan untuk Kebebasan berpendapat cenderung tidak jauh berbeda antar cluster. Kemudian untuk kepercayaan kepada pemerintah terendah ada pada cluster 2, dan untuk angka harapan hidup terendah ada pada cluster 3. Dengan demikian, secara keseluruhan, cluster 3 memiliki rata-rata terendah untuk 3 dari 4 variabel.

3.11 Menampilkan Daftar Negara berdasarkan Cluster

Diperoleh anggota cluster sebagai berikut.

> negara_per_cluster <- split(DataUAP$Country, DataUAP$cluster)
> print(negara_per_cluster)
$`1`
 [1] "Switzerland"          "Iceland"              "Denmark"             
 [4] "Norway"               "Canada"               "Finland"             
 [7] "Netherlands"          "Sweden"               "New Zealand"         
[10] "Australia"            "Austria"              "Mexico"              
[13] "United States"        "Luxembourg"           "Ireland"             
[16] "Belgium"              "United Arab Emirates" "United Kingdom"      
[19] "Oman"                 "Singapore"            "Germany"             
[22] "Qatar"                "France"               "Uruguay"             
[25] "Saudi Arabia"         "Malta"                "Kuwait"              
[28] "Uzbekistan"           "Japan"                "Bahrain"             
[31] "Turkmenistan"         "Hong Kong"            "Laos"                
[34] "Georgia"              "Rwanda"              

$`2`
 [1] "Israel"                  "Costa Rica"             
 [3] "Brazil"                  "Venezuela"              
 [5] "Panama"                  "Chile"                  
 [7] "Argentina"               "Czech Republic"         
 [9] "Colombia"                "Thailand"               
[11] "Spain"                   "Taiwan"                 
[13] "Suriname"                "Trinidad and Tobago"    
[15] "El Salvador"             "Guatemala"              
[17] "Slovakia"                "South Korea"            
[19] "Ecuador"                 "Italy"                  
[21] "Bolivia"                 "Moldova"                
[23] "Paraguay"                "Kazakhstan"             
[25] "Slovenia"                "Lithuania"              
[27] "Nicaragua"               "Peru"                   
[29] "Belarus"                 "Poland"                 
[31] "Malaysia"                "Croatia"                
[33] "Libya"                   "Russia"                 
[35] "Jamaica"                 "North Cyprus"           
[37] "Cyprus"                  "Algeria"                
[39] "Kosovo"                  "Mauritius"              
[41] "Estonia"                 "Indonesia"              
[43] "Vietnam"                 "Turkey"                 
[45] "Kyrgyzstan"              "Bhutan"                 
[47] "Azerbaijan"              "Jordan"                 
[49] "Montenegro"              "China"                  
[51] "Romania"                 "Serbia"                 
[53] "Portugal"                "Latvia"                 
[55] "Philippines"             "Morocco"                
[57] "Macedonia"               "Albania"                
[59] "Bosnia and Herzegovina"  "Dominican Republic"     
[61] "Mongolia"                "Greece"                 
[63] "Lebanon"                 "Hungary"                
[65] "Honduras"                "Tunisia"                
[67] "Palestinian Territories" "Iran"                   
[69] "Ukraine"                 "Iraq"                   
[71] "India"                   "Armenia"                
[73] "Sri Lanka"               "Bulgaria"               
[75] "Egypt"                   "Gabon"                  
[77] "Cambodia"                "Syria"                  

$`3`
 [1] "Nigeria"                  "Pakistan"                
 [3] "Zambia"                   "Somaliland region"       
 [5] "Mozambique"               "Lesotho"                 
 [7] "Swaziland"                "Tajikistan"              
 [9] "Bangladesh"               "South Africa"            
[11] "Ghana"                    "Zimbabwe"                
[13] "Liberia"                  "Sudan"                   
[15] "Haiti"                    "Congo (Kinshasa)"        
[17] "Nepal"                    "Ethiopia"                
[19] "Sierra Leone"             "Mauritania"              
[21] "Kenya"                    "Djibouti"                
[23] "Botswana"                 "Myanmar"                 
[25] "Malawi"                   "Cameroon"                
[27] "Yemen"                    "Angola"                  
[29] "Mali"                     "Congo (Brazzaville)"     
[31] "Comoros"                  "Uganda"                  
[33] "Senegal"                  "Niger"                   
[35] "Tanzania"                 "Madagascar"              
[37] "Central African Republic" "Chad"                    
[39] "Guinea"                   "Ivory Coast"             
[41] "Burkina Faso"             "Afghanistan"             
[43] "Benin"                    "Burundi"                 
[45] "Togo"                    

Anggota Cluster 1 dari Switzerland hingga Laos

Anggota cluster 2 dari Israel hingga Syria

Anggota cluster 3 dari Nigeria hingga Togo

4 PENUTUP

4.1 Kesimpulan

Berdasarkan analisis k-means yang dilakukan, diperoleh cluster optimal adalah 3 dengan rincian sebagai berikut.

  1. Cluster 1 memiliki anggota 35 negara, dengan seluruh indikator kebahagiaan memiliki nilai paling tinggi dibandingkan cluster lainnya. Ini memungkinkan anggota pada cluster 1 memiliki tingkat kebahagiaan hidup yang tinggi.

  2. CLuster 2 memiliki anggota paling banyak, yaitu 78 negara dengan indikator kebahagiaan terendah ada pada tingkat kepercayaan kepada pemerintah.

  3. Cluster 3 memiliki anggota 45 negara, dengan 3 dari 4 indikator kebahagiaan, yaitu GDP per kapita, Kebebasan berpendapat, dan angka harapan hidup berada pada angka yang paling rendah dibandingkan dua cluster lainnya. Hal ini memungkinkan bahwa anggota negara pada cluster 3 memiliki tingkat kebahagiaan yang rendah.

4.2 Saran

Visualisasi clustering yang terbentuk menunjukkan bahwa antar cluster memiliki kedekatan yang cukup dekat sehingga karakteristik antar cluster tidak jauh berbeda. Untuk mengatasi hal tersebut, bisa menambah jumlah cluster agar tidak terjadi tumpang tindih antar cluster.

5 DAFTAR PUSTAKA

Hamidah, K., & Voutama, A. (2023). Analisis Faktor Tingkat Kebahagiaan Negara Menggunakan Data World Happiness Report dengan Metode Regresi Linier. Explore IT: Jurnal Keilmuan dan Aplikasi Teknik Informatika, 15(1), 1-7.

Kumalasari, D. A., & Yasa, I. G. W. M. (2020). Pengaruh Faktor-Faktor Yang Mempengaruhi Tingkat Kebahagiaan Negara Di Dunia. E-Jurnal Ekonomi Pembangunan Universitas Udayana, 9(5), 963-992.

UNSDSN. (n.d.). World Happiness Report dataset. Kaggle. Diakses pada 25 November 2024, dari https://www.kaggle.com/datasets/unsdsn/world-happiness

Wakhidah, N. (2010). Clustering menggunakan k-means algorithm. Jurnal Transformatika, 8(1), 33-39.