Modul 1: Analisis Faktor

Objectives Praktikum

  1. Praktikan mampu memahami analisis faktor berupa PCA (Principal Component Analysis) dan CFA (Common Factor Analysis)
  2. Praktikan mampu melakukan analisis faktor berupa PCA (Principal Component Analysis) dan CFA (Common Factor Analysis)

Review Teori

Analisis Faktor memiliki kegunaan untuk mengidentifikasi sejumlah kecil faktor yang dapat mewakili hubungan antar sejumlah banyak variabel yang saling berhubungan. Analisis ini melayani kebutuhan reduksi data melalui identifikasi struktur dalam sekumpulan variabel tersebut dengan mempertahankan sebanyak mungkin informasi awal yang dikandung tanpa menghilangkan data. Pengurangan dilakukan dengan melihat interdependensi beberapa variable yang dapat dijadikan satu yang disebut faktor sehingga ditemukan variable-variabel atau faktor-faktor yang dominan atau penting untuk dianalisis lebih lanjut, misalnya dengan dikorelasikan dengan variable tergantung/terikat.

Analisis faktor dapat dilakukan dengan PCA (Principal Component Analysis) dan CFA (Common Factor Analysis). Perbedaan nya adalah pada PCA, variabel-variabel yang ada dikelompokkan ke dalam faktor-faktor di mana peneliti tidak atau belum memiliki teori atau hipotesis yang meyusun faktor tersebut. PCA mencoba untuk menemukan hubungan antarvariabel baru atau faktor yang saling independen satu sama lain. Sementara pada CFA, pembentukan faktor dilakukan secara sengaja berdasarkan teori dan konsep yang telah ada.

PCA

Pada metode ini pengelompokkkan faktor dilakukan dengan prinsip optimal: jumlah komponen paling optimal, pilihan paling optimal untuk setiap variabel untuk setiap komponen, dan weight paling optimal. Secara diagramatis, PCA ditunjukkan gambar di bawah. Y merupakan variabel dan C merupakan komponen. 4 variabel yang ada dikelompokkan menjadi sebuah komponen. Setiap variabel memiliki kontribusi dengan berat masing-masing terhadap komponen C yang ditunjukkan dengan W dan arah panah yang menuju C.

CFA

Dalam metode ini telah ada teori yang mendasari terbentuknya faktor. Paling sering digunakan dalam psikologi. Contohnya social anxiety. Social anxiety tidak dapat diukur secara langsung (latent), namun menggunakan indikator tertentu seperti ketidaknyamanan dalam grup, ketidaknyamanan berbincang dengan orang asing. Social anxiety ini merupakan faktor (F) yang menyebabkan terjadinya variabel terukur berupa ketidaknyamanan dalam grup (Y1) dan ketidaknyamanan berbincang dengan orang asing (Y2). Hubungan antara F dan setiap Y dibobotkan, CFA dilakukan untuk mencari bobot optimal. Dalam CFA ini terdapat error yang ditunjukkan dengan u. Model ini memiliki bentuk seperti seperangkat persamaan regresi. Contoh dalam PWK adalah IPM.

Persamaan: Y1 = b1*F + u1 atau X=Af+e

Hands-on Praktikum

Data

Data yang digunakan adalah data fasilitas Kabupaten Subang. Sama seperti kota atau kabupaten lainnya, Kabupaten Subang memiliki derajat atau tingkatan kabupaten tersendiri. Tingkatan derajat tersebut dipengaruhi oleh faktor-faktor yang berada di dalamnya. Untuk mengetahui faktor-faktor apa saja yang mempengaruhi derajat Kabupaten Subang maka diperlukan analisis faktor untuk menganalisisnya. Berikut merupakan data yang digunakan pada praktikum ini.

Data ini juga dapat diunduh pada link ini: Data

data <- read.csv("data.csv")
head(data)
##      kecamatan jm_pg_list_per_desa jm_rs jm_puskes jm_sar_pel_kes
## 1 SAGALAHERANG                  13     0         6              9
## 2   JALANCAGAK                  17     0        15             14
## 3      CISALAK                  13     0         5              6
## 4 TANJUNGSIANG                  11     0         6              8
## 5      CIJAMBE                   9     0         7              4
## 6       CIBOGO                   7     0         3              2
##   jm_bl_pengobat jm_tk jm_pasar jm_kantorpos jm_toko jm_koperasi jm_masjid
## 1              0     9        2            1     110           1        82
## 2              1     8        6            1       0           1       119
## 3              1     5        3            1      38           1        89
## 4              0     7        8            1       0           1        80
## 5              0     2        1            0       0           1        67
## 6              0     1        1            0       0           1        42
##   jm_gereja jm_pt_asuhan jm_sar_olga jm_unit_usaha jm_perusaha_dgng
## 1         0            4          44            58               13
## 2         0            4          44           541               18
## 3         0            4          36           653               13
## 4         0            3          40           493               12
## 5         0            2          27           398               19
## 6         9            0          20            27               16

Nama-nama kolom yang membutuhkan penjelasan:

  • jm_pg_list_per_desa: Jumlah pengguna listrik per desa

  • jm_rs: Jumlah rumah sakit

  • jm_sar_pel_kes: Jumlah sarana pelayanan kesehatan

  • jm_bl_pengobat: Jumlah balai pengobatan

  • jm_pt_asuhan: Jumlah panti asuhan

  • jm_sar_olga: Jumlah sarana olahraga

  • jm_perusaha_dgng: Jumlah perusahaan dagang

Normalisasi Data

Hal pertama yang dilakukan adalah melakukan normalisasi data. Mengapa? mari kita lihat persebaran data numerik pada dataset berikut ini.

summary(data)
##   kecamatan         jm_pg_list_per_desa     jm_rs          jm_puskes     
##  Length:22          Min.   : 7.00       Min.   :0.0000   Min.   : 3.000  
##  Class :character   1st Qu.: 9.00       1st Qu.:0.0000   1st Qu.: 5.000  
##  Mode  :character   Median :11.00       Median :0.0000   Median : 6.000  
##                     Mean   :11.50       Mean   :0.1364   Mean   : 6.773  
##                     3rd Qu.:13.75       3rd Qu.:0.0000   3rd Qu.: 8.000  
##                     Max.   :18.00       Max.   :2.0000   Max.   :15.000  
##  jm_sar_pel_kes   jm_bl_pengobat       jm_tk           jm_pasar     
##  Min.   : 2.000   Min.   :0.0000   Min.   : 1.000   Min.   : 1.000  
##  1st Qu.: 4.000   1st Qu.:0.0000   1st Qu.: 2.000   1st Qu.: 1.000  
##  Median : 5.500   Median :1.0000   Median : 3.500   Median : 2.000  
##  Mean   : 6.182   Mean   :0.7727   Mean   : 4.591   Mean   : 3.227  
##  3rd Qu.: 8.000   3rd Qu.:1.0000   3rd Qu.: 6.750   3rd Qu.: 4.000  
##  Max.   :14.000   Max.   :3.0000   Max.   :15.000   Max.   :14.000  
##   jm_kantorpos       jm_toko       jm_koperasi      jm_masjid     
##  Min.   :0.0000   Min.   :  0.0   Min.   :1.000   Min.   : 25.00  
##  1st Qu.:1.0000   1st Qu.:  0.0   1st Qu.:1.000   1st Qu.: 48.00  
##  Median :1.0000   Median :  0.0   Median :1.000   Median : 61.00  
##  Mean   :0.8182   Mean   :163.8   Mean   :1.773   Mean   : 62.50  
##  3rd Qu.:1.0000   3rd Qu.:159.8   3rd Qu.:1.750   3rd Qu.: 77.25  
##  Max.   :1.0000   Max.   :998.0   Max.   :9.000   Max.   :119.00  
##    jm_gereja       jm_pt_asuhan    jm_sar_olga    jm_unit_usaha  
##  Min.   :0.0000   Min.   :0.000   Min.   :20.00   Min.   :  0.0  
##  1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:32.25   1st Qu.: 75.5  
##  Median :0.0000   Median :1.000   Median :42.50   Median :285.0  
##  Mean   :0.9545   Mean   :1.682   Mean   :44.27   Mean   :290.5  
##  3rd Qu.:1.0000   3rd Qu.:3.000   3rd Qu.:50.50   3rd Qu.:475.0  
##  Max.   :9.0000   Max.   :9.000   Max.   :74.00   Max.   :718.0  
##  jm_perusaha_dgng
##  Min.   :  8.00  
##  1st Qu.: 13.00  
##  Median : 16.50  
##  Mean   : 20.41  
##  3rd Qu.: 18.75  
##  Max.   :112.00

Bisa terlihat untuk kolom-kolom numerik jumlah fasilitas memiliki range persebaran yang berbeda-beda. Maka dari itu, normalisasi data diperlukan untuk menyamakan range kolom-kolom tersebut. Pertama pilih terlebih dahulu seluruh data numerik, yaitu seluruh data kecuali nama kecamatan.

numerical_data <- data[,-1] 
head(numerical_data)
##   jm_pg_list_per_desa jm_rs jm_puskes jm_sar_pel_kes jm_bl_pengobat jm_tk
## 1                  13     0         6              9              0     9
## 2                  17     0        15             14              1     8
## 3                  13     0         5              6              1     5
## 4                  11     0         6              8              0     7
## 5                   9     0         7              4              0     2
## 6                   7     0         3              2              0     1
##   jm_pasar jm_kantorpos jm_toko jm_koperasi jm_masjid jm_gereja jm_pt_asuhan
## 1        2            1     110           1        82         0            4
## 2        6            1       0           1       119         0            4
## 3        3            1      38           1        89         0            4
## 4        8            1       0           1        80         0            3
## 5        1            0       0           1        67         0            2
## 6        1            0       0           1        42         9            0
##   jm_sar_olga jm_unit_usaha jm_perusaha_dgng
## 1          44            58               13
## 2          44           541               18
## 3          36           653               13
## 4          40           493               12
## 5          27           398               19
## 6          20            27               16

Lalu, normalisasi data menggunakan fungsi scale()

data_normalized <- as.data.frame(scale(numerical_data)) # menggunakan as.data.frame() agar output tetap dalam bentuk dataframe, bukan matriks head(data_normalized)
head(data_normalized)
##   jm_pg_list_per_desa      jm_rs   jm_puskes jm_sar_pel_kes jm_bl_pengobat
## 1           0.4517783 -0.2916479 -0.30379755     0.91948602     -0.8890670
## 2           1.6565206 -0.2916479  3.23455041     2.55083219      0.2614903
## 3           0.4517783 -0.2916479 -0.69694733    -0.05932168      0.2614903
## 4          -0.1505928 -0.2916479 -0.30379755     0.59321679     -0.8890670
## 5          -0.7529639 -0.2916479  0.08935222    -0.71186015     -0.8890670
## 6          -1.3553350 -0.2916479 -1.48324687    -1.36439861     -0.8890670
##        jm_tk    jm_pasar jm_kantorpos    jm_toko jm_koperasi  jm_masjid
## 1  1.3171370 -0.39982297    0.4605662 -0.1901853   -0.423653  0.8707613
## 2  1.0184049  0.90330374    0.4605662 -0.5792372   -0.423653  2.5229752
## 3  0.1222086 -0.07404129    0.4605662 -0.4448374   -0.423653  1.1833423
## 4  0.7196728  1.55486709    0.4605662 -0.5792372   -0.423653  0.7814525
## 5 -0.7739877 -0.72560464   -2.0725478 -0.5792372   -0.423653  0.2009449
## 6 -1.0727198 -0.72560464   -2.0725478 -0.5792372   -0.423653 -0.9154158
##    jm_gereja jm_pt_asuhan jm_sar_olga jm_unit_usaha jm_perusaha_dgng
## 1 -0.4637909    1.0378462  -0.0169881    -1.0565958      -0.35250343
## 2 -0.4637909    1.0378462  -0.0169881     1.1379678      -0.11461768
## 3 -0.4637909    1.0378462  -0.5153056     1.6468521      -0.35250343
## 4 -0.4637909    0.5901479  -0.2661469     0.9198745      -0.40008058
## 5 -0.4637909    0.1424495  -1.0759128     0.4882315      -0.06704053
## 6  3.9090944   -0.7529473  -1.5119406    -1.1974477      -0.20977198

