library(olsrr)
## Warning: package 'olsrr' was built under R version 4.5.3
##
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
##
## rivers
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.2
set.seed(123)
#MEMBACA DATA PENELITIAN
file_data <- file.choose()
data <- read.csv2(
file_data,
header = TRUE,
stringsAsFactors = FALSE,
check.names = FALSE,
na.strings = c("", "NA")
)
names(data) <- trimws(names(data))
cat("\nNama kolom dari file:\n")
##
## Nama kolom dari file:
print(names(data))
## [1] "Provinsi" "Total fasilitas kesehatan (Y)"
## [3] "Penduduk (X1)" "Desa Kelurahan (X2)"
## [5] "Tenaga Kesehatan (X3)" "Luas wilayah (X4)"
names(data) <- c(
"Provinsi",
"Y",
"X1",
"X2",
"X3",
"X4"
)
data$Y <- as.numeric(
gsub(",", ".", data$Y, fixed = TRUE)
)
data$X1 <- as.numeric(
gsub(",", ".", data$X1, fixed = TRUE)
)
data$X2 <- as.numeric(
gsub(",", ".", data$X2, fixed = TRUE)
)
data$X3 <- as.numeric(
gsub(",", ".", data$X3, fixed = TRUE)
)
data$X4 <- as.numeric(
gsub(",", ".", data$X4, fixed = TRUE)
)
data <- data[
!is.na(data$Provinsi) &
trimws(data$Provinsi) != "",
]
data <- data[
complete.cases(
data[, c("Y", "X1", "X2", "X3", "X4")]
),
]
rownames(data) <- NULL
cat(
paste(rep("=", 60), collapse = ""),
"\n"
)
## ============================================================
cat("DATA YANG DIGUNAKAN\n")
## DATA YANG DIGUNAKAN
cat(
paste(rep("=", 60), collapse = ""),
"\n"
)
## ============================================================
print(data)
## Provinsi Y X1 X2 X3 X4
## 1 Aceh 452 5626.0 6513 623 56835.02
## 2 Sumatera Utara 827 15785.8 6113 1625 72437.76
## 3 Sumatera Barat 363 5914.3 1287 1088 42107.67
## 4 Riau 323 6811.2 1870 1821 89900.78
## 5 Jambi 253 3768.5 1586 2122 49023.04
## 6 Sumatera Selatan 443 8928.5 3285 519 86771.92
## 7 Bengkulu 207 2138.0 1513 2321 20122.21
## 8 Lampung 405 9522.9 2654 1951 33570.76
## 9 Kepulauan Bangka Belitung 93 1550.8 393 2011 16670.23
## 10 Kepulauan Riau 135 2213.5 430 2656 8170.38
## 11 DKI Jakarta 238 10678.0 267 1180 661.53
## 12 Jawa Barat 1542 50759.0 5957 461 37053.33
## 13 Jawa Tengah 1250 38233.9 8563 412 34347.43
## 14 DI Yogyakarta 1418 42089.3 8494 415 48055.88
## 15 Jawa Timur 389 12537.4 1552 2262 9355.76
## 16 Banten 202 4461.3 718 1859 5582.83
## 17 Bali 223 5731.1 1180 968 19631.99
## 18 Nusa Tenggara Barat 508 5742.6 3538 245 46378.11
## 19 Nusa Tenggara Timur 311 5766.0 2157 1765 147018.06
## 20 Kalimantan Barat 239 2845.0 1577 2449 153430.36
## 21 Kalimantan Tengah 294 4323.3 2015 1007 37125.43
## 22 Kalimantan Selatan 254 4267.6 1055 2310 126951.76
## 23 Kalimantan Timur 75 749.4 484 2719 69900.89
## 24 Kalimantan Utara 263 2721.4 1838 3072 14488.43
## 25 Sulawesi Utara 260 3156.1 2022 2163 61496.98
## 26 Sulawesi Tengah 598 9563.1 3060 711 45323.98
## 27 Sulawesi Selatan 351 2836.7 2292 971 36139.30
## 28 Sulawesi Tenggara 117 1242.2 732 3096 12024.98
## 29 Gorontalo 114 1525.3 650 3523 16590.67
## 30 Sulawesi Barat 270 1970.6 1262 3513 46133.83
## 31 Maluku 173 1373.8 1209 3568 31465.98
## 32 Maluku Utara 95 587.6 970 1968 60308.59
## 33 Papua Barat 131 636.4 1056 1980 39103.06
## 34 Papua Barat Daya 142 1073.6 1029 4122 81383.32
## 35 Papua 93 549.7 690 2394 117858.97
## 36 Papua Selatan 141 1492.3 1208 2392 61079.59
## 37 Papua Tengah 191 1484.9 2634 1671 52508.66
cat("\n6 BARIS PERTAMA:\n")
##
## 6 BARIS PERTAMA:
print(head(data))
## Provinsi Y X1 X2 X3 X4
## 1 Aceh 452 5626.0 6513 623 56835.02
## 2 Sumatera Utara 827 15785.8 6113 1625 72437.76
## 3 Sumatera Barat 363 5914.3 1287 1088 42107.67
## 4 Riau 323 6811.2 1870 1821 89900.78
## 5 Jambi 253 3768.5 1586 2122 49023.04
## 6 Sumatera Selatan 443 8928.5 3285 519 86771.92
cat("\nSTRUKTUR DATA:\n")
##
## STRUKTUR DATA:
str(data)
## 'data.frame': 37 obs. of 6 variables:
## $ Provinsi: chr "Aceh" "Sumatera Utara" "Sumatera Barat" "Riau" ...
## $ Y : num 452 827 363 323 253 443 207 405 93 135 ...
## $ X1 : num 5626 15786 5914 6811 3768 ...
## $ X2 : num 6513 6113 1287 1870 1586 ...
## $ X3 : num 623 1625 1088 1821 2122 ...
## $ X4 : num 56835 72438 42108 89901 49023 ...
n <- nrow(data)
cat("\nJumlah observasi =", n, "\n")
##
## Jumlah observasi = 37
cat("Jumlah variabel =", ncol(data), "\n")
## Jumlah variabel = 6
#DEFINISI VARIABEL
cat("\nKeterangan Variabel:\n")
##
## Keterangan Variabel:
cat("Y = Total Fasilitas Kesehatan\n")
## Y = Total Fasilitas Kesehatan
cat("X1 = Jumlah Penduduk (Ribu)\n")
## X1 = Jumlah Penduduk (Ribu)
cat("X2 = Jumlah Desa/Kelurahan\n")
## X2 = Jumlah Desa/Kelurahan
cat("X3 = Jumlah Tenaga Kesehatan\n")
## X3 = Jumlah Tenaga Kesehatan
cat("X4 = Luas Wilayah (km2)\n")
## X4 = Luas Wilayah (km2)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.5.3
## corrplot 0.95 loaded
#STATISTIK DESKRIPTIF DAN EKSPLORASI DATA
cat("1. STATISTIK DESKRIPTIF\n")
## 1. STATISTIK DESKRIPTIF
# Statistik deskriptif
summary(data[, c("Y", "X1", "X2", "X3", "X4")])
## Y X1 X2 X3
## Min. : 75.0 Min. : 549.7 Min. : 267 Min. : 245
## 1st Qu.: 142.0 1st Qu.: 1525.3 1st Qu.:1029 1st Qu.:1007
## Median : 254.0 Median : 3768.5 Median :1552 Median :1968
## Mean : 361.7 Mean : 7585.3 Mean :2266 Mean :1890
## 3rd Qu.: 389.0 3rd Qu.: 6811.2 3rd Qu.:2634 3rd Qu.:2394
## Max. :1542.0 Max. :50759.0 Max. :8563 Max. :4122
## X4
## Min. : 661.5
## 1st Qu.: 20122.2
## Median : 45324.0
## Mean : 51000.3
## 3rd Qu.: 61497.0
## Max. :153430.4
# Matriks korelasi
cat("\nMatriks Korelasi:\n")
##
## Matriks Korelasi:
cor_matrix <- cor(
data[, c("Y", "X1", "X2", "X3", "X4")],
use = "complete.obs"
)
print(
round(cor_matrix, 3)
)
## Y X1 X2 X3 X4
## Y 1.000 0.966 0.893 -0.613 -0.035
## X1 0.966 1.000 0.799 -0.552 -0.096
## X2 0.893 0.799 1.000 -0.625 0.050
## X3 -0.613 -0.552 -0.625 1.000 0.033
## X4 -0.035 -0.096 0.050 0.033 1.000
# Visualisasi matriks korelasi
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)
)

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

