library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(cluster)
## Warning: package 'cluster' was built under R version 4.3.3
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

Input Data

getwd()
## [1] "/Users/nadhifanurf/Documents"
setwd("/Users/nadhifanurf/Documents")
soci_economic_indonesia <- read.csv("2021socio_economic_indonesia.csv", sep = ";")
data <- soci_economic_indonesia[, c(2:6)]
rownames(data) <- soci_economic_indonesia$Row.Labels
data
##                           Average.of.poorpeople_percentage Average.of.reg_gdp
## Aceh                                             15.693913           7.241043
## Bali                                              4.915556          25.056778
## Banten                                            6.643750          78.916125
## Bengkulu                                         14.929000           7.338900
## DI Yogyakarta                                    13.288000          27.678600
## DKI Jakarta                                       6.565000         465.185667
## Gorontalo                                        15.738333           6.981667
## Jambi                                             7.977273          18.886182
## Jawa Barat                                        8.969630          78.591111
## Jawa Tengah                                      11.392571          38.493371
## Jawa Timur                                       11.321842          60.618605
## Kalimantan Barat                                  7.467857          15.321000
## Kalimantan Selatan                                5.036923          13.895462
## Kalimantan Tengah                                 5.071429          10.855214
## Kalimantan Timur                                  7.566000          60.943900
## Kalimantan Utara                                  7.196000          20.015600
## Kepulauan Bangka Belitung                         5.070000          10.805429
## Kepulauan Riau                                    7.694286          36.033714
## Lampung                                          12.147333          23.978533
## Maluku                                           21.444545           4.260091
## Maluku Utara                                      8.029000           4.256400
## Nusa Tenggara Barat                              14.279000          13.432500
## Nusa Tenggara Timur                              21.748182           4.905318
## Papua                                            28.379310           6.902552
## Papua Barat                                      25.330000         160.716923
## Riau                                              8.342500          61.057083
## Sulawesi Barat                                   10.525000           7.678667
## Sulawesi Selatan                                  9.468333          21.090958
## Sulawesi Tengah                                  13.514615          15.202538
## Sulawesi Tenggara                                13.065882           7.675235
## Sulawesi Utara                                    8.279333           8.854067
## Sumatera Barat                                    6.562632          12.730474
## Sumatera Selatan                                 13.214118          27.210353
## Sumatera Utara                                   11.085455          24.910121
##                           Average.of.life_exp Average.of.avg_schooltime
## Aceh                                 68.25674                  9.503478
## Bali                                 72.67333                  8.642222
## Banten                               68.15563                  8.907500
## Bengkulu                             67.60450                  8.612000
## DI Yogyakarta                        74.56600                  9.706000
## DKI Jakarta                          73.13000                 10.850000
## Gorontalo                            67.98917                  7.900000
## Jambi                                69.97091                  8.501818
## Jawa Barat                           72.44852                  8.657778
## Jawa Tengah                          75.03057                  7.979429
## Jawa Timur                           71.66539                  8.060789
## Kalimantan Barat                     71.61393                  7.303571
## Kalimantan Selatan                   68.58462                  8.280000
## Kalimantan Tengah                    69.48714                  8.641429
## Kalimantan Timur                     73.19900                  9.442000
## Kalimantan Utara                     72.14700                  9.108000
## Kepulauan Bangka Belitung            71.05429                  8.095714
## Kepulauan Riau                       68.83143                  8.771429
## Lampung                              69.25033                  8.183333
## Maluku                               64.59045                  9.400000
## Maluku Utara                         66.81350                  8.820000
## Nusa Tenggara Barat                  67.87400                  7.915000
## Nusa Tenggara Timur                  66.22773                  7.627273
## Papua                                65.21759                  6.249310
## Papua Barat                          65.55423                  7.716923
## Riau                                 70.20083                  9.050833
## Sulawesi Barat                       66.27000                  7.965000
## Sulawesi Selatan                     69.52417                  8.272083
## Sulawesi Tengah                      68.19692                  8.896923
## Sulawesi Tenggara                    70.19471                  8.715882
## Sulawesi Utara                       69.89633                  9.326667
## Sumatera Barat                       70.28447                  9.244211
## Sumatera Selatan                     67.99824                  8.221176
## Sumatera Utara                       69.10212                  9.180909
##                           Average.of.exp_percap
## Aceh                                   9642.783
## Bali                                  13704.667
## Banten                                12124.125
## Bengkulu                              10222.100
## DI Yogyakarta                         13996.000
## DKI Jakarta                           18522.667
## Gorontalo                             10068.833
## Jambi                                 10453.182
## Jawa Barat                            10762.963
## Jawa Tengah                           11139.200
## Jawa Timur                            11568.526
## Kalimantan Barat                       9030.500
## Kalimantan Selatan                    11942.462
## Kalimantan Tengah                     11021.500
## Kalimantan Timur                      12074.800
## Kalimantan Utara                       9070.400
## Kepulauan Bangka Belitung             12920.714
## Kepulauan Riau                        14049.143
## Lampung                                9762.000
## Maluku                                 8763.545
## Maluku Utara                           7955.800
## Nusa Tenggara Barat                   10404.600
## Nusa Tenggara Timur                    7455.227
## Papua                                  6819.793
## Papua Barat                            7780.154
## Riau                                  10753.917
## Sulawesi Barat                         9214.333
## Sulawesi Selatan                      11016.042
## Sulawesi Tengah                        9062.692
## Sulawesi Tenggara                      9009.588
## Sulawesi Utara                        10706.667
## Sumatera Barat                        10712.316
## Sumatera Selatan                      10512.353
## Sumatera Utara                        10401.152

