1 . Pendahuluan

Project ini dilakukan sebagai pendalaman dan pembelajaran mandiri atas materi Regresi Data Panel pada Data sosio demografis. Data socio demografis adalah data yang menggambarkan karakteristik sosial dan demografis dari suatu populasi. Dataset yang digunakan adalah data demografi per provinsi yang disediakan oleh Badan Pusat Statistik. Tujuan dari project adalah untuk membangun model yang dapat memprediksi angka kemiskinan berdasarkan data sosio demografi lain.

#import Dataset
kemiskinan <- 
read.csv("data_input/Kemiskinan_2.csv", sep = ";", check.names = F)

head(kemiskinan, 5)
##         Provinsi    Pulau          Variabel  2018  2019  2020  2021  2022  2023
## 1           Aceh Sumatera Kemiskinan_persen 15.97 15.32 14.99 15.33 14.64 14.45
## 2 Sumatera Utara Sumatera Kemiskinan_persen  9.22  8.83  8.75  9.01  8.42  8.15
## 3 Sumatera Barat Sumatera Kemiskinan_persen  6.65  6.42  6.28  6.63  5.92  5.95
## 4           Riau Sumatera Kemiskinan_persen  7.39  7.08  6.82  7.12  6.78  6.68
## 5          Jambi Sumatera Kemiskinan_persen  7.92  7.60  7.58  8.09  7.62  7.58
#menyesuaikan format data menggunakan fungsi wide dan long

kemiskinan_sulawesi <- 
kemiskinan %>%
  filter(Pulau == "Sulawesi") %>% 
  
  select(-Pulau) %>% 
  
  pivot_longer(
    cols = c("2018", "2019", "2020", "2021", "2022", "2023"),
    names_to = "Tahun",
    values_to = "Value") %>%

  pivot_wider(names_from = "Variabel",
              values_from = "Value")

kemiskinan_sulawesi
## # A tibble: 36 × 8
##    Provinsi   Tahun Kemiskinan_persen Indeks_Pemb_Manusia Laju_Penduduk Laju_UMP
##    <chr>      <chr>             <dbl>               <dbl>         <dbl>    <dbl>
##  1 Sulawesi … 2018               7.8                 72.2          0.54     8.71
##  2 Sulawesi … 2019               7.66                73.0          0.8      8.03
##  3 Sulawesi … 2020               7.62                72.9          5.12     8.51
##  4 Sulawesi … 2021               7.77                73.3          0.64     0   
##  5 Sulawesi … 2022               7.28                73.8          0.79     0   
##  6 Sulawesi … 2023               7.38                74.4          0.95     0   
##  7 Sulawesi … 2018              14.0                 68.9          1.21     8.71
##  8 Sulawesi … 2019              13.5                 69.5          1.34     8.03
##  9 Sulawesi … 2020              12.9                 69.6         -1.85     8.51
## 10 Sulawesi … 2021              13                   69.8          1.21     0   
## # ℹ 26 more rows
## # ℹ 2 more variables: Pengangguran <dbl>, Inflasi <dbl>

1.1 Pemeriksaan Balancing Data

Untuk memeriksa apakah data yang digunakan sudah balance dapat menggunakan 2 cara, yakni:

Melihat frekuensi data berdasarkan index individu

table(kemiskinan_sulawesi$Provinsi)
## 
##         Gorontalo    Sulawesi Barat  Sulawesi Selatan   Sulawesi Tengah 
##                 6                 6                 6                 6 
## Sulawesi Tenggara    Sulawesi Utara 
##                 6                 6

Melihat data balance menggunakan is.pbalanced

is.pbalanced(kemiskinan_sulawesi,index = c("Provinsi","Tahun"))
## [1] TRUE

1.1.1 Penyesuaian Struktur Data

Membuat Panel Data Frame

#membuat pdata.frame
kemiskinan_sulawesi <- 
pdata.frame(kemiskinan_sulawesi, index = c("Provinsi","Tahun"))

