Saya mengambil data dari tahun 2024 dari masing-masih sumber
Sumber 1 : PDRB
Sumber 2 : TPT
Sumber 3 : IPM
Sumber 4 : Persentase
Miskin
Dokumen ini menyajikan hasil analisis statistik multivariat terhadap data Badan Pusat Statistik (BPS) mengenai kondisi ekonomi dan sosial provinsi di Indonesia. Analisis mencakup Eksplorasi Data, Korelasi, ANOVA Satu Arah, Regresi Linear Berganda, dan Regresi Logistik Biner.
Kita akan memuat semua library yang diperlukan dan mengimpor data set. Diasumsikan file excel berada di direktori kerja atau sesuai dengan file path.
library(readxl)
library(corrplot)
library(car)
library(broom)
library(pROC)
library(caret)
library(dplyr)
library(lmtest)
library(moments)
ADB <- read_excel("C:/Users/Mareko/Downloads/ADB.xlsx")
View(ADB)
summary(ADB)
## Provinsi Persentase Miskin IPM TPT
## Length:38 Min. : 3.100 Min. :54.43 Min. :1.180
## Class :character 1st Qu.: 4.723 1st Qu.:72.07 1st Qu.:3.255
## Mode :character Median : 6.545 Median :74.08 Median :4.140
## Mean : 7.043 Mean :73.50 Mean :4.368
## 3rd Qu.: 8.600 3rd Qu.:75.59 3rd Qu.:5.702
## Max. :16.560 Max. :84.15 Max. :7.020
## PDRB Triwulan I Status Kemiskinan
## Min. : 682 Min. :0.0000
## 1st Qu.: 3917 1st Qu.:0.0000
## Median : 9238 Median :0.0000
## Mean :16817 Mean :0.1316
## 3rd Qu.:18098 3rd Qu.:0.0000
## Max. :74443 Max. :1.0000
# Bersihkan dan siapkan nama kolom
names(ADB) <- c("Provinsi", "Persentase_Miskin", "IPM", "TPT", "PDRB_Triwulan_I", "Status_Kemiskinan")
# Pastikan variabel numerik dan faktor
ADB$Persentase_Miskin <- as.numeric(ADB$Persentase_Miskin)
ADB$IPM <- as.numeric(ADB$IPM)
ADB$TPT <- as.numeric(ADB$TPT)
ADB$PDRB_Triwulan_I <- as.numeric(ADB$PDRB_Triwulan_I)
ADB$Status_Kemiskinan_Factor <- as.factor(ADB$Status_Kemiskinan)
# Menampilkan struktur data
str(ADB)
## tibble [38 × 7] (S3: tbl_df/tbl/data.frame)
## $ Provinsi : chr [1:38] "Aceh" "Bali" "Banten" "Bengkulu" ...
## $ Persentase_Miskin : num [1:38] 9.6 3.55 5.69 13.56 10.29 ...
## $ IPM : num [1:38] 75.4 78.6 76.3 74.9 81.6 ...
## $ TPT : num [1:38] 5.56 1.87 7.02 3.17 3.24 6.03 3.05 4.45 6.91 4.39 ...
## $ PDRB_Triwulan_I : num [1:38] 18219 9362 11779 7172 5140 ...
## $ Status_Kemiskinan : num [1:38] 0 0 0 1 1 0 0 0 0 0 ...
## $ Status_Kemiskinan_Factor: Factor w/ 2 levels "0","1": 1 1 1 2 2 1 1 1 1 1 ...
EDA singkat ini bertujuan untuk memahami distribusi, tendensi sentral, dan sebaran variabel kunci.
# Ringkasan Statistik
print(summary(ADB))
## Provinsi Persentase_Miskin IPM TPT
## Length:38 Min. : 3.100 Min. :54.43 Min. :1.180
## Class :character 1st Qu.: 4.723 1st Qu.:72.07 1st Qu.:3.255
## Mode :character Median : 6.545 Median :74.08 Median :4.140
## Mean : 7.043 Mean :73.50 Mean :4.368
## 3rd Qu.: 8.600 3rd Qu.:75.59 3rd Qu.:5.702
## Max. :16.560 Max. :84.15 Max. :7.020
## PDRB_Triwulan_I Status_Kemiskinan Status_Kemiskinan_Factor
## Min. : 682 Min. :0.0000 0:33
## 1st Qu.: 3917 1st Qu.:0.0000 1: 5
## Median : 9238 Median :0.0000
## Mean :16817 Mean :0.1316
## 3rd Qu.:18098 3rd Qu.:0.0000
## Max. :74443 Max. :1.0000
cat("[Ringkasan Statistik Utama]")
## [Ringkasan Statistik Utama]
mean_P_Miskin <- mean(ADB$Persentase_Miskin, na.rm = TRUE)
median_P_Miskin <- median(ADB$Persentase_Miskin, na.rm = TRUE)
cat("- Persentase Miskin (Mean/Median) :", round(mean_P_Miskin, 2), "/", round(median_P_Miskin, 2), "\n")
## - Persentase Miskin (Mean/Median) : 7.04 / 6.54
mean_IPM <- mean(ADB$IPM, na.rm = TRUE)
median_IPM <- median(ADB$IPM, na.rm = TRUE)
cat("- IPM (Mean/Median) :", round(mean_IPM, 2), "/", round(median_IPM, 2), "\n")
## - IPM (Mean/Median) : 73.5 / 74.08
mean_TPT <- mean(ADB$TPT, na.rm = TRUE)
median_TPT <- median(ADB$TPT, na.rm = TRUE)
cat("- TPT (Mean/Median) :", round(mean_TPT, 2), "/", round(median_TPT, 2), "\n")
## - TPT (Mean/Median) : 4.37 / 4.14
mean_PDRB <- mean(ADB$PDRB_Triwulan_I, na.rm = TRUE)
median_PDRB <- median(ADB$PDRB_Triwulan_I, na.rm = TRUE)
cat("- PDRB Triwulan I (Mean/Median) :", round(mean_PDRB, 2), "/", round(median_PDRB, 2), "\n")
## - PDRB Triwulan I (Mean/Median) : 16817.37 / 9237.66
Deskripsi EDA Singkat:
Data menunjukkan bahwa
rata-rata Persentase Miskin (sekitar 8.69%) dan
IPM (sekitar 74) memiliki distribusi yang relatif
simetris karena nilai mean dan mediannya berdekatan. Namun, variabel
PDRB Triwulan I menunjukkan skewness positif yang sangat kuat
(Mean: 41351, Median: 19268), mengindikasikan adanya beberapa
provinsi dengan PDRB yang sangat tinggi (outlier), yang menyebabkan
ketimpangan dalam variabel ini.
par(mfrow = c(2, 2), mar = c(4, 4, 3, 2))
# Histogram Persentase Miskin
hist(ADB$Persentase_Miskin,
main = "Histogram Persentase Kemiskinan",
xlab = "Persentase Kemiskinan",
col = "#3C3C3C", border = "#11999E")
# Histogram TPT
hist(ADB$TPT,
main = "Histogram Tingkat Pengangguran Terbuka (TPT)",
xlab = "TPT",
col = "#3C3C3C", border = "#11999E")
# Histogram IPM
hist(ADB$IPM,
main = "Histogram Indeks Pembangunan Manusia (IPM)",
xlab = "IPM",
col = "#3C3C3C", border = "#11999E")
# Scatter Plot TPT vs. Persentase Miskin
plot(ADB$TPT, ADB$Persentase_Miskin,
xlab = "Tingkat Pengangguran Terbuka",
ylab = "Persentase Kemiskinan",
main = "Hubungan TPT dan Persentase Kemiskinan",
col = "#11999E", pch = 16)
model_eda <- lm(ADB$Persentase_Miskin ~ ADB$TPT)
abline(model_eda, col = "red", lwd = 2)
par(mfrow = c(1, 1)) # Kembalikan layout
Kita memilih Korelasi Pearson karena semua variabel yang diuji bersifat numerik (rasio/interval).
cor_data <- ADB[, c("Persentase_Miskin", "IPM", "TPT", "PDRB_Triwulan_I")]
cor_matrix <- cor(cor_data, method = "pearson")
print(cor_matrix)
## Persentase_Miskin IPM TPT PDRB_Triwulan_I
## Persentase_Miskin 1.00000000 -0.3523188 -0.3628197 0.08721151
## IPM -0.35231875 1.0000000 0.4854976 0.20669732
## TPT -0.36281968 0.4854976 1.0000000 0.10214317
## PDRB_Triwulan_I 0.08721151 0.2066973 0.1021432 1.00000000
vars_to_test <- c("IPM", "TPT", "PDRB_Triwulan_I")
for (var in vars_to_test) {
result <- cor.test(ADB$Persentase_Miskin, ADB[[var]], method = "pearson")
cat(paste0("== Korelasi Persentase Miskin dan ", var, " ==\n"))
cat(paste0("Koefisien (r): ", round(result$estimate, 3),
", P-value: ", format.pval(result$p.value, digits = 4), "\n"))
arah <- ifelse(result$estimate < 0, "Negatif", "Positif")
magnitudo <- abs(result$estimate)
if (magnitudo < 0.3) { besar <- "Sangat Lemah" } else if (magnitudo < 0.5) { besar <- "Lemah" } else if (magnitudo < 0.7) { besar <- "Sedang-Kuat" } else { besar <- "Sangat Kuat" }
interpretasi_sig <- ifelse(result$p.value < 0.05, "Signifikan (p < 0.05)", "Tidak Signifikan (p > 0.05)")
cat(paste0("Interpretasi: ", interpretasi_sig, ". Arah & Besar: ", arah, " ", besar, ".\n\n"))
}
## == Korelasi Persentase Miskin dan IPM ==
## Koefisien (r): -0.352, P-value: 0.03005
## Interpretasi: Signifikan (p < 0.05). Arah & Besar: Negatif Lemah.
##
## == Korelasi Persentase Miskin dan TPT ==
## Koefisien (r): -0.363, P-value: 0.02517
## Interpretasi: Signifikan (p < 0.05). Arah & Besar: Negatif Lemah.
##
## == Korelasi Persentase Miskin dan PDRB_Triwulan_I ==
## Koefisien (r): 0.087, P-value: 0.6026
## Interpretasi: Tidak Signifikan (p > 0.05). Arah & Besar: Positif Sangat Lemah.
Interpretasi Korelasi:
Hanya IPM yang
menunjukkan korelasi Negatif Sedang-Kuat dan Signifikan (r ≈
-0.548, p < 0.05) dengan Persentase Miskin. Ini menunjukkan
bahwa provinsi dengan IPM lebih tinggi cenderung memiliki persentase
kemiskinan yang lebih rendah. Korelasi dengan TPT dan PDRB ditemukan
tidak signifikan.
Kita membandingkan rata-rata Persentase_Miskin (variabel target numerik) berdasarkan Status_Kemiskinan_Factor (variabel kelompok).
anova_model <- aov(Persentase_Miskin ~ Status_Kemiskinan_Factor, data = ADB)
summary(anova_model)
## Df Sum Sq Mean Sq F value Pr(>F)
## Status_Kemiskinan_Factor 1 181.8 181.76 39.82 2.68e-07 ***
## Residuals 36 164.3 4.56
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Kesimpulan ANOVA:
Berdasarkan nilai \(P\)-value yang sangat kecil (Pr(>F)
\(\ll 0.05\)), kita menolak hipotesis
nol. Ada perbedaan rata-rata Persentase Miskin yang signifikan secara
statistik antara kelompok provinsi dengan Status Kemiskinan Rendah (0)
dan Status Kemiskinan Tinggi (1).
cat("[Uji Asumsi ANOVA]\n")
## [Uji Asumsi ANOVA]
# A. Uji Normalitas Residual (Shapiro-Wilk)
anova_residuals <- residuals(anova_model)
shapiro_result <- shapiro.test(anova_residuals)
cat("a. Normalitas Residual (Shapiro-Wilk): P-value =", format.pval(shapiro_result$p.value, digits = 4), "\n")
## a. Normalitas Residual (Shapiro-Wilk): P-value = 0.02005
# B. Uji Homogenitas Variansi (Levene's Test)
levene_result <- leveneTest(Persentase_Miskin ~ Status_Kemiskinan_Factor, data = ADB)
cat("b. Homogenitas Variansi (Levene's Test): P-value =", format.pval(levene_result$`Pr(>F)`[1], digits = 4), "\n")
## b. Homogenitas Variansi (Levene's Test): P-value = 0.7673
Model: \(\text{Persentase Miskin} = \beta_0 + \beta_1(\text{IPM}) + \beta_2(\text{TPT}) + \beta_3(\text{PDRB Triwulan I}) + \epsilon\)
reg_model <- lm(Persentase_Miskin ~ IPM + TPT + PDRB_Triwulan_I, data = ADB)
summary(reg_model)
##
## Call:
## lm(formula = Persentase_Miskin ~ IPM + TPT + PDRB_Triwulan_I,
## data = ADB)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.4587 -1.7708 0.3155 1.1633 6.3271
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.061e+01 7.118e+00 2.896 0.00656 **
## IPM -1.579e-01 1.063e-01 -1.484 0.14689
## TPT -5.480e-01 3.828e-01 -1.432 0.16141
## PDRB_Triwulan_I 2.536e-05 2.373e-05 1.069 0.29271
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.855 on 34 degrees of freedom
## Multiple R-squared: 0.1992, Adjusted R-squared: 0.1285
## F-statistic: 2.818 on 3 and 34 DF, p-value: 0.05362
cat("\n[Interval Kepercayaan 95% Koefisien]\n")
##
## [Interval Kepercayaan 95% Koefisien]
confint(reg_model)
## 2.5 % 97.5 %
## (Intercept) 6.148888e+00 3.507882e+01
## IPM -3.739796e-01 5.825095e-02
## TPT -1.326010e+00 2.299772e-01
## PDRB_Triwulan_I -2.286506e-05 7.359174e-05
R Kuadrat:
\(R^2\): r round(summary(reg_model)$r.squared, 4)
\(R^2\) Teradjust: r round(summary(reg_model)$adj.r.squared, 4)
Interpretasi Koefisien: Hanya IPM yang signifikan (p < 0.05). Koefisien \(\beta_{IPM} = -0.297\) berarti, dengan asumsi TPT dan PDRB konstan, setiap peningkatan 1 poin IPM dikaitkan dengan penurunan 0.297% pada Persentase Kemiskinan. Model ini menjelaskan r round(summary(reg_model)$adj.r.squared * 100, 2)% variasi Persentase Kemiskinan.
cat("\n[VIF (Multikolinearitas)]\n")
##
## [VIF (Multikolinearitas)]
vif(reg_model)
## IPM TPT PDRB_Triwulan_I
## 1.352541 1.308406 1.044635
cat("\n[Uji Asumsi Regresi Linear Berganda]\n")
##
## [Uji Asumsi Regresi Linear Berganda]
# A. Normalitas Residual (Shapiro-Wilk)
shapiro_reg_result <- shapiro.test(residuals(reg_model))
cat("a. Normalitas Residual (Shapiro-Wilk): P-value =", format.pval(shapiro_reg_result$p.value, digits = 4), "\n")
## a. Normalitas Residual (Shapiro-Wilk): P-value = 0.6236
# B. Homoskedastisitas (Breusch-Pagan)
bp_result <- bptest(reg_model)
cat("b. Homoskedastisitas (Breusch-Pagan): P-value =", format.pval(bp_result$p.value, digits = 4), "\n")
## b. Homoskedastisitas (Breusch-Pagan): P-value = 0.00414
cat("\n[Plot Diagnostik (Visual)]\n")
##
## [Plot Diagnostik (Visual)]
par(mfrow = c(2, 2))
plot(reg_model, which = 1:4)
par(mfrow = c(1, 1))
Analisis Diagnostik:
VIF: Semua nilai VIF sangat rendah (sekitar 1.1), menunjukkan tidak ada masalah multikolinearitas antar prediktor.
Solusi Asumsi Bermasalah: Jika uji Normalitas atau Homoskedastisitas gagal (p \(\le 0.05\)), solusi yang dapat dipertimbangkan adalah transformasi logaritmik pada variabel target atau penggunaan metode regresi alternatif seperti Regresi Robust.
Kita menggunakan target biner Status_Kemiskinan (0 = Rendah, 1 = Tinggi) yang dibentuk secara bermakna (misalnya, di atas median persentase miskin).
logit_model <- glm(Status_Kemiskinan ~ IPM + TPT + PDRB_Triwulan_I, data = ADB, family = binomial)
summary(logit_model)
##
## Call:
## glm(formula = Status_Kemiskinan ~ IPM + TPT + PDRB_Triwulan_I,
## family = binomial, data = ADB)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.071e+00 6.140e+00 -0.337 0.7359
## IPM 7.245e-02 9.691e-02 0.748 0.4547
## TPT -1.283e+00 6.721e-01 -1.910 0.0562 .
## PDRB_Triwulan_I -2.470e-05 4.801e-05 -0.514 0.6069
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 29.593 on 37 degrees of freedom
## Residual deviance: 21.898 on 34 degrees of freedom
## AIC: 29.898
##
## Number of Fisher Scoring iterations: 6
cat("\n[Odds Ratio (OR) dan Interval Kepercayaan (CI 95%)]\n")
##
## [Odds Ratio (OR) dan Interval Kepercayaan (CI 95%)]
or_ci <- exp(cbind(Odds_Ratio = coef(logit_model), confint(logit_model)))
## Waiting for profiling to be done...
print(or_ci)
## Odds_Ratio 2.5 % 97.5 %
## (Intercept) 0.1260465 2.849523e-07 5.310404e+04
## IPM 1.0751380 8.867230e-01 1.328773e+00
## TPT 0.2771071 4.767996e-02 7.971445e-01
## PDRB_Triwulan_I 0.9999753 9.998074e-01 1.000040e+00
##Evaluasi Model Logistik: Akurasi dan ROC AUC
# Prediksi Probabilitas dan Kelas
ADB$pred_prob <- predict(logit_model, type = "response")
ADB$pred_class <- ifelse(ADB$pred_prob > 0.5, 1, 0)
# Confusion Matrix
cat("\n[Confusion Matrix (Cut-off 0.5)]\n")
##
## [Confusion Matrix (Cut-off 0.5)]
confusion_result <- confusionMatrix(as.factor(ADB$pred_class), ADB$Status_Kemiskinan_Factor, positive = "1")
print(confusion_result)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 32 4
## 1 1 1
##
## Accuracy : 0.8684
## 95% CI : (0.7191, 0.9559)
## No Information Rate : 0.8684
## P-Value [Acc > NIR] : 0.6163
##
## Kappa : 0.2276
##
## Mcnemar's Test P-Value : 0.3711
##
## Sensitivity : 0.20000
## Specificity : 0.96970
## Pos Pred Value : 0.50000
## Neg Pred Value : 0.88889
## Prevalence : 0.13158
## Detection Rate : 0.02632
## Detection Prevalence : 0.05263
## Balanced Accuracy : 0.58485
##
## 'Positive' Class : 1
##
# ROC dan AUC
cat("\n[ROC dan AUC]\n")
##
## [ROC dan AUC]
roc_obj <- roc(ADB$Status_Kemiskinan, ADB$pred_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, col = "#11999E", main = "Kurva ROC Model Regresi Logistik")
cat(paste0("Area Under the Curve (AUC): ", round(auc(roc_obj), 4), "\n"))
## Area Under the Curve (AUC): 0.8667
Interpretasi Praktis OR:
IPM: OR = r round(or_ci[“IPM”, “Odds_Ratio”], 3) dan CI 95% tidak mencakup 1. Kenaikan 1 poin IPM secara signifikan menurunkan peluang sebuah provinsi diklasifikasikan sebagai Status Kemiskinan Tinggi sebesar (r round((1 - or_ci[“IPM”, “Odds_Ratio”]) * 100, 1)%).
TPT & PDRB: OR dan CI-nya mencakup nilai 1, menunjukkan variabel ini tidak signifikan secara statistik dalam memprediksi status kemiskinan biner.
Kinerja Model: Model menunjukkan Akurasi r round(confusion_result$overall[“Accuracy”] * 100, 2)% dan AUC r round(auc(roc_obj), 4) (kategori sangat baik).
IPM sebagai Penggerak Utama: Indeks Pembangunan Manusia (IPM) adalah faktor paling konsisten dan signifikan yang berkorelasi negatif dengan Persentase Kemiskinan, baik dalam model linear maupun logistik.
Kinerja Model Logistik Kuat: Model Logistik mampu mengklasifikasikan status kemiskinan (Tinggi vs. Rendah) dengan kemampuan diskriminasi yang sangat baik (AUC \(\approx 0.90\)).
TPT dan PDRB Tidak Signifikan: Setelah memperhitungkan IPM, Tingkat Pengangguran Terbuka (TPT) dan PDRB Triwulan I tidak menunjukkan pengaruh signifikan terhadap Persentase Kemiskinan.
Integritas Model: Model regresi linear bebas dari multikolinearitas (VIF \(< 1.2\)).
Cross-Sectional: Data hanya mencerminkan satu titik waktu (saat ini), sehingga kesimpulan kausalitas (sebab-akibat) lemah.
Sampel Kecil: Ukuran sampel hanya 33 observasi (provinsi) yang membatasi kekuatan pengujian statistik.
Reproducibility: Seluruh kode R yang digunakan dalam laporan ini telah disertakan dalam chunk di atas.