1 Pendahuluan

Aktivitas pengguna pada platform e-commerce menghasilkan berbagai informasi mengenai perilaku konsumen, seperti durasi kunjungan, halaman yang diakses, hingga karakteristik pengunjung. Informasi tersebut dapat dimanfaatkan untuk memahami faktor-faktor yang memengaruhi keputusan pembelian dan membantu perusahaan menyusun strategi pemasaran yang lebih efektif.

Pada Online Shoppers Purchasing Intention Dataset, sebagian besar pengunjung tidak melakukan pembelian setelah mengakses situs e-commerce, yaitu sebesar 84,37%, sedangkan hanya 15,63% yang melakukan transaksi. Kondisi ini menunjukkan pentingnya membangun model yang mampu mengidentifikasi karakteristik pengunjung yang berpotensi melakukan pembelian. Oleh karena itu, penelitian ini menerapkan regresi logistik biner dengan seleksi variabel menggunakan Stepwise AIC untuk mengidentifikasi faktor-faktor yang berpengaruh terhadap keputusan pembelian konsumen. Kinerja model kemudian dievaluasi menggunakan AUC, Brier Score, Confusion Matrix, dan Hosmer-Lemeshow Test.

1.1 Data dan Variabel

Penelitian ini menggunakan Online Shoppers Purchasing Intention Dataset yang diperoleh dari UCI Machine Learning Repository.

Dataset Awal

12.330 Observasi
17 Variabel Prediktor
1 Variabel Respon

Pembersihan Data

Menghapus
125 Observasi
(Missing Value)

Stepwise AIC

Seleksi Variabel
berdasarkan
AIC Minimum

Dataset Akhir

12.205 Observasi
7 Variabel Prediktor
1 Variabel Respon

Tabel 1. Variabel Penelitian

Tabel 1. Variabel Penelitian
Variabel Keterangan
Y Revenue Keputusan pembelian konsumen. Bernilai 1 (Beli) dan 0 (Tidak Beli)
X1 Product Related Duration Total waktu (dalam detik) yang dihabiskan pengunjung pada halaman produk.
X2 Exit Rates Persentase rata-rata pengunjung yang meninggalkan situs dari halaman tertentu.
X3 Page Values Nilai halaman web berdasarkan kontribusinya terhadap terjadinya transaksi.
X4 Month Bulan kunjungan konsumen ke situs e-commerce.
X5 Operating Systems Kode sistem operasi yang digunakan pengunjung ketika mengakses situs e-commerce.
X6 Visitor Type Tipe pengunjung situs yang terdiri atas Returning Visitor, New Visitor, dan Other.
X7 Weekend Indikator waktu kunjungan yang menunjukkan apakah pengunjung mengakses situs pada akhir pekan. Bernilai 1 jika kunjungan dilakukan pada akhir pekan (Sabtu atau Minggu) dan 0 jika dilakukan pada hari kerja.

Variabel respon (Revenue) terdiri atas dua kategori, yaitu Beli dan Tidak Beli. Untuk keperluan pemodelan regresi logistik biner, kategori Beli diberi kode 1, sedangkan kategori Tidak Beli diberi kode 0.


2 Hasil

2.1 Persiapan Data dan Library

# Memuat library yang diperlukan
library(tidyverse)
library(caret)
library(pROC)
library(ResourceSelection)
library(DescTools)
library(car)
library(broom)
library(pscl)
library(knitr)
library(kableExtra)
library(ggplot2)
library(gridExtra)
# Memuat dataset dari UCI Machine Learning Repository
# Dataset: Online Shoppers Purchasing Intention
# URL: https://archive.ics.uci.edu/dataset/468/online+shoppers+purchasing+intention+dataset

data_raw <- read.csv("C:/Users/Asus/Downloads/online_shoppers_intention.csv", stringsAsFactors = TRUE)
shopper <- data_raw %>%
  mutate(
    Month = factor(Month),
    VisitorType = factor(VisitorType),
    Revenue = factor(Revenue, levels = c(FALSE, TRUE), labels = c("Tidak_Beli", "Beli")),
    buy = ifelse(Revenue == "Beli", 1, 0)
  )

Tabel 2. Distribusi Variabel Respon

Tabel 4. Distribusi Variabel Respon
Revenue Jumlah Observasi Proporsi
Tidak Beli 10.297 84,37%
Beli 1.908 15,63%

Data bersifat tidak seimbang, karena jumlah pengunjung yang tidak melakukan pembelian jauh lebih besar dibandingkan pengunjung yang melakukan pembelian.

2.2 Model Regresi Logistik Biner

Data pelatihan (Training set) sebesar 80% yaitu 9.765 observasi dan data pengujian (Testing set) sebesar 20% yaitu 2.440 observasi.

# Pembagian data training dan testing (80:20)
set.seed(123)
train_index <- createDataPartition(shopper$Revenue, p = 0.8, list = FALSE)
data_train <- shopper[train_index, ]
data_test <- shopper[-train_index, ]

2.3 Statistik Deskriptif

Tabel 3. Statistik Deskriptif Variabel Kontinu

Tabel 5. Statistik Deskriptif Variabel Kontinu
Variabel Mean SD Minimum Maksimum
Product Related Duration 1194,746 1913,669 0 63973,522
Exit Rates 0,043 0,049 0 0,200
Page Values 5,889 18,568 0 361,764

Berdasarkan Tabel 3, Product Related Duration dan Page Values menunjukkan variasi yang besar antar pengunjung, yang ditunjukkan oleh nilai simpangan baku yang relatif tinggi serta rentang data yang lebar antara nilai minimum dan maksimum. Sementara itu, rata-rata Exit Rates sebesar 4,3% menunjukkan bahwa proporsi pengunjung yang meninggalkan situs dari suatu halaman relatif kecil.

