1. Library

library(car)
## Loading required package: carData
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(corrplot)
## corrplot 0.95 loaded

2. Import Data

# Mencari file CSV secara otomatis
file_csv <- list.files(
  pattern = "\\.csv$",
  full.names = TRUE
)

# Memastikan hanya ada satu file CSV yang digunakan
if (length(file_csv) == 0) {
  stop("File CSV tidak ditemukan. Pastikan file CSV berada di folder yang sama dengan file Rmd.")
}

# Jika terdapat lebih dari satu file CSV
if (length(file_csv) > 1) {
  stop("Terdapat lebih dari satu file CSV. Pastikan hanya file dataset yang digunakan berada di folder yang sama dengan file Rmd.")
}

# Membaca data
data <- read.csv(
  file_csv[1],
  header = TRUE,
  check.names = FALSE,
  stringsAsFactors = FALSE
)

# Informasi data
cat("File yang digunakan:", basename(file_csv[1]), "\n")
## File yang digunakan: HDI Unemployment and Education - Data Indonesia Provinces (2017-2023).csv
cat("Jumlah baris:", nrow(data), "\n")
## Jumlah baris: 245
cat("Jumlah kolom:", ncol(data), "\n")
## Jumlah kolom: 8

3. Pemeriksaan Data

# Melihat 6 baris pertama
head(data)
##           Provinsi Tingkat Pengangguran Terbuka (TPT) - Februari
## 1             ACEH                                          7.39
## 2   SUMATERA UTARA                                          6.41
## 3   SUMATERA BARAT                                          5.80
## 4             RIAU                                          5.76
## 5            JAMBI                                          3.67
## 6 SUMATERA SELATAN                                          3.80
##   Tingkat Pengangguran Terbuka (TPT) - Agustus
## 1                                         6.57
## 2                                         5.60
## 3                                         5.58
## 4                                         6.22
## 5                                         3.87
## 6                                         4.39
##   Tingkat Partisipasi Angkatan Kerja (TPAK) - Februari
## 1                                                65.59
## 2                                                69.13
## 3                                                70.42
## 4                                                68.42
## 5                                                70.84
## 6                                                72.12
##   Tingkat Partisipasi Angkatan Kerja (TPAK) - Agustus Tahun
## 1                                               63.74  2017
## 2                                               68.88  2017
## 3                                               66.29  2017
## 4                                               64.00  2017
## 5                                               67.52  2017
## 6                                               69.50  2017
##   Indeks Pembangunan Manusia Rata-rata Lama Sekolah
## 1                      70.60                   8.98
## 2                      70.57                   9.25
## 3                      71.24                   8.72
## 4                      71.79                   8.76
## 5                      69.99                   8.15
## 6                      68.86                   7.99
# Melihat struktur data
str(data)
## 'data.frame':    245 obs. of  8 variables:
##  $ Provinsi                                            : chr  "ACEH" "SUMATERA UTARA" "SUMATERA BARAT" "RIAU" ...
##  $ Tingkat Pengangguran Terbuka (TPT) - Februari       : num  7.39 6.41 5.8 5.76 3.67 3.8 2.81 4.43 4.46 6.44 ...
##  $ Tingkat Pengangguran Terbuka (TPT) - Agustus        : num  6.57 5.6 5.58 6.22 3.87 4.39 3.74 4.33 3.78 7.16 ...
##  $ Tingkat Partisipasi Angkatan Kerja (TPAK) - Februari: num  65.6 69.1 70.4 68.4 70.8 ...
##  $ Tingkat Partisipasi Angkatan Kerja (TPAK) - Agustus : num  63.7 68.9 66.3 64 67.5 ...
##  $ Tahun                                               : int  2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 ...
##  $ Indeks Pembangunan Manusia                          : num  70.6 70.6 71.2 71.8 70 ...
##  $ Rata-rata Lama Sekolah                              : num  8.98 9.25 8.72 8.76 8.15 7.99 8.47 7.79 7.78 9.79 ...
# Melihat nama variabel
names(data)
## [1] "Provinsi"                                            
## [2] "Tingkat Pengangguran Terbuka (TPT) - Februari"       
## [3] "Tingkat Pengangguran Terbuka (TPT) - Agustus"        
## [4] "Tingkat Partisipasi Angkatan Kerja (TPAK) - Februari"
## [5] "Tingkat Partisipasi Angkatan Kerja (TPAK) - Agustus" 
## [6] "Tahun"                                               
## [7] "Indeks Pembangunan Manusia"                          
## [8] "Rata-rata Lama Sekolah"
# Melihat ukuran data
dim(data)
## [1] 245   8
# Melihat ringkasan data
summary(data)
##       Provinsi   Tingkat Pengangguran Terbuka (TPT) - Februari
##  Length   :245   Min.   : 0.880                               
##  N.unique : 35   1st Qu.: 3.590                               
##  N.blank  :  0   Median : 4.540                               
##  Min.nchar:  4   Mean   : 4.827                               
##  Max.nchar: 20   3rd Qu.: 5.800                               
##                  Max.   :10.120                               
##  Tingkat Pengangguran Terbuka (TPT) - Agustus
##  Min.   : 1.400                              
##  1st Qu.: 3.870                              
##  Median : 4.740                              
##  Mean   : 5.124                              
##  3rd Qu.: 6.280                              
##  Max.   :10.950                              
##  Tingkat Partisipasi Angkatan Kerja (TPAK) - Februari
##  Min.   :61.85                                       
##  1st Qu.:67.23                                       
##  Median :69.74                                       
##  Mean   :69.60                                       
##  3rd Qu.:72.01                                       
##  Max.   :80.23                                       
##  Tingkat Partisipasi Angkatan Kerja (TPAK) - Agustus     Tahun     
##  Min.   :60.18                                       Min.   :2017  
##  1st Qu.:65.46                                       1st Qu.:2018  
##  Median :68.40                                       Median :2020  
##  Mean   :68.11                                       Mean   :2020  
##  3rd Qu.:69.83                                       3rd Qu.:2022  
##  Max.   :79.02                                       Max.   :2023  
##  Indeks Pembangunan Manusia Rata-rata Lama Sekolah
##  Min.   :59.09              Min.   : 6.270        
##  1st Qu.:69.55              1st Qu.: 7.960        
##  Median :71.30              Median : 8.610        
##  Mean   :71.28              Mean   : 8.611        
##  3rd Qu.:72.79              3rd Qu.: 9.220        
##  Max.   :82.46              Max.   :11.450
# Memeriksa data kosong
colSums(is.na(data))
##                                             Provinsi 
##                                                    0 
##        Tingkat Pengangguran Terbuka (TPT) - Februari 
##                                                    0 
##         Tingkat Pengangguran Terbuka (TPT) - Agustus 
##                                                    0 
## Tingkat Partisipasi Angkatan Kerja (TPAK) - Februari 
##                                                    0 
##  Tingkat Partisipasi Angkatan Kerja (TPAK) - Agustus 
##                                                    0 
##                                                Tahun 
##                                                    0 
##                           Indeks Pembangunan Manusia 
##                                                    0 
##                               Rata-rata Lama Sekolah 
##                                                    0

