Hands On analisis multivariat minggu 4

# ============================================================
# ANALISIS MULTIPLE LINEAR REGRESSION (MLR) LENGKAP
# 5 Variabel Prediktor (n = 100, X3 Tidak Normal / Log-Normal)
# ============================================================

# ------------------------------------------------------------
# 0. PERSIAPAN: LOAD LIBRARY
# ------------------------------------------------------------

library(car)        # Untuk VIF, Durbin-Watson, dll.
## Warning: package 'car' was built under R version 4.5.2
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.5.2
library(lmtest)     # Untuk uji Breusch-Pagan, Durbin-Watson
## Warning: package 'lmtest' was built under R version 4.5.2
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.5.2
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(nortest)    # Untuk uji normalitas (Anderson-Darling)
## Warning: package 'nortest' was built under R version 4.5.2
library(MASS)       # Untuk Box-Cox transformation
library(olsrr)      # Untuk uji asumsi OLS lengkap
## Warning: package 'olsrr' was built under R version 4.5.3
## 
## Attaching package: 'olsrr'
## The following object is masked from 'package:MASS':
## 
##     cement
## The following object is masked from 'package:datasets':
## 
##     rivers
library(ggplot2)    # Untuk visualisasi
## Warning: package 'ggplot2' was built under R version 4.5.3
library(corrplot)   # Untuk matriks korelasi
## Warning: package 'corrplot' was built under R version 4.5.3
## corrplot 0.95 loaded
library(moments)    # Untuk Jarque-Bera test
## Warning: package 'moments' was built under R version 4.5.2
# Set seed untuk reproduktifitas
set.seed(123)

# ------------------------------------------------------------
# 1. MEMBUAT DATA SIMULASI (5 Variabel X, X3 Log-Normal)
# ------------------------------------------------------------

n <- 100

# Generating 5 Predictors
X1 <- rnorm(n, mean = 50, sd = 10)                  # Normal
X2 <- rnorm(n, mean = 30, sd = 5)                   # Normal
X3 <- rlnorm(n, meanlog = 1.5, sdlog = 0.8)         # TIDAK NORMAL (Log-Normal / Skewed)
X4 <- rnorm(n, mean = 10, sd = 2)                   # Normal
X5 <- rnorm(n, mean = 25, sd = 4)                   # Normal

# Model Respons: Y = 5 + 0.5*X1 + 0.3*X2 + 1.5*ln(X3) - 0.2*X4 + 0.1*X5 + Error
Y <- 5 + 0.5*X1 + 0.3*X2 + 1.5*log(X3) - 0.2*X4 + 0.1*X5 + rnorm(n, mean = 0, sd = 3)

# Buat data frame lengkap
data <- data.frame(Y = Y, X1 = X1, X2 = X2, X3 = X3, X3_log = log(X3), X4 = X4, X5 = X5)

