# ============================================================
# LOAD LIBRARY
# ============================================================

library(car)        # VIF dan diagnostik
library(lmtest)     # Breusch-Pagan, Durbin-Watson, RESET
library(nortest)    # Anderson-Darling
library(MASS)       # Box-Cox
library(ggplot2)    # Visualisasi
library(corrplot)   # Matriks korelasi
# ============================================================
# 1. MEMBACA DATASET
# ============================================================

# Membaca dataset
data <- read.csv("C:/Users/Acer/Downloads/company_data.csv")

# Melihat struktur data
str(data)
## 'data.frame':    167 obs. of  11 variables:
##  $ X                : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ company          : chr  "Company_1" "Company_2" "Company_3" "Company_4" ...
##  $ employee_turnover: num  90.2 16.6 27.3 119 10.3 14.5 18.1 4.8 4.3 39.2 ...
##  $ revenue_growth   : num  10 28 38.4 62.3 45.5 18.9 20.8 19.8 51.3 54.3 ...
##  $ rd_investment    : num  7.58 6.55 4.17 2.85 6.03 8.1 4.4 8.73 11 5.88 ...
##  $ operational_cost : num  44.9 48.6 31.4 42.9 58.9 16 45.3 20.9 47.8 20.7 ...
##  $ average_salary   : int  1610 9930 12900 5900 19100 18700 6700 41400 43200 16000 ...
##  $ market_volatility: num  9.44 4.49 16.1 22.4 1.44 20.9 7.77 1.16 0.873 13.8 ...
##  $ average_tenure   : num  56.2 76.3 76.5 60.1 76.8 75.8 73.3 82 80.5 69.1 ...
##  $ growth_potential : num  5.82 1.65 2.89 6.16 2.13 2.37 1.69 1.93 1.44 1.92 ...
##  $ net_profit       : int  553 4090 4460 3530 12200 10300 3220 51900 46900 5840 ...
# Melihat nama kolom
names(data)
##  [1] "X"                 "company"           "employee_turnover"
##  [4] "revenue_growth"    "rd_investment"     "operational_cost" 
##  [7] "average_salary"    "market_volatility" "average_tenure"   
## [10] "growth_potential"  "net_profit"
# Melihat ukuran dataset
dim(data)
## [1] 167  11
# Melihat 6 baris pertama
head(data)
##   X   company employee_turnover revenue_growth rd_investment operational_cost
## 1 0 Company_1              90.2           10.0          7.58             44.9
## 2 1 Company_2              16.6           28.0          6.55             48.6
## 3 2 Company_3              27.3           38.4          4.17             31.4
## 4 3 Company_4             119.0           62.3          2.85             42.9
## 5 4 Company_5              10.3           45.5          6.03             58.9
## 6 5 Company_6              14.5           18.9          8.10             16.0
##   average_salary market_volatility average_tenure growth_potential net_profit
## 1           1610              9.44           56.2             5.82        553
## 2           9930              4.49           76.3             1.65       4090
## 3          12900             16.10           76.5             2.89       4460
## 4           5900             22.40           60.1             6.16       3530
## 5          19100              1.44           76.8             2.13      12200
## 6          18700             20.90           75.8             2.37      10300
# ------------------------------------------------------------
# 2. STATISTIK DESKRIPTIF DAN EKSPLORASI DATA
# ------------------------------------------------------------

# Memilih variabel penelitian
data_model <- data[, c(
  "net_profit",
  "revenue_growth",
  "rd_investment",
  "operational_cost",
  "average_salary",
  "market_volatility"
)]

cat("\n", rep("=", 60), "\n", sep = "")
## 
## ============================================================
cat("1. STATISTIK DESKRIPTIF\n")
## 1. STATISTIK DESKRIPTIF
cat(rep("=", 60), "\n", sep = "")
## ============================================================
# Statistik deskriptif
cat("\nSTATISTIK DESKRIPTIF:\n")
## 
## STATISTIK DESKRIPTIF:
print(summary(data_model))
##    net_profit     revenue_growth    rd_investment    operational_cost  
##  Min.   :   231   Min.   :  0.109   Min.   : 1.810   Min.   :  0.0659  
##  1st Qu.:  1330   1st Qu.: 23.800   1st Qu.: 4.920   1st Qu.: 30.2000  
##  Median :  4660   Median : 35.000   Median : 6.320   Median : 43.3000  
##  Mean   : 12964   Mean   : 41.109   Mean   : 6.816   Mean   : 46.8902  
##  3rd Qu.: 14050   3rd Qu.: 51.350   3rd Qu.: 8.600   3rd Qu.: 58.7500  
##  Max.   :105000   Max.   :200.000   Max.   :17.900   Max.   :174.0000  
##  average_salary   market_volatility
##  Min.   :   609   Min.   : -4.210  
##  1st Qu.:  3355   1st Qu.:  1.810  
##  Median :  9960   Median :  5.390  
##  Mean   : 17145   Mean   :  7.782  
##  3rd Qu.: 22800   3rd Qu.: 10.750  
##  Max.   :125000   Max.   :104.000
# Matriks korelasi
cat("\nMATRIKS KORELASI:\n")
## 
## MATRIKS KORELASI:
cor_matrix <- cor(data_model, use = "complete.obs")
print(round(cor_matrix, 3))
##                   net_profit revenue_growth rd_investment operational_cost
## net_profit             1.000          0.419         0.346            0.115
## revenue_growth         0.419          1.000        -0.114            0.737
## rd_investment          0.346         -0.114         1.000            0.096
## operational_cost       0.115          0.737         0.096            1.000
## average_salary         0.896          0.517         0.130            0.122
## market_volatility     -0.222         -0.107        -0.255           -0.247
##                   average_salary market_volatility
## net_profit                 0.896            -0.222
## revenue_growth             0.517            -0.107
## rd_investment              0.130            -0.255
## operational_cost           0.122            -0.247
## average_salary             1.000            -0.148
## market_volatility         -0.148             1.000
# Visualisasi matriks korelasi
corrplot::corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  addCoef.col = "black",
  tl.col = "black",
  tl.srt = 45,
  title = "Matriks Korelasi Antarvariabel",
  mar = c(0, 0, 2, 0)
)

