Library

# pengolahan dataframe
library(dplyr)
library(tidyr)
library(lubridate)

# visualisasi
library(ggcorrplot)
library(gplots)
library(ggplot2)
library(plotly)
library(foreign)
library(stringr) 
library(glue)

# analisis
library(plm)
library(lfe)
library(lmtest)
library(car)
library(tseries)
library(MLmetrics)

Case Study: Analisis Pengaruh Tingkat Kemiskinan di Provinsi Jawa Timur dengan Data Panel

Data Preparation

Data panel merupakan data dari beberapa individu sama yang diamati dalam kurun waktu tertentu. Data panel memiliki tiga jenis data, yaitu cross section, pooled cross section, dan panel. Jenis yang akan kita gunakan untuk case study ini adalah panel data. Panel data merupakan jenis data yang mengamati banyak subjek pada banyak titik atau periode waktu.

df <- read.csv('data_input/df_final_updated.csv')
head(df)
#>               Kabupaten Tahun persentase_kemiskinan  rls keluhan_kesehatan  tpt
#> 1     Kabupaten Pacitan  2019                 13.67 7.28             31.52 0.91
#> 2    Kabupaten Ponorogo  2019                  9.64 7.21             42.51 3.50
#> 3  Kabupaten Trenggalek  2019                 10.98 7.28             38.82 3.36
#> 4 Kabupaten Tulungagung  2019                  6.74 8.07             32.66 3.29
#> 5      Kabupaten Blitar  2019                  8.94 7.29             49.49 3.05
#> 6      Kabupaten Kediri  2019                 10.42 8.01             38.49 3.58
#>   kejahatan puskesmas
#> 1       108        26
#> 2       557        31
#> 3       518        23
#> 4       880        36
#> 5       481        24
#> 6      1159        40
glimpse(df)
#> Rows: 152
#> Columns: 8
#> $ Kabupaten             <chr> "Kabupaten Pacitan", "Kabupaten Ponorogo", "Kabu…
#> $ Tahun                 <int> 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, …
#> $ persentase_kemiskinan <dbl> 13.67, 9.64, 10.98, 6.74, 8.94, 10.42, 9.47, 9.4…
#> $ rls                   <dbl> 7.28, 7.21, 7.28, 8.07, 7.29, 8.01, 7.27, 6.22, …
#> $ keluhan_kesehatan     <dbl> 31.52, 42.51, 38.82, 32.66, 49.49, 38.49, 33.12,…
#> $ tpt                   <dbl> 0.91, 3.50, 3.36, 3.29, 3.05, 3.58, 3.70, 2.73, …
#> $ kejahatan             <int> 108, 557, 518, 880, 481, 1159, 2383, 312, 1776, …
#> $ puskesmas             <int> 26, 31, 23, 36, 24, 40, 38, 25, 54, 46, 25, 20, …

Deskripsi Data:

Workflow Panel Data

Sumber Gambar: DSS Algoritma - Unveiling Socio Demographic Pattern by Yusuf Rafsanjani

Sumber Gambar: DSS Algoritma - Unveiling Socio Demographic Pattern by Yusuf Rafsanjani

Check Balancing Data

1. Melihat frekuensi data berdasarkan index individu

table(df$Kabupaten)
#> 
#>   Kabupaten Bangkalan  Kabupaten Banyuwangi      Kabupaten Blitar 
#>                     4                     4                     4 
#>  Kabupaten Bojonegoro   Kabupaten Bondowoso      Kabupaten Gresik 
#>                     4                     4                     4 
#>      Kabupaten Jember     Kabupaten Jombang      Kabupaten Kediri 
#>                     4                     4                     4 
#>    Kabupaten Lamongan    Kabupaten Lumajang      Kabupaten Madiun 
#>                     4                     4                     4 
#>     Kabupaten Magetan      Kabupaten Malang   Kabupaten Mojokerto 
#>                     4                     4                     4 
#>     Kabupaten Nganjuk       Kabupaten Ngawi     Kabupaten Pacitan 
#>                     4                     4                     4 
#>   Kabupaten Pamekasan    Kabupaten Pasuruan    Kabupaten Ponorogo 
#>                     4                     4                     4 
#> Kabupaten Probolinggo     Kabupaten Sampang    Kabupaten Sidoarjo 
#>                     4                     4                     4 
#>   Kabupaten Situbondo     Kabupaten Sumenep  Kabupaten Trenggalek 
#>                     4                     4                     4 
#>       Kabupaten Tuban Kabupaten Tulungagung             Kota Batu 
#>                     4                     4                     4 
#>           Kota Blitar           Kota Kediri           Kota Madiun 
#>                     4                     4                     4 
#>           Kota Malang        Kota Mojokerto         Kota Pasuruan 
#>                     4                     4                     4 
#>      Kota Probolinggo         Kota Surabaya 
#>                     4                     4

