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.
Penelitian ini menggunakan Online Shoppers Purchasing Intention Dataset yang diperoleh dari UCI Machine Learning Repository.
12.330 Observasi
17 Variabel Prediktor
1 Variabel Respon
Menghapus
125 Observasi
(Missing Value)
Seleksi Variabel
berdasarkan
AIC Minimum
12.205 Observasi
7 Variabel Prediktor
1 Variabel Respon
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.
# 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
| 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.
Data pelatihan (Training set) sebesar 80% yaitu 9.765 observasi dan data pengujian (Testing set) sebesar 20% yaitu 2.440 observasi.
Tabel 3. 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.
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
Tabel 4. Hasil Uji Parsial Model Awal
| 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.
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
Tabel 5. Hasil Uji Parsial Model Stepwise
| 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.
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
Tabel 6. Hasil Uji Parsial Model Akhir
| 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}\]
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)
| 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.
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)
| 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.
# 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
| 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.
#> McFadden Nagelkerke CoxSnell
#> 0.3133860 0.4097692 0.2366920
Tabel 10. 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.
Tabel 11. Odds Ratio, Interval Kepercayaan 95%, dan P-value
| 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.
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
#> 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.
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
#> 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.
# 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)
| 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)
| 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
| 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.
# 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.
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:
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.
Laudon, K.C.; Traver, C.G. E-Commerce: Business, Technology, Society, 18th ed.; Pearson: New York, USA, 2023.
Han, J.; Kamber, M.; Pei, J. Data Mining: Concepts and Techniques, 3rd ed.; Morgan Kaufmann: Burlington, MA, USA, 2011
Chaffey, D.; Ellis-Chadwick, F. Digital Marketing: Strategy, Implementation and Practice, 7th ed.; Pearson Education: Harlow, UK, 2019.
Hosmer, D.W.; Lemeshow, S.; Sturdivant, R.X. Applied Logistic Regression, 3rd ed.; Wiley: Hoboken, NJ, USA, 2013.
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.
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.