————————————————————

2. STATISTIK DESKRIPTIF DAN EKSPLORASI DATA

————————————————————

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("1. STATISTIK DESKRIPTIF\n")
## 1. STATISTIK DESKRIPTIF
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Statistik deskriptif
summary(data)
##       Provinsi   Tingkat Pengangguran Terbuka (TPT) - Februari
##  Length   :245   Min.   : 0.880                               
##  N.unique : 35   1st Qu.: 3.590                               
##  N.blank  :  0   Median : 4.540                               
##  Min.nchar:  4   Mean   : 4.827                               
##  Max.nchar: 20   3rd Qu.: 5.800                               
##                  Max.   :10.120                               
##  Tingkat Pengangguran Terbuka (TPT) - Agustus
##  Min.   : 1.400                              
##  1st Qu.: 3.870                              
##  Median : 4.740                              
##  Mean   : 5.124                              
##  3rd Qu.: 6.280                              
##  Max.   :10.950                              
##  Tingkat Partisipasi Angkatan Kerja (TPAK) - Februari
##  Min.   :61.85                                       
##  1st Qu.:67.23                                       
##  Median :69.74                                       
##  Mean   :69.60                                       
##  3rd Qu.:72.01                                       
##  Max.   :80.23                                       
##  Tingkat Partisipasi Angkatan Kerja (TPAK) - Agustus     Tahun     
##  Min.   :60.18                                       Min.   :2017  
##  1st Qu.:65.46                                       1st Qu.:2018  
##  Median :68.40                                       Median :2020  
##  Mean   :68.11                                       Mean   :2020  
##  3rd Qu.:69.83                                       3rd Qu.:2022  
##  Max.   :79.02                                       Max.   :2023  
##  Indeks Pembangunan Manusia Rata-rata Lama Sekolah
##  Min.   :59.09              Min.   : 6.270        
##  1st Qu.:69.55              1st Qu.: 7.960        
##  Median :71.30              Median : 8.610        
##  Mean   :71.28              Mean   : 8.611        
##  3rd Qu.:72.79              3rd Qu.: 9.220        
##  Max.   :82.46              Max.   :11.450
# Memilih variabel yang digunakan dalam model
data_korelasi <- data.frame(
  TPT_Ags  = data[[3]],
  TPAK_Ags = data[[5]],
  IPM      = data[[7]],
  RLS      = data[[8]]
)