Jika jumlah unit waktu sama untuk setiap individu, maka data disebut balanced panel.

2. Menggunakan is.pbalanced()

Data disebut balance jika tiap individu mempunyai jumlah periode waktu yang sama dan output dari fungsi is.pbalanced() adalah TRUE

is.pbalanced(df, # data
             index = c('Kabupaten', 'Tahun')) # indeks variabel
#> [1] TRUE

Penyesuaian Format Data

1. Membuat Panel Data Frame

#membuat pdata.frame
df_panel <- df %>% pdata.frame(index = c('Kabupaten', 'Tahun'))

#memeriksa struktur data
glimpse(df_panel)
#> Rows: 152
#> Columns: 8
#> $ Kabupaten             <fct> Kabupaten Bangkalan, Kabupaten Bangkalan, Kabupa…
#> $ Tahun                 <fct> 2019, 2020, 2021, 2022, 2019, 2020, 2021, 2022, …
#> $ persentase_kemiskinan <pseries> 18.90, 20.56, 21.57, 19.44, 7.52, 8.06, 8.07…
#> $ rls                   <pseries> 5.66, 5.95, 5.96, 5.97, 7.13, 7.16, 7.42, 7.…
#> $ keluhan_kesehatan     <pseries> 18.64, 17.73, 21.86, 12.82, 37.79, 39.59, 38…
#> $ tpt                   <pseries> 5.62, 8.77, 8.07, 8.05, 3.95, 5.34, 5.42, 5.…
#> $ kejahatan             <pseries> 514, 392, 935, 976, 564, 893, 1312, 2545, 48…
#> $ puskesmas             <pseries> 29, 31, 22, 22, 46, 46, 45, 45, 24, 24, 24, …

Aplikasi fungsi pdata.frame() mengubah tipe data yang dimasukan ke parameter index menjadi factor dan sisanya menjadi pseries

2. Memeriksa Dimensi Data

pdim(df_panel)
#> Balanced Panel: n = 38, T = 4, N = 152

Insight:

  • data panel sudah balanced
  • terdapat 38 index individu (n)
  • terdapat 4 index waktu (T)
  • total observasi sebanyak 152

Apabila data panel yang kita miliki tidak balance kita dapat melakukan balancing menggunakan fungsi make.pbalanced dengan parameter balance.type yang dapat diisi dengan 3 opsi berikut:

  1. fill : setiap kolom waktu yg hilang akan diberikan nilai NA
  2. shared.times : menggunakan informasi waktu yang ada pada seluruh individu
  3. shared.individuals : hanya menggunakan individu yang informasi waktunya lengkap

Pemeriksaan Missing Value

colSums(is.na(df_panel))
#>             Kabupaten                 Tahun persentase_kemiskinan 
#>                     0                     0                     0 
#>                   rls     keluhan_kesehatan                   tpt 
#>                     0                     0                     0 
#>             kejahatan             puskesmas 
#>                     0                     0

Exploratory Data Analysis

Ringkasan Data

summary(df_panel)
#>                 Kabupaten    Tahun    persentase_kemiskinan      rls        
#>  Kabupaten Bangkalan :  4   2019:38   Min.   : 3.790        Min.   : 4.550  
#>  Kabupaten Banyuwangi:  4   2020:38   1st Qu.: 7.438        1st Qu.: 6.973  
#>  Kabupaten Blitar    :  4   2021:38   Median :10.120        Median : 7.790  
#>  Kabupaten Bojonegoro:  4   2022:38   Mean   :10.741        Mean   : 8.017  
#>  Kabupaten Bondowoso :  4             3rd Qu.:13.285        3rd Qu.: 9.113  
#>  Kabupaten Gresik    :  4             Max.   :23.760        Max.   :11.670  
#>  (Other)             :128                                                   
#>  keluhan_kesehatan      tpt           kejahatan        puskesmas    
#>  Min.   :12.82     Min.   : 0.910   Min.   :  47.0   Min.   : 3.00  
#>  1st Qu.:26.19     1st Qu.: 3.640   1st Qu.: 391.8   1st Qu.:20.00  
#>  Median :32.37     Median : 4.815   Median : 695.0   Median :25.00  
#>  Mean   :32.49     Mean   : 5.018   Mean   : 918.8   Mean   :25.89  
#>  3rd Qu.:39.24     3rd Qu.: 6.035   3rd Qu.:1189.2   3rd Qu.:33.00  
#>  Max.   :61.88     Max.   :10.970   Max.   :8759.0   Max.   :65.00  
#> 
  • Persentase kemiskinan terendah di Jawa Tengah adalah 3.8% dan tertinggi adalah 23.7%.

