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>
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
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
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
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
%>%
kemiskinan_sulawesi select(-Provinsi, -Tahun) %>%
cor() %>%
ggcorrplot(type = "lower", lab = TRUE)
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. Heterogenitas Antar Indidvidu
plotmeans(
~ Provinsi,
Kemiskinan_persen data = kemiskinan_sulawesi,
main="Heterogenitas Kemiskinan antar Provinsi")
dari grafik di atas disimpulkan data individu memiliki
heterogenitas.
2. Heterogenitas Antar Waktu
plotmeans(
~ Tahun,
Kemiskinan_persen data = kemiskinan_sulawesi,
main="Heterogenitas Kemiskinan antar Tahun")
dari grafik di atas disimpulkan data tahun memiliki heterogenitas.
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.
#membuat data train
<- kemiskinan_sulawesi %>% filter(Tahun != 2023)
poor_train
#membuat data test
<- kemiskinan_sulawesi %>% filter(Tahun == 2023)
poor_test
#memastikan kembali bahwa data train sudah balance dengan melakukan balancing
<-
poor_train %>%
poor_train droplevels() %>%
make.pbalanced()
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
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 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)
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.
Normalitas
Hipotesis yang diuji adalah sebagai berikut.
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
$residuals %>% shapiro.test() fem
##
## 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 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
%>% bptest() fem
##
## 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 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
$residuals %>% Box.test(type = "Ljung-Box") fem
##
## 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.
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
<- predict(fem, poor_test, na.fill = F) pred
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:
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.