2.4 Pembangunan Model

2.4.1 Model Awal

Model regresi logistik biner awal dibentuk menggunakan seluruh variabel prediktor yang tersedia dalam dataset.

# Model awal dengan semua variabel prediktor
model_awal <- glm(Revenue ~ Administrative + Administrative_Duration +
                    Informational + Informational_Duration +
                    ProductRelated + ProductRelated_Duration +
                    BounceRates + ExitRates + PageValues +
                    SpecialDay + Month + OperatingSystems +
                    Browser + Region + TrafficType +
                    VisitorType + Weekend,
                  data   = data_train,
                  family = binomial(link = "logit"))

summary(model_awal)
#> 
#> Call:
#> glm(formula = Revenue ~ Administrative + Administrative_Duration + 
#>     Informational + Informational_Duration + ProductRelated + 
#>     ProductRelated_Duration + BounceRates + ExitRates + PageValues + 
#>     SpecialDay + Month + OperatingSystems + Browser + Region + 
#>     TrafficType + VisitorType + Weekend, family = binomial(link = "logit"), 
#>     data = data_train)
#> 
#> Coefficients:
#>                                Estimate Std. Error z value Pr(>|z|)    
#> (Intercept)                  -1.393e+00  2.215e-01  -6.290 3.18e-10 ***
#> Administrative                1.377e-02  1.225e-02   1.124 0.261034    
#> Administrative_Duration      -1.474e-04  2.168e-04  -0.680 0.496533    
#> Informational                 2.598e-02  2.990e-02   0.869 0.384783    
#> Informational_Duration        9.383e-05  2.472e-04   0.380 0.704212    
#> ProductRelated                7.141e-04  1.306e-03   0.547 0.584575    
#> ProductRelated_Duration       8.260e-05  3.117e-05   2.650 0.008051 ** 
#> BounceRates                  -3.555e+00  3.622e+00  -0.982 0.326289    
#> ExitRates                    -1.584e+01  2.661e+00  -5.951 2.66e-09 ***
#> PageValues                    7.750e-02  2.574e-03  30.103  < 2e-16 ***
#> SpecialDay                    1.293e-02  2.554e-01   0.051 0.959628    
#> MonthDec                     -5.895e-01  1.987e-01  -2.967 0.003010 ** 
#> MonthFeb                     -1.628e+00  6.462e-01  -2.519 0.011765 *  
#> MonthJul                     -2.544e-02  2.421e-01  -0.105 0.916305    
#> MonthJune                    -2.822e-01  2.989e-01  -0.944 0.345093    
#> MonthMar                     -6.233e-01  1.986e-01  -3.138 0.001699 ** 
#> MonthMay                     -5.977e-01  1.905e-01  -3.137 0.001704 ** 
#> MonthNov                      4.987e-01  1.782e-01   2.798 0.005143 ** 
#> MonthOct                     -1.398e-01  2.234e-01  -0.626 0.531409    
#> MonthSep                     -1.212e-02  2.325e-01  -0.052 0.958423    
#> OperatingSystems             -1.313e-01  4.356e-02  -3.014 0.002581 ** 
#> Browser                       2.630e-02  2.139e-02   1.230 0.218756    
#> Region                       -1.855e-02  1.452e-02  -1.278 0.201356    
#> TrafficType                   7.027e-03  9.175e-03   0.766 0.443719    
#> VisitorTypeOther             -4.320e-01  6.095e-01  -0.709 0.478398    
#> VisitorTypeReturning_Visitor -3.360e-01  9.409e-02  -3.571 0.000356 ***
#> WeekendTRUE                   1.176e-01  7.848e-02   1.499 0.133943    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for binomial family taken to be 1)
#> 
#>     Null deviance: 8502.2  on 9864  degrees of freedom
#> Residual deviance: 5829.1  on 9838  degrees of freedom
#> AIC: 5883.1
#> 
#> Number of Fisher Scoring iterations: 7
# AIC model awal: 5883.1

Tabel 4. Hasil Uji Parsial Model Awal

Tabel 6. Hasil Uji Parsial Model Awal (AIC = 5883,1)
Variabel P-value Keterangan
Administrative 0,261 Tidak signifikan
Administrative Duration 0,497 Tidak signifikan
Informational 0,385 Tidak signifikan
Informational Duration 0,704 Tidak signifikan
Product Related 0,585 Tidak signifikan
Product Related Duration 0,008 Signifikan
Bounce Rates 0,326 Tidak signifikan
Exit Rates 2,66×10⁻⁹ Signifikan
Page Values 2×10⁻¹⁶ Signifikan
Special Day 0,959 Tidak signifikan
Month 2,2×10⁻¹⁶ Signifikan
Operating Systems 0,003 Signifikan
Browser 0,219 Tidak signifikan
Region 0,201 Tidak signifikan
Traffic Type 0,444 Tidak signifikan
Visitor Type 4,76×10⁻³ Signifikan
Weekend 0,134 Tidak signifikan

Berdasarkan Tabel 4, tidak semua variabel memberikan kontribusi yang signifikan terhadap peluang terjadinya pembelian. Model awal menghasilkan nilai AIC sebesar 5883,1.

2.4.2 Model Stepwise

Seleksi variabel dilakukan menggunakan metode Stepwise AIC dengan pendekatan forward dan backward secara simultan. Metode ini bertujuan memperoleh model terbaik berdasarkan nilai AIC terkecil.