# Mengubah nama variabel agar lebih sederhana
names(data_korelasi) <- c(
  "TPT_Ags",
  "TPAK_Ags",
  "IPM",
  "RLS"
)

# Matriks korelasi
cat("\nMatriks Korelasi:\n")
## 
## Matriks Korelasi:
cor_matrix <- cor(data_korelasi)

# Menampilkan matriks korelasi
print(round(cor_matrix, 3))
##          TPT_Ags TPAK_Ags    IPM    RLS
## TPT_Ags    1.000   -0.619  0.326  0.474
## TPAK_Ags  -0.619    1.000 -0.221 -0.424
## IPM        0.326   -0.221  1.000  0.779
## RLS        0.474   -0.424  0.779  1.000
# Visualisasi matriks korelasi
corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  col = colorRampPalette(c("blue", "white", "red"))(200),
  addCoef.col = "darkblue",
  tl.col = "darkblue",
  tl.srt = 0,
  tl.cex = 0.9,
  title = "Matriks Korelasi Antar Variabel",
  mar = c(0, 0, 2, 0)
)

# Scatter plot matrix
pairs(
  data_korelasi,
  main = "Scatter Plot Matrix",
  pch = 19
)

============================================================

3. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION

============================================================

cat("\n============================================================\n")
## 
## ============================================================
cat("3. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION\n")
## 3. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION
cat("============================================================\n")
## ============================================================
# Membuat data yang digunakan dalam model
data_model <- data.frame(
  TPT_Ags  = data[["Tingkat Pengangguran Terbuka (TPT) - Agustus"]],
  TPAK_Ags = data[["Tingkat Partisipasi Angkatan Kerja (TPAK) - Agustus"]],
  IPM      = data[["Indeks Pembangunan Manusia"]],
  RLS      = data[["Rata-rata Lama Sekolah"]]
)

# Fit model MLR
model <- lm(
  TPT_Ags ~ TPAK_Ags + IPM + RLS,
  data = data_model
)

# Ringkasan koefisien regresi
cat("\nKoefisien Regresi:\n")
## 
## Koefisien Regresi:
coef_df <- data.frame(
  Variabel = names(coef(model)),
  Koefisien = round(coef(model), 4),
  Std_Error = round(summary(model)$coefficients[, 2], 4),
  t_value = round(summary(model)$coefficients[, 3], 4),
  p_value = round(summary(model)$coefficients[, 4], 4)
)