# Scatter plot matrix
pairs(
  data_model,
  main = "Scatter Plot Matrix",
  pch = 19,
  col = "steelblue"
)

# ============================================================
# 3. ESTIMASI MODEL REGRESI LINEAR BERGANDA
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("2. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION\n")
## 2. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION
cat(strrep("=", 60), "\n")
## ============================================================
# Membentuk model regresi
model <- lm(
  net_profit ~ revenue_growth +
    rd_investment +
    operational_cost +
    average_salary +
    market_volatility,
  data = data_model
)

# Ringkasan model
cat("\nRINGKASAN MODEL:\n")
## 
## RINGKASAN MODEL:
print(summary(model))
## 
## Call:
## lm(formula = net_profit ~ revenue_growth + rd_investment + operational_cost + 
##     average_salary + market_volatility, data = data_model)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -23022  -4172    164   3188  33683 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -1.017e+04  2.037e+03  -4.993 1.53e-06 ***
## revenue_growth     3.337e+01  4.349e+01   0.767    0.444    
## rd_investment      1.579e+03  2.276e+02   6.940 9.10e-11 ***
## operational_cost  -4.399e+01  4.250e+01  -1.035    0.302    
## average_salary     7.981e-01  4.089e-02  19.517  < 2e-16 ***
## market_volatility -8.003e+01  5.579e+01  -1.434    0.153    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7012 on 161 degrees of freedom
## Multiple R-squared:  0.858,  Adjusted R-squared:  0.8536 
## F-statistic: 194.6 on 5 and 161 DF,  p-value: < 2.2e-16
# Tabel koefisien
cat("\nKOEFISIEN REGRESI:\n")
## 
## KOEFISIEN REGRESI:
hasil_koefisien <- summary(model)$coefficients

coef_df <- data.frame(
  Variabel = rownames(hasil_koefisien),
  Koefisien = hasil_koefisien[, 1],
  Std_Error = hasil_koefisien[, 2],
  t_value = hasil_koefisien[, 3],
  p_value = hasil_koefisien[, 4],
  row.names = NULL
)

# Membulatkan kolom numerik saja
coef_df[, -1] <- round(coef_df[, -1], 4)

# Menampilkan tabel
print(coef_df, row.names = FALSE)
##           Variabel   Koefisien Std_Error t_value p_value
##        (Intercept) -10168.5967 2036.6481 -4.9928  0.0000
##     revenue_growth     33.3675   43.4867  0.7673  0.4440
##      rd_investment   1579.2823  227.5674  6.9398  0.0000
##   operational_cost    -43.9892   42.5001 -1.0350  0.3022
##     average_salary      0.7981    0.0409 19.5174  0.0000
##  market_volatility    -80.0348   55.7939 -1.4345  0.1534
# ------------------------------------------------------------
# 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)       -14190.5859 -6146.6075
## revenue_growth       -52.5103   119.2454
## rd_investment       1129.8803  2028.6843
## operational_cost    -127.9188    39.9404
## average_salary         0.7173     0.8788
## market_volatility   -190.2170    30.1474
# ============================================================
# 4. UJI SIGNIFIKANSI SIMULTAN (UJI F)
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("3. UJI SIGNIFIKANSI SIMULTAN (UJI F)\n")
## 3. UJI SIGNIFIKANSI SIMULTAN (UJI F)
cat(strrep("=", 60), "\n")
## ============================================================
cat("\nHIPOTESIS:\n")
## 
## HIPOTESIS:
cat("H0: β1 = β2 = ... = β5 = 0\n")
## H0: β1 = β2 = ... = β5 = 0
cat("H1: Minimal terdapat satu βj ≠ 0\n")
## H1: Minimal terdapat satu βj ≠ 0
cat("Taraf signifikansi: α = 0.05\n")
## Taraf signifikansi: α = 0.05
# Mengambil informasi F-statistic
f_stat <- summary(model)$fstatistic

f_value <- unname(f_stat[1])
df1 <- unname(f_stat[2])
df2 <- unname(f_stat[3])
f_pvalue <- pf(f_value, df1, df2, lower.tail = FALSE)

