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)
<- read.csv("Ecommerce Customers.csv")
customers
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 pelangganAddress
: Alamat rumah pelangganAvatar
: Simbol CustomerAvg..Session.Length
: Rata-rata lama waktu sesi yang dilakukan customerTime.on.App
: Lama waktu yang dihabiskan customer pada aplikasiTime.on.Website
: Lama waktu yang dihabiskan customer pada websiteLength.of.Membership
: Durasi pelanggan telah menjadi memberYearly.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 %>%
customers_ready 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
<- lm(Yearly.Amount.Spent ~ Length.of.Membership,
model_Korelasi
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
<- lm(Yearly.Amount.Spent ~ .,
model_allPrediktor
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
<- lm(Yearly.Amount.Spent~1,
model_none
customers_ready)
<- step(object = model_none,
model_Stepwise 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
<- compare_performance(model_allPrediktor, model_Korelasi, model_Stepwise)
comparison
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 satuanAvg..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 satuanTime.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 satuanTime.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 satuanLength.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
$pred_all <- predict(model_allPrediktor,
customers_ready
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
- Model terbaik untuk menggambarkan nilai
Yearly.Amount.Spent
oleh pelanggan ialah model dengan semua prediktor numerik yang ada, yakniAvg..Session.Length
,Time.on.App
,Time.on.Website
,Length.of.Membership
. - Model bisa menjelaskan
Yearly.Amount.Spent
dengan baik sebesar 98,42% - Semua prediktor memiliki nilai sgnifikansi yang sangat tinggi
(p-value: < 0.00000000000000022), kecuali prediktor
Time.on.Website
yang sama sekali tidak signifikan. - Prediktor
Length.of.Membership
memiliki korelasi positif yang tinggi denganYearly.Amount.Spent
.
Rekomendasi
- 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 penggunaansitus web
tidak memiliki signifikansi dan korelasi sama sekali denganYearly.Amount.Spent
. Kemudian, model juga dapat disimplifikasi dengan hanya menggunakan prediktorAvg..Session.Length
,Time.on.App
, danLength.of.Membership
. - 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 denganYearly.Amount.Spent
pelanggan.