Hubungan Antar Variabel

df_panel %>% 
  select(-c(Kabupaten, Tahun)) %>% 
  cor() %>% 
  ggcorrplot(type='lower', lab=TRUE)

  • variabel rls (rata-rata lama sekolah) berkorelasi negatif kuat (-0.81) dengan variabel persentase_kemiskinan.

Explorasi Socio demografi

Ada cukup banyak kabupaten dan kota di Provinsi Jawa Timur. Daerah Jawa Timur akan dibagi berdasarkan tlatah, yang artinya adalah kelompok masyarakat dengan ciri budaya yang sama, dan berasal dari satu sumber budaya yang sama untuk keperluan visualisasi.

Budayawan Universitas Jember, Ayu Sutarto (2004) mengatakan, wilayah Jatim terbagi ke dalam sepuluh tlatah atau kawasan kebudayaan. Tlatah kebudayaan besar ada empat, yakni Mataraman (bagian Barat), Arek (bagian Tengah), Madura Pulau (bagian Utara), dan Pandalungan (bagian Timur). Tlatah Mataraman pada bagian Barat cukup besar sehingga visualisasi coplot akan dibagi dua.

Coplot

Coplot atau conditioning plot adalah teknik visualisasi data yang digunakan untuk mengeksplorasi hubungan antara beberapa variabel dalam sebuah dataset. Dengan coplot, kita bisa melihat bagaimana hubungan antara dua variabel berubah ketika kondisi variabel ketiga atau lebih diubah.

Fungsi coplot() dengan parameter:

  • formula = target ~ index1 given index2
  • type = "l" untuk line dan "b" untuk point & line plot
  • data = dataset
  • rows = banyaknya baris panel plot yang dibuat
  • col = warna plot yang disajikan
Tlatah Utara
coplot(persentase_kemiskinan ~ Tahun|Kabupaten,
       type = "b",
       data = Utara,
       rows = 1,
       col = "darkblue",
       overlap = 0) 

Dari coplot di atas, daerah Utara Jawa Timur memiliki persentase kemiskinan yang relatif sama, kecuali Kabupaten Pamekasan. Dibandingkan dengan Kabupaten Bangkalan, Sampang, dan Sumenep, persentase kemiskinan Kabupaten Pamekasan per tahunnya berkisar di angka 14 sampai 15 persen. Tiap Kabupaten di daerah ini persentase kemiskinannya meningkat di tahun 2021, bertepatan dengan munculnya pandemi covid secara luas.

Tlatah Barat
coplot(persentase_kemiskinan ~ Tahun|Daerah,
       type = "b",
       data = Barat,
       rows = 1,
       col = "darkblue",
       overlap = 0) 

Dari coplot di atas, daerah Barat Jawa Timur memiliki persentase kemiskinan yang lebih variatif dibandingkan daerah Utara. Persentase Kemiskinan tertinggi ada di Kabupaten Ngawi, Kabupaten Pacitan, dan Kabupaten Tuban yaitu sebesar 14-16%. Persentase kemiskinan terendah ada pada Kota Madiun sebesar 4-5%.

  • Tlatah Barat atas
coplot(persentase_kemiskinan ~ Tahun|Daerah,
       type = "b",
       data = Barat_atas,
       rows = 1,
       col = "darkblue",
       overlap = 0) 

  • Tlatah Barat bawah
coplot(persentase_kemiskinan ~ Tahun|Daerah,
       type = "b",
       data = Barat_bawah,
       rows = 1,
       col = "darkblue",
       overlap = 0) 

##### Tlatah Tengah

coplot(persentase_kemiskinan ~ Tahun|Daerah,
       type = "b",
       data = Tengah,
       rows = 1,
       col = "darkred",
       overlap = 0) 

Dari coplot di atas, daerah Tengah Jawa Timur yang memiliki persentase kemiskinan tertinggi ada di Kabupaten Gresik sebesar 11-12%. Persentase kemiskinan terendah ada pada Kabupaten Sidoarjo dan Kota Surabaya sebesar 4-6%.

Tlatah Timur
coplot(persentase_kemiskinan ~ Tahun|Kabupaten,
       type = "b",
       data = Timur,
       rows = 1,
       col = "darkblue",
       overlap = 0) 