cat("\nHASIL UJI F:\n")
## 
## HASIL UJI F:
cat("F-statistic:", round(f_value, 4), "\n")
## F-statistic: 194.6336
cat("df1:", df1, "\n")
## df1: 5
cat("df2:", df2, "\n")
## df2: 161
cat("p-value:", format.pval(f_pvalue, digits = 5), "\n")
## p-value: < 2.22e-16
if (f_pvalue < 0.05) {
  cat("Kesimpulan: Tolak H0.\n")
  cat("Model signifikan secara simultan pada α = 5%.\n")
} else {
  cat("Kesimpulan: Gagal menolak H0.\n")
  cat("Model tidak signifikan secara simultan pada α = 5%.\n")
}
## Kesimpulan: Tolak H0.
## Model signifikan secara simultan pada α = 5%.
# ============================================================
# 5. UJI SIGNIFIKANSI PARSIAL (UJI T)
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("4. UJI SIGNIFIKANSI PARSIAL (UJI T)\n")
## 4. UJI SIGNIFIKANSI PARSIAL (UJI T)
cat(strrep("=", 60), "\n")
## ============================================================
cat("\nHIPOTESIS UNTUK SETIAP KOEFISIEN:\n")
## 
## HIPOTESIS UNTUK SETIAP KOEFISIEN:
cat("H0: βj = 0\n")
## H0: βj = 0
cat("H1: βj ≠ 0\n")
## H1: βj ≠ 0
cat("Taraf signifikansi: α = 0.05\n")
## Taraf signifikansi: α = 0.05
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]

  keputusan <- ifelse(
    p_val < 0.05,
    "Tolak H0",
    "Gagal menolak H0"
  )

  cat(sprintf("%-22s: t = %8.4f, p-value = %10.5f, %s\n",
              var_name, t_val, p_val, keputusan))
}
## revenue_growth        : t =   0.7673, p-value =    0.44400, Gagal menolak H0
## rd_investment         : t =   6.9398, p-value =    0.00000, Tolak H0
## operational_cost      : t =  -1.0350, p-value =    0.30220, Gagal menolak H0
## average_salary        : t =  19.5174, p-value =    0.00000, Tolak H0
## market_volatility     : t =  -1.4345, p-value =    0.15340, Gagal menolak H0
# ============================================================
# 6. KOEFISIEN DETERMINASI
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("5. KOEFISIEN DETERMINASI\n")
## 5. KOEFISIEN DETERMINASI
cat(strrep("=", 60), "\n")
## ============================================================
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.858
cat("Adjusted R-squared:", round(adj_r_squared, 4), "\n")
## Adjusted R-squared: 0.8536
cat("Residual Standard Error:", round(resid_se, 4), "\n")
## Residual Standard Error: 7012.083
cat(
  "Interpretasi awal: Model menjelaskan sekitar",
  round(r_squared * 100, 2),
  "% variasi pada net_profit.\n"
)
## Interpretasi awal: Model menjelaskan sekitar 85.8 % variasi pada net_profit.
# ============================================================
# 7. KRITERIA PEMILIHAN MODEL
# AIC, BIC, DAN AICC
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("6. KRITERIA PEMILIHAN MODEL\n")
## 6. KRITERIA PEMILIHAN MODEL
cat(strrep("=", 60), "\n")
## ============================================================
# AIC
aic_value <- AIC(model)

# BIC
bic_value <- BIC(model)

# AICc
n_model <- nobs(model)
k <- length(coef(model))

aicc_value <- AIC(model) +
  (2 * k * (k + 1)) / (n_model - k - 1)

cat("\nAIC :", round(aic_value, 4), "\n")
## 
## AIC : 3439.515
cat("BIC :", round(bic_value, 4), "\n")
## BIC : 3461.341
cat("AICc:", round(aicc_value, 4), "\n")
## AICc: 3440.04
cat(
  "\nCatatan: Nilai AIC, BIC, dan AICc digunakan untuk membandingkan model.\n",
  "Nilai yang lebih kecil menunjukkan model yang lebih baik menurut kriteria tersebut,\n",
  "dengan mempertimbangkan kecocokan model dan kompleksitasnya.\n"
)
## 
## Catatan: Nilai AIC, BIC, dan AICc digunakan untuk membandingkan model.
##  Nilai yang lebih kecil menunjukkan model yang lebih baik menurut kriteria tersebut,
##  dengan mempertimbangkan kecocokan model dan kompleksitasnya.
# ============================================================
# 8. UJI ASUMSI RESIDUAL
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("7. UJI ASUMSI RESIDUAL\n")
## 7. UJI ASUMSI RESIDUAL
cat(strrep("=", 60), "\n")
## ============================================================
# Mengambil komponen model
residual_model <- residuals(model)
fitted_values <- fitted(model)
standardized_resid <- rstandard(model)

# ------------------------------------------------------------
# 8.1. UJI NORMALITAS RESIDUAL
# ------------------------------------------------------------

cat("\n--- 7.1. UJI NORMALITAS RESIDUAL ---\n")
## 
## --- 7.1. UJI NORMALITAS RESIDUAL ---
# Shapiro-Wilk
shapiro_test <- shapiro.test(residual_model)