PCA

Ini adalah proses besar yang harus dijalani dalam melakukan PCA.

# library yang dibutuhkan untuk melakukan analisis ini, install melalui console
library(factoextra) # untuk melakukan visualisasi
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha

1. Menampilkan matriks korelasi dan kovarian, serta menguji kecukupan sampel melalui KMO atau undefined

# Calculate Correlation Matrix
cor_matrix <- cor(data_normalized)
cor_matrix
##                     jm_pg_list_per_desa       jm_rs   jm_puskes jm_sar_pel_kes
## jm_pg_list_per_desa          1.00000000  0.10736017  0.62306759      0.5334526
## jm_rs                        0.10736017  1.00000000  0.14742169      0.5135389
## jm_puskes                    0.62306759  0.14742169  1.00000000      0.7568643
## jm_sar_pel_kes               0.53345259  0.51353892  0.75686431      1.0000000
## jm_bl_pengobat               0.09075819  0.43143127  0.25554350      0.4273937
## jm_tk                        0.45201122  0.61540390  0.35208517      0.7594839
## jm_pasar                     0.26399151  0.74050240  0.31188553      0.7293233
## jm_kantorpos                 0.47229456  0.14071951  0.43112260      0.5008953
## jm_toko                      0.21261758  0.54200154  0.13652542      0.3936604
## jm_koperasi                 -0.11401629 -0.01776644 -0.05272038     -0.2307621
## jm_masjid                    0.56198731 -0.02501314  0.56304210      0.6549277
## jm_gereja                   -0.28919350  0.05623205 -0.23857089     -0.1571539
## jm_pt_asuhan                 0.27289106  0.63627114  0.41412469      0.7948496
## jm_sar_olga                  0.54942211  0.45157121  0.45172461      0.5641230
## jm_unit_usaha                0.49277942  0.03626241  0.33095623      0.3376306
## jm_perusaha_dgng             0.03923567  0.87593592  0.13899151      0.5147440
##                     jm_bl_pengobat      jm_tk    jm_pasar jm_kantorpos
## jm_pg_list_per_desa     0.09075819  0.4520112  0.26399151  0.472294564
## jm_rs                   0.43143127  0.6154039  0.74050240  0.140719509
## jm_puskes               0.25554350  0.3520852  0.31188553  0.431122600
## jm_sar_pel_kes          0.42739375  0.7594839  0.72932326  0.500895256
## jm_bl_pengobat          1.00000000  0.5066351  0.57360426  0.428972993
## jm_tk                   0.50663515  1.0000000  0.85293191  0.445516275
## jm_pasar                0.57360426  0.8529319  1.00000000  0.350102724
## jm_kantorpos            0.42897299  0.4455163  0.35010272  1.000000000
## jm_toko                 0.76248887  0.6370066  0.66056800  0.279480723
## jm_koperasi            -0.09421053 -0.1329399 -0.13492554  0.006012109
## jm_masjid              -0.00366982  0.4665723  0.33424830  0.409367696
## jm_gereja               0.18029270 -0.1134156  0.02432588 -0.303698880
## jm_pt_asuhan            0.37796494  0.8160571  0.76809035  0.255288720
## jm_sar_olga             0.56775837  0.4957281  0.54079099  0.443989071
## jm_unit_usaha           0.28421853  0.4458421  0.45522361  0.185347502
## jm_perusaha_dgng        0.64396797  0.7178706  0.80373991  0.147126292
##                        jm_toko  jm_koperasi   jm_masjid   jm_gereja
## jm_pg_list_per_desa 0.21261758 -0.114016292  0.56198731 -0.28919350
## jm_rs               0.54200154 -0.017766440 -0.02501314  0.05623205
## jm_puskes           0.13652542 -0.052720382  0.56304210 -0.23857089
## jm_sar_pel_kes      0.39366041 -0.230762089  0.65492769 -0.15715391
## jm_bl_pengobat      0.76248887 -0.094210529 -0.00366982  0.18029270
## jm_tk               0.63700656 -0.132939871  0.46657229 -0.11341558
## jm_pasar            0.66056800 -0.134925538  0.33424830  0.02432588
## jm_kantorpos        0.27948072  0.006012109  0.40936770 -0.30369888
## jm_toko             1.00000000  0.030274212  0.02364894  0.23958437
## jm_koperasi         0.03027421  1.000000000 -0.36081945 -0.11704792
## jm_masjid           0.02364894 -0.360819453  1.00000000 -0.20611695
## jm_gereja           0.23958437 -0.117047918 -0.20611695  1.00000000
## jm_pt_asuhan        0.45643726 -0.217295588  0.52121257 -0.07580450
## jm_sar_olga         0.76422209  0.124184537  0.16384421  0.02345216
## jm_unit_usaha       0.39284854 -0.158630168  0.54411851 -0.12661867
## jm_perusaha_dgng    0.74720258 -0.045901940  0.02412860  0.15676258
##                     jm_pt_asuhan jm_sar_olga jm_unit_usaha jm_perusaha_dgng
## jm_pg_list_per_desa    0.2728911  0.54942211    0.49277942       0.03923567
## jm_rs                  0.6362711  0.45157121    0.03626241       0.87593592
## jm_puskes              0.4141247  0.45172461    0.33095623       0.13899151
## jm_sar_pel_kes         0.7948496  0.56412302    0.33763055       0.51474405
## jm_bl_pengobat         0.3779649  0.56775837    0.28421853       0.64396797
## jm_tk                  0.8160571  0.49572815    0.44584214       0.71787058
## jm_pasar               0.7680904  0.54079099    0.45522361       0.80373991
## jm_kantorpos           0.2552887  0.44398907    0.18534750       0.14712629
## jm_toko                0.4564373  0.76422209    0.39284854       0.74720258
## jm_koperasi           -0.2172956  0.12418454   -0.15863017      -0.04590194
## jm_masjid              0.5212126  0.16384421    0.54411851       0.02412860
## jm_gereja             -0.0758045  0.02345216   -0.12661867       0.15676258
## jm_pt_asuhan           1.0000000  0.38631332    0.38134023       0.69769723
## jm_sar_olga            0.3863133  1.00000000    0.38920280       0.46126427
## jm_unit_usaha          0.3813402  0.38920280    1.00000000       0.12975561
## jm_perusaha_dgng       0.6976972  0.46126427    0.12975561       1.00000000

Untuk mempermudah membaca matriks, gunakan script di bawah ini untuk menampilkan cor_matrix dalam bentuk table interakti menggunakan fungsi kable()

# ini libray yang dibutuhkan untuk melihat table dengan fungsi kable(). Lakukan instalasi pada console
library(knitr)
library(kableExtra)

# Gunakan kable() dan kable_styling() dari kableExtra untuk memformat tabel
kable(cor_matrix, "html") %>% # yang diganti cor_matrix
  kable_styling(full_width = F, position = "center", bootstrap_options = c("striped", "hover"))

Visualisasi matriks korelasi.

# install.packages("ggcorrplot") lakukan instalasi melalui console
library(ggcorrplot)

# melakukan visualisasi dengan corrplot
ggcorrplot(cor_matrix)

Setelah itu menghitung matriks kovarian.

cov_matrix <- cov(data_normalized)
cov_matrix
##                     jm_pg_list_per_desa       jm_rs   jm_puskes jm_sar_pel_kes
## jm_pg_list_per_desa          1.00000000  0.10736017  0.62306759      0.5334526
## jm_rs                        0.10736017  1.00000000  0.14742169      0.5135389
## jm_puskes                    0.62306759  0.14742169  1.00000000      0.7568643
## jm_sar_pel_kes               0.53345259  0.51353892  0.75686431      1.0000000
## jm_bl_pengobat               0.09075819  0.43143127  0.25554350      0.4273937
## jm_tk                        0.45201122  0.61540390  0.35208517      0.7594839
## jm_pasar                     0.26399151  0.74050240  0.31188553      0.7293233
## jm_kantorpos                 0.47229456  0.14071951  0.43112260      0.5008953
## jm_toko                      0.21261758  0.54200154  0.13652542      0.3936604
## jm_koperasi                 -0.11401629 -0.01776644 -0.05272038     -0.2307621
## jm_masjid                    0.56198731 -0.02501314  0.56304210      0.6549277
## jm_gereja                   -0.28919350  0.05623205 -0.23857089     -0.1571539
## jm_pt_asuhan                 0.27289106  0.63627114  0.41412469      0.7948496
## jm_sar_olga                  0.54942211  0.45157121  0.45172461      0.5641230
## jm_unit_usaha                0.49277942  0.03626241  0.33095623      0.3376306
## jm_perusaha_dgng             0.03923567  0.87593592  0.13899151      0.5147440
##                     jm_bl_pengobat      jm_tk    jm_pasar jm_kantorpos
## jm_pg_list_per_desa     0.09075819  0.4520112  0.26399151  0.472294564
## jm_rs                   0.43143127  0.6154039  0.74050240  0.140719509
## jm_puskes               0.25554350  0.3520852  0.31188553  0.431122600
## jm_sar_pel_kes          0.42739375  0.7594839  0.72932326  0.500895256
## jm_bl_pengobat          1.00000000  0.5066351  0.57360426  0.428972993
## jm_tk                   0.50663515  1.0000000  0.85293191  0.445516275
## jm_pasar                0.57360426  0.8529319  1.00000000  0.350102724
## jm_kantorpos            0.42897299  0.4455163  0.35010272  1.000000000
## jm_toko                 0.76248887  0.6370066  0.66056800  0.279480723
## jm_koperasi            -0.09421053 -0.1329399 -0.13492554  0.006012109
## jm_masjid              -0.00366982  0.4665723  0.33424830  0.409367696
## jm_gereja               0.18029270 -0.1134156  0.02432588 -0.303698880
## jm_pt_asuhan            0.37796494  0.8160571  0.76809035  0.255288720
## jm_sar_olga             0.56775837  0.4957281  0.54079099  0.443989071
## jm_unit_usaha           0.28421853  0.4458421  0.45522361  0.185347502
## jm_perusaha_dgng        0.64396797  0.7178706  0.80373991  0.147126292
##                        jm_toko  jm_koperasi   jm_masjid   jm_gereja
## jm_pg_list_per_desa 0.21261758 -0.114016292  0.56198731 -0.28919350
## jm_rs               0.54200154 -0.017766440 -0.02501314  0.05623205
## jm_puskes           0.13652542 -0.052720382  0.56304210 -0.23857089
## jm_sar_pel_kes      0.39366041 -0.230762089  0.65492769 -0.15715391
## jm_bl_pengobat      0.76248887 -0.094210529 -0.00366982  0.18029270
## jm_tk               0.63700656 -0.132939871  0.46657229 -0.11341558
## jm_pasar            0.66056800 -0.134925538  0.33424830  0.02432588
## jm_kantorpos        0.27948072  0.006012109  0.40936770 -0.30369888
## jm_toko             1.00000000  0.030274212  0.02364894  0.23958437
## jm_koperasi         0.03027421  1.000000000 -0.36081945 -0.11704792
## jm_masjid           0.02364894 -0.360819453  1.00000000 -0.20611695
## jm_gereja           0.23958437 -0.117047918 -0.20611695  1.00000000
## jm_pt_asuhan        0.45643726 -0.217295588  0.52121257 -0.07580450
## jm_sar_olga         0.76422209  0.124184537  0.16384421  0.02345216
## jm_unit_usaha       0.39284854 -0.158630168  0.54411851 -0.12661867
## jm_perusaha_dgng    0.74720258 -0.045901940  0.02412860  0.15676258
##                     jm_pt_asuhan jm_sar_olga jm_unit_usaha jm_perusaha_dgng
## jm_pg_list_per_desa    0.2728911  0.54942211    0.49277942       0.03923567
## jm_rs                  0.6362711  0.45157121    0.03626241       0.87593592
## jm_puskes              0.4141247  0.45172461    0.33095623       0.13899151
## jm_sar_pel_kes         0.7948496  0.56412302    0.33763055       0.51474405
## jm_bl_pengobat         0.3779649  0.56775837    0.28421853       0.64396797
## jm_tk                  0.8160571  0.49572815    0.44584214       0.71787058
## jm_pasar               0.7680904  0.54079099    0.45522361       0.80373991
## jm_kantorpos           0.2552887  0.44398907    0.18534750       0.14712629
## jm_toko                0.4564373  0.76422209    0.39284854       0.74720258
## jm_koperasi           -0.2172956  0.12418454   -0.15863017      -0.04590194
## jm_masjid              0.5212126  0.16384421    0.54411851       0.02412860
## jm_gereja             -0.0758045  0.02345216   -0.12661867       0.15676258
## jm_pt_asuhan           1.0000000  0.38631332    0.38134023       0.69769723
## jm_sar_olga            0.3863133  1.00000000    0.38920280       0.46126427
## jm_unit_usaha          0.3813402  0.38920280    1.00000000       0.12975561
## jm_perusaha_dgng       0.6976972  0.46126427    0.12975561       1.00000000

