Business Strategy || Customer Amount Spent

Background

Sebuah perusahaan E-commerce mempunyai pelayanan berupa penawaran sesi saran gaya dan pakaian di dalam toko. Pelanggan datang ke toko, mengadakan sesi/pertemuan dengan penata gaya pribadi, kemudian mereka dapat pulang dan memesan baik di aplikasi seluler atau situs web untuk pakaian yang mereka inginkan.

Bussines Objective

Perusahaan sedang mencoba memutuskan apakah akan memfokuskan upaya mereka pada pengalaman aplikasi seluler atau situs web mereka.

Data Wrangling

1. Read Data

library(dplyr)
library(caret)
library(data.table)
library(GGally)
library(car)
library(scales)
library(lmtest)
library(performance)
library(ggplot2)
library(MLmetrics)
customers <- read.csv("Ecommerce Customers.csv")

head(customers)
#>                           Email
#> 1     mstephenson@fernandez.com
#> 2             hduke@hotmail.com
#> 3              pallen@yahoo.com
#> 4       riverarebecca@gmail.com
#> 5 mstephens@davidson-herman.com
#> 6        alvareznancy@lucas.biz
#>                                                      Address           Avatar
#> 1               835 Frank Tunnel\nWrightmouth, MI 82180-9605           Violet
#> 2             4547 Archer Common\nDiazchester, CA 06566-8576        DarkGreen
#> 3 24645 Valerie Unions Suite 582\nCobbborough, DC 99414-7564           Bisque
#> 4           1414 David Throughway\nPort Jason, OH 22070-1220      SaddleBrown
#> 5    14023 Rodriguez Passage\nPort Jacobville, PR 37242-1057 MediumAquaMarine
#> 6    645 Martha Park Apt. 611\nJeffreychester, MN 67218-7250      FloralWhite
#>   Avg..Session.Length Time.on.App Time.on.Website Length.of.Membership
#> 1            34.49727    12.65565        39.57767             4.082621
#> 2            31.92627    11.10946        37.26896             2.664034
#> 3            33.00091    11.33028        37.11060             4.104543
#> 4            34.30556    13.71751        36.72128             3.120179
#> 5            33.33067    12.79519        37.53665             4.446308
#> 6            33.87104    12.02693        34.47688             5.493507
#>   Yearly.Amount.Spent
#> 1            587.9511
#> 2            392.2049
#> 3            487.5475
#> 4            581.8523
#> 5            599.4061
#> 6            637.1024

Deskripsi kolom data:

  • Email: Alamat E-mail pelanggan
  • Address: Alamat rumah pelanggan
  • Avatar: Simbol Customer
  • Avg..Session.Length: Rata-rata lama waktu sesi yang dilakukan customer
  • Time.on.App: Lama waktu yang dihabiskan customer pada aplikasi
  • Time.on.Website: Lama waktu yang dihabiskan customer pada website
  • Length.of.Membership: Durasi pelanggan telah menjadi member
  • Yearly.Amount.Spent: Jumlah pembelian yang dilakukan customer tiap tahun

2. Cek Struktur Data

glimpse(customers)
#> Rows: 500
#> Columns: 8
#> $ Email                <chr> "mstephenson@fernandez.com", "hduke@hotmail.com",~
#> $ Address              <chr> "835 Frank Tunnel\nWrightmouth, MI 82180-9605", "~
#> $ Avatar               <chr> "Violet", "DarkGreen", "Bisque", "SaddleBrown", "~
#> $ Avg..Session.Length  <dbl> 34.49727, 31.92627, 33.00091, 34.30556, 33.33067,~
#> $ Time.on.App          <dbl> 12.65565, 11.10946, 11.33028, 13.71751, 12.79519,~
#> $ Time.on.Website      <dbl> 39.57767, 37.26896, 37.11060, 36.72128, 37.53665,~
#> $ Length.of.Membership <dbl> 4.082621, 2.664034, 4.104543, 3.120179, 4.446308,~
#> $ Yearly.Amount.Spent  <dbl> 587.9511, 392.2049, 487.5475, 581.8523, 599.4061,~

Terdapat 3 kolom bertipe data karakter dan bisa dilakukan inspeksi kembali terkait nilai uniknya, kemudian diputuskan terkait perubahan tipe data. tiga kolom tersebut ialah Email, Addres, dan Avatar.

3. Penyesuaian Tipe Data

length(unique(customers$Email))
#> [1] 500
length(unique(customers$Address))
#> [1] 500
length(unique(customers$Avatar))
#> [1] 138

