Tugas Hands On Analisis Multivariat

Yohana Gabriela Sarmauli Ritonga

2026-09-21

ANALISIS MULTIPLE LINEAR REGRESSION

GLOBAL E-COMMERCE SALES DATASET 2025

# ============================================================
# 0. LOAD PACKAGE
# ============================================================

library(car)
library(lmtest)
library(nortest)
library(MASS)
library(ggplot2)
library(corrplot)
library(moments)

set.seed(123)

1. IMPORT DATA

# ============================================================
# 1. IMPORT DATA
# ============================================================

# ============================================================
# 1. IMPORT DATA
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("IMPORT DATA\n")
## IMPORT DATA
cat("============================================================\n")
## ============================================================
# Path file CSV menggunakan garis miring ke depan (/)
DATA_PATH <- "C:/Users/Yohana Gabriela/OneDrive/Documents/global_ecommerce_sales.csv"

# ============================================================
# CEK FILE
# ============================================================

if (!file.exists(DATA_PATH)) {
  stop(
    paste0(
      "\nFILE DATA TIDAK DITEMUKAN!\n\n",
      "Path yang digunakan:\n",
      DATA_PATH,
      "\n\n",
      "Periksa kembali lokasi dan nama file CSV."
    )
  )
}

# ============================================================
# MEMBACA DATA
# ============================================================

data <- read.csv(
  DATA_PATH,
  stringsAsFactors = FALSE
)

cat("\nData berhasil dibaca.\n")
## 
## Data berhasil dibaca.
cat(
  "Jumlah baris:",
  nrow(data),
  "\n"
)
## Jumlah baris: 1200
cat(
  "Jumlah kolom:",
  ncol(data),
  "\n"
)
## Jumlah kolom: 7
cat("\n6 data pertama:\n")
## 
## 6 data pertama:
print(
  head(data)
)
##   Order_ID   Country    Category Unit_Price Quantity Order_Date Total_Amount
## 1        1   Germany Electronics     285.82        7  6/12/2025      2000.74
## 2        2  Pakistan        Toys     132.00        9  1/14/2025      1188.00
## 3        3 Australia     Fashion     481.65        9  8/27/2025      4334.85
## 4        4       UAE     Grocery     244.36        3  3/13/2025       733.08
## 5        5   Germany      Sports     403.97        5  5/23/2025      2019.85
## 6        6    Brazil  Home Decor     277.36        8 10/10/2025      2218.88

2. PEMERIKSAAN DATA AWAL

# ============================================================
# 2. PEMERIKSAAN DATA AWAL
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("PEMERIKSAAN DATA AWAL\n")
## PEMERIKSAAN DATA AWAL
cat("============================================================\n")
## ============================================================
cat("\nNama variabel:\n")
## 
## Nama variabel:
print(
  names(data)
)
## [1] "Order_ID"     "Country"      "Category"     "Unit_Price"   "Quantity"    
## [6] "Order_Date"   "Total_Amount"
cat("\nStruktur data:\n")
## 
## Struktur data:
str(data)
## 'data.frame':    1200 obs. of  7 variables:
##  $ Order_ID    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Country     : chr  "Germany" "Pakistan" "Australia" "UAE" ...
##  $ Category    : chr  "Electronics" "Toys" "Fashion" "Grocery" ...
##  $ Unit_Price  : num  286 132 482 244 404 ...
##  $ Quantity    : int  7 9 9 3 5 8 8 4 1 1 ...
##  $ Order_Date  : chr  "6/12/2025" "1/14/2025" "8/27/2025" "3/13/2025" ...
##  $ Total_Amount: num  2001 1188 4335 733 2020 ...
cat("\nStatistik deskriptif awal:\n")
## 
## Statistik deskriptif awal:
print(
  summary(data)
)
##     Order_ID        Country            Category           Unit_Price    
##  Min.   :   1.0   Length:1200        Length:1200        Min.   :  5.07  
##  1st Qu.: 300.8   Class :character   Class :character   1st Qu.:132.90  
##  Median : 600.5   Mode  :character   Mode  :character   Median :252.75  
##  Mean   : 600.5                                         Mean   :251.66  
##  3rd Qu.: 900.2                                         3rd Qu.:375.96  
##  Max.   :1200.0                                         Max.   :499.18  
##     Quantity      Order_Date         Total_Amount    
##  Min.   :1.000   Length:1200        Min.   :  11.14  
##  1st Qu.:3.000   Class :character   1st Qu.: 392.44  
##  Median :5.000   Mode  :character   Median : 950.42  
##  Mean   :5.007                      Mean   :1260.21  
##  3rd Qu.:7.000                      3rd Qu.:1954.10  
##  Max.   :9.000                      Max.   :4483.71
cat("\nJumlah missing value:\n")
## 
## Jumlah missing value:
print(
  colSums(
    is.na(data)
  )
)
##     Order_ID      Country     Category   Unit_Price     Quantity   Order_Date 
##            0            0            0            0            0            0 
## Total_Amount 
##            0
cat("\nJumlah data duplikat:\n")
## 
## Jumlah data duplikat:
print(
  sum(
    duplicated(data)
  )
)
## [1] 0

3. DATA CLEANING

# ============================================================
# 3. DATA CLEANING
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("DATA CLEANING\n")
## DATA CLEANING
cat("============================================================\n")
## ============================================================
# Menghapus data duplikat

data <- data[
  !duplicated(data),
]

# ============================================================
# MENGUBAH TIPE DATA
# ============================================================

if ("Country" %in% names(data)) {
  data$Country <- as.factor(
    data$Country
  )
}

if ("Category" %in% names(data)) {
  data$Category <- as.factor(
    data$Category
  )
}

if ("Unit_Price" %in% names(data)) {
  data$Unit_Price <- as.numeric(
    data$Unit_Price
  )
}