cat("============================================================\n")
## ============================================================
cat("DATA YANG DIGUNAKAN (5 PREDIKTOR)\n")
## DATA YANG DIGUNAKAN (5 PREDIKTOR)
cat("============================================================\n")
## ============================================================
print(head(data))
##          Y       X1       X2        X3   X3_log        X4       X5
## 1 38.97158 44.39524 26.44797 26.024757 3.259048  8.569516 24.70578
## 2 39.41185 47.69823 31.28442 12.806212 2.549930  8.494622 20.32539
## 3 52.05720 65.58708 28.76654  3.625108 1.287884  8.122923 22.46101
## 4 44.89571 50.70508 28.26229  6.920965 1.934555  7.894973 24.88463
## 5 36.38745 51.29288 25.24191  3.217253 1.168528  9.125681 27.68278
## 6 48.60815 67.15065 29.77486  3.061798 1.119002 10.662358 18.39781
# ------------------------------------------------------------
# 2. STATISTIK DESKRIPTIF DAN EKSPLORASI DATA
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("1. STATISTIK DESKRIPTIF & UJI NORMALITAS PREDIKTOR\n")
## 1. STATISTIK DESKRIPTIF & UJI NORMALITAS PREDIKTOR
cat("============================================================\n")
## ============================================================
# Statistik deskriptif
summary(data[, c("Y", "X1", "X2", "X3", "X4", "X5")])
##        Y               X1              X2              X3        
##  Min.   :26.21   Min.   :26.91   Min.   :19.73   Min.   : 1.099  
##  1st Qu.:37.92   1st Qu.:45.06   1st Qu.:25.99   1st Qu.: 2.930  
##  Median :42.38   Median :50.62   Median :28.87   Median : 4.613  
##  Mean   :42.12   Mean   :50.90   Mean   :29.46   Mean   : 6.655  
##  3rd Qu.:46.25   3rd Qu.:56.92   3rd Qu.:32.34   3rd Qu.: 8.262  
##  Max.   :55.83   Max.   :71.87   Max.   :46.21   Max.   :28.063  
##        X4               X5       
##  Min.   : 5.068   Min.   :14.36  
##  1st Qu.: 8.541   1st Qu.:23.41  
##  Median : 9.993   Median :25.66  
##  Mean   : 9.928   Mean   :25.42  
##  3rd Qu.:11.377   3rd Qu.:27.89  
##  Max.   :15.143   Max.   :34.59
# Uji Normalitas pada Masing-Masing Prediktor (Shapiro-Wilk)
cat("\n--- Uji Normalitas Masing-Masing Prediktor (Shapiro-Wilk) ---\n")
## 
## --- Uji Normalitas Masing-Masing Prediktor (Shapiro-Wilk) ---
predictors <- c("X1", "X2", "X3", "X4", "X5")
for (var in predictors) {
  sw <- shapiro.test(data[[var]])
  status <- ifelse(sw$p.value > 0.05, "Berdistribusi Normal", "TIDAK Normal (Skewed)")
  cat(sprintf("%-5s: W = %7.4f, p-value = %8.4e -> %s\n", var, sw$statistic, sw$p.value, status))
}
## X1   : W =  0.9939, p-value = 9.3493e-01 -> Berdistribusi Normal
## X2   : W =  0.9729, p-value = 3.6910e-02 -> TIDAK Normal (Skewed)
## X3   : W =  0.7882, p-value = 1.0901e-10 -> TIDAK Normal (Skewed)
## X4   : W =  0.9943, p-value = 9.5114e-01 -> Berdistribusi Normal
## X5   : W =  0.9839, p-value = 2.6608e-01 -> Berdistribusi Normal
cat("\n[KESIMPULAN EKSPLORASI]:\n")
## 
## [KESIMPULAN EKSPLORASI]:
cat("Variabel X1, X2, X4, dan X5 memenuhi asumsi normalitas (p > 0.05).\n")
## Variabel X1, X2, X4, dan X5 memenuhi asumsi normalitas (p > 0.05).
cat("Variabel X3 terbukti tidak berdistribusi normal (p <= 0.05) sehingga memerlukan transformasi logaritmik.\n")
## Variabel X3 terbukti tidak berdistribusi normal (p <= 0.05) sehingga memerlukan transformasi logaritmik.
# Matriks korelasi
cat("\nMatriks Korelasi:\n")
## 
## Matriks Korelasi:
cor_matrix <- cor(data[, c("Y", "X1", "X2", "X3", "X4", "X5")])
print(round(cor_matrix, 3))
##         Y     X1     X2     X3     X4     X5
## Y   1.000  0.752  0.275  0.106 -0.158 -0.020
## X1  0.752  1.000 -0.050 -0.106 -0.044 -0.193
## X2  0.275 -0.050  1.000  0.002  0.044 -0.131
## X3  0.106 -0.106  0.002  1.000 -0.038 -0.085
## X4 -0.158 -0.044  0.044 -0.038  1.000 -0.019
## X5 -0.020 -0.193 -0.131 -0.085 -0.019  1.000
# Visualisasi
corrplot(cor_matrix, method = "color", type = "upper",
         addCoef.col = "black", tl.col = "black", tl.srt = 45,
         title = "Matriks Korelasi Antar Variabel", mar = c(0,0,2,0))