cat("\nSHAPIRO-WILK TEST:\n")
## 
## SHAPIRO-WILK TEST:
cat("W =", round(unname(shapiro_test$statistic), 4), "\n")
## W = 0.8982
cat("p-value =", format.pval(shapiro_test$p.value, digits = 5), "\n")
## p-value = 2.5201e-09
if (shapiro_test$p.value > 0.05) {
  cat("Kesimpulan: Tidak terdapat bukti yang cukup untuk menyatakan residual tidak normal.\n")
} else {
  cat("Kesimpulan: Terdapat bukti bahwa residual tidak berdistribusi normal.\n")
}
## Kesimpulan: Terdapat bukti bahwa residual tidak berdistribusi normal.
# Anderson-Darling
ad_test <- ad.test(residual_model)

cat("\nANDERSON-DARLING TEST:\n")
## 
## ANDERSON-DARLING TEST:
cat("A =", round(unname(ad_test$statistic), 4), "\n")
## A = 2.9991
cat("p-value =", format.pval(ad_test$p.value, digits = 5), "\n")
## p-value = 1.4629e-07
# ------------------------------------------------------------
# 8.2. UJI HETEROSKEDASTISITAS
# ------------------------------------------------------------

cat("\n--- 7.2. UJI HETEROSKEDASTISITAS ---\n")
## 
## --- 7.2. UJI HETEROSKEDASTISITAS ---
bp_test <- bptest(model)
cat("\nBREUSCH-PAGAN TEST:\n")
## 
## BREUSCH-PAGAN TEST:
cat("BP =", round(unname(bp_test$statistic), 4), "\n")
## BP = 72.1064
cat("p-value =", format.pval(bp_test$p.value, digits = 5), "\n")
## p-value = 3.7327e-14
if (bp_test$p.value > 0.05) {
  cat("Kesimpulan: Tidak terdapat bukti heteroskedastisitas.\n")
} else {
  cat("Kesimpulan: Terdapat indikasi heteroskedastisitas.\n")
}
## Kesimpulan: Terdapat indikasi heteroskedastisitas.
# ------------------------------------------------------------
# 8.3. UJI AUTOKORELASI
# ------------------------------------------------------------

cat("\n--- 7.3. UJI AUTOKORELASI ---\n")
## 
## --- 7.3. UJI AUTOKORELASI ---
dw_test <- dwtest(model)
cat("\nDURBIN-WATSON TEST:\n")
## 
## DURBIN-WATSON TEST:
cat("DW =", round(unname(dw_test$statistic), 4), "\n")
## DW = 1.8828
cat("p-value =", format.pval(dw_test$p.value, digits = 5), "\n")
## p-value = 0.21739
if (dw_test$p.value > 0.05) {
  cat("Kesimpulan: Tidak terdapat bukti autokorelasi.\n")
} else {
  cat("Kesimpulan: Terdapat indikasi autokorelasi berdasarkan uji Durbin-Watson.\n")
}
## Kesimpulan: Tidak terdapat bukti autokorelasi.
# ------------------------------------------------------------
# 8.4. UJI MULTIKOLINEARITAS
# ------------------------------------------------------------

cat("\n--- 7.4. UJI MULTIKOLINEARITAS ---\n")
## 
## --- 7.4. UJI MULTIKOLINEARITAS ---
vif_values <- vif(model)
cat("\nVIF:\n")
## 
## VIF:
print(round(vif_values, 4))
##    revenue_growth     rd_investment  operational_cost    average_salary 
##            4.7974            1.3192            3.5741            2.0979 
## market_volatility 
##            1.1743
cat("\nINTERPRETASI VIF:\n")
## 
## INTERPRETASI VIF:
for (i in seq_along(vif_values)) {
  vif_val <- vif_values[i]
  var_name <- names(vif_values)[i]
  status <- ifelse(
    vif_val < 5,
    "Tidak ada indikasi multikolinearitas serius",
    ifelse(
      vif_val < 10,
      "Indikasi multikolinearitas moderat",
      "Indikasi multikolinearitas tinggi"))

  cat(sprintf("%-22s: VIF = %8.4f -> %s\n",
              var_name, vif_val, status))
}
## revenue_growth        : VIF =   4.7974 -> Tidak ada indikasi multikolinearitas serius
## rd_investment         : VIF =   1.3192 -> Tidak ada indikasi multikolinearitas serius
## operational_cost      : VIF =   3.5741 -> Tidak ada indikasi multikolinearitas serius
## average_salary        : VIF =   2.0979 -> Tidak ada indikasi multikolinearitas serius
## market_volatility     : VIF =   1.1743 -> Tidak ada indikasi multikolinearitas serius
# Tolerance
tolerance <- 1 / vif_values
cat("\nTOLERANCE:\n")
## 
## TOLERANCE:
print(round(tolerance, 4))
##    revenue_growth     rd_investment  operational_cost    average_salary 
##            0.2084            0.7581            0.2798            0.4767 
## market_volatility 
##            0.8515
# Condition number
condition_number <- kappa(model.matrix(model))
cat("\nCONDITION NUMBER:\n")
## 
## CONDITION NUMBER:
cat(round(condition_number, 4), "\n")
## 107503.7
# ------------------------------------------------------------
# 8.5. UJI SPESIFIKASI MODEL
# ------------------------------------------------------------