if ("Quantity" %in% names(data)) {
  data$Quantity <- as.numeric(
    data$Quantity
  )
}

if ("Total_Amount" %in% names(data)) {
  data$Total_Amount <- as.numeric(
    data$Total_Amount
  )
}

if ("Order_Date" %in% names(data)) {
  data$Order_Date <- as.Date(
    data$Order_Date
  )
}

# ============================================================
# MENGHAPUS MISSING VALUE
# ============================================================

data <- na.omit(data)

# ============================================================
# MENGHAPUS NILAI TIDAK VALID
# ============================================================

data <- subset(
  data,
  Unit_Price > 0 &
    Quantity > 0 &
    Total_Amount > 0
)

cat("\nJumlah observasi setelah cleaning:")
## 
## Jumlah observasi setelah cleaning:
cat(
  nrow(data),
  "\n"
)
## 484
cat("\nJumlah variabel setelah cleaning:")
## 
## Jumlah variabel setelah cleaning:
cat(
  ncol(data),
  "\n"
)
## 7
cat("\nMissing value setelah cleaning:\n")
## 
## Missing value setelah cleaning:
print(
  colSums(
    is.na(data)
  )
)
##     Order_ID      Country     Category   Unit_Price     Quantity   Order_Date 
##            0            0            0            0            0            0 
## Total_Amount 
##            0

4. TRANSFORMASI DATA

# ============================================================
# 4. TRANSFORMASI DATA
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("TRANSFORMASI DATA\n")
## TRANSFORMASI DATA
cat("============================================================\n")
## ============================================================
data$log_Total_Amount <- log(
  data$Total_Amount
)

data$log_Unit_Price <- log(
  data$Unit_Price
)

data$log_Quantity <- log(
  data$Quantity
)

cat("\nVariabel yang digunakan:\n")
## 
## Variabel yang digunakan:
cat("Y  = log_Total_Amount\n")
## Y  = log_Total_Amount
cat("X1 = log_Unit_Price\n")
## X1 = log_Unit_Price
cat("X2 = log_Quantity\n")
## X2 = log_Quantity
cat("X3 = Country\n")
## X3 = Country
cat("X4 = Category\n")
## X4 = Category

5. STATISTIK DESKRIPTIF

# ============================================================
# 5. STATISTIK DESKRIPTIF
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("1. STATISTIK DESKRIPTIF\n")
## 1. STATISTIK DESKRIPTIF
cat("============================================================\n")
## ============================================================
numeric_data <- data[
  c(
    "Unit_Price",
    "Quantity",
    "Total_Amount",
    "log_Unit_Price",
    "log_Quantity",
    "log_Total_Amount"
  )
]

cat("\nSummary:\n")
## 
## Summary:
print(
  summary(
    numeric_data
  )
)
##    Unit_Price        Quantity      Total_Amount     log_Unit_Price 
##  Min.   :  5.07   Min.   :1.000   Min.   :  11.14   Min.   :1.623  
##  1st Qu.:142.57   1st Qu.:3.000   1st Qu.: 418.13   1st Qu.:4.960  
##  Median :269.08   Median :5.000   Median :1009.35   Median :5.595  
##  Mean   :260.94   Mean   :5.052   Mean   :1327.60   Mean   :5.312  
##  3rd Qu.:382.46   3rd Qu.:7.000   3rd Qu.:2067.54   3rd Qu.:5.947  
##  Max.   :498.19   Max.   :9.000   Max.   :4483.71   Max.   :6.211  
##   log_Quantity   log_Total_Amount
##  Min.   :0.000   Min.   :2.411   
##  1st Qu.:1.099   1st Qu.:6.036   
##  Median :1.609   Median :6.917   
##  Mean   :1.417   Mean   :6.730   
##  3rd Qu.:1.946   3rd Qu.:7.634   
##  Max.   :2.197   Max.   :8.408
cat("\nMean:\n")
## 
## Mean:
print(
  round(
    sapply(
      numeric_data,
      mean
    ),
    4
  )
)
##       Unit_Price         Quantity     Total_Amount   log_Unit_Price 
##         260.9421           5.0517        1327.5958           5.3122 
##     log_Quantity log_Total_Amount 
##           1.4174           6.7296
cat("\nStandard Deviation:\n")
## 
## Standard Deviation:
print(
  round(
    sapply(
      numeric_data,
      sd
    ),
    4
  )
)
##       Unit_Price         Quantity     Total_Amount   log_Unit_Price 
##         141.1706           2.6515        1077.8077           0.8563 
##     log_Quantity log_Total_Amount 
##           0.7136           1.1263

6. EKSPLORASI DATA

# ============================================================
# 6. EKSPLORASI DATA
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("2. EKSPLORASI DATA\n")
## 2. EKSPLORASI DATA
cat("============================================================\n")
## ============================================================
# Histogram Total Amount

hist(
  data$Total_Amount,
  main = "Distribusi Total Amount",
  xlab = "Total Amount",
  breaks = 30
)

# Histogram Log Total Amount

hist(
  data$log_Total_Amount,
  main = "Distribusi Log Total Amount",
  xlab = "Log Total Amount",
  breaks = 30
)

# Unit Price vs Total Amount

plot(
  data$Unit_Price,
  data$Total_Amount,
  main = "Unit Price vs Total Amount",
  xlab = "Unit Price",
  ylab = "Total Amount",
  pch = 19
)

# Quantity vs Total Amount

plot(
  data$Quantity,
  data$Total_Amount,
  main = "Quantity vs Total Amount",
  xlab = "Quantity",
  ylab = "Total Amount",
  pch = 19
)

# Log Unit Price vs Log Total Amount

plot(
  data$log_Unit_Price,
  data$log_Total_Amount,
  main = "Log Unit Price vs Log Total Amount",
  xlab = "Log Unit Price",
  ylab = "Log Total Amount",
  pch = 19
)