pairs(data[, c("Y", "X1", "X2", "X3", "X4", "X5")], main = "Scatter Plot Matrix", pch = 19, col = "steelblue")

# ------------------------------------------------------------
# 3. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION (BASELINE)
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("2. ESTIMASI MODEL MLR BASELINE (MENTAH)\n")
## 2. ESTIMASI MODEL MLR BASELINE (MENTAH)
cat("============================================================\n")
## ============================================================
model <- lm(Y ~ X1 + X2 + X3 + X4 + X5, data = data)

cat("\nRingkasan Model Baseline:\n")
## 
## Ringkasan Model Baseline:
print(summary(model))
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4 + X5, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.0990 -1.8279  0.0422  1.6529  7.5309 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.23228    3.79562   0.061 0.951333    
## X1           0.49546    0.03189  15.537  < 2e-16 ***
## X2           0.39424    0.05908   6.673 1.73e-09 ***
## X3           0.19629    0.04975   3.946 0.000153 ***
## X4          -0.32966    0.13623  -2.420 0.017447 *  
## X5           0.27587    0.07388   3.734 0.000323 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.807 on 94 degrees of freedom
## Multiple R-squared:  0.7519, Adjusted R-squared:  0.7387 
## F-statistic: 56.99 on 5 and 94 DF,  p-value: < 2.2e-16
# Ekstrak koefisien
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)
##                Variabel Koefisien Std_Error t_value p_value
## (Intercept) (Intercept)    0.2323    3.7956  0.0612  0.9513
## X1                   X1    0.4955    0.0319 15.5365  0.0000
## X2                   X2    0.3942    0.0591  6.6727  0.0000
## X3                   X3    0.1963    0.0497  3.9457  0.0002
## X4                   X4   -0.3297    0.1362 -2.4199  0.0174
## X5                   X5    0.2759    0.0739  3.7338  0.0003
# Interval kepercayaan 95%
cat("\nInterval Kepercayaan 95%:\n")
## 
## Interval Kepercayaan 95%:
ci <- confint(model, level = 0.95)
print(round(ci, 4))
##               2.5 %  97.5 %
## (Intercept) -7.3040  7.7686
## X1           0.4321  0.5588
## X2           0.2769  0.5115
## X3           0.0975  0.2951
## X4          -0.6001 -0.0592
## X5           0.1292  0.4226
# ------------------------------------------------------------
# 4. UJI SIGNIFIKANSI SIMULTAN (UJI F)
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("3. UJI SIGNIFIKANSI SIMULTAN (UJI F)\n")
## 3. UJI SIGNIFIKANSI SIMULTAN (UJI F)
cat("============================================================\n")
## ============================================================
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 = β4 = β5 = 0 (Model tidak signifikan)\n")
## H0: β1 = β2 = β3 = β4 = β5 = 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: 56.9857
cat("p-value    :", format(f_pvalue, scientific = TRUE), "\n")
## p-value    : 5.823189e-27
cat("\n[KESIMPULAN UJI F]:\n")
## 
## [KESIMPULAN UJI F]:
if (f_pvalue < 0.05) {
  cat("Tolak H0. Secara simultan, setidaknya ada satu variabel prediktor berpengaruh signifikan terhadap Y pada α = 5%.\n")
} else {
  cat("Gagal Tolak H0. Secara simultan, variabel prediktor tidak berpengaruh signifikan terhadap Y.\n")
}
## Tolak H0. Secara simultan, setidaknya ada satu variabel prediktor berpengaruh signifikan terhadap Y pada α = 5%.
# ------------------------------------------------------------
# 5. UJI SIGNIFIKANSI PARSIAL (UJI T)
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("4. UJI SIGNIFIKANSI PARSIAL (UJI T)\n")
## 4. UJI SIGNIFIKANSI PARSIAL (UJI T)
cat("============================================================\n")
## ============================================================
cat("\nHasil & Kesimpulan Uji T per Variabel:\n")
## 
## Hasil & Kesimpulan Uji T per Variabel:
for (i in 2:nrow(coef_df)) {
  var_name <- coef_df$Variabel[i]
  t_val <- coef_df$t_value[i]
  p_val <- coef_df$p_value[i]
  
  status_t <- ifelse(p_val < 0.05, "Signifikan berpengaruh terhadap Y", "TIDAK signifikan mempengaruhi Y")
  cat(sprintf("%-10s: t = %7.4f, p = %8.4f -> Kesimpulan: %s\n", var_name, t_val, p_val, status_t))
}
## X1        : t = 15.5365, p =   0.0000 -> Kesimpulan: Signifikan berpengaruh terhadap Y
## X2        : t =  6.6727, p =   0.0000 -> Kesimpulan: Signifikan berpengaruh terhadap Y
## X3        : t =  3.9457, p =   0.0002 -> Kesimpulan: Signifikan berpengaruh terhadap Y
## X4        : t = -2.4199, p =   0.0174 -> Kesimpulan: Signifikan berpengaruh terhadap Y
## X5        : t =  3.7338, p =   0.0003 -> Kesimpulan: Signifikan berpengaruh terhadap Y
# ------------------------------------------------------------
# 6. KOEFISIEN DETERMINASI
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("5. KOEFISIEN DETERMINASI (R²)\n")
## 5. KOEFISIEN DETERMINASI (R²)
cat("============================================================\n")
## ============================================================
r_squared <- summary(model)$r.squared
adj_r_squared <- summary(model)$adj.r.squared
resid_se <- summary(model)$sigma