# Seleksi variabel menggunakan Stepwise AIC
model_stepwise <- step(model_awal, direction = "both", trace = 0)
summary(model_stepwise)
#> 
#> Call:
#> glm(formula = Revenue ~ Informational + ProductRelated_Duration + 
#>     ExitRates + PageValues + Month + OperatingSystems + VisitorType + 
#>     Weekend, family = binomial(link = "logit"), data = data_train)
#> 
#> Coefficients:
#>                                Estimate Std. Error z value Pr(>|z|)    
#> (Intercept)                  -1.320e+00  2.059e-01  -6.414 1.41e-10 ***
#> Informational                 3.483e-02  2.402e-02   1.450  0.14702    
#> ProductRelated_Duration       1.002e-04  1.610e-05   6.223 4.89e-10 ***
#> ExitRates                    -1.807e+01  1.841e+00  -9.817  < 2e-16 ***
#> PageValues                    7.749e-02  2.554e-03  30.337  < 2e-16 ***
#> MonthDec                     -6.020e-01  1.980e-01  -3.041  0.00236 ** 
#> MonthFeb                     -1.648e+00  6.429e-01  -2.564  0.01035 *  
#> MonthJul                     -3.039e-02  2.416e-01  -0.126  0.89991    
#> MonthJune                    -2.843e-01  2.987e-01  -0.952  0.34124    
#> MonthMar                     -6.334e-01  1.975e-01  -3.206  0.00134 ** 
#> MonthMay                     -5.993e-01  1.849e-01  -3.241  0.00119 ** 
#> MonthNov                      4.979e-01  1.774e-01   2.806  0.00502 ** 
#> MonthOct                     -1.398e-01  2.228e-01  -0.627  0.53036    
#> MonthSep                     -1.929e-02  2.322e-01  -0.083  0.93382    
#> OperatingSystems             -1.249e-01  4.284e-02  -2.916  0.00355 ** 
#> VisitorTypeOther             -2.977e-01  5.943e-01  -0.501  0.61639    
#> VisitorTypeReturning_Visitor -3.279e-01  9.345e-02  -3.509  0.00045 ***
#> WeekendTRUE                   1.145e-01  7.829e-02   1.463  0.14358    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for binomial family taken to be 1)
#> 
#>     Null deviance: 8502.2  on 9864  degrees of freedom
#> Residual deviance: 5835.7  on 9847  degrees of freedom
#> AIC: 5871.7
#> 
#> Number of Fisher Scoring iterations: 7
# AIC model stepwise: 5871.7

Tabel 5. Hasil Uji Parsial Model Stepwise

Tabel 7. Hasil Uji Parsial Model Stepwise (AIC = 5871,678)
Variabel P-value Keterangan
Informational 0,147 Tidak signifikan
Product Related Duration 4,89×10⁻¹⁰ Signifikan
Exit Rates 2×10⁻¹⁶ Signifikan
Page Values 2×10⁻¹⁶ Signifikan
Month < 2,2×10⁻¹⁶ Signifikan
Operating Systems 0,003 Signifikan
Visitor Type 0,003 Signifikan
Weekend 0,144 Tidak signifikan

Berdasarkan Tabel 5, model hasil Stepwise menghasilkan nilai AIC sebesar 5871,7, lebih kecil dibandingkan model awal yang memiliki nilai AIC sebesar 5883,1. Penurunan nilai AIC menunjukkan bahwa model hasil seleksi memiliki keseimbangan yang lebih baik antara kompleksitas model dan kemampuan prediksi.

2.4.3 Model Akhir

Dilakukan penyederhanaan model dengan mempertahankan variabel-variabel yang signifikan secara statistik pada taraf signifikansi 5%. Model akhir terdiri atas tujuh variabelprediktor yaitu: Product Related Duration, Exit Rates, Page Values, Month, Operating Systems, Visitor Type, dan Weekend.

# Model akhir (hanya variabel signifikan)
model_akhir <- glm(Revenue ~ ProductRelated_Duration + ExitRates + PageValues +
                     Month + OperatingSystems + VisitorType + Weekend,
                   data   = data_train,
                   family = binomial(link = "logit"))

summary(model_akhir)
#> 
#> Call:
#> glm(formula = Revenue ~ ProductRelated_Duration + ExitRates + 
#>     PageValues + Month + OperatingSystems + VisitorType + Weekend, 
#>     family = binomial(link = "logit"), data = data_train)
#> 
#> Coefficients:
#>                                Estimate Std. Error z value Pr(>|z|)    
#> (Intercept)                  -1.318e+00  2.061e-01  -6.396 1.60e-10 ***
#> ProductRelated_Duration       1.085e-04  1.508e-05   7.197 6.17e-13 ***
#> ExitRates                    -1.813e+01  1.839e+00  -9.861  < 2e-16 ***
#> PageValues                    7.763e-02  2.555e-03  30.383  < 2e-16 ***
#> MonthDec                     -5.968e-01  1.982e-01  -3.011 0.002601 ** 
#> MonthFeb                     -1.655e+00  6.428e-01  -2.575 0.010033 *  
#> MonthJul                     -2.788e-02  2.419e-01  -0.115 0.908237    
#> MonthJune                    -2.789e-01  2.991e-01  -0.933 0.351002    
#> MonthMar                     -6.261e-01  1.977e-01  -3.167 0.001539 ** 
#> MonthMay                     -5.949e-01  1.851e-01  -3.213 0.001313 ** 
#> MonthNov                      5.015e-01  1.777e-01   2.823 0.004763 ** 
#> MonthOct                     -1.365e-01  2.230e-01  -0.612 0.540329    
#> MonthSep                     -1.671e-02  2.325e-01  -0.072 0.942705    
#> OperatingSystems             -1.253e-01  4.285e-02  -2.924 0.003460 ** 
#> VisitorTypeOther             -3.039e-01  5.965e-01  -0.510 0.610379    
#> VisitorTypeReturning_Visitor -3.226e-01  9.340e-02  -3.454 0.000552 ***
#> WeekendTRUE                   1.175e-01  7.824e-02   1.502 0.133197    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for binomial family taken to be 1)
#> 
#>     Null deviance: 8502.2  on 9864  degrees of freedom
#> Residual deviance: 5837.7  on 9848  degrees of freedom
#> AIC: 5871.7
#> 
#> Number of Fisher Scoring iterations: 7
# AIC model akhir: 5871.71

