DATA
Y <- "Jumlah golongan putih (Golput) dalam Pemilu Presiden dan Wakil Presiden per 1.000 Penduduk di Setiap Provinsi pada tahun 2024"
X1 <- "Daftar pemilih tetap"
X2 <- "Persentase penduduk miskin"
X3 <- "Persentase tingkat pengangguran terbuka"
X4 <- "Rata-rata lama sekolah penduduk usia 15 tahun ke atas"
X5 <- "Persentase angka melek aksara"
X6 <- "Persentase gini rasio"
X7 <- "Persentase Produk Domestik Bruto/Produk Domestik Regional Bruto Atas Dasar Harga Berlaku"
X8 <- "Persentase Inflasi"
X9 <- "Persentase tenaga kerja formal"
X10<- "Persentasa penyelesaian SMA"
X11<- "Persentase Indeks Demokrasi Indonesia (IDI)"
1. INPUT DATA
library(readxl)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── 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
# Baca data dari file Excel (sesuaikan path dan sheet)
dc<- read_xlsx("C:\\Semester 8 Bismillahirrohmanirrohim\\Data\\1sample.xlsx", sheet = 2)
# Ganti nama kolom
colnames(dc) <- c("Golput", "DPT", "Miskin", "TPT", "RLS", "AMA",
"GRO", "PDRB", "Infl", "TNF", "PPS", "IDI")
head(dc)
## # A tibble: 6 × 12
## Golput DPT Miskin TPT RLS AMA GRO PDRB Infl TNF PPS IDI
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 122 3742037 14.2 5.56 9.95 98.3 0.294 1.11 1.61 39.8 74.5 74.9
## 2 249 10853940 7.99 5.1 10.2 99.1 0.306 5.12 1.78 42.6 74.4 57.5
## 3 234 4088606 5.97 5.79 9.72 99.4 0.287 1.52 1.24 37.4 68.6 90.9
## 4 207 4732174 6.67 3.85 9.69 99.2 0.306 5 1.12 49.9 67.8 83.5
## 5 155 2676107 7.1 4.45 9.26 98.0 0.315 1.43 0.46 41.6 66.6 86.4
## 6 140 6326348 11.0 3.97 8.98 98.7 0.331 3.06 0.92 37.7 64.8 73.2
Summary data
summary(dc)
## Golput DPT Miskin TPT
## Min. : 1.0 Min. : 367269 Min. : 4.00 Min. :1.180
## 1st Qu.:142.8 1st Qu.: 1173236 1st Qu.: 6.32 1st Qu.:3.255
## Median :166.0 Median : 2727376 Median :10.13 Median :4.140
## Mean :182.7 Mean : 5343598 Mean :11.15 Mean :4.368
## 3rd Qu.:196.2 3rd Qu.: 4571282 3rd Qu.:14.06 3rd Qu.:5.702
## Max. :987.0 Max. :35714901 Max. :32.97 Max. :7.020
## RLS AMA GRO PDRB
## Min. : 5.100 Min. :70.37 Min. :0.2350 Min. : 0.1200
## 1st Qu.: 8.785 1st Qu.:95.27 1st Qu.:0.3060 1st Qu.: 0.4775
## Median : 9.340 Median :98.11 Median :0.3445 Median : 1.0650
## Mean : 9.292 Mean :96.30 Mean :0.3406 Mean : 2.6321
## 3rd Qu.: 9.930 3rd Qu.:98.77 3rd Qu.:0.3640 3rd Qu.: 2.8425
## Max. :11.490 Max. :99.75 Max. :0.4310 Max. :16.7700
## Infl TNF PPS IDI
## Min. :0.0000 Min. : 4.24 Min. :39.50 Min. :53.09
## 1st Qu.:0.0925 1st Qu.:35.03 1st Qu.:58.64 1st Qu.:66.64
## Median :0.5300 Median :40.09 Median :65.64 Median :73.13
## Mean :0.7326 Mean :40.54 Mean :63.58 Mean :72.54
## 3rd Qu.:1.0275 3rd Qu.:46.77 3rd Qu.:68.88 3rd Qu.:80.39
## Max. :4.5500 Max. :68.45 Max. :89.69 Max. :92.97
3. Eksplorasi Data
# Summary data
summary(dc)
## Golput DPT Miskin TPT
## Min. : 1.0 Min. : 367269 Min. : 4.00 Min. :1.180
## 1st Qu.:142.8 1st Qu.: 1173236 1st Qu.: 6.32 1st Qu.:3.255
## Median :166.0 Median : 2727376 Median :10.13 Median :4.140
## Mean :182.7 Mean : 5343598 Mean :11.15 Mean :4.368
## 3rd Qu.:196.2 3rd Qu.: 4571282 3rd Qu.:14.06 3rd Qu.:5.702
## Max. :987.0 Max. :35714901 Max. :32.97 Max. :7.020
## RLS AMA GRO PDRB
## Min. : 5.100 Min. :70.37 Min. :0.2350 Min. : 0.1200
## 1st Qu.: 8.785 1st Qu.:95.27 1st Qu.:0.3060 1st Qu.: 0.4775
## Median : 9.340 Median :98.11 Median :0.3445 Median : 1.0650
## Mean : 9.292 Mean :96.30 Mean :0.3406 Mean : 2.6321
## 3rd Qu.: 9.930 3rd Qu.:98.77 3rd Qu.:0.3640 3rd Qu.: 2.8425
## Max. :11.490 Max. :99.75 Max. :0.4310 Max. :16.7700
## Infl TNF PPS IDI
## Min. :0.0000 Min. : 4.24 Min. :39.50 Min. :53.09
## 1st Qu.:0.0925 1st Qu.:35.03 1st Qu.:58.64 1st Qu.:66.64
## Median :0.5300 Median :40.09 Median :65.64 Median :73.13
## Mean :0.7326 Mean :40.54 Mean :63.58 Mean :72.54
## 3rd Qu.:1.0275 3rd Qu.:46.77 3rd Qu.:68.88 3rd Qu.:80.39
## Max. :4.5500 Max. :68.45 Max. :89.69 Max. :92.97
# Boxplot variabel Golput
boxplot(dc$Golput, main = "Boxplot Golput", col = "lightblue")
# Identifikasi outlier pada Golput menggunakan data asli
outlier_values <- boxplot.stats(dc$Golput)$out
print(outlier_values)
## [1] 987 4 1
Eksplorasi statistik menunjukkan adanya variasi yang cukup besar dalam jumlah Golput antar provinsi.
multikol
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
# Buat model Poisson dengan data ter-normalisasi
modellm <- lm(Golput ~ ., data = dc)
summary(modellm)
##
## Call:
## lm(formula = Golput ~ ., data = dc)
##
## Residuals:
## Min 1Q Median 3Q Max
## -207.77 -72.99 -31.73 42.02 438.98
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.448e+03 1.067e+03 -2.293 0.0302 *
## DPT -4.074e-06 5.972e-06 -0.682 0.5011
## Miskin 3.639e+00 8.025e+00 0.453 0.6540
## TPT -1.474e+01 2.384e+01 -0.618 0.5416
## RLS -4.999e+01 6.130e+01 -0.816 0.4222
## AMA 2.564e+01 1.333e+01 1.924 0.0654 .
## GRO 1.018e+03 6.491e+02 1.568 0.1291
## PDRB 6.282e-01 1.203e+01 0.052 0.9588
## Infl 7.007e+01 3.891e+01 1.801 0.0833 .
## TNF 1.819e+00 4.534e+00 0.401 0.6916
## PPS -4.722e+00 3.315e+00 -1.425 0.1662
## IDI 6.882e+00 2.674e+00 2.573 0.0161 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 133.8 on 26 degrees of freedom
## Multiple R-squared: 0.3975, Adjusted R-squared: 0.1425
## F-statistic: 1.559 on 11 and 26 DF, p-value: 0.1703
# Cek multikolinearitas (VIF)
vif(modellm)
## DPT Miskin TPT RLS AMA GRO PDRB Infl
## 5.061692 6.054780 2.308962 10.244900 10.034053 1.985569 4.747178 2.471776
## TNF PPS IDI
## 6.004165 3.491549 2.041985
4. Distribusi Variabel Respon (Golput)
# Histogram dan density plot untuk Golput (menggunakan data asli)
hist(dc$Golput, probability = TRUE, main = "Histogram Golput", col = "lightgray")
lines(density(dc$Golput), col = "red", lwd = 2)
# Hitung mean dan variance Golput
mean_golput <- mean(dc$Golput)
var_golput <- var(dc$Golput)
mean_golput
## [1] 182.6579
var_golput
## [1] 20888.83
Distribusi jumlah Golput menunjukkan adanya skewness dan variabilitas yang tinggi.
5. Uji Distribusi Poisson Misalnya, kita gunakan KS-test dengan parameter lambda sama dengan mean Golput.
ks.test(dc$Golput, "rpois", lambda = 182.6579)
## Warning in ks.test.default(dc$Golput, "rpois", lambda = 182.6579): ties should
## not be present for the one-sample Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: dc$Golput
## D = 207.29, p-value < 2.2e-16
## alternative hypothesis: two-sided
Hasil uji distribusi Poisson menunjukkan bahwa jumlah Golput tidak sepenuhnya mengikuti distribusi Poisson karena adanya overdispersi.
6.Model Poisson
library(MASS)
library(car)
# Buat model Poisson dengan data ter-normalisasi
model.poisson <- glm(Golput ~ ., data = dc, family = "poisson")
summary(model.poisson)
##
## Call:
## glm(formula = Golput ~ ., family = "poisson", data = dc)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -4.971e+00 5.670e-01 -8.768 < 2e-16 ***
## DPT -1.324e-08 3.345e-09 -3.957 7.59e-05 ***
## Miskin 3.930e-03 4.878e-03 0.806 0.42045
## TPT -6.589e-02 1.305e-02 -5.049 4.44e-07 ***
## RLS -1.437e-01 3.478e-02 -4.130 3.63e-05 ***
## AMA 9.710e-02 7.325e-03 13.255 < 2e-16 ***
## GRO 3.473e+00 3.389e-01 10.247 < 2e-16 ***
## PDRB 4.110e-03 6.702e-03 0.613 0.53978
## Infl 3.018e-01 2.218e-02 13.608 < 2e-16 ***
## TNF 6.515e-03 2.501e-03 2.605 0.00919 **
## PPS -2.203e-02 1.884e-03 -11.692 < 2e-16 ***
## IDI 2.916e-02 1.446e-03 20.170 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2774.6 on 37 degrees of freedom
## Residual deviance: 1395.4 on 26 degrees of freedom
## AIC: 1676.4
##
## Number of Fisher Scoring iterations: 5
# Cek multikolinearitas (VIF)
vif(model.poisson)
## DPT Miskin TPT RLS AMA GRO PDRB Infl
## 4.912550 5.265727 2.108469 7.729377 5.758201 2.037250 4.772707 1.983699
## TNF PPS IDI
## 4.805985 3.728039 1.972989
7. Uji Overdispersi pada Model Poisson
library(AER)
## Loading required package: lmtest
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: sandwich
## Loading required package: survival
# Uji overdispersi dengan dispersion test
dispersiontest(model.poisson)
##
## Overdispersion test
##
## data: model.poisson
## z = 4.2519, p-value = 1.06e-05
## alternative hypothesis: true dispersion is greater than 1
## sample estimates:
## dispersion
## 33.59933
# Hitung rasio Pearson chi-square / df
pearson_chisq <- sum(residuals(model.poisson, type = "pearson")^2)
df_value <- df.residual(model.poisson)
pearson_ratio <- pearson_chisq / df_value
pearson_ratio
## [1] 49.15964
# Gunakan DHARMa untuk evaluasi residual
library(DHARMa)
## This is DHARMa 0.4.7. For overview type '?DHARMa'. For recent changes, type news(package = 'DHARMa')
sim.poisson <- simulateResiduals(model.poisson, refit = TRUE)
testOverdispersion(sim.poisson)
## testOverdispersion is deprecated, switch your code to using the testDispersion function
##
## DHARMa nonparametric dispersion test via mean deviance residual fitted
## vs. simulated-refitted
##
## data: simulationOutput
## dispersion = 49.983, p-value < 2.2e-16
## alternative hypothesis: two.sided
Uji overdispersi menunjukkan bahwa model Poisson kurang cocok untuk data ini karena nilai deviasi residual yang tinggi dan rasio Pearson chi-square yang jauh di atas 1. Hal ini mengindikasikan bahwa model lain yang dapat menangani overdispersi lebih sesuai
8. Model Negative Binomial
# Model Negative Binomial dengan semua prediktor
model.nb <- glm.nb(Golput ~ ., data = dc)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: algorithm did not converge
## Warning in glm.nb(Golput ~ ., data = dc): alternation limit reached
summary(model.nb)
##
## Call:
## glm.nb(formula = Golput ~ ., data = dc, init.theta = 2.941302832,
## link = log)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.518e-01 4.690e+00 -0.054 0.9572
## DPT -2.770e-09 2.624e-08 -0.106 0.9159
## Miskin -2.307e-02 3.534e-02 -0.653 0.5139
## TPT -5.325e-02 1.047e-01 -0.509 0.6110
## RLS 1.631e-01 2.698e-01 0.604 0.5455
## AMA 3.906e-02 5.858e-02 0.667 0.5049
## GRO 7.244e-01 2.851e+00 0.254 0.7994
## PDRB -1.756e-03 5.286e-02 -0.033 0.9735
## Infl 3.182e-01 1.710e-01 1.861 0.0628 .
## TNF -4.252e-03 1.992e-02 -0.213 0.8310
## PPS -2.702e-02 1.458e-02 -1.854 0.0638 .
## IDI 2.805e-02 1.175e-02 2.387 0.0170 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for Negative Binomial(2.9413) family taken to be 1)
##
## Null deviance: 57.742 on 37 degrees of freedom
## Residual deviance: 42.746 on 26 degrees of freedom
## AIC: 476.27
##
## Number of Fisher Scoring iterations: 1
##
##
## Theta: 2.941
## Std. Err.: 0.705
## Warning while fitting theta: alternation limit reached
##
## 2 x log-likelihood: -450.272
# Bandingkan AIC antara model Poisson dan Negative Binomial
AIC_poisson <- AIC(model.poisson)
AIC_nb <- AIC(model.nb)
AIC_poisson
## [1] 1676.398
AIC_nb
## [1] 476.272
# Cek VIF (untuk gambaran multikolinearitas)
vif(model.nb)
## DPT Miskin TPT RLS AMA GRO PDRB Infl
## 5.061384 6.020907 2.300685 10.185176 9.931148 1.985374 4.749536 2.458874
## TNF PPS IDI
## 5.962683 3.484530 2.036343
9. Mengatasi Outlier Jika diidentifikasi outlier pada Golput, kita bisa menghapusnya dan refit model.
# Hapus outlier dari data (berdasarkan nilai pada data asli)
dc_clean <- dc[!dc$Golput %in% outlier_values, ]
dim(dc_clean)
## [1] 35 12
# Fitting model Negative Binomial dengan data yang telah dibersihkan
model.nb_clean <- glm.nb(Golput ~ ., data = dc_clean)
summary(model.nb_clean)
##
## Call:
## glm.nb(formula = Golput ~ ., data = dc_clean, init.theta = 38.02488043,
## link = log)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 8.341e+00 1.742e+00 4.788 1.68e-06 ***
## DPT -9.644e-09 8.754e-09 -1.102 0.27059
## Miskin -3.874e-02 1.194e-02 -3.245 0.00117 **
## TPT 4.717e-02 3.283e-02 1.437 0.15083
## RLS 1.011e-01 1.016e-01 0.996 0.31938
## AMA -1.888e-02 2.140e-02 -0.882 0.37761
## GRO -2.566e+00 1.105e+00 -2.323 0.02017 *
## PDRB 4.185e-02 1.690e-02 2.477 0.01325 *
## Infl 8.094e-02 5.530e-02 1.464 0.14327
## TNF -1.271e-02 6.223e-03 -2.042 0.04118 *
## PPS -1.045e-02 4.993e-03 -2.094 0.03629 *
## IDI -2.829e-03 4.145e-03 -0.682 0.49496
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for Negative Binomial(38.0249) family taken to be 1)
##
## Null deviance: 67.145 on 34 degrees of freedom
## Residual deviance: 35.875 on 23 degrees of freedom
## AIC: 363.77
##
## Number of Fisher Scoring iterations: 1
##
##
## Theta: 38.0
## Std. Err.: 11.4
##
## 2 x log-likelihood: -337.768
Outlier dalam data Golput telah diidentifikasi dan dihapus untuk meningkatkan stabilitas model. Setelah penghapusan outlier, model Negative Binomial menghasilkan estimasi yang lebih konsisten.
10. Evaluasi Goodness-of-Fit untuk Model Negative Binomial
# Rasio Pearson chi-square / df untuk model NB
pearson_chisq_nb <- sum(residuals(model.nb, type = "pearson")^2)
df_value_nb <- df.residual(model.nb)
pearson_ratio_nb <- pearson_chisq_nb / df_value_nb
pearson_ratio_nb
## [1] 0.9677106
# Rasio deviance / df
dispersion_ratio_nb <- deviance(model.nb) / df_value_nb
dispersion_ratio_nb
## [1] 1.644089
Evaluasi model menunjukkan bahwa model Negative Binomial lebih sesuai dibandingkan model Poisson. Rasio Pearson chi-square dan rasio deviance terhadap derajat kebebasan menunjukkan bahwa model ini mampu menangani variasi dalam data dengan lebih baik, mengurangi overdispersi yang ada pada model sebelumnya.