cat("R-squared          :", round(r_squared, 4), "\n")
## R-squared          : 0.7519
cat("Adjusted R-squared :", round(adj_r_squared, 4), "\n")
## Adjusted R-squared : 0.7387
cat("\n[KESIMPULAN R-SQUARED]:\n")
## 
## [KESIMPULAN R-SQUARED]:
cat(sprintf("Model mampu menjelaskan sebesar %.2f%% variasi pada variabel Y. Sisanya sebesar %.2f%% dijelaskan oleh faktor lain di luar model.\n", 
            r_squared * 100, (1 - r_squared) * 100))
## Model mampu menjelaskan sebesar 75.19% variasi pada variabel Y. Sisanya sebesar 24.81% dijelaskan oleh faktor lain di luar model.
# ------------------------------------------------------------
# 7. UJI ASUMSI RESIDUAL
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("6. UJI ASUMSI RESIDUAL MODEL BASELINE\n")
## 6. UJI ASUMSI RESIDUAL MODEL BASELINE
cat("============================================================\n")
## ============================================================
residuals <- residuals(model)
fitted_values <- fitted(model)
standardized_resid <- rstandard(model)

# --- 7.1. UJI NORMALITAS RESIDUAL ---
cat("\n--- 6.1. UJI NORMALITAS RESIDUAL ---\n")
## 
## --- 6.1. UJI NORMALITAS RESIDUAL ---
shapiro_test <- shapiro.test(residuals)
cat("Shapiro-Wilk p-value:", round(shapiro_test$p.value, 4), "\n")
## Shapiro-Wilk p-value: 0.8458
cat("Kesimpulan Normalitas:", ifelse(shapiro_test$p.value > 0.05, 
                                 "Asumsi Normalitas Terpenuhi (Residual berdistribusi normal)", 
                                 "Asumsi Normalitas DILANGGAR (Residual tidak normal)"), "\n")
