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.