cat("\n--- 7.5. UJI SPESIFIKASI MODEL ---\n")
## 
## --- 7.5. UJI SPESIFIKASI MODEL ---
reset_test <- resettest(
  model,
  power = 2:3,
  type = "fitted")

cat("\nRAMSEY RESET TEST:\n")
## 
## RAMSEY RESET TEST:
cat("F =", round(unname(reset_test$statistic), 4), "\n")
## F = 35.1696
cat("p-value =", format.pval(reset_test$p.value, digits = 5), "\n")
## p-value = 2.2545e-13
if (reset_test$p.value > 0.05) {
  cat("Kesimpulan: Tidak terdapat bukti yang cukup mengenai kesalahan spesifikasi model.\n")
} else {
  cat("Kesimpulan: Terdapat indikasi kesalahan spesifikasi model.\n")
}
## Kesimpulan: Terdapat indikasi kesalahan spesifikasi model.
par(mfrow = c(1, 2))
hist(
  residuals(model),
  main = "Histogram Residual",
  xlab = "Residual")

qqnorm(residuals(model))
qqline(residuals(model), col = "red")

par(mfrow = c(1, 1))

plot(
  fitted(model),
  residuals(model),
  main = "Residual vs Fitted",
  xlab = "Nilai Prediksi",
  ylab = "Residual")

abline(h = 0, col = "red", lty = 2)

# ============================================================
# 9. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("8. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS\n")
## 8. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
cat(strrep("=", 60), "\n")
## ============================================================
# 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: 1.186
cat(
  "Jumlah observasi dengan Cook's D > 1:",
  sum(cooks_d > 1),
  "\n")
## Jumlah observasi dengan Cook's D > 1: 1
# Leverage
leverage <- hatvalues(model)
p_parameter <- length(coef(model))

leverage_threshold <- 2 * p_parameter / n_model

cat("\nLEVERAGE:\n")
## 
## LEVERAGE:
cat("Nilai maksimum:", round(max(leverage), 4), "\n")
## Nilai maksimum: 0.5336
cat("Threshold:", round(leverage_threshold, 4), "\n")
## Threshold: 0.0719
cat("Jumlah observasi dengan leverage > threshold:", sum(leverage > leverage_threshold), "\n")
## Jumlah observasi dengan leverage > threshold: 13
# Studentized residual
studentized_resid <- rstudent(model)

cat("\nSTUDENTIZED RESIDUAL:\n")
## 
## STUDENTIZED RESIDUAL:
cat("Nilai maksimum absolut:", round(max(abs(studentized_resid)), 4), "\n")
## Nilai maksimum absolut: 5.3424
cat("Jumlah observasi dengan |studentized residual| > 3:", sum(abs(studentized_resid) > 3), "\n")
## Jumlah observasi dengan |studentized residual| > 3: 5
# 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: 5
# ============================================================
# 10. VISUALISASI DIAGNOSTIK
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("9. VISUALISASI DIAGNOSTIK\n")
## 9. VISUALISASI DIAGNOSTIK
cat(strrep("=", 60), "\n")
## ============================================================
par(mfrow = c(2, 2))

# Plot 1: Residual vs Fitted
plot(
  fitted_values,
  residual_model,
  xlab = "Fitted Values",
  ylab = "Residuals",
  main = "Residual vs Fitted",
  pch = 19, col = "steelblue")

abline(h = 0,  col = "red", lty = 2)
lines(lowess(fitted_values, residual_model), col = "green", lwd = 2)

# Plot 2: Normal Q-Q
qqnorm(residual_model, pch = 19, col = "steelblue", main = "Normal Q-Q Plot")
qqline(residual_model, 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)

par(mfrow = c(1, 1))
# ============================================================
# 11. UJI BOX-COX
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("10. UJI BOX-COX\n")
## 10. UJI BOX-COX
cat(strrep("=", 60), "\n")
## ============================================================
# Box-Cox memerlukan respons bernilai positif
if (all(model.response(model.frame(model)) > 0)) {

  bc <- boxcox(
    model,
    lambda = seq(-2, 2, by = 0.1)
  )

  lambda_opt <- bc$x[which.max(bc$y)]

  cat("\nLambda optimal:", round(lambda_opt, 4), "\n")

  cat("\nInterpretasi umum:\n")
  cat("Lambda mendekati 1  : transformasi mungkin tidak diperlukan.\n")
  cat("Lambda mendekati 0  : transformasi log dapat dipertimbangkan.\n")
  cat("Lambda mendekati 0.5: transformasi akar kuadrat dapat dipertimbangkan.\n")

} else {

  cat("\nBox-Cox tidak dijalankan karena terdapat nilai Y <= 0.\n")
}