#ESTIMASI MODEL MULTIPLE LINEAR REGRESSION
cat("2. ESTIMASI MODEL MLR\n")
## 2. ESTIMASI MODEL MLR
model <- lm(
Y ~ X1 + X2 + X3 + X4,
data = data
)
cat("\nRingkasan Model:\n")
##
## Ringkasan Model:
print(
summary(model)
)
##
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -100.267 -32.771 -9.315 16.780 141.307
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 97.4711551 36.8127795 2.648 0.0125 *
## X1 0.0213641 0.0014718 14.516 1.25e-15 ***
## X2 0.0507886 0.0084492 6.011 1.05e-06 ***
## X3 -0.0113428 0.0127231 -0.892 0.3793
## X4 0.0001670 0.0002685 0.622 0.5385
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 59.48 on 32 degrees of freedom
## Multiple R-squared: 0.9746, Adjusted R-squared: 0.9714
## F-statistic: 306.7 on 4 and 32 DF, p-value: < 2.2e-16
#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)
## Variabel Koefisien Std_Error t_value p_value
## (Intercept) (Intercept) 97.4712 36.8128 2.6478 0.0125
## X1 X1 0.0214 0.0015 14.5159 0.0000
## X2 X2 0.0508 0.0084 6.0110 0.0000
## X3 X3 -0.0113 0.0127 -0.8915 0.3793
## X4 X4 0.0002 0.0003 0.6217 0.5385
cat("\nInterval Kepercayaan 95%:\n")
##
## Interval Kepercayaan 95%:
ci <- confint(
model,
level = 0.95
)
print(
round(ci, 4)
)
## 2.5 % 97.5 %
## (Intercept) 22.4860 172.4563
## X1 0.0184 0.0244
## X2 0.0336 0.0680
## X3 -0.0373 0.0146
## X4 -0.0004 0.0007
#UJI SIGNIFIKANSI SIMULTAN (UJI F)
cat("3. UJI SIGNIFIKANSI SIMULTAN (UJI F)\n")
## 3. UJI SIGNIFIKANSI SIMULTAN (UJI F)
# 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 = β4 = 0 (Model tidak signifikan)\n"
)
## H0: β1 = β2 = β3 = β4 = 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: 306.711
cat(
"df1:",
df1,
"\n"
)
## df1: 4
cat(
"df2:",
df2,
"\n"
)
## df2: 32
cat(
"p-value:",
format(
f_pvalue,
scientific = TRUE
),
"\n"
)
## p-value: 5.044065e-25
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%
#UJI SIGNIFIKANSI PARSIAL (UJI T)
cat("4. UJI SIGNIFIKANSI PARSIAL (UJI T)\n")
## 4. UJI SIGNIFIKANSI PARSIAL (UJI T)
cat("\nHipotesis untuk setiap βj:\n")
##
## Hipotesis untuk setiap βj:
cat(
"H0: βj = 0 (Variabel tidak signifikan)\n"
)
## H0: βj = 0 (Variabel tidak signifikan)
cat(
"H1: βj ≠ 0 (Variabel signifikan)\n"
)
## H1: βj ≠ 0 (Variabel signifikan)
cat("\nHasil Uji T:\n")
##
## Hasil Uji T:
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]
sig <- ifelse(
p_val < 0.001,
"***",
ifelse(
p_val < 0.01,
"**",
ifelse(
p_val < 0.05,
"*",
ifelse(
p_val < 0.1,
".",
"ns"
)
)
)
)
cat(
sprintf(
"%-10s: t = %7.4f, p = %8.4f %s\n",
var_name,
t_val,
p_val,
sig
)
)
}
## X1 : t = 14.5159, p = 0.0000 ***
## X2 : t = 6.0110, p = 0.0000 ***
## X3 : t = -0.8915, p = 0.3793 ns
## X4 : t = 0.6217, p = 0.5385 ns
cat(
"\nKeterangan: *** p<0.001, ** p<0.01, * p<0.05, . p<0.1, ns tidak signifikan\n"
)
##
## Keterangan: *** p<0.001, ** p<0.01, * p<0.05, . p<0.1, ns tidak signifikan
#KOEFISIEN DETERMINASI (R² DAN ADJUSTED R²)
cat("5. KOEFISIEN DETERMINASI\n")
## 5. KOEFISIEN DETERMINASI
r_squared <- summary(model)$r.squared
adj_r_squared <- summary(model)$adj.r.squared
resid_se <- summary(model)$sigma
cat(
"\nR-squared:",
round(
r_squared,
4
),
"\n"
)
##
## R-squared: 0.9746
cat(
"Adjusted R-squared:",
round(
adj_r_squared,
4
),
"\n"
)
## Adjusted R-squared: 0.9714
cat(
"Residual Standard Error:",
round(
resid_se,
4
),
"\n"
)
## Residual Standard Error: 59.4831
cat(
"Interpretasi: Model mampu menjelaskan",
round(
r_squared * 100,
2
),
"% variasi pada Y\n"
)
## Interpretasi: Model mampu menjelaskan 97.46 % variasi pada Y
library(nortest)
## Warning: package 'nortest' was built under R version 4.5.2
library(moments)
## Warning: package 'moments' was built under R version 4.5.2
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.5.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.5.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(car)
## Warning: package 'car' was built under R version 4.5.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.5.3
#UJI ASUMSI RESIDUAL
cat("6. UJI ASUMSI RESIDUAL\n")
## 6. UJI ASUMSI RESIDUAL
residuals <- residuals(model)
fitted_values <- fitted(model)
standardized_resid <- rstandard(model)
cat(
"\n--- 6.1. UJI NORMALITAS RESIDUAL ---\n"
)
##
## --- 6.1. UJI NORMALITAS RESIDUAL ---
# Shapiro-Wilk Test
shapiro_test <- shapiro.test(
residuals
)
cat("\nShapiro-Wilk Test:\n")
##
## Shapiro-Wilk Test:
cat(
"W =",
round(
shapiro_test$statistic,
4
),
"\n"
)
## W = 0.9523
cat(
"p-value =",
round(
shapiro_test$p.value,
4
),
"\n"
)
## p-value = 0.1142
cat(
"Kesimpulan:",
ifelse(
shapiro_test$p.value > 0.05,
"Residual berdistribusi normal",
"Residual TIDAK berdistribusi normal"
),
"\n"
)
## Kesimpulan: Residual berdistribusi normal
# Kolmogorov-Smirnov Test
ks_test <- ks.test(
residuals,
"pnorm",
mean(residuals),
sd(residuals)
)
cat("\nKolmogorov-Smirnov Test:\n")
##
## Kolmogorov-Smirnov Test:
cat(
"D =",
round(
ks_test$statistic,
4
),
"\n"
)
## D = 0.1565
cat(
"p-value =",
round(
ks_test$p.value,
4
),
"\n"
)
## p-value = 0.2935
cat(
"Kesimpulan:",
ifelse(
ks_test$p.value > 0.05,
"Residual berdistribusi normal",
"Residual TIDAK berdistribusi normal"
),
"\n"
)
## Kesimpulan: Residual berdistribusi normal
# Anderson-Darling Test
ad_test <- ad.test(
residuals
)
cat("\nAnderson-Darling Test:\n")
##
## Anderson-Darling Test:
cat(
"A =",
round(
ad_test$statistic,
4
),
"\n"
)
## A = 0.7614
cat(
"p-value =",
round(
ad_test$p.value,
4
),
"\n"
)
## p-value = 0.0434
cat(
"Kesimpulan:",
ifelse(
ad_test$p.value > 0.05,
"Residual berdistribusi normal",
"Residual TIDAK berdistribusi normal"
),
"\n"
)
## Kesimpulan: Residual TIDAK berdistribusi normal
# Jarque-Bera Test
jb_test <- jarque.test(
residuals
)
cat("\nJarque-Bera Test:\n")
##
## Jarque-Bera Test:
cat(
"JB =",
round(
jb_test$statistic,
4
),
"\n"
)
## JB = 1.8463
cat(
"p-value =",
round(
jb_test$p.value,
4
),
"\n"
)
## p-value = 0.3973
cat(
"Kesimpulan:",
ifelse(
jb_test$p.value > 0.05,
"Residual berdistribusi normal",
"Residual TIDAK berdistribusi normal"
),
"\n"
)
## Kesimpulan: Residual berdistribusi normal
cat(
"\n--- 6.2. UJI HETEROSKEDASTISITAS ---\n"
)
##
## --- 6.2. UJI HETEROSKEDASTISITAS ---
# Breusch-Pagan Test
bp_test <- bptest(model)
# Glejser Test
glejser_test <- bptest(
model,
~ fitted(model)
)
cat(
"Breusch-Pagan p-value:",
round(
bp_test$p.value,
4
),
"\n"
)
## Breusch-Pagan p-value: 0.0303
cat(
"Glejser p-value:",
round(
glejser_test$p.value,
4
),
"\n"
)
## Glejser p-value: 0.1136
if (
bp_test$p.value > 0.05 &
glejser_test$p.value > 0.05
) {
cat(
"Kesimpulan: Tidak ada heteroskedastisitas\n"
)
} else {
cat(
"Kesimpulan: Ada heteroskedastisitas\n"
)
}
## Kesimpulan: Ada heteroskedastisitas
cat(
"\n--- 6.3. UJI AUTOKORELASI ---\n"
)
##
## --- 6.3. UJI AUTOKORELASI ---
# Durbin-Watson Test
dw_test <- dwtest(model)
cat("\nDurbin-Watson Test:\n")
##
## Durbin-Watson Test:
cat(
"DW =",
round(
dw_test$statistic,
4
),
"\n"
)
## DW = 1.9649
cat(
"p-value =",
round(
dw_test$p.value,
4
),
"\n"
)
## p-value = 0.3324
cat(
"Kesimpulan:",
ifelse(
dw_test$p.value > 0.05,
"Tidak ada autokorelasi",
"Ada autokorelasi"
),
"\n"
)
## Kesimpulan: Tidak ada autokorelasi
# Breusch-Godfrey Test
bg_test <- bgtest(
model,
order = 1
)
cat(
"\nBreusch-Godfrey Test (Lag 1):\n"
)
##
## Breusch-Godfrey Test (Lag 1):
cat(
"LM =",
round(
bg_test$statistic,
4
),
"\n"
)
## LM = 0.0788
cat(
"p-value =",
round(
bg_test$p.value,
4
),
"\n"
)
## p-value = 0.7789
cat(
"Kesimpulan:",
ifelse(
bg_test$p.value > 0.05,
"Tidak ada autokorelasi",
"Ada autokorelasi"
),
"\n"
)
## Kesimpulan: Tidak ada autokorelasi
cat(
"\n--- 6.4. UJI MULTIKOLINEARITAS ---\n"
)
##
## --- 6.4. UJI MULTIKOLINEARITAS ---
# VIF
vif_values <- vif(model)
cat("\nVIF Values:\n")
##
## VIF Values:
print(
round(
vif_values,
4
)
)
## X1 X2 X3 X4
## 2.9438 3.3570 1.6675 1.0601
cat("\nInterpretasi VIF:\n")
##
## Interpretasi VIF:
for (i in 1:length(vif_values)) {
vif_val <- vif_values[i]
var_name <- names(vif_values)[i]
status <- ifelse(
vif_val < 5,
"Tidak ada multikolinearitas",
ifelse(
vif_val < 10,
"Multikolinearitas moderat",
"Multikolinearitas serius"
)
)
cat(
sprintf(
"%-10s: VIF = %7.4f → %s\n",
var_name,
vif_val,
status
)
)
}
## X1 : VIF = 2.9438 → Tidak ada multikolinearitas
## X2 : VIF = 3.3570 → Tidak ada multikolinearitas
## X3 : VIF = 1.6675 → Tidak ada multikolinearitas
## X4 : VIF = 1.0601 → Tidak ada multikolinearitas
tolerance <- 1 / vif_values
cat("\nTolerance Values:\n")
##
## Tolerance Values:
print(
round(
tolerance,
4
)
)
## X1 X2 X3 X4
## 0.3397 0.2979 0.5997 0.9433
condition_number <- kappa(
model.matrix(model)
)
cat(
"\nCondition Number:",
round(
condition_number,
4
),
"\n"
)
##
## Condition Number: 206951
cat(
"(Condition Number > 30 mengindikasikan multikolinearitas)\n"
)
## (Condition Number > 30 mengindikasikan multikolinearitas)
cat(
"\n--- 6.5. UJI LINEARITAS ---\n"
)
##
## --- 6.5. UJI LINEARITAS ---
reset_test <- resettest(
model,
power = 2:3,
type = "fitted"
)
cat("\nRamsey RESET Test:\n")
##
## Ramsey RESET Test:
cat(
"F =",
round(
reset_test$statistic,
4
),
"\n"
)
## F = 1.5475
cat(
"p-value =",
round(
reset_test$p.value,
4
),
"\n"
)
## p-value = 0.2293
cat(
"Kesimpulan:",
ifelse(
reset_test$p.value > 0.05,
"Model linear (spesifikasi benar)",
"Model TIDAK linear (spesifikasi salah)"
),
"\n"
)
## Kesimpulan: Model linear (spesifikasi benar)
#DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
cat(
"7. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS\n"
)
## 7. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
# Cook's Distance
cooks_d <- cooks.distance(model)
cat("\nCook's Distance:\n")
##
## Cook's Distance:
cat(
"Nilai maksimum:",
round(
max(cooks_d),
4
),
"\n"
)
## Nilai maksimum: 0.5589
cat(
"Jumlah observasi dengan Cook's D > 1:",
sum(
cooks_d > 1
),
"\n"
)
## Jumlah observasi dengan Cook's D > 1: 0
# Leverage
leverage <- hatvalues(model)
cat("\nLeverage (Hat Values):\n")
##
## Leverage (Hat Values):
cat(
"Nilai maksimum:",
round(
max(leverage),
4
),
"\n"
)
## Nilai maksimum: 0.544
# Threshold 2(k+1)/n
leverage_threshold <-
2 * length(coef(model)) / n
cat(
"Threshold 2(k+1)/n:",
round(
leverage_threshold,
4
),
"\n"
)
## Threshold 2(k+1)/n: 0.2703
cat(
"Jumlah observasi dengan leverage > threshold:",
sum(
leverage > leverage_threshold
),
"\n"
)
## Jumlah observasi dengan leverage > threshold: 4
# 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: 2.7024
cat(
"Jumlah observasi dengan |std_resid| > 3:",
sum(
abs(std_resid) > 3
),
"\n"
)
## Jumlah observasi dengan |std_resid| > 3: 0
# 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: 3
#VISUALISASI DIAGNOSTIK
cat("8. VISUALISASI DIAGNOSTIK\n")
## 8. VISUALISASI DIAGNOSTIK
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 = leverage_threshold,
col = "red",
lty = 2
)

