Eksplorasi data, pra-proses data, dan feature engineering (https://rpubs.com/statedu/eda)
Pemodelan menggunakan Regresi Logistik(https://rpubs.com/statedu/regresi-logistik)
Pemodelan menggunakan Decision Tree(https://rpubs.com/statedu/decision-tree)
Pemodelan menggunakan Random Forest(https://rpubs.com/statedu/random-forest)
Pemodelan menggunakan Bagging(https://rpubs.com/statedu/bagging)
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).# 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)
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)
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)
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)
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")
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)")
anyNA(mdata)
## [1] FALSE
# Menghapus peubah yang tidak digunakan dalam model
mdata$age<- NULL
mdata$visit_last_1mo<- NULL
mdata$recency_last_visit<- NULL
mdata$buy_clothes<- NULL
# 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.