Dari coplot di atas, daerah Timur Jawa Timur yang memiliki persentase kemiskinan tertinggi ada di Kabupaten Probolinggo sebesar 15-19%. Persentase kemiskinan terendah ada pada Kabupaten Banyuwangi sebesar 7-8%.

Heterogenitas Persentase Kemiskinan

Heterogenitas antar Kabupaten/Kota

plotmeans( persentase_kemiskinan ~ Kabupaten, 
           data = df_panel, 
           main="Heterogenitas Persentase Kemiskinan antar Kabupaten/Kota")

Berdasarkan hasil visual diatas terlihat bahwa persentase kemiskinan antar Kabupaten/Kota cukup heterogen

Heterogenitas antar Waktu

plotmeans( persentase_kemiskinan ~ Tahun, 
           data = df_panel, 
           main="Heterogenitas Persentase Kemiskinan antar Tahun")

Berdasarkan hasil visual diatas terlihat bahwa persentase kemiskinan antar tahun cukup homogen karena range rata-rata hanya berkisar di 10-12% saja. Namun, perlu diperhatikan bahwa data di atas hanya ada pada rentang tahun 2019 sampai 2022.

Cross-Validation

#membuat data train
panel_train <- df_panel %>% filter(Tahun != 2022)

#membuat data test
panel_test <- df_panel %>% filter(Tahun %in% 2022)

Setelah dilakukan cross validation kita perlu memastikan kembali bahwa data train sudah balance dengan melakukan balancing

panel_train <- panel_train %>% 
  droplevels() %>%    # menghapus informasi waktu yang diambil sebagai data test (tahun 2022)
  make.pbalanced()    # melakukan balancing kembali

is.pbalanced(panel_train)
#> [1] TRUE

Pemeriksaan Asumsi Multikolinieritas

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

lm(formula=persentase_kemiskinan ~ .-Kabupaten - Tahun , 
   data=panel_train) %>% 
  vif()
#>               rls keluhan_kesehatan               tpt         kejahatan 
#>          2.168860          1.046675          1.713467          1.653455 
#>         puskesmas 
#>          1.854199

Tidak ada variable yang saling berkorelasi.

Penentuan Model Estimasi

Regresi Data Panel adalah gabungan antara data cross section dan data time series, dengan unit cross section yang sama diukur pada waktu yang berbeda. Jika kita memiliki T periode waktu (t = 1, 2, …, T) dan N jumlah individu (i = 1, 2, …, N), maka dengan data panel kita akan memiliki total unit observasi sebanyak NT.

\[y_{it} = \beta_0+\beta _{1t}*x_{1t}+u_{it}\]

dengan:

  • \(y_{it}\): variabel target
  • indeks \(i\): mendefinisikan individu, wilayah, kota, perlakuan dll.
  • indeks \(t\): mendefinisikan waktu
  • \(\beta_0\): intercept
  • \(\beta _{1t}*x_{1t}\): koefisien untuk variabel prediktor 1
  • \(u_{it}\): disturbance

berdasarkan model tersebut, indeks i adalah dimensi untuk cross sectional dan indeks t adalah dimensi untuk deret waktu. \(u_{it}\) adalah nilai yang menunjukkan heterogenitas antar cross sectional dan deret waktu di dalam mode, yang didefinisikan sebagai berikut:

\[u_{it} = \mu _i+\lambda _t+\upsilon _{it}\] dengan:

  • \(\mu _i\) : nilai heterogenitas individu (cross section) yang tidak dapat diamati
  • \(\lambda _t\) : nilai heterogenitas waktu yang tidak dapat diamati
  • \(\upsilon _{it}\) : nilai error sisaan

Pembuatan Model

Modeling akan menggunakan fungsi plm() dari package plm dengan parameter:

  • formula = Target ~ Prediktor
  • data = dataframe
  • index = c(“kolom_individu”,“kolom_waktu”)
  • model =
    • "pooling" : model CEM
    • "within" : model FEM
    • "random" : model REM

Model Gabungan (Common Effect Model)

# menyimpan formula regresi data panel
formula_kemiskinan <- persentase_kemiskinan ~ rls + keluhan_kesehatan + tpt + kejahatan + puskesmas

# membuat Common effect model 
cem <- plm(formula_kemiskinan, 
           data = panel_train,
           index = c("Kabupaten","Tahun"),
           model = "pooling")

cem
#> 
#> Model Formula: persentase_kemiskinan ~ rls + keluhan_kesehatan + tpt + kejahatan + 
#>     puskesmas
#> 
#> Coefficients:
#>       (Intercept)               rls keluhan_kesehatan               tpt 
#>       33.27113442       -2.64621286       -0.06500042        0.33032678 
#>         kejahatan         puskesmas 
#>       -0.00015692       -0.03173518