Data Prepocessing

Melihat apakah ada missing value

sum(is.na(data))
## [1] 0

Berdasarkan output di atas diperoleh informasi bahwa tidak ada missing value pada data sehingga proses selanjutnya dapat dilakukan.

Melihat tipe data (data harus tipe numerik)

str(data)
## 'data.frame':    34 obs. of  5 variables:
##  $ Average.of.poorpeople_percentage: num  15.69 4.92 6.64 14.93 13.29 ...
##  $ Average.of.reg_gdp              : num  7.24 25.06 78.92 7.34 27.68 ...
##  $ Average.of.life_exp             : num  68.3 72.7 68.2 67.6 74.6 ...
##  $ Average.of.avg_schooltime       : num  9.5 8.64 8.91 8.61 9.71 ...
##  $ Average.of.exp_percap           : num  9643 13705 12124 10222 13996 ...

Berdasarkan output di atas diperoleh informasi bahwa seluruh data bertipe numerik sehingga proses selanjutnya dapat dilakukan.

Standarisasi Data

datastandarisasi <- scale(data)
summary(datastandarisasi)
##  Average.of.poorpeople_percentage Average.of.reg_gdp Average.of.life_exp
##  Min.   :-1.1202                  Min.   :-0.44968   Min.   :-1.88236   
##  1st Qu.:-0.6758                  1st Qu.:-0.40397   1st Qu.:-0.58310   
##  Median :-0.2438                  Median :-0.29166   Median :-0.05693   
##  Mean   : 0.0000                  Mean   : 0.00000   Mean   : 0.00000   
##  3rd Qu.: 0.3532                  3rd Qu.:-0.08451   3rd Qu.: 0.74734   
##  Max.   : 2.9268                  Max.   : 5.21985   Max.   : 2.10604   
##  Average.of.avg_schooltime Average.of.exp_percap
##  Min.   :-2.84117          Min.   :-1.71857     
##  1st Qu.:-0.62309          1st Qu.:-0.69688     
##  Median : 0.07431          Median :-0.08188     
##  Mean   : 0.00000          Mean   : 0.00000     
##  3rd Qu.: 0.62497          3rd Qu.: 0.35530     
##  Max.   : 2.76516          Max.   : 3.51051
var(datastandarisasi)
##                                  Average.of.poorpeople_percentage
## Average.of.poorpeople_percentage                       1.00000000
## Average.of.reg_gdp                                    -0.09030845
## Average.of.life_exp                                   -0.59917595
## Average.of.avg_schooltime                             -0.43450234
## Average.of.exp_percap                                 -0.58949283
##                                  Average.of.reg_gdp Average.of.life_exp
## Average.of.poorpeople_percentage        -0.09030845          -0.5991759
## Average.of.reg_gdp                       1.00000000           0.2629138
## Average.of.life_exp                      0.26291384           1.0000000
## Average.of.avg_schooltime                0.44401584           0.3762103
## Average.of.exp_percap                    0.59961919           0.6215811
##                                  Average.of.avg_schooltime
## Average.of.poorpeople_percentage                -0.4345023
## Average.of.reg_gdp                               0.4440158
## Average.of.life_exp                              0.3762103
## Average.of.avg_schooltime                        1.0000000
## Average.of.exp_percap                            0.5858951
##                                  Average.of.exp_percap
## Average.of.poorpeople_percentage            -0.5894928
## Average.of.reg_gdp                           0.5996192
## Average.of.life_exp                          0.6215811
## Average.of.avg_schooltime                    0.5858951
## Average.of.exp_percap                        1.0000000

