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")
## ============================================================
```