print(coef_df, row.names = FALSE)
##     Variabel Koefisien Std_Error t_value p_value
##  (Intercept)   18.0189    2.5801  6.9837  0.0000
##     TPAK_Ags   -0.2588    0.0273 -9.4665  0.0000
##          IPM    0.0145    0.0355  0.4100  0.6822
##          RLS    0.4294    0.1570  2.7343  0.0067
# Interval kepercayaan 95%
cat("\nInterval Kepercayaan 95%:\n")
## 
## Interval Kepercayaan 95%:
ci <- round(confint(model, level = 0.95), 4)

colnames(ci) <- c("Batas_Bawah", "Batas_Atas")

print(ci)
##             Batas_Bawah Batas_Atas
## (Intercept)     12.9364    23.1014
## TPAK_Ags        -0.3127    -0.2050
## IPM             -0.0553     0.0844
## RLS              0.1200     0.7387
# Persamaan regresi
cat("\nPersamaan Regresi Linear Berganda:\n")
## 
## Persamaan Regresi Linear Berganda:
cat(
  "TPT_Ags = 18.0189 - 0.2588TPAK_Ags + 0.0145IPM + 0.4294RLS\n"
)
## TPT_Ags = 18.0189 - 0.2588TPAK_Ags + 0.0145IPM + 0.4294RLS

————————————————————

4. UJI SIGNIFIKANSI SIMULTAN (UJI F)

————————————————————

cat("\n============================================================\n")
## 
## ============================================================
cat("4. UJI SIGNIFIKANSI SIMULTAN (UJI F)\n")
## 4. UJI SIGNIFIKANSI SIMULTAN (UJI F)
cat("============================================================\n")
## ============================================================
# Ekstrak informasi F-test
f_stat <- summary(model)$fstatistic
f_value <- f_stat[1]
df1 <- f_stat[2]
df2 <- f_stat[3]
f_pvalue <- pf(f_value, df1, df2, lower.tail = FALSE)

cat("\nHipotesis:\n")
## 
## Hipotesis:
cat("H0: β1 = β2 = β3 = 0 (Model tidak signifikan)\n")
## H0: β1 = β2 = β3 = 0 (Model tidak signifikan)
cat("H1: Minimal ada satu βj ≠ 0 (Model signifikan)\n")
## H1: Minimal ada satu βj ≠ 0 (Model signifikan)
cat("\nHasil Uji F:\n")
## 
## Hasil Uji F:
cat("F-statistic:", round(f_value, 4), "\n")
## F-statistic: 62.6443
cat("df1:", df1, "\n")
## df1: 3
cat("df2:", df2, "\n")
## df2: 241
cat("p-value:", format(f_pvalue, scientific = TRUE), "\n")
## p-value: 5.591516e-30
if (f_pvalue < 0.05) {
  cat("Kesimpulan: Tolak H0 → Model signifikan pada α = 5%\n")
} else {
  cat("Kesimpulan: Gagal Tolak H0 → Model tidak signifikan\n")
}
## Kesimpulan: Tolak H0 → Model signifikan pada α = 5%

————————————————————

5. UJI SIGNIFIKANSI PARSIAL (UJI t)

————————————————————

cat("\n============================================================\n")
## 
## ============================================================
cat("5. UJI SIGNIFIKANSI PARSIAL (UJI t)\n")
## 5. UJI SIGNIFIKANSI PARSIAL (UJI t)
cat("============================================================\n")
## ============================================================
# Ekstrak koefisien dan hasil uji t
t_test <- summary(model)$coefficients

cat("\nHipotesis:\n")
## 
## Hipotesis:
cat("H0: βj = 0 (Variabel tidak berpengaruh signifikan)\n")
## H0: βj = 0 (Variabel tidak berpengaruh signifikan)
cat("H1: βj ≠ 0 (Variabel berpengaruh signifikan)\n")
## H1: βj ≠ 0 (Variabel berpengaruh signifikan)
cat("\nHasil Uji t:\n")
## 
## Hasil Uji t:
t_table <- data.frame(
  Variabel = rownames(t_test),
  Koefisien = round(t_test[, 1], 4),
  t_value = round(t_test[, 3], 4),
  p_value = round(t_test[, 4], 4)
)