Untuk mempermudah membaca matriks, gunakan script di bawah ini untuk menampilkan cov_matrix dalam bentuk table interakti menggunakan fungsi kable()

# Gunakan kable() dan kable_styling() dari kableExtra untuk memformat tabel
kable(cov_matrix, "html") %>% 
  kable_styling(full_width = F, position = "center", bootstrap_options = c("striped", "hover"))

Lalu, berikut adalah cara untuk menampilkan visualisasi matriks kovarian yang berbeda dengan library ggcorrplot yang digunakan khusus untuk plot korelasi (cukup ikuti saja)

# library yang dibutuhkan, lakukan instalasi dengan concole
library(ggplot2)
library(reshape2)

# Convert the covariance matrix into a long format for ggplot2
cov_matrix_long <- melt(cov_matrix)

# Create the heatmap
ggplot(cov_matrix_long, aes(Var1, Var2, fill = value)) +
  geom_tile() +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(min(cov_matrix_long$value), max(cov_matrix_long$value)), name="Covariance") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1), axis.title = element_blank()) +
  labs(fill = "Covariance")

Coba visualisasikan kovarians data yang tidak dinormalisasi. Apa perbedaannya?

Lalu, melakukan uji KMO. Uji Kaiser-Meyer-Olkin (KMO) adalah ukuran yang digunakan untuk mengevaluasi kesesuaian data untuk analisis faktor. Uji KMO mengukur sejauh mana variabel di dalam set data berkorelasi dan oleh karena itu, apakah akan memberikan hasil yang reliable jika digunakan untuk analisis faktor atau PCA.

kmo_result <- KMO(data_normalized)
kmo_result
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data_normalized)
## Overall MSA =  0.52
## MSA for each item = 
## jm_pg_list_per_desa               jm_rs           jm_puskes      jm_sar_pel_kes 
##                0.54                0.61                0.47                0.54 
##      jm_bl_pengobat               jm_tk            jm_pasar        jm_kantorpos 
##                0.48                0.69                0.60                0.38 
##             jm_toko         jm_koperasi           jm_masjid           jm_gereja 
##                0.61                0.26                0.41                0.26 
##        jm_pt_asuhan         jm_sar_olga       jm_unit_usaha    jm_perusaha_dgng 
##                0.67                0.58                0.29                0.50

Hasil nilai KMO melebihi angka 0.5, maka data ini dapat dianalisis lebih lanjut melalui PCA (maupun CFA).

2. Melakukan PCA pertama untuk mengetahui berapa komponen optimum yang terbentuk.

pca_result <- prcomp(data_normalized, scale = TRUE)
# *-1 untuk seluruh factor loading karena pada R negative menjadi default dalam hasil factor loading
pca_result$rotation <- -1*pca_result$rotation # pastikan command ini dirun berbarengan dengan prcomp
summary(pca_result)
## Importance of components:
##                           PC1    PC2     PC3     PC4     PC5     PC6    PC7
## Standard deviation     2.6484 1.6506 1.21572 1.09145 0.92806 0.87203 0.7430
## Proportion of Variance 0.4384 0.1703 0.09237 0.07445 0.05383 0.04753 0.0345
## Cumulative Proportion  0.4384 0.6087 0.70104 0.77549 0.82932 0.87685 0.9113
##                            PC8     PC9    PC10    PC11    PC12    PC13   PC14
## Standard deviation     0.69032 0.50184 0.47988 0.40952 0.36546 0.29309 0.2228
## Proportion of Variance 0.02978 0.01574 0.01439 0.01048 0.00835 0.00537 0.0031
## Cumulative Proportion  0.94113 0.95687 0.97127 0.98175 0.99010 0.99547 0.9986
##                           PC15    PC16
## Standard deviation     0.12119 0.09059
## Proportion of Variance 0.00092 0.00051
## Cumulative Proportion  0.99949 1.00000

Perhatikan juga bahwa vektor eigen dalam R menunjuk ke arah negatif secara default, jadi kita akan mengalikannya dengan -1 untuk membalikkan tandanya.

Fungsi prcomp ini menghasilkan nilai loading factor setiap component. Hasil di atas belum menampilkan informasi yang paling lengkap. Ikuti script di bawah ini untuk menampilkan informasi lain, terutama eigenvalue.

# Mendapatkan summary dari hasil PCA
pca_summary <- summary(pca_result)

# Eigenvalues dari hasil PCA
eigenvalues <- pca_result$sdev^2

# Proportion of variance
prop_variance <- pca_summary$importance[2,]

# Cumulative proportion
cumulative_prop <- pca_summary$importance[3,]

# Membuat data frame yang berisi informasi yang diinginkan
pca_data <- data.frame(
  Eigenvalue = eigenvalues,
  SD = pca_result$sdev,
  Proportion_of_Variance = prop_variance,
  Cumulative_Proportion = cumulative_prop
)

# Menampilkan data frame
pca_data
##       Eigenvalue         SD Proportion_of_Variance Cumulative_Proportion
## PC1  7.014242435 2.64844151                0.43839               0.43839
## PC2  2.724346436 1.65055943                0.17027               0.60866
## PC3  1.477977806 1.21572111                0.09237               0.70104
## PC4  1.191258929 1.09144809                0.07445               0.77549
## PC5  0.861298693 0.92806179                0.05383               0.82932
## PC6  0.760441278 0.87203284                0.04753               0.87685
## PC7  0.552052599 0.74300242                0.03450               0.91135
## PC8  0.476536304 0.69031609                0.02978               0.94113
## PC9  0.251839402 0.50183603                0.01574               0.95687
## PC10 0.230281994 0.47987706                0.01439               0.97127
## PC11 0.167708521 0.40952231                0.01048               0.98175
## PC12 0.133559364 0.36545775                0.00835               0.99010
## PC13 0.085901485 0.29308955                0.00537               0.99547
## PC14 0.049661151 0.22284782                0.00310               0.99857
## PC15 0.014686518 0.12118795                0.00092               0.99949
## PC16 0.008207085 0.09059296                0.00051               1.00000
  1. Eigenvalues (Nilai Eigen): Nilai eigen dalam konteks PCA adalah ukuran varians yang dijelaskan oleh masing-masing komponen utama dalam data. Dalam analisis multivariat, nilai eigen menunjukkan berapa banyak varians dari variabel asli yang dapat dijelaskan oleh sebuah komponen utama. Sebagai contoh, nilai eigen yang besar menunjukkan bahwa komponen utama tersebut menjelaskan sebagian besar varians, dan biasanya komponen tersebut dianggap penting dalam menganalisis data.

  2. Standard Deviation (Deviasi Standar): Deviasi standar dari komponen utama adalah akar kuadrat dari nilai eigen yang bersangkutan. Ini mengukur seberapa jauh nilai-nilai individu dalam komponen tersebut menyimpang dari rata-rata komponen. Dalam konteks PCA, deviasi standar ini memberikan informasi tentang penyebaran data di sepanjang sumbu komponen tersebut.

  3. Proportion of Variance (Proporsi Varians): Proporsi varians menunjukkan persentase total varians dalam semua variabel yang dijelaskan oleh setiap komponen utama. Angka ini dihitung dengan membagi nilai eigen setiap komponen dengan jumlah total nilai eigen dari semua komponen. Proporsi varians membantu dalam menentukan pentingnya setiap komponen utama dalam menjelaskan struktur data.

  4. Cumulative Proportion (Proporsi Kumulatif): Proporsi kumulatif adalah penjumlahan berurutan dari proporsi varians yang dijelaskan oleh komponen utama. Ini memberikan informasi tentang berapa banyak varians yang dijelaskan oleh semua komponen utama hingga titik tertentu dalam urutan. Sebagai contoh, jika dua komponen pertama memiliki proporsi varians 0.5 dan 0.3, proporsi kumulatif setelah dua komponen tersebut akan menjadi 0.8, yang menunjukkan bahwa kedua komponen tersebut bersama-sama menjelaskan 80% dari total varians.

Masing-masing ukuran ini memberikan insight yang berbeda-beda ke dalam data yang sedang dianalisis dan membantu dalam pengambilan keputusan tentang berapa banyak komponen utama yang harus dipertahankan dalam analisis lebih lanjut. Nilai eigen dan proporsi varians sering digunakan untuk menentukan komponen mana yang paling signifikan, sementara proporsi kumulatif digunakan untuk menentukan jumlah komponen yang dibutuhkan untuk menjelaskan sebagian besar varians dalam data.

Fokus pada nilai cumulative proportion, proportion % of variance dan eigenvalue untuk mengatahui berapa component yang signifikan menjelaskan variansi data. Dari cumulative proportion, kita bisa mengetahui bahwa 80an% variansi pada data sudah bisa direpresentasikan dengan 5 komponen. Untuk melihatnya lebih jelas, mari kita gunakan screeplot.

fviz_eig(pca_result, addlabels = TRUE)

Dari screeplot tersebut, kita bisa melihat proporsi varians setiap komponennya. Namun, untuk menentukan berapa komponen optimum yang bisa dihasilkan dari PCA ini kita akan menggunakan kriteria Kaiser untuk menentukannya. Kriteria Kaiser ini menggunakan eigenvalue sebagai patokannya. Jumlah komponen dipilih dengan melihat jumlah eigenvalue yang lebih dari 1.

Untuk memudahkannya, mari visualisasikan dalam screepolt dengan tambahan garis pada nilai 1 (y-axis). Ini merupakan kriteria Kasier yang disebut sebelumnya.

plot(eigenvalues, type = "b", main = "Scree Plot", xlab = "Principal Component", ylab = "Eigenvalue",
     pch = 19, col = "blue")
abline(h = 1, col = "red", lty = 2)

Berdasarkan screeplit di atas, jumlah komponen yang cukup untuk merepresentasikan varians pada data adalah 4 komponen (berada di atas garis y=1). Dengan menggunakan 4 komponen ini, maka terdapat 77,55% variansi yang direpresentasikan oleh hasil PCA.

Maka dari itu kita akan berfokus pada 4 komponen tersebut.

# Memilih komponen
selected_components <- which(eigenvalues > 1)

# Mengekstrak loadings untuk komponen terpilih
selected_loadings <- pca_result$rotation[, selected_components]

# Menampilkan factor loadings pada componen terpilih.
selected_loadings
##                             PC1         PC2         PC3         PC4
## jm_pg_list_per_desa  0.20312532 -0.36699641 -0.20536346  0.09420081
## jm_rs                0.25560086  0.29643129  0.11494024 -0.32372883
## jm_puskes            0.21612446 -0.32753848 -0.11845268 -0.06855122
## jm_sar_pel_kes       0.32902132 -0.16259193  0.12115349 -0.13948803
## jm_bl_pengobat       0.24908516  0.22910618 -0.21194900  0.24613590
## jm_tk                0.33834919  0.02123576  0.11857712 -0.10221432
## jm_pasar             0.33458644  0.13535679  0.13593532 -0.05821116
## jm_kantorpos         0.20080935 -0.20620537 -0.31823132 -0.10146031
## jm_toko              0.27635613  0.27793478 -0.23469958  0.26714812
## jm_koperasi         -0.06034412  0.10889471 -0.54544330 -0.38576702
## jm_masjid            0.19142023 -0.41881621  0.26529325  0.11947838
## jm_gereja           -0.02622046  0.31984169  0.12701755  0.53203177
## jm_pt_asuhan         0.31074298  0.01165945  0.32333266 -0.17257872
## jm_sar_olga          0.27474644  0.03833675 -0.42518627  0.15283398
## jm_unit_usaha        0.19805276 -0.20146441 -0.01006407  0.43001742
## jm_perusaha_dgng     0.28466187  0.34775960  0.11241875 -0.14792725