Mengingat nilai kolom Email dan Addres semuanya berbeda, sedangkan kolom avatar memilik 138 nilai unik dari 500 data, maka tidak perlu dilakukan perubahan tipe data.

4. Pemeriksaan Missing Value

anyNA(customers)
#> [1] FALSE

Tidak terdapat kolom yang memiliki baris bernilai NA

5. Pemilihan variabel Target & Prediktor

Berdasarkan Background, Business Objective, serta hasil inspeksi data, maka kolom yang bernilai karakter di drop. Kolom-kolom tersebut ialah Email, Addres, dan Avatar.

customers_ready <- customers %>% 
  select(-Email, -Address, -Avatar)
  • Variabel target: Yearly.Amount.Spent
  • Prediktor: Avg..Session.Length, Time.on.App, Time.on.Website, Length.of.Membership

Eksploratory Data Analysis (EDA)

1. Cek Persebaran Data setiap Variabel

hist(customers_ready$Avg..Session.Length)

hist(customers_ready$Time.on.App)

hist(customers_ready$Time.on.Website)

hist(customers_ready$Yearly.Amount.Spent)

insight:

“Semua data pada kolom memiliki persebaran normal”

2. Cek Korelasi antar Variabel

ggcorr(customers_ready, label = T, label_size = 2.9, hjust = 0.8, layout.exp = 3)

Berdasarkan plot ggcorr, nilai kolom yang berkorelasi tinggi dengan kolom target Yearle.Amount.Spent ialah Length.of.Membership

plot(x = customers$Length.of.Membership, y = customers$Yearly.Amount.Spent)

Berdasarkan scatterplot dapat terlihat jelas pola yang menunjukkan bahwa kolom Length.of.Membership dengan Yearly.Amount.Spent memiliki korealsi yang kuat.

Pembuatan Model

Model berdasarkan Nilai Korelasi

model_Korelasi <- lm(Yearly.Amount.Spent ~ Length.of.Membership,
                customers_ready)

summary(model_Korelasi)
#> 
#> Call:
#> lm(formula = Yearly.Amount.Spent ~ Length.of.Membership, data = customers_ready)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -125.975  -29.032   -0.494   33.033  147.777 
#> 
#> Coefficients:
#>                      Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept)           272.400      7.675   35.49 <0.0000000000000002 ***
#> Length.of.Membership   64.219      2.090   30.72 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 46.66 on 498 degrees of freedom
#> Multiple R-squared:  0.6546, Adjusted R-squared:  0.6539 
#> F-statistic: 943.9 on 1 and 498 DF,  p-value: < 0.00000000000000022

Model dengan Semua Prediktor

model_allPrediktor <- lm(Yearly.Amount.Spent ~ .,
                customers_ready)

summary(model_allPrediktor)
#> 
#> Call:
#> lm(formula = Yearly.Amount.Spent ~ ., data = customers_ready)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -30.4059  -6.2191  -0.1364   6.6048  30.3085 
#> 
#> Coefficients:
#>                        Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept)          -1051.5943    22.9925 -45.736 <0.0000000000000002 ***
#> Avg..Session.Length     25.7343     0.4510  57.057 <0.0000000000000002 ***
#> Time.on.App             38.7092     0.4510  85.828 <0.0000000000000002 ***
#> Time.on.Website          0.4367     0.4441   0.983               0.326    
#> Length.of.Membership    61.5773     0.4483 137.346 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 9.973 on 495 degrees of freedom
#> Multiple R-squared:  0.9843, Adjusted R-squared:  0.9842 
#> F-statistic:  7766 on 4 and 495 DF,  p-value: < 0.00000000000000022

Model Stepwise

model_none <- lm(Yearly.Amount.Spent~1,
                 customers_ready)

model_Stepwise <- step(object = model_none,
                   direction = "both",
                   scope = list(upper = model_allPrediktor),
                   trace = F)
summary(model_Stepwise)
#> 
#> Call:
#> lm(formula = Yearly.Amount.Spent ~ Length.of.Membership + Time.on.App + 
#>     Avg..Session.Length, data = customers_ready)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -29.628  -6.378  -0.135   6.351  30.169 
#> 
#> Coefficients:
#>                        Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept)          -1035.3396    15.9829  -64.78 <0.0000000000000002 ***
#> Length.of.Membership    61.5560     0.4478  137.46 <0.0000000000000002 ***
#> Time.on.App             38.7460     0.4494   86.21 <0.0000000000000002 ***
#> Avg..Session.Length     25.7210     0.4508   57.05 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 9.973 on 496 degrees of freedom
#> Multiple R-squared:  0.9843, Adjusted R-squared:  0.9842 
#> F-statistic: 1.036e+04 on 3 and 496 DF,  p-value: < 0.00000000000000022