# Log Quantity vs Log Total Amount

plot(
  data$log_Quantity,
  data$log_Total_Amount,
  main = "Log Quantity vs Log Total Amount",
  xlab = "Log Quantity",
  ylab = "Log Total Amount",
  pch = 19
)

7. MATRIKS KORELASI

# ============================================================
# 7. MATRIKS KORELASI
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("3. MATRIKS KORELASI\n")
## 3. MATRIKS KORELASI
cat("============================================================\n")
## ============================================================
cor_data <- data[
  c(
    "log_Total_Amount",
    "log_Unit_Price",
    "log_Quantity"
  )
]

cor_matrix <- cor(
  cor_data,
  use = "complete.obs"
)

cat("\nMatriks Korelasi:\n")
## 
## Matriks Korelasi:
print(
  round(
    cor_matrix,
    3
  )
)
##                  log_Total_Amount log_Unit_Price log_Quantity
## log_Total_Amount            1.000          0.774        0.650
## log_Unit_Price              0.774          1.000        0.021
## log_Quantity                0.650          0.021        1.000
corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  addCoef.col = "black",
  tl.col = "black",
  tl.srt = 45,
  title = "Matriks Korelasi",
  mar = c(0, 0, 2, 0)
)

pairs(
  cor_data,
  main = "Scatter Plot Matrix",
  pch = 19
)

8. MODEL MULTIPLE LINEAR REGRESSION

# ============================================================
# 8. MODEL MULTIPLE LINEAR REGRESSION
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("4. ESTIMASI MULTIPLE LINEAR REGRESSION\n")
## 4. ESTIMASI MULTIPLE LINEAR REGRESSION
cat("============================================================\n")
## ============================================================
model_full <- lm(
  log_Total_Amount ~
    log_Unit_Price +
    log_Quantity +
    Country +
    Category,
  data = data
)

cat("\nRingkasan Model Full:\n")
## 
## Ringkasan Model Full:
print(
  summary(
    model_full
  )
)
## 
## Call:
## lm(formula = log_Total_Amount ~ log_Unit_Price + log_Quantity + 
##     Country + Category, data = data)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -1.340e-14 -6.120e-16  1.600e-16  3.990e-16  7.468e-14 
## 
## Coefficients:
##                       Estimate Std. Error    t value Pr(>|t|)    
## (Intercept)          8.397e-15  1.275e-15  6.585e+00 1.23e-10 ***
## log_Unit_Price       1.000e+00  1.978e-16  5.054e+15  < 2e-16 ***
## log_Quantity         1.000e+00  2.396e-16  4.174e+15  < 2e-16 ***
## CountryBrazil       -3.757e-16  7.326e-16 -5.130e-01   0.6083    
## CountryCanada       -1.321e-17  7.282e-16 -1.800e-02   0.9855    
## CountryChina        -5.097e-17  7.770e-16 -6.600e-02   0.9477    
## CountryGermany       1.412e-15  7.364e-16  1.918e+00   0.0558 .  
## CountryIndia        -2.315e-16  7.355e-16 -3.150e-01   0.7531    
## CountryPakistan     -9.914e-17  7.765e-16 -1.280e-01   0.8985    
## CountryUAE          -2.266e-16  7.338e-16 -3.090e-01   0.7577    
## CountryUK           -8.822e-17  8.272e-16 -1.070e-01   0.9151    
## CountryUSA          -3.372e-17  7.244e-16 -4.700e-02   0.9629    
## CategoryBooks        1.048e-16  6.890e-16  1.520e-01   0.8791    
## CategoryElectronics  1.366e-15  6.671e-16  2.048e+00   0.0411 *  
## CategoryFashion      1.787e-16  6.524e-16  2.740e-01   0.7843    
## CategoryGrocery      9.853e-17  7.011e-16  1.410e-01   0.8883    
## CategoryHome Decor   6.105e-17  6.846e-16  8.900e-02   0.9290    
## CategorySports       1.345e-16  6.800e-16  1.980e-01   0.8433    
## CategoryToys         1.516e-16  6.930e-16  2.190e-01   0.8269    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.667e-15 on 465 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 2.531e+30 on 18 and 465 DF,  p-value: < 2.2e-16
# ============================================================
# KOEFISIEN REGRESI
# ============================================================

coef_summary <- summary(
  model_full
)$coefficients

coef_df <- data.frame(
  Variabel =
    rownames(
      coef_summary
    ),
  Koefisien =
    round(
      coef_summary[, 1],
      4
    ),
  Std_Error =
    round(
      coef_summary[, 2],
      4
    ),
  t_value =
    round(
      coef_summary[, 3],
      4
    ),
  p_value =
    round(
      coef_summary[, 4],
      4
    )
)

cat("\nKoefisien Regresi:\n")
## 
## Koefisien Regresi:
print(
  coef_df,
  row.names = FALSE
)
##             Variabel Koefisien Std_Error       t_value p_value
##          (Intercept)         0         0  6.584800e+00  0.0000
##       log_Unit_Price         1         0  5.054309e+15  0.0000
##         log_Quantity         1         0  4.173972e+15  0.0000
##        CountryBrazil         0         0 -5.129000e-01  0.6083
##        CountryCanada         0         0 -1.810000e-02  0.9855
##         CountryChina         0         0 -6.560000e-02  0.9477
##       CountryGermany         0         0  1.917600e+00  0.0558
##         CountryIndia         0         0 -3.148000e-01  0.7531
##      CountryPakistan         0         0 -1.277000e-01  0.8985
##           CountryUAE         0         0 -3.087000e-01  0.7577
##            CountryUK         0         0 -1.067000e-01  0.9151
##           CountryUSA         0         0 -4.650000e-02  0.9629
##        CategoryBooks         0         0  1.521000e-01  0.8791
##  CategoryElectronics         0         0  2.048300e+00  0.0411
##      CategoryFashion         0         0  2.739000e-01  0.7843
##      CategoryGrocery         0         0  1.406000e-01  0.8883
##   CategoryHome Decor         0         0  8.920000e-02  0.9290
##       CategorySports         0         0  1.978000e-01  0.8433
##         CategoryToys         0         0  2.187000e-01  0.8269