## 
## Lambda optimal: 0.3838 
## 
## Interpretasi umum:
## Lambda mendekati 1  : transformasi mungkin tidak diperlukan.
## Lambda mendekati 0  : transformasi log dapat dipertimbangkan.
## Lambda mendekati 0.5: transformasi akar kuadrat dapat dipertimbangkan.
# ============================================================
# 12. PEMILIHAN MODEL STEPWISE
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("11. PEMILIHAN MODEL STEPWISE\n")
## 11. PEMILIHAN MODEL STEPWISE
cat(strrep("=", 60), "\n")
## ============================================================
# ------------------------------------------------------------
# 12.1. STEPWISE BOTH
# ------------------------------------------------------------

cat("\n--- STEPWISE BOTH ---\n")
## 
## --- STEPWISE BOTH ---
step_model <- step(
  model,
  direction = "both",
  trace = 1)
## Start:  AIC=2963.59
## net_profit ~ revenue_growth + rd_investment + operational_cost + 
##     average_salary + market_volatility
## 
##                     Df  Sum of Sq        RSS    AIC
## - revenue_growth     1 2.8949e+07 7.9452e+09 2962.2
## - operational_cost   1 5.2675e+07 7.9689e+09 2962.7
## <none>                            7.9163e+09 2963.6
## - market_volatility  1 1.0118e+08 8.0174e+09 2963.7
## - rd_investment      1 2.3681e+09 1.0284e+10 3005.3
## - average_salary     1 1.8730e+10 2.6646e+10 3164.3
## 
## Step:  AIC=2962.2
## net_profit ~ rd_investment + operational_cost + average_salary + 
##     market_volatility
## 
##                     Df  Sum of Sq        RSS    AIC
## - operational_cost   1 2.5307e+07 7.9705e+09 2960.7
## - market_volatility  1 8.6198e+07 8.0314e+09 2962.0
## <none>                            7.9452e+09 2962.2
## + revenue_growth     1 2.8949e+07 7.9163e+09 2963.6
## - rd_investment      1 2.6256e+09 1.0571e+10 3007.9
## - average_salary     1 3.9934e+10 4.7879e+10 3260.2
## 
## Step:  AIC=2960.73
## net_profit ~ rd_investment + average_salary + market_volatility
## 
##                     Df  Sum of Sq        RSS    AIC
## - market_volatility  1 7.0227e+07 8.0407e+09 2960.2
## <none>                            7.9705e+09 2960.7
## + operational_cost   1 2.5307e+07 7.9452e+09 2962.2
## + revenue_growth     1 1.5807e+06 7.9689e+09 2962.7
## - rd_investment      1 2.6138e+09 1.0584e+10 3006.1
## - average_salary     1 4.0061e+10 4.8032e+10 3258.7
## 
## Step:  AIC=2960.2
## net_profit ~ rd_investment + average_salary
## 
##                     Df  Sum of Sq        RSS    AIC
## <none>                            8.0407e+09 2960.2
## + market_volatility  1 7.0227e+07 7.9705e+09 2960.7
## + operational_cost   1 9.3360e+06 8.0314e+09 2962.0
## + revenue_growth     1 2.2470e+05 8.0405e+09 2962.2
## - rd_investment      1 2.9983e+09 1.1039e+10 3011.1
## - average_salary     1 4.1051e+10 4.9091e+10 3260.3
cat("\nFORMULA MODEL STEPWISE BOTH:\n")
## 
## FORMULA MODEL STEPWISE BOTH:
print(formula(step_model))
## net_profit ~ rd_investment + average_salary
cat("\nRINGKASAN MODEL STEPWISE BOTH:\n")
## 
## RINGKASAN MODEL STEPWISE BOTH:
print(summary(step_model))
## 
## Call:
## lm(formula = net_profit ~ rd_investment + average_salary, data = data_model)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -23663  -3953    421   3234  33531 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -1.178e+04  1.486e+03  -7.923 3.35e-13 ***
## rd_investment   1.560e+03  1.995e+02   7.820 6.08e-13 ***
## average_salary  8.227e-01  2.843e-02  28.936  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7002 on 164 degrees of freedom
## Multiple R-squared:  0.8558, Adjusted R-squared:  0.8541 
## F-statistic: 486.7 on 2 and 164 DF,  p-value: < 2.2e-16
# ------------------------------------------------------------
# 12.2. STEPWISE BACKWARD
# ------------------------------------------------------------

cat("\n--- STEPWISE BACKWARD ---\n")
## 
## --- STEPWISE BACKWARD ---
model_backward <- step(
  model,
  direction = "backward",
  trace = 1)