Untuk mempermudah interpretasi, selanjutnya kita akan melakukan visualisasi PCA dengan Cos2 dan Biplot.

3. Visualisasi Cos2 dan Biplot

Barplot Cos2:Nilai Cos2 mengukur kualitas representasi variabel pada dua dimensi pertama dari PCA (Dim1-2).

fviz_cos2(pca_result, choice = "var", axes = 1:2)

Berdasarkan grafik Cos2, kita dapat memberikan interpretasi mengenai seberapa baik setiap variabel diwakili oleh dua komponen utama pertama dari PCA:

Variabel dengan Representasi Tinggi pada Dim1(PC1) dan Dim2(PC2) (berdasarkan nilai Cos2):

jm_perusaha_dgng memiliki nilai Cos2 yang paling tinggi, yang menunjukkan bahwa variabel ini sangat relevan dalam menjelaskan variabilitas dalam data yang ditangkap oleh dua komponen utama pertama. Ini berarti bahwa jumlah perusahaan dagang memiliki korelasi yang kuat dengan faktor-faktor yang diwakili oleh komponen utama ini.

Variabel lain seperti jm_pasar, jm_sar_pel_kes, jm_tk, jm_toko, dan jm_masjid juga memiliki nilai Cos2 yang tinggi, yang menunjukkan bahwa mereka juga diwakili dengan baik oleh komponen utama pertama dan kedua. Mereka memiliki kontribusi yang signifikan dalam menjelaskan variabilitas pada Dim1 dan Dim2.

Variabel dengan Representasi Moderat pada Dim1 dan Dim2:

Variabel seperti jm_rs, jm_asuhan, jm_puskes, dan jm_pg_list_per_desa memiliki nilai Cos2 yang moderat. Ini menunjukkan bahwa meskipun mereka diwakili cukup baik oleh Dim1 dan Dim2, kontribusi mereka tidak sekuat variabel dengan nilai Cos2 yang lebih tinggi.

Variabel dengan Representasi Rendah pada Dim1 dan Dim2:

jm_koperasi memiliki nilai Cos2 yang terendah, yang menunjukkan bahwa variabel ini memiliki korelasi yang lebih lemah dengan Dim1 dan Dim2 dibandingkan dengan variabel lain dalam analisis. Representasinya pada komponen utama ini terbatas, yang berarti tidak banyak informasi tentang jumlah koperasi yang dijelaskan oleh dua dimensi pertama PCA.

Bagaimana dengan Cos2 pada komponen lain?

# untuk seluruh komponen
fviz_cos2(pca_result, choice = "var", axes = 1:4)

Bisa berikan interpretasi?

Biplot

Biplot ini untuk menampilkan korelasi antara variabel dan komponen.

# Visualisasi biplot dengan fviz_pca_biplot (Dim1 vs Dim2)
fviz_pca_biplot(pca_result, col.var = "contrib", col.ind = "cos2",
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                repel = TRUE, # Menghindari overlapping text
                cex = 0.7)  # Mengatur ukuran teks
## Warning: Duplicated aesthetics after name standardisation: size

Dalam konteks biplot, hubungan antara variabel dan Dim1 dan Dim2 dapat diinterpretasikan sebagai berikut:

  • Variabel yang vektor loadingsnya mengarah jauh dari pusat dan ke kanan berhubungan positif dengan Dim1. Jika vektor mengarah ke atas, mereka memiliki hubungan positif dengan Dim2.
  • Variabel dengan vektor yang mengarah ke arah yang berlawanan dari vektor lain menunjukkan korelasi negatif dengan variabel tersebut pada komponen yang bersangkutan.
  • Panjang vektor menunjukkan seberapa kuat hubungan atau kontribusi variabel terhadap komponen (yang terkait dengan nilai Cos^2). Variabel dengan vektor yang lebih panjang pada biplot menunjukkan kontribusi yang lebih besar dan diwakili dengan lebih baik oleh komponen utama.

Apakah kalian bisa mencoba menginterpretasikannya? Berikut adalah beberapa interpretasi yang bisa diambil:

  • Variabel yang vektor loadingnya mengarah jauh dari pusat biplot (seperti jm_perusaha_dgng, jm_toko, dan jm_pasar) memiliki korelasi yang kuat dengan komponen tersebut (Dim & Dim2). Ini menunjukkan bahwa variabel-variabel tersebut penting dalam membentuk komponen tersebut dan menjelaskan sejumlah besar variabilitas dalam data.
  • jm_gereja memiliki orientasi yang lebih mendekati sumbu vertikal (PC2), menunjukkan bahwa variabel ini lebih berkaitan dengan PC2 daripada PC1.
  • Variabel dengan vektor yang lebih pendek (misalnya, jm_koperasi) memiliki korelasi yang lebih lemah dengan kedua komponen, menunjukkan bahwa mereka kurang penting dalam menjelaskan variabilitas yang ditangkap oleh PC1 dan PC2.
  • Variabel apa yang paling berkorelasi dengan PC1 pada bipilot ini?

Biplot di atas hanya bisa menampilkan perbandingan antara komponen 1 (Dim1) dan komponen 2 (Dim2). Mari membuat seluruh perbandingannya untuk 4 komponen terpilih.

# Dim1 vs Dim3
fviz_pca_biplot(pca_result, col.var = "contrib", col.ind = "cos2",
                axes = c(1, 3),
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                repel = TRUE,
                cex = 0.7)
## Warning: Duplicated aesthetics after name standardisation: size

# Dim1 vs Dim4
fviz_pca_biplot(pca_result, col.var = "contrib", col.ind = "cos2",
                axes = c(1, 4),
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                repel = TRUE,
                cex = 0.7)
## Warning: Duplicated aesthetics after name standardisation: size

# Dim2 vs Dim3
fviz_pca_biplot(pca_result, col.var = "contrib", col.ind = "cos2",
                axes = c(2, 3),
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                repel = TRUE,
                cex = 0.7)
## Warning: Duplicated aesthetics after name standardisation: size

# Dim2 vs Dim4
fviz_pca_biplot(pca_result, col.var = "contrib", col.ind = "cos2",
                axes = c(2, 4),
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                repel = TRUE,
                cex = 0.7)
## Warning: Duplicated aesthetics after name standardisation: size

# Dim3 vs Dim4
fviz_pca_biplot(pca_result, col.var = "contrib", col.ind = "cos2",
                axes = c(3, 4),
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                repel = TRUE,
                cex = 0.7)
## Warning: Duplicated aesthetics after name standardisation: size

Meskipun sudah melakukan visualisasi, interpretasi setiap komponen masih dirasa sulit. Maka dari itu, rotasi hasil PCA dilakukan untuk mempermudah interpretasi.

4. Melakukan rotasi.

Setelah menentukan jumlah komponen yang akan dipertahankan menggunakan Kriteria Kaiser atau metode lainnya, melakukan rotasi faktor merupakan langkah selanjutnya yang umum dalam PCA dan analisis faktor. Rotasi dilakukan untuk memudahkan interpretasi hasil dengan mencoba menyederhanakan struktur faktor atau komponen. Berikut adalah beberapa alasan mengapa rotasi seperti varimax atau promax digunakan:

  • Memperjelas Struktur Faktor: Rotasi membantu dalam membuat struktur faktor lebih jelas dengan memaksimalkan varians yang dijelaskan oleh setiap faktor dan meminimalkan beban lintas faktor. Ini berarti setiap faktor akan memiliki sejumlah kecil variabel dengan beban yang tinggi dan sebanyak mungkin variabel dengan beban yang rendah atau nol. Hal ini memudahkan interpretasi karena setiap faktor cenderung dihubungkan dengan variabel tertentu yang paling relevan dengan faktor tersebut.

    Varimax Rotation: Varimax adalah metode rotasi ortogonal yang bertujuan untuk memaksimalkan varians kuadrat dari beban faktor. Dengan kata lain, varimax berusaha untuk membuat beban faktor setinggi mungkin pada satu faktor dan serendah mungkin pada faktor lain, yang membantu dalam menentukan variabel mana yang paling penting untuk setiap faktor. Ini adalah metode yang paling sering digunakan karena mempertahankan keortogonalan faktor, artinya faktor yang dihasilkan tetap tidak berkorelasi satu sama lain.

    Promax Rotation: Promax adalah metode rotasi oblik yang memungkinkan faktor untuk berkorelasi satu sama lain. Metode ini berguna ketika asumsi keortogonalan faktor tidak realistis atau ketika ada alasan teoretis untuk percaya bahwa faktor-faktor harus berkorelasi. Promax sering digunakan jika hasil rotasi varimax masih menyulitkan interpretasi atau jika peneliti memiliki alasan teoretis untuk mengharapkan bahwa faktor-faktor berkorelasi.

  • Mempermudah Interpretasi: Dengan membuat faktor lebih mudah diinterpretasikan, rotasi dapat membantu peneliti dalam memahami bagaimana variabel berkontribusi terhadap konstruksi faktor. Interpretasi yang lebih mudah ini penting untuk penggunaan praktis dari hasil analisis faktor, seperti dalam pengembangan kuesioner atau untuk penelitian lebih lanjut.

  • Meningkatkan Replikabilitas: Rotasi dapat membantu dalam memperoleh solusi faktor yang lebih stabil yang lebih mungkin direplikasi dalam studi lain dengan sampel yang berbeda atau dalam kondisi yang berbeda.

Dalam praktiknya, pemilihan antara rotasi varimax dan promax (atau metode rotasi lainnya) sering didasarkan pada pertimbangan teoretis dan analisis eksplorasi dari data. Selalu penting untuk mempertimbangkan konteks penelitian dan sifat dari data ketika memilih metode rotasi.

Rotasi Varimax
# Memuat paket yang diperlukan untuk rotasi, lakukan instalasi melalui console 
library(GPArotation)  
## 
## Attaching package: 'GPArotation'
## The following objects are masked from 'package:psych':
## 
##     equamax, varimin
# Melakukan rotasi Varimax 
rotated_varimax <- varimax(selected_loadings)  
# Mencetak hasil rotasi 
rotated_varimax
## $loadings
## 
## Loadings:
##                     PC1    PC2    PC3    PC4   
## jm_pg_list_per_desa        -0.439         0.148
## jm_rs                0.455               -0.235
## jm_puskes                  -0.406              
## jm_sar_pel_kes       0.313 -0.234         0.106
## jm_bl_pengobat                    -0.465       
## jm_tk                0.355                     
## jm_pasar             0.373        -0.104       
## jm_kantorpos               -0.412 -0.102 -0.118
## jm_toko                           -0.523       
## jm_koperasi         -0.100 -0.231        -0.626
## jm_masjid                  -0.240  0.174  0.446
## jm_gereja                   0.411 -0.374  0.293
## jm_pt_asuhan         0.449         0.126  0.118
## jm_sar_olga                -0.268 -0.447       
## jm_unit_usaha              -0.156 -0.249  0.414
## jm_perusaha_dgng     0.420  0.154 -0.139 -0.132
## 
##                  PC1   PC2   PC3   PC4
## SS loadings    1.000 1.000 1.000 1.000
## Proportion Var 0.062 0.062 0.062 0.062
## Cumulative Var 0.062 0.125 0.187 0.250
## 
## $rotmat
##            [,1]       [,2]       [,3]       [,4]
## [1,]  0.7566935 -0.4422376 -0.4394085  0.1968781
## [2,]  0.2766626  0.7316503 -0.4520260 -0.4287403
## [3,]  0.4376439  0.4804877  0.5188794  0.5553050
## [4,] -0.3991749  0.1955644 -0.5773707  0.6848774