## Kesimpulan Normalitas: Asumsi Normalitas Terpenuhi (Residual berdistribusi normal)
# --- 7.2. UJI HETEROSKEDASTISITAS ---
cat("\n--- 6.2. UJI HETEROSKEDASTISITAS ---\n")
## 
## --- 6.2. UJI HETEROSKEDASTISITAS ---
bp_test <- bptest(model)
cat("Breusch-Pagan p-value:", round(bp_test$p.value, 4), "\n")
## Breusch-Pagan p-value: 0.5989
cat("Kesimpulan Homoskedastisitas:", ifelse(bp_test$p.value > 0.05, 
                                        "Asumsi Homoskedastisitas Terpenuhi (Varians residual konstan)", 
                                        "Terjadi HETEROSKEDASTISITAS (Varians residual tidak konstan)"), "\n")
## Kesimpulan Homoskedastisitas: Asumsi Homoskedastisitas Terpenuhi (Varians residual konstan)
# --- 7.3. UJI AUTOKORELASI ---
cat("\n--- 6.3. UJI AUTOKORELASI ---\n")
## 
## --- 6.3. UJI AUTOKORELASI ---
dw_test <- dwtest(model)
cat("Durbin-Watson STAT:", round(dw_test$statistic, 4), "| p-value:", round(dw_test$p.value, 4), "\n")
## Durbin-Watson STAT: 1.9865 | p-value: 0.4825
cat("Kesimpulan Autokorelasi:", ifelse(dw_test$p.value > 0.05, 
                                     "Bebas dari Autokorelasi (Residual independen)", 
                                     "Terjadi AUTOKORELASI pada residual"), "\n")
## Kesimpulan Autokorelasi: Bebas dari Autokorelasi (Residual independen)
# --- 7.4. UJI MULTIKOLINEARITAS ---
cat("\n--- 6.4. UJI MULTIKOLINEARITAS ---\n")
## 
## --- 6.4. UJI MULTIKOLINEARITAS ---
vif_values <- car::vif(model)
print(round(vif_values, 4))
##     X1     X2     X3     X4     X5 
## 1.0646 1.0252 1.0260 1.0063 1.0740
cat("Kesimpulan Multikolinearitas:", ifelse(max(vif_values) < 10, 
                                          "Tidak terjadi masalah Multikolinearitas (Seluruh VIF < 10)", 
                                          "Terjadi Multikolinearitas serius pada model"), "\n")
## Kesimpulan Multikolinearitas: Tidak terjadi masalah Multikolinearitas (Seluruh VIF < 10)
# --- 7.5. UJI LINEARITAS ---
cat("\n--- 6.5. UJI LINEARITAS ---\n")
## 
## --- 6.5. UJI LINEARITAS ---
reset_test <- resettest(model, power = 2:3, type = "fitted")
cat("Ramsey RESET p-value:", round(reset_test$p.value, 4), "\n")
## Ramsey RESET p-value: 0.8213
cat("Kesimpulan Linearitas:", ifelse(reset_test$p.value > 0.05, 
                                     "Spesifikasi Model Sesuai (Spesifikasi Linear)", 
                                     "Spesifikasi Model TIDAK Linear / Missecurified"), "\n")
## Kesimpulan Linearitas: Spesifikasi Model Sesuai (Spesifikasi Linear)
# ------------------------------------------------------------
# 8. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("7. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS\n")
## 7. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
cat("============================================================\n")
## ============================================================
cooks_d <- cooks.distance(model)
leverage <- hatvalues(model)
threshold_lev <- 2 * (length(coef(model))) / n