Model Pengaruh Tetap (Fixed Effect Model)

# membuat fixed effect model 
fem <- plm(formula_kemiskinan, 
           data = panel_train,
           index = c("Kabupaten","Tahun"),
           model = "within")

fem
#> 
#> Model Formula: persentase_kemiskinan ~ rls + keluhan_kesehatan + tpt + kejahatan + 
#>     puskesmas
#> 
#> Coefficients:
#>               rls keluhan_kesehatan               tpt         kejahatan 
#>        1.77282957       -0.00726788        0.18677014        0.00018468 
#>         puskesmas 
#>       -0.06282426

Uji Chow

Memilih model terbaik antara Common Effect Model dengan Fixed Effect Model dapat menggunakan Uji Chow dengan fungsi pooltest().

Hipotesis yang diuji:

  • \(H_0\) : Model gabungan/Common Effect Model
  • \(H_1\) : Model pengaruh tetap/Fixed Effect Model

\(H_0\) ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.

pooltest(cem,fem)
#> 
#>  F statistic
#> 
#> data:  formula_kemiskinan
#> F = 151.3, df1 = 37, df2 = 71, p-value < 0.00000000000000022
#> alternative hypothesis: unstability

p-value (0.005365) < α (0.05) maka \(H_0\) ditolak.

Kesimpulan: Model terbaik untuk data persentase kemiskinan di Jawa Timur adalah model Fixed Effect.

Langkah selanjutnya yang akan dilakukan ketika model terbaik bertipe Fixed Effect adalah membuat model Random Effect.

Model Pengaruh Acak (Random Effect Model)

rem <- plm(formula_kemiskinan, 
           data = panel_train,
           index = c("Kabupaten","Tahun"),
           model = "random")
rem
#> 
#> Model Formula: persentase_kemiskinan ~ rls + keluhan_kesehatan + tpt + kejahatan + 
#>     puskesmas
#> 
#> Coefficients:
#>       (Intercept)               rls keluhan_kesehatan               tpt 
#>       20.26735116       -1.07663925       -0.03488627        0.29967712 
#>         kejahatan         puskesmas 
#>        0.00022021       -0.05205995

Uji Hausman

Pemilihan model terbaik antara Fixed Effect Model dengan Random Effect Model dapat ditentukan dengan Uji Hausman dengan fungsi phtest(). Pada dasarnya test ini menguji apakah unique errors/disturbance \(u_{it}\) berkorelasi dengan regresi, hipotesis nolnya adalah tidak.

Hipotesis yang diuji:

  • H0 : Model pengaruh acak/Random Effect Model
  • H1 : Model pengaruh tetap/Fixed Effect Model

Tolak \(H_0\) jika P-value < α. Nilai α yang digunakan sebesar 5%.

phtest(rem,fem)
#> 
#>  Hausman Test
#> 
#> data:  formula_kemiskinan
#> chisq = 183.59, df = 5, p-value < 0.00000000000000022
#> alternative hypothesis: one model is inconsistent

p-value (0.3308) > α (0.05) maka gagal tolak \(H_0\).

Kesimpulan: Model terbaik untuk data persentase kemiskinan di Jawa Timur adalah model Random Effect.

Langkah selanjutnya yang akan dilakukan ketika model terbaik bertipe Random Effect adalah uji Lagrange Multiplier.

Uji Lagrange Multiplier

Uji LM memutuskan antara random effect model dan regresi OLS sederhana. Hipotesis nol dalam uji LM adalah varians antar entitas bernilai nol. Artinya, tidak ada perbedaan signifikan antar unit (yaitu tidak ada efek panel).

Pemeriksaan Pengaruh Individu & Waktu

Hipotesis yang diuji adalah sebagai berikut.

  • H0 : Tidak ada pengaruh individu & waktu
  • H1 : Ada pengaruh individu & waktu
plmtest(rem, 
        effect = "twoways",
        type = "bp")
#> 
#>  Lagrange Multiplier Test - two-ways effects (Breusch-Pagan)
#> 
#> data:  formula_kemiskinan
#> chisq = 101.35, df = 2, p-value < 0.00000000000000022
#> alternative hypothesis: significant effects

p-value (0.03074) > α (0.05) maka tolak \(H_0\).

Kesimpulan: Ada pengaruh individu & waktu. Karena hasil uji LM menunjukkan bahwa ada pengaruh individu dan waktu, kita tidak dapat menggunakan model regresi OLS sederhana. Sehingga perlu dipastikan:

Pemeriksaan Pengaruh Individu

Hipotesis yang diuji adalah sebagai berikut.

  • H0 : Tidak ada pengaruh individu
  • H1 : Ada pengaruh individu

Pemeriksaan Pengaruh Waktu

Hipotesis yang diuji adalah sebagai berikut.

  • H0 : Tidak ada pengaruh waktu
  • H1 : Ada pengaruh waktu

Jika uji pengaruh individu signifikan (p-value < 0.05): Ada pengaruh individu yang signifikan, dan model efek individu harus dipertimbangkan.

Jika uji pengaruh waktu signifikan (p-value < 0.05): Ada pengaruh waktu yang signifikan, dan model efek waktu harus dipertimbangkan.

plmtest(rem, 
        effect = "time",
        type = "bp")
#> 
#>  Lagrange Multiplier Test - time effects (Breusch-Pagan)
#> 
#> data:  formula_kemiskinan
#> chisq = 1.2063, df = 1, p-value = 0.2721
#> alternative hypothesis: significant effects
plmtest(rem, 
        effect = "individual",
        type = "bp")
#> 
#>  Lagrange Multiplier Test - (Breusch-Pagan)
#> 
#> data:  formula_kemiskinan
#> chisq = 100.14, df = 1, p-value < 0.00000000000000022
#> alternative hypothesis: significant effects

Ada efek individu tapi tidak ada efek waktu.

Final Model: Random Effect - Individual

Jika kesimpulan menunjukkan bahwa ada efek individu tetapi tidak ada efek waktu, langkah berikutnya adalah memilih model yang paling sesuai untuk analisis data panel berdasarkan hasil tersebut yaitu, model efek acak individual (random effects individual) .

rem_ind <- plm(formula_kemiskinan, 
           data = panel_train,
           index = c("Kabupaten","Tahun"),
           model = "random",
           effect = "individual")

Pengujian Asumsi

Normalitas

Model diharapkan menghasilkan error yang berdistribusi normal dan error lebih banyak berkumpul di sekitar angka nol.

Hipotesis yang diuji:

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

Tolak \(H_0\) jika P-value < α. Nilai α yang digunakan sebesar 5%.

# your code here
rem_ind$residuals %>% shapiro.test()
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  .
#> W = 0.95081, p-value = 0.0003665

p-value (0.00036) < 0.05, maka tolak \(H_0\).

Kesimpulan: residual/sisaan tidak menyebar normal.

Homogenitas

Diharapkan error yang dihasilkan oleh model menyebar secara acak atau dapat dikatakan variasi konstan.

Hipotesis yang diuji:

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

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

# your code here
rem_ind %>% bptest()
#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  .
#> BP = 15.377, df = 5, p-value = 0.008868

p-value (0.0088) < 0.05, maka tolak \(H_0\).

Kesimpulan: residual/sisaan tidak memiliki ragam homogen.

Autokorelasi

Hipotesis yang diuji:

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

Tolak \(H_0\) jika P-value < α. Nilai α yang digunakan sebesar 5%.

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

p-value (0.2291) > 0.05, maka gagal tolak \(H_0\).

Kesimpulan: tidak ada autokorelasi pada residual/sisaan.

Interpretasi Model

1. Koefisien

summary(rem_ind)
#> Oneway (individual) effect Random Effect Model 
#>    (Swamy-Arora's transformation)
#> 
#> Call:
#> plm(formula = formula_kemiskinan, data = panel_train, effect = "individual", 
#>     model = "random", index = c("Kabupaten", "Tahun"))
#> 
#> Balanced Panel: n = 38, T = 3, N = 114
#> 
#> Effects:
#>                  var std.dev share
#> idiosyncratic 0.1276  0.3572 0.018
#> individual    7.1437  2.6728 0.982
#> theta: 0.9231
#> 
#> Residuals:
#>      Min.   1st Qu.    Median   3rd Qu.      Max. 
#> -1.103914 -0.286635 -0.036705  0.226596  1.860703 
#> 
#> Coefficients:
#>                      Estimate  Std. Error z-value         Pr(>|z|)    
#> (Intercept)       20.26735116  2.98800039  6.7829 0.00000000001178 ***
#> rls               -1.07663925  0.32490202 -3.3137        0.0009206 ***
#> keluhan_kesehatan -0.03488627  0.00779444 -4.4758 0.00000761288742 ***
#> tpt                0.29967712  0.05532196  5.4170 0.00000006061938 ***
#> kejahatan          0.00022021  0.00018860  1.1676        0.2429623    
#> puskesmas         -0.05205995  0.03223509 -1.6150        0.1063088    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Total Sum of Squares:    40.9
#> Residual Sum of Squares: 25.193
#> R-Squared:      0.38404
#> Adj. R-Squared: 0.35552
#> Chisq: 67.3358 on 5 DF, p-value: 0.00000000000036694