# Reset par
par(
mfrow = c(1, 1)
)
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:olsrr':
##
## cement
#UJI BOX-COX UNTUK TRANSFORMASI
cat("9. UJI BOX-COX\n")
## 9. UJI BOX-COX
# Box-Cox transformation
bc <- boxcox(
model,
lambda = seq(
-2,
2,
0.1
)
)

# Lambda optimal
lambda_opt <-
bc$x[
which.max(bc$y)
]
cat(
"\nOptimal Lambda:",
round(
lambda_opt,
4
),
"\n"
)
##
## Optimal Lambda: 0.9495
cat("Interpretasi:\n")
## Interpretasi:
cat(
"- Jika λ ≈ 1: Tidak perlu transformasi\n"
)
## - Jika λ ≈ 1: Tidak perlu transformasi
cat(
"- Jika λ ≈ 0: Gunakan log transformation\n"
)
## - Jika λ ≈ 0: Gunakan log transformation
cat(
"- Jika λ ≈ 0.5: Gunakan square root transformation\n"
)
## - Jika λ ≈ 0.5: Gunakan square root transformation
#PEMILIHAN MODEL (STEPWISE)
cat("10. PEMILIHAN MODEL (STEPWISE)\n")
## 10. PEMILIHAN MODEL (STEPWISE)
step_model <- step(
model,
direction = "both",
trace = 1
)
## Start: AIC=306.97
## Y ~ X1 + X2 + X3 + X4
##
## Df Sum of Sq RSS AIC
## - X4 1 1368 114591 305.41
## - X3 1 2812 116036 305.88
## <none> 113224 306.97
## - X2 1 127846 241069 332.93
## - X1 1 745545 858769 379.94
##
## Step: AIC=305.41
## Y ~ X1 + X2 + X3
##
## Df Sum of Sq RSS AIC
## - X3 1 2597 117188 304.24
## <none> 114591 305.41
## + X4 1 1368 113224 306.97
## - X2 1 140315 254906 333.00
## - X1 1 768465 883056 378.97
##
## Step: AIC=304.24
## Y ~ X1 + X2
##
## Df Sum of Sq RSS AIC
## <none> 117188 304.24
## + X3 1 2597 114591 305.41
## + X4 1 1152 116036 305.88
## - X2 1 178719 295907 336.51
## - X1 1 788364 905552 377.90
cat("\nModel Terbaik (Stepwise):\n")
##
## Model Terbaik (Stepwise):
print(
summary(step_model)
)
##
## Call:
## lm(formula = Y ~ X1 + X2, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -107.879 -33.211 -8.738 15.856 150.892
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 76.557904 14.447656 5.299 7.03e-06 ***
## X1 0.021301 0.001408 15.124 < 2e-16 ***
## X2 0.054524 0.007572 7.201 2.49e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 58.71 on 34 degrees of freedom
## Multiple R-squared: 0.9737, Adjusted R-squared: 0.9721
## F-statistic: 629.1 on 2 and 34 DF, p-value: < 2.2e-16
#RINGKASAN HASIL
cat("11. RINGKASAN HASIL ANALISIS\n")
## 11. RINGKASAN HASIL ANALISIS
cat("\n--- MODEL AWAL ---\n")
##
## --- MODEL AWAL ---
cat("Persamaan Regresi:\n")
## Persamaan Regresi:
cat(
sprintf(
"Y = %.4f + %.4f*X1 + %.4f*X2 + %.4f*X3 + %.4f*X4\n",
coef(model)[1],
coef(model)[2],
coef(model)[3],
coef(model)[4],
coef(model)[5]
)
)
## Y = 97.4712 + 0.0214*X1 + 0.0508*X2 + -0.0113*X3 + 0.0002*X4
cat("\n--- UJI SIGNIFIKANSI ---\n")
##
## --- UJI SIGNIFIKANSI ---
cat(
"Uji F (Simultan): p-value =",
format(
f_pvalue,
scientific = TRUE
),
"\n"
)
## Uji F (Simultan): p-value = 5.044065e-25
cat("Uji t (Parsial):\n")
## Uji t (Parsial):
for (i in 2:nrow(coef_df)) {
cat(
sprintf(
" %s: p-value = %.4f\n",
coef_df$Variabel[i],
coef_df$p_value[i]
)
)
}
## X1: p-value = 0.0000
## X2: p-value = 0.0000
## X3: p-value = 0.3793
## X4: p-value = 0.5385
cat("\n--- UJI ASUMSI RESIDUAL ---\n")
##
## --- UJI ASUMSI RESIDUAL ---
cat(
"Normalitas (Shapiro-Wilk): p-value =",
round(
shapiro_test$p.value,
4
),
"\n"
)
## Normalitas (Shapiro-Wilk): p-value = 0.1142
cat(
"Heteroskedastisitas (Breusch-Pagan): p-value =",
round(
bp_test$p.value,
4
),
"\n"
)
## Heteroskedastisitas (Breusch-Pagan): p-value = 0.0303
cat(
"Autokorelasi (Durbin-Watson): DW =",
round(
dw_test$statistic,
4
),
"\n"
)
## Autokorelasi (Durbin-Watson): DW = 1.9649
cat(
"Multikolinearitas (VIF max):",
round(
max(vif_values),
4
),
"\n"
)
## Multikolinearitas (VIF max): 3.357
cat(
"Linearitas (Ramsey RESET): p-value =",
round(
reset_test$p.value,
4
),
"\n"
)
## Linearitas (Ramsey RESET): p-value = 0.2293
cat("\n--- MODEL HASIL STEPWISE ---\n")
##
## --- MODEL HASIL STEPWISE ---
cat(
"Formula model stepwise:\n"
)
## Formula model stepwise:
print(
formula(step_model)
)
## Y ~ X1 + X2
cat(
"\nR-squared model awal:",
round(
r_squared,
4
),
"\n"
)
##
## R-squared model awal: 0.9746
cat(
"Adjusted R-squared model awal:",
round(
adj_r_squared,
4
),
"\n"
)
## Adjusted R-squared model awal: 0.9714
cat(
"\nR-squared model stepwise:",
round(
summary(step_model)$r.squared,
4
),
"\n"
)
##
## R-squared model stepwise: 0.9737
cat(
"Adjusted R-squared model stepwise:",
round(
summary(step_model)$adj.r.squared,
4
),
"\n"
)
## Adjusted R-squared model stepwise: 0.9721
cat("ANALISIS SELESAI\n")
## ANALISIS SELESAI
#PEMILIHAN MODEL (STEPWISE AIC DAN BIC)
# Stepwise berdasarkan AIC
model_aic <- step(
model,
direction = "both",
trace = 1
)
## Start: AIC=306.97
## Y ~ X1 + X2 + X3 + X4
##
## Df Sum of Sq RSS AIC
## - X4 1 1368 114591 305.41
## - X3 1 2812 116036 305.88
## <none> 113224 306.97
## - X2 1 127846 241069 332.93
## - X1 1 745545 858769 379.94
##
## Step: AIC=305.41
## Y ~ X1 + X2 + X3
##
## Df Sum of Sq RSS AIC
## - X3 1 2597 117188 304.24
## <none> 114591 305.41
## + X4 1 1368 113224 306.97
## - X2 1 140315 254906 333.00
## - X1 1 768465 883056 378.97
##
## Step: AIC=304.24
## Y ~ X1 + X2
##
## Df Sum of Sq RSS AIC
## <none> 117188 304.24
## + X3 1 2597 114591 305.41
## + X4 1 1152 116036 305.88
## - X2 1 178719 295907 336.51
## - X1 1 788364 905552 377.90
# Ringkasan model AIC
summary(model_aic)
##
## Call:
## lm(formula = Y ~ X1 + X2, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -107.879 -33.211 -8.738 15.856 150.892
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 76.557904 14.447656 5.299 7.03e-06 ***
## X1 0.021301 0.001408 15.124 < 2e-16 ***
## X2 0.054524 0.007572 7.201 2.49e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 58.71 on 34 degrees of freedom
## Multiple R-squared: 0.9737, Adjusted R-squared: 0.9721
## F-statistic: 629.1 on 2 and 34 DF, p-value: < 2.2e-16
# Nilai AIC model AIC
AIC(model_aic)
## [1] 411.2443
# Stepwise berdasarkan BIC
model_bic <- step(
model,
direction = "both",
k = log(nrow(data)),
trace = 1
)
## Start: AIC=315.02
## Y ~ X1 + X2 + X3 + X4
##
## Df Sum of Sq RSS AIC
## - X4 1 1368 114591 311.86
## - X3 1 2812 116036 312.32
## <none> 113224 315.02
## - X2 1 127846 241069 339.37
## - X1 1 745545 858769 386.38
##
## Step: AIC=311.86
## Y ~ X1 + X2 + X3
##
## Df Sum of Sq RSS AIC
## - X3 1 2597 117188 309.08
## <none> 114591 311.86
## + X4 1 1368 113224 315.02
## - X2 1 140315 254906 337.83
## - X1 1 768465 883056 383.80
##
## Step: AIC=309.08
## Y ~ X1 + X2
##
## Df Sum of Sq RSS AIC
## <none> 117188 309.08
## + X3 1 2597 114591 311.86
## + X4 1 1152 116036 312.32
## - X2 1 178719 295907 339.74
## - X1 1 788364 905552 381.12
# Ringkasan model BIC
summary(model_bic)
##
## Call:
## lm(formula = Y ~ X1 + X2, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -107.879 -33.211 -8.738 15.856 150.892
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 76.557904 14.447656 5.299 7.03e-06 ***
## X1 0.021301 0.001408 15.124 < 2e-16 ***
## X2 0.054524 0.007572 7.201 2.49e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 58.71 on 34 degrees of freedom
## Multiple R-squared: 0.9737, Adjusted R-squared: 0.9721
## F-statistic: 629.1 on 2 and 34 DF, p-value: < 2.2e-16
# Nilai BIC model BIC
BIC(model_bic)
## [1] 417.688
# PERBANDINGAN MODEL
AIC(model)
## [1] 413.9709
AIC(model_aic)
## [1] 411.2443
BIC(model)
## [1] 423.6364
BIC(model_bic)
## [1] 417.688
# Formula model
formula(model_aic)
## Y ~ X1 + X2
formula(model_bic)
## Y ~ X1 + X2