Berdasarkan hasil rotasi Varimax , kita dapat melakukan interpretasi sebagai berikut:

  • PC1:
    • jm_rs (0.455), jm_sar_pel_kes (0.313), jm_tk (0.355), jm_pasar (0.373), jm_pt_asuhan (0.449), dan jm_perusaha_dgng (0.420) memiliki loadings yang signifikan pada PC1. Ini menunjukkan bahwa komponen ini mungkin berkaitan dengan aspek layanan dan ekonomi, seperti kesehatan, perdagangan, dan bisnis.
  • PC2:
    • jm_pg_list_per_desa (-0.439), jm_puskes (-0.406), jm_kantorpos (-0.412), jm_masjid (-0.240), jm_sar_olga (-0.268), dan jm_unit_usaha (-0.156) memiliki loadings negatif yang signifikan pada PC2. Loadings negatif ini menunjukkan bahwa ada hubungan yang berlawanan antara variabel-variabel ini dengan faktor yang diwakili oleh PC2.
    • jm_gereja (0.411) memiliki loading positif yang signifikan, menunjukkan bahwa variabel ini memiliki hubungan positif dengan faktor yang diwakili oleh PC2, yang mungkin berkaitan dengan keberadaan atau pengaruh fasilitas keagamaan dalam data.
  • PC3:
    • Variabel jm_masjid (0.174) dan jm_pt_asuhan (0.126) memiliki loading positif yang paling signifikan, menunjukkan bahwa variabel ini memiliki hubungan positif dengan faktor yang diwakili PC3. Faktor ini bisa diinterpretasikan dengan kegiatan sosial dan keagamaan.
  • PC4:
    • Variabel seperti jm_pg_list_per_desa (0.148), jm_sar_pel_kes (0.106), jm_pt_asuhan (0.126), dan jm_unit_usaha (0.414) menunjukkan kontribusi positif pada PC4. Ini menunjukkan bahwa mereka berkaitan dengan faktor-faktor yang diwakili oleh komponen ini. Apa maksud dari komponen ini?
Rotasi Promax
# Melakukan rotasi Promax 
rotated_promax <- promax(selected_loadings)  
# Mencetak hasil rotasi 
rotated_promax
## $loadings
## 
## Loadings:
##                     PC1    PC2    PC3    PC4   
## jm_pg_list_per_desa -0.120 -0.431              
## jm_rs                0.483               -0.166
## jm_puskes                  -0.415              
## jm_sar_pel_kes       0.283 -0.245         0.105
## jm_bl_pengobat                    -0.470       
## jm_tk                0.341 -0.103              
## jm_pasar             0.370        -0.129       
## jm_kantorpos               -0.428 -0.105 -0.204
## jm_toko                           -0.529       
## jm_koperasi                -0.283        -0.692
## jm_masjid                  -0.224  0.153  0.430
## jm_gereja                   0.476 -0.372  0.333
## jm_pt_asuhan         0.433                0.179
## jm_sar_olga                -0.252 -0.448 -0.182
## jm_unit_usaha       -0.130 -0.106 -0.258  0.361
## jm_perusaha_dgng     0.445  0.145 -0.159       
## 
##                  PC1   PC2   PC3   PC4
## SS loadings    1.007 1.073 1.011 1.072
## Proportion Var 0.063 0.067 0.063 0.067
## Cumulative Var 0.063 0.130 0.193 0.260
## 
## $rotmat
##            [,1]       [,2]       [,3]       [,4]
## [1,]  0.7088105 -0.4293356 -0.4993521  0.1705043
## [2,]  0.3790032  0.7402017 -0.4485877 -0.2981284
## [3,]  0.4076609  0.4944740  0.4863106  0.7394700
## [4,] -0.4415380  0.3099086 -0.5695113  0.6377707
  • PC1:
    • jm_rs (0.483), jm_tk (0.341), jm_pasar (0.370), jm_pt_asuhan (0.433), jm_perusaha_dgng (0.445) memiliki loadings positif yang signifikan pada PC1, menunjukkan bahwa komponen ini berkaitan dengan aspek kesehatan, perdagangan, dan layanan sosial.
  • PC2:
    • jm_pg_list_per_desa (-0.431), jm_puskes (-0.415), jm_kantorpos (-0.428), jm_sar_olga (-0.252) memiliki loadings negatif yang signifikan, menunjukkan bahwa PC2 berkorelasi negatif dengan keberadaan infrastruktur dan layanan umum.
    • jm_gereja (0.476) memiliki loading positif yang signifikan pada PC2, menunjukkan bahwa keberadaan gereja berkorelasi positif dengan faktor yang diwakili oleh PC2.
  • PC3:
    • jm_bl_pengobat (-0.470) memiliki loading negatif yang signifikan, menunjukkan bahwa PC3 berkorelasi negatif dengan jumlah balai pengobatan.
    • jm_masjid (0.430) dan jm_gereja (0.333) memiliki loading positif yang signifikan, menunjukkan bahwa PC3 berkaitan dengan keberadaan fasilitas keagamaan.
  • PC4:
    • jm_koperasi (-0.692) memiliki loading negatif yang sangat signifikan, yang menunjukkan bahwa jumlah koperasi berkorelasi negatif dengan faktor yang diwakili oleh PC4.
    • jm_unit_usaha (0.361) memiliki loading positif, yang bisa menunjukkan hubungan positif dengan aspek ekonomi.

Notes: Hasil interpretasi komponen atau faktor ini akan sangat bergantung dengan tujuan penelitian dan data yang digunakan.

Hasil ini nantinya akan digunakan untuk mengelompokkan kembali setiap kecamatan berdasarkan komponen-komponen hasil PCA.

5. Melakukan perhitungan scores.

Mehitung scores untuk setiap data yang kita gunakan pada setiap komponennya.

# hanya mengambil nama kecamatan
nama_kecamatan <- data[, 1]

# Menghitung skor PCA dengan predict pada objek pca_result
pca_scores <- predict(pca_result, data_normalized)

# Memilih hanya skor untuk empat komponen utama pertama berdasarkan kriteria Kaiser
selected_pca_scores <- pca_scores[, selected_components]

# Menggabungkan nama kecamatan dengan skor PCA terpilih
final_data_pca <- data.frame(nama_kecamatan, selected_pca_scores)
final_data_pca
##    nama_kecamatan        PC1        PC2         PC3         PC4
## 1    SAGALAHERANG  0.5970823 -1.1373524  0.92639726 -0.96138239
## 2      JALANCAGAK  3.4758934 -3.7295386  0.88965045 -0.07815425
## 3         CISALAK  0.5693243 -1.3325562  0.84047796  0.64415529
## 4    TANJUNGSIANG  0.8649522 -1.1115754  1.20900020 -0.24379799
## 5         CIJAMBE -1.8423048 -0.2154978  1.53435169  0.04624849
## 6          CIBOGO -3.7211857  2.7494040  1.88592654  1.79612616
## 7          SUBANG  8.3939777  4.3147457  0.92810669 -1.34538118
## 8        KALIJATI  0.8156683 -0.6999993 -0.18820198 -1.09581239
## 9      CIPEUNDEUY -1.8952091  0.9247330  0.45615093 -0.47706200
## 10       PABUARAN -0.2139969 -0.1096462 -0.25664041  0.69238856
## 11     PATOKBEUSI -0.2249631 -0.6231405  0.21403056 -0.82671865
## 12      PURWADADI  0.3042557  0.3579925 -0.26864831  1.12870296
## 13         CIKAUM -2.6481412  0.6012551  0.56587910  0.05708107
## 14        PAGADEN  1.8131876 -1.9521583  0.06401744  0.91402614
## 15     CIPUNAGARA -1.7339266 -0.7329888  0.67236922 -0.55592676
## 16       COMPRENG -2.2707055  0.8072842 -0.11919622 -0.72577661
## 17         BINONG  0.6879034 -1.0694551 -1.50357257  0.25420634
## 18         CIASEM  1.5796682  0.4128773 -1.07242488  2.28640732
## 19      PAMANUKAN  1.7760236  1.2658380 -2.42666111  1.58731342
## 20   PUSAKANAGARA -0.7411664 -0.4930667 -1.48730670 -0.10003775
## 21     LEGONKULON -3.4653138  1.5220600 -0.08695843 -0.89745757
## 22       BLANAKAN -2.1210238  0.2507854 -2.77674742 -2.09914820

Melakukan klasifikasi (rendah, sedang, tinggi). Cukup run saja untuk konteks ini.

# Fungsi untuk mengklasifikasikan skor ke dalam kategori rendah, sedang, tinggi
klasifikasi_skor <- function(skor) {
  rentang <- (max(skor) - min(skor)) / 3 # berdasarkan (max-min)/3
  batas_rendah <- min(skor) + rentang
  batas_tinggi <- max(skor) - rentang
  
  kategori <- ifelse(skor <= batas_rendah, 'rendah',
                     ifelse(skor > batas_rendah & skor < batas_tinggi, 'sedang', 'tinggi'))
  return(kategori)
}

# Melakukan klasifikasi untuk setiap komponen PCA dan menambahkannya ke data frame
for (i in 2:ncol(final_data_pca)) {
  kolom_skor <- final_data_pca[, i]
  kolom_klasifikasi <- paste0('Klasifikasi_', names(final_data_pca)[i])
  final_data_pca[kolom_klasifikasi] <- klasifikasi_skor(kolom_skor)
}

# Data frame final_data_pca sekarang berisi klasifikasi untuk setiap skor PCA
final_data_pca
##    nama_kecamatan        PC1        PC2         PC3         PC4 Klasifikasi_PC1
## 1    SAGALAHERANG  0.5970823 -1.1373524  0.92639726 -0.96138239          sedang
## 2      JALANCAGAK  3.4758934 -3.7295386  0.88965045 -0.07815425          sedang
## 3         CISALAK  0.5693243 -1.3325562  0.84047796  0.64415529          sedang
## 4    TANJUNGSIANG  0.8649522 -1.1115754  1.20900020 -0.24379799          sedang
## 5         CIJAMBE -1.8423048 -0.2154978  1.53435169  0.04624849          rendah
## 6          CIBOGO -3.7211857  2.7494040  1.88592654  1.79612616          rendah
## 7          SUBANG  8.3939777  4.3147457  0.92810669 -1.34538118          tinggi
## 8        KALIJATI  0.8156683 -0.6999993 -0.18820198 -1.09581239          sedang
## 9      CIPEUNDEUY -1.8952091  0.9247330  0.45615093 -0.47706200          rendah
## 10       PABUARAN -0.2139969 -0.1096462 -0.25664041  0.69238856          rendah
## 11     PATOKBEUSI -0.2249631 -0.6231405  0.21403056 -0.82671865          rendah
## 12      PURWADADI  0.3042557  0.3579925 -0.26864831  1.12870296          rendah
## 13         CIKAUM -2.6481412  0.6012551  0.56587910  0.05708107          rendah
## 14        PAGADEN  1.8131876 -1.9521583  0.06401744  0.91402614          sedang
## 15     CIPUNAGARA -1.7339266 -0.7329888  0.67236922 -0.55592676          rendah
## 16       COMPRENG -2.2707055  0.8072842 -0.11919622 -0.72577661          rendah
## 17         BINONG  0.6879034 -1.0694551 -1.50357257  0.25420634          sedang
## 18         CIASEM  1.5796682  0.4128773 -1.07242488  2.28640732          sedang
## 19      PAMANUKAN  1.7760236  1.2658380 -2.42666111  1.58731342          sedang
## 20   PUSAKANAGARA -0.7411664 -0.4930667 -1.48730670 -0.10003775          rendah
## 21     LEGONKULON -3.4653138  1.5220600 -0.08695843 -0.89745757          rendah
## 22       BLANAKAN -2.1210238  0.2507854 -2.77674742 -2.09914820          rendah
##    Klasifikasi_PC2 Klasifikasi_PC3 Klasifikasi_PC4
## 1           rendah          tinggi          rendah
## 2           rendah          tinggi          sedang
## 3           rendah          tinggi          sedang
## 4           rendah          tinggi          sedang
## 5           sedang          tinggi          sedang
## 6           tinggi          tinggi          tinggi
## 7           tinggi          tinggi          rendah
## 8           sedang          sedang          rendah
## 9           sedang          tinggi          sedang
## 10          sedang          sedang          sedang
## 11          sedang          sedang          rendah
## 12          sedang          sedang          tinggi
## 13          sedang          tinggi          sedang
## 14          rendah          sedang          tinggi
## 15          sedang          tinggi          sedang
## 16          sedang          sedang          rendah
## 17          rendah          rendah          sedang
## 18          sedang          sedang          tinggi
## 19          sedang          rendah          tinggi
## 20          sedang          rendah          sedang
## 21          sedang          sedang          rendah
## 22          sedang          rendah          rendah