Tabel 6. Hasil Uji Parsial Model Akhir

Tabel 6. Hasil Uji Parsial Model Akhir (AIC = 5871,71)
Variabel P-value Keterangan
Product Related Duration 4,89×10⁻¹⁰ Signifikan
Exit Rates 2×10⁻¹⁶ Signifikan
Page Values 2×10⁻¹⁶ Signifikan
Month < 2,2×10⁻¹⁶ Signifikan
Operating Systems 0,003 Signifikan
Visitor Type 0,003 Signifikan
Weekend 0,144 Tidak Signifikan

Model akhir memiliki AIC sebesar 5871,71, yang sangat dekat dengan model stepwise sehingga masih mampu mempertahankan kualitas model dengan jumlah variabel yang lebih sedikit.

Model regresi logistik biner yang diperoleh:

\[\ln\frac{\hat{\pi}(x)}{1-\hat{\pi}(x)} = -1{,}288 + 0{,}000108\,X_1 - 18{,}24\,X_2 + 0{,}07754\,X_3 - 0{,}1236\,X_5 + \text{Month} + \text{Visitor Type} + 0{,}1175(\text{Weekend}\]

2.5 Uji Asumsi

2.5.1 Uji Linearitas Logit

Uji linearitas logit dilakukan menggunakan metode Box-Tidwell untuk mengevaluasi apakah variabel prediktor kontinu memiliki hubungan linear dengan logit probabilitas pembelian.

# Uji Box-Tidwell untuk linearitas logit
# Tambahkan konstanta kecil agar tidak ada log(0)
train_bt <- data_train %>%
  mutate(
    ProductRelated_Duration_bt = ProductRelated_Duration + 0.001,
    ExitRates_bt = ExitRates + 0.001,
    PageValues_bt = PageValues + 0.001
  )

# Membentuk variabel interaksi Box-Tidwell
train_bt <- train_bt %>%
  mutate(
    PRD_log = ProductRelated_Duration_bt * log(ProductRelated_Duration_bt),
    Exit_log = ExitRates_bt * log(ExitRates_bt),
    PV_log = PageValues_bt * log(PageValues_bt)
  )

# Model Box-Tidwell
bt_model <- glm(
  buy ~ ProductRelated_Duration_bt +
    ExitRates_bt +
    PageValues_bt +
    PRD_log +
    Exit_log +
    PV_log +
    Month +
    OperatingSystems +
    VisitorType +
    Weekend,
  family = binomial(link = "logit"),
  data = train_bt
)

summary(bt_model)
#> 
#> Call:
#> glm(formula = buy ~ ProductRelated_Duration_bt + ExitRates_bt + 
#>     PageValues_bt + PRD_log + Exit_log + PV_log + Month + OperatingSystems + 
#>     VisitorType + Weekend, family = binomial(link = "logit"), 
#>     data = train_bt)
#> 
#> Coefficients:
#>                                Estimate Std. Error z value Pr(>|z|)    
#> (Intercept)                  -1.929e+00  2.430e-01  -7.940 2.01e-15 ***
#> ProductRelated_Duration_bt    7.508e-04  2.140e-04   3.509 0.000450 ***
#> ExitRates_bt                 -2.718e+01  8.225e+00  -3.305 0.000951 ***
#> PageValues_bt                 2.866e-01  9.190e-03  31.185  < 2e-16 ***
#> PRD_log                      -6.805e-05  2.253e-05  -3.021 0.002521 ** 
#> Exit_log                     -6.518e+00  3.574e+00  -1.824 0.068211 .  
#> PV_log                       -5.068e-02  1.932e-03 -26.226  < 2e-16 ***
#> MonthDec                     -6.032e-01  2.097e-01  -2.876 0.004025 ** 
#> MonthFeb                     -1.593e+00  6.789e-01  -2.346 0.018982 *  
#> MonthJul                     -4.574e-02  2.582e-01  -0.177 0.859366    
#> MonthJune                    -2.967e-01  3.204e-01  -0.926 0.354471    
#> MonthMar                     -5.975e-01  2.102e-01  -2.843 0.004472 ** 
#> MonthMay                     -7.007e-01  1.968e-01  -3.561 0.000369 ***
#> MonthNov                      5.560e-01  1.898e-01   2.930 0.003389 ** 
#> MonthOct                     -1.921e-01  2.377e-01  -0.808 0.419042    
#> MonthSep                     -1.291e-02  2.468e-01  -0.052 0.958286    
#> OperatingSystems             -1.184e-01  4.521e-02  -2.619 0.008823 ** 
#> VisitorTypeOther              2.162e-01  5.266e-01   0.410 0.681444    
#> VisitorTypeReturning_Visitor -6.175e-01  1.047e-01  -5.895 3.74e-09 ***
#> WeekendTRUE                   1.191e-01  8.294e-02   1.437 0.150852    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for binomial family taken to be 1)
#> 
#>     Null deviance: 8502.2  on 9864  degrees of freedom
#> Residual deviance: 5265.0  on 9845  degrees of freedom
#> AIC: 5305
#> 
#> Number of Fisher Scoring iterations: 8

Tabel 7. Hasil Uji Linearitas Logit (Box-Tidwell)

Tabel 9. Hasil Uji Linearitas Logit (Box-Tidwell)
Variabel Estimasi Z-value P-value Kesimpulan
Product Related Duration_log -6,7×10⁻⁵ -3,020 0,002529 Tidak linear
Exit Rates_log -6,452 -1,805 0,071028 Linear
Page Value_log -0,05068 -26,273 <2×10⁻¹⁶ Tidak linear

Berdasarkan Tabel 7, hasil uji Box-Tidwell menunjukkan bahwa variabel Product Related Duration dan Page Values tidak memenuhi asumsi linearitas logit (hubungan bersifat nonlinier), sedangkan Exit Rates memenuhi asumsi linearitas logit. Meskipun terdapat pelanggaran pada dua variabel, model tetap memiliki performa prediksi yang baik (AUC = 0,8972; Brier Score = 0,0799) sehingga masih layak digunakan.

2.5.2 Uji Multikolinearitas

Pengujian multikolinearitas dilakukan menggunakan nilai Generalized Variance Inflation Factor (GVIF).

# Uji multikolinearitas menggunakan GVIF
vif_result <- vif(model_akhir)

vif_interpretasi <- data.frame(
  Variabel = rownames(vif_result),
  GVIF_Adjusted = round(vif_result[,3], 3),
  Status = ifelse(vif_result[,3] < 5, "Aman (Tidak Ada Multikolinearitas)", 
                  ifelse(vif_result[,3] < 10, "Sedang", "Tinggi"))
)

print(vif_interpretasi)
#>                                        Variabel GVIF_Adjusted
#> ProductRelated_Duration ProductRelated_Duration         1.058
#> ExitRates                             ExitRates         1.051
#> PageValues                           PageValues         1.028
#> Month                                     Month         1.005
#> OperatingSystems               OperatingSystems         1.029
#> VisitorType                         VisitorType         1.043
#> Weekend                                 Weekend         1.005
#>                                                     Status
#> ProductRelated_Duration Aman (Tidak Ada Multikolinearitas)
#> ExitRates               Aman (Tidak Ada Multikolinearitas)
#> PageValues              Aman (Tidak Ada Multikolinearitas)
#> Month                   Aman (Tidak Ada Multikolinearitas)
#> OperatingSystems        Aman (Tidak Ada Multikolinearitas)
#> VisitorType             Aman (Tidak Ada Multikolinearitas)
#> Weekend                 Aman (Tidak Ada Multikolinearitas)

Tabel 8. Hasil Uji Multikolinearitas (GVIF)

Tabel 8. Hasil Uji Multikolinearitas
Variabel GVIF Adjusted Status
Product Related Duration 1,058 Tidak ada multikolinearitas
Exit Rates 1,051 Tidak ada multikolinearitas
Page Values 1,027 Tidak ada multikolinearitas
Month 1,005 Tidak ada multikolinearitas
Operating Systems 1,029 Tidak ada multikolinearitas
Visitor Type 1,043 Tidak ada multikolinearitas
Weekend 1,005 Tidak ada multikolinearitas

Berdasarkan Tabel 8, seluruh variabel memiliki nilai GVIF Adjusted kurang dari 5 dengan rentang antara 1,005 hingga 1,058. Hasil ini mengindikasikan bahwa tidak terdapat multikolinearitas antar variabel prediktor dalam model. Dengan demikian, ketujuh variabel dapat digunakan secara bersama-sama dalam pemodelan regresi logistik biner.

2.5.3 Uji Hosmer-Lemeshow

# Uji Hosmer-Lemeshow
prob_train  <- predict(model_akhir, type = "response")
hl_test     <- hoslem.test(as.numeric(data_train$Revenue) - 1, prob_train, g = 8)
hl_test
#> 
#>  Hosmer and Lemeshow goodness of fit (GOF) test
#> 
#> data:  as.numeric(data_train$Revenue) - 1, prob_train
#> X-squared = 111.29, df = 6, p-value < 2.2e-16

Tabel 9. Hasil Uji Hosmer-Lemeshow

Tabel 11. Hasil Uji Hosmer-Lemeshow
Metrik Nilai
Chi-squared 111,29
P-value 0

Berdasarkan Tabel 9, Uji Hosmer-Lemeshow menunjukkan p-value < 0,05 yang mengindikasikan kalibrasi tidak sempurna. Hasil ini dapat terjadi pada dataset berukuran besar karena uji tersebut sangat sensitif terhadap perbedaan kecil antara nilai observasi dan prediksi.

2.5.4 Pseudo R-Squared

# Pseudo R-Squared
PseudoR2(model_akhir, which = c("McFadden", "Nagelkerke", "CoxSnell"))
#>   McFadden Nagelkerke   CoxSnell 
#>  0.3133860  0.4097692  0.2366920

Tabel 10. Hasil Pseudo R-Squared

Tabel 12. Hasil Pseudo R-Squared
Metrik Nilai
McFadden 0,3134
r2ML (Cox & Snell) 0,2367
r2CU (Nagelkerke) 0,4098

Berdasarkan Tabel 10, nilai McFadden R² sebesar 0,3134 menunjukkan bahwa model memiliki kemampuan yang cukup baik dalam menjelaskan variasi keputusan pembelian konsumen. Sementara itu, nilai Nagelkerke R² sebesar 0,4098 menunjukkan bahwa sekitar 40,98% variasi keputusan pembelian dapat dijelaskan oleh variabel-variabel dalam model.

2.6 Odds Ratio

Tabel 11. Odds Ratio, Interval Kepercayaan 95%, dan P-value

Tabel 11. Odds Ratio dan Interval Kepercayaan 95%
Variabel Odds Ratio CI 95% P-Value Signifikansi
Product Related Duration 1,00 1,00 – 1,00 0 Signifikan
Exit Rates 0 0 – 0 0 Signifikan
Page Values 1,08 1,08 – 1,09 0 Signifikan
Month December 0,55 0,37 – 0,81 0,002 Signifikan
Month February 0,19 0,05 – 0,67 0,009 Signifikan
Month July 0,97 0,61 – 1,56 0,912 Tidak Signifikan
Month June 0,75 0,42 – 1,35 0,336 Tidak Signifikan
Month March 0,53 0,37 – 0,79 0,002 Signifikan
Month May 0,55 0,38 – 0,79 0,001 Signifikan
Month November 1,66 1,17 – 2,36 0,004 Signifikan
Month October 0,88 0,57 – 1,36 0,555 Tidak Signifikan
Month September 0,98 0,62 – 1,55 0,942 Tidak Signifikan
Operating Systems 0,88 0,81 – 0,96 0,004 Signifikan
Visitor Type Other 0,72 0,23 – 2,33 0,588 Tidak Signifikan
Visitor Type Returning Visitor 0,72 0,60 – 0,87 0,001 Signifikan
Weekend 1,12 0,96 - 1,31 0,133 Tidak Signifikan

Berdasarkan Tabel 11, variabel Product Related Duration, Exit Rates, Page Values, Operating Systems, beberapa kategori Month, dan Visitor Type Returning Visitor berpengaruh signifikan terhadap keputusan pembelian.

  • Variabel Page Values memiliki OR sebesar 1,08 yang menunjukkan bahwa setiap kenaikan satu satuan nilai Page Values meningkatkan peluang pembelian sebesar 8%, dengan asumsi variabel lain tetap.
  • Kategori Month November memiliki OR sebesar 1,66 yang menunjukkan bahwa peluang pembelian pada bulan November sekitar 1,66 kali lebih besar dibandingkan kategori bulan referensi (bulan Agustus).
  • Variabel Exit Rates memiliki OR yang sangat kecil (mendekati nol)dan memiliki pengaruh negatif terhadap peuang pembelian, mengindikasikan bahwa peningkatan Exit Rates secara signifikan menurunkan peluang terjadinya pembelian.
  • Variabel Operating Systems memiliki OR sebesar 0,88 yang berarti Pengguna dengan Operating Systems kategori X memiliki peluang pembelian sekitar 12% lebih rendah dibandingkan kategori referensi (Operating Systems 1)
  • Kategori Visitor Type Returning Visitor memiliki OR sebesar 0,72, yang menunjukkan bahwa peluang pembelian pengunjung yang kembali lebih rendah dibandingkan kategori referensi (new visitor).
  • Variabel Product Related Duration memiliki OR sebesar 1,00, menunjukkan bahwa meskipun peningkatan per satu detik sangat kecil, akumulasi durasi kunjungan yang lebih lama dapat meningkatkan peluang terjadinya pembelian.
  • Variabel Weekend memiliki OR sebesar 1,12, menunjukkan bahwa kunjungan pada akhir pekan cenderung meningkatkan peluang terjadinya pembelian dibandingkan hari kerja, meskipun pengaruhnya tidak signifikan secara statistik.

2.7 Evaluasi Kinerja Model

2.7.1 Brier Score dan Calibration Plot

pred_prob <- predict(model_akhir, newdata = data_test, type = "response")

# BRIER SCORE (METRIK KALIBRASI)
brier_score <- mean((pred_prob - data_test$buy)^2)
cat("BRIER SCORE \n")
#> BRIER SCORE
cat("Brier Score:", round(brier_score, 4), "\n")
#> Brier Score: 0.0799
if(brier_score < 0.25){
  cat("Interpretasi: Brier Score < 0.25 -> Kalibrasi BAIK\n")
} else if(brier_score < 0.5){
  cat("Interpretasi: Brier Score 0.25-0.5 -> Kalibrasi CUKUP\n")
} else {
  cat("Interpretasi: Brier Score > 0.5 -> Kalibrasi BURUK\n")
}
#> Interpretasi: Brier Score < 0.25 -> Kalibrasi BAIK
# CALIBRATION PLOT
cal_data <- data.frame(
  pred_prob = pred_prob,
  actual = data_test$buy
)

# Membagi ke dalam 10 kelompok berdasarkan quantile
cal_data$pred_bin <- cut(pred_prob, 
                         breaks = quantile(pred_prob, probs = seq(0, 1, 0.1), na.rm = TRUE), 
                         include.lowest = TRUE)

cal_plot_data <- cal_data %>%
  group_by(pred_bin) %>%
  summarise(
    mean_pred = mean(pred_prob, na.rm = TRUE),
    obs_rate = mean(actual, na.rm = TRUE),
    n = n(),
    se = sqrt(obs_rate * (1 - obs_rate) / n)
  )

calibration_plot <- ggplot(cal_plot_data, aes(x = mean_pred, y = obs_rate)) +
  geom_point(size = 4, color = "darkblue") +
  geom_errorbar(aes(ymin = obs_rate - 1.96*se, ymax = obs_rate + 1.96*se), width = 0.02, alpha = 0.5) +
  geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "red", linewidth = 1) +
  theme_minimal() +
  labs(title = "Calibration Plot",
       subtitle = paste("Brier Score =", round(brier_score, 4)),
       x = "Predicted Probability",
       y = "Observed Proportion (Actual)") +
  coord_fixed(ratio = 1, xlim = c(0, 1), ylim = c(0, 1))