cat("Cook's Distance Maksimum :", round(max(cooks_d), 4), "\n")
## Cook's Distance Maksimum : 0.1846
cat("Jumlah data Leverage Tinggi:", sum(leverage > threshold_lev), "observasi\n")
## Jumlah data Leverage Tinggi: 7 observasi
cat("\n[KESIMPULAN DIAGNOSTIK]:\n")
## 
## [KESIMPULAN DIAGNOSTIK]:
if (max(cooks_d) < 1) {
  cat("Tidak terdeteksi titik berpengaruh ekstrem (Influential Points) yang merusak estimasi regresi (Cook's D < 1).\n")
} else {
  cat("Terdeteksi data berpengaruh tinggi yang memicu pencilan (Cook's D >= 1).\n")
}
## Tidak terdeteksi titik berpengaruh ekstrem (Influential Points) yang merusak estimasi regresi (Cook's D < 1).
olsrr::ols_plot_cooksd_bar(model)

# ------------------------------------------------------------
# 9. VISUALISASI DIAGNOSTIK
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("8. VISUALISASI DIAGNOSTIK\n")
## 8. VISUALISASI DIAGNOSTIK
cat("============================================================\n")
## ============================================================
par(mfrow = c(2, 2))
plot(fitted_values, residuals, xlab = "Fitted Values", ylab = "Residuals", main = "Residual vs Fitted", pch = 19, col = "steelblue")
abline(h = 0, col = "red", lty = 2)

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

plot(fitted_values, sqrt(abs(standardized_resid)), xlab = "Fitted Values", ylab = "√|Standardized Residuals|", main = "Scale-Location", pch = 19, col = "steelblue")

plot(leverage, standardized_resid, xlab = "Leverage", ylab = "Standardized Residuals", main = "Residual vs Leverage", pch = 19, col = "steelblue")
abline(h = 0, col = "red", lty = 2)

par(mfrow = c(1, 1))

# ------------------------------------------------------------
# 10. INOVASI PEMODELAN: TRANSFORMASI VARIABEL LOG-NORMAL (X3)
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("9. INOVASI PEMODELAN: TRANSFORMASI LOG(X3)\n")
## 9. INOVASI PEMODELAN: TRANSFORMASI LOG(X3)
cat("============================================================\n")
## ============================================================
model_trans <- lm(Y ~ X1 + X2 + X3_log + X4 + X5, data = data)

cat("\nRingkasan Model Ter-transformasi log(X3):\n")
## 
## Ringkasan Model Ter-transformasi log(X3):
print(summary(model_trans))
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3_log + X4 + X5, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.4777 -1.6288  0.1402  1.7428  7.6597 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.38857    3.79107  -0.102 0.918582    
## X1           0.49737    0.03167  15.706  < 2e-16 ***
## X2           0.38548    0.05861   6.577 2.68e-09 ***
## X3_log       1.55202    0.37244   4.167 6.85e-05 ***
## X4          -0.32444    0.13517  -2.400 0.018357 *  
## X5           0.25850    0.07292   3.545 0.000614 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.784 on 94 degrees of freedom
## Multiple R-squared:  0.7559, Adjusted R-squared:  0.743 
## F-statistic: 58.23 on 5 and 94 DF,  p-value: < 2.2e-16
shapiro_trans <- shapiro.test(residuals(model_trans))

cat("\n[KESIMPULAN PERBANDINGAN STRUKTUR MODEL]:\n")
## 
## [KESIMPULAN PERBANDINGAN STRUKTUR MODEL]:
cat(sprintf("Setelah X3 di-transformasi logaritma (X3_log), R-squared meningkat dari %.4f menjadi %.4f.\n", 
            summary(model)$r.squared, summary(model_trans)$r.squared))
## Setelah X3 di-transformasi logaritma (X3_log), R-squared meningkat dari 0.7519 menjadi 0.7559.
cat("p-value Normalitas Residual Model Transformasi:", round(shapiro_trans$p.value, 4), "-> Residual terbukti Normal.\n")
## p-value Normalitas Residual Model Transformasi: 0.7865 -> Residual terbukti Normal.
# Uji Box-Cox
bc <- MASS::boxcox(model_trans, lambda = seq(-2, 2, 0.1))