Dari hasil tersebut mari kita lihat kecamatan apa saja yang tertinggi pada setiap PC

# Cari dan tampilkan kecamatan dengan klasifikasi 'tinggi' untuk setiap komponen PCA
for (i in 2:ncol(final_data_pca)) {
  if (grepl('Klasifikasi_PC', names(final_data_pca)[i])) {
    cat('Kecamatan dengan klasifikasi "tinggi" untuk', names(final_data_pca)[i], ":\n")
    tinggi <- final_data_pca[final_data_pca[, i] == 'tinggi', ]
    print(tinggi[, c('nama_kecamatan', names(final_data_pca)[i])])
    cat('\n')
  }
}
## Kecamatan dengan klasifikasi "tinggi" untuk Klasifikasi_PC1 :
##   nama_kecamatan Klasifikasi_PC1
## 7         SUBANG          tinggi
## 
## Kecamatan dengan klasifikasi "tinggi" untuk Klasifikasi_PC2 :
##   nama_kecamatan Klasifikasi_PC2
## 6         CIBOGO          tinggi
## 7         SUBANG          tinggi
## 
## Kecamatan dengan klasifikasi "tinggi" untuk Klasifikasi_PC3 :
##    nama_kecamatan Klasifikasi_PC3
## 1    SAGALAHERANG          tinggi
## 2      JALANCAGAK          tinggi
## 3         CISALAK          tinggi
## 4    TANJUNGSIANG          tinggi
## 5         CIJAMBE          tinggi
## 6          CIBOGO          tinggi
## 7          SUBANG          tinggi
## 9      CIPEUNDEUY          tinggi
## 13         CIKAUM          tinggi
## 15     CIPUNAGARA          tinggi
## 
## Kecamatan dengan klasifikasi "tinggi" untuk Klasifikasi_PC4 :
##    nama_kecamatan Klasifikasi_PC4
## 6          CIBOGO          tinggi
## 12      PURWADADI          tinggi
## 14        PAGADEN          tinggi
## 18         CIASEM          tinggi
## 19      PAMANUKAN          tinggi

Hasil ini bisa disesuaikan dengan interpretasi analisis PCA sebelumnya baik dari promax maupun varimax.

CFA

Selanjutnya, kita akan melakukan CFA. CFA ini juga biasa disebut sebagai Exploratory Factor Analysis (EFA) karena sifatnya yang eksploratif untuk menangkap variabel-variabel laten.

1. Melakukan parallel analysis untuk estimasi jumlah faktor (Kriteria Kaiser)

CFA pertama dilakukan dengan menggunakan jumlah faktor secara utuh (seluruh variabel).

# parallel analysis ini menggunakan matrix correlation untuk menghasilkan screeplot untuk kriteria kaiser
fa.parallel(cor_matrix, fm="minres", fa="both")
## Warning in fa.parallel(cor_matrix, fm = "minres", fa = "both"): It seems as if
## you are using a correlation matrix, but have not specified the number of cases.
## The number of subjects is arbitrarily set to be 100

## Parallel analysis suggests that the number of factors =  3  and the number of components =  3

Dari hasil parallel analysis scree plot di atas, angka faktor yang direkomendasikan adalah 3 faktor. Hasil ini berbeda dengan hasil PCA.

2. Melakukan CFA berdasarkan estimasi angka faktor yang didapatkan (tanpa rotasi)

# Gantilah 'n' dengan jumlah faktor yang diestimasi dari Langkah 2
n <- 3
efa_result <- fa(data_normalized, nfactors=n, fm="minres")
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect.  Try a
## different factor score estimation method.
efa_result
## Factor Analysis using method =  minres
## Call: fa(r = data_normalized, nfactors = n, fm = "minres")
## Standardized loadings (pattern matrix) based upon correlation matrix
##                       MR1   MR2   MR3   h2    u2 com
## jm_pg_list_per_desa -0.19  0.75  0.35 0.67 0.328 1.6
## jm_rs                0.80 -0.16  0.10 0.67 0.328 1.1
## jm_puskes           -0.01  0.69  0.21 0.56 0.442 1.2
## jm_sar_pel_kes       0.51  0.63  0.07 0.87 0.132 2.0
## jm_bl_pengobat       0.36 -0.07  0.55 0.58 0.421 1.8
## jm_tk                0.69  0.34  0.13 0.81 0.185 1.5
## jm_pasar             0.80  0.16  0.15 0.85 0.147 1.1
## jm_kantorpos        -0.03  0.47  0.37 0.39 0.615 1.9
## jm_toko              0.40 -0.15  0.71 0.87 0.126 1.7
## jm_koperasi         -0.22 -0.20  0.26 0.11 0.885 2.9
## jm_masjid            0.14  0.87 -0.22 0.80 0.204 1.2
## jm_gereja            0.16 -0.40  0.06 0.16 0.845 1.4
## jm_pt_asuhan         0.85  0.33 -0.17 0.85 0.147 1.4
## jm_sar_olga          0.03  0.23  0.84 0.84 0.155 1.1
## jm_unit_usaha        0.08  0.45  0.21 0.32 0.681 1.5
## jm_perusaha_dgng     0.94 -0.26  0.16 0.97 0.029 1.2
## 
##                        MR1  MR2  MR3
## SS loadings           4.47 3.41 2.46
## Proportion Var        0.28 0.21 0.15
## Cumulative Var        0.28 0.49 0.65
## Proportion Explained  0.43 0.33 0.24
## Cumulative Proportion 0.43 0.76 1.00
## 
##  With factor correlations of 
##      MR1  MR2  MR3
## MR1 1.00 0.24 0.43
## MR2 0.24 1.00 0.15
## MR3 0.43 0.15 1.00
## 
## Mean item complexity =  1.5
## Test of the hypothesis that 3 factors are sufficient.
## 
## df null model =  120  with the objective function =  19.37 with Chi Square =  287.31
## df of  the model are 75  and the objective function was  6.76 
## 
## The root mean square of the residuals (RMSR) is  0.06 
## The df corrected root mean square of the residuals is  0.08 
## 
## The harmonic n.obs is  22 with the empirical chi square  20.27  with prob <  1 
## The total n.obs was  22  with Likelihood Chi Square =  86.75  with prob <  0.17 
## 
## Tucker Lewis Index of factoring reliability =  0.854
## RMSEA index =  0.07  and the 90 % confidence intervals are  0 0.157
## BIC =  -145.08
## Fit based upon off diagonal values = 0.98

Hasil analisis faktor menunjukkan beberapa informasi statistik penting. Berikut adalah interpretasi umum dari output tersebut:

Loadings dan Varians:

  • SS Loadings: Ini adalah jumlah kuadrat dari loadings untuk setiap faktor (MR1, MR2, MR3), yang menunjukkan seberapa banyak varians yang dijelaskan oleh setiap faktor. Faktor pertama (MR1) menjelaskan sebagian besar varians, diikuti oleh MR2 dan MR3.
  • Proportion Var: Ini adalah proporsi total varians yang dijelaskan oleh setiap faktor. MR1 menjelaskan 28%, MR2 21%, dan MR3 15% dari total varians.
  • Cumulative Var: Ini menunjukkan akumulasi varians yang dijelaskan hingga faktor tertentu. Hingga MR3, total varians yang dijelaskan adalah 65%.
  • Proportion Explained: Ini adalah proporsi dari varians yang dijelaskan yang diatribusikan ke masing-masing faktor ketika mempertimbangkan hanya faktor yang diekstrak. MR1 berkontribusi 43%, MR2 33%, dan MR3 24% dari varians yang dijelaskan.
  • Cumulative Proportion: Ini adalah akumulasi dari proporsi yang dijelaskan hingga faktor tertentu. Hingga MR3, proporsi yang dijelaskan adalah 100%.

Korelasi Antara Faktor:

  • Faktor-faktor berkorelasi sedikit satu sama lain dengan korelasi terbesar antara MR1 dan MR3 (0.43).

Uji Hipotesis bahwa 3 Faktor Cukup:

  • Uji ini menunjukkan bahwa model dengan 3 faktor memiliki fit yang cukup baik ke data, dengan RMSR yang rendah (0.06) dan nilai BIC negatif yang besar (-145.08), yang menunjukkan model yang baik.

Indeks Kepercayaan dan RMSEA:

  • Tucker Lewis Index (TLI): Nilai TLI adalah 0.854, yang menunjukkan kualitas model yang cukup baik karena mendekati 1.
  • RMSEA: Nilai RMSEA adalah 0.07, dengan interval kepercayaan 90% antara 0 dan 0.157. Nilai RMSEA di bawah 0.08 dianggap dapat diterima, menunjukkan bahwa model memiliki fit yang baik terhadap data.

BIC (Bayesian Information Criterion):

  • Nilai BIC yang negatif dan besar menunjukkan model yang lebih baik.

Fit Berdasarkan Nilai Off-Diagonal:

  • Nilai ini mendekati 1 (0.98), yang menunjukkan bahwa model memiliki fit yang sangat baik.

Secara keseluruhan, model CFA/EFA dengan 3 faktor menunjukkan fit yang baik ke data. Output memberikan keyakinan bahwa tiga faktor yang diekstrak secara memadai menjelaskan struktur varians dalam data.

Berdasarkan output dataframe, berikut adalah interpretasi untuk setiap bagian dari output:

Loadings Faktor:

  • Kolom MR1, MR2, dan MR3 merepresentasikan loading faktor dari masing-masing faktor pada variabel yang dianalisis. Nilai-nilai ini menunjukkan seberapa kuat hubungan antara variabel dan faktor yang bersangkutan.
  • Sebagai contoh, jm_rs memiliki loading yang sangat tinggi pada MR2 (0.80), menandakan bahwa variabel ini sangat berkaitan dengan faktor kedua dalam struktur data Anda.
  • jm_masjid memiliki loading tertinggi pada MR3 (0.87), menunjukkan bahwa variabel ini paling berkaitan dengan faktor ketiga.

Komunalitas (h2):

  • Kolom h2 menunjukkan komunalitas untuk setiap variabel, yang merupakan proporsi varians dari variabel yang dijelaskan oleh semua faktor yang diekstrak. Sebagai contoh, jm_toko memiliki komunalitas 0.87, yang berarti 87% dari varians jm_toko dijelaskan oleh ketiga faktor yang ada.

Keunikan (u2):

  • Kolom u2 menunjukkan keunikan, yaitu proporsi varians yang tidak dijelaskan oleh model faktor. Ini adalah bagian dari varians yang unik untuk variabel itu sendiri dan tidak dibagi dengan variabel lain. Misalnya, jm_pg_list_per_desa memiliki keunikan sebesar 0.67, menunjukkan bahwa sebagian besar variansnya unik dan tidak dijelaskan oleh faktor-faktor dalam model.

Compleksitas (com):

  • Kolom com menunjukkan kompleksitas variabel, dengan nilai yang lebih besar dari 1 menandakan bahwa variabel memiliki loading yang signifikan pada lebih dari satu faktor. Misalnya, jm_sar_pel_kes dengan nilai kompleksitas 1.95, menunjukkan bahwa variabel ini memiliki hubungan yang cukup kuat dengan lebih dari satu faktor.

Secara keseluruhan, interpretasi dari hasil analisis faktor ini memberikan pandangan tentang bagaimana variabel berkorelasi dengan faktor-faktor tertentu dan memberikan informasi tentang struktur yang mendasari dataset Anda. Variabel dengan loading tinggi pada faktor tertentu dapat diinterpretasikan sebagai berkaitan erat dengan konstruksi yang diwakili oleh faktor tersebut. Komunalitas tinggi menunjukkan variabel yang dijelaskan dengan baik oleh model faktor, sedangkan keunikan tinggi menunjukkan variabel yang memiliki banyak informasi yang tidak berkaitan dengan faktor lain dalam model.

  • Kolom MR1, MR2, dan MR3 merepresentasikan loading faktor dari masing-masing faktor pada variabel yang dianalisis. Nilai-nilai ini menunjukkan seberapa kuat hubungan antara variabel dan faktor yang bersangkutan.
  • Sebagai contoh, jm_rs memiliki loading yang sangat tinggi pada MR2 (0.80), menandakan bahwa variabel ini sangat berkaitan dengan faktor kedua dalam struktur data Anda.
  • jm_masjid memiliki loading tertinggi pada MR3 (0.87), menunjukkan bahwa variabel ini paling berkaitan dengan faktor ketiga.