## Start:  AIC=2963.59
## net_profit ~ revenue_growth + rd_investment + operational_cost + 
##     average_salary + market_volatility
## 
##                     Df  Sum of Sq        RSS    AIC
## - revenue_growth     1 2.8949e+07 7.9452e+09 2962.2
## - operational_cost   1 5.2675e+07 7.9689e+09 2962.7
## <none>                            7.9163e+09 2963.6
## - market_volatility  1 1.0118e+08 8.0174e+09 2963.7
## - rd_investment      1 2.3681e+09 1.0284e+10 3005.3
## - average_salary     1 1.8730e+10 2.6646e+10 3164.3
## 
## Step:  AIC=2962.2
## net_profit ~ rd_investment + operational_cost + average_salary + 
##     market_volatility
## 
##                     Df  Sum of Sq        RSS    AIC
## - operational_cost   1 2.5307e+07 7.9705e+09 2960.7
## - market_volatility  1 8.6198e+07 8.0314e+09 2962.0
## <none>                            7.9452e+09 2962.2
## - rd_investment      1 2.6256e+09 1.0571e+10 3007.9
## - average_salary     1 3.9934e+10 4.7879e+10 3260.2
## 
## Step:  AIC=2960.73
## net_profit ~ rd_investment + average_salary + market_volatility
## 
##                     Df  Sum of Sq        RSS    AIC
## - market_volatility  1 7.0227e+07 8.0407e+09 2960.2
## <none>                            7.9705e+09 2960.7
## - rd_investment      1 2.6138e+09 1.0584e+10 3006.1
## - average_salary     1 4.0061e+10 4.8032e+10 3258.7
## 
## Step:  AIC=2960.2
## net_profit ~ rd_investment + average_salary
## 
##                  Df  Sum of Sq        RSS    AIC
## <none>                         8.0407e+09 2960.2
## - rd_investment   1 2.9983e+09 1.1039e+10 3011.1
## - average_salary  1 4.1051e+10 4.9091e+10 3260.3
cat("\nFORMULA MODEL BACKWARD:\n")
## 
## FORMULA MODEL BACKWARD:
print(formula(model_backward))
## net_profit ~ rd_investment + average_salary
cat("\nRINGKASAN MODEL BACKWARD:\n")
## 
## RINGKASAN MODEL BACKWARD:
print(summary(model_backward))
## 
## Call:
## lm(formula = net_profit ~ rd_investment + average_salary, data = data_model)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -23663  -3953    421   3234  33531 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -1.178e+04  1.486e+03  -7.923 3.35e-13 ***
## rd_investment   1.560e+03  1.995e+02   7.820 6.08e-13 ***
## average_salary  8.227e-01  2.843e-02  28.936  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7002 on 164 degrees of freedom
## Multiple R-squared:  0.8558, Adjusted R-squared:  0.8541 
## F-statistic: 486.7 on 2 and 164 DF,  p-value: < 2.2e-16
# ------------------------------------------------------------
# 12.3. STEPWISE FORWARD
# ------------------------------------------------------------

cat("\n--- STEPWISE FORWARD ---\n")
## 
## --- STEPWISE FORWARD ---
model_null <- lm(
  net_profit ~ 1,
  data = data_model)

model_forward <- step(
  model_null,
  scope = list(
    lower = formula(model_null),
    upper = formula(model)),
  direction = "forward",
  trace = 1)
## Start:  AIC=3279.62
## net_profit ~ 1
## 
##                     Df  Sum of Sq        RSS    AIC
## + average_salary     1 4.4727e+10 1.1039e+10 3011.1
## + revenue_growth     1 9.7775e+09 4.5989e+10 3249.4
## + rd_investment      1 6.6748e+09 4.9091e+10 3260.3
## + market_volatility  1 2.7393e+09 5.3027e+10 3273.2
## + operational_cost   1 7.4391e+08 5.5022e+10 3279.4
## <none>                            5.5766e+10 3279.6
## 
## Step:  AIC=3011.12
## net_profit ~ average_salary
## 
##                     Df  Sum of Sq        RSS    AIC
## + rd_investment      1 2998292133 8.0407e+09 2960.2
## + market_volatility  1  454684090 1.0584e+10 3006.1
## + revenue_growth     1  147918877 1.0891e+10 3010.9
## <none>                            1.1039e+10 3011.1
## + operational_cost   1    1953841 1.1037e+10 3013.1
## 
## Step:  AIC=2960.2
## net_profit ~ average_salary + rd_investment
## 
##                     Df Sum of Sq        RSS    AIC
## <none>                           8040742983 2960.2
## + market_volatility  1  70227284 7970515699 2960.7
## + operational_cost   1   9335996 8031406987 2962.0
## + revenue_growth     1    224703 8040518280 2962.2
cat("\nFORMULA MODEL FORWARD:\n")
## 
## FORMULA MODEL FORWARD:
print(formula(model_forward))
## net_profit ~ average_salary + rd_investment
cat("\nRINGKASAN MODEL FORWARD:\n")
## 
## RINGKASAN MODEL FORWARD:
print(summary(model_forward))
## 
## Call:
## lm(formula = net_profit ~ average_salary + rd_investment, data = data_model)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -23663  -3953    421   3234  33531 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -1.178e+04  1.486e+03  -7.923 3.35e-13 ***
## average_salary  8.227e-01  2.843e-02  28.936  < 2e-16 ***
## rd_investment   1.560e+03  1.995e+02   7.820 6.08e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7002 on 164 degrees of freedom
## Multiple R-squared:  0.8558, Adjusted R-squared:  0.8541 
## F-statistic: 486.7 on 2 and 164 DF,  p-value: < 2.2e-16
# ============================================================
# PERBANDINGAN KRITERIA MODEL
# ============================================================