Interpretasi:

  • Variabel yang signifikan mempengaruhi persentase kemiskinan masyarakat Jawa Timur di tahun 2019 - 2022 adalah:

    • Rata-rata lama sekolah (rls)
    • Persentase penduduk yang mempunyai keluhan kesehatan selama sebulan terakhir (keluhan_kesehatan)
    • Tingkat pengangguran terbuka (tpt)
  • persentase kemiskinan masyarakat di suatu kabupaten/kota di Jawa Timur akan berkurang sebesar 1.0767 untuk setiap kenaikan 1 satuan rerata lama sekolah (rls), dengan catatan variabel lainnya bernilai tetap.

  • persentase kemiskinan masyarakat di suatu kabupaten/kota di Jawa Timur akan bertambah sebesar 0.2997 untuk setiap kenaikan 1 satuan tingkat pengangguran terbuka (tpt), dengan catatan variabel lainnya bernilai tetap.

2. Mengekstrak informasi Efek dari model Random

Untuk mengekstrak informasi efek dari model FEM kita dapat menggunakan fungsi fixef(model fem, effect="twoways"),

ranef(rem_ind)
#>   Kabupaten Bangkalan  Kabupaten Banyuwangi      Kabupaten Blitar 
#>            6.06676612           -2.52727503           -1.37782432 
#>  Kabupaten Bojonegoro   Kabupaten Bondowoso      Kabupaten Gresik 
#>            2.24558226            1.48321469            1.85398964 
#>      Kabupaten Jember     Kabupaten Jombang      Kabupaten Kediri 
#>           -1.30575393           -0.11803453            1.04396061 
#>    Kabupaten Lamongan    Kabupaten Lumajang      Kabupaten Madiun 
#>            3.17937471           -2.43959033            0.24025942 
#>     Kabupaten Magetan      Kabupaten Malang   Kabupaten Mojokerto 
#>           -0.18965571           -1.07614072            0.02308443 
#>     Kabupaten Nganjuk       Kabupaten Ngawi     Kabupaten Pacitan 
#>            0.31849274            3.33252700            3.89114381 
#>   Kabupaten Pamekasan    Kabupaten Pasuruan    Kabupaten Ponorogo 
#>            2.67052606           -2.27698276           -0.69114706 
#> Kabupaten Probolinggo     Kabupaten Sampang    Kabupaten Sidoarjo 
#>            6.16965191            8.87431817           -3.99148733 
#>   Kabupaten Situbondo     Kabupaten Sumenep  Kabupaten Trenggalek 
#>           -0.25801347            7.33159001            0.41781199 
#>       Kabupaten Tuban Kabupaten Tulungagung             Kota Batu 
#>            4.26828827           -2.74048711           -6.80391966 
#>           Kota Blitar           Kota Kediri           Kota Madiun 
#>           -2.17412092           -2.25388329           -3.96238555 
#>           Kota Malang        Kota Mojokerto         Kota Pasuruan 
#>           -5.62832180           -3.34079130           -3.79083229 
#>      Kota Probolinggo         Kota Surabaya 
#>           -3.93908430           -2.52485044

Interpretasi:

  • persentase kemiskinan masyarakat di Kota Surabaya adalah sebesar -2.525 apabila tidak terdapat informasi lainnya
  • persentase kemiskinan masyarakat di Kabupaten Probolinggo adalah sebesar nilai intercept + 6.170 apabila tidak terdapat informasi lainnya

Formula model:

\[y_{it} = \beta_0+\beta _{1t}*x_{1t}+u_{it}\]

\[y_{Surabaya} = 20.26 -1.077*rls -0.034 * keluhan \ kesehatan + 0.299 * tpt + 0.0002*kejahatan -0.052 * puskesmas -2.52\] Interpretasi:

  • Persentase kemiskinan di Jawa Timur tanpa ada variabel prediktor adalah sebesar 20.26 persen.

  • Persentase kemiskinan di Surabaya tanpa ada variabel prediktor adalah sebesar 20.26 - 2.52 = 17.74 persen.

Prediksi & Evaluasi

Mengukur kinerja model menggunakan data test

pred <- predict(rem_ind, # model akhir
                panel_test, # data test
                na.fill = F)