print(t_table, row.names = FALSE)
##     Variabel Koefisien t_value p_value
##  (Intercept)   18.0189  6.9837  0.0000
##     TPAK_Ags   -0.2588 -9.4665  0.0000
##          IPM    0.0145  0.4100  0.6822
##          RLS    0.4294  2.7343  0.0067
cat("\nKeputusan pada α = 5%:\n")
## 
## Keputusan pada α = 5%:
for (i in 2:nrow(t_test)) {
  if (t_test[i, 4] < 0.05) {
    cat(rownames(t_test)[i], ": Tolak H0 → signifikan\n")
  } else {
    cat(rownames(t_test)[i], ": Gagal Tolak H0 → tidak signifikan\n")
  }
}
## TPAK_Ags : Tolak H0 → signifikan
## IPM : Gagal Tolak H0 → tidak signifikan
## RLS : Tolak H0 → signifikan

————————————————————

6. KOEFISIEN DETERMINASI

————————————————————

cat("\n============================================================\n")
## 
## ============================================================
cat("6. KOEFISIEN DETERMINASI\n")
## 6. KOEFISIEN DETERMINASI
cat("============================================================\n")
## ============================================================
# Ekstrak R-squared dan Adjusted R-squared
r_squared <- summary(model)$r.squared
adj_r_squared <- summary(model)$adj.r.squared

cat("\nR-squared:", round(r_squared, 4), "\n")
## 
## R-squared: 0.4381
cat("Adjusted R-squared:", round(adj_r_squared, 4), "\n")
## Adjusted R-squared: 0.4311
cat("\nInterpretasi:\n")
## 
## Interpretasi:
cat(
  "R-squared menunjukkan proporsi variasi TPT yang dapat dijelaskan ",
  "oleh variabel TPAK, IPM, dan RLS dalam model.\n"
)
## R-squared menunjukkan proporsi variasi TPT yang dapat dijelaskan  oleh variabel TPAK, IPM, dan RLS dalam model.

————————————————————

7. UJI ASUMSI RESIDUAL

————————————————————

cat("\n============================================================\n")
## 
## ============================================================
cat("7. UJI ASUMSI RESIDUAL\n")
## 7. UJI ASUMSI RESIDUAL
cat("============================================================\n")
## ============================================================
# 7.1 Uji Normalitas Residual - Shapiro-Wilk
cat("\n7.1 UJI NORMALITAS RESIDUAL (SHAPIRO-WILK)\n")
## 
## 7.1 UJI NORMALITAS RESIDUAL (SHAPIRO-WILK)
shapiro_test <- shapiro.test(residuals(model))

cat("W =", round(shapiro_test$statistic, 4), "\n")
## W = 0.953
cat("p-value =", format(shapiro_test$p.value, scientific = TRUE), "\n")
## p-value = 3.934847e-07
if (shapiro_test$p.value > 0.05) {
  cat("Kesimpulan: Gagal Tolak H0 → residual berdistribusi normal\n")
} else {
  cat("Kesimpulan: Tolak H0 → residual tidak berdistribusi normal\n")
}
## Kesimpulan: Tolak H0 → residual tidak berdistribusi normal
# Q-Q Plot Residual
qqnorm(
  residuals(model),
  main = "Q-Q Plot Residual"
)

qqline(
  residuals(model),
  col = "red",
  lwd = 2
)

# 7.2 UJI HETEROSKEDASTISITAS (BREUSCH-PAGAN)
cat("\n7.2 UJI HETEROSKEDASTISITAS (BREUSCH-PAGAN)\n")
## 
## 7.2 UJI HETEROSKEDASTISITAS (BREUSCH-PAGAN)
bp_test <- bptest(model)

cat("BP =", round(bp_test$statistic, 4), "\n")
## BP = 2.7667
cat("df =", bp_test$parameter, "\n")
## df = 3
cat("p-value =", format(bp_test$p.value, scientific = TRUE), "\n")
## p-value = 4.29011e-01
if (bp_test$p.value > 0.05) {
  cat("Kesimpulan: Gagal Tolak H0 → tidak terdapat heteroskedastisitas\n")
} else {
  cat("Kesimpulan: Tolak H0 → terdapat heteroskedastisitas\n")
}
## Kesimpulan: Gagal Tolak H0 → tidak terdapat heteroskedastisitas
# 7.3 UJI AUTOKORELASI (DURBIN-WATSON)
cat("\n7.3 UJI AUTOKORELASI (DURBIN-WATSON)\n")
## 
## 7.3 UJI AUTOKORELASI (DURBIN-WATSON)
dw_test <- dwtest(model)