Standarisasi dilakukan karena terdapat perbedaan satuan variabel seperti variabel rata-rata lama sekolah memiliki satuan puluhan (00), sedangkan variabel pengeluaran perkapita memiliki satuan puluhan ribu (00.000), sehingga perbedaan tersebut akan membuat perhitungan jarak antar objek menjadi tidak valid. Berdasarkan output di atas telah diperoleh mean 0 dan standar deviasi 1.

Hitung Jarak antar Objek

distance <- get_dist(datastandarisasi)
fviz_dist(distance, gradient = list(low = "white", mid = "red", high = "darkblue"))

Berdasarkan output di atas diperoleh bahwa provinsi yang mempunyai jarak yang jauh ditunjukkan dengan warna biru yang semakin gelap, jarak menengah ditunjukkan dengan warna putih, dan jarak yang dekat ditunjukkan dengan warna merah yang semakin terang. Misalkan Provinsi Jakarta dengan Provinsi Papua berwarna biru tua yang menunjukkan bahwa kedua provinsi memiliki jarak yang sangat jauh, kemudian Provinsi Sulawesi Tengah dengan Provinsi Aceh berwarna merah muda yang menunjukkan bahwa kedua provinsi memiliki jarak yang sangat dekat. Semakin dekat jarak antara dua provinsi semakin besar kesamaannya.

Penentuan Jumlah Cluster Optimal

Metode Elbow

fviz_nbclust(datastandarisasi, pam, method = "wss")

Pada metode Elbow banyaknya cluster didasarkan pada garis yang mengalami patahan berbentuk seperti siku (elbow). Berdasarkan output di atas diperoleh bahwa garis mengalami patahan yang membentuk elbow atau siku pada saat \(k=3\). Oleh karena itu, dengan menggunakan metode elbow diperoleh \(k\) optimal pada saat berada di \(k=3\).

Metode Silhouette

fviz_nbclust(datastandarisasi, pam, method = "silhouette")

Metode silhouette menggunakan pendekatan nilai rata-rata untuk menduga \(k\) optimal dari cluster yang terbentuk. Semakin tinggi nilai rata-rata akan semakin baik. Berdasarkan output di atas dengan menggunakan metode silhouette diperoleh jumlah cluster optimal yang akan terbentuk pada saat \(k=3\).

Gap Statistic

set.seed(1)
gap_stat <- clusGap(datastandarisasi, FUN = pam, nstart = 25,
                    K.max = 10, B = 50)
fviz_gap_stat(gap_stat)

Sebelum melakukan syntax clusGap(), dijalankan terlebih dahulu fungsi set.seed(1) guna menghasilkan output yang sama setiap kali syntax tersebut dijalankan. Nilai K.max = 10 adalah jumlah maksimum cluster yang perlu dipertimbangkan, sedangkan nilai B = 10 adalah jumlah banyaknya sampel. Berdasarkan output di atas dengan menggunakan metode Gap Statistik diperoleh jumlah cluster optimal adalah \(k=3\). Berdasarkan ketiga metode, akan digunakan jumlah cluster optimal \(k=3\).

K-Medoids 3 Cluster

pam.result <- pam(datastandarisasi, 3)
print(pam.result)
## Medoids:
##             ID Average.of.poorpeople_percentage Average.of.reg_gdp
## Bengkulu     4                        0.6068911         -0.4117675
## Jambi        8                       -0.5921387         -0.2697332
## DKI Jakarta  6                       -0.8357267          5.2198538
##             Average.of.life_exp Average.of.avg_schooltime Average.of.exp_percap
## Bengkulu             -0.7309149                0.03796671           -0.19835356
## Jambi                 0.1731155               -0.09629906           -0.09510137
## DKI Jakarta           1.3799711                2.76515711            3.51051310
## Clustering vector:
##                      Aceh                      Bali                    Banten 
##                         1                         2                         2 
##                  Bengkulu             DI Yogyakarta               DKI Jakarta 
##                         1                         2                         3 
##                 Gorontalo                     Jambi                Jawa Barat 
##                         1                         2                         2 
##               Jawa Tengah                Jawa Timur          Kalimantan Barat 
##                         2                         2                         2 
##        Kalimantan Selatan         Kalimantan Tengah          Kalimantan Timur 
##                         2                         2                         2 
##          Kalimantan Utara Kepulauan Bangka Belitung            Kepulauan Riau 
##                         2                         2                         2 
##                   Lampung                    Maluku              Maluku Utara 
##                         2                         1                         1 
##       Nusa Tenggara Barat       Nusa Tenggara Timur                     Papua 
##                         1                         1                         1 
##               Papua Barat                      Riau            Sulawesi Barat 
##                         1                         2                         1 
##          Sulawesi Selatan           Sulawesi Tengah         Sulawesi Tenggara 
##                         2                         1                         2 
##            Sulawesi Utara            Sumatera Barat          Sumatera Selatan 
##                         2                         2                         1 
##            Sumatera Utara 
##                         2 
## Objective function:
##    build     swap 
## 1.375007 1.335187 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"
fviz_cluster(pam.result, data = datastandarisasi)