9. UJI F

# ============================================================
# 9. UJI F
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("5. UJI SIGNIFIKANSI SIMULTAN (UJI F)\n")
## 5. UJI SIGNIFIKANSI SIMULTAN (UJI F)
cat("============================================================\n")
## ============================================================
f_stat <- summary(
  model_full
)$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 : Semua koefisien slope = 0\n"
)
## H0 : Semua koefisien slope = 0
cat(
  "H1 : Minimal terdapat satu koefisien slope != 0\n"
)
## H1 : Minimal terdapat satu koefisien slope != 0
cat("\nHasil:\n")
## 
## Hasil:
cat(
  "F-statistic =",
  round(
    f_value,
    4
  ),
  "\n"
)
## F-statistic = 2.530793e+30
cat(
  "df1 =",
  df1,
  "\n"
)
## df1 = 18
cat(
  "df2 =",
  df2,
  "\n"
)
## df2 = 465
cat(
  "p-value =",
  format(
    f_pvalue,
    scientific = TRUE
  ),
  "\n"
)
## p-value = 0e+00
if (
  f_pvalue < 0.05
) {

  cat(
    "Keputusan: Tolak H0 pada alpha = 5%\n"
  )

} else {

  cat(
    "Keputusan: Gagal menolak H0 pada alpha = 5%\n"
  )

}
## Keputusan: Tolak H0 pada alpha = 5%

10. UJI T

# ============================================================
# 10. UJI T
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("6. UJI SIGNIFIKANSI PARSIAL (UJI T)\n")
## 6. UJI SIGNIFIKANSI PARSIAL (UJI T)
cat("============================================================\n")
## ============================================================
cat("\nHipotesis:\n")
## 
## Hipotesis:
cat(
  "H0 : beta_j = 0\n"
)
## H0 : beta_j = 0
cat(
  "H1 : beta_j != 0\n"
)
## H1 : beta_j != 0
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]

  cat(
    "\nVariabel:",
    var_name,
    "\n"
  )

  cat(
    "t-value =",
    t_val,
    "\n"
  )

  cat(
    "p-value =",
    p_val,
    "\n"
  )

  if (
    p_val < 0.05
  ) {

    cat(
      "Keputusan: Tolak H0\n"
    )

  } else {

    cat(
      "Keputusan: Gagal menolak H0\n"
    )

  }

}
## 
## Variabel: log_Unit_Price 
## t-value = 5.054309e+15 
## p-value = 0 
## Keputusan: Tolak H0
## 
## Variabel: log_Quantity 
## t-value = 4.173972e+15 
## p-value = 0 
## Keputusan: Tolak H0
## 
## Variabel: CountryBrazil 
## t-value = -0.5129 
## p-value = 0.6083 
## Keputusan: Gagal menolak H0
## 
## Variabel: CountryCanada 
## t-value = -0.0181 
## p-value = 0.9855 
## Keputusan: Gagal menolak H0
## 
## Variabel: CountryChina 
## t-value = -0.0656 
## p-value = 0.9477 
## Keputusan: Gagal menolak H0
## 
## Variabel: CountryGermany 
## t-value = 1.9176 
## p-value = 0.0558 
## Keputusan: Gagal menolak H0
## 
## Variabel: CountryIndia 
## t-value = -0.3148 
## p-value = 0.7531 
## Keputusan: Gagal menolak H0
## 
## Variabel: CountryPakistan 
## t-value = -0.1277 
## p-value = 0.8985 
## Keputusan: Gagal menolak H0
## 
## Variabel: CountryUAE 
## t-value = -0.3087 
## p-value = 0.7577 
## Keputusan: Gagal menolak H0
## 
## Variabel: CountryUK 
## t-value = -0.1067 
## p-value = 0.9151 
## Keputusan: Gagal menolak H0
## 
## Variabel: CountryUSA 
## t-value = -0.0465 
## p-value = 0.9629 
## Keputusan: Gagal menolak H0
## 
## Variabel: CategoryBooks 
## t-value = 0.1521 
## p-value = 0.8791 
## Keputusan: Gagal menolak H0
## 
## Variabel: CategoryElectronics 
## t-value = 2.0483 
## p-value = 0.0411 
## Keputusan: Tolak H0
## 
## Variabel: CategoryFashion 
## t-value = 0.2739 
## p-value = 0.7843 
## Keputusan: Gagal menolak H0
## 
## Variabel: CategoryGrocery 
## t-value = 0.1406 
## p-value = 0.8883 
## Keputusan: Gagal menolak H0
## 
## Variabel: CategoryHome Decor 
## t-value = 0.0892 
## p-value = 0.929 
## Keputusan: Gagal menolak H0
## 
## Variabel: CategorySports 
## t-value = 0.1978 
## p-value = 0.8433 
## Keputusan: Gagal menolak H0
## 
## Variabel: CategoryToys 
## t-value = 0.2187 
## p-value = 0.8269 
## Keputusan: Gagal menolak H0

11. R-SQUARED, ADJUSTED R-SQUARED DAN RMSE

# ============================================================
# 11. R-SQUARED, ADJUSTED R-SQUARED DAN RMSE
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("7. R-SQUARED, ADJUSTED R-SQUARED DAN RMSE\n")
## 7. R-SQUARED, ADJUSTED R-SQUARED DAN RMSE
cat("============================================================\n")
## ============================================================
r_squared <- summary(
  model_full
)$r.squared

adj_r_squared <- summary(
  model_full
)$adj.r.squared