#memeriksa struktur data yang baru
glimpse(kemiskinan_sulawesi)
## Rows: 36
## Columns: 8
## $ Provinsi            <fct> Gorontalo, Gorontalo, Gorontalo, Gorontalo, Goront…
## $ Tahun               <fct> 2018, 2019, 2020, 2021, 2022, 2023, 2018, 2019, 20…
## $ Kemiskinan_persen   <pseries> 16.81, 15.52, 15.22, 15.61, 15.42, 15.15, 11.2…
## $ Indeks_Pemb_Manusia <pseries> 67.71, 68.49, 68.68, 69.00, 69.81, 70.45, 65.1…
## $ Laju_Penduduk       <pseries> -0.16, 0.88, -0.40, 0.79, 0.99, 1.19, 0.68, 1.…
## $ Laju_UMP            <pseries> 8.71, 8.03, 16.98, 0.00, 0.42, 0.42, 8.71, 8.5…
## $ Pengangguran        <pseries> 3.70, 3.76, 4.28, 3.01, 2.58, 3.06, 3.01, 2.98…
## $ Inflasi             <pseries> 2.15, 2.87, 0.81, 2.59, 5.15, 5.15, 1.80, 1.43…

Mememeriksa Dimensi Data

pdim(kemiskinan_sulawesi)
## Balanced Panel: n = 6, T = 6, N = 36

1.2 Pemeriksaan Missing Value

colSums(is.na(kemiskinan_sulawesi))
##            Provinsi               Tahun   Kemiskinan_persen Indeks_Pemb_Manusia 
##                   0                   0                   0                   0 
##       Laju_Penduduk            Laju_UMP        Pengangguran             Inflasi 
##                   0                   0                   0                   0

1.3 Exploratory Data Analysis

summary(kemiskinan_sulawesi)
##               Provinsi  Tahun   Kemiskinan_persen Indeks_Pemb_Manusia
##  Gorontalo        :6   2018:6   Min.   : 7.280    Min.   :65.10      
##  Sulawesi Barat   :6   2019:6   1st Qu.: 8.715    1st Qu.:68.83      
##  Sulawesi Selatan :6   2020:6   Median :11.270    Median :70.75      
##  Sulawesi Tengah  :6   2021:6   Mean   :11.271    Mean   :70.37      
##  Sulawesi Tenggara:6   2022:6   3rd Qu.:12.940    3rd Qu.:72.23      
##  Sulawesi Utara   :6   2023:6   Max.   :16.810    Max.   :74.36      
##  Laju_Penduduk       Laju_UMP        Pengangguran      Inflasi      
##  Min.   :-1.850   Min.   :-4.0100   Min.   :2.270   Min.   :-0.180  
##  1st Qu.: 0.775   1st Qu.: 0.3575   1st Qu.:3.098   1st Qu.: 2.147  
##  Median : 1.075   Median : 7.1200   Median :3.725   Median : 3.135  
##  Mean   : 1.144   Mean   : 5.2681   Mean   :4.147   Mean   : 3.508  
##  3rd Qu.: 1.475   3rd Qu.: 8.5200   3rd Qu.:4.700   3rd Qu.: 4.925  
##  Max.   : 5.120   Max.   :16.9800   Max.   :7.370   Max.   : 7.110

1.3.1 Hubungan Antar Variabel

kemiskinan_sulawesi %>%
  select(-Provinsi, -Tahun) %>%
  cor() %>%
  ggcorrplot(type = "lower", lab = TRUE)

1.3.2 Explorasi Socio demografi

coplot(Kemiskinan_persen ~ Tahun|Provinsi,
       type = "b",
       data = kemiskinan_sulawesi,
       rows = 1,
       col = "red")

coplot(Indeks_Pemb_Manusia ~ Tahun|Provinsi,
       type = "b",
       data = kemiskinan_sulawesi,
       rows = 1,
       col = "red")

coplot(Pengangguran ~ Tahun|Provinsi,
       type = "b",
       data = kemiskinan_sulawesi,
       rows = 1,
       col = "red")

Selanjutnya akan dilihat apakah ada efek Individu dan Waktu dengan menggunakan grafik plotmeans untuk melihat Heterogenitasnya.