cat("DW =", round(dw_test$statistic, 4), "\n")
## DW = 1.4364
cat("p-value =", format(dw_test$p.value, scientific = TRUE), "\n")
## p-value = 3.958082e-06
cat("\nKesimpulan:\n")
## 
## Kesimpulan:
if (dw_test$p.value > 0.05) {
  cat("Gagal Tolak H0 → tidak terdapat autokorelasi\n")
} else {
  cat("Tolak H0 → terdapat autokorelasi\n")
}
## Tolak H0 → terdapat autokorelasi
# 7.4 UJI MULTIKOLINEARITAS (VIF)
cat("\n7.4 UJI MULTIKOLINEARITAS (VIF)\n")
## 
## 7.4 UJI MULTIKOLINEARITAS (VIF)
vif_value <- vif(model)

cat("\nNilai VIF:\n")
## 
## Nilai VIF:
print(round(vif_value, 4))
## TPAK_Ags      IPM      RLS 
##   1.2653   2.6378   3.0579
cat("\nKesimpulan:\n")
## 
## Kesimpulan:
if (all(vif_value < 10)) {
  cat("Seluruh variabel memiliki VIF < 10 → tidak terdapat masalah multikolinearitas\n")
} else {
  cat("Terdapat variabel dengan VIF >= 10 → terdapat indikasi multikolinearitas\n")
}
## Seluruh variabel memiliki VIF < 10 → tidak terdapat masalah multikolinearitas
# 7.5 UJI SPESIFIKASI MODEL (RAMSEY RESET)
cat("\n7.5 UJI SPESIFIKASI MODEL (RAMSEY RESET)\n")
## 
## 7.5 UJI SPESIFIKASI MODEL (RAMSEY RESET)
reset_test <- resettest(model, power = 2:3, type = "fitted")

cat("\nHasil Uji Ramsey RESET:\n")
## 
## Hasil Uji Ramsey RESET:
cat("F =", round(reset_test$statistic, 4), "\n")
## F = 7.2353
cat("df1 =", reset_test$parameter[1], "\n")
## df1 = 2
cat("df2 =", reset_test$parameter[2], "\n")
## df2 = 239
cat("p-value =", format(round(reset_test$p.value, 5), nsmall = 5), "\n")
## p-value = 0.00089
cat("\nKesimpulan:\n")
## 
## Kesimpulan:
if (reset_test$p.value > 0.05) {
  cat("Gagal Tolak H0 → tidak terdapat indikasi kesalahan spesifikasi model\n")
} else {
  cat("Tolak H0 → terdapat indikasi kesalahan spesifikasi model\n")
}
## Tolak H0 → terdapat indikasi kesalahan spesifikasi model

============================================================

8. DIAGNOSTIK OUTLIER DAN OBSERVASI BERPENGARUH

============================================================

cat("\n============================================================\n")
## 
## ============================================================
cat("8. DIAGNOSTIK OUTLIER DAN OBSERVASI BERPENGARUH\n")
## 8. DIAGNOSTIK OUTLIER DAN OBSERVASI BERPENGARUH
cat("============================================================\n")
## ============================================================
n <- nrow(data_model)

# Cook's Distance
cook_dist <- cooks.distance(model)
cat("\nCook's Distance:\n")
## 
## Cook's Distance:
cat("Nilai maksimum:", round(max(cook_dist), 4), "\n")
## Nilai maksimum: 0.0673
cat("Threshold 4/n:", round(4 / n, 4), "\n")
## Threshold 4/n: 0.0163
cat("Jumlah observasi dengan Cook's Distance > threshold:", 
    sum(cook_dist > 4 / n), "\n")
