Pengambilan Data serta Sumber terkait

Sumber Pengambilan Data

Saya mengambil data dari tahun 2024 dari masing-masih sumber

Sumber 1 : PDRB
Sumber 2 : TPT
Sumber 3 : IPM
Sumber 4 : Persentase Miskin

Pendahuluan

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.

Import Library dan Data

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 ...

1. Eksplorasi Data Analisis (EDA)

EDA singkat ini bertujuan untuk memahami distribusi, tendensi sentral, dan sebaran variabel kunci.

Ringkasan Statistik

# 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.

Visual Plot

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

2. Korelasi Pearson

Kita memilih Korelasi Pearson karena semua variabel yang diuji bersifat numerik (rasio/interval).

Matriks Korelasi

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

Uji Signifikansi dan Interpretasi

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.

3. ANOVA Satu Arah

Kita membandingkan rata-rata Persentase_Miskin (variabel target numerik) berdasarkan Status_Kemiskinan_Factor (variabel kelompok).

Output Model ANOVA

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).

Uji Asumsi ANOVA

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

4. Regresi Linear Berganda

Model: \(\text{Persentase Miskin} = \beta_0 + \beta_1(\text{IPM}) + \beta_2(\text{TPT}) + \beta_3(\text{PDRB Triwulan I}) + \epsilon\)

Output Model dan Koefisien

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

Koefisien dan Interval Kepercayaan (CI)

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.

Diagnostik Residual dan VIF

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.

5. Regresi Logistik Biner

Kita menggunakan target biner Status_Kemiskinan (0 = Rendah, 1 = Tinggi) yang dibentuk secara bermakna (misalnya, di atas median persentase miskin).

Output Model dan Odds Ratio (OR)

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).

6. Ringkasan dan Implikasi Kebijakan

Poin Kunci Temuan

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\)).

Keterbatasan Data

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.