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.
library(ggplot2)
par(mfrow = c(2, 2), mar = c(4, 4, 3, 2))
P_Miskin <- ADB$Persentase_Miskin
TPT <- ADB$TPT
IPM <- ADB$IPM
PDRB <-ADB$PDRB_Triwulan_I
# 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")
# Histogram PDRB
hist(ADB$PDRB_Triwulan_I,
main = "Histogram PDRB",
xlab = "PDRB",
col = "#3C3C3C", border = "#11999E")
par(mfrow = c(1, 1))
par(mfrow = c(1, 1), mar = c(4, 4, 3, 2))
# 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)
basic_box_plot <- ggplot(ADB, aes(x = Persentase_Miskin, y = TPT)) +
geom_boxplot() +
labs(title = "Box Plot Of P_Miskin ",
x = "", y = "") +
theme_minimal()
basic_box_plot
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
cat("\n== Narasi dari Matriks Korelasi ==")
##
## == Narasi dari Matriks Korelasi ==
cat("\n- Hubungan antara IPM dengan Kemiskinan sebesar -0,35 yang menandakan korelasi negatif dengan artian jika IPM naik maka Kemiskinan turun")
##
## - Hubungan antara IPM dengan Kemiskinan sebesar -0,35 yang menandakan korelasi negatif dengan artian jika IPM naik maka Kemiskinan turun
cat("\n- Hubungan antara TPT dengan Kemiskinan sebesar -0,36 yang menandakan korelasi negatif dengan artian jika TPT naik maka Kemiskinan turun")
##
## - Hubungan antara TPT dengan Kemiskinan sebesar -0,36 yang menandakan korelasi negatif dengan artian jika TPT naik maka Kemiskinan turun
cat("\n- Hubungnan PDRB Triwulan I dengan Kemiskinan sebesar 0,08 yang menandakan korelasi positif dengan artian jika PDRB turun maka kemiskinan naik")
##
## - Hubungnan PDRB Triwulan I dengan Kemiskinan sebesar 0,08 yang menandakan korelasi positif dengan artian jika PDRB turun maka kemiskinan naik
library(reshape2)
library(ggplot2)
melted_cor <- melt(cor_matrix)
ggplot(melted_cor, aes(Var1, Var2, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "#6DECB9", high = "#11999E", mid = "#F4F4F4",
midpoint = 0, limit = c(-1,1), name="Korelasi") +
theme_minimal() +
labs(title = "Heatmap Korelasi antar Variabel") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))
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== Narasi Dari Regresi Linear Berganda==")
##
## == Narasi Dari Regresi Linear Berganda==
cat("\nModel: Y= B_0 + B_1 X_1+B_2 X_2+B_3 X_3")
##
## Model: Y= B_0 + B_1 X_1+B_2 X_2+B_3 X_3
cat("\nY = 2,06e+01 - 1,57e-01 X_1 - 5,480e-01 X_2 + 2,53e-05 X_3\n")
##
## Y = 2,06e+01 - 1,57e-01 X_1 - 5,480e-01 X_2 + 2,53e-05 X_3
cat("\n- Kemiskinan bernilai 2,06e+01 ketika variabel lain adalah 0")
##
## - Kemiskinan bernilai 2,06e+01 ketika variabel lain adalah 0
cat("\n- Kemiskinan berkurang sebanyak -1,57e-01 ketika IPM meningkat 1 satuan")
##
## - Kemiskinan berkurang sebanyak -1,57e-01 ketika IPM meningkat 1 satuan
Nilai Adj. \(R^2\) adalah 0,1285 Sebesar 12,85% kemiskinan dipengaruhi oleh IPM, TPT, dan PDRB, sisanya 87,15% dipengaruhi oleh variabel lain yang tidak dimasukkan ke dalam model Nilai Adj. \(R^2\) dianggap bagus ketika nilai diatas 0,75, yang artian model tersebut dianggap sangat kurang menjelaskan kemiskinan.
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\):
non_adjust <- round(summary(reg_model)$r.squared, 4)
cat("")
\(R^2\) Teradjust:
teradjust <- round(summary(reg_model)$adj.r.squared, 4)
cat("Adj.R-Square : ", teradjust)
## Adj.R-Square : 0.1285
persentase_variasi <- round(summary(reg_model)$adj.r.squared * 100, 2)
cat("Model ini menjelaskan", persentase_variasi, "% variasi Persentase Kemiskinan")
## Model ini menjelaskan 12.85 % variasi Persentase Kemiskinan
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.
cat("[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("\na. 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. Uji Heterokedastisitas (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
#C. Uji Multikolinearitas
# Melihat hubungan variabel tersebut dengan variabel lain (tidak terdapat operasi hitung/perkalian,penjumlahan,pengurangan, dll)
#Menggunakan VIF
multi_result <- vif(reg_model)
cat("c. Multikolinearitas: P-value =", format.pval(multi_result[1], digits = 4),"\n")
## c. Multikolinearitas: P-value = 1.353
# Nilai VIF dianggap signifikan jika kurang dari 5
# Tidak ada variabel yang mendapat nilai diatas 5, maka data tidak ada multikolinearitas (hubungan dengan variabel lain) (sesuai asumsi regresi linear))
#Uji Autokorelasi
# Melihat perubahan kecil/waktu pada variabel itu sendiri
auto_result <- lmtest::dwtest(reg_model, alternative = 'two.sided')
cat("d. Autokorelasi: P-value =", format.pval(auto_result$p.value, digits = 4))
## d. Autokorelasi: P-value = 0.1362
# Nilai P-Value 0,64 lebih dari 0.05, maka data tidak ada autokorelasi (sesuai asumsi regresi linear)
cat("\n\n[Narasi dari hasil Uji Asumsi Linear Berganda]\n")
##
##
## [Narasi dari hasil Uji Asumsi Linear Berganda]
#Normalitas Residual
# A. Uji Normalitas Residual
cat("\nUji Normalitas Residual\n")
##
## Uji Normalitas Residual
pval_normalitas <- shapiro_reg_result$p.value
cat("Notes : Asusmsi Normalitas ketika P-Value lebih dari 0,05 maka signifikan\n")
## Notes : Asusmsi Normalitas ketika P-Value lebih dari 0,05 maka signifikan
cat("Hasil (Shapiro-Wilk): P-Value =", format.pval(pval_normalitas, digits = 4,"\n"))
## Hasil (Shapiro-Wilk): P-Value = 0.6236
# Logika if else untuk interpretasi
if (pval_normalitas >= 0.05) {
cat("\n= Residual berdistribusi normal (signifikan)\n")
} else {
cat("\n= Residual tidak berdistribusi normal (tidak signifikan)\n")
}
##
## = Residual berdistribusi normal (signifikan)
#Heterokedastisitas
cat("\n\nUji Heterodekastisitas :")
##
##
## Uji Heterodekastisitas :
pval_Hetero <- bp_result$p.value
cat("\nNotes : Asumsi Homoskedastisitas ketika P-Value lebih dari 0,05 maka signifikan")
##
## Notes : Asumsi Homoskedastisitas ketika P-Value lebih dari 0,05 maka signifikan
cat("\nHasil Homoskedastisitas (Breusch-Pagan): P-value =",format.pval(pval_Hetero, digits = 4))
##
## Hasil Homoskedastisitas (Breusch-Pagan): P-value = 0.00414
if (pval_Hetero >= 0.05){
cat("\n= Artinya Data bersifat Homogen\n")
} else {
cat("\n= Artinya Data bersifat Heterogen\n")
}
##
## = Artinya Data bersifat Heterogen
#Uji Multikolinearitas
cat("\n\nUji Multikolinearitas :")
##
##
## Uji Multikolinearitas :
pval_Multi <- multi_result[1]
cat("\nNotes: ")
##
## Notes:
cat("\n- Nilai VIF dianggap signifikan jika kurang dari 5")
##
## - Nilai VIF dianggap signifikan jika kurang dari 5
cat("\n- Tidak ada variabel yang mendapat nilai diatas 5, maka data tidak ada multikolinearitas (hubungan dengan variabel lain) (sesuai asumsi regresi linear)\n")
##
## - Tidak ada variabel yang mendapat nilai diatas 5, maka data tidak ada multikolinearitas (hubungan dengan variabel lain) (sesuai asumsi regresi linear)
cat("Hasil Multikolinearitas: P-value =",format.pval(pval_Multi, digits = 4))
## Hasil Multikolinearitas: P-value = 1.353
if (pval_Multi < 5){
cat("\n= Artinya data sesuai dengan asumsi regresi linear")
} else {
cat("\n= Artinya data tidak sesuai dengan asumsi regresi linear")
}
##
## = Artinya data sesuai dengan asumsi regresi linear
#Uji Autokorelasi
cat("\n\nUji Autokorelasi")
##
##
## Uji Autokorelasi
pval_Auto <- auto_result$p.value
cat("\nNotes: ")
##
## Notes:
cat("\n- Untuk melihat perubahan kecil/waktu pada variabel itu sendiri")
##
## - Untuk melihat perubahan kecil/waktu pada variabel itu sendiri
cat("\n- Nilai autokorelasi signifikan ketika nilai P-value lebih dari 0,05\n")
##
## - Nilai autokorelasi signifikan ketika nilai P-value lebih dari 0,05
cat("Hasil Autokorelasi: P-value =", format.pval(pval_Auto, digits = 4))
## Hasil Autokorelasi: P-value = 0.1362
if (pval_Auto > 0.05){
cat("\n= Artinya datanya sesuai dengan asumsi regresi linear")
} else{
cat("\n= Artinya datanya tidak sesuai dengan asumsi regresi linear")
}
##
## = Artinya datanya sesuai dengan asumsi regresi linear
cat("\n\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
# 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.