Pada kesempatan kali ini saya akan membahas terkait tutorial R pada beberapa teknik pemodelan klasifikasi, diantaranya Regresi Logistik, Decision Tree, Random Forest, Bagging, dan Adaboost. Artikel ini akan dibuat secara sekuensial dengan membahas step by step dalam pemodelan. Berikut pokok bahasan artikel yang akan dibahas:
  1. Eksplorasi data, pra-proses data, dan feature engineering (https://rpubs.com/statedu/eda)

  2. Pemodelan menggunakan Regresi Logistik(https://rpubs.com/statedu/regresi-logistik)

  3. Pemodelan menggunakan Decision Tree(https://rpubs.com/statedu/decision-tree)

  4. Pemodelan menggunakan Random Forest(https://rpubs.com/statedu/random-forest)

  5. Pemodelan menggunakan Bagging(https://rpubs.com/statedu/bagging)

  6. Pemodelan menggunakan AdaBoost(https://rpubs.com/statedu/adaboost)

Artikel ini akan membahas point pertama (Eksplorasi Data, pra-proses data, dan feature engineering). Eksplorasi data merupakan bagian penting dalam analisis data. Tahapan ini diperlukan untuk mengetahui gambaran umum data. Hal tersebut penting dilakukan untuk mengetahui adanya sifat “unik” dari data, pola hubungan antar peubah yang digunakan, dan sebagai acuan dalam proses feature engineering dan pra-proses data. Tahapan pra-proses data perlu dilakukan untuk mempersiapkan data yang akan digunakan dalam pemodelan. Ketepatan dalam memilih peubah penjelas merupakan salah satu kunci untuk menghasilkan model yang baik.

Data yang digunakan pada artikel ini yaitu data member dan data hasil piloting yang telah dilakukan oleh sebuah supermarket terkait respon promo. Data terdiri dari 5000 observasi. Data terdiri dari 20 peubah. Adapun peubah respon yang digunakan yaitu peubah “response” yang terdiri dari dua kelas (“1” = member memberi respon positif terhadap promo dan “0” = member memberi respon negatif terhadap promo).

Eksplorasi Data

# Import Data
setwd("D:/BISMILLAH FAST TRACK/MOKLAS")
mdata<- readxl::read_excel("data.xlsx", sheet = 2)
mdata<- as.data.frame(mdata)
# Melihat stuktur data
str(mdata)
## 'data.frame':    5000 obs. of  20 variables:
##  $ member_id          : chr  "ID237398" "ID502009" "ID011841" "ID645389" ...
##  $ gender             : num  1 1 1 1 1 1 1 0 1 1 ...
##  $ visit_last_1mo     : num  4 6 3 3 3 3 0 1 7 2 ...
##  $ visit_last_2mo     : num  6 6 3 2 4 2 0 2 4 1 ...
##  $ visit_last_3mo     : num  6 2 2 1 3 4 1 2 3 0 ...
##  $ spending_last_1mo  : num  207164 792577 1019203 260765 956641 ...
##  $ spending_last_2mo  : num  170482 821678 1058981 281803 899804 ...
##  $ spending_last_3mo  : num  157592 859218 1036460 276175 814255 ...
##  $ age                : num  25 32 24 28 27 24 31 32 30 27 ...
##  $ monthly_income     : num  3172700 4141600 5292900 2606600 4520100 ...
##  $ marital_status     : num  1 1 0 0 0 1 1 1 1 1 ...
##  $ payment_channel    : num  0 0 2 1 2 2 0 0 2 0 ...
##  $ buy_groceries      : num  1 0 0 0 0 0 1 0 0 0 ...
##  $ buy_toiletries     : num  1 1 1 0 1 1 1 1 0 0 ...
##  $ buy_food           : num  1 0 1 1 1 1 1 1 1 0 ...
##  $ buy_electronic     : num  0 0 1 0 0 0 0 0 0 0 ...
##  $ buy_clothes        : num  0 0 0 0 0 1 0 0 0 0 ...
##  $ buy_home_appliances: num  1 1 1 0 1 0 0 0 0 0 ...
##  $ recency_last_visit : num  27 5 3 27 1 2 37 19 11 8 ...
##  $ response           : num  0 0 0 0 0 1 0 1 1 0 ...
# Mengubah peubah response dan payment chanel menjadi peubah kategorik
mdata$response<- as.factor(mdata$response)
mdata$payment_channel<- as.factor(mdata$payment_channel)
attach(mdata)
# Melihat proporsi masing-masing kelas peubah Response
prop.table(table(response))
## response
##      0      1 
## 0.5682 0.4318
barplot(table(response), col = "lightblue")
text(300,"57%")
text(2, y = 300,"43%")

Berdasarkan plot diatas terlihat bahwa terdapat 43% member yang memberi respon positif terhadap promo yang ditawarkan (“1”). Sementara itu, 57% lainnya memberikan respon negatif (“0”) . Perbandingan masing-masing kelas pada peubah respon terlihat seimbang. Hal tersebut menunjukkan bahwa tidak terjadi kasus imbalance data.

Selanjutnya akan dilakukan eksplorasi untuk melihat sebaran peubah penjelas pada masing-masing kelas peubah respon.
library(ggplot2)
p1<- ggplot(data=mdata, aes(y= visit_last_1mo, group=response, fill=response)) +geom_boxplot()
p2<- ggplot(data=mdata, aes(y= visit_last_2mo, group=response, fill=response)) +geom_boxplot()
p3<- ggplot(data=mdata, aes(y= visit_last_3mo, group=response, fill=response)) +geom_boxplot()
gridExtra::grid.arrange(p1, p2,p3, nrow = 1)

Diagram kotak garis pada plot diatas menunjukkan bahwa dalam satu bulan terakhir rata-rata member berbelanja di S-Mart sebanyak tiga kali. Berdasarkan plot terlihat bahwa sebaran kunjungan satu bulan terakhir (visit_last_1mo) pada masing-masing kelas peubah respon sama. Sementara itu, sebaran peubah visit_last_2mo dan visit_last_3mo menunjukkan adanya perbedaan pada masing-masing kelas peubah respon. Berdasarkan diagram kotak garis terlihat bahwa member yang memberikan respon positif terhadap promo adalah member yang lebih sering mengunjungi supermarket dibandingkan member yang memberikan respon negatif.
p4<- ggplot(data=mdata, aes(y= spending_last_1mo, group=response, fill=response)) +geom_boxplot()
p5<- ggplot(data=mdata, aes(y= spending_last_2mo, group=response, fill=response)) +geom_boxplot()
p6<- ggplot(data=mdata, aes(y= spending_last_3mo, group=response, fill=response)) +geom_boxplot()
gridExtra::grid.arrange(p4, p5,p6, nrow = 1)

Plot diatas menunjukkan sebaran peubah spending_last_1mo, spending_last_2mo, dan spending_last_3mo pada masing-masing kelas response. Berdasarkan diagram kotak tersebut, terlihat bahwa sebaran dari ketiga peubah tersebut relatif sama dari bulan 1 (satu), bulan 2 (dua), dan bulan 3 (tiga). Hal tersebut menunjukkan bahwa member supermarket cenderung konsisten dalam membelanjakan uang setiap bulannya. Selain itu, berdasarkan plot diatas terlihat bahwa member yang memberikan respon positif terhadap promo menghabiskan banyak uang belanja lebih besar dibandingkan member yang memberikan respon negative. Hal tersebut menunjukkan bahwa semakin besar uang yang dikeluarkan untuk belanja setiap bulan, maka kemungkinan member untuk memberikan respon positif juga semakin besar.
p7<- ggplot(data=mdata, aes(y= recency_last_visit, group=response, fill=response)) +geom_boxplot(position = position_dodge(0.9))
p8<- ggplot(data=mdata, aes(y= age, group=response, fill=response)) +geom_boxplot(position = position_dodge(0.9))
p9<- ggplot(data=mdata, aes(y= monthly_income, group=response, fill=response)) +geom_boxplot(position = position_dodge(0.9))
gridExtra::grid.arrange(p7, p8,p9, nrow = 1)

Diagram kotak garis pada Gambar (1) dan (2) menunjukkan sebaran recency_last_visit dan age pada masing-masing kelas response. Berdasarkan boxplot, terlihat bahwa sebaran peubah pada masing-masing kelas cenderung sama. Hal tersebut menunjukkan bahwa peubah recency_last_visit dan age kurang baik dalam menggambarkan kelas masing-masing peubah response. Secara eksplorasi, terlihat bahwa sebaran pendapatan bulanan member cenderung sama pada masing-masing kelas. Selanjutnya, dilakukan eksplorasi data untuk melihat sebaran peubah penjelas kategorik pada masing-masing kelas peubah respon menggunakan diagram batang (barchart).
library(viridis)
## Loading required package: viridisLite
b1<- ggplot(data=mdata, aes(x= as.factor(marital_status), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("marital_status")
b2<- ggplot(data=mdata, aes(x= as.factor(gender), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("gender")
b3<- ggplot(data=mdata, aes(x= as.factor(payment_channel), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("payment_channel")
gridExtra::grid.arrange(b1,b2,b3, nrow = 1)

Berdasarkan diagram batang diatas menunjukkan bahwa sebagian besar member berstatus sudah menikah dan berjenis kelamin perempuan. Gambar (3) menunjukkan sebaran kelas response pada peubah metode pembayaran (method_channel). Berdasarkan grafik, terlihat bahwa mayoritas member S-Mart melakukan pembayaran secara cash. Pola sebaran peubah response pada member yang memilih metode pembayaran secara cash (“0”) dan debit (“1”) cenderung sama, yaitu sebagian besar member memberikan respon negative terhadap promo. Sementara itu, pada member yang menggunakan metode pembayaran menggunakan kartu kredit (“2”), sebaran respon positif dan negatif relatif sama.
b4<- ggplot(data=mdata, aes(x= as.factor(buy_clothes), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("buy_clothes")
b5<- ggplot(data=mdata, aes(x= as.factor(buy_electronic), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("buy_electronic")
b6<- ggplot(data=mdata, aes(x= as.factor(buy_food), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("buy_food")
b7<- ggplot(data=mdata, aes(x= as.factor(buy_groceries), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("buy_groceries")
b8<- ggplot(data=mdata, aes(x= as.factor(buy_home_appliances), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("buy_home_appliances")
b9<- ggplot(data=mdata, aes(x= as.factor(buy_toiletries), group=response, fill=response)) +
  geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("buy_toiletries")
gridExtra::grid.arrange(b4,b5,b6,b7,b8,b9, nrow = 2)

Berdasarkan plot diatas terlihat bahwa sebaran kelas peubah response pada masing-masing kelas peubah buy_clothes dan buy_electronic relatif sama. Jumlah member yang memberikan respon negatif pada kelas “0” lebih banyak dibandingkan member yang memberikan respon positif. Sementara itu, sebaran kelas peubah response pada kelas “1” relatif sama. Diagram batang menunjukkan bahwa pola sebaran peubah buy_electronic dan buy_clothes¬ relatif sama.

Berdasarkan plot diatas, terlihat bahwa sebagian besar member cenderung membeli makanan (buy_food). Sebagian besar member yang membeli makanan memberikan response negatif terhadap promo, sementara sebaran kelas response pada member yang tidak membeli makanan cenderung sama. Hal tersebut sama halnya dengan sebaran kelas response pada masing-masing kelas peubah buy_toiletries. Disisi lain, pada peubah buy_groceries sebagian besar member yang tidak membeli bahan makanan melakukan penolakan terhadap promo. Berdasarkan plot data diatas, terlihat bahwa makanan dan alat kamar mandi merupakan produk yang sering dibeli oleh member supermarket

Selain melihat sebaran peubah penjelas, eksplorasi juga dilakukan untuk melihat hubungan antar peubah numerik. Hal tersebut dilakukan untuk mengidentifikasi ada tidaknya hubungan antar peubah yang dapat menyebabkan adanya kasus multikolinieritas pada peubah penjelas

# Mencari korelasi peubah numerik
corrplot::corrplot(cor(mdata[,c(3:10,19)]),
                   method= "number", type = "lower")
Berdasarkan plot data diatas, terdapat beberapa peubah yang berkorelasi positif kuat. Peubah tersebut yaitu spending_last_1mo, spending_last_2mo, dan spending_last_3mo. Secara lebih jelas, pola hubungan ketiga peubah tersebut dapat dilihat secara lebih jelas pada plot dibawah ini.
par(mfrow=c(1,3))
plot(spending_last_1mo, spending_last_2mo, main = "(1)")
plot(spending_last_2mo, spending_last_3mo,main = "(2)")
plot(spending_last_1mo, spending_last_3mo, main = "(3)")

Gambar (1) menunjukkan diagram pencar spending_last_1mo dan spending_last_2mo . Gambar (2) menunjukkan diagram pencar spending_last_2mo dan spending_last_3mo . Gambar (3) menunjukkan diagram pencar spending_last_1mo dan spending_last_3mo . Berdasarkan plot diatas, terlihat bahwa terdapat member yang tidak melakukan belanja pada antara bulan 1(satu), 2(dua), dan 3(tiga) secara kontinu. Hal tersebut terlihat dari adanya member dengan total belanja Rp.0 pada bulan satu (tidak melakukan pembelian barang), namun melakukan pembelian barang pada bulan lainnya. Oleh karena itu, perlu dilakukan identifikasi untuk menentukan member yang konsisten (loyal) untuk belanja di supermarket S-Mart dan tidak. Hal tersebut akan dibahas secara rinci pada sub bab feature engineering.

Pra-proses Data

Pra-proses data merupakan tahapan penting dalam pemodelan. Pada tahap ini, penulis melakukan persiapan data yang akan digunakan untuk pemodelan. Tahapan pra-proses data diawali dengan melakukan pengecekan missing value pada data. Berdasarkan hasil yang diperoleh, tidak terdapat missing value pada data.
anyNA(mdata)
## [1] FALSE
Selanjutnya, penulis melakukan seleksi peubah untuk menentukan peubah yang akan dimasukkan dalam model dan tidak. Berdasarkan hasil eksplorasi data yang telah dibahas sebelumnya, terdapat beberapa peubah yang tidak dimasukkan dalam model karena kurang baik dalam menggambarkan karakter kelas pada peubah response, antara lain peubah visit_last_1mo, age, recency_last_visit, dan buy_clothes. Selain itu, penulis juga membentuk peubah penjelas baru berdasarkan karakteristik peubah penjelas yang telah diindentifikasi sebelumnya. Hal tersebut akan dibahas secara lebih detail pada sub bab Feature Engineering
# Menghapus peubah yang tidak digunakan dalam model
mdata$age<- NULL
mdata$visit_last_1mo<- NULL
mdata$recency_last_visit<- NULL
mdata$buy_clothes<- NULL

Feature Engineering

Seperti yang telah dibahas sebelumnya, berdasarkan Gambar 3 terlihat bahwa sebaran total belanja member pada 1 (satu), 2 (dua), dan 3 (tiga) bulan yang lalu memiliki karakteristik yang sama. Hal tersebut menunjukkan bahwa member S-Mart cenderung konsisten dalam membelanjakan uang setiap bulannya. Oleh karena itu, penulis membentuk peubah baru yang berisi rata-rata belanja member pada 1 (satu), 2 (dua), dan 3 (tiga) bulan yang lalu. Peubah rata-rata belanja tersebut telah mampu menggambarkan kontribusi tiga peubah terhadap model. Oleh karena itu, penulis menghilangkan peubah spending_last_1mo, spending_last_2mo, dan spending_last_3mo karena telah digambarkan oleh peubah baru rata-rata belanja. Penyatuan peubah tersebut dapat mengurangi biaya komputasi pemodelan.
# Membentuk peubah baru "rata-rata belanja"
mdata$rata2_belanja<- rowMeans(data.frame(spending_last_1mo, spending_last_2mo,spending_last_3mo))
# Melihat sebaran pada masing-masing kelas peubah respon
ggplot(data=mdata, aes(x= rata2_belanja, group=response, fill=response)) +
  geom_boxplot()

# Menghapus peubah yang tidak digunakan dalam model
mdata$spending_last_1mo<- NULL
mdata$spending_last_2mo<- NULL
mdata$spending_last_3mo<- NULL

Berdasarkan boxplot diatas, terlihat bahwa bentuk sebaran rata-rata belanja memiliki pola yang sama dengan sebaran peubah spending_last_1mo, spending_last_2mo, dan spending_last_3mo pada masing-masing kelas response.

Peubah lain yang dibentuk berdasarkan karakteristik data yaitu peubah konsistensi belanja.Scatter plot peubah spending amount menunjukkan bahwa tidak semua member melakukan belanja rutin setiap bulan dalam tiga bulan terakhir di supermarket. Oleh karena itu, penulis membentuk peubah kategorik baru yaitu “konsistensi belanja”, dengan kelas “0” yang berarti “tidak konsisten” dan “1” yang berarti “konsisten”. Penentuan kelas tersebut mengikuti aturan, jika terdapat total belanja Rp.0 pada tiga bulan tersebut, maka member masuk pada kelas “0” (tidak konsisten). Selainnya, member masuk kelas “1” (konsisten).

# Membentuk peubah baru "konsistensi belanja"
spending <- data.frame(spending_last_1mo, spending_last_2mo, spending_last_3mo)
konsistensi<-c()
for (i in 1:nrow(mdata)) {
  if(any(spending[i,]==0)){konsistensi[i]<- "0"} else {konsistensi[i]<- "1"}
}
mdata$konsistensi<- konsistensi
# Melihat sebaran masing-masing kelas peubah respon
ggplot(data=mdata, aes(x= as.factor(konsistensi), group=response, fill=response)) + geom_bar(alpha=.7) +
  scale_fill_viridis(discrete = T)+
  theme_classic()+
  xlab("konsistensi belanja")

Plot data diatas menunjukkan sebaran peubah response pada masing-masing kelas peubah konsistensi. Berdasarkan diagram batang tersebut, terlihat bahwa member yang tidak konsisten belanja di supermarket cenderung melakukan penolakan terhadap promo yang ditawarkan. Sementara itu, sebaran kelas peubah response pad member yang melakukan belanja secara konsisten cenderung sama.Hal tersebut menunjukkan bahwa peubah konsistensi cukup baik dalam menggambarkan kelas peubah response.

Demikian pembahasan terkait eksplorasi data, pra-proses, dan feature engineering. Tutorial pemodelan dapat disimak pada link yang telah tersedia. Semoga bermanfaat.