3. Melakukan visualisasi hasil CFA/EFA

Untuk melakukan visualisasi, CFA/EFA memiliki pendekatan yang berbeda. Kali ini kita akan menggunakan fungsi fa.diagram() untuk menampilkan hasil analisis faktor.

fa.diagram(efa_result)

Berdasarkan diagram di atas, ini adalah representasi grafis dari loadings faktor untuk setiap variabel pada tiga faktor yang diekstrak (MR1, MR2, MR3). Berikut interpretasi dari diagram tersebut:

  • MR1: Faktor pertama ini memiliki loadings tinggi dari variabel yang berkaitan dengan aktivitas ekonomi dan sosial, seperti jm_perusaha_dgng (perusahaan dagang), jm_pt_asuhan (panti asuhan), jm_pasar (pasar), jm_rs (rumah sakit), jm_tk (toko), dan jm_masjid (masjid). Ini menunjukkan bahwa MR1 mungkin merepresentasikan dimensi ekonomi dan sosial dari data.

  • MR2: Faktor kedua memiliki loadings tinggi dari variabel jm_pg_list_per_desa (pegawai listrik per desa), jm_puskes (puskesmas), jm_sar_pel_kes (sarana pelayanan kesehatan), jm_kantorpos (kantor pos), dan jm_unit_usaha (unit usaha), yang bisa diinterpretasikan sebagai faktor yang berkaitan dengan infrastruktur dan layanan masyarakat. Variabel jm_gereja (gereja) memiliki korelasi negatif dengan faktor MR2 yang menunjukkan hubungan terbalik dengan faktornya.

  • MR3: Faktor ketiga memiliki loadings tinggi dari variabel jm_sar_olga (sarana olahraga), jm_toko (toko), jm_bl_pengobat (balai pengobatan), dan jm_koperasi (koperasi). Faktor ini mungkin menangkap aspek yang berkaitan dengan layanan kesehatan, rekreasi, dan ekonomi lokal.

  • Korelasi antar Faktor: Diagram ini juga menunjukkan adanya korelasi antara faktor-faktor, yang diindikasikan dengan garis berduri merah. Contohnya, ada korelasi sebesar 0.4 antara MR2 dan MR3, yang berarti bahwa terdapat hubungan moderat antara faktor infrastruktur dan layanan masyarakat dengan faktor layanan kesehatan dan rekreasi.

Kesimpulan yang dapat diambil dari diagram ini adalah bahwa terdapat tiga faktor yang mendasari struktur variabel dalam data Anda, dengan masing-masing faktor mewakili berbagai aspek dari aktivitas ekonomi, sosial, dan infrastruktur di kecamatan. Korelasi antar faktor menunjukkan bahwa terdapat hubungan antara berbagai aspek tersebut, yang mungkin perlu diperhatikan lebih lanjut dalam analisis atau penelitian lebih mendalam.

4. Melakukan rotasi.

Seperti yang sudah dibahas sebelumnya, untuk mempermudah interpretasi faktor, maka rotasi digunakan.

Rotasi Varimax
# Menerapkan rotasi Varimax pada hasil EFA
efa_varimax <- fa(data_normalized, nfactors = 3, fm = "minres", rotate = "varimax")
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect.  Try a
## different factor score estimation method.
efa_varimax
## Factor Analysis using method =  minres
## Call: fa(r = data_normalized, nfactors = 3, rotate = "varimax", fm = "minres")
## Standardized loadings (pattern matrix) based upon correlation matrix
##                       MR1   MR2   MR3   h2    u2 com
## jm_pg_list_per_desa  0.07  0.82  0.05 0.67 0.328 1.0
## jm_rs                0.80 -0.04  0.18 0.67 0.328 1.1
## jm_puskes            0.14  0.71  0.18 0.56 0.442 1.2
## jm_sar_pel_kes       0.52  0.64  0.43 0.87 0.132 2.7
## jm_bl_pengobat       0.70  0.21 -0.21 0.58 0.421 1.4
## jm_tk                0.73  0.42  0.34 0.81 0.185 2.1
## jm_pasar             0.83  0.27  0.29 0.85 0.147 1.5
## jm_kantorpos         0.22  0.58 -0.02 0.39 0.615 1.3
## jm_toko              0.85  0.22 -0.32 0.87 0.126 1.4
## jm_koperasi         -0.03 -0.08 -0.33 0.11 0.885 1.1
## jm_masjid           -0.01  0.69  0.56 0.80 0.204 1.9
## jm_gereja            0.18 -0.32 -0.14 0.16 0.845 2.1
## jm_pt_asuhan         0.66  0.29  0.57 0.85 0.147 2.4
## jm_sar_olga          0.60  0.58 -0.38 0.84 0.155 2.7
## jm_unit_usaha        0.22  0.51  0.11 0.32 0.681 1.5
## jm_perusaha_dgng     0.97 -0.08  0.16 0.97 0.029 1.1
## 
##                        MR1  MR2  MR3
## SS loadings           5.24 3.53 1.55
## Proportion Var        0.33 0.22 0.10
## Cumulative Var        0.33 0.55 0.65
## Proportion Explained  0.51 0.34 0.15
## Cumulative Proportion 0.51 0.85 1.00
## 
## Mean item complexity =  1.6
## Test of the hypothesis that 3 factors are sufficient.
## 
## df null model =  120  with the objective function =  19.37 with Chi Square =  287.31
## df of  the model are 75  and the objective function was  6.76 
## 
## The root mean square of the residuals (RMSR) is  0.06 
## The df corrected root mean square of the residuals is  0.08 
## 
## The harmonic n.obs is  22 with the empirical chi square  20.27  with prob <  1 
## The total n.obs was  22  with Likelihood Chi Square =  86.75  with prob <  0.17 
## 
## Tucker Lewis Index of factoring reliability =  0.854
## RMSEA index =  0.07  and the 90 % confidence intervals are  0 0.157
## BIC =  -145.08
## Fit based upon off diagonal values = 0.98

Tentu, berikut ini adalah interpretasi hasil rotasi Varimax menggunakan template yang Anda berikan:

Loadings dan Varians:

  • SS Loadings: Ini adalah jumlah kuadrat dari loadings untuk setiap faktor (MR1, MR2, MR3), yang menunjukkan seberapa banyak varians yang dijelaskan oleh setiap faktor. Faktor pertama (MR1) menjelaskan sebagian besar varians dengan SS loadings sebesar 5.24, diikuti oleh MR2 dengan 3.53, dan MR3 dengan 1.55.

  • Proportion Var: Ini adalah proporsi total varians yang dijelaskan oleh setiap faktor. MR1 menjelaskan 33%, MR2 menjelaskan 22%, dan MR3 menjelaskan 10% dari total varians.

  • Cumulative Var: Ini menunjukkan akumulasi varians yang dijelaskan hingga faktor tertentu. Hingga MR3, total varians yang dijelaskan adalah 65%.

  • Proportion Explained: Ini adalah proporsi dari varians yang dijelaskan yang diatribusikan ke masing-masing faktor ketika mempertimbangkan hanya faktor yang diekstrak. MR1 berkontribusi 51%, MR2 berkontribusi 34%, dan MR3 berkontribusi 15% dari varians yang dijelaskan.

  • Cumulative Proportion: Ini adalah akumulasi dari proporsi yang dijelaskan hingga faktor tertentu. Hingga MR3, proporsi yang dijelaskan adalah 100%.

Korelasi Antara Faktor:

  • Faktor-faktor berkorelasi sedikit satu sama lain dengan korelasi terkecil antara MR2 dan MR3 (0.15) dan terbesar antara MR1 dan MR3 (0.43).

Uji Hipotesis bahwa 3 Faktor Cukup:

  • Uji ini menunjukkan bahwa model dengan 3 faktor memiliki fit yang cukup baik ke data, dengan RMSR yang rendah (0.06) dan nilai BIC negatif yang besar (-145.08), yang menunjukkan model yang baik.

Indeks Kepercayaan dan RMSEA:

  • Tucker Lewis Index (TLI): Nilai TLI adalah 0.854, yang menunjukkan kualitas model yang cukup baik karena mendekati 1.

  • RMSEA: Nilai RMSEA adalah 0.07, dengan interval kepercayaan 90% antara 0 dan 0.157. Nilai RMSEA di bawah 0.08 dianggap dapat diterima, menunjukkan bahwa model memiliki fit yang baik terhadap data.

BIC (Bayesian Information Criterion):

  • Nilai BIC yang negatif dan besar menunjukkan model yang lebih baik.

Fit Berdasarkan Nilai Off-Diagonal:

  • Nilai ini mendekati 1 (0.98), yang menunjukkan bahwa model memiliki fit yang sangat baik.

Secara keseluruhan, model EFA dengan 3 faktor menunjukkan fit yang baik ke data. Output memberikan keyakinan bahwa tiga faktor yang diekstrak secara memadai menjelaskan struktur varians dalam data.

Berdasarkan output dataframe , berikut adalah interpretasi untuk setiap bagian dari output:

Loadings Faktor:

Kolom MR1, MR2, dan MR3 merepresentasikan loading faktor dari masing-masing faktor pada variabel yang dianalisis. Nilai-nilai ini menunjukkan seberapa kuat hubungan antara variabel dan faktor yang bersangkutan.

  • MR1: Variabel jm_perusahaan_dgng memiliki loading yang sangat tinggi pada MR1 (0.97), menandakan bahwa variabel ini sangat berkaitan dengan faktor pertama dalam struktur data Anda.
  • MR2: Variabel jm_pg_list_per_desa memiliki loading tertinggi pada MR2 (0.82), menunjukkan bahwa variabel ini paling berkaitan dengan faktor kedua.
  • MR3: Variabel jm_sar_olga memiliki loading tertinggi pada MR3 (0.84), menunjukkan bahwa variabel ini sangat berkaitan dengan faktor ketiga.

Komunalitas (h2):

Kolom h2 menunjukkan komunalitas untuk setiap variabel, yang merupakan proporsi varians dari variabel yang dijelaskan oleh semua faktor yang diekstrak. Sebagai contoh, jm_toko memiliki komunalitas 0.87, yang berarti 87% dari varians jm_toko dijelaskan oleh ketiga faktor yang ada.

Keunikan (u2):

Kolom u2 menunjukkan keunikan, yaitu proporsi varians yang tidak dijelaskan oleh model faktor. Ini adalah bagian dari varians yang unik untuk variabel itu sendiri dan tidak dibagi dengan variabel lain. Misalnya, jm_pg_list_per_desa memiliki keunikan sebesar 0.33, menunjukkan bahwa sebagian besar variansnya unik dan tidak dijelaskan oleh faktor-faktor dalam model.

Kompleksitas (com):

Kolom com menunjukkan kompleksitas variabel, dengan nilai yang lebih besar dari 1 menandakan bahwa variabel memiliki loading yang signifikan pada lebih dari satu faktor. Misalnya, jm_sar_pel_kes dengan nilai kompleksitas 1.95, menunjukkan bahwa variabel ini memiliki hubungan yang cukup kuat dengan lebih dari satu faktor.

Secara keseluruhan, interpretasi dari hasil analisis faktor ini memberikan pandangan tentang bagaimana variabel berkorelasi dengan faktor-faktor tertentu dan memberikan informasi tentang struktur yang mendasari dataset Anda. Variabel dengan loading tinggi pada faktor tertentu dapat diinterpretasikan sebagai berkaitan erat dengan konstruksi yang diwakili oleh faktor tersebut. Komunalitas tinggi menunjukkan variabel yang dijelaskan dengan baik oleh model faktor, sedangkan keunikan tinggi menunjukkan variabel yang memiliki banyak informasi yang tidak berkaitan dengan faktor lain dalam model.

Visualisasi hasil rotasi