## Jumlah observasi dengan Cook's Distance > threshold: 15
# 8.2 LEVERAGE
leverage <- hatvalues(model)
cat("\nLeverage (Hat Values):\n")
## 
## Leverage (Hat Values):
cat("Nilai maksimum:", round(max(leverage), 4), "\n")
## Nilai maksimum: 0.0722
cat("Threshold 2(k+1)/n:", round(2 * (length(coef(model))) / n, 4), "\n")
## Threshold 2(k+1)/n: 0.0327
cat("Jumlah observasi dengan leverage > threshold:", 
    sum(leverage > 2 * length(coef(model)) / n), "\n")
## Jumlah observasi dengan leverage > threshold: 30
# 8.3 STUDENTIZED RESIDUALS
std_resid <- rstudent(model)
cat("\nStudentized Residuals:\n")
## 
## Studentized Residuals:
cat("Nilai maksimum absolut:", round(max(abs(std_resid)), 4), "\n")
## Nilai maksimum absolut: 3.473
cat("Jumlah observasi dengan |std_resid| > 3:", 
    sum(abs(std_resid) > 3), "\n")
## Jumlah observasi dengan |std_resid| > 3: 5
# 8.4 DFBETAS
dfbetas_val <- dfbetas(model)
cat("\nDFBETAS:\n")
## 
## DFBETAS:
cat("Jumlah observasi dengan |DFBETAS| > 1:", 
    sum(abs(dfbetas_val) > 1), "\n")
## Jumlah observasi dengan |DFBETAS| > 1: 0

————————————————————

9. VISUALISASI DIAGNOSTIK

————————————————————

# Nilai yang digunakan untuk visualisasi
fitted_values <- fitted(model)
residuals <- residuals(model)
standardized_resid <- rstandard(model)
leverage <- hatvalues(model)
n <- nrow(data_model)

# Set par untuk 2x2 plot
par(mfrow = c(2, 2))

# Plot 1: Residual vs Fitted
plot(fitted_values, residuals,
     xlab = "Fitted Values", ylab = "Residuals",
     main = "Residual vs Fitted",
     pch = 19, col = "steelblue")
abline(h = 0, col = "red", lty = 2)
lines(lowess(fitted_values, residuals), col = "green", lwd = 2)

# Plot 2: QQ-Plot
qqnorm(residuals, pch = 19, col = "steelblue",
       main = "Normal Q-Q Plot")
qqline(residuals, col = "red", lwd = 2)

# Plot 3: Scale-Location
plot(fitted_values, sqrt(abs(standardized_resid)),
     xlab = "Fitted Values", ylab = "√|Standardized Residuals|",
     main = "Scale-Location",
     pch = 19, col = "steelblue")
lines(lowess(fitted_values, sqrt(abs(standardized_resid))), 
      col = "green", lwd = 2)

# Plot 4: Residual vs Leverage
plot(leverage, standardized_resid,
     xlab = "Leverage", ylab = "Standardized Residuals",
     main = "Residual vs Leverage",
     pch = 19, col = "steelblue")
abline(h = 0, col = "red", lty = 2)
abline(v = 2 * length(coef(model)) / n, col = "red", lty = 2)

# Reset par
par(mfrow = c(1, 1))

============================================================

10. TRANSFORMASI BOX-COX

============================================================

library(MASS)

# Mencari nilai lambda optimal
boxcox_result <- boxcox(model, 
                        lambda = seq(-2, 2, by = 0.1),
                        plotit = TRUE)

# Nilai lambda dengan log-likelihood maksimum
lambda_opt <- boxcox_result$x[
  which.max(boxcox_result$y)
]

cat("Lambda optimal:", round(lambda_opt, 4), "\n")
## Lambda optimal: 0.2626

============================================================

11. STEPWISE SELECTION

============================================================

stepwise_model <- step(
  model,
  direction = "both",
  trace = 0
)