1.4 Heterogenitas Variabel Individu dan Year

1. Heterogenitas Antar Indidvidu

plotmeans(
  Kemiskinan_persen ~ Provinsi,
  data = kemiskinan_sulawesi,
  main="Heterogenitas Kemiskinan antar Provinsi")

dari grafik di atas disimpulkan data individu memiliki heterogenitas.

2. Heterogenitas Antar Waktu

plotmeans(
  Kemiskinan_persen ~ Tahun,
  data = kemiskinan_sulawesi,
  main="Heterogenitas Kemiskinan antar Tahun")

dari grafik di atas disimpulkan data tahun memiliki heterogenitas.


2 . Pemodelan

2.1 Cross-Validation

Data akan dibagi menjadi data train dan data test. Dikarenakan data panel memiliki informasi keterangan waktu maka pembagian data tidak diambil secara acak melainkan dibagi dengan cara dipisah secara berurutan.

  • Data Train akan menggunakan data yang terlampau
  • Data Test akan menggunakan data yang terbaru
#membuat data train
poor_train <- kemiskinan_sulawesi %>% filter(Tahun != 2023)
  
#membuat data test
poor_test <- kemiskinan_sulawesi %>% filter(Tahun == 2023)

#memastikan kembali bahwa data train sudah balance dengan melakukan balancing
poor_train <-
  poor_train %>%
  droplevels() %>%
  make.pbalanced()

2.2 Pemeriksaan Asumsi Multikolinieritas

Asumsi Uji: nilai VIF > 10: terjadi multicollinearity pada model nilai VIF < 10: tidak terjadi multicollinearity pada model

#lm(Kemiskinan_persen ~ Indeks_Pemb_Manusia + Laju_Penduduk + Laju_UMP + Pengangguran + Inflasi, poor_train) %>% vif()

lm(Kemiskinan_persen ~. -Provinsi -Tahun, poor_train) %>% vif()
## Indeks_Pemb_Manusia       Laju_Penduduk            Laju_UMP        Pengangguran 
##            3.063294            1.059362            1.230201            3.256344 
##             Inflasi 
##            1.640026

Dari uji di atas disimpulkan tidak terjadi multicollinearity pada model


3 . Penentuan Model Estimasi

3.1 Pembuatan Model

Model Gabungan (CEM)

cem <- 
plm(Kemiskinan_persen ~ Indeks_Pemb_Manusia + Pengangguran,
    data = poor_train,
    index = c("Provinsi", "Tahun"),
    model = "pooling")

Model Pengaruh Tetap (FEM)

fem <- 
plm(Kemiskinan_persen ~ Indeks_Pemb_Manusia + Pengangguran,
    data = poor_train,
    index = c("Provinsi", "Tahun"),
    model = "within")

Uji Chow

Uji chow dilakukan untuk memilih model terbaik antara model gabungan (cem) dengan model fixed effect (fem)

Hipotesis yang diuji adalah sebagai berikut:

  • H0 : Model gabungan (cem)
  • H1 : Model pengaruh tetap (fem)

H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.

pooltest(cem,fem)
## 
##  F statistic
## 
## data:  Kemiskinan_persen ~ Indeks_Pemb_Manusia + Pengangguran
## F = 139.4, df1 = 5, df2 = 22, p-value = 6.8e-16
## alternative hypothesis: unstability

Berdasarkan hasil uji chow di atas, kita peroleh nilai p-value < α. artinya Model terbaik untuk digunakan pada data kemiskinan_sulawesi adalah fixed effect model (fem).

Model Pengaruh Acak (REM)

rem <- 
plm(Kemiskinan_persen ~ Indeks_Pemb_Manusia + Pengangguran,
    data = poor_train,
    index = c("Provinsi", "Tahun"),
    model = "random")

Uji Hausman

Uji Hausman dilakukan untuk memilih model terbaik antara model random effect (rem) dengan model fixed effect (fem)

  • H0 : Model pengaruh acak
  • H1 : Model pengaruh tetap