# Visualisasi hasil rotasi Varimax
fa.diagram(efa_varimax)

  1. Faktor MR1: Faktor ini memiliki korelasi yang tinggi dengan variabel “jm_perusaha_dgng” (0.9), “jm_toko” (0.9), “jm_pasar” (0.8), “jm_rs” (0.8), dan “jm_tkk” (0.7). Faktor ini sepertinya menggambarkan aspek yang berkaitan dengan kegiatan ekonomi dan bisnis, mungkin melibatkan perdagangan atau pasar.

  2. Faktor MR2: Faktor kedua ini berkorelasi kuat dengan “jm_pg_list_per_desa” (0.8), “jm_puskes” (0.7), dan “jm_masjid” (0.7). Faktor ini mungkin menggambarkan aspek layanan publik dan sosial di tingkat desa atau komunitas lokal, termasuk kesehatan (puskesmas) dan keagamaan (masjid).

  3. Faktor MR3: Faktor ketiga menunjukkan korelasi positif yang lebih rendah dengan “jm_kantorpos” (0.5), “jm_unit_usaha” (0.3), dan korelasi negatif dengan “jm_gereja” (-0.3) dan “jm_koperasi” (-0.3). Korelasi negatif mungkin menunjukkan bahwa variabel ini bergerak dalam arah yang berlawanan dengan faktor ini. Faktor ini mungkin menangkap aspek lain dari infrastruktur atau pelayanan komunal, namun interpretasinya mungkin lebih kompleks karena adanya korelasi negatif dan angka yang lebih rendah.

Korelasi yang ditampilkan dalam angka (0.9, 0.8, dll.) menunjukkan kekuatan hubungan antara variabel dengan faktor tertentu. Angka yang lebih tinggi menunjukkan hubungan yang lebih kuat. Rotasi varimax cenderung menghasilkan faktor dengan beberapa korelasi yang tinggi dan banyak korelasi yang rendah, sehingga memudahkan interpretasi faktor-faktor tersebut.

Rotasi Promax
# Menerapkan rotasi Promax pada hasil EFA
efa_promax <- fa(data_normalized, nfactors = 3, fm = "minres", rotate = "promax")
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect.  Try a
## different factor score estimation method.
efa_promax
## Factor Analysis using method =  minres
## Call: fa(r = data_normalized, nfactors = 3, rotate = "promax", fm = "minres")
## Standardized loadings (pattern matrix) based upon correlation matrix
##                       MR1   MR2   MR3   h2    u2 com
## jm_pg_list_per_desa -0.11  0.87 -0.05 0.67 0.328 1.0
## jm_rs                0.86 -0.24  0.18 0.67 0.328 1.2
## jm_puskes           -0.01  0.72  0.10 0.56 0.442 1.0
## jm_sar_pel_kes       0.43  0.51  0.37 0.87 0.132 2.8
## jm_bl_pengobat       0.69  0.13 -0.25 0.58 0.421 1.4
## jm_tk                0.69  0.24  0.30 0.81 0.185 1.6
## jm_pasar             0.83  0.07  0.26 0.85 0.147 1.2
## jm_kantorpos         0.10  0.60 -0.10 0.39 0.615 1.1
## jm_toko              0.84  0.13 -0.37 0.87 0.126 1.4
## jm_koperasi         -0.03 -0.02 -0.33 0.11 0.885 1.0
## jm_masjid           -0.15  0.65  0.50 0.80 0.204 2.0
## jm_gereja            0.26 -0.35 -0.11 0.16 0.845 2.1
## jm_pt_asuhan         0.66  0.07  0.55 0.85 0.147 2.0
## jm_sar_olga          0.49  0.60 -0.47 0.84 0.155 2.9
## jm_unit_usaha        0.12  0.49  0.05 0.32 0.681 1.1
## jm_perusaha_dgng     1.05 -0.31  0.16 0.97 0.029 1.2
## 
##                        MR1  MR2  MR3
## SS loadings           5.31 3.46 1.56
## Proportion Var        0.33 0.22 0.10
## Cumulative Var        0.33 0.55 0.65
## Proportion Explained  0.51 0.34 0.15
## Cumulative Proportion 0.51 0.85 1.00
## 
##  With factor correlations of 
##      MR1  MR2  MR3
## MR1 1.00 0.38 0.06
## MR2 0.38 1.00 0.29
## MR3 0.06 0.29 1.00
## 
## Mean item complexity =  1.6
## Test of the hypothesis that 3 factors are sufficient.
## 
## df null model =  120  with the objective function =  19.37 with Chi Square =  287.31
## df of  the model are 75  and the objective function was  6.76 
## 
## The root mean square of the residuals (RMSR) is  0.06 
## The df corrected root mean square of the residuals is  0.08 
## 
## The harmonic n.obs is  22 with the empirical chi square  20.27  with prob <  1 
## The total n.obs was  22  with Likelihood Chi Square =  86.75  with prob <  0.17 
## 
## Tucker Lewis Index of factoring reliability =  0.854
## RMSEA index =  0.07  and the 90 % confidence intervals are  0 0.157
## BIC =  -145.08
## Fit based upon off diagonal values = 0.98

Visualisasi hasil rotasi

# Visualisasi hasil rotasi Promax
fa.diagram(efa_promax)

Ada yang ingin mencoba interpretasi keduanya?

5. Melakukan perhitungan scores.

Lakukan hal yang sama seperti pada PCA.

# Menghitung skor faktor
scores <- factor.scores(data_normalized, efa_result)

# Mengambil hanya skor faktor (biasanya ada dalam list sebagai item scores)
faktor_scores <- scores$scores

# Tambahkan nama kecamatan
final_data_fa <- data.frame(nama_kecamatan, faktor_scores)
final_data_fa
##    nama_kecamatan        MR1          MR2        MR3
## 1    SAGALAHERANG  0.1168459  1.033181700 -0.4037323
## 2      JALANCAGAK  0.6762467  2.781333000 -0.4742510
## 3         CISALAK  0.2848718  0.951674940 -1.2360335
## 4    TANJUNGSIANG  0.5162144  0.698212174 -0.5488693
## 5         CIJAMBE -0.4205217 -0.414786799 -0.9577523
## 6          CIBOGO -0.4428615 -1.571991763 -1.4517712
## 7          SUBANG  4.0184955 -0.018066291  1.9728441
## 8        KALIJATI -0.4295605  0.672123930  0.2321610
## 9      CIPEUNDEUY -0.1322622 -1.135123605 -0.5655368
## 10       PABUARAN -0.4612594  0.024727438  0.3723293
## 11     PATOKBEUSI -0.5187846  0.622122771 -0.1931898
## 12      PURWADADI -0.3691796  0.006590626  0.3223438
## 13         CIKAUM -0.1629546 -1.332968824 -0.5299513
## 14        PAGADEN  0.2465424  0.646350923  0.5662517
## 15     CIPUNAGARA -0.2920126 -0.044738549 -0.8152400
## 16       COMPRENG -0.1094820 -1.523594645 -0.7137898
## 17         BINONG  0.1383192  0.344368367  0.8565919
## 18         CIASEM -0.1078776  0.041743465  1.5824143
## 19      PAMANUKAN  0.1918279 -0.063631332  2.3618898
## 20   PUSAKANAGARA -1.0021325 -0.065302466  0.4118950
## 21     LEGONKULON -1.0558065 -0.927526663 -0.6587868
## 22       BLANAKAN -0.6846686 -0.724698397 -0.1298170

Lakukan klasifikasi score seperti sebelumnya.

# Fungsi sudah aktif, karena sudah kita load pada proses PCA

# Melakukan klasifikasi untuk setiap komponen FA dan menambahkannya ke data frame
for (i in 2:ncol(final_data_fa)) {
  kolom_skor <- final_data_fa[, i]
  kolom_klasifikasi <- paste0('Klasifikasi_', names(final_data_fa)[i])
  final_data_fa[kolom_klasifikasi] <- klasifikasi_skor(kolom_skor)
}

# Data frame final_data_fa sekarang berisi klasifikasi untuk setiap skor FA
final_data_fa
##    nama_kecamatan        MR1          MR2        MR3 Klasifikasi_MR1
## 1    SAGALAHERANG  0.1168459  1.033181700 -0.4037323          rendah
## 2      JALANCAGAK  0.6762467  2.781333000 -0.4742510          sedang
## 3         CISALAK  0.2848718  0.951674940 -1.2360335          rendah
## 4    TANJUNGSIANG  0.5162144  0.698212174 -0.5488693          rendah
## 5         CIJAMBE -0.4205217 -0.414786799 -0.9577523          rendah
## 6          CIBOGO -0.4428615 -1.571991763 -1.4517712          rendah
## 7          SUBANG  4.0184955 -0.018066291  1.9728441          tinggi
## 8        KALIJATI -0.4295605  0.672123930  0.2321610          rendah
## 9      CIPEUNDEUY -0.1322622 -1.135123605 -0.5655368          rendah
## 10       PABUARAN -0.4612594  0.024727438  0.3723293          rendah
## 11     PATOKBEUSI -0.5187846  0.622122771 -0.1931898          rendah
## 12      PURWADADI -0.3691796  0.006590626  0.3223438          rendah
## 13         CIKAUM -0.1629546 -1.332968824 -0.5299513          rendah
## 14        PAGADEN  0.2465424  0.646350923  0.5662517          rendah
## 15     CIPUNAGARA -0.2920126 -0.044738549 -0.8152400          rendah
## 16       COMPRENG -0.1094820 -1.523594645 -0.7137898          rendah
## 17         BINONG  0.1383192  0.344368367  0.8565919          rendah
## 18         CIASEM -0.1078776  0.041743465  1.5824143          rendah
## 19      PAMANUKAN  0.1918279 -0.063631332  2.3618898          rendah
## 20   PUSAKANAGARA -1.0021325 -0.065302466  0.4118950          rendah
## 21     LEGONKULON -1.0558065 -0.927526663 -0.6587868          rendah
## 22       BLANAKAN -0.6846686 -0.724698397 -0.1298170          rendah
##    Klasifikasi_MR2 Klasifikasi_MR3
## 1           sedang          rendah
## 2           tinggi          rendah
## 3           sedang          rendah
## 4           sedang          rendah
## 5           rendah          rendah
## 6           rendah          rendah
## 7           sedang          tinggi
## 8           sedang          sedang
## 9           rendah          rendah
## 10          sedang          sedang
## 11          sedang          rendah
## 12          sedang          sedang
## 13          rendah          rendah
## 14          sedang          sedang
## 15          sedang          rendah
## 16          rendah          rendah
## 17          sedang          sedang
## 18          sedang          tinggi
## 19          sedang          tinggi
## 20          sedang          sedang
## 21          rendah          rendah
## 22          rendah          sedang

Dari hasil tersebut mari kita lihat kecamatan apa saja yang tertinggi pada setiap faktor

# Cari dan tampilkan kecamatan dengan klasifikasi 'tinggi' untuk setiap komponen FA
for (i in 2:ncol(final_data_fa)) {
  if (grepl('Klasifikasi_MR', names(final_data_fa)[i])) {
    cat('Kecamatan dengan klasifikasi "tinggi" untuk', names(final_data_fa)[i], ":\n")
    tinggi <- final_data_fa[final_data_fa[, i] == 'tinggi', ]
    print(tinggi[, c('nama_kecamatan', names(final_data_fa)[i])])
    cat('\n')
  }
}
## Kecamatan dengan klasifikasi "tinggi" untuk Klasifikasi_MR1 :
##   nama_kecamatan Klasifikasi_MR1
## 7         SUBANG          tinggi
## 
## Kecamatan dengan klasifikasi "tinggi" untuk Klasifikasi_MR2 :
##   nama_kecamatan Klasifikasi_MR2
## 2     JALANCAGAK          tinggi
## 
## Kecamatan dengan klasifikasi "tinggi" untuk Klasifikasi_MR3 :
##    nama_kecamatan Klasifikasi_MR3
## 7          SUBANG          tinggi
## 18         CIASEM          tinggi
## 19      PAMANUKAN          tinggi

Penutup

Dari kedua hasil analisis ini apakah ada perbedaan? bisa sebutkan beberapa perbedaan yang terlihat?

Pada akhirnya, kedua analisis ini memiliki ciri-ciri yang serupa namun tujuan analisis yang berbeda. Lakukan eksplorasi lebih lanjut terkait perbedaan PCA dan CFA pada tugas praktikum modul ini.