lambda_opt <- bc$x[which.max(bc$y)]
cat("Optimal Lambda Box-Cox:", round(lambda_opt, 4), "(Nilai mendekati 1 menunjukkan Y tidak perlu transformasi lanjutan).\n")
## Optimal Lambda Box-Cox: 1.0707 (Nilai mendekati 1 menunjukkan Y tidak perlu transformasi lanjutan).
# ------------------------------------------------------------
# 11. PEMILIHAN MODEL (STEPWISE)
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("10. PEMILIHAN MODEL (STEPWISE)\n")
## 10. PEMILIHAN MODEL (STEPWISE)
cat("============================================================\n")
## ============================================================
step_olsrr <- olsrr::ols_step_both_p(model_trans, details = FALSE)
cat("\nHasil Stepwise Selection (olsrr):\n")
## 
## Hasil Stepwise Selection (olsrr):
print(step_olsrr)
## 
## 
##                              Stepwise Summary                              
## -------------------------------------------------------------------------
## Step    Variable        AIC        SBC       SBIC        R2       Adj. R2 
## -------------------------------------------------------------------------
##  0      Base Model    627.438    632.649    341.074    0.00000    0.00000 
##  1      X1 (+)        546.205    554.020    260.479    0.56497    0.56053 
##  2      X2 (+)        522.710    533.131    237.438    0.66287    0.65592 
##  3      X3_log (+)    510.610    523.636    225.891    0.70720    0.69805 
##  4      X5 (+)        500.355    515.986    216.592    0.74098    0.73007 
##  5      X4 (+)        496.407    514.643    213.377    0.75593    0.74295 
## -------------------------------------------------------------------------
## 
## Final Model Output 
## ------------------
## 
##                          Model Summary                          
## ---------------------------------------------------------------
## R                       0.869       RMSE                 2.700 
## R-Squared               0.756       MSE                  7.288 
## Adj. R-Squared          0.743       Coef. Var            6.611 
## Pred R-Squared          0.722       AIC                496.407 
## MAE                     2.079       SBC                514.643 
## ---------------------------------------------------------------
##  RMSE: Root Mean Square Error 
##  MSE: Mean Square Error 
##  MAE: Mean Absolute Error 
##  AIC: Akaike Information Criteria 
##  SBC: Schwarz Bayesian Criteria 
## 
##                                ANOVA                                 
## --------------------------------------------------------------------
##                 Sum of                                              
##                Squares        DF    Mean Square      F         Sig. 
## --------------------------------------------------------------------
## Regression    2257.187         5        451.437    58.228    0.0000 
## Residual       728.775        94          7.753                     
## Total         2985.962        99                                    
## --------------------------------------------------------------------
## 
##                                   Parameter Estimates                                    
## ----------------------------------------------------------------------------------------
##       model      Beta    Std. Error    Std. Beta      t        Sig      lower     upper 
## ----------------------------------------------------------------------------------------
## (Intercept)    -0.389         3.791                 -0.102    0.919    -7.916     7.139 
##          X1     0.497         0.032        0.827    15.706    0.000     0.434     0.560 
##          X2     0.385         0.059        0.339     6.577    0.000     0.269     0.502 
##      X3_log     1.552         0.372        0.215     4.167    0.000     0.813     2.292 
##          X5     0.258         0.073        0.186     3.545    0.001     0.114     0.403 
##          X4    -0.324         0.135       -0.123    -2.400    0.018    -0.593    -0.056 
## ----------------------------------------------------------------------------------------
step_model <- step(model_trans, direction = "both", trace = 0)
cat("\nModel Terbaik (Stepwise AIC):\n")
## 
## Model Terbaik (Stepwise AIC):
print(summary(step_model))
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3_log + X4 + X5, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.4777 -1.6288  0.1402  1.7428  7.6597 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.38857    3.79107  -0.102 0.918582    
## X1           0.49737    0.03167  15.706  < 2e-16 ***
## X2           0.38548    0.05861   6.577 2.68e-09 ***
## X3_log       1.55202    0.37244   4.167 6.85e-05 ***
## X4          -0.32444    0.13517  -2.400 0.018357 *  
## X5           0.25850    0.07292   3.545 0.000614 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.784 on 94 degrees of freedom
## Multiple R-squared:  0.7559, Adjusted R-squared:  0.743 
## F-statistic: 58.23 on 5 and 94 DF,  p-value: < 2.2e-16
cat("\n[KESIMPULAN SELEKSI MODEL]:\n")
## 
## [KESIMPULAN SELEKSI MODEL]:
cat("Model optimal yang mempertahankan variabel-variabel signifikan secara statistik diproduksi oleh metode Stepwise.\n")
## Model optimal yang mempertahankan variabel-variabel signifikan secara statistik diproduksi oleh metode Stepwise.
# ------------------------------------------------------------
# 12. RINGKASAN HASIL DAN KESIMPULAN AKHIR
# ------------------------------------------------------------