cat("\nModel hasil Stepwise Selection:\n")
## 
## Model hasil Stepwise Selection:
print(formula(stepwise_model))
## TPT_Ags ~ TPAK_Ags + RLS
cat("\nRingkasan Model:\n")
## 
## Ringkasan Model:
summary(stepwise_model)
## 
## Call:
## lm(formula = TPT_Ags ~ TPAK_Ags + RLS, data = data_model)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.3292 -0.9741 -0.2335  0.7439  4.4515 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 18.47892    2.31938   7.967 6.36e-14 ***
## TPAK_Ags    -0.25669    0.02679  -9.582  < 2e-16 ***
## RLS          0.47928    0.09896   4.843 2.28e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.311 on 242 degrees of freedom
## Multiple R-squared:  0.4377, Adjusted R-squared:  0.4331 
## F-statistic: 94.21 on 2 and 242 DF,  p-value: < 2.2e-16

============================================================

12. RINGKASAN

============================================================

cat("\n============================================================\n")
## 
## ============================================================
cat("12. RINGKASAN HASIL\n")
## 12. RINGKASAN HASIL
cat("============================================================\n")
## ============================================================
cat("\nJumlah observasi:", nrow(data_model), "\n")
## 
## Jumlah observasi: 245
cat("Jumlah variabel prediktor:", length(coef(model)) - 1, "\n")
## Jumlah variabel prediktor: 3
cat("\nModel regresi:\n")
## 
## Model regresi:
cat("TPT_Ags = 18.0189 - 0.2588TPAK_Ags + 0.0145IPM + 0.4294RLS\n")
## TPT_Ags = 18.0189 - 0.2588TPAK_Ags + 0.0145IPM + 0.4294RLS
cat("\nKoefisien Determinasi:\n")
## 
## Koefisien Determinasi:
cat("R-squared =", round(summary(model)$r.squared, 4), "\n")
## R-squared = 0.4381
cat("Adjusted R-squared =", round(summary(model)$adj.r.squared, 4), "\n")
## Adjusted R-squared = 0.4311
cat("\nUji F:\n")
## 
## Uji F:
cat("F-statistic =", round(summary(model)$fstatistic[1], 4), "\n")
## F-statistic = 62.6443
cat("\nHasil Uji t:\n")
## 
## Hasil Uji t:
cat("TPAK_Ags: signifikan\n")
## TPAK_Ags: signifikan
cat("IPM: tidak signifikan\n")
## IPM: tidak signifikan
cat("RLS: signifikan\n")
## RLS: signifikan
cat("\nHasil Uji Asumsi:\n")
## 
## Hasil Uji Asumsi:
cat("Normalitas residual: tidak terpenuhi\n")
## Normalitas residual: tidak terpenuhi
cat("Heteroskedastisitas: tidak terdeteksi\n")
## Heteroskedastisitas: tidak terdeteksi
cat("Autokorelasi: terindikasi, dengan catatan data bersifat panel-like\n")
## Autokorelasi: terindikasi, dengan catatan data bersifat panel-like
cat("Multikolinearitas: tidak terdeteksi\n")
## Multikolinearitas: tidak terdeteksi
cat("Ramsey RESET: terdapat indikasi masalah spesifikasi\n")
## Ramsey RESET: terdapat indikasi masalah spesifikasi
cat("\nDiagnostik Outlier:\n")
## 
## Diagnostik Outlier:
cat("Observasi dengan Cook's Distance > 4/n: 15\n")
## Observasi dengan Cook's Distance > 4/n: 15
cat("Observasi dengan leverage > threshold: 30\n")
## Observasi dengan leverage > threshold: 30
cat("Observasi dengan |Studentized Residual| > 3: 5\n")
## Observasi dengan |Studentized Residual| > 3: 5
cat("Observasi dengan |DFBETAS| > 1: 0\n")
## Observasi dengan |DFBETAS| > 1: 0
cat("\nBox-Cox:\n")
## 
## Box-Cox:
cat("Lambda optimal =", round(lambda_opt, 4), "\n")
## Lambda optimal = 0.2626
cat("\nStepwise Selection:\n")
## 
## Stepwise Selection:
cat("Model terpilih: TPT_Ags ~ TPAK_Ags + RLS\n")
## Model terpilih: TPT_Ags ~ TPAK_Ags + RLS
cat("Variabel IPM dikeluarkan dari model.\n")
## Variabel IPM dikeluarkan dari model.