Perusahaan melakukan campaign marketing untuk meningkatkan penjualan dan menarik pelanggan agar membeli produk yang ditawarkan. Namun, tidak semua pelanggan memberikan respons positif terhadap campaign tersebut. Ada pelanggan yang tertarik dan merespons promosi, tetapi ada juga yang tidak memberikan respons sama sekali.
Masalah yang dihadapi perusahaan adalah sulitnya menentukan pelanggan mana yang berpotensi merespons campaign marketing. Jika promosi diberikan kepada semua pelanggan tanpa analisis, perusahaan dapat mengeluarkan biaya marketing yang besar tetapi hasilnya kurang efektif.
Oleh karena itu, diperlukan analisis data untuk memprediksi respons pelanggan terhadap campaign marketing. Dengan analisis ini, perusahaan dapat mengetahui karakteristik pelanggan yang lebih berpotensi memberikan respons positif sehingga strategi promosi dapat dilakukan lebih tepat sasaran.
Metode yang digunakan dalam penelitian ini adalah klasifikasi menggunakan Logistic Regression karena target data berupa dua kategori, yaitu:
1 = pelanggan merespons campaign 0 = pelanggan tidak merespons campaign
Dataset yang digunakan adalah marketing_campaign.csv yang berisi data pelanggan dan aktivitas pembelian mereka. Dataset ini memiliki sekitar 2240 baris data dan beberapa variabel yang berkaitan dengan informasi pelanggan, pola pembelian, serta respons terhadap campaign marketing.
Beberapa variabel penting dalam dataset antara lain:
Income : pendapatan pelanggan.
Education : tingkat pendidikan pelanggan.
Marital_Status : status pernikahan pelanggan.
Recency : jarak waktu sejak pembelian terakhir pelanggan.
MntWines : jumlah pembelian produk wine.
MntMeatProducts : jumlah pembelian produk daging.
NumWebPurchases : jumlah pembelian melalui website.
NumStorePurchases : jumlah pembelian langsung di toko.
NumCatalogPurchases : jumlah pembelian melalui katalog.
Response : target data yang menunjukkan apakah pelanggan merespons campaign atau tidak.
Dari hasil pemahaman data, diketahui bahwa dataset memiliki kombinasi data numerik dan kategorikal. Selain itu, terdapat beberapa missing value pada variabel Income sehingga perlu dilakukan preprocessing sebelum model dibangun.
Target utama dalam analisis ini adalah variabel Response, karena penelitian bertujuan untuk memprediksi kemungkinan pelanggan merespons campaign marketing berdasarkan karakteristik dan perilaku pembelian mereka.
# Import library
library(dplyr)
library(caret)
library(ggplot2)
# Membaca dataset
marketing <- read.csv2(
"marketing_campaign.csv",
header = TRUE,
stringsAsFactors = FALSE
)
# Melihat struktur data
str(marketing)
## 'data.frame': 2240 obs. of 29 variables:
## $ ID : int 5524 2174 4141 6182 5324 7446 965 6177 4855 5899 ...
## $ Year_Birth : int 1957 1954 1965 1984 1981 1967 1971 1985 1974 1950 ...
## $ Education : chr "Graduation" "Graduation" "Graduation" "Graduation" ...
## $ Marital_Status : chr "Single" "Single" "Together" "Together" ...
## $ Income : int 58138 46344 71613 26646 58293 62513 55635 33454 30351 5648 ...
## $ Kidhome : int 0 1 0 1 1 0 0 1 1 1 ...
## $ Teenhome : int 0 1 0 0 0 1 1 0 0 1 ...
## $ Dt_Customer : chr "04/09/2012" "08/03/2014" "21/08/2013" "10/02/2014" ...
## $ Recency : int 58 38 26 26 94 16 34 32 19 68 ...
## $ MntWines : int 635 11 426 11 173 520 235 76 14 28 ...
## $ MntFruits : int 88 1 49 4 43 42 65 10 0 0 ...
## $ MntMeatProducts : int 546 6 127 20 118 98 164 56 24 6 ...
## $ MntFishProducts : int 172 2 111 10 46 0 50 3 3 1 ...
## $ MntSweetProducts : int 88 1 21 3 27 42 49 1 3 1 ...
## $ MntGoldProds : int 88 6 42 5 15 14 27 23 2 13 ...
## $ NumDealsPurchases : int 3 2 1 2 5 2 4 2 1 1 ...
## $ NumWebPurchases : int 8 1 8 2 5 6 7 4 3 1 ...
## $ NumCatalogPurchases: int 10 1 2 0 3 4 3 0 0 0 ...
## $ NumStorePurchases : int 4 2 10 4 6 10 7 4 2 0 ...
## $ NumWebVisitsMonth : int 7 5 4 6 5 6 6 8 9 20 ...
## $ AcceptedCmp3 : int 0 0 0 0 0 0 0 0 0 1 ...
## $ AcceptedCmp4 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp5 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp1 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp2 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Complain : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Z_CostContact : int 3 3 3 3 3 3 3 3 3 3 ...
## $ Z_Revenue : int 11 11 11 11 11 11 11 11 11 11 ...
## $ Response : int 1 0 0 0 0 0 0 0 1 0 ...
# Melihat ringkasan data
summary(marketing)
## ID Year_Birth Education Marital_Status
## Min. : 0 Min. :1893 Length:2240 Length:2240
## 1st Qu.: 2828 1st Qu.:1959 Class :character Class :character
## Median : 5458 Median :1970 Mode :character Mode :character
## Mean : 5592 Mean :1969
## 3rd Qu.: 8428 3rd Qu.:1977
## Max. :11191 Max. :1996
##
## Income Kidhome Teenhome Dt_Customer
## Min. : 1730 Min. :0.0000 Min. :0.0000 Length:2240
## 1st Qu.: 35303 1st Qu.:0.0000 1st Qu.:0.0000 Class :character
## Median : 51382 Median :0.0000 Median :0.0000 Mode :character
## Mean : 52247 Mean :0.4442 Mean :0.5062
## 3rd Qu.: 68522 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :666666 Max. :2.0000 Max. :2.0000
## NA's :24
## Recency MntWines MntFruits MntMeatProducts
## Min. : 0.00 Min. : 0.00 Min. : 0.0 Min. : 0.0
## 1st Qu.:24.00 1st Qu.: 23.75 1st Qu.: 1.0 1st Qu.: 16.0
## Median :49.00 Median : 173.50 Median : 8.0 Median : 67.0
## Mean :49.11 Mean : 303.94 Mean : 26.3 Mean : 166.9
## 3rd Qu.:74.00 3rd Qu.: 504.25 3rd Qu.: 33.0 3rd Qu.: 232.0
## Max. :99.00 Max. :1493.00 Max. :199.0 Max. :1725.0
##
## MntFishProducts MntSweetProducts MntGoldProds NumDealsPurchases
## Min. : 0.00 Min. : 0.00 Min. : 0.00 Min. : 0.000
## 1st Qu.: 3.00 1st Qu.: 1.00 1st Qu.: 9.00 1st Qu.: 1.000
## Median : 12.00 Median : 8.00 Median : 24.00 Median : 2.000
## Mean : 37.53 Mean : 27.06 Mean : 44.02 Mean : 2.325
## 3rd Qu.: 50.00 3rd Qu.: 33.00 3rd Qu.: 56.00 3rd Qu.: 3.000
## Max. :259.00 Max. :263.00 Max. :362.00 Max. :15.000
##
## NumWebPurchases NumCatalogPurchases NumStorePurchases NumWebVisitsMonth
## Min. : 0.000 Min. : 0.000 Min. : 0.00 Min. : 0.000
## 1st Qu.: 2.000 1st Qu.: 0.000 1st Qu.: 3.00 1st Qu.: 3.000
## Median : 4.000 Median : 2.000 Median : 5.00 Median : 6.000
## Mean : 4.085 Mean : 2.662 Mean : 5.79 Mean : 5.317
## 3rd Qu.: 6.000 3rd Qu.: 4.000 3rd Qu.: 8.00 3rd Qu.: 7.000
## Max. :27.000 Max. :28.000 Max. :13.00 Max. :20.000
##
## AcceptedCmp3 AcceptedCmp4 AcceptedCmp5 AcceptedCmp1
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.07277 Mean :0.07455 Mean :0.07277 Mean :0.06429
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
##
## AcceptedCmp2 Complain Z_CostContact Z_Revenue
## Min. :0.00000 Min. :0.000000 Min. :3 Min. :11
## 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:3 1st Qu.:11
## Median :0.00000 Median :0.000000 Median :3 Median :11
## Mean :0.01339 Mean :0.009375 Mean :3 Mean :11
## 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:3 3rd Qu.:11
## Max. :1.00000 Max. :1.000000 Max. :3 Max. :11
##
## Response
## Min. :0.0000
## 1st Qu.:0.0000
## Median :0.0000
## Mean :0.1491
## 3rd Qu.:0.0000
## Max. :1.0000
##
# Mengecek missing value
colSums(is.na(marketing))
## ID Year_Birth Education Marital_Status
## 0 0 0 0
## Income Kidhome Teenhome Dt_Customer
## 24 0 0 0
## Recency MntWines MntFruits MntMeatProducts
## 0 0 0 0
## MntFishProducts MntSweetProducts MntGoldProds NumDealsPurchases
## 0 0 0 0
## NumWebPurchases NumCatalogPurchases NumStorePurchases NumWebVisitsMonth
## 0 0 0 0
## AcceptedCmp3 AcceptedCmp4 AcceptedCmp5 AcceptedCmp1
## 0 0 0 0
## AcceptedCmp2 Complain Z_CostContact Z_Revenue
## 0 0 0 0
## Response
## 0
# Melihat nama kolom
colnames(marketing)
## [1] "ID" "Year_Birth" "Education"
## [4] "Marital_Status" "Income" "Kidhome"
## [7] "Teenhome" "Dt_Customer" "Recency"
## [10] "MntWines" "MntFruits" "MntMeatProducts"
## [13] "MntFishProducts" "MntSweetProducts" "MntGoldProds"
## [16] "NumDealsPurchases" "NumWebPurchases" "NumCatalogPurchases"
## [19] "NumStorePurchases" "NumWebVisitsMonth" "AcceptedCmp3"
## [22] "AcceptedCmp4" "AcceptedCmp5" "AcceptedCmp1"
## [25] "AcceptedCmp2" "Complain" "Z_CostContact"
## [28] "Z_Revenue" "Response"
# Membersihkan spasi pada nama kolom
colnames(marketing) <- trimws(colnames(marketing))
# Mengecek ulang
colnames(marketing)
## [1] "ID" "Year_Birth" "Education"
## [4] "Marital_Status" "Income" "Kidhome"
## [7] "Teenhome" "Dt_Customer" "Recency"
## [10] "MntWines" "MntFruits" "MntMeatProducts"
## [13] "MntFishProducts" "MntSweetProducts" "MntGoldProds"
## [16] "NumDealsPurchases" "NumWebPurchases" "NumCatalogPurchases"
## [19] "NumStorePurchases" "NumWebVisitsMonth" "AcceptedCmp3"
## [22] "AcceptedCmp4" "AcceptedCmp5" "AcceptedCmp1"
## [25] "AcceptedCmp2" "Complain" "Z_CostContact"
## [28] "Z_Revenue" "Response"
# Menghapus missing value
marketing <- marketing[!is.na(marketing$Income), ]
# Mengubah data kategorikal menjadi factor
marketing$Education <- as.factor(marketing$Education)
marketing$Marital_Status <- as.factor(marketing$Marital_Status)
marketing$Response <- as.factor(marketing$Response)
marketing\(Education <- as.factor(marketing\)Education) marketing\(Marital_Status <- as.factor(marketing\)Marital_Status) marketing\(Response <- as.factor(marketing\)Response)
## 1. Menghapus Missing Value pada Variabel Income
Proses ini dilakukan untuk menghapus data yang memiliki nilai kosong (missing value) pada kolom Income. Missing value dapat memengaruhi hasil analisis dan menyebabkan model tidak bekerja secara optimal. Setelah proses ini, hanya data pelanggan yang memiliki nilai income lengkap yang digunakan dalam analisis.
## 2. Menghapus Kolom ID
Kolom ID dihapus karena hanya berfungsi sebagai identitas unik pelanggan dan tidak memiliki pengaruh terhadap proses prediksi atau klasifikasi. Menghapus variabel yang tidak relevan dapat membantu model bekerja lebih efisien.
## 3. Mengubah Data Kategorikal Menjadi Factor
Variabel Education, Marital_Status, dan Response diubah menjadi tipe data factor karena variabel tersebut termasuk data kategorikal. Proses ini penting agar R dapat mengenali bahwa data tersebut merupakan kategori, bukan angka biasa.
Education berisi kategori tingkat pendidikan pelanggan.
Marital_Status berisi kategori status pernikahan pelanggan.
Response merupakan target klasifikasi yang menunjukkan apakah pelanggan merespons campaign atau tidak.
Dengan preprocessing ini, dataset menjadi lebih bersih dan siap digunakan pada tahap pembangunan model Logistic Regression.
# 4. Pembangunan Model
``` r
# Variabel yang digunakan
model_data <- marketing %>%
select(Income,
Recency,
MntWines,
MntMeatProducts,
NumWebPurchases,
NumStorePurchases,
NumCatalogPurchases,
Response)
Disini, kita menggunakan 8 variabel yaitu Income, Recency, MntWines, MntMeatProducts, NumWebPurchases, NumStorePurchases, NumCatalogPurchases dan Response.
set.seed(123)
trainIndex <- createDataPartition(model_data$Response,
p = 0.8,
list = FALSE)
trainData <- model_data[trainIndex, ]
testData <- model_data[-trainIndex, ]
Pada tahap ini dilakukan pembagian data menjadi data training dan data testing. Tujuannya supaya model bisa belajar dari sebagian data terlebih dahulu, lalu diuji menggunakan data lain untuk melihat seberapa baik model dalam melakukan prediksi. Kode set.seed(123) digunakan agar hasil pembagian data tetap sama setiap kali program dijalankan, sehingga hasil analisis lebih konsisten.
Selanjutnya, fungsi createDataPartition() digunakan untuk membagi data berdasarkan variabel target yaitu Response. Pada kode tersebut, p = 0.8 berarti 80% data digunakan sebagai data training dan 20% sisanya digunakan sebagai data testing. Data training disimpan pada variabel trainData dan digunakan untuk melatih model Logistic Regression. Sedangkan data testing disimpan pada variabel testData dan digunakan untuk menguji performa model setelah proses training selesai. Dengan cara ini, model dapat dievaluasi secara lebih objektif karena diuji menggunakan data yang belum pernah dipelajari sebelumnya.
model_logistic <- glm(Response ~ .,
data = trainData,
family = "binomial")
# Melihat hasil model
summary(model_logistic)
##
## Call:
## glm(formula = Response ~ ., family = "binomial", data = trainData)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.601e-01 2.742e-01 -2.042 0.04112 *
## Income -1.694e-05 6.536e-06 -2.592 0.00955 **
## Recency -2.262e-02 2.700e-03 -8.378 < 2e-16 ***
## MntWines 2.038e-03 3.043e-04 6.698 2.12e-11 ***
## MntMeatProducts 2.214e-03 4.540e-04 4.876 1.08e-06 ***
## NumWebPurchases 1.170e-01 3.085e-02 3.792 0.00015 ***
## NumStorePurchases -2.077e-01 3.219e-02 -6.450 1.12e-10 ***
## NumCatalogPurchases 7.221e-02 3.611e-02 2.000 0.04554 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1502.9 on 1773 degrees of freedom
## Residual deviance: 1250.2 on 1766 degrees of freedom
## AIC: 1266.2
##
## Number of Fisher Scoring iterations: 5
Pada tahap ini dilakukan proses pembangunan model menggunakan metode Logistic Regression. Kode glm() digunakan untuk membangun model klasifikasi dengan variabel target yaitu Response. Pada bagian Response ~ ., tanda titik (.) menunjukkan bahwa seluruh variabel pada dataset trainData digunakan sebagai variabel prediktor untuk memprediksi nilai Response.
Parameter data = trainData menunjukkan bahwa model dilatih menggunakan data training yang sebelumnya sudah dibagi dari dataset utama. Sedangkan family = “binomial” digunakan karena target yang diprediksi berupa klasifikasi biner, yaitu pelanggan merespons campaign atau tidak merespons campaign.
Hasil model kemudian disimpan ke dalam variabel model_logistic. Setelah itu, fungsi summary(model_logistic) digunakan untuk melihat ringkasan hasil model Logistic Regression. Output yang dihasilkan menampilkan informasi seperti nilai koefisien tiap variabel, tingkat signifikansi variabel, nilai p-value, serta pengaruh masing-masing variabel terhadap target Response.
Dari hasil tersebut, dapat diketahui variabel mana yang paling berpengaruh dalam memprediksi respons pelanggan terhadap campaign marketing.
# 8. Prediksi Data Testing
# -----------------------------------------------------
pred_prob <- predict(model_logistic,
newdata = testData,
type = "response")
# Mengubah probabilitas menjadi kelas 0 dan 1
pred_class <- ifelse(pred_prob > 0.5, 1, 0)
pred_class <- as.factor(pred_class)
Pada tahap ini dilakukan proses prediksi menggunakan model Logistic Regression yang sudah dibuat sebelumnya. Fungsi predict() digunakan untuk memprediksi data testing dengan model model_logistic. Pada bagian newdata = testData, artinya data yang digunakan untuk prediksi adalah data testing. Sedangkan type = “response” digunakan supaya output yang dihasilkan berupa nilai probabilitas dari 0 sampai 1.
Hasil prediksi tersebut disimpan ke dalam variabel pred_prob. Nilai probabilitas ini menunjukkan kemungkinan pelanggan akan merespons campaign marketing. Semakin besar nilainya, maka semakin besar kemungkinan pelanggan memberikan respons positif.
Selanjutnya, fungsi ifelse() digunakan untuk mengubah nilai probabilitas menjadi klasifikasi biner, yaitu 0 dan 1. Jika nilai probabilitas lebih dari 0.5 maka akan diberi nilai 1, yang berarti pelanggan diprediksi merespons campaign. Sedangkan jika nilainya kurang dari atau sama dengan 0.5 maka diberi nilai 0, yang berarti pelanggan diprediksi tidak merespons campaign.
Kemudian hasil prediksi tersebut diubah menjadi tipe data factor menggunakan as.factor() agar format datanya sesuai dengan variabel target pada proses evaluasi model. Dengan tahap ini, model sudah bisa digunakan untuk memprediksi respons pelanggan berdasarkan data testing.
# 9. Evaluasi Model
# -----------------------------------------------------
# Confusion Matrix
confusionMatrix(pred_class, testData$Response)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 367 46
## 1 9 20
##
## Accuracy : 0.8756
## 95% CI : (0.8411, 0.9049)
## No Information Rate : 0.8507
## P-Value [Acc > NIR] : 0.07809
##
## Kappa : 0.363
##
## Mcnemar's Test P-Value : 1.208e-06
##
## Sensitivity : 0.9761
## Specificity : 0.3030
## Pos Pred Value : 0.8886
## Neg Pred Value : 0.6897
## Prevalence : 0.8507
## Detection Rate : 0.8303
## Detection Prevalence : 0.9344
## Balanced Accuracy : 0.6395
##
## 'Positive' Class : 0
##
Pada tahap evaluasi, digunakan fungsi confusionMatrix(pred_class, testData$Response) untuk melihat performa model Logistic Regression dalam melakukan prediksi terhadap data testing. Confusion matrix digunakan untuk membandingkan hasil prediksi model dengan data asli sehingga dapat diketahui tingkat ketepatan model.
Dari hasil evaluasi dapat dilihat beberapa metrik seperti accuracy, precision, recall, dan specificity. Nilai accuracy menunjukkan seberapa besar kemampuan model dalam memprediksi data dengan benar. Jika nilai accuracy cukup tinggi, maka model dapat dikatakan mampu melakukan klasifikasi pelanggan dengan baik.
Selain itu, precision menunjukkan seberapa akurat model dalam memprediksi pelanggan yang benar-benar memberikan respons terhadap campaign. Sedangkan recall menunjukkan kemampuan model dalam mendeteksi seluruh pelanggan yang benar-benar merespons campaign. Semakin tinggi nilai precision dan recall, maka performa model semakin baik.
Berdasarkan hasil confusion matrix, model Logistic Regression sudah cukup baik dalam membedakan pelanggan yang merespons dan tidak merespons campaign marketing.
Pada proses pembangunan model digunakan metode Logistic Regression dengan fungsi glm() dan family = “binomial” karena target yang diprediksi berupa klasifikasi biner, yaitu pelanggan merespons atau tidak merespons campaign.
Hasil dari summary(model_logistic) menunjukkan nilai koefisien, p-value, dan tingkat signifikansi masing-masing variabel. Variabel dengan nilai p-value kecil (biasanya kurang dari 0.05) dianggap memiliki pengaruh signifikan terhadap variabel target Response.
Dari hasil model dapat diketahui bahwa beberapa variabel seperti income, jumlah pembelian produk, dan aktivitas pembelian pelanggan memiliki pengaruh terhadap kemungkinan pelanggan merespons campaign marketing. Koefisien bernilai positif menunjukkan bahwa variabel tersebut meningkatkan kemungkinan pelanggan memberikan respons, sedangkan koefisien negatif menunjukkan pengaruh sebaliknya.
Secara keseluruhan, model Logistic Regression mampu membantu perusahaan dalam memahami pola perilaku pelanggan dan memprediksi pelanggan yang berpotensi merespons campaign marketing. Dengan hasil ini, perusahaan dapat membuat strategi promosi yang lebih tepat sasaran dan efektif.
Berdasarkan hasil analisis menggunakan tahapan CRISP-DM dan metode Logistic Regression, dapat disimpulkan bahwa model berhasil digunakan untuk memprediksi respons pelanggan terhadap campaign marketing. Proses analisis dimulai dari pemahaman masalah, pemahaman data, preprocessing, pembangunan model, hingga evaluasi model.
Hasil analisis menunjukkan bahwa beberapa faktor seperti income, frekuensi pembelian, dan aktivitas belanja pelanggan memiliki pengaruh terhadap kemungkinan pelanggan memberikan respons terhadap campaign. Selain itu, hasil evaluasi menggunakan confusion matrix menunjukkan bahwa model memiliki performa yang cukup baik dalam melakukan klasifikasi pelanggan.
Dengan adanya model Logistic Regression ini, perusahaan dapat mengetahui pelanggan yang lebih berpotensi merespons campaign marketing sehingga strategi promosi dapat dilakukan lebih tepat sasaran, efektif, dan efisien.