Sebuah perusahaan akan mengevaluasi saluran promosi apakah promosi yang dilakukan berdampak pada target penjualan. Perusahaan tersebut memiliki 60 cabang di 60 kota. Usaha promosi yang dilakukan antara lain penyebaran brosur, mengadakan event promosi, pemasangan reklame, dan pengerahan tenaga sales promotion. Publikasi ini akan melakukan evaluasi saluran pemasaran yang berdampak signifikan kepada target penjualan.
# chunk options
knitr::opts_chunk$set(
message = FALSE,
warning = FALSE,
fig.align = "center",
comment = "#>"
)
# scientific notation
options(scipen = 9999)
# import libs
library(dplyr)
library(gtools)
library(gmodels)
library(ggplot2)
library(class)
library(tidyr)
Evaluasi dilakukan dengan membuat regresi logistik dimana variabel yang akan diprediksi adalah target penjualan. Variabel prediktor antara lain jumlah brosur yang disebar (brosur), jumlah event yang diadakan (event), jumlah reklame yang dipasang (reklame), dan jumlah tenaga sales promotion yang dikerahkan (sales).
Mengimpor dataset yang akan digunakan dan memberi nama variabel
target <- read.csv("promo.csv")
names(target) <- c("brosur", "event", "reklame", "sales", "target")
head(target)
Variabel target merupakan variabel numerik. Dalam regresi logistik variabel target harus diubah menjadi variabel kategorik. Pada tahap ini akan diubah menjadi variabel kategorik dengan kode sebagai berikut:
target1 <- target %>%
mutate(target = factor(target, levels = c(0,1), labels = c("Failed", "Success")))
target1
Variabel target sudah berubah menjadi variabel kategorik.Berikut adalah penjelasan dari beberapa variabel:
target: target penjualan apakah Success dan Failedbrosur: jumlah brosur yang sudah disebarevent: jumlah event promosi yang diadakanreklame: jumlah reklame yang dipasangsales: jumlah tenaga sales person yang dikerahkan untuk promosiPada tahap ini akan dilakukan pengecekan missing data.
colSums(is.na(target1))
#> brosur event reklame sales target
#> 0 0 0 0 0
Tidak ada data yang kososng.
Pada bagian ini akan dicek kategori dari variabel target beserta komposisinya.
prop.table(table(target1$target))
#>
#> Failed Success
#> 0.45 0.55
table(target1$target)
#>
#> Failed Success
#> 27 33
set.seed(303)
intrain <- sample(nrow(target1), nrow(target1)*0.7)
target_train <- target1[intrain,]
target_test <- target1[-intrain,]
target1$target %>%
levels()
#> [1] "Failed" "Success"
target_train
target_test
Pada tahap ini dilakukan pemodelan menggunakan regresi logistik. Pemodelan regresi logistik menggunakan fungsi glm(). Variabel yang digunakan adalah beberapa variabel yang kita anggap mempengaruhi target variabel, dimana variabel target menjadi variabel responnya.
model <- glm(formula = target~brosur+event+reklame+sales, family = "binomial",
data = target_train)
summary(model)
#>
#> Call:
#> glm(formula = target ~ brosur + event + reklame + sales, family = "binomial",
#> data = target_train)
#>
#> Deviance Residuals:
#> Min 1Q Median 3Q Max
#> -1.9238 -0.9364 0.2139 0.8174 1.7562
#>
#> Coefficients:
#> Estimate Std. Error z value Pr(>|z|)
#> (Intercept) -4.3504243 1.8992303 -2.291 0.0220 *
#> brosur 0.0003276 0.0005339 0.614 0.5395
#> event 0.2385352 0.1311373 1.819 0.0689 .
#> reklame -0.1520832 0.2492531 -0.610 0.5418
#> sales 0.2528200 0.1940766 1.303 0.1927
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#> Null deviance: 57.843 on 41 degrees of freedom
#> Residual deviance: 42.353 on 37 degrees of freedom
#> AIC: 52.353
#>
#> Number of Fisher Scoring iterations: 5
Pada pemodelan yang pertama, masih banyak variabel prediktor yang tidak signifikan terhadap target variabel, oleh karena itu kita akan coba melakukan model fitting menggunakan metode stepwise.
model2 <- step(model, direction = "backward")
#> Start: AIC=52.35
#> target ~ brosur + event + reklame + sales
#>
#> Df Deviance AIC
#> - brosur 1 42.733 50.733
#> - reklame 1 42.735 50.735
#> - sales 1 44.190 52.190
#> <none> 42.353 52.353
#> - event 1 45.971 53.971
#>
#> Step: AIC=50.73
#> target ~ event + reklame + sales
#>
#> Df Deviance AIC
#> - reklame 1 42.939 48.939
#> - sales 1 44.394 50.394
#> <none> 42.733 50.733
#> - event 1 48.935 54.935
#>
#> Step: AIC=48.94
#> target ~ event + sales
#>
#> Df Deviance AIC
#> - sales 1 44.398 48.398
#> <none> 42.939 48.939
#> - event 1 49.434 53.434
#>
#> Step: AIC=48.4
#> target ~ event
#>
#> Df Deviance AIC
#> <none> 44.398 48.398
#> - event 1 57.843 59.843
summary(model2)
#>
#> Call:
#> glm(formula = target ~ event, family = "binomial", data = target_train)
#>
#> Deviance Residuals:
#> Min 1Q Median 3Q Max
#> -1.8590 -0.8586 0.3125 0.7855 1.5341
#>
#> Coefficients:
#> Estimate Std. Error z value Pr(>|z|)
#> (Intercept) -4.31882 1.53467 -2.814 0.00489 **
#> event 0.29255 0.09945 2.942 0.00326 **
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#> Null deviance: 57.843 on 41 degrees of freedom
#> Residual deviance: 44.398 on 40 degrees of freedom
#> AIC: 48.398
#>
#> Number of Fisher Scoring iterations: 4
Dengan menggunakan metode backward pada stepwise, kita memperoleh model sebagai berikut.Variabel yang berpengaruh secara signifikan terhadap target penjualan adalah variabel event. Sedangkan variabel lain reklame, sales, dan brosur tidak berpengaruh terhadap target penjualan.
Dengan menggunakan model2 hasil dari stepwise, kita akan coba prediksi menggunakan data test yang sudah kita miliki.
target_test$prob_target<-predict(model2, type = "response", newdata = target_test)
target_test$prob_target
#> [1] 0.3082770 0.4444597 0.3738737 0.3738737 0.3738737 0.5895302 0.5173608
#> [8] 0.1988827 0.1214898 0.6580410 0.8611395 0.1563231 0.3082770 0.1214898
#> [15] 0.8223329 0.1563231 0.1214898 0.9523476
target_test$pred_target <- factor(ifelse(target_test$prob_target > 0.5,"Success","Failed"))
target_test[1:10, c("pred_target", "target")]
Pada tabel diatas, dapat diinterpretasikan bahwa hasil prediksi yang dilakukan lebih condong ke arah 1 yang artinya success.
Untuk mengevaluasi model yang telah kita buat, kita akan menggunakan confusion matrix.
library(caret)
log_conf <- confusionMatrix(target_test$pred_target, target_test$target, positive = "Success")
log_conf
#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction Failed Success
#> Failed 8 4
#> Success 0 6
#>
#> Accuracy : 0.7778
#> 95% CI : (0.5236, 0.9359)
#> No Information Rate : 0.5556
#> P-Value [Acc > NIR] : 0.04535
#>
#> Kappa : 0.5714
#>
#> Mcnemar's Test P-Value : 0.13361
#>
#> Sensitivity : 0.6000
#> Specificity : 1.0000
#> Pos Pred Value : 1.0000
#> Neg Pred Value : 0.6667
#> Prevalence : 0.5556
#> Detection Rate : 0.3333
#> Detection Prevalence : 0.3333
#> Balanced Accuracy : 0.8000
#>
#> 'Positive' Class : Success
#>
Kinerja dari model regresi logistik adalah adalah Accuracy, Re-call/Sensitivity , Accuracy, dan Precision (Saito dan Rehmsmeier, 2015) Accuracy mengukur berapa banyak data kita yang diprediksi dengan benar. Re-call/Sensitivity mengukur dari semua hasil positif, berapa banyak yang diprediksi dengan benar. Specificity mengukur berapa banyak hasil negatif yang diprediksi dengan benar. Precision mengukur berapa banyak prediksi positif kita yang benar.
Accuracy <- round((10+4)/(10+4+2+2),2)
Sensitivity <- round((10)/(10+2),2)
Specificity <- round((4)/(4+2),2)
Precision <- round((10)/(10+2),2)
performance <- cbind.data.frame(Accuracy, Sensitivity, Specificity, Precision)
performance
Berdasarkan hasil confusionMatrix diatas:
Nilai Accuracy 78% yang artinya model bisa mengukur berapa banyak data kita yang diprediksi dengan benar.
Nilai Re-call/Sensitivity sebesar 83% yang artinya model bisa mengukur dari semua hasil positif, berapa banyak yang diprediksi dengan benar.
Nilai Specificity sebesar 67% yang artinya model bisa mengukur berapa banyak hasil negatif yang diprediksi dengan benar.
Nilai Precision sebesar 83% yang artinya model bisa mengukur berapa banyak prediksi positif yang benar.
Kita panggil kembali summary model yang telah dibuat
summary(model2)
#>
#> Call:
#> glm(formula = target ~ event, family = "binomial", data = target_train)
#>
#> Deviance Residuals:
#> Min 1Q Median 3Q Max
#> -1.8590 -0.8586 0.3125 0.7855 1.5341
#>
#> Coefficients:
#> Estimate Std. Error z value Pr(>|z|)
#> (Intercept) -4.31882 1.53467 -2.814 0.00489 **
#> event 0.29255 0.09945 2.942 0.00326 **
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> (Dispersion parameter for binomial family taken to be 1)
#>
#> Null deviance: 57.843 on 41 degrees of freedom
#> Residual deviance: 44.398 on 40 degrees of freedom
#> AIC: 48.398
#>
#> Number of Fisher Scoring iterations: 4
exp(model2$coefficients) %>%
data.frame()
Intercept: log of odds dari penjualan yang sesuai target bila nilai tidak ada event promosi (0).
Event: peningakatan log of odds target penjualan berhasil untuk setiap peningkatan 1 kali acara event promosi. Setiap ada tambahan even promosi sebesar satu kali, maka log of odds nya bertambah 0.156
contoh:
target = -5.1323 + 0.3687 * event
Sebagai COntoh:
Cabang ke-1 mengadakan event promosi sebanyak 10 kali, sedangkan Cabang ke-2 kedua mengadakan 11 kali. Hitung masing-masing log of oddsnya, berapa selisihnya?
Cabang1 <- -5.1323 + 0.3687 * 10
Cabang2 <- -5.1323 + 0.3687 * 11
Cabang2-Cabang1
#> [1] 0.3687
exp(0.3687)
#> [1] 1.445854
Insight 1: Setiap penambahan kegiata event promosi sebanyak 1 kali, maka akan meningkatkan kemungkinan 1.44 KALI cabang untuk berhasil mencapai target penjualan.
Insight 2: Cabang yang mengadakan 11 kali kegiatan event promosi akan 1.17 KALI lebih mungkin berhasil mencapai target penjualan dibandingkan yang cabang yang mengadakan event promosi sebanyak 10 kali.
Insight 3:Semakin banyak event promosi akan meningkatkan peluang cabang berhasil mencapai target penjualan.
Jika cabang mengadakan event sebanyak 10 kali berapa peluang penjualan memenuhi target?
# log of odds
library(gtools)
lods <- -5.1323 + 0.3687 * 10
inv.logit(lods)
#> [1] 0.190726
Keberhasilan memenuhi target jika kegiatan event diadakan 10 kali adalah 19,07%. Artinya kegiatan event sebanyak 10 kali belum optimal.
Jika cabang mengadakan event sebanyak 15 kali berapa peluang penjualan memenuhi target?
lods <- -5.1323 + 0.3687 * 15
inv.logit(lods)
#> [1] 0.5982551
Keberhasilan memenuhi target jika kegiatan event diadakan 10 kali adalah 59,82%. Artinya kegiatan event sebanyak 15 kali sudah optimal.
Perusahaan dan cabang di setiap kota sebaiknya fokus kepada kegiatan even promosi dibanding saluran promosi lainnya.
Jumlah kegiatan event promosi sebaiknya minimal 15 kali agar peluang keberhasilan memenuhi target penjualan di atas 50 persen.
Sebuah perusahaan yang bergerak di bidang jasa pendidikan dan training ingin mengevaluasi promosi melalui email dan broadcast whatsapp. Email promosi dan broadcast whatsapp berisi promosi yang mendidik dan informatif. Diharapkan promosi tersebut membuat calon konsumen mau ikut bergabung mengikuti training. Berdasarkan data yang dimiliki bagian promosi, ada 10 calon konsumen yang telah didata telah dikirimi email dan broadcast whatsapp promosi. Dari ke-10 calon konsumen tersebut ada yang memutuskan ikut dan tidak ikut.
Berikut adalah rinciannya datanya.
email<-c(7,7,3,2,8,2,4,3,7,6,3,2,2,7,7)
whatsapp<-c(6,5,4,4,7,3,5,2,8,7,3,3,3,6,6)
keputusan<-factor(c("ikut","ikut","tidak","tidak","ikut","tidak","tidak","tidak","ikut","ikut","tidak","tidak","tidak","ikut","ikut"))
datapromo <- cbind.data.frame(email, whatsapp, keputusan)
datapromo
Keterangan Data email = frekuens email yang dikirim whatsapp = frekuensi whatsapp yang dikirim keputusan = Keputusan ikut training atau tidak
Kemudian perusahaan ingin melihat pengaruh promosi dengan dengan 6 kali mengirim email dan 6 kali mengirim whatsapp. Apakah dengan jumlah promosi sebanyak itu memiliki peluang yang besar untuk ikut training?
Permasalahan ini akan dipecahkan dengan metode K-Nearest Neighboor (K-NN)
promo<-cbind(email,whatsapp)
promo
#> email whatsapp
#> [1,] 7 6
#> [2,] 7 5
#> [3,] 3 4
#> [4,] 2 4
#> [5,] 8 7
#> [6,] 2 3
#> [7,] 4 5
#> [8,] 3 2
#> [9,] 7 8
#> [10,] 6 7
#> [11,] 3 3
#> [12,] 2 3
#> [13,] 2 3
#> [14,] 7 6
#> [15,] 7 6
promotest<-cbind(6,6)
promotest
#> [,1] [,2]
#> [1,] 6 6
hasil<-knn(promo,promotest,keputusan,k=3)
hasil
#> [1] ikut
#> Levels: ikut tidak
Kesimpulan: dengan melakukan promosi dengan dengan 6 kali mengirim email dan 6 kali mengirim whatsapp kepada calon konsumen, maka konsumenberpeluang besar akan ikut training.