Perbandingan Model

comparison <- compare_performance(model_allPrediktor, model_Korelasi, model_Stepwise)

as.data.frame(comparison)
#>                 Name Model      AIC    AIC_wt     AICc   AICc_wt      BIC
#> 1 model_allPrediktor    lm 3725.820 0.3747209 3725.990 0.3690067 3751.107
#> 2     model_Korelasi    lm 5265.813 0.0000000 5265.861 0.0000000 5278.456
#> 3     model_Stepwise    lm 3724.796 0.6252791 3724.917 0.6309933 3745.869
#>       BIC_wt        R2 R2_adjusted      RMSE     Sigma
#> 1 0.06790529 0.9843155   0.9841888  9.923257  9.973248
#> 2 0.00000000 0.6546162   0.6539227 46.566154 46.659567
#> 3 0.93209471 0.9842849   0.9841898  9.932946  9.972918

Perbandingan Goodness of fit: model_allPrediktor > model_Stepwise > model_Korelasi Perbandingan RMSE: model_allPrediktor > model_Stepwise > model_Korelasi Maka, model terbaik untuk case ini adalah model_allPrediktor

Interpretasi Model Terbaik

summary(model_allPrediktor)
#> 
#> Call:
#> lm(formula = Yearly.Amount.Spent ~ ., data = customers_ready)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -30.4059  -6.2191  -0.1364   6.6048  30.3085 
#> 
#> Coefficients:
#>                        Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept)          -1051.5943    22.9925 -45.736 <0.0000000000000002 ***
#> Avg..Session.Length     25.7343     0.4510  57.057 <0.0000000000000002 ***
#> Time.on.App             38.7092     0.4510  85.828 <0.0000000000000002 ***
#> Time.on.Website          0.4367     0.4441   0.983               0.326    
#> Length.of.Membership    61.5773     0.4483 137.346 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 9.973 on 495 degrees of freedom
#> Multiple R-squared:  0.9843, Adjusted R-squared:  0.9842 
#> F-statistic:  7766 on 4 and 495 DF,  p-value: < 0.00000000000000022

1. Interpretasi intercept: -1051.5943, artinya bahwa nilai Yearly.Amount.Spent akan sebesar -1051.5943 dengan syarat semua prediktornya bernilai 0

2. Interpretasi coefficient:

  • Avg..Session.Length: 25.7343, artinya nilai Yearly.Amount.Spent akan meningkat sebesar 25.7343 setiap satu satuan Avg..Session.Length dengan syarat variabel yang lain tetap
  • Time.on.App: 38.7092, artinya nilai Yearly.Amount.Spent akan meningkat sebesar 38.7092 setiap satu satuan Time.on.App dengan syarat variabel yang lain tetap
  • Time.on.Website: 0.4367, artinya nilai Yearly.Amount.Spent akan meningkat sebesar 0.4367 setiap satu satuan Time.on.Website dengan syarat variabel yang lain tetap
  • Length.of.Membership: 61.5773, artinya nilai Yearly.Amount.Spent akan meningkat sebesar 61.5773 setiap satu satuan Length.of.Membership dengan syarat variabel yang lain tetap

3. Signifikansi prediktor: Variabel yang berpengaruh signifikan terhadap nilai Yearly.Amount.Spent ialah Avg..Session.Length, Time.on.App, dan Length.of.Membership

4. Adjusted R-squared: 0.9842, artinya model bisa menjelaskan Yearly.Amount.Spent dengan baik sebesar 98,42%

Performa model

customers_ready$pred_all <- predict(model_allPrediktor,
                              customers_ready)

head(customers)
#>                           Email
#> 1     mstephenson@fernandez.com
#> 2             hduke@hotmail.com
#> 3              pallen@yahoo.com
#> 4       riverarebecca@gmail.com
#> 5 mstephens@davidson-herman.com
#> 6        alvareznancy@lucas.biz
#>                                                      Address           Avatar
#> 1               835 Frank Tunnel\nWrightmouth, MI 82180-9605           Violet
#> 2             4547 Archer Common\nDiazchester, CA 06566-8576        DarkGreen
#> 3 24645 Valerie Unions Suite 582\nCobbborough, DC 99414-7564           Bisque
#> 4           1414 David Throughway\nPort Jason, OH 22070-1220      SaddleBrown
#> 5    14023 Rodriguez Passage\nPort Jacobville, PR 37242-1057 MediumAquaMarine
#> 6    645 Martha Park Apt. 611\nJeffreychester, MN 67218-7250      FloralWhite
#>   Avg..Session.Length Time.on.App Time.on.Website Length.of.Membership
#> 1            34.49727    12.65565        39.57767             4.082621
#> 2            31.92627    11.10946        37.26896             2.664034
#> 3            33.00091    11.33028        37.11060             4.104543
#> 4            34.30556    13.71751        36.72128             3.120179
#> 5            33.33067    12.79519        37.53665             4.446308
#> 6            33.87104    12.02693        34.47688             5.493507
#>   Yearly.Amount.Spent
#> 1            587.9511
#> 2            392.2049
#> 3            487.5475
#> 4            581.8523
#> 5            599.4061
#> 6            637.1024