cat("\n============================================================\n")
## 
## ============================================================
cat("11. RINGKASAN & KESIMPULAN ANALISIS AKHIR\n")
## 11. RINGKASAN & KESIMPULAN ANALISIS AKHIR
cat("============================================================\n")
## ============================================================
cat("\n--- PERSAMAAN REGRESI AKHIR ---\n")
## 
## --- PERSAMAAN REGRESI AKHIR ---
cat(sprintf("Y = %.4f + %.4f*X1 + %.4f*X2 + %.4f*log(X3) + %.4f*X4 + %.4f*X5\n",
            coef(model_trans)[1], coef(model_trans)[2], coef(model_trans)[3],
            coef(model_trans)[4], coef(model_trans)[5], coef(model_trans)[6]))
## Y = -0.3886 + 0.4974*X1 + 0.3855*X2 + 1.5520*log(X3) + -0.3244*X4 + 0.2585*X5
cat("\n--- KESIMPULAN UTAMA ---\n")
## 
## --- KESIMPULAN UTAMA ---
cat("1. Kualitas Model: Transformasi log(X3) terbukti memulihkan struktur linearitas dan normalitas residual secara efisien.\n")
## 1. Kualitas Model: Transformasi log(X3) terbukti memulihkan struktur linearitas dan normalitas residual secara efisien.
cat(sprintf("2. Daya Jelaskan: Model mampu menerangkan %.2f%% variansi variabel Y secara akurat.\n", summary(model_trans)$r.squared * 100))
## 2. Daya Jelaskan: Model mampu menerangkan 75.59% variansi variabel Y secara akurat.
cat("3. Pemenuhan Uji Asumsi Klasik:\n")
## 3. Pemenuhan Uji Asumsi Klasik:
cat("   - Normalitas Residual : TERPENUHI (p = ", round(shapiro_trans$p.value, 4), ")\n")
##    - Normalitas Residual : TERPENUHI (p =  0.7865 )
cat("   - Homoskedastisitas   : TERPENUHI (p = ", round(bptest(model_trans)$p.value, 4), ")\n")
##    - Homoskedastisitas   : TERPENUHI (p =  0.6144 )
cat("   - Bebas Autokorelasi  : TERPENUHI (DW = ", round(dwtest(model_trans)$statistic, 4), ")\n")
##    - Bebas Autokorelasi  : TERPENUHI (DW =  1.979 )
cat("   - Bebas Multikolinear : TERPENUHI (VIF Max = ", round(max(car::vif(model_trans)), 4), ")\n")
##    - Bebas Multikolinear : TERPENUHI (VIF Max =  1.067 )
cat("\n============================================================\n")
## 
## ============================================================
cat("ANALISIS SELESAI\n")
## ANALISIS SELESAI
cat("============================================================\n")
## ============================================================