Keputusan tolak H0 (model pengaruh tetap terpilih) apabila nilai p-value < α.

phtest(rem,fem)
## 
##  Hausman Test
## 
## data:  Kemiskinan_persen ~ Indeks_Pemb_Manusia + Pengangguran
## chisq = 6.7575, df = 2, p-value = 0.03409
## alternative hypothesis: one model is inconsistent

Berdasarkan hasil uji hausman di atas, kita peroleh nilai p-value < α. artinya Model terbaik untuk digunakan pada data kemiskinan_sulawesi adalah fixed effect model.

3.2 Pengujian Asumsi

Normalitas

Hipotesis yang diuji adalah sebagai berikut.

  • H0 : Sisaan menyebar normal
  • H1 : Sisaan tidak menyebar normal

H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.

fem$residuals %>% shapiro.test()
## 
##  Shapiro-Wilk normality test
## 
## data:  .
## W = 0.94041, p-value = 0.09332

Berdasarkan hasil pengujian Normalitas diperoleh nilai p-value > 0.05, artinya sisaan menyebar normal.

Homogenitas

Hipotesis yang diuji adalah sebagai berikut.

  • H0 : Sisaan memiliki ragam homogen
  • H1 : Sisaan tidak memiliki ragam homogen

H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.

fem %>% bptest()
## 
##  studentized Breusch-Pagan test
## 
## data:  .
## BP = 8.4727, df = 2, p-value = 0.01446

Berdasarkan hasil pengujian homogenitas diperoleh nilai p-value < 0.05, artinya Sisaan tidak memiliki ragam homogen

Autokorelasi

Hipotesis yang diuji adalah sebagai berikut.

  • H0 : tidak terjadi autokorelasi pada sisaan
  • H1 : terjadi autokorelasi pada sisaan

H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.

fem$residuals %>% Box.test(type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  .
## X-squared = 0.51976, df = 1, p-value = 0.4709

Berdasarkan hasil pengujian autokorelasi diperoleh nilai p-value > 0.05, artinya tidak terjadi permasalahan autokorelasi antar sisaan.

3.3 Interpretasi Model

1. Koefisien

summary(fem)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = Kemiskinan_persen ~ Indeks_Pemb_Manusia + Pengangguran, 
##     data = poor_train, model = "within", index = c("Provinsi", 
##         "Tahun"))
## 
## Balanced Panel: n = 6, T = 5, N = 30
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -0.644893 -0.206835 -0.078682  0.171192  0.775824 
## 
## Coefficients:
##                     Estimate Std. Error t-value Pr(>|t|)   
## Indeks_Pemb_Manusia -0.34419    0.12069 -2.8520 0.009271 **
## Pengangguran        -0.15235    0.13948 -1.0923 0.286535   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    4.2498
## Residual Sum of Squares: 3.0769
## R-Squared:      0.27598
## Adj. R-Squared: 0.045609
## F-statistic: 4.19293 on 2 and 22 DF, p-value: 0.028659

2. Mengekstrak informasi Efek dari model fix

fixef(fem)
##         Gorontalo    Sulawesi Barat  Sulawesi Selatan   Sulawesi Tengah 
##            39.903            34.418            34.322            37.622 
## Sulawesi Tenggara    Sulawesi Utara 
##            36.491            33.793

3.4 Prediksi & Evaluasi

pred <- predict(fem, poor_test, na.fill = F)

Untuk menguji apakah model yang dibangun sudah baik dalam memprediksi data baru maka akan dievaluasi dengan menggunakan nilai error, salah satu metric error yang biasa digunakan adalah MAPE. Kita dapat melakukannya menggunakan fungsi MAPE() dengan parameter:

  • y_pred = nilai hasil prediksi
  • y_true = nilai target asli
MAPE(y_pred = pred,
     y_true = poor_test$Kemiskinan_persen)
## [1] 0.2157465

Berdasarkan hasil pengujian MAPE terlihat bahwa tingkat kesalahan prediksi model fem dalam memprediksi nilai baru adalah sebesar 21%, artinya model tidak baik untuk digunakan dalam memprediksi data yang baru.