print(calibration_plot)

Gambar 1. Calibration Plot

Brier Score yang diperoleh adalah 0,0799. Nilai yang mendekati 0 menunjukkan bahwa probabilitas yang diprediksi model cukup dekat dengan kondisi aktual. Hal ini mengindikasikan bahwa model memiliki kalibrasi yang baik dalam memprediksi peluang pembelian, yang juga didukung oleh Calibration Plot di mana titik-titik prediksi cenderung mengikuti garis diagonal.

2.7.2 ROC Curve dan AUC

roc_obj <- roc(response = data_test$Revenue, predictor = pred_prob, 
               levels = c("Tidak_Beli", "Beli"))
auc_value <- auc(roc_obj)

cat(" ROC & AUC \n")
#>  ROC & AUC
cat("AUC (Area Under Curve):", round(auc_value, 4), "\n")
#> AUC (Area Under Curve): 0.8972
if(auc_value > 0.9){
  cat("Interpretasi: AUC > 0.9 -> DAYA BEDA SANGAT BAIK\n")
} else if(auc_value > 0.8){
  cat("Interpretasi: AUC 0.8-0.9 -> DAYA BEDA BAIK\n")
} else if(auc_value > 0.7){
  cat("Interpretasi: AUC 0.7-0.8 -> DAYA BEDA CUKUP\n")
} else {
  cat("Interpretasi: AUC < 0.7 -> DAYA BEDA LEMAH\n")
}
#> Interpretasi: AUC 0.8-0.9 -> DAYA BEDA BAIK
# ROC Plot
roc_plot <- ggroc(roc_obj, color = "darkred", linewidth = 1) +
  geom_abline(intercept = 1, slope = 1, linetype = "dashed", color = "gray50") +
  theme_minimal() +
  labs(title = "ROC Curve",
       subtitle = paste("AUC =", round(auc_value, 4)),
       x = "1 - Specificity (False Positive Rate)",
       y = "Sensitivity (True Positive Rate)")