Terbentuk 3 cluster, yaitu cluster 1 sebanyak 12 provinsi, cluster 2 sebanyak 21 provinsi, dan cluster 3 sebanyak 1 provinsi.

Karakteristik Tiap Cluster

data%>%
  mutate(Cluster = pam.result$cluster) %>%
  group_by(Cluster)%>%
  summarise_all("mean")
## # A tibble: 3 × 6
##   Cluster Average.of.poorpeople_percent…¹ Average.of.reg_gdp Average.of.life_exp
##     <int>                           <dbl>              <dbl>               <dbl>
## 1       1                           16.9                22.2                66.9
## 2       2                            8.50               31.3                70.9
## 3       3                            6.56              465.                 73.1
## # ℹ abbreviated name: ¹​Average.of.poorpeople_percentage
## # ℹ 2 more variables: Average.of.avg_schooltime <dbl>,
## #   Average.of.exp_percap <dbl>
  1. Cluster 1 merupakan provinsi yang memiliki persentase penduduk miskin tertinggi dari cluster lain.

  2. Cluster 2 merupakan provinsi yang memiliki persentase penduduk miskin tertinggi kedua setelah cluster 1 dan PDRB, angka harapan hidup, rata-rata lama sekolah, dan pengeluaran perkapita tertinggi kedua setelah cluster 3

  3. Cluster 3 merupakan provinsi yang memiliki PDRB, angka harapan hidup, rata-rata lama sekolah, dan pengeluaran perkapita tertinggi dari cluster lain.

Pembagian Tiap Cluster

Cluster 1

pam.result$cluster[pam.result$cluster==1]
##                Aceh            Bengkulu           Gorontalo              Maluku 
##                   1                   1                   1                   1 
##        Maluku Utara Nusa Tenggara Barat Nusa Tenggara Timur               Papua 
##                   1                   1                   1                   1 
##         Papua Barat      Sulawesi Barat     Sulawesi Tengah    Sumatera Selatan 
##                   1                   1                   1                   1

Provinsi dengan tingkat sosial-ekonomi Indonesia pada tahun 2021 terendah adalah Aceh, Bengkulu, Gorontalo, Maluku, Maluku Utara, Nusa Tenggara Barat, Nusa Tenggara Timur, Papua, Papua Barat, Sulawesi Barat, Sulawesi Tengah, dan Sumatera Selatan.

Cluster 2

pam.result$cluster[pam.result$cluster==2]
##                      Bali                    Banten             DI Yogyakarta 
##                         2                         2                         2 
##                     Jambi                Jawa Barat               Jawa Tengah 
##                         2                         2                         2 
##                Jawa Timur          Kalimantan Barat        Kalimantan Selatan 
##                         2                         2                         2 
##         Kalimantan Tengah          Kalimantan Timur          Kalimantan Utara 
##                         2                         2                         2 
## Kepulauan Bangka Belitung            Kepulauan Riau                   Lampung 
##                         2                         2                         2 
##                      Riau          Sulawesi Selatan         Sulawesi Tenggara 
##                         2                         2                         2 
##            Sulawesi Utara            Sumatera Barat            Sumatera Utara 
##                         2                         2                         2

Provinsi dengan tingkat sosial-ekonomi Indonesia pada tahun 2021 tertinggi kedua adalah Bali, Banten, DI Yogyakarta, Jambi, Jawa Barat, Jawa Tengah, Jawa Timur, Kalimantan Barat, Kalimantan Selatan, Kalimantan Tengah, Kalimantan Timur, Kalimantan Utara, Kepulauan Bangka Belitung, Kepulauan Riau, Lampung, Riau, Sulawesi Selatan, Sulawesi Tenggara, Sulawesi Utara, Sumatera Barat, dan Sumatera Utara.

Cluster 3

pam.result$cluster[pam.result$cluster==3]
## DKI Jakarta 
##           3

Provinsi dengan tingkat sosial-ekonomi Indonesia pada tahun 2021 paling tinggi adalah Jakarta