pred
#>   Kabupaten Bangkalan-2022  Kabupaten Banyuwangi-2022 
#>                  14.874580                  10.343529 
#>      Kabupaten Blitar-2022  Kabupaten Bojonegoro-2022 
#>                  10.741729                  11.162106 
#>   Kabupaten Bondowoso-2022      Kabupaten Gresik-2022 
#>                  12.146252                  10.103967 
#>      Kabupaten Jember-2022     Kabupaten Jombang-2022 
#>                  11.224369                   9.575512 
#>      Kabupaten Kediri-2022    Kabupaten Lamongan-2022 
#>                  10.465037                  10.941102 
#>    Kabupaten Lumajang-2022      Kabupaten Madiun-2022 
#>                  12.561895                  11.024209 
#>     Kabupaten Magetan-2022      Kabupaten Malang-2022 
#>                  10.264639                  11.016570 
#>   Kabupaten Mojokerto-2022     Kabupaten Nganjuk-2022 
#>                   9.712950                  11.328771 
#>       Kabupaten Ngawi-2022     Kabupaten Pacitan-2022 
#>                  10.763153                  10.193131 
#>   Kabupaten Pamekasan-2022    Kabupaten Pasuruan-2022 
#>                  11.385377                  11.681246 
#>    Kabupaten Ponorogo-2022 Kabupaten Probolinggo-2022 
#>                   9.981076                  12.178425 
#>     Kabupaten Sampang-2022    Kabupaten Sidoarjo-2022 
#>                  13.221122                   9.875164 
#>   Kabupaten Situbondo-2022     Kabupaten Sumenep-2022 
#>                  12.112282                  12.341440 
#>  Kabupaten Trenggalek-2022       Kabupaten Tuban-2022 
#>                  11.128117                  10.904946 
#> Kabupaten Tulungagung-2022             Kota Batu-2022 
#>                  10.655496                  11.004521 
#>           Kota Blitar-2022           Kota Kediri-2022 
#>                   9.238474                   8.977159 
#>           Kota Madiun-2022           Kota Malang-2022 
#>                   8.775816                  10.098492 
#>        Kota Mojokerto-2022         Kota Pasuruan-2022 
#>                   9.019450                  10.048666 
#>      Kota Probolinggo-2022         Kota Surabaya-2022 
#>                   9.989276                   9.378260

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

  • y_pred = nilai hasil prediksi
  • y_true = nilai target asli
# your code here
MAPE(y_pred = pred,
     y_true = panel_test$persentase_kemiskinan)
#> [1] 0.3455725

Insight: tingkat kesalahan prediski model fem dalam memprediksi nilai baru adalah sebesar 34.56%. Angka sekian cukup besar jika kita bandingkan dengan industry standard threshold, yaitu di bawah 10%, sehingga model kurang baik dalam memprediksi data yang baru.

Kesimpulan dan Rekomendasi

Kesimpulan

Berdasarkan analisis yang dilakukan, didapatkan bahwa model terbaik untuk memprediksi persentase kemiskinan di Provinsi Jawa Timur adalah model Random Effect dengan efek individu. Beberapa poin penting yang dapat disimpulkan dari analisis ini adalah:

  • Variabel yang paling signifikan mempengaruhi persentase kemiskinan adalah rata-rata lama sekolah (rls) dan tingkat pengangguran terbuka (tpt).
  • Daerah dengan persentase kemiskinan tertinggi dan terendah dapat diidentifikasi dengan jelas berdasarkan tlatah atau kawasan kebudayaan.
  • Model Random Effect dengan efek individu adalah model final dengan MAPE yang besar sehingga akan lebih baik mencoba dengan data yang lebih banyak.

Rekomendasi

  • Peningkatan Rata-rata Lama Sekolah (rls): Upaya peningkatan akses dan kualitas pendidikan di daerah-daerah dengan persentase kemiskinan tinggi dapat menjadi prioritas.
  • Penanganan Pengangguran: Program-program yang dapat menurunkan tingkat pengangguran terbuka (tpt) seperti pelatihan kerja dan penciptaan lapangan kerja baru perlu ditingkatkan.
  • Penelitian Lanjutan: Diperlukan penelitian lebih lanjut dengan menggunakan data yang lebih luas dan variabel-variabel tambahan untuk mengidentifikasi faktor-faktor lain yang mungkin mempengaruhi tingkat kemiskinan.

Dengan menggunakan data panel dan metode yang tepat, analisis ini dapat membantu pengambilan keputusan yang lebih baik dalam upaya mengurangi tingkat kemiskinan di Provinsi Jawa Timur.

Referensi