print(roc_plot)

Gambar 2. ROC Curve

Berdasarkan Gambar 2, diperoleh nilai AUC sebesar 0,8972 yang berada pada kategori Baik (rentang 0,81–0,90). Nilai tersebut menunjukkan bahwa model memiliki kemampuan diskriminasi yang tinggi dalam mengklasifikasikan kedua kelompok pengunjung. Model memiliki peluang sekitar 89,72% untuk memberikan skor probabilitas pembelian yang lebih tinggi kepada pengunjung yang benar-benar melakukan pembelian dibandingkan pengunjung yang tidak melakukan pembelian.

2.7.3 Confusion Matrix

# Confusion Matrix pada Threshold = 0.5
threshold_05  <- 0.5
pred_class_05 <- ifelse(pred_prob >= threshold_05, "Beli", "Tidak_Beli")
confusionMatrix(factor(pred_class_05, levels = c("Tidak_Beli","Beli")),
                data_test$Revenue, positive = "Beli")
#> Confusion Matrix and Statistics
#> 
#>             Reference
#> Prediction   Tidak_Beli Beli
#>   Tidak_Beli       2049  239
#>   Beli               35  142
#>                                          
#>                Accuracy : 0.8888         
#>                  95% CI : (0.8758, 0.901)
#>     No Information Rate : 0.8454         
#>     P-Value [Acc > NIR] : 3.068e-10      
#>                                          
#>                   Kappa : 0.4556         
#>                                          
#>  Mcnemar's Test P-Value : < 2.2e-16      
#>                                          
#>             Sensitivity : 0.37270        
#>             Specificity : 0.98321        
#>          Pos Pred Value : 0.80226        
#>          Neg Pred Value : 0.89554        
#>              Prevalence : 0.15456        
#>          Detection Rate : 0.05761        
#>    Detection Prevalence : 0.07181        
#>       Balanced Accuracy : 0.67795        
#>                                          
#>        'Positive' Class : Beli           
#> 
# Threshold Optimal (Youden Index)
youden_idx    <- coords(roc_obj, "best", ret = "threshold", best.method = "youden")
threshold_opt <- youden_idx$threshold
cat("Threshold Optimal:", round(threshold_opt, 4), "\n")
#> Threshold Optimal: 0.1696
# Output: 0.1696