hitung_kriteria <- function(model_obj) {

  n_model <- nobs(model_obj)
  k <- length(coef(model_obj))

  aic_value <- AIC(model_obj)
  bic_value <- BIC(model_obj)

  aicc_value <- aic_value +
    (2 * k * (k + 1)) /
    (n_model - k - 1)

  hasil <- data.frame(
    AIC = aic_value,
    BIC = bic_value,
    AICc = aicc_value
  )

  return(round(hasil, 4))
}

cat("\nMODEL AWAL:\n")
## 
## MODEL AWAL:
print(hitung_kriteria(model))
##        AIC      BIC    AICc
## 1 3439.515 3461.341 3440.04
cat("\nMODEL STEPWISE BOTH:\n")
## 
## MODEL STEPWISE BOTH:
print(hitung_kriteria(step_model))
##        AIC      BIC     AICc
## 1 3436.121 3448.593 3436.268
cat("\nMODEL STEPWISE BACKWARD:\n")
## 
## MODEL STEPWISE BACKWARD:
print(hitung_kriteria(model_backward))
##        AIC      BIC     AICc
## 1 3436.121 3448.593 3436.268
cat("\nMODEL STEPWISE FORWARD:\n")
## 
## MODEL STEPWISE FORWARD:
print(hitung_kriteria(model_forward))
##        AIC      BIC     AICc
## 1 3436.121 3448.593 3436.268
# ============================================================
# 13. RINGKASAN HASIL ANALISIS
# ============================================================

cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("12. RINGKASAN HASIL ANALISIS\n")
## 12. RINGKASAN HASIL ANALISIS
cat(strrep("=", 60), "\n")
## ============================================================
# ------------------------------------------------------------
# MODEL AWAL
# ------------------------------------------------------------

cat("\n--- MODEL AWAL ---\n")
## 
## --- MODEL AWAL ---
print(formula(model))
## net_profit ~ revenue_growth + rd_investment + operational_cost + 
##     average_salary + market_volatility
cat("\nPERSAMAAN REGRESI:\n")
## 
## PERSAMAAN REGRESI:
koef <- coef(model)
cat("net_profit =",
  round(koef[1], 4))
## net_profit = -10168.6
for (i in 2:length(koef)) {
  tanda <- ifelse(koef[i] >= 0, " + ", " - ")
  cat(tanda, abs(round(koef[i], 4)), "*", names(koef)[i])
}
##  +  33.3675 * revenue_growth +  1579.282 * rd_investment -  43.9892 * operational_cost +  0.7981 * average_salary -  80.0348 * market_volatility
cat("\n")
# ------------------------------------------------------------
# SIGNIFIKANSI
# ------------------------------------------------------------

cat("\n--- UJI SIGNIFIKANSI ---\n")
## 
## --- UJI SIGNIFIKANSI ---
cat("Uji F p-value:", format.pval(f_pvalue, digits = 5), "\n")
## Uji F p-value: < 2.22e-16
cat("\nUji t masing-masing variabel:\n")
## 
## Uji t masing-masing variabel:
for (i in 2:nrow(coef_df)) {
  cat(coef_df$Variabel[i], ": p-value =", format.pval(coef_df$p_value[i], digits = 5), "\n")
}
## revenue_growth : p-value = 0.444 
## rd_investment : p-value = < 2.22e-16 
## operational_cost : p-value = 0.3022 
## average_salary : p-value = < 2.22e-16 
## market_volatility : p-value = 0.1534
# ------------------------------------------------------------
# ASUMSI
# ------------------------------------------------------------

cat("\n--- UJI ASUMSI ---\n")
## 
## --- UJI ASUMSI ---
cat("Shapiro-Wilk p-value:",
  format.pval(shapiro_test$p.value, digits = 5),"\n")
## Shapiro-Wilk p-value: 2.5201e-09
cat("Anderson-Darling p-value:",
  format.pval(ad_test$p.value, digits = 5),"\n")
## Anderson-Darling p-value: 1.4629e-07
cat("Breusch-Pagan p-value:",
  format.pval(bp_test$p.value, digits = 5),"\n")
## Breusch-Pagan p-value: 3.7327e-14
cat("Durbin-Watson p-value:",
  format.pval(dw_test$p.value, digits = 5),"\n")
## Durbin-Watson p-value: 0.21739
cat("VIF maksimum:",
  round(max(vif_values), 4),"\n")
## VIF maksimum: 4.7974
cat("Ramsey RESET p-value:",
  format.pval(reset_test$p.value, digits = 5),"\n")
## Ramsey RESET p-value: 2.2545e-13
# ------------------------------------------------------------
# KOEFISIEN DETERMINASI
# ------------------------------------------------------------

cat("\n--- KOEFISIEN DETERMINASI ---\n")
## 
## --- KOEFISIEN DETERMINASI ---
cat("R-squared:", round(r_squared, 4), "\n")
## R-squared: 0.858
cat("Adjusted R-squared:", round(adj_r_squared, 4), "\n")
## Adjusted R-squared: 0.8536
cat("\n")
cat(strrep("=", 60), "\n")
## ============================================================
cat("ANALISIS SELESAI\n")
## ANALISIS SELESAI
cat(strrep("=", 60), "\n")
## ============================================================