resid_se <- summary(
  model_full
)$sigma

pred_full <- fitted(
  model_full
)

actual_full <- data$log_Total_Amount

rmse_full <- sqrt(
  mean(
    (
      actual_full -
        pred_full
    )^2
  )
)

cat(
  "\nR-squared =",
  round(
    r_squared,
    4
  ),
  "\n"
)
## 
## R-squared = 1
cat(
  "Adjusted R-squared =",
  round(
    adj_r_squared,
    4
  ),
  "\n"
)
## Adjusted R-squared = 1
cat(
  "Residual Standard Error =",
  round(
    resid_se,
    4
  ),
  "\n"
)
## Residual Standard Error = 0
cat(
  "RMSE =",
  round(
    rmse_full,
    4
  ),
  "\n"
)
## RMSE = 0
cat(
  "\nModel menjelaskan sekitar",
  round(
    r_squared * 100,
    2
  ),
  "% variasi Y.\n"
)
## 
## Model menjelaskan sekitar 100 % variasi Y.

12. EKSTRAK RESIDUAL

# ============================================================
# 12. EKSTRAK RESIDUAL
# ============================================================

residuals_model <- residuals(
  model_full
)

fitted_values <- fitted(
  model_full
)

standardized_resid <- rstandard(
  model_full
)

13. UJI NORMALITAS RESIDUAL

# ============================================================
# 13. UJI NORMALITAS RESIDUAL
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("8. UJI NORMALITAS RESIDUAL\n")
## 8. UJI NORMALITAS RESIDUAL
cat("============================================================\n")
## ============================================================
# Shapiro-Wilk
# Maksimal 5000 observasi

shapiro_sample <- if (
  length(residuals_model) > 5000
) {

  sample(
    residuals_model,
    5000
  )

} else {

  residuals_model

}

shapiro_test <- shapiro.test(
  shapiro_sample
)

cat("\nShapiro-Wilk Test:\n")
## 
## Shapiro-Wilk Test:
cat(
  "W =",
  round(
    shapiro_test$statistic,
    4
  ),
  "\n"
)
## W = 0.1421
cat(
  "p-value =",
  round(
    shapiro_test$p.value,
    4
  ),
  "\n"
)
## p-value = 0
if (
  shapiro_test$p.value > 0.05
) {

  cat(
    "Kesimpulan: Residual tidak menunjukkan penyimpangan signifikan dari normalitas.\n"
  )

} else {

  cat(
    "Kesimpulan: Terdapat indikasi residual tidak normal.\n"
  )

}
## Kesimpulan: Terdapat indikasi residual tidak normal.
# Anderson-Darling

ad_test <- ad.test(
  residuals_model
)

cat("\nAnderson-Darling Test:\n")
## 
## Anderson-Darling Test:
cat(
  "A =",
  round(
    ad_test$statistic,
    4
  ),
  "\n"
)
## A = 111.4597
cat(
  "p-value =",
  round(
    ad_test$p.value,
    4
  ),
  "\n"
)
## p-value = 0
# Jarque-Bera

jb_test <- jarque.test(
  residuals_model
)

cat("\nJarque-Bera Test:\n")
## 
## Jarque-Bera Test:
cat(
  "JB =",
  round(
    jb_test$statistic,
    4
  ),
  "\n"
)
## JB = 2984546
cat(
  "p-value =",
  round(
    jb_test$p.value,
    4
  ),
  "\n"
)
## p-value = 0

14. UJI HETEROSKEDASTISITAS

# ============================================================
# 14. UJI HETEROSKEDASTISITAS
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("9. UJI HETEROSKEDASTISITAS\n")
## 9. UJI HETEROSKEDASTISITAS
cat("============================================================\n")
## ============================================================
bp_test <- bptest(
  model_full
)

cat("\nBreusch-Pagan Test:\n")
## 
## Breusch-Pagan Test:
cat(
  "BP =",
  round(
    bp_test$statistic,
    4
  ),
  "\n"
)
## BP = 16.2701
cat(
  "p-value =",
  round(
    bp_test$p.value,
    4
  ),
  "\n"
)
## p-value = 0.5737
if (
  bp_test$p.value > 0.05
) {

  cat(
    "Kesimpulan: Tidak terdapat indikasi heteroskedastisitas.\n"
  )

} else {

  cat(
    "Kesimpulan: Terdapat indikasi heteroskedastisitas.\n"
  )

}
## Kesimpulan: Tidak terdapat indikasi heteroskedastisitas.

15. UJI AUTOKORELASI

# ============================================================
# 15. UJI AUTOKORELASI
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("10. UJI AUTOKORELASI\n")
## 10. UJI AUTOKORELASI
cat("============================================================\n")
## ============================================================
dw_test <- dwtest(
  model_full
)

cat("\nDurbin-Watson Test:\n")
## 
## Durbin-Watson Test:
cat(
  "DW =",
  round(
    dw_test$statistic,
    4
  ),
  "\n"
)
## DW = 1.4827
cat(
  "p-value =",
  round(
    dw_test$p.value,
    4
  ),
  "\n"
)
## p-value = 0
bg_test <- bgtest(
  model_full,
  order = 1
)

cat("\nBreusch-Godfrey Test:\n")
## 
## Breusch-Godfrey Test:
cat(
  "LM =",
  round(
    bg_test$statistic,
    4
  ),
  "\n"
)
## LM = 17.5066
cat(
  "p-value =",
  round(
    bg_test$p.value,
    4
  ),
  "\n"
)
## p-value = 0

16. UJI MULTIKOLINEARITAS

# ============================================================
# 16. UJI MULTIKOLINEARITAS
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("11. UJI MULTIKOLINEARITAS\n")
## 11. UJI MULTIKOLINEARITAS
cat("============================================================\n")
## ============================================================
vif_values <- vif(
  model_full
)