Menghitung Niliai RMSE dari Model

RMSE(y_pred = customers_ready$pred_all ,
    y_true = customers_ready$Yearly.Amount.Spent)
#> [1] 9.923257

Nilai RMSE model ialah 9,92, sebagaimana yang didapatkan sebelumnya pada tahap perbandingan antar model.

Asumsi Model Linear Regresi

Linearitas

plot(model_allPrediktor, which = 1)

Kesimpulan: Plot “Residuals vs Fitted” menunjukkan bahwa nilai residual “bounce randomly” secara linier disekitar 0. Sehingga, model memenuhi asumsi Linearitas

Normality of Residuals

hist(model_allPrediktor$residuals)

Shapiro-Wilk hypothesis test:

  • H0: error berdistribusi normal
  • H1: error TIDAK berdistribusi normal

H0 ditolak jika p-values < 0.05 (alpha)

shapiro.test(model_allPrediktor$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  model_allPrediktor$residuals
#> W = 0.99782, p-value = 0.7716

Kesimpulan: Nilai p-value dari shapiro test lebih besar dari 0,05, artinya H0 diterima atau model regresi linear memberikan hasil eror yang berdistribusi normal.

Homoskedastisitas

plot(x = model_allPrediktor$fitted.values, y = model_allPrediktor$residuals)
abline(h = 0, col = "red") 

Breusch-Pagan hypothesis test:

  • H0: error menyebar konstan atau homoscedasticity
  • H1: error menyebar TIDAK konstan atau heteroscedasticity

H0 ditolak jika p-values < 0.05 (alpha)

bptest(model_allPrediktor)
#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_allPrediktor
#> BP = 5.9772, df = 4, p-value = 0.2009

Kesimpulan: Nilai p-value dari Breusch-Pagan test lebih besar dari 0,05, artinya H0 diterima atau model regresi linear memberikan hasil eror yang menyebar konstan atau homoscedasticity.

No Multicollinearity

  • nilai VIF > 10: terjadi multicollinearity pada model
  • nilai VIF < 10: tidak terjadi multicollinearity pada model
vif(model_allPrediktor)
#>  Avg..Session.Length          Time.on.App      Time.on.Website 
#>             1.005422             1.008684             1.010275 
#> Length.of.Membership 
#>             1.006949

Kesimpulan: Tidak terjadi multicollinearity pada model

Kesimpulan & Rekomendasi

Kesimpulan

  1. Model terbaik untuk menggambarkan nilai Yearly.Amount.Spent oleh pelanggan ialah model dengan semua prediktor numerik yang ada, yakni Avg..Session.Length, Time.on.App, Time.on.Website, Length.of.Membership.
  2. Model bisa menjelaskan Yearly.Amount.Spent dengan baik sebesar 98,42%
  3. Semua prediktor memiliki nilai sgnifikansi yang sangat tinggi (p-value: < 0.00000000000000022), kecuali prediktor Time.on.Website yang sama sekali tidak signifikan.
  4. Prediktor Length.of.Membership memiliki korelasi positif yang tinggi dengan Yearly.Amount.Spent.

Rekomendasi

  1. Perusahaan E-commerce ini sebaiknya memfokuskan upaya mereka pada pengalaman aplikasi seluler, karena memiliki pengaruh signifikan terhadap Yearly.Amount.Spent pelanggan. Sedangkan, waktu yang dihabiskan pelanggan pada penggunaan situs web tidak memiliki signifikansi dan korelasi sama sekali dengan Yearly.Amount.Spent. Kemudian, model juga dapat disimplifikasi dengan hanya menggunakan prediktor Avg..Session.Length, Time.on.App, dan Length.of.Membership.
  2. Perusahaan E-commerce ini sebaiknya menganalisis atau mempelajari lebih lanjut strategi yang dapat meningkatkan nilai Length.of.Membership dari pelanggan, karena memiliki nilai signifikansi serta korelasi yang sangat tinggi dengan Yearly.Amount.Spent pelanggan.