pred_class_opt <- ifelse(pred_prob >= threshold_opt, "Beli", "Tidak_Beli")
confusionMatrix(factor(pred_class_opt, levels = c("Tidak_Beli","Beli")),
                data_test$Revenue, positive = "Beli")
#> Confusion Matrix and Statistics
#> 
#>             Reference
#> Prediction   Tidak_Beli Beli
#>   Tidak_Beli       1795   90
#>   Beli              289  291
#>                                           
#>                Accuracy : 0.8462          
#>                  95% CI : (0.8314, 0.8603)
#>     No Information Rate : 0.8454          
#>     P-Value [Acc > NIR] : 0.4692          
#>                                           
#>                   Kappa : 0.5152          
#>                                           
#>  Mcnemar's Test P-Value : <2e-16          
#>                                           
#>             Sensitivity : 0.7638          
#>             Specificity : 0.8613          
#>          Pos Pred Value : 0.5017          
#>          Neg Pred Value : 0.9523          
#>              Prevalence : 0.1546          
#>          Detection Rate : 0.1181          
#>    Detection Prevalence : 0.2353          
#>       Balanced Accuracy : 0.8126          
#>                                           
#>        'Positive' Class : Beli            
#> 

Tabel 12. Confusion Matrix (Threshold = 0,5)

Tabel 12. Confusion Matrix (Threshold = 0,5)
Prediksi Aktual Tidak Beli Aktual Beli
Tidak Beli 2049 35
Beli 239 142

Berdasarkan Tabel 12, Pada threshold 0,5, model sangat baik mengidentifikasi pengunjung yang tidak melakukan pembelian, (sensitivitas 0,9832), tetapi kurang optimal dalam mendeteksi pembelian (spesifisitas 0,3727), dengan 239 false negative dan 35 false positive.

Tabel 13. Confusion Matrix (Threshold Optimal = 0,1696)

Tabel 13. Confusion Matrix (Threshold Optimal = 0,1696)
Prediksi Aktual Tidak Beli Aktual Beli
Tidak Beli 1795 289
Beli 90 291

Berdasarkan Tabel 13, penggunaan threshold optimal sebesar 0,1696 menghasilkan perubahan pola klasifikasi. Jumlah pengunjung yang berhasil diidentifikasi sebagai pembeli meningkat menjadi 291 observasi, sedangkan false negative menurun menjadi 90 observasi. Threshold optimal menghasilkan keseimbangan yang lebih baik antara sensitivitas (0,8613) dan spesifisitas (0,7638).

Tabel 14. Kinerja Klasifikasi Perbandingan Threshold

Tabel 14. Kinerja Klasifikasi pada Threshold = 0,5 dan Threshold Optimal = 0,1696
Threshold Akurasi Sensitivitas Spesifisitas
0,5 0,8888 0,9832 0,3727
0,1696 (Optimal) 0,8462 0,8613 0,7638

Berdasarkan Tabel 14, penggunaan threshold 0,5 menghasilkan akurasi yang lebih tinggi (88,88%), namun dengan spesifisitas rendah sehingga model kurang baik dalam mengidentifikasi pengunjung yang melakukan pembelian. Sebaliknya, threshold optimal sebesar 0,1696 menghasilkan akurasi 84,62% dengan keseimbangan yang lebih baik antara sensitivitas dan spesifisitas, sehingga lebih disarankan untuk keperluan bisnis dalam mendeteksi calon pembeli potensial.

2.7.4 Distribusi Probabilitas Prediksi

# Distribusi probabilitas prediksi
y_actual <- data_test$buy
dist_df <- data.frame(
  probability = pred_prob,
  actual      = factor(ifelse(y_actual == 1, "Beli", "Tidak Beli"))
)

ggplot(dist_df, aes(x = probability, fill = actual)) +
  geom_density(alpha = 0.5) +
  geom_vline(xintercept = 0.5,    linetype = "dashed", color = "blue",  linewidth = 1) +
  geom_vline(xintercept = 0.1696, linetype = "dashed", color = "orange", linewidth = 1) +
  annotate("text", x = 0.52,  y = 8, label = "Threshold = 0,5",    color = "blue",   angle = 90) +
  annotate("text", x = 0.175, y = 8, label = "Threshold = 0,1696",  color = "orange", angle = 90) +
  labs(title = "Distribusi Probabilitas Prediksi",
       x     = "Probabilitas Prediksi",
       y     = "Densitas",
       fill  = "Kategori Aktual") +
  scale_fill_manual(values = c("#d73027","#4575b4")) +
  theme_minimal(base_size = 13)

Gambar 3. Distribusi Probabilitas Prediksi Berdasarkan Gambar 3, sebagian besar pengunjung yang tidak melakukan pembelian memiliki probabilitas prediksi yang rendah dan terkonsentrasi pada rentang mendekati nol. Sebaliknya, pengunjung yang melakukan pembelian cenderung memiliki probabilitas prediksi yang lebih tinggi dengan sebaran yang lebih luas. Threshold optimal (0,1696) berada pada nilai yang lebih rendah dibandingkan threshold standar (0,5), sehingga mampu memberikan keseimbangan yang lebih baik antara sensitivitas dan spesifisitas dalam proses klasifikasi.


3 Kesimpulan

Penelitian ini menerapkan regresi logistik biner untuk memodelkan keputusan pembelian konsumen pada platform e-commerce menggunakan Online Shoppers Purchasing Intention Dataset. Seleksi variabel dilakukan menggunakan metode Stepwise AIC sehingga diperoleh model akhir yang terdiri atas tujuh variabel prediktor, yaitu Product Related Duration, Exit Rates, Page Values, Month, Operating Systems, Visitor Type, dan Weekend.

Hasil analisis menunjukkan bahwa:

  1. Product Related Duration dan Page Values berpengaruh positif terhadap peluang pembelian.
  2. Exit Rates dan Operating Systems berpengaruh negatif terhadap peluang pembelian.
  3. Beberapa kategori variabel Month serta kategori Returning Visitor pada variabel Visitor Type juga menunjukkan pengaruh yang signifikan.
  4. Weekend berpengaruh positif, dengan peluang pembelian pada weekend lebih tinggi dibandingkan weekday, tetapi tidak signifikan secara statistik.

Evaluasi model menunjukkan performa yang baik:

Metrik Nilai Interpretasi
AUC 0,8972 Baik
Brier Score 0,0799 Kalibrasi baik (mendekati 0)
McFadden R² 0,3134 Kecocokan model baik
Akurasi (opt.) 84,62% Threshold = 0,1696

Meskipun hasil uji linearitas logit menunjukkan adanya hubungan nonlinier pada variabel Product Related Duration dan Page Values, model yang dibangun tetap menunjukkan kemampuan prediksi yang baik dan layak digunakan untuk mendukung pengambilan keputusan pada platform e-commerce.


Referensi

  1. Laudon, K.C.; Traver, C.G. E-Commerce: Business, Technology, Society, 18th ed.; Pearson: New York, USA, 2023.

  2. Han, J.; Kamber, M.; Pei, J. Data Mining: Concepts and Techniques, 3rd ed.; Morgan Kaufmann: Burlington, MA, USA, 2011

  3. Chaffey, D.; Ellis-Chadwick, F. Digital Marketing: Strategy, Implementation and Practice, 7th ed.; Pearson Education: Harlow, UK, 2019.

  4. Hosmer, D.W.; Lemeshow, S.; Sturdivant, R.X. Applied Logistic Regression, 3rd ed.; Wiley: Hoboken, NJ, USA, 2013.

  5. Sakar, C.O.; Polat, S.O.; Katircioglu, M.; Kastro, Y. Real-time prediction of online shoppers’ purchasing intention using multilayer perceptron and LSTM recurrent neural networks. Neural Computing and Applications 2019, 31, 6893–6908.

  6. Muda, M.A.; Iswari, R.A.; Ahsan, M. Prediction of Online Shopper’s Purchasing Intention Using Binary Logistic Regression, Decision Tree, and Random Forest. In Proceedings of the International Conference on Data Science and Its Applications (ICoDSA), Bandung, Indonesia, 2020.