cat("\nVIF / GVIF:\n")
## 
## VIF / GVIF:
print(
  round(
    vif_values,
    4
  )
)
##                  GVIF Df GVIF^(1/(2*Df))
## log_Unit_Price 1.0309  1          1.0153
## log_Quantity   1.0497  1          1.0245
## Country        1.2225  9          1.0112
## Category       1.2144  7          1.0140

17. UJI LINEARITAS / SPESIFIKASI MODEL

# ============================================================
# 17. UJI LINEARITAS / SPESIFIKASI MODEL
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("12. UJI LINEARITAS\n")
## 12. UJI LINEARITAS
cat("============================================================\n")
## ============================================================
reset_test <- resettest(
  model_full,
  power = 2:3,
  type = "fitted"
)

cat("\nRamsey RESET Test:\n")
## 
## Ramsey RESET Test:
cat(
  "F =",
  round(
    reset_test$statistic,
    4
  ),
  "\n"
)
## F = 0.0287
cat(
  "p-value =",
  round(
    reset_test$p.value,
    4
  ),
  "\n"
)
## p-value = 0.9717
if (
  reset_test$p.value > 0.05
) {

  cat(
    "Kesimpulan: Tidak terdapat indikasi kuat kesalahan spesifikasi bentuk fungsi.\n"
  )

} else {

  cat(
    "Kesimpulan: Terdapat indikasi kesalahan spesifikasi bentuk fungsi.\n"
  )

}
## Kesimpulan: Tidak terdapat indikasi kuat kesalahan spesifikasi bentuk fungsi.

18. DIAGNOSTIK OUTLIER

# ============================================================
# 18. DIAGNOSTIK OUTLIER
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("13. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS\n")
## 13. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
cat("============================================================\n")
## ============================================================
# Cook's Distance

cooks_d <- cooks.distance(
  model_full
)

cat("\nCook's Distance:\n")
## 
## Cook's Distance:
cat(
  "Nilai maksimum =",
  round(
    max(cooks_d),
    4
  ),
  "\n"
)
## Nilai maksimum = 0.83
cat(
  "Jumlah Cook's Distance > 1 =",
  sum(
    cooks_d > 1
  ),
  "\n"
)
## Jumlah Cook's Distance > 1 = 0
# Leverage

leverage <- hatvalues(
  model_full
)

n_obs <- nrow(data)

jumlah_parameter <- length(
  coef(model_full)
)

leverage_threshold <-
  2 *
  jumlah_parameter /
  n_obs

cat("\nLeverage:\n")
## 
## Leverage:
cat(
  "Nilai maksimum =",
  round(
    max(leverage),
    4
  ),
  "\n"
)
## Nilai maksimum = 0.0691
cat(
  "Threshold =",
  round(
    leverage_threshold,
    4
  ),
  "\n"
)
## Threshold = 0.0785
# Studentized residual

studentized_resid <- rstudent(
  model_full
)

cat("\nStudentized Residual:\n")
## 
## Studentized Residual:
cat(
  "Nilai maksimum absolut =",
  round(
    max(
      abs(
        studentized_resid
      )
    ),
    4
  ),
  "\n"
)
## Nilai maksimum absolut = 75.3593
cat(
  "Jumlah |studentized residual| > 3 =",
  sum(
    abs(
      studentized_resid
    ) > 3
  ),
  "\n"
)
## Jumlah |studentized residual| > 3 = 3

19. VISUALISASI DIAGNOSTIK

# ============================================================
# 19. VISUALISASI DIAGNOSTIK
# ============================================================

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

# Residual vs Fitted

plot(
  fitted_values,
  residuals_model,
  main = "Residual vs Fitted",
  xlab = "Fitted Values",
  ylab = "Residuals",
  pch = 19
)

abline(
  h = 0,
  lty = 2
)

# Normal Q-Q

qqnorm(
  residuals_model,
  main = "Normal Q-Q Plot",
  pch = 19
)

qqline(
  residuals_model
)

# Scale Location

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

# Residual vs Leverage

plot(
  leverage,
  standardized_resid,
  main = "Residual vs Leverage",
  xlab = "Leverage",
  ylab = "Standardized Residuals",
  pch = 19
)

abline(
  h = 0,
  lty = 2
)

par(
  mfrow = c(1, 1)
)

20. BOX-COX

# ============================================================
# 20. BOX-COX
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("15. TRANSFORMASI BOX-COX\n")
## 15. TRANSFORMASI BOX-COX
cat("============================================================\n")
## ============================================================
boxcox_model <- lm(
  Total_Amount ~
    Unit_Price +
    Quantity,
  data = data
)

bc <- boxcox(
  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"
)
## 
## Lambda optimal = 0.4242

21. STEPWISE FORWARD

# ============================================================
# 21. STEPWISE FORWARD
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("16. STEPWISE FORWARD\n")
## 16. STEPWISE FORWARD
cat("============================================================\n")
## ============================================================
model_null <- lm(
  log_Total_Amount ~ 1,
  data = data
)

model_scope <- list(
  lower =
    formula(
      model_null
    ),
  upper =
    formula(
      model_full
    )
)

model_forward <- stepAIC(
  model_null,
  scope = model_scope,
  direction = "forward",
  trace = FALSE
)

cat("\nFormula Model Forward:\n")
## 
## Formula Model Forward:
print(
  formula(
    model_forward
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity
cat("\nRingkasan Model Forward:\n")
## 
## Ringkasan Model Forward:
print(
  summary(
    model_forward
  )
)
## 
## Call:
## lm(formula = log_Total_Amount ~ log_Unit_Price + log_Quantity, 
##     data = data)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -1.404e-14 -3.800e-16 -3.700e-17  8.400e-17  7.713e-14 
## 
## Coefficients:
##                 Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)    8.397e-15  1.092e-15 7.693e+00 8.18e-14 ***
## log_Unit_Price 1.000e+00  1.946e-16 5.139e+15  < 2e-16 ***
## log_Quantity   1.000e+00  2.335e-16 4.282e+15  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.662e-15 on 481 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 2.285e+31 on 2 and 481 DF,  p-value: < 2.2e-16

22. STEPWISE BACKWARD

# ============================================================
# 22. STEPWISE BACKWARD
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("17. STEPWISE BACKWARD\n")
## 17. STEPWISE BACKWARD
cat("============================================================\n")
## ============================================================
model_backward <- stepAIC(
  model_full,
  direction = "backward",
  trace = FALSE
)

cat("\nFormula Model Backward:\n")
## 
## Formula Model Backward:
print(
  formula(
    model_backward
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity
cat("\nRingkasan Model Backward:\n")
## 
## Ringkasan Model Backward:
print(
  summary(
    model_backward
  )
)
## 
## Call:
## lm(formula = log_Total_Amount ~ log_Unit_Price + log_Quantity, 
##     data = data)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -1.404e-14 -3.800e-16 -3.700e-17  8.400e-17  7.713e-14 
## 
## Coefficients:
##                 Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)    8.397e-15  1.092e-15 7.693e+00 8.18e-14 ***
## log_Unit_Price 1.000e+00  1.946e-16 5.139e+15  < 2e-16 ***
## log_Quantity   1.000e+00  2.335e-16 4.282e+15  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.662e-15 on 481 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 2.285e+31 on 2 and 481 DF,  p-value: < 2.2e-16

23. STEPWISE BOTH

# ============================================================
# 23. STEPWISE BOTH / BIDIRECTIONAL
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("18. STEPWISE BOTH / BIDIRECTIONAL\n")
## 18. STEPWISE BOTH / BIDIRECTIONAL
cat("============================================================\n")
## ============================================================
model_both <- stepAIC(
  model_full,
  direction = "both",
  trace = FALSE
)

cat("\nFormula Model Both:\n")
## 
## Formula Model Both:
print(
  formula(
    model_both
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity
cat("\nRingkasan Model Both:\n")
## 
## Ringkasan Model Both:
print(
  summary(
    model_both
  )
)
## 
## Call:
## lm(formula = log_Total_Amount ~ log_Unit_Price + log_Quantity, 
##     data = data)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -1.404e-14 -3.800e-16 -3.700e-17  8.400e-17  7.713e-14 
## 
## Coefficients:
##                 Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)    8.397e-15  1.092e-15 7.693e+00 8.18e-14 ***
## log_Unit_Price 1.000e+00  1.946e-16 5.139e+15  < 2e-16 ***
## log_Quantity   1.000e+00  2.335e-16 4.282e+15  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.662e-15 on 481 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 2.285e+31 on 2 and 481 DF,  p-value: < 2.2e-16

24. FUNGSI RMSE

# ============================================================
# 24. FUNGSI RMSE
# ============================================================

hitung_rmse <- function(
  model
) {

  prediksi <- predict(
    model
  )

  aktual <- model.response(
    model.frame(model)
  )

  rmse <- sqrt(
    mean(
      (
        aktual -
          prediksi
      )^2
    )
  )

  return(
    rmse
  )
}

25. PERBANDINGAN MODEL

# ============================================================
# 25. PERBANDINGAN MODEL
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("19. PERBANDINGAN MODEL\n")
## 19. PERBANDINGAN MODEL
cat("============================================================\n")
## ============================================================
evaluasi_model <- function(
  model,
  nama
) {

  data.frame(

    Model = nama,

    Predictor =
      length(
        coef(model)
      ) - 1,

    R_squared =
      summary(model)$r.squared,

    Adjusted_R_squared =
      summary(model)$adj.r.squared,

    RMSE =
      hitung_rmse(
        model
      ),

    AIC =
      AIC(model),

    BIC =
      BIC(model)
  )
}

hasil_full <- evaluasi_model(
  model_full,
  "Full Model"
)

hasil_forward <- evaluasi_model(
  model_forward,
  "Forward"
)

hasil_backward <- evaluasi_model(
  model_backward,
  "Backward"
)

hasil_both <- evaluasi_model(
  model_both,
  "Both"
)

perbandingan <- rbind(
  hasil_full,
  hasil_forward,
  hasil_backward,
  hasil_both
)

perbandingan[
  ,
  3:ncol(perbandingan)
] <- round(
  perbandingan[
    ,
    3:ncol(perbandingan)
  ],
  4
)

cat("\nTabel Perbandingan Model:\n")
## 
## Tabel Perbandingan Model:
print(
  perbandingan,
  row.names = FALSE
)
##       Model Predictor R_squared Adjusted_R_squared RMSE       AIC       BIC
##  Full Model        18         1                  1    0 -30781.51 -30697.87
##     Forward         2         1                  1    0 -30798.65 -30781.93
##    Backward         2         1                  1    0 -30798.65 -30781.93
##        Both         2         1                  1    0 -30798.65 -30781.93

26. MODEL DENGAN AIC TERKECIL

# ============================================================
# 26. MENENTUKAN MODEL BERDASARKAN AIC TERKECIL
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("20. MODEL DENGAN AIC TERKECIL\n")
## 20. MODEL DENGAN AIC TERKECIL
cat("============================================================\n")
## ============================================================
index_model <- which.min(
  perbandingan$AIC
)

nama_model <- perbandingan$Model[
  index_model
]

cat(
  "\nModel dengan AIC terkecil:",
  nama_model,
  "\n"
)
## 
## Model dengan AIC terkecil: Forward
cat(
  "AIC =",
  perbandingan$AIC[
    index_model
  ],
  "\n"
)
## AIC = -30798.65
if (
  nama_model == "Full Model"
) {

  final_model <- model_full

} else if (
  nama_model == "Forward"
) {

  final_model <- model_forward

} else if (
  nama_model == "Backward"
) {

  final_model <- model_backward

} else {

  final_model <- model_both

}

cat("\nFormula Model Akhir:\n")
## 
## Formula Model Akhir:
print(
  formula(
    final_model
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity

27. EVALUASI MODEL AKHIR

# ============================================================
# 27. EVALUASI MODEL AKHIR
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("21. EVALUASI MODEL AKHIR\n")
## 21. EVALUASI MODEL AKHIR
cat("============================================================\n")
## ============================================================
final_summary <- summary(
  final_model
)

final_r2 <-
  final_summary$r.squared

final_adj_r2 <-
  final_summary$adj.r.squared

final_sigma <-
  final_summary$sigma

final_rmse <-
  hitung_rmse(
    final_model
  )

final_aic <-
  AIC(
    final_model
  )

final_bic <-
  BIC(
    final_model
  )

cat(
  "\nR-squared =",
  round(
    final_r2,
    4
  ),
  "\n"
)
## 
## R-squared = 1
cat(
  "Adjusted R-squared =",
  round(
    final_adj_r2,
    4
  ),
  "\n"
)
## Adjusted R-squared = 1
cat(
  "Residual Standard Error =",
  round(
    final_sigma,
    4
  ),
  "\n"
)
## Residual Standard Error = 0
cat(
  "RMSE =",
  round(
    final_rmse,
    4
  ),
  "\n"
)
## RMSE = 0
cat(
  "AIC =",
  round(
    final_aic,
    4
  ),
  "\n"
)
## AIC = -30798.65
cat(
  "BIC =",
  round(
    final_bic,
    4
  ),
  "\n"
)
## BIC = -30781.93

28. UJI ASUMSI MODEL AKHIR

# ============================================================
# 28. UJI ASUMSI MODEL AKHIR
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("22. UJI ASUMSI MODEL AKHIR\n")
## 22. UJI ASUMSI MODEL AKHIR
cat("============================================================\n")
## ============================================================
# ============================================================
# RESIDUAL
# ============================================================

final_residual <- residuals(
  final_model
)

# ============================================================
# NORMALITAS
# ============================================================

shapiro_sample <- if (
  length(final_residual) > 5000
) {

  sample(
    final_residual,
    5000
  )

} else {

  final_residual

}

final_shapiro <- shapiro.test(
  shapiro_sample
)

cat(
  "\nShapiro-Wilk p-value =",
  round(
    final_shapiro$p.value,
    4
  ),
  "\n"
)
## 
## Shapiro-Wilk p-value = 0
# ============================================================
# HETEROSKEDASTISITAS
# ============================================================

final_bp <- bptest(
  final_model
)

cat(
  "Breusch-Pagan p-value =",
  round(
    final_bp$p.value,
    4
  ),
  "\n"
)
## Breusch-Pagan p-value = 0.7074
# ============================================================
# AUTOKORELASI
# ============================================================

final_dw <- dwtest(
  final_model
)

cat(
  "Durbin-Watson p-value =",
  round(
    final_dw$p.value,
    4
  ),
  "\n"
)
## Durbin-Watson p-value = 0
# ============================================================
# MULTIKOLINEARITAS
# ============================================================

cat("\nVIF Model Akhir:\n")
## 
## VIF Model Akhir:
final_vif <- vif(
  final_model
)

print(
  round(
    final_vif,
    4
  )
)
## log_Unit_Price   log_Quantity 
##         1.0005         1.0005

29. PLOT MODEL AKHIR

# ============================================================
# 29. PLOT MODEL AKHIR
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("23. PLOT DIAGNOSTIK MODEL AKHIR\n")
## 23. PLOT DIAGNOSTIK MODEL AKHIR
cat("============================================================\n")
## ============================================================
par(
  mfrow = c(2, 2)
)

plot(
  final_model
)

par(
  mfrow = c(1, 1)
)

30. RINGKASAN AKHIR

# ============================================================
# 30. RINGKASAN AKHIR
# ============================================================

cat("\n")
cat("============================================================\n")
## ============================================================
cat("24. RINGKASAN HASIL ANALISIS\n")
## 24. RINGKASAN HASIL ANALISIS
cat("============================================================\n")
## ============================================================
cat("\nMODEL FULL:\n")
## 
## MODEL FULL:
print(
  formula(
    model_full
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity + Country + 
##     Category
cat("\nMODEL FORWARD:\n")
## 
## MODEL FORWARD:
print(
  formula(
    model_forward
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity
cat("\nMODEL BACKWARD:\n")
## 
## MODEL BACKWARD:
print(
  formula(
    model_backward
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity
cat("\nMODEL BOTH:\n")
## 
## MODEL BOTH:
print(
  formula(
    model_both
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity
cat("\nMODEL AKHIR:\n")
## 
## MODEL AKHIR:
print(
  formula(
    final_model
  )
)
## log_Total_Amount ~ log_Unit_Price + log_Quantity
cat("\nPERFORMA MODEL AKHIR:\n")
## 
## PERFORMA MODEL AKHIR:
cat(
  "R-squared =",
  round(
    final_r2,
    4
  ),
  "\n"
)
## R-squared = 1
cat(
  "Adjusted R-squared =",
  round(
    final_adj_r2,
    4
  ),
  "\n"
)
## Adjusted R-squared = 1
cat(
  "RMSE =",
  round(
    final_rmse,
    4
  ),
  "\n"
)
## RMSE = 0
cat(
  "AIC =",
  round(
    final_aic,
    4
  ),
  "\n"
)
## AIC = -30798.65
cat(
  "BIC =",
  round(
    final_bic,
    4
  ),
  "\n"
)
## BIC = -30781.93
cat("\n")
cat("============================================================\n")
## ============================================================
cat("ANALISIS SELESAI\n")
## ANALISIS SELESAI
cat("============================================================\n")
## ============================================================

```