Perdagangan elektronik (e-commerce) telah menjadi salah satu sektor bisnis paling dinamis dan berkembang pesat di era digital. Menurut laporan terbaru dari firma riset We Are Social, sebanyak 178,9 juta masayarakat Indonesia berbelanja online sepanjang 2022 hingga awal 2023. Angka itu naik 12,8% secara tahun-ke-tahun (YoY). Adapun estimasi nilai belanja online warga RI sepanjang tahun lalu sebesar US$55,97 miliar atau Rp 851 triliun, dikutip CNBC Indonesia, Rabu (15/2/2023). Perkembangan teknologi dan akses mudah ke internet telah mengubah cara konsumen berbelanja, membuat e-commerce menjadi pilihan utama bagi banyak orang dalam melakukan transaksi.
Perusahaan e-commerce menghadapi tantangan besar dalam mengelola data transaksi pelanggan yang semakin besar dan kompleks. Seiring dengan pertumbuhan pesat e-commerce, jumlah transaksi yang terjadi setiap harinya meningkat pesat, menciptakan volume data yang luar biasa besar. Data-data ini mencakup berbagai informasi penting seperti detail produk yang dibeli, jumlah pembayaran, tanggal dan waktu transaksi, serta data identitas pelanggan. Kompleksitas data ini semakin meningkat karena perusahaan juga harus mengelola informasi dari berbagai platform dan kanal penjualan, termasuk situs web, aplikasi seluler, dan media sosial. Mengelola dan menganalisis data ini secara efisien menjadi kunci dalam memahami perilaku konsumen, mengoptimalkan strategi pemasaran, dan meningkatkan pengalaman pelanggan. Perusahaan e-commerce harus menghadapi tantangan dalam menyimpan, mengintegrasikan, dan mengolah data tersebut dengan cara yang tepat guna mengambil keputusan yang cerdas dan berbasis data untuk tetap kompetitif dalam industri yang semakin ketat.
Data invoice menjadi elemen kunci dalam menyimpan informasi tentang setiap transaksi pembelian yang dilakukan oleh pelanggan. Data tersebut mencakup detail produk yang dibeli, harga, tanggal transaksi, dan informasi pelanggan lainnya. Dengan tingginya volume transaksi dan variasi data dalam e-commerce, perusahaan membutuhkan cara efektif untuk memanfaatkan data invoice ini agar dapat mendapatkan wawasan berharga tentang perilaku pelanggan dan tren pasar. Terdapat beberapa cara seperti customer segmentation, product recommendation, serta forecasting berdasarkan data invoice untuk mendukung pengambilan keputusan bisnis yang lebih cerdas dan tepat sasaran.
Segmentasi pelanggan menjadi salah satu langkah kritis bagi perusahaan e-commerce untuk memahami dan mengelola beragam karakteristik dan preferensi pelanggan mereka. Dengan menggunakan teknik customer segmentation, perusahaan dapat mengelompokkan pelanggan ke dalam segmen-segmen homogen berdasarkan pola pembelian, preferensi produk, tingkat pengeluaran, dan perilaku lainnya. Hasil segmentasi akan membantu perusahaan untuk menyusun strategi pemasaran yang lebih tepat sasaran dan menyesuaikan penawaran produk sesuai dengan kebutuhan masing-masing kelompok pelanggan.
Pada dasarnya, product recommendation adalah sistem pemfilteran yang berupaya memprediksi dan menampilkan item yang ingin dibeli pengguna. Sistem ini dapat dibuat melalui beberapa cara, misal riwayat belanja, riwayat pencarian yang dapat dihubungkan terhadap trend, dan biodata pelanggan. Melalui sistem product recommendation, probabilitas pembelian yang dilakukan oleh pelanggan atau pengguna akan semakin meningkat. Penerapan sistem ini akan memberikan keuntungan bagi ke dua belah pihak, yakni mempermudah pengguna untuk mencari produk yang disukainya dan perusahaan akan mendapat keuntungan dengan pembelian yang dilakukan pelanggan.
Dalam industri e-commerce yang sangat dinamis, kemampuan untuk meramalkan permintaan produk dengan akurat menjadi kunci untuk mengoptimalkan persediaan dan menghadapi fluktuasi pasar. Dengan metode peramalan yang canggih, seperti model Prophet, perusahaan dapat memproyeksikan jumlah penjualan produk di masa depan berdasarkan data historis. Dengan adanya peramalan yang tepat, perusahaan dapat menghindari risiko stok habis atau kelebihan stok yang dapat menyebabkan kerugian dan meningkatkan efisiensi rantai pasok.
Perusahaan e-commerce memerlukan strategi bisnis agar dapat mengembangkan bisnisnya menjadi lebih baik dan mendapatkan pendapatan lebih besar. Data riwayat belanja e-commerce menjadi salah satu kunci utama untuk memahami dan mengelola pelanggan dengan lebih baik, merencanakan strategi bisnis yang lebih efektif, dan meningkatkan pengalaman pelanggan. Namun, data riwayat belanja pelanggan memiliki volume yang sangat besar. Pengambilan keputusan berdasarkan data riwayat belanja tersebut memerlukan cara yang efisien dan efektif. Kegagalan perusahaan dalam mengolah data tersebut hingga menyebabkan kesalahan pengambilan keputusan bisnis akan menyebabkan hilangnya pelanggan hingga bangkrutnya perusahaan.
Perusahaan memerlukan metode untuk pengelompokan pelanggan. Contoh ekstrim, Bagaimana jika kampanye yang sama diterapkan pada semua pelanggan, baik aktif maupun non aktif?. Tentu, jawabannya strategi kampanye mereka sangat salah. Perusahaan perlu untuk mengenali karakteristik pelanggan dan kemudian melakukan berbagai strategi yang sesuai dengan kelompok-kelompok tersebut. Sehingga perusahaan dapat mengoptimasi strategi kampanye pemasaran yang mereka lakukan. Perusahaan juga memerlukan cara agar kemungkinan purchase yang dilakukan oleh pelanggan itu semakin meningkat. Maka perusahaan juga perlu untuk mengetahui barang-barang yang mungkin disukai oleh pelanggan. Lebih dari itu, program kampanye yang dilakukan oleh perusahaan akan lebih efektif jika dilakukan terhadap produk-produk yang disukai oleh pelanggan. Dan tentu, perusahaan juga harus mampu menyiapkan ketersediaan produk-produk barang yang disukai oleh pelanggan. Perusahaan dituntut untuk mampu memprediksi kemungkinan produk-produk yang akan benyak permintaan. Sehingga, tiga kebutuhan atau permasalahan yang terdapat dalam perusahaan ini saling melengkapi jika dapat teratasi. Keberhasilan perusahaan memenuhi tiga kebutuhan tersebut akan meningkatkan pendapatan dan keberlangsungan bisnis mereka.
Ide pada projek ini adalah melakukan analisis melalui data riwayat belanja e-commerce. Analisis dilakukan melalui pembuatan model machine learning customer segmentation. Melalui customer segmentation kita dapat memberikan perbedaan kampanye, diskon, dan sebagainya pada segmen-segmen pelanggan yang dikehendaki. Selanjutnya, sistem produk rekomendasi akan dibuat untuk meningkatkan kemungkinan transaksi oleh pelanggan. Sistem produk rekomendasi dapat dibuat melalui data riwayat belanja pelanggan atau menggunakan metode collaborative Filtering (CF). Kemudian, project ini akan melakukan prediksi melalui algoritma forecasting agar dapat menyiapkan kategori-kategori produk yang kedepannya akan banyak permintaan.
Pada project ini akan digunakan sebuah data riwayat jual beli dari e-commerce di Pakistan yang diambil dari situs Kaggle dengan judul Pakistan’s Largest E-Commerce Dataset. Dataset ini merupakan kumpulan riwayat pesanan/transaksi dari beberapa merchant di e-commerce mulai Maret 2016 hingga Agustus 2018. Adapun dataset ini terdiri atas beberapa informasi inti sebagai berikut: (NB: Pemilik dataset tidak memberikan deskripsi dari tiap kolom yang diberikan)
Pembuatan model akan menggunakan algoritma klasifikasi unsupervised machine learning K-means untuk customer segmentation. Selanjutnya, sistem produk rekomendasi akan dibuat berdasarkan data history belanja pelanggan dengan mencoba beberapa metode yaitu Item-based Collaborative Filtering, User-based Collaborative Filtering, dan Association Rules serta menerapkan beberapa pendekatan, yakni pearson correlation, consine similarity dan jaccard distance. Adapun algoritma yang digunakan untuk menetukan produk yang akan direkomendasikan adalah KNN. Kemudian, forecasting akan menggunakan algoritma prophet untuk memprediksi kategori-kategori produk yang kedepannya akan banyak permintaan.
Output dari project ini berupa dashboard analysis yang menampilkan Bussines background hingga analisis hasil modelling yang meliputi customer segmentation, product recommendation, dan forecasting. Harapannya, perusahaan dapat meningkatkan value customer hingga memperkecil terjadinya pembatalan pesanan, serta dapat mempersiapkan/memperkirakan kategori produk yang ke depannya akan banyak permintaan.
Business Impact: Projek ini dapat diterapkan pada berbagai perusahan e-commerce untuk meningkatkan value customer mereka. Mengingat banyaknya e-commerce yang sedang berkembang, meliputi bidang retail, travel, layanan transportasi, layanan kartu perdana, dan sebagainya, maka harapannya projek ini dapat diimplementasikan dengan baik dan menjadi cara perusahaan untuk meningkatkan nilai bisnis mereka.
Tahap Dataset Action
yang dimaksud pada proposal ini ialah melakukan exploratory dataset yang dipilih hingga gambaran projek akhir yang akan disajikan. Adapun tujuan Dataset Action
ialah memastikan dataset yang dipilih sesuai dengan tujuan bisnis yang hendak dicapai serta memberikan gambaran secara gamblang terkait produk akhir pada projek ini.
Data terdiri atas 1.048.5775 baris dengan 26 kolom. Sebanyak empat kolom terakhir hanya berisi missing value
.
Pemilik tidak memberikan deskripsi dari tiap kolom pada dataset yang diberikan. Selain itu, nama kolom pada dataset berbeda dengan nama kolom yang disebutkan oleh pemilik dataset dan jumlahnya jauh lebih banyak. Pemilik dataset juga menyatakan bahwa data hanya terdiri dari kurang lebih setengah juta baris. Maka, kita akan coba mencari tahu isi dari tiap kolomnya dan memberikan deskripsi dari tiap kolom.
Sebelumnya, nama kolom kita sesuaikan terlebih dulu dengan nama kolom yang diberikan oleh pemilik, karena lebih mudah dipahami.
# Merubah beberapa nama kolom agar sesuai dengan deskripsi
data <- data %>%
rename("Item_ID" = "item_id",
"Order_Status" = "status",
"Date_of_Order" = "created_at",
"SKU" = "sku",
"Price" = "price",
"Quantity" = "qty_ordered",
"Grand_Total" = "grand_total",
"Category" = "category_name_1",
"Payment_Method" = "payment_method",
"Customer_ID" = "Customer.ID")
data
Kemudian, mari kita buang lima kolom terakhir yang hanya berisi missing_values
. Kolom-kolom tersebut diawali dengna nama “X”
# Membuang lima kolom terakhir yang hanya berisi missing value
data <- data %>%
select(-starts_with("X"))
glimpse(data)
#> Rows: 1,048,575
#> Columns: 21
#> $ Item_ID <int> 211131, 211133, 211134, 211135, 211136, 211137, ~
#> $ Order_Status <chr> "complete", "canceled", "canceled", "complete", ~
#> $ Date_of_Order <chr> "7/1/2016", "7/1/2016", "7/1/2016", "7/1/2016", ~
#> $ SKU <chr> "kreations_YI 06-L", "kcc_Buy 2 Frey Air Freshen~
#> $ Price <dbl> 1950.00, 240.00, 2450.00, 360.00, 555.00, 80.00,~
#> $ Quantity <int> 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ~
#> $ Grand_Total <dbl> 1950.00, 240.00, 2450.00, 60.00, 1110.00, 80.00,~
#> $ increment_id <chr> "100147443", "100147444", "100147445", "10014744~
#> $ Category <chr> "Women's Fashion", "Beauty & Grooming", "Women's~
#> $ sales_commission_code <chr> "\\N", "\\N", "\\N", "R-FSD-52352", "\\N", "\\N"~
#> $ discount_amount <dbl> 0, 0, 0, 300, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0,~
#> $ Payment_Method <chr> "cod", "cod", "cod", "cod", "cod", "cod", "cod",~
#> $ Working.Date <chr> "7/1/2016", "7/1/2016", "7/1/2016", "7/1/2016", ~
#> $ BI.Status <chr> "#REF!", "Gross", "Gross", "Net", "Valid", "Gros~
#> $ MV <chr> " 1,950 ", " 240 ", " 2,450 ", " 360 ", " 1,110 ~
#> $ Year <int> 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, ~
#> $ Month <int> 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, ~
#> $ Customer.Since <chr> "2016-7", "2016-7", "2016-7", "2016-7", "2016-7"~
#> $ M.Y <chr> "7-2016", "7-2016", "7-2016", "7-2016", "7-2016"~
#> $ FY <chr> "FY17", "FY17", "FY17", "FY17", "FY17", "FY17", ~
#> $ Customer_ID <chr> "1", "2", "3", "4", "5", "6", "7", "6", "8", "8"~
#> Item_ID Order_Status Date_of_Order SKU
#> Min. :211131 Length:1048575 Length:1048575 Length:1048575
#> 1st Qu.:395001 Class :character Class :character Class :character
#> Median :568425 Mode :character Mode :character Mode :character
#> Mean :565667
#> 3rd Qu.:739106
#> Max. :905208
#> NA's :464051
#> Price Quantity Grand_Total increment_id
#> Min. : 0 Min. : 1.0 Min. : -1594 Length:1048575
#> 1st Qu.: 360 1st Qu.: 1.0 1st Qu.: 945 Class :character
#> Median : 899 Median : 1.0 Median : 1960 Mode :character
#> Mean : 6349 Mean : 1.3 Mean : 8531
#> 3rd Qu.: 4070 3rd Qu.: 1.0 3rd Qu.: 6999
#> Max. :1012626 Max. :1000.0 Max. :17888000
#> NA's :464051 NA's :464051 NA's :464051
#> Category sales_commission_code discount_amount Payment_Method
#> Length:1048575 Length:1048575 Min. : -599.5 Length:1048575
#> Class :character Class :character 1st Qu.: 0.0 Class :character
#> Mode :character Mode :character Median : 0.0 Mode :character
#> Mean : 499.5
#> 3rd Qu.: 160.5
#> Max. :90300.0
#> NA's :464051
#> Working.Date BI.Status MV Year
#> Length:1048575 Length:1048575 Length:1048575 Min. :2016
#> Class :character Class :character Class :character 1st Qu.:2017
#> Mode :character Mode :character Mode :character Median :2017
#> Mean :2017
#> 3rd Qu.:2018
#> Max. :2018
#> NA's :464051
#> Month Customer.Since M.Y FY
#> Min. : 1.0 Length:1048575 Length:1048575 Length:1048575
#> 1st Qu.: 4.0 Class :character Class :character Class :character
#> Median : 7.0 Mode :character Mode :character Mode :character
#> Mean : 7.2
#> 3rd Qu.:11.0
#> Max. :12.0
#> NA's :464051
#> Customer_ID
#> Length:1048575
#> Class :character
#> Mode :character
#>
#>
#>
#>
Berdasarkan inspeksi data melalui glimpse()
dan summary()
dapat kita ketahui bersama, bahwasanya sebanyak 464.051 baris dari data kita ialah missing_values
. Maka, kita akan membuang baris tersebut.
#> [1] 584524 21
Data setelah dibuang tersisa 584.524 baris dengan 21 kolom. Kemudian, mari kita cek bersama terkait adanya nilai duplikat pada dataset kita. Namun, mari kita coba cek terlebih dahulu nilai unik dari kolom Item_ID
karena ada kemungkinan kolom tersebut hanya sebuah indeks baris yang bersifat unik.
#> [1] 584524
Dapat dipastikan bahwa kolom Item_ID
adalah indeks dari baris, karena bersifat unik pada tiap barisnya. Maka, pada pengecekan data duplikat kita akan mengecualikan kolom Item_ID
.
# Melakukan pengecekan keterkaitan adanya data yang duplikat
any(duplicated(data %>% select(-Item_ID)))
#> [1] TRUE
Ternyata terdapat baris yang merupakan duplikat dari baris lainnya, maka kita akan lakukan pembuangan terhadap data duplikat tersebut. Pembuangan data duplikasi ini dikarenakan setidaknya kolom increment_id
yang penulis duga secara kuat adalah identitas dari riwayat traksaksi atau yang umum dikenal invoice_id
, seharusnya bersifat unik.
Mengapa penulis menduga kuat increment_id
adalah invoice_id
?
jika kita meninjau dataset pada satu increment_id
, kita akan mendapatkan bahwa terdapat data pada satu nilai unik increment_id
memiliki beberapa baris dengan nilai Grand_Total
yang sama pada Category
dan Customer_ID
yang sama juga, itu terdiri dari beberapa SKU
yang berbeda dengan Price
dan discount_amount
yang berbeda tergantung SKU
-nya. Sehingga, penulis menduga kuat terkait makna increment_id
adalah invoice_id
.
#> [1] FALSE
Selanjutnya, jumlah nilai unik pada tiap kolom yang bertipe data character dicek terlebih dahulu.
# Melakukan pengecakan jumlah nilai unik dari setiap kolom yang bertipe data "character"
# Prosedur pengecekan dengan Looping
for (i in 1:20){
if (class(data[,i]) == "character"){
cat("kolom",c(colnames(data))[i],"memiliki nilai unik:", as.character(length(unique(data[,i]))), "(", as.character(round(length(unique(data[,i]))/nrow(data)*100, 2)), "% dari total data )","\n")
}else {
next
}
}
#> kolom Order_Status memiliki nilai unik: 17 ( 0 % dari total data )
#> kolom Date_of_Order memiliki nilai unik: 789 ( 0.14 % dari total data )
#> kolom SKU memiliki nilai unik: 84890 ( 14.53 % dari total data )
#> kolom increment_id memiliki nilai unik: 408782 ( 69.96 % dari total data )
#> kolom Category memiliki nilai unik: 17 ( 0 % dari total data )
#> kolom sales_commission_code memiliki nilai unik: 7228 ( 1.24 % dari total data )
#> kolom Payment_Method memiliki nilai unik: 18 ( 0 % dari total data )
#> kolom Working.Date memiliki nilai unik: 789 ( 0.14 % dari total data )
#> kolom BI.Status memiliki nilai unik: 4 ( 0 % dari total data )
#> kolom MV memiliki nilai unik: 9720 ( 1.66 % dari total data )
#> kolom Customer.Since memiliki nilai unik: 27 ( 0 % dari total data )
#> kolom M.Y memiliki nilai unik: 26 ( 0 % dari total data )
#> kolom FY memiliki nilai unik: 3 ( 0 % dari total data )
#> kolom Customer_ID memiliki nilai unik: 115327 ( 19.74 % dari total data )
Selanjutnya mari kita cek terlebih dahulu nilai unik dati tiap kolomnya, dan akan dilakukan pembuangan pada baris dengan nilai unik yang tidak relevan pada tiap kolomnya.
#> [1] "#REF!" "Gross" "Net" "Valid"
#> [1] "complete" "canceled" "order_refunded" "received"
#> [5] "refund" "closed" "fraud" "holded"
#> [9] "exchange" "pending_paypal" "paid" "\\N"
#> [13] "cod" "pending" "" "processing"
#> [17] "payment_review"
Jika mengingat penjelasan dari pemilik data, seharusnya hanya terdapat tiga nilai unik pada kolom Order_Status
. Pada kali ini, jumlah baris yang bernilai “complete”, “canceled”, “refund” pada kolom Order_Status
dicek terlebih dahulu untuk menentukan terkait pembuangan baris dengan nilai yang lainnya.
#> [1] 584330
#> [1] 442863
#> [1] 0.7578988
Karena jumlah data masih banyak maka dilakukan pembuangan baris pada kolom status
yang tidak bernilai “complete”, “canceled”, “refund”. Namun, kita akan mengecualikan juga untuk “order_refunded”. Nilai “order_refunded” akan dirubah menjadi “refund”.
data <- data %>%
filter(Order_Status %in% c("complete", "canceled", "refund", "order_refunded", "received")) %>%
mutate(Order_Status = ifelse(Order_Status == "order_refunded",
"refund",
Order_Status),
Order_Status = ifelse(Order_Status == "received",
"refund",
Order_Status),)
Selanjutnya, mari kita coba cari tahu terkait deskripsi dari kolom BI.Status
. Mari kita coba dengan cara menghubungkan nilai dari BI.Status
terhadap Order_Status
.
Pada kesempatan ini, saya akan mencoba membuat dataset dari tiap-tiap nilai dari kolom BI.Status
dengan Order_Status
.
# Mengetahui makna lebih lanjut terkait deskripsi kolom BI.Status dengan
# Dataset 'gross' ==> `BI.Status` hanya berisi nilai "Gross"
gross <- data %>%
filter(BI.Status == "Gross") %>% # Menyaring baris pada kolom "BI.Status" yang hanya bernilai "Gross"
select(Order_Status, BI.Status) # Mengambil kolom `BI.Status` dan `Order_Status` saja
# Dataset 'net' ==> `BI.Status` hanya berisi nilai "Net"
net <- data %>%
filter(BI.Status == "Net") %>% # Menyaring baris pada kolom "BI.Status" yang hanya bernilai "Net"
select(Order_Status, BI.Status) # Mengambil kolom `BI.Status` dan `Order_Status` saja
# Dataset 'valid' ==> `BI.Status` hanya berisi nilai "Valid"
valid <- data %>%
filter(BI.Status == "Valid") %>% # Menyaring baris pada kolom "BI.Status" yang hanya bernilai "Valid"
select(Order_Status, BI.Status) # Mengambil kolom `BI.Status` dan `Order_Status` saja
terkhusus pada baris yang bernilai “#REF!” mari kita cek secara terpisah.
Ternyata hanya terdapat satu baris saja yang bernilai “#REF!”, maka akan kita buang baris tersebut.
Selanjutnya, mari kita coba cek lebih lanjut terkait dataset gross
, net
, dan valid
yang telah kita buat sebelumnya.
#> [1] TRUE
#> [1] TRUE
#> [1] TRUE
Dari hasil inpeksi diatas, kita dapat mengetahui makna dari nilai pada kolom BI.Status
adalah representasi dari kolom Order_Status
dengan ketentuan sebagai berikut:
BI.Status
= “Gross” ====> Order_Status
= “canceled”BI.Status
= “Net” ====> Order_Status
= “complete”BI.Status
= “Valid” ====> Order_Status
= “refund”.Selanjutnya, mari kita coba untuk mengecek apakah nilai dari kolom Working.Date
itu sama persis dengan kolom Date_of_Order
.
# Mengecek nilai kolom Date_of_Order dan Working.Date apakah sama persis
all(data$Date_of_Order == data$Working.Date)
#> [1] TRUE
Karena nilai dari kolom Working.Date
itu sama persis dengan kolom Date_of_Order
, maka kita akan membuang kolom tersebut.
Selanjutnya, mari kita coba cari tahu lebih mendetail terkait kolom Category
. Adakalanya kolom tersebut merupakan kategori dari produk atau kategori dari toko di e-commerce. Praduga tersebut muncul karena baris yang bernilai soghaat
pada kolom Category
sepertinya merupakan kategori dari toko di e-commerce yang menjual roti di pakistan. Selain itu, terdapat baris yang bernilai superstore
juga.
Dari gambar diatas, dapat kita ketahui bahwa
soghaat
merupakan toko yang menjual semacam roti dan manisan. selanjutnya, coba kita lihat nilai unik dari kolomCategory
#> [1] "Beauty & Grooming" "Women's Fashion" "Soghaat"
#> [4] "Mobiles & Tablets" "Appliances" "Home & Living"
#> [7] "Men's Fashion" "Kids & Baby" "\\N"
#> [10] "Others" "Entertainment" "Computing"
#> [13] "Superstore" "Health & Sports" "Books"
#> [16] "School & Education" ""
Dikarenakan nilai “\N”, "“,”Others" pada kolom Category
itu produknya bercampur dan tidak dapat diidentifikasi termasuk merchants dengan kategori penjualan produk apa, maka baris-baris tersebut akan dibuang.
# Membuang nilai "", "Others" dan "\\N" pada kolom "Category"
data <- data %>%
filter(Category != "", Category != "\\N", Category != "Others")
Maka dengan ini dapat kita ketahui bahwa kolom Category
ialah merujuk dari jenis/karakter merchants pada e-commerce. Sebelumnya mari kita rubah kategori “Soghaat” pada kolom Category
menjadi “Sweet & Bakers” agar lebih intuitif.
# Merubah nilai "Soghaat" mejadi "Sweet & Bakers" pada kolom `Category`
data$Category <- ifelse(data$Category == "Soghaat", "Sweet & Bakers", data$Category)
Selanjutnya mari kita coba cek nilai pada kolom SKU
apakah bersifat unik atau berbeda pada kategori merchants yang berbeda. Seharusnya bersifat unik, jika tidak unik pada merchants yang berbeda maka terdapat kesalahan atau data harus dihapus.
# Inspeksi keunikan baris dari kolom `SKU` dari satu kategori merchants terhadap yang lainnya
data %>%
group_by(Category) %>%
summarise(unik_sku = unique(SKU)) %>%
ungroup() %>%
select(unik_sku) %>%
duplicated() %>%
any()
#> [1] TRUE
data %>%
group_by(Category) %>%
summarise(unik_sku = unique(SKU)) %>%
ungroup() %>%
select(unik_sku) %>%
duplicated() %>%
which()
#> [1] 67322 70807
data_dupli <- data %>%
group_by(Category) %>%
summarise(unik_sku = unique(SKU)) %>%
ungroup() %>%
select(unik_sku)
data_dupli[c(67322, 70807),]
Tidak terdapat duplikasi nilai unik SKU
dari masing-masing kategori merchants, artinya tiap produk dari satu kategori merchants dengan merchants yang lain memiliki nilai SKU
yang berbeda.
Sekarang, mari kita tentukan deskripsi dari tiap kolom berdasarkan hasil inspeksi yang telah kita lakukan. Sebelumnya, kita tinjau kembali dataset kita setelah dilakukan beberapa permbersihan.
Berdasarkan nilai dari kolom dan berbagai inspeksi yang telah dilakukan, dapat diperkirakan bahwa deskripsi dari kolom sebagai berikut:
Order_Status
: Status dari pembelian (Completed, Cancelled, Refund)Date_of_Order
: Tanggal pemesanan produkSKU
: Barcode, kode, atau nama unik yang mewakili produk tertentuPrice
: Harga produkQuantity
: Jumlah dari produk yang dibeliGrand_Total
: Total pembayaran yang diberikan oleh pelanggan dalam satu Invoiceincrement_id
: Id dari invoiceCategory
: Kategori merchant E-Commercediscount_amount
: Nilai diskon yang didapatkan pelanggan pada tiap produkPayment_Method
: Metode pembayaranBI.Status
: Representasi kolom Order_Status
MV
: hasil perkalian antara kolom Price
dengan Quantity
Year
: Tahun, nilai ini didapat dari Date_of_Order
Month
: Bulan, nilai ini didapat dari Date_of_Order
Customer.Since
: Riwayat belanja pertama kali yang dilakukan oleh pelangganM.Y
: Bulan-Tahun, nilai ini didapat dari Date_of_Order
yang merupakan gabungan dari kolom Year
dan Month
Customer_ID
: ID dari pelangganTerdapat beberapa kolom yang belum diketahui secara pasti maknanya, yakni:
sales_commission_code
FY
Dua kolom yang tidak diketahui maknanya akan dibuang, karena kita tidak dapat menggunakan kolom tersebut, sebagai akibat tidak tahu maknanya.
Selanjutunya, kita akan merubah beberapa nama kolom agar lebih intuitif serta menyamakan cara penulisan kolom.
data <- data %>%
rename("Invoice_ID" = "increment_id",
"Discount_Amount" = "discount_amount",
"BI_Status" = "BI.Status",
"Revenue" = "MV",
"Customer_Since" = "Customer.Since",
"Month_Year" = "M.Y")
Kita juga akan mengisi ulang baris dari beberapa kolom untuk memastikan isinya telah benar atau tepat. Kolom-kolom tersebut ialah Month
, Year
, dan Month_Year
.
Selanjutnya kita akan mencoba memahami lebih baik pada kolom Price
, Quantity
, Grand_Total
, Discount_Amount
, Payment_Method
, dan Revenue
.
Pada kolom Grand_Total
terdapat nilai 0, padahal kolom tersebut bermakna jumlah yang dibayarkan oleh pelanggan dalam satu invoice. Mari kita cari tahu penyebabnya bersama.
# Mengecek jumlah baris dengan syarat kolom grand_total bernilai 0
data %>%
filter(Grand_Total == 0) %>%
nrow()
#> [1] 8959
# Mengecek jumlah baris dengan syarat kolom grand_total dan diskonya bernilai 0
data %>%
filter(Grand_Total == 0 & Discount_Amount == 0) %>%
nrow()
#> [1] 6249
#> [1] 0.6975109
Terdapat 8.959 baris dengan grand_total bernilai 0. Adapun baris dengan nilai grand_total dan diskon adalah 0 terdapat sebanyak 6.249 baris. Data tersebut menunjukkan bahwasannya sebanyak 69,75% data dengan grand_total adalah 0 itu juga tidak mendapatkan diskon.
Lantas, apakah yang menyebabkan grand_total bernilai 0? inspeksi lebih lanjut dilakukan terhadap metode pembayaran yang dilakukan.
# Melihat metode pembayaran dari baris dengan kolom grand_total dan diskonya bernilai 0
data %>%
filter(Grand_Total == 0 & Discount_Amount == 0) %>%
group_by(Payment_Method) %>%
summarise(frek = length(unique(Invoice_ID))) %>%
arrange(-frek) %>%
ggplot(aes(y = frek, x = reorder(Payment_Method, -frek),
fill = Payment_Method)) +
geom_col() +
scale_fill_ordinal()+
geom_text(aes(label = frek),
vjust = -0.3,
size = 5) +
labs(title = "Metode Pembayaran oleh Pelanggan yang memiliki total pembayaran dan diskon adalah 0",
subtitle = "Pakistas E-Commerce",
x = "Metode Pembayaran",
y = "Frekuensi") +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(size = 15),
plot.subtitle = element_text(hjust = 0.5))
Metode pembayaran yang dilakukan oleh pelanggan yang memiliki nilai grand_total dan discount_amount adalah 0 didominasi secara kredit.
Selanjutnya, perlu dilakukan peninjauan kembali terhadap pelanggan yang tidak menggunakan pembayaran secara kredit dan diskon yang didapatkan 0 namun total biaya yang ditanggung pelanggan adalah 0.
data %>%
filter(Grand_Total == 0 & Discount_Amount == 0 & Payment_Method %in% c("cod", "Payaxis", "Easypay")) %>%
group_by(Order_Status) %>%
summarise(frek = length(unique(Invoice_ID))) %>%
ggplot(aes(y = frek, x = reorder(Order_Status, -frek), fill = Order_Status)) +
geom_col() +
scale_fill_ordinal()+
geom_text(aes(label = frek),
vjust = -0.3,
size = 5) +
labs(title = "Status Order oleh Pelanggan yang memiliki total pembayaran dan diskon adalah 0",
subtitle = "Pakistas E-Commerce",
x = "Status Pesanan",
y = "Frekuensi") +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(size = 15),
plot.subtitle = element_text(hjust = 0.5))
Ternyata, mayoritas status pesanan dari pelanggan yang memiliki nilai total pembayaran dan diskon adalah 0, dengan metode pembayaran secara “cod”, “Payaxis”, “Easypay” adalah cancel dan refund. Namun, inpeksi dilakukan kembali terhadap yang status pesanan adalah complete.
data %>%
filter(Grand_Total == 0 & Order_Status == "complete" & Discount_Amount == 0 & Payment_Method %in% c("cod", "Payaxis", "Easypay"))
data %>%
filter(Grand_Total == 0 & Order_Status == "complete" & Discount_Amount == 0 & Payment_Method %in% c("cod", "Payaxis", "Easypay")) %>%
mutate (zero_price = ifelse(Price == 0, "Harga Produk 0", "Harga Produk Tidak 0")) %>%
group_by(zero_price) %>%
summarise(frek = length(unique(Invoice_ID))) %>%
ggplot(aes(y = frek, x = reorder(zero_price, -frek), fill = zero_price)) +
geom_col() +
scale_fill_ordinal()+
geom_text(aes(label = frek),
vjust = -0.4,
size = 5) +
labs(title = "Harga produk yang memiliki total pembayaran dan diskon adalah 0",
subtitle = "metode pembayaran non-kredit",
x = NULL,
y = "Frekuensi") +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5, size = 15),
plot.subtitle = element_text(hjust = 0.5))
Dari 22 produk yang mempunyai total biaya belanja yang dibebankan kepada pelanggan dan total diskon adalah 0 dengan pembayaran non kredit, ternyata 14 produknya mempunyai harga 0 dan 8 produk berharga tidak 0. Terkait produk dengan harga tidak 0, masih belum diketahui penyebab suatu pelanggan tetap memiliki total biaya belanja adalah 0. Maka, nantinya masih perlu dilakukan analisa kembali.
Pada saat ini, mari kita tinjau terlebih dahulu pada pelanggan dengan total diskon tidak 0 dengan total biaya belanjanya adalah 0.
data %>%
filter(Grand_Total == 0 & Discount_Amount != 0 & Payment_Method %in% c("cod", "Payaxis", "Easypay")) %>%
group_by(Order_Status) %>%
summarise(frek = length(unique(Invoice_ID))) %>%
ggplot(aes(y = frek, x = reorder(Order_Status, -frek), fill = Order_Status)) +
geom_col() +
scale_fill_ordinal()+
geom_text(aes(label = frek),
vjust = -0.3,
size = 5) +
labs(title = "Status Order Pelanggan yang mendapatkan diskon dengan total pembayaran 0 ",
subtitle = "Pakistas E-Commerce",
x = "Status Pesanan",
y = "Frekuensi") +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(size = 15),
plot.subtitle = element_text(hjust = 0.5))
Sekitar 75% dari total pelanggan yang mendapatkan diskon dan mempunyai total biaya belanja adalah 0 mempunyai status belanja complete. Berbeda dengan ketika pelanggan yang mempunyai total biaya belanja adalah 0 dan tidak mendapatkan diskon, mayoritas dikarenakan pesanan di-cancel atau di-refund.
Selanjutnya, mari kita coba cari tahu lebih lanjut terkait mengapa pelanggan tersebut total biaya belanjanya adalah 0.
data %>%
filter(Grand_Total == 0 & Discount_Amount != 0 & Payment_Method %in% c("cod", "Payaxis", "Easypay")) %>%
mutate(disc_same_price = ifelse(Discount_Amount == Price, "Diskon sebesar Harga", "Diskon Tidak Sebesar Harga")) %>%
group_by(disc_same_price, Order_Status) %>%
summarise(frek = n()) %>%
arrange(-frek) %>%
ggplot(aes(y = frek, x = disc_same_price, fill = disc_same_price)) +
geom_col(aes(fill = Order_Status), position = "dodge") +
scale_fill_ordinal()+
# geom_text(aes(label = frek),
# vjust = 0,
# size = 5,
# color = "white") +
labs(title = "Pelanggan dengan biaya belanja 0 dan diskon sebesar harga produk ",
subtitle = "metode pembayaran non-kredit",
x = NULL,
y = "Frekuensi") +
theme_minimal() +
theme(plot.title = element_text(size = 15, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))
Dari grafik diatas, mayoritas pelanggan yang menyelesaikan belanjanya adalah yang mendapatkan diskon senilai dengan harga produk. Namun, terdapat hal yang menarik yakni pelanggan mendapatkan diskon senilai dengan harga produk namun status pesanannya di cancel dan refund. Hal itu bisa jadi dikarenakan produk yang dibeli tidak sesuai atau terdapat kendala pada pengirimannya. Sehingga, perusahaan nantinya perlu memperhatikan toko penjual dan jasa pengirimannya pada pelanggan-pelanggan yang membatalkan dan meminta refund walaupun mendapat diskon senilai dengan harga produk.
Akan tetapi, terdapat key insigth yakni bahwa adanya diskon akan meningkatkan status pesanan complete, mengingat tingginya rate pembatalan dan pengembalian barang sebagaimana ditampilkan pada grafik dibawah.
plot_status_line <- data %>%
group_by(Date_of_Order, Order_Status) %>%
summarise(count = n()) %>%
ggplot(aes(x = Date_of_Order, y = count, color = Order_Status)) +
geom_line() +
facet_grid(rows = vars(Order_Status)) +
labs(title = "Tingkat Pembatalan dan Pengembalian Produk Pesanan Pelanggan",
x = NULL,
y = "Count") +
theme_light()+
theme(legend.position = "none",
plot.title = element_text(size = 15, hjust = 0.5))
ggplotly(plot_status_line)
Selanjutnya, mari kita lihat bersama apakah terdapat pelanggan yang mempunyai nilai total biaya belanja adalah negatif.
neg_grand <- data %>%
filter(Grand_Total < 0) %>%
select(Price, Quantity, Grand_Total, Invoice_ID, Discount_Amount, Payment_Method, Revenue) %>%
group_by(Invoice_ID) %>%
summarise(Grand_Total = unique(Grand_Total))
neg_grand
Terdapat sebanyak 29 daftar riwayat transaksi yang tercatat memiliki total biaya belanja adalah negatif.
neg_grand_inc <- neg_grand$Invoice_ID
data %>%
filter(Invoice_ID %in% c(neg_grand_inc)) %>%
group_by(Order_Status) %>%
summarise(frek= length(unique(Invoice_ID))) %>%
ggplot(aes(y = frek, x = reorder(Order_Status, -frek), fill = Order_Status)) +
geom_col() +
scale_fill_ordinal()+
geom_text(aes(label = frek),
vjust = -0.4,
size = 5) +
labs(title = "Status Order Pelanggan yang mempunyai total pembayaran negatif ",
subtitle = "Pakistas E-Commerce",
x = "Status Pesanan",
y = "Frekuensi") +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(size = 15, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))
Dari 29 daftar riwayat transaksi yang tercatat memiliki total biaya belanja adalah negatif, hanya sebanyak 11 yang status pesanannya selesai. Namun, pada kesempatan ini masih belum diketahui terkait penyebab grand_total bernilai negatif. Satu hal yang dapat dipastikan, yakni perusahaan merugi dengan adanya grand_total yang bernilai negatif.
Selanjutnya, mari kita melakukan inspeksi lebih lanjut terhadap pelanggannya.
data %>%
group_by(Customer_ID) %>%
summarise(frek_berbelanja = length(unique(Invoice_ID))) %>%
arrange(-frek_berbelanja) %>%
head(12) %>%
ggplot(aes(x = reorder(Customer_ID, -frek_berbelanja),
y = frek_berbelanja,
fill = frek_berbelanja))+
geom_col() +
scale_fill_gradient2() +
geom_text(aes(label = frek_berbelanja),
vjust = -0.3,
size = 5) +
labs(title = "12 Pelanggan tersering melakukan belanja",
subtitle = "Pakistas E-Commerce",
x = "ID Pelanggan",
y = "Frekuensi") +
theme_minimal() +
theme(plot.title = element_text(size = 15, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
legend.position = "none")
Yeah,… Dengan melihat grafik diatas, yakni bahwa pelanggan sering melakukan transaksi atau adanya pembelian kembali oleh pelanggan, dari yang tercatat sejak Maret 2016 hingga Agustus 2018. Maka, nantinya dapat dilakukan customer segmentation dan product recommendation.
Selanjutnya, mari kita coba lihat total transaksi dan total customer yang melakukan transaksi tiap bulannya.
max_date <- max(data$Date_of_Order)
plot_trans_monthly <- data %>%
filter(Order_Status == "complete") %>%
group_by(Month_Year) %>%
summarise(`Total Transaksi` = length(unique(Invoice_ID))) %>%
rename("Date" = "Month_Year") %>%
ggplot(aes(x = Date, y = `Total Transaksi`)) +
geom_line() +
geom_point(color= "blue") +
labs(title = "Total Transaksi per Bulan",
x = NULL,
y = "Total Transaksi") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
legend.position = "none")
ggplotly(plot_trans_monthly)
plot_cust_monthly <- data %>%
filter(Order_Status == "complete") %>%
group_by(Month_Year) %>%
summarise(`Total Customer` = length(unique(Customer_ID))) %>%
rename("Date" = "Month_Year") %>%
ggplot(aes(x = Date, y = `Total Customer`)) +
geom_line() +
geom_point(color = "blue") +
labs(title = "Total Pelanggan per Bulan",
x = NULL,
y = "Total Pelanggan") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
legend.position = "none")
ggplotly(plot_cust_monthly)
Baik pada jumlah transaksi maupun pelanggan, pada tiap bulannya mengalami fluktuasi yang sangat tinggi dan trend-nya bisa dikatakan terjadi penurunan.
Selain itu, mari kita coba lihat juga total transaksi dan pelanggan pada tiap harinya.
plot_daily_trans <- data %>%
filter(Order_Status == "complete") %>%
pad() %>%
group_by(Date_of_Order) %>%
summarise(`Total Transaksi` = length(unique(Invoice_ID))) %>%
rename("Date" = "Date_of_Order") %>%
ggplot(aes(x = Date, y = `Total Transaksi`)) +
geom_line() +
labs(title = "Total Transaksi Harian",
x = NULL,
y = "Total Transaksi") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5))
ggplotly(plot_daily_trans)
plot_cust_daily <- data %>%
filter(Order_Status == "complete") %>%
pad() %>%
group_by(Date_of_Order) %>%
summarise(`Total Pelanggan` = length(unique(Customer_ID))) %>%
rename("Date" = "Date_of_Order") %>%
ggplot(aes(x = Date, y = `Total Pelanggan`)) +
geom_line() +
labs(title = "Total Pelanggan Harian",
x = NULL,
y = "Total Pelanggan") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5))
ggplotly(plot_cust_daily)
Dapat kita lihat bersama bahwasanya terjadi fluktuasi yang sangat tinggi baik total transaksi maupu pelanggan dalam hariannya.
Okey. Selanjutnya, mari kita coba lihat total transaksi, total produk, total pelanggan, maupun total pendapatan berdasarkan setiap kategori merchant-nya.
# Banyak pembelian produk/barang yang terjadi pada masing-masing kategori merchants
data %>%
group_by(Category) %>%
summarise(amount = sum(Quantity)) %>%
ggplot(aes(x = amount, y = reorder(Category, amount))) +
geom_col() +
geom_label(aes(label = amount)) +
labs(title = "Total Pembelian Produk oleh Pelanggan pada Setiap Kategori Merchants",
y = NULL,
x = "Total Produk") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5))
# Banyaknya transaksi yang terjadi pada masing-masing kategori e-commerce
data %>%
group_by(Category) %>%
summarise(amount_inc = length(unique(Invoice_ID))) %>%
ggplot(aes(x = amount_inc, y = reorder(Category, amount_inc))) +
geom_col() +
geom_label(aes(label = amount_inc)) +
labs(title = "Total Transaksi pada Setiap Kategori Merchants",
y = NULL,
x = "Total Transaksi") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5))
# Banyaknya pelanggan pada masing-masing kategori e-commerce
data %>%
group_by(Category) %>%
summarise(amount_customer = length(unique(Customer_ID))) %>%
ggplot(aes(x = amount_customer, y = reorder(Category, amount_customer))) +
geom_col() +
geom_label(aes(label = amount_customer)) +
labs(title = "Total Pelanggan pada Setiap Kategori Merchants",
y = NULL,
x = "Total Pelanggan") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5))
# Total 'Grand_total' pada masing-masing kategori merchants
data %>%
group_by(Category, Invoice_ID) %>%
summarise(total_revenue = sum(Grand_Total)) %>%
ungroup() %>%
group_by(Category) %>%
summarise(total_revenue = sum(total_revenue)) %>%
mutate(label = paste0(as.character(round(total_revenue/1000000, 2)), "M")) %>%
ggplot(aes(x = total_revenue, y = reorder(Category, total_revenue))) +
geom_col() +
geom_label(aes(label = label)) +
labs(title = "Total Pendapatan pada Setiap Kategori Merchants",
y = NULL,
x = "Total Pendapatan") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5))
Berdasarkan plot pada tiap kategori merchant, kita mendapatkan insights yang menarik. Kategori merchant “Mobiles & Tablets” selalu menempati top-1 pada semua parameter, yakni tingkat pendapatan, total pelanggan, total transaksi, dan juga total produk yang terjual. Adapun kategori merchants “Books” berbanding terbalik, yaitu selalu menempati urutan terbawah. Kemudian, kategori merchants “Men’s Fashion”, “Women’s Fashion”, dan “Appliances” selalu berada di dalam rentang top-5. Fakta ini sangat menarik, karena meskipun barang-barang tersebut merupakan barang yang seperti harus dicoba dulu sebelum dibeli, jika kita mengingat jual beli tradisional, namun mampu selalu menempati peringkat teratas.
Baiklah, mari kita mulai masuk ke dalam penjelasan terkait penentuan strategi berdasarkan data dengan memanfaatkan berbagai algoritma machine learning guna mengoptimasi bisini e-commerce perusahaan.
Pada sesi segmentasi pelanggan, kita akan menggunakan metode analsis Recency, Frequency, Monetary Value (RFM). Metode analsis ini menggunakan pendekatan kebiasaan pelanggan dalam bertransaksi. Variabel-variabel analisis RFM tersebut meliputi;
Feature Engineering
Berikut ialah pembuatan kolom-kolom yang meliputi variabel-variabel analisis RFM.
rfm_data <- data %>%
filter(Order_Status == "complete") %>%
group_by(Customer_ID) %>%
summarise(first_order = min(Date_of_Order),
last_order = max(Date_of_Order)) %>%
mutate(age = difftime(time2 = first_order, time1 = max_date, units = "days")+1,
recency = difftime(time2 = last_order, time1 = max_date, units = "days")+1) %>%
ungroup()
rfm_data <- data %>%
filter(Order_Status == "complete") %>%
select(Customer_ID, Invoice_ID) %>%
group_by(Customer_ID) %>%
summarise(frequency = length(unique(Invoice_ID))) %>%
ungroup() %>%
left_join(rfm_data, by = "Customer_ID")
rfm_data <- data %>%
filter(Order_Status == "complete") %>%
select(Customer_ID, Invoice_ID, Grand_Total) %>%
distinct() %>%
group_by(Customer_ID) %>%
summarise(monetary = sum(Grand_Total),
avg_amount_order = median(Grand_Total)) %>%
ungroup() %>%
left_join(rfm_data, by = "Customer_ID")
rfm_data
Yups, nantinya kita dapat melakukan segmentasi berdasarkan value pelanggan, yakni dengan menggunakan parameter “monetary” dan “frequency”. Kemudian, segmentasi bisa dilakukan berdasarkan nilai “recency”-nya juga untuk mendapatkan nilai keaktifan dari pelanggan.
Kita bisa mengsegmentasikan customer terhadap nilai Recency menggunakan teknik Quantile dengan ketentuan berikut:
Selanjutnya, kita dapat menggunakan algoritma unsupervised machine learning untuk segmentasi nilai pelanggan yang berdasarakan “frequency” dan “monetary”.
Melalui segmentasi tersebut, e-commerce dapat memberikan perlakuan yang berbeda-beda seperti pemberian diskon dan berbagai kampanye lainnya sehingga dapat meningkatkan “Customer Value”. Selain itu, harapannya melalui adanya diskon serta berbagai strategi yang akan diterapkan pada masing-masing segmen customer, dapat mengurangi resiko pembatalan dan pengembalian pesanan.
Apakah anda akan membeli barang yang tidak disukai/ingin miliki? meski ada diskon 100%. Yups, kemungkinannya kecil. Maka dari itu, sistem produk rekomendasi akan mengoptimasi program atau strategi peningkatan nilai pelanggan dari hasil segmentasi sebelumnya. Tentu, kemungkinan status pesanan dari pelanggan untuk “complete” juga akan meningkat. Sebagaimana fakta yang kita dapatkan pada bagian Explanatory Data Analysis.
Pada sistem product recommendation ini, kita akan mencoba beberapa metode yaitu Item-based Collaborative Filtering, User-based Collaborative Filtering, dan Association Rules. Kita juga akan menerapkan beberapa pendekatan, yakni pearson correlation, consine similarity dan jaccard distance. Dimana algoritma KNN yang digunakan untuk menentukan produk yang akan direkomendasikan.
Data histori transaksi yang kita miliki akan ditransformasikan menggunakan binaryRatingMatrix, dengan ketentuan produk yang dibeli akan memiliki value 1, sedangkan yang tidak dibeli diset value 0.
Pada bagian forecasting ini, secara umum kita akan melakukan prediksi permintaan dari kategori produk atau merchants tiap hari, minggu, dan bulanannya. Hal itu untuk menghindari kekecewaan dari pelanggan, serta, Bagaimana kita akan merekomendasikan barang yang tidak ada?. Selain itu, barang dari E-Commerce juga ada yang berupa makanan, sehingga adanya fitur prediksi akan sangat membantu menghindari kerugian dan mendapat keuntungan yang maksimal. Sehingga, kategori merchant dapat menyiapkan stoknya.
Agar lebih memudahkan merchant, nantinya juga terdapat tambahan informasi terkait produk yang banyak permintaannya dalam satu minggu yang lalu, satu bulan yang lalu, serta permintaan pada bulan yang sama di tahun sebelumnya. Sehingga, merchant e-commerce dapat menentukan stok yang banyak disediakan.
Pada kesempatan ini, mari kita coba meninjau permintaan pada tiap kategori merchants.
demand_category <- data %>%
pad() %>%
group_by(Date_of_Order, Category) %>%
summarise(Demand = sum(Quantity)) %>%
mutate(Demand = ifelse(is.na(Demand) == TRUE, 0, Demand)) %>%
rename("Date" = "Date_of_Order") %>%
ggplot(aes(x = Date, y = Demand, color = Category)) +
geom_line() +
labs(title = "Demand per Category",
x = NULL,
y = "Demand") +
theme_minimal()+
theme(legend.position = "none",
plot.title = element_text(size = 15, hjust = 0.5))
ggplotly(demand_category)
Misal kita coba memilih dua kategori secara acak, yakni “Books” dan “Mobiles & Tablets”
books_data <- data %>%
filter(Category == "Books")
mobile_tablets_data <- data %>%
filter(Category == "Mobiles & Tablets")
books_demand <- books_data %>%
pad() %>%
group_by(Date_of_Order) %>%
summarise(Demand = sum(Quantity)) %>%
mutate(Demand = ifelse(is.na(Demand) == TRUE, 0, Demand)) %>%
rename("Date" = "Date_of_Order") %>%
ggplot(aes(x = Date, y = Demand)) +
geom_line() +
labs(title = "Book's Demand",
x = NULL,
y = "Demand") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5))
ggplotly(books_demand)
mobile_tablets_demand <- mobile_tablets_data %>%
pad() %>%
group_by(Date_of_Order) %>%
summarise(Demand = sum(Quantity)) %>%
mutate(Demand = ifelse(is.na(Demand) == TRUE, 0, Demand)) %>%
rename("Date" = "Date_of_Order") %>%
ggplot(aes(x = Date, y = Demand)) +
geom_line() +
labs(title = "Mobiles & Tablets Demand",
x = NULL,
y = "Demand") +
theme_minimal()+
theme(plot.title = element_text(size = 15, hjust = 0.5))
ggplotly(mobile_tablets_demand)
Yups… Berdasarkan berbagai grafik permintaan tersebut, maka nantinya kita akan melakukan forecasting terhadap permintaan dari tiap kategorinya dengan menggunakan algoritma prophet. Dimana algoritma ini dapat melakukan analisis dengan multi-seasonality hingga melakukan tuning terhadap adanya event-event khusus yang menyebabkan terjadinya fluktuasi permintaan. Demand forecasting akan dilakukan terhadap setiap kategori merchant e-commerce.
Adapun gambaran kerangka dashboard yang akan dibuat adalah sebagai berikut.