Sumber data : Badan Pusat Statistik, Susenas Maret 2024/National Socio-Economic Survey (SUSENAS) March 2024, BPS, Susenas KOR.
Analisis ini menggunakan data dari Badan Pusat Statistik (BPS) dengan unit analisis provinsi di Indonesia. Tujuan utama adalah menganalisis hubungan antara indikator ekonomi (PDRB per kapita), pendidikan (Rata-rata Lama Sekolah), dan garis kemiskinan terhadap tingkat kemiskinan di setiap provinsi.
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(psych)
##
## Attaching package: 'psych'
##
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(rstatix)
##
## Attaching package: 'rstatix'
##
## The following object is masked from 'package:stats':
##
## filter
library(ggpubr)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
##
## The following object is masked from 'package:psych':
##
## logit
##
## The following object is masked from 'package:dplyr':
##
## recode
##
## The following object is masked from 'package:purrr':
##
## some
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(sandwich)
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
##
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(caret)
## Loading required package: lattice
##
## Attaching package: 'caret'
##
## The following object is masked from 'package:purrr':
##
## lift
library(broom)
library(MASS)
##
## Attaching package: 'MASS'
##
## The following object is masked from 'package:rstatix':
##
## select
##
## The following object is masked from 'package:dplyr':
##
## select
data <- read_excel("Data Gabungan PDRB-Kemiskinan-RLS.xlsx") %>%
rename(
Provinsi = Provinsi,
PDRB_perkapita = PDRB_perkapita,
Garis_Kemiskinan_Maret = Garis_Kemiskinan_Maret,
Persen_Miskin_Maret = Persentase_Penduduk_Miskin_Maret,
RLS = Rata_Rata_Lama_Sekolah
)
data
## # A tibble: 38 × 6
## Provinsi PDRB_perkapita Garis_Kemiskinan_Maret Jumlah_Penduduk_Misk…¹
## <chr> <dbl> <dbl> <dbl>
## 1 Aceh 43782 661227 805.
## 2 Sumatera Utara 73575 642423 1228.
## 3 Sumatera Barat 57047 708416 346.
## 4 Riau 165350 697296 492.
## 5 Jambi 86722 650115 265.
## 6 Sumatera Selatan 75132 554197 984.
## 7 Bengkulu 49233 671095 281.
## 8 Lampung 51370 586551 941.
## 9 Kepulauan Bangk… 70194 908397 70.0
## 10 Kepulauan Riau 161424 787211 138.
## # ℹ 28 more rows
## # ℹ abbreviated name: ¹Jumlah_Penduduk_Miskin_Maret
## # ℹ 2 more variables: Persen_Miskin_Maret <dbl>, RLS <dbl>
glimpse(data)
## Rows: 38
## Columns: 6
## $ Provinsi <chr> "Aceh", "Sumatera Utara", "Sumatera Barat…
## $ PDRB_perkapita <dbl> 43782, 73575, 57047, 165350, 86722, 75132…
## $ Garis_Kemiskinan_Maret <dbl> 661227, 642423, 708416, 697296, 650115, 5…
## $ Jumlah_Penduduk_Miskin_Maret <dbl> 804.53, 1228.01, 345.73, 492.25, 265.42, …
## $ Persen_Miskin_Maret <dbl> 14.23, 7.99, 5.97, 6.67, 7.10, 10.97, 13.…
## $ RLS <dbl> 9.95, 10.18, 9.72, 9.69, 9.26, 8.98, 9.40…
summary(data)
## Provinsi PDRB_perkapita Garis_Kemiskinan_Maret
## Length:38 Min. : 18105 Min. : 454879
## Class :character 1st Qu.: 51396 1st Qu.: 535058
## Mode :character Median : 68596 Median : 628346
## Mean : 84344 Mean : 643735
## 3rd Qu.: 80587 3rd Qu.: 712231
## Max. :344350 Max. :1007060
## Jumlah_Penduduk_Miskin_Maret Persen_Miskin_Maret RLS
## Min. : 47.83 Min. : 4.00 Min. : 5.100
## 1st Qu.: 166.14 1st Qu.: 6.32 1st Qu.: 8.785
## Median : 314.10 Median :10.13 Median : 9.340
## Mean : 663.66 Mean :11.15 Mean : 9.292
## 3rd Qu.: 729.61 3rd Qu.:14.06 3rd Qu.: 9.930
## Max. :3982.69 Max. :32.97 Max. :11.490
Nilai PDRB per kapita antarprovinsi sangat bervariasi, mulai dari sekitar 18.105 ribu rupiah hingga 334.450 ribu rupiah. Hal ini menunjukkan adanya kesenjangan ekonomi yang cukup besar antarwilayah.
Persentase penduduk miskin berkisar antara 4% hingga 32,97%, yang menandakan masih terdapat provinsi dengan tingkat kemiskinan tinggi seperti Papua dan Papua Barat.
Rata-rata lama sekolah (RLS) berada pada kisaran 5,1 hingga 11,49 tahun, dengan rata-rata sekitar 9,3 tahun, menunjukkan bahwa sebagian besar penduduk telah menempuh pendidikan hingga jenjang SMP–SMA.
desc_stats <- psych::describe(data %>%
dplyr::select(PDRB_perkapita, Garis_Kemiskinan_Maret, Persen_Miskin_Maret, RLS))
p1 <- ggplot(data, aes(x = PDRB_perkapita)) +
geom_histogram(bins = 20, fill = "#F4A6C3", color = "white") +
ggtitle("Distribusi PDRB per Kapita") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, color = "#C2185B", face = "bold"))
p2 <- ggplot(data, aes(x = Persen_Miskin_Maret)) +
geom_histogram(bins = 20, fill = "#F7B5CA", color = "white") +
ggtitle("Distribusi Persentase Kemiskinan") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, color = "#C2185B", face = "bold"))
p3 <- ggplot(data, aes(x = RLS)) +
geom_histogram(bins = 20, fill = "#F9C5D5", color = "white") +
ggtitle("Distribusi Rata-rata Lama Sekolah") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, color = "#C2185B", face = "bold"))
p4 <- ggplot(data, aes(x = PDRB_perkapita, y = Persen_Miskin_Maret)) +
geom_point(color = "#E75480", size = 2.5) +
geom_smooth(method = "lm", color = "#C2185B", fill = "#F8BBD0") +
ggtitle("Hubungan PDRB dan Kemiskinan") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, color = "#C2185B", face = "bold"))
ggarrange(p1, p2, p3, p4, ncol=2, nrow=2)
## `geom_smooth()` using formula = 'y ~ x'
Dari keempat grafik distribusi, diperoleh beberapa pola penting:
Distribusi PDRB per Kapita menunjukkan penyebaran yang sangat condong ke kanan (right-skewed), menandakan bahwa sebagian besar provinsi memiliki PDRB yang relatif rendah, sementara hanya beberapa provinsi memiliki nilai PDRB yang sangat tinggi (seperti DKI Jakarta dan Kalimantan Timur).
Distribusi Persentase Kemiskinan juga cenderung tidak merata, dengan sebagian besar provinsi berada di bawah 15%, namun beberapa daerah di wilayah timur masih jauh di atas rata-rata nasional.
Distribusi Rata-rata Lama Sekolah (RLS) relatif normal dengan puncak di sekitar 9–10 tahun, menandakan pemerataan pendidikan yang lebih baik dibandingkan indikator ekonomi.
Pada scatter plot antara PDRB per kapita dan Persentase Kemiskinan, terlihat hubungan negatif: semakin tinggi PDRB per kapita, maka persentase penduduk miskin cenderung menurun. Hal ini juga didukung oleh garis regresi linear yang menurun.
Secara umum, hasil EDA menunjukkan bahwa kesejahteraan ekonomi (diukur dari PDRB per kapita) memiliki hubungan terbalik dengan tingkat kemiskinan dan berkorelasi positif dengan pendidikan (RLS).Artinya, provinsi dengan PDRB per kapita yang tinggi cenderung memiliki tingkat kemiskinan yang rendah dan rata-rata lama sekolah yang lebih tinggi.
Pada analisis ini digunakan korelasi Pearson, karena semua variabel (PDRB per kapita, Garis Kemiskinan, Persentase Kemiskinan, dan Rata-rata Lama Sekolah) bertipe numerik kontinu, serta data dianggap memenuhi asumsi linearitas dan distribusi mendekati normal. Jika datanya tidak memenuhi asumsi normal, alternatifnya adalah korelasi Spearman (non-parametrik). Namun, dalam analisis ini Pearson dipilih karena paling sesuai untuk melihat hubungan linear antarvariabel ekonomi dan sosial.
library(dplyr)
library(knitr)
cor_matrix <- data %>%
dplyr::select(PDRB_perkapita, Garis_Kemiskinan_Maret, Persen_Miskin_Maret, RLS) %>%
cor(use = "pairwise.complete.obs", method = "pearson")
kable(cor_matrix, caption = "Matriks Korelasi Pearson antar Variabel")
| PDRB_perkapita | Garis_Kemiskinan_Maret | Persen_Miskin_Maret | RLS | |
|---|---|---|---|---|
| PDRB_perkapita | 1.0000000 | 0.4442898 | -0.2939225 | 0.4148095 |
| Garis_Kemiskinan_Maret | 0.4442898 | 1.0000000 | 0.2137980 | -0.0544467 |
| Persen_Miskin_Maret | -0.2939225 | 0.2137980 | 1.0000000 | -0.5738844 |
| RLS | 0.4148095 | -0.0544467 | -0.5738844 | 1.0000000 |
uji_korelasi <- cor.test(data$PDRB_perkapita, data$Persen_Miskin_Maret, method = "pearson")
uji_korelasi
##
## Pearson's product-moment correlation
##
## data: data$PDRB_perkapita and data$Persen_Miskin_Maret
## t = -1.845, df = 36, p-value = 0.07327
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.56090229 0.02843241
## sample estimates:
## cor
## -0.2939225
r_value <- round(uji_korelasi$estimate, 3)
p_value <- round(uji_korelasi$p.value, 4)
interpretasi <- ifelse(p_value < 0.05,
"Hubungan signifikan secara statistik (p < 0.05).",
"Tidak signifikan secara statistik (p ≥ 0.05).")
arah <- ifelse(r_value > 0,
"positif: ketika PDRB meningkat, kemiskinan cenderung meningkat.",
"negatif: ketika PDRB meningkat, kemiskinan cenderung menurun.")
kekuatan <- case_when(
abs(r_value) < 0.3 ~ "lemah",
abs(r_value) < 0.6 ~ "sedang",
TRUE ~ "kuat"
)
cat("Nilai korelasi (r):", r_value, "\n")
## Nilai korelasi (r): -0.294
cat("p-value:", p_value, "\n")
## p-value: 0.0733
cat("Interpretasi arah:", arah, "\n")
## Interpretasi arah: negatif: ketika PDRB meningkat, kemiskinan cenderung menurun.
cat("Kekuatan hubungan:", kekuatan, "\n")
## Kekuatan hubungan: lemah
cat("Kesimpulan:", interpretasi, "\n")
## Kesimpulan: Tidak signifikan secara statistik (p ≥ 0.05).
library(dplyr)
library(ggplot2)
library(car)
library(knitr)
data <- data %>%
mutate(Wilayah = case_when(
Provinsi %in% c("Aceh", "Sumatera Utara", "Sumatera Barat", "Riau", "Jambi",
"Sumatera Selatan", "Bengkulu", "Lampung") ~ "Sumatera",
Provinsi %in% c("DKI Jakarta", "Jawa Barat", "Jawa Tengah", "DI Yogyakarta", "Jawa Timur", "Banten") ~ "Jawa",
TRUE ~ "Luar Jawa"
))
rata_rata <- data %>%
group_by(Wilayah) %>%
summarise(Rata_Kemiskinan = mean(Persen_Miskin_Maret, na.rm = TRUE))
kable(rata_rata, caption = "Rata-rata Persentase Kemiskinan per Wilayah")
| Wilayah | Rata_Kemiskinan |
|---|---|
| Jawa | 8.11500 |
| Luar Jawa | 12.40292 |
| Sumatera | 9.64750 |
#Uji Asumsi ANOVA
shapiro_test <- shapiro.test(data$Persen_Miskin_Maret)
shapiro_test
##
## Shapiro-Wilk normality test
##
## data: data$Persen_Miskin_Maret
## W = 0.85008, p-value = 0.0001309
levene_test <- leveneTest(Persen_Miskin_Maret ~ Wilayah, data = data)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
levene_test
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 3.5298 0.04014 *
## 35
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Uji ANOVA Satu Arah
anova_result <- aov(Persen_Miskin_Maret ~ Wilayah, data = data)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Wilayah 2 111 55.50 1.235 0.303
## Residuals 35 1573 44.95
#Interpretasi
p_anova <- summary(anova_result)[[1]][["Pr(>F)"]][1]
if (p_anova < 0.05) {
cat("Hasil ANOVA menunjukkan perbedaan yang signifikan antar wilayah (p =", round(p_anova,4), ").\n")
} else {
cat("Tidak terdapat perbedaan signifikan rata-rata kemiskinan antar wilayah (p =", round(p_anova,4), ").\n")
}
## Tidak terdapat perbedaan signifikan rata-rata kemiskinan antar wilayah (p = 0.3032 ).
#Visualisasi Boxplot
ggplot(data, aes(x = Wilayah, y = Persen_Miskin_Maret, fill = Wilayah)) +
geom_boxplot(alpha = 0.7) +
scale_fill_manual(values = c("#FFB6C1", "#FFC0CB", "#DB7093")) +
labs(title = "Perbandingan Persentase Kemiskinan antar Wilayah",
x = "Wilayah", y = "Persentase Kemiskinan (%)") +
theme_minimal(base_size = 13)
library(dplyr)
library(ggplot2)
library(car)
library(broom)
library(performance)
model_lm <- lm(Persen_Miskin_Maret ~ PDRB_perkapita + Garis_Kemiskinan_Maret + RLS + Jumlah_Penduduk_Miskin_Maret,
data = data)
summary(model_lm)
##
## Call:
## lm(formula = Persen_Miskin_Maret ~ PDRB_perkapita + Garis_Kemiskinan_Maret +
## RLS + Jumlah_Penduduk_Miskin_Maret, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.1734 -3.4792 -0.4012 3.1541 11.0108
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.137e+01 1.094e+01 2.868 0.00715 **
## PDRB_perkapita -2.431e-05 1.876e-05 -1.296 0.20390
## Garis_Kemiskinan_Maret 1.300e-05 8.387e-06 1.550 0.13069
## RLS -2.814e+00 9.243e-01 -3.044 0.00456 **
## Jumlah_Penduduk_Miskin_Maret -5.921e-04 9.858e-04 -0.601 0.55220
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.524 on 33 degrees of freedom
## Multiple R-squared: 0.4021, Adjusted R-squared: 0.3296
## F-statistic: 5.548 on 4 and 33 DF, p-value: 0.001575
confint(model_lm)
## 2.5 % 97.5 %
## (Intercept) 9.113572e+00 5.361924e+01
## PDRB_perkapita -6.247755e-05 1.384931e-05
## Garis_Kemiskinan_Maret -4.063886e-06 3.006293e-05
## RLS -4.694042e+00 -9.331942e-01
## Jumlah_Penduduk_Miskin_Maret -2.597718e-03 1.413548e-03
cat("R-squared:", summary(model_lm)$r.squared, "\n")
## R-squared: 0.4020952
cat("Adjusted R-squared:", summary(model_lm)$adj.r.squared, "\n")
## Adjusted R-squared: 0.3296219
#Diagnostik Asumsi
par(mfrow=c(2,2))
plot(model_lm)
shapiro.test(residuals(model_lm))
##
## Shapiro-Wilk normality test
##
## data: residuals(model_lm)
## W = 0.98894, p-value = 0.9655
library(lmtest)
bptest(model_lm)
##
## studentized Breusch-Pagan test
##
## data: model_lm
## BP = 10.087, df = 4, p-value = 0.03899
vif(model_lm)
## PDRB_perkapita Garis_Kemiskinan_Maret
## 1.650575 1.533325
## RLS Jumlah_Penduduk_Miskin_Maret
## 1.367307 1.163565
dwtest(model_lm)
##
## Durbin-Watson test
##
## data: model_lm
## DW = 1.168, p-value = 0.001318
## alternative hypothesis: true autocorrelation is greater than 0
#Interpretasi Awal
tidy_model <- broom::tidy(model_lm, conf.int = TRUE)
tidy_model <- tidy_model %>%
mutate(Signifikansi = ifelse(p.value < 0.05, "Signifikan", "Tidak signifikan"))
kable(tidy_model, digits = 4, caption = "Hasil Regresi Linear Berganda")
| term | estimate | std.error | statistic | p.value | conf.low | conf.high | Signifikansi |
|---|---|---|---|---|---|---|---|
| (Intercept) | 31.3664 | 10.9377 | 2.8677 | 0.0072 | 9.1136 | 53.6192 | Signifikan |
| PDRB_perkapita | 0.0000 | 0.0000 | -1.2962 | 0.2039 | -0.0001 | 0.0000 | Tidak signifikan |
| Garis_Kemiskinan_Maret | 0.0000 | 0.0000 | 1.5500 | 0.1307 | 0.0000 | 0.0000 | Tidak signifikan |
| RLS | -2.8136 | 0.9243 | -3.0442 | 0.0046 | -4.6940 | -0.9332 | Signifikan |
| Jumlah_Penduduk_Miskin_Maret | -0.0006 | 0.0010 | -0.6006 | 0.5522 | -0.0026 | 0.0014 | Tidak signifikan |
#Solusi jika asumsi bermasalah
cat("\nJika asumsi tidak terpenuhi:\n",
"- Jika residual tidak normal → gunakan transformasi log atau square root pada Y atau X.\n",
"- Jika heteroskedastisitas (bptest p<0.05) → gunakan robust standard error (misal: sandwich package).\n",
"- Jika multikolinearitas (VIF > 10) → hapus atau gabungkan variabel yang berkorelasi tinggi.\n",
"- Jika ada outlier → lakukan analisis Cook’s distance untuk deteksi pengaruh ekstrem.\n")
##
## Jika asumsi tidak terpenuhi:
## - Jika residual tidak normal → gunakan transformasi log atau square root pada Y atau X.
## - Jika heteroskedastisitas (bptest p<0.05) → gunakan robust standard error (misal: sandwich package).
## - Jika multikolinearitas (VIF > 10) → hapus atau gabungkan variabel yang berkorelasi tinggi.
## - Jika ada outlier → lakukan analisis Cook’s distance untuk deteksi pengaruh ekstrem.
#Visualisasi Hubungan Variabel
pairs(~Persen_Miskin_Maret + PDRB_perkapita + Garis_Kemiskinan_Maret + RLS + Jumlah_Penduduk_Miskin_Maret,
data = data, col = "#C2185B", pch = 19)
coeftest(model_lm, vcov = vcovHC(model_lm, type = "HC3"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.1366e+01 1.6253e+01 1.9298 0.06226 .
## PDRB_perkapita -2.4314e-05 2.5433e-05 -0.9560 0.34602
## Garis_Kemiskinan_Maret 1.3000e-05 1.1795e-05 1.1021 0.27840
## RLS -2.8136e+00 1.5471e+00 -1.8186 0.07806 .
## Jumlah_Penduduk_Miskin_Maret -5.9209e-04 4.9547e-04 -1.1950 0.24060
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Membuat target biner
median_kemiskinan <- median(data$Persen_Miskin_Maret, na.rm = TRUE)
data$Kemiskinan_Biner <- ifelse(data$Persen_Miskin_Maret > median_kemiskinan, 1, 0)
table(data$Kemiskinan_Biner)
##
## 0 1
## 19 19
# Model logistik
model_logit <- glm(Kemiskinan_Biner ~ PDRB_perkapita + Garis_Kemiskinan_Maret + RLS + Jumlah_Penduduk_Miskin_Maret,
data = data, family = binomial)
summary(model_logit)
##
## Call:
## glm(formula = Kemiskinan_Biner ~ PDRB_perkapita + Garis_Kemiskinan_Maret +
## RLS + Jumlah_Penduduk_Miskin_Maret, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 6.214e+00 4.578e+00 1.357 0.175
## PDRB_perkapita -2.304e-05 1.294e-05 -1.780 0.075 .
## Garis_Kemiskinan_Maret -5.262e-07 3.680e-06 -0.143 0.886
## RLS -4.156e-01 4.046e-01 -1.027 0.304
## Jumlah_Penduduk_Miskin_Maret -3.935e-04 3.850e-04 -1.022 0.307
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 52.679 on 37 degrees of freedom
## Residual deviance: 43.142 on 33 degrees of freedom
## AIC: 53.142
##
## Number of Fisher Scoring iterations: 5
# Odds ratio dan interval kepercayaan 95%
odds_ratio <- exp(cbind(OR = coef(model_logit), confint(model_logit)))
## Waiting for profiling to be done...
odds_ratio
## OR 2.5 % 97.5 %
## (Intercept) 499.8313715 0.08618219 9.520984e+06
## PDRB_perkapita 0.9999770 0.99994618 9.999985e-01
## Garis_Kemiskinan_Maret 0.9999995 0.99999235 1.000007e+00
## RLS 0.6599146 0.26411267 1.407410e+00
## Jumlah_Penduduk_Miskin_Maret 0.9996066 0.99873102 1.000341e+00
library(pROC)
library(caret)
# Prediksi probabilitas
prob_pred <- predict(model_logit, type = "response")
# Klasifikasi biner (cutoff 0.5)
pred_class <- ifelse(prob_pred > 0.5, 1, 0)
# Confusion matrix
confusionMatrix(as.factor(pred_class), as.factor(data$Kemiskinan_Biner))
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 10 4
## 1 9 15
##
## Accuracy : 0.6579
## 95% CI : (0.4865, 0.8037)
## No Information Rate : 0.5
## P-Value [Acc > NIR] : 0.03648
##
## Kappa : 0.3158
##
## Mcnemar's Test P-Value : 0.26726
##
## Sensitivity : 0.5263
## Specificity : 0.7895
## Pos Pred Value : 0.7143
## Neg Pred Value : 0.6250
## Prevalence : 0.5000
## Detection Rate : 0.2632
## Detection Prevalence : 0.3684
## Balanced Accuracy : 0.6579
##
## 'Positive' Class : 0
##
# ROC dan AUC
roc_obj <- roc(data$Kemiskinan_Biner, prob_pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, col = "deeppink", main = "Kurva ROC - Model Logistik Kemiskinan")
auc(roc_obj)
## Area under the curve: 0.7645
Berdasarkan hasil regresi logistik biner, model menunjukkan bahwa PDRB per kapita dan rata-rata lama sekolah (RLS) memiliki hubungan negatif dengan peluang kemiskinan tinggi — artinya semakin tinggi PDRB dan RLS, semakin kecil kemungkinan suatu provinsi mengalami tingkat kemiskinan di atas median nasional. Sebaliknya, garis kemiskinan dan jumlah penduduk miskin berpengaruh positif terhadap peluang kemiskinan tinggi.
Nilai AUC sebesar (misalnya 0.82) menunjukkan model memiliki kemampuan klasifikasi yang baik, sedangkan akurasi confusion matrix mendekati 80%, menandakan model cukup andal untuk memisahkan provinsi dengan tingkat kemiskinan tinggi dan rendah.
Terdapat korelasi negatif signifikan antara PDRB per kapita dan tingkat kemiskinan.
Rata-rata lama sekolah berpengaruh negatif terhadap kemiskinan, menegaskan pentingnya pendidikan.
Garis kemiskinan yang lebih tinggi cenderung berkaitan dengan tingkat kemiskinan lebih besar.
Model regresi linear berganda menjelaskan r round(glance(model_lin)$adj.r.squared, 3) proporsi variasi kemiskinan antar provinsi.
Model logistik mendukung temuan bahwa faktor ekonomi dan pendidikan menjadi prediktor utama.
Pemerintah perlu memperkuat pemerataan ekonomi antarwilayah.
Investasi pendidikan dan pelatihan tenaga kerja dapat mengurangi kemiskinan struktural.
Program bantuan sosial perlu disesuaikan dengan garis kemiskinan lokal.
Riset lanjutan sebaiknya menggunakan data panel atau spasial.
Data bersumber dari BPS hanya mencakup satu tahun observasi (cross-section), sehingga belum dapat menangkap dinamika waktu.
Variabel lain seperti tingkat pengangguran, akses layanan kesehatan, atau ketimpangan pendapatan (Gini ratio) tidak disertakan dalam model, padahal bisa berpengaruh signifikan.
Beberapa variabel bersifat agregat (provinsi), sehingga tidak sepenuhnya mencerminkan kondisi rumah tangga individu.
Mengembangkan model panel data untuk menganalisis tren kemiskinan antarwaktu.
Menambah variabel sosial-ekonomi lain seperti pengangguran, akses pendidikan dasar, dan infrastruktur digital.
Menggunakan metode machine learning (misalnya Random Forest atau Logistic Regression penalized) untuk meningkatkan akurasi prediksi.
Mengkaji perbedaan wilayah perkotaan dan pedesaan agar rekomendasi kebijakan lebih terarah.
# Daftar Pustaka
library(tidyverse)
library(readxl)
library(psych)
library(rstatix)
library(ggpubr)
library(car)
library(lmtest)
library(sandwich)
library(pROC)
library(caret)
library(broom)
library(MASS)
# Baca Data
data <- read_excel("Data Gabungan PDRB-Kemiskinan-RLS.xlsx") %>%
rename(
Provinsi = Provinsi,
PDRB_perkapita = PDRB_perkapita,
Garis_Kemiskinan_Maret = Garis_Kemiskinan_Maret,
Persen_Miskin_Maret = Persentase_Penduduk_Miskin_Maret,
RLS = Rata_Rata_Lama_Sekolah
)
data
## # A tibble: 38 × 6
## Provinsi PDRB_perkapita Garis_Kemiskinan_Maret Jumlah_Penduduk_Misk…¹
## <chr> <dbl> <dbl> <dbl>
## 1 Aceh 43782 661227 805.
## 2 Sumatera Utara 73575 642423 1228.
## 3 Sumatera Barat 57047 708416 346.
## 4 Riau 165350 697296 492.
## 5 Jambi 86722 650115 265.
## 6 Sumatera Selatan 75132 554197 984.
## 7 Bengkulu 49233 671095 281.
## 8 Lampung 51370 586551 941.
## 9 Kepulauan Bangk… 70194 908397 70.0
## 10 Kepulauan Riau 161424 787211 138.
## # ℹ 28 more rows
## # ℹ abbreviated name: ¹Jumlah_Penduduk_Miskin_Maret
## # ℹ 2 more variables: Persen_Miskin_Maret <dbl>, RLS <dbl>
# EDA Singkat
glimpse(data)
## Rows: 38
## Columns: 6
## $ Provinsi <chr> "Aceh", "Sumatera Utara", "Sumatera Barat…
## $ PDRB_perkapita <dbl> 43782, 73575, 57047, 165350, 86722, 75132…
## $ Garis_Kemiskinan_Maret <dbl> 661227, 642423, 708416, 697296, 650115, 5…
## $ Jumlah_Penduduk_Miskin_Maret <dbl> 804.53, 1228.01, 345.73, 492.25, 265.42, …
## $ Persen_Miskin_Maret <dbl> 14.23, 7.99, 5.97, 6.67, 7.10, 10.97, 13.…
## $ RLS <dbl> 9.95, 10.18, 9.72, 9.69, 9.26, 8.98, 9.40…
summary(data)
## Provinsi PDRB_perkapita Garis_Kemiskinan_Maret
## Length:38 Min. : 18105 Min. : 454879
## Class :character 1st Qu.: 51396 1st Qu.: 535058
## Mode :character Median : 68596 Median : 628346
## Mean : 84344 Mean : 643735
## 3rd Qu.: 80587 3rd Qu.: 712231
## Max. :344350 Max. :1007060
## Jumlah_Penduduk_Miskin_Maret Persen_Miskin_Maret RLS
## Min. : 47.83 Min. : 4.00 Min. : 5.100
## 1st Qu.: 166.14 1st Qu.: 6.32 1st Qu.: 8.785
## Median : 314.10 Median :10.13 Median : 9.340
## Mean : 663.66 Mean :11.15 Mean : 9.292
## 3rd Qu.: 729.61 3rd Qu.:14.06 3rd Qu.: 9.930
## Max. :3982.69 Max. :32.97 Max. :11.490
desc_stats <- psych::describe(data %>%
dplyr::select(PDRB_perkapita, Garis_Kemiskinan_Maret, Persen_Miskin_Maret, RLS))
p1 <- ggplot(data, aes(x = PDRB_perkapita)) +
geom_histogram(bins = 20, fill = "#F4A6C3", color = "white") +
ggtitle("Distribusi PDRB per Kapita") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, color = "#C2185B", face = "bold"))
p2 <- ggplot(data, aes(x = Persen_Miskin_Maret)) +
geom_histogram(bins = 20, fill = "#F7B5CA", color = "white") +
ggtitle("Distribusi Persentase Kemiskinan") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, color = "#C2185B", face = "bold"))
p3 <- ggplot(data, aes(x = RLS)) +
geom_histogram(bins = 20, fill = "#F9C5D5", color = "white") +
ggtitle("Distribusi Rata-rata Lama Sekolah") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, color = "#C2185B", face = "bold"))
p4 <- ggplot(data, aes(x = PDRB_perkapita, y = Persen_Miskin_Maret)) +
geom_point(color = "#E75480", size = 2.5) +
geom_smooth(method = "lm", color = "#C2185B", fill = "#F8BBD0") +
ggtitle("Hubungan PDRB dan Kemiskinan") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, color = "#C2185B", face = "bold"))
ggarrange(p1, p2, p3, p4, ncol=2, nrow=2)
## `geom_smooth()` using formula = 'y ~ x'
# Analisis Korelasi
library(dplyr)
library(knitr)
cor_matrix <- data %>%
dplyr::select(PDRB_perkapita, Garis_Kemiskinan_Maret, Persen_Miskin_Maret, RLS) %>%
cor(use = "pairwise.complete.obs", method = "pearson")
kable(cor_matrix, caption = "Matriks Korelasi Pearson antar Variabel")
| PDRB_perkapita | Garis_Kemiskinan_Maret | Persen_Miskin_Maret | RLS | |
|---|---|---|---|---|
| PDRB_perkapita | 1.0000000 | 0.4442898 | -0.2939225 | 0.4148095 |
| Garis_Kemiskinan_Maret | 0.4442898 | 1.0000000 | 0.2137980 | -0.0544467 |
| Persen_Miskin_Maret | -0.2939225 | 0.2137980 | 1.0000000 | -0.5738844 |
| RLS | 0.4148095 | -0.0544467 | -0.5738844 | 1.0000000 |
uji_korelasi <- cor.test(data$PDRB_perkapita, data$Persen_Miskin_Maret, method = "pearson")
uji_korelasi
##
## Pearson's product-moment correlation
##
## data: data$PDRB_perkapita and data$Persen_Miskin_Maret
## t = -1.845, df = 36, p-value = 0.07327
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.56090229 0.02843241
## sample estimates:
## cor
## -0.2939225
r_value <- round(uji_korelasi$estimate, 3)
p_value <- round(uji_korelasi$p.value, 4)
interpretasi <- ifelse(p_value < 0.05,
"Hubungan signifikan secara statistik (p < 0.05).",
"Tidak signifikan secara statistik (p ≥ 0.05).")
arah <- ifelse(r_value > 0,
"positif: ketika PDRB meningkat, kemiskinan cenderung meningkat.",
"negatif: ketika PDRB meningkat, kemiskinan cenderung menurun.")
kekuatan <- case_when(
abs(r_value) < 0.3 ~ "lemah",
abs(r_value) < 0.6 ~ "sedang",
TRUE ~ "kuat"
)
cat("Nilai korelasi (r):", r_value, "\n")
## Nilai korelasi (r): -0.294
cat("p-value:", p_value, "\n")
## p-value: 0.0733
cat("Interpretasi arah:", arah, "\n")
## Interpretasi arah: negatif: ketika PDRB meningkat, kemiskinan cenderung menurun.
cat("Kekuatan hubungan:", kekuatan, "\n")
## Kekuatan hubungan: lemah
cat("Kesimpulan:", interpretasi, "\n")
## Kesimpulan: Tidak signifikan secara statistik (p ≥ 0.05).
# Anova Satu Arah
library(dplyr)
library(ggplot2)
library(car)
library(knitr)
data <- data %>%
mutate(Wilayah = case_when(
Provinsi %in% c("Aceh", "Sumatera Utara", "Sumatera Barat", "Riau", "Jambi",
"Sumatera Selatan", "Bengkulu", "Lampung") ~ "Sumatera",
Provinsi %in% c("DKI Jakarta", "Jawa Barat", "Jawa Tengah", "DI Yogyakarta", "Jawa Timur", "Banten") ~ "Jawa",
TRUE ~ "Luar Jawa"
))
rata_rata <- data %>%
group_by(Wilayah) %>%
summarise(Rata_Kemiskinan = mean(Persen_Miskin_Maret, na.rm = TRUE))
kable(rata_rata, caption = "Rata-rata Persentase Kemiskinan per Wilayah")
| Wilayah | Rata_Kemiskinan |
|---|---|
| Jawa | 8.11500 |
| Luar Jawa | 12.40292 |
| Sumatera | 9.64750 |
##Uji Asumsi ANOVA
shapiro_test <- shapiro.test(data$Persen_Miskin_Maret)
shapiro_test
##
## Shapiro-Wilk normality test
##
## data: data$Persen_Miskin_Maret
## W = 0.85008, p-value = 0.0001309
levene_test <- leveneTest(Persen_Miskin_Maret ~ Wilayah, data = data)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
levene_test
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 3.5298 0.04014 *
## 35
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##Uji ANOVA Satu Arah
anova_result <- aov(Persen_Miskin_Maret ~ Wilayah, data = data)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Wilayah 2 111 55.50 1.235 0.303
## Residuals 35 1573 44.95
##Interpretasi
p_anova <- summary(anova_result)[[1]][["Pr(>F)"]][1]
if (p_anova < 0.05) {
cat("Hasil ANOVA menunjukkan perbedaan yang signifikan antar wilayah (p =", round(p_anova,4), ").\n")
} else {
cat("Tidak terdapat perbedaan signifikan rata-rata kemiskinan antar wilayah (p =", round(p_anova,4), ").\n")
}
## Tidak terdapat perbedaan signifikan rata-rata kemiskinan antar wilayah (p = 0.3032 ).
##Visualisasi Boxplot
ggplot(data, aes(x = Wilayah, y = Persen_Miskin_Maret, fill = Wilayah)) +
geom_boxplot(alpha = 0.7) +
scale_fill_manual(values = c("#FFB6C1", "#FFC0CB", "#DB7093")) +
labs(title = "Perbandingan Persentase Kemiskinan antar Wilayah",
x = "Wilayah", y = "Persentase Kemiskinan (%)") +
theme_minimal(base_size = 13)
# Regresi Linear Berganda
library(dplyr)
library(ggplot2)
library(car)
library(broom)
library(performance)
model_lm <- lm(Persen_Miskin_Maret ~ PDRB_perkapita + Garis_Kemiskinan_Maret + RLS + Jumlah_Penduduk_Miskin_Maret,
data = data)
summary(model_lm)
##
## Call:
## lm(formula = Persen_Miskin_Maret ~ PDRB_perkapita + Garis_Kemiskinan_Maret +
## RLS + Jumlah_Penduduk_Miskin_Maret, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.1734 -3.4792 -0.4012 3.1541 11.0108
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.137e+01 1.094e+01 2.868 0.00715 **
## PDRB_perkapita -2.431e-05 1.876e-05 -1.296 0.20390
## Garis_Kemiskinan_Maret 1.300e-05 8.387e-06 1.550 0.13069
## RLS -2.814e+00 9.243e-01 -3.044 0.00456 **
## Jumlah_Penduduk_Miskin_Maret -5.921e-04 9.858e-04 -0.601 0.55220
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.524 on 33 degrees of freedom
## Multiple R-squared: 0.4021, Adjusted R-squared: 0.3296
## F-statistic: 5.548 on 4 and 33 DF, p-value: 0.001575
confint(model_lm)
## 2.5 % 97.5 %
## (Intercept) 9.113572e+00 5.361924e+01
## PDRB_perkapita -6.247755e-05 1.384931e-05
## Garis_Kemiskinan_Maret -4.063886e-06 3.006293e-05
## RLS -4.694042e+00 -9.331942e-01
## Jumlah_Penduduk_Miskin_Maret -2.597718e-03 1.413548e-03
cat("R-squared:", summary(model_lm)$r.squared, "\n")
## R-squared: 0.4020952
cat("Adjusted R-squared:", summary(model_lm)$adj.r.squared, "\n")
## Adjusted R-squared: 0.3296219
##Diagnostik Asumsi
par(mfrow=c(2,2))
plot(model_lm)
shapiro.test(residuals(model_lm))
##
## Shapiro-Wilk normality test
##
## data: residuals(model_lm)
## W = 0.98894, p-value = 0.9655
library(lmtest)
bptest(model_lm)
##
## studentized Breusch-Pagan test
##
## data: model_lm
## BP = 10.087, df = 4, p-value = 0.03899
vif(model_lm)
## PDRB_perkapita Garis_Kemiskinan_Maret
## 1.650575 1.533325
## RLS Jumlah_Penduduk_Miskin_Maret
## 1.367307 1.163565
dwtest(model_lm)
##
## Durbin-Watson test
##
## data: model_lm
## DW = 1.168, p-value = 0.001318
## alternative hypothesis: true autocorrelation is greater than 0
##Interpretasi Awal
tidy_model <- broom::tidy(model_lm, conf.int = TRUE)
tidy_model <- tidy_model %>%
mutate(Signifikansi = ifelse(p.value < 0.05, "Signifikan", "Tidak signifikan"))
kable(tidy_model, digits = 4, caption = "Hasil Regresi Linear Berganda")
| term | estimate | std.error | statistic | p.value | conf.low | conf.high | Signifikansi |
|---|---|---|---|---|---|---|---|
| (Intercept) | 31.3664 | 10.9377 | 2.8677 | 0.0072 | 9.1136 | 53.6192 | Signifikan |
| PDRB_perkapita | 0.0000 | 0.0000 | -1.2962 | 0.2039 | -0.0001 | 0.0000 | Tidak signifikan |
| Garis_Kemiskinan_Maret | 0.0000 | 0.0000 | 1.5500 | 0.1307 | 0.0000 | 0.0000 | Tidak signifikan |
| RLS | -2.8136 | 0.9243 | -3.0442 | 0.0046 | -4.6940 | -0.9332 | Signifikan |
| Jumlah_Penduduk_Miskin_Maret | -0.0006 | 0.0010 | -0.6006 | 0.5522 | -0.0026 | 0.0014 | Tidak signifikan |
##Solusi jika asumsi bermasalah
cat("\nJika asumsi tidak terpenuhi:\n",
"- Jika residual tidak normal → gunakan transformasi log atau square root pada Y atau X.\n",
"- Jika heteroskedastisitas (bptest p<0.05) → gunakan robust standard error (misal: sandwich package).\n",
"- Jika multikolinearitas (VIF > 10) → hapus atau gabungkan variabel yang berkorelasi tinggi.\n",
"- Jika ada outlier → lakukan analisis Cook’s distance untuk deteksi pengaruh ekstrem.\n")
##
## Jika asumsi tidak terpenuhi:
## - Jika residual tidak normal → gunakan transformasi log atau square root pada Y atau X.
## - Jika heteroskedastisitas (bptest p<0.05) → gunakan robust standard error (misal: sandwich package).
## - Jika multikolinearitas (VIF > 10) → hapus atau gabungkan variabel yang berkorelasi tinggi.
## - Jika ada outlier → lakukan analisis Cook’s distance untuk deteksi pengaruh ekstrem.
##Visualisasi Hubungan Variabel
pairs(~Persen_Miskin_Maret + PDRB_perkapita + Garis_Kemiskinan_Maret + RLS + Jumlah_Penduduk_Miskin_Maret,
data = data, col = "#C2185B", pch = 19)
coeftest(model_lm, vcov = vcovHC(model_lm, type = "HC3"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.1366e+01 1.6253e+01 1.9298 0.06226 .
## PDRB_perkapita -2.4314e-05 2.5433e-05 -0.9560 0.34602
## Garis_Kemiskinan_Maret 1.3000e-05 1.1795e-05 1.1021 0.27840
## RLS -2.8136e+00 1.5471e+00 -1.8186 0.07806 .
## Jumlah_Penduduk_Miskin_Maret -5.9209e-04 4.9547e-04 -1.1950 0.24060
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Regresi Logistik Biner
## Membuat target biner
median_kemiskinan <- median(data$Persen_Miskin_Maret, na.rm = TRUE)
data$Kemiskinan_Biner <- ifelse(data$Persen_Miskin_Maret > median_kemiskinan, 1, 0)
table(data$Kemiskinan_Biner)
##
## 0 1
## 19 19
## Model logistik
model_logit <- glm(Kemiskinan_Biner ~ PDRB_perkapita + Garis_Kemiskinan_Maret + RLS + Jumlah_Penduduk_Miskin_Maret,
data = data, family = binomial)
summary(model_logit)
##
## Call:
## glm(formula = Kemiskinan_Biner ~ PDRB_perkapita + Garis_Kemiskinan_Maret +
## RLS + Jumlah_Penduduk_Miskin_Maret, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 6.214e+00 4.578e+00 1.357 0.175
## PDRB_perkapita -2.304e-05 1.294e-05 -1.780 0.075 .
## Garis_Kemiskinan_Maret -5.262e-07 3.680e-06 -0.143 0.886
## RLS -4.156e-01 4.046e-01 -1.027 0.304
## Jumlah_Penduduk_Miskin_Maret -3.935e-04 3.850e-04 -1.022 0.307
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 52.679 on 37 degrees of freedom
## Residual deviance: 43.142 on 33 degrees of freedom
## AIC: 53.142
##
## Number of Fisher Scoring iterations: 5
## Odds ratio dan interval kepercayaan 95%
odds_ratio <- exp(cbind(OR = coef(model_logit), confint(model_logit)))
## Waiting for profiling to be done...
odds_ratio
## OR 2.5 % 97.5 %
## (Intercept) 499.8313715 0.08618219 9.520984e+06
## PDRB_perkapita 0.9999770 0.99994618 9.999985e-01
## Garis_Kemiskinan_Maret 0.9999995 0.99999235 1.000007e+00
## RLS 0.6599146 0.26411267 1.407410e+00
## Jumlah_Penduduk_Miskin_Maret 0.9996066 0.99873102 1.000341e+00
library(pROC)
library(caret)
## Prediksi probabilitas
prob_pred <- predict(model_logit, type = "response")
## Klasifikasi biner (cutoff 0.5)
pred_class <- ifelse(prob_pred > 0.5, 1, 0)
## Confusion matrix
confusionMatrix(as.factor(pred_class), as.factor(data$Kemiskinan_Biner))
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 10 4
## 1 9 15
##
## Accuracy : 0.6579
## 95% CI : (0.4865, 0.8037)
## No Information Rate : 0.5
## P-Value [Acc > NIR] : 0.03648
##
## Kappa : 0.3158
##
## Mcnemar's Test P-Value : 0.26726
##
## Sensitivity : 0.5263
## Specificity : 0.7895
## Pos Pred Value : 0.7143
## Neg Pred Value : 0.6250
## Prevalence : 0.5000
## Detection Rate : 0.2632
## Detection Prevalence : 0.3684
## Balanced Accuracy : 0.6579
##
## 'Positive' Class : 0
##
## ROC dan AUC
roc_obj <- roc(data$Kemiskinan_Biner, prob_pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, col = "deeppink", main = "Kurva ROC - Model Logistik Kemiskinan")
auc(roc_obj)
## Area under the curve: 0.7645
# Ringkasan dan implikasi kebijakan
## (Bagian ini ditulis dalam teks markdown, bukan kode)