Di seluruh dunia, pasar e-commerce mengalami peningkatan dari tahun ke tahun. Di Amerika Latin E-commerce berkembang pesat dari tahun ke tahun, terutama dengan masuknya peningkatan konektivitas dan perangkat seluler. Ini juga merupakan salah satu kawasan e-commerce dengan pertumbuhan tercepat di seluruh dunia. Namun secara keseluruhan, Amerika Latin masih belum sepenuhnya mengadopsi platform belanja online. Menurut studi eMarketer, e-commerce hanya mewakili 4,2 persen dari industri ritel pada 2018. Meski demikian, angka itu diperkirakan akan tumbuh sepanjang tahun ini menjadi 35 persen. Sebagian besar dari angka ini berkaitan terutama dengan pertumbuhan pasar Brasil baru-baru ini, yang cukup besar. Secara mengesankan, 42 persen e-commerce di Amerika Latin adalah milik Brasil. Di tahun 2018 , 58 juta konsumen elektronik menghabiskan sekitar 53,2 miliar Real Brasil atau senilai sekitar US$12,7 miliar.
Dari 58 juta konsumen tersebut, semuanya melakukan setidaknya satu pembelian virtual pada tahun 2018. Pasar ritel online Brasil diperkirakan akan menghasilkan sekitar US$16,8 juta pada tahun 2019. Angka-angka ini membuktikan seberapa besar peluang bisnis e-commerce di negara berkembang. Berkat pertumbuhannya yang cepat dan adopsi yang populer, toko ritel online diharapkan dapat berkembang di Brasil.
Mengapa pertumbuhan seperti itu?
Pertama-tama, penetrasi internet negara itu mencapai 70 persen pada 2019, yang berarti bahwa lebih dari 149 juta penduduk memiliki akses ke internet, menurut PagBrasil’s Digital in 2019 Report. Sepanjang garis itu, negara ini berada di tiga besar penggunaan internet seluler paling banyak di seluruh dunia. Ini membawa saya ke poin berikutnya. Ponsel dan media sosial memainkan peran yang sangat penting dalam kancah e-commerce Brasil. Bagaimanapun, kedua alat ini diharapkan menjadi saluran utama bagi masyarakat untuk mengakses belanja ritel online.
Dengan adanya konsumen yang banyak dan didukung dengan pengguna internet yang tinggi, kita dapat memaksimalkan hasil penjualan dengan melakukan metode yang tepat sasaran sehingga perusahaan tidak perlu membuang biaya iklan atau promosi yang sia-sia. Customer Segementation adalah konsep memecah pasar pelanggan menjadi segmen yang lebih kecil berdasarkan kesamaan karakteristik. Karakteristik tersebut akan memberikan kita pemahaman akan pelanggan. Dengan demikian, kita bisa memasarkan produk atau jasa ke masing-masing kelompok secara efektif. Tentunya, penjualan produk pun dapat meningkat saat kita lancar dalam memasarkannya. Adapun metode yang kita gunakan untuk memaksimalkan hasil yaitu metode Recency,Frequency dan Monetary.
Dengan meningkatnya daya beli masyarakat dan meningkatnya penjualan produk melalui e-commerce pada negara Brazil, membuka peluang bagi perusahaan e-commerce untuk dapat meningkatkan profitnya. Tetapi beberapa perusahaan masih belum memaksimalkan peluang itu sehingga bisa membuat sebuah perusahaan itu akan mengalami kerugian ,contohnya seperti Belanja.com . Salah satu penyebabnya dikarenakan belum tepatnya dalam pemasaran produk maupun pemberian diskon kepada konsumen. Untuk membuat pemasaran yang tepat sasaran sebuah perusahaan harus menganalisa data historis seorang konsumen berdasarkan karakteristik / kategorinya.
Memaksimalkan penjualan retail atau pada e-commerce olist melalui segmentasi pelanggan. Oleh karena itu , Project ini akan dibuat untuk segmentasi atau karakteristik konsumen dengan metode Recency, Frequency, dan Monetary Analisis (RFM). Metode ini menentukan secara kuantitatif pelanggan mana yang terbaik dengan memeriksa seberapa baru pelanggan membeli, seberapa sering mereka membeli (frekuensi), dan berapa banyak yang dibelanjakan pelanggan (uang).
Pada Project ini akan digunakan sebuah data retail dari web olist.com yang diambil dari situs kaggle dengan judul Brazilian E-Commerce Public Dataset by Olist . Dataset ini mengandung informasi sebagai berikut:
Order ID : kode unik pesanan
Customer_unique_id : ID Pelanggan
Order_purchase_timestamp : waktu pembayaran
Price : harga
Product_category_name : kategori produk
Selanjutnya, kebutuhan pembuatan model machine learning untuk mensegmentasi customer dibuat dengan metode RFM , Metode ini menentukan secara kuantitatif pelanggan mana yang terbaik dengan memeriksa seberapa baru pelanggan membeli, seberapa sering mereka membeli (frekuensi), dan berapa banyak yang dibelanjakan pelanggan (uang).
Output dari project ini berupa dashboard analisis yang menampilkan Exploratory Data serta menunjukan segmentasi konsumen.
Dengan mengetahui segmentasi pelanggan, maka perusahaan akan mendapatkan keuntungan bagaimana karakteristik pelanggannya. selain mengetahui segmentasi pelanggan pada e-commerce olist di Brazil, Metode ini juga bisa digunakan pada business e-commerce pada negara Indonesia . Contohnya pada bidang makanan , brand , maupun kategori produk di aplikasi Go-jek Maupun Shopee
Mengaktifkan Library yang dipakai
#data
library(tidyverse)
library(dplyr)
library(lubridate)
library(scales)
library(zoo)
#visualisasi
library(ggplot2) # visualisasi
library(paletti) # warna
library(plotly) # grafik
library(gridExtra) # menampilkan 2 grafik dalam 1 baris
library(glue) # popup
#Kustomisasi warna
my_color = c(
col1="#d3f2a3",
col2="#97e196",
col3="#6cc08b",
col4="#4c9b82",
col5="#217a79",
col6="#105965",
col7="#074050"
)
my_theme_fill <- get_scale_fill(get_pal(my_color))
my_theme_color <- get_scale_color(get_pal(my_color))
my_theme_hex <- get_hex(my_color)
color_dark_text = "#222629"
# MY PLOT THEME
my_plot_theme <- function (base_size, base_family="Segoe UI Semibold"){
dark_color="#222629"
facet_header = "#78767647"
dark_text = "#222629"
half_line <- base_size/2
theme_algoritma <- theme(
plot.background = element_rect(fill=NA,colour = NA), #background plot
plot.title = element_text(size = rel(1.2), margin = margin(b = half_line * 1.2),
color= dark_text, hjust = 0, family=base_family, face = "bold"),
plot.subtitle = element_text(size = rel(1.0), margin = margin(b = half_line * 1.2), color= dark_text, hjust=0),
plot.margin=unit(c(0.5,0.5,0.5,0.5),"cm"),
#plot.margin=unit(c(0.5,r=5,1,0.5),"cm"),
panel.background = element_rect(fill="#18181800",colour = "#e8e8e8"), #background chart
panel.border = element_rect(fill=NA,color = NA),
panel.grid.minor.x = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(color="#e8e8e8", linetype=2),
panel.grid.minor.y = element_blank(),
#panel.margin = unit(0.8*half_line, "mm"),
panel.margin.x = NULL,
panel.margin.y = NULL,
panel.ontop = FALSE,
panel.spacing = unit(1.2,"lines"),
legend.background = element_rect(fill="#18181800",colour = NA),
legend.text = element_text(size = rel(0.7),color=dark_text),
legend.title = element_text(colour = dark_text, size = base_size, lineheight = 0.8),
legend.box = NULL,
# text = element_text(colour = "white", size = base_size, lineheight = 0.9,
# angle = 0, margin = margin(), debug = FALSE),
axis.text = element_text(size = rel(0.8), color=dark_text),
axis.text.x = element_text(colour = dark_text, size = base_size, margin = margin(t = 0.8 * half_line/2)),
axis.text.y = element_text(colour = dark_text, size = base_size, margin = margin(r = 0.8 * half_line/2)),
axis.title.x = element_text(colour = dark_text, size = base_size, lineheight = 0.8,
margin = margin(t = 0.8 * half_line, b = 0.8 * half_line/2)),
axis.title.y = element_text(colour = dark_text, size = base_size, lineheight = 0.8,
angle = 90, margin = margin(r = 0.8 * half_line, l = 0.8 * half_line/2)),
axis.ticks = element_blank(),
strip.background = element_rect(fill=facet_header,colour = NA),
strip.text = element_text(colour = dark_text, size = rel(0.8)),
strip.text.x = element_text(margin = margin(t = half_line*0.8, b = half_line*0.8)),
strip.text.y = element_text(angle = -90, margin = margin(l = half_line, r = half_line)),
strip.switch.pad.grid = unit(0.1, "cm"),
strip.switch.pad.wrap = unit(0.1, "cm"),
complete = TRUE
)
}
import data yang digunakan
order_dataset <- read.csv("olist_orders_dataset.csv")
order_item <- read.csv("olist_order_items_dataset.csv")
order_customer <- read.csv("olist_customers_dataset.csv")
geolocation_dataset <- read.csv("olist_geolocation_dataset.csv")
product_dataset <- read.csv("olist_products_dataset.csv")
translate <- read.csv("product_category_name_translation.csv")
check nama kolom untuk memudahkan memilih kolom yang akan digunakan
colnames(order_dataset)
## [1] "order_id" "customer_id"
## [3] "order_status" "order_purchase_timestamp"
## [5] "order_approved_at" "order_delivered_carrier_date"
## [7] "order_delivered_customer_date" "order_estimated_delivery_date"
colnames(order_item)
## [1] "order_id" "order_item_id" "product_id"
## [4] "seller_id" "shipping_limit_date" "price"
## [7] "freight_value"
colnames(order_customer)
## [1] "customer_id" "customer_unique_id"
## [3] "customer_zip_code_prefix" "customer_city"
## [5] "customer_state"
colnames(geolocation_dataset)
## [1] "geolocation_zip_code_prefix" "geolocation_lat"
## [3] "geolocation_lng" "geolocation_city"
## [5] "geolocation_state"
colnames(product_dataset)
## [1] "product_id" "product_category_name"
## [3] "product_name_lenght" "product_description_lenght"
## [5] "product_photos_qty" "product_weight_g"
## [7] "product_length_cm" "product_height_cm"
## [9] "product_width_cm"
Mengganti nama kolom untuk memudahkan proses penggabungan data
colnames(geolocation_dataset)[1]="customer_zip_code_prefix"
head(geolocation_dataset,5)
Menggabung data dan menghapus kolom yang tidak digunakan
dataseta <- order_dataset %>%
left_join(order_item,
by = "order_id") %>%
left_join(product_dataset,
by="product_id") %>%
left_join(order_customer,
by="customer_id") %>%
left_join(translate,
by="product_category_name") %>%
select(-c("product_name_lenght","product_description_lenght","product_photos_qty","product_weight_g","product_length_cm","product_height_cm","product_width_cm","order_delivered_carrier_date","order_approved_at","order_estimated_delivery_date","shipping_limit_date","customer_state","product_category_name","order_delivered_customer_date","customer_zip_code_prefix","freight_value","seller_id","product_id","customer_id"))
Memilih data yang digunakan berdasarkan proses yang telah selesai atau delivered
dataset_ <- dataseta %>%
filter(order_status=="delivered") %>%
select(-c("order_status"))
Check Dataset yang digunanakan
glimpse(dataset_)
## Rows: 110,197
## Columns: 7
## $ order_id <chr> "e481f51cbdc54678b7cc49136f2d6af7", "53c~
## $ order_purchase_timestamp <chr> "2017-10-02 10:56:33", "2018-07-24 20:41~
## $ order_item_id <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1~
## $ price <dbl> 29.99, 118.70, 159.90, 45.00, 19.90, 147~
## $ customer_unique_id <chr> "7c396fd4830fd04220f754e42b4e5bff", "af0~
## $ customer_city <chr> "sao paulo", "barreiras", "vianopolis", ~
## $ product_category_name_english <chr> "housewares", "perfumery", "auto", "pet_~
Berdasarkan data di atas kita bisa melihat ada beberapa type data yang belum sesuai seperti customer_city,product_category_name_english,order_item_id
dataset_clean <- dataset_ %>%
mutate_at(vars(customer_city,product_category_name_english, order_item_id),funs(as.factor)) %>%
mutate(order_purchase_timestamp =ymd_hms(order_purchase_timestamp),
date = date(order_purchase_timestamp),
month=month(order_purchase_timestamp),
day=day(order_purchase_timestamp),
hour=hour(order_purchase_timestamp)) %>%
mutate(product_category_name_english = coalesce(product_category_name_english, "others"))
glimpse(dataset_clean)
## Rows: 110,197
## Columns: 11
## $ order_id <chr> "e481f51cbdc54678b7cc49136f2d6af7", "53c~
## $ order_purchase_timestamp <dttm> 2017-10-02 10:56:33, 2018-07-24 20:41:3~
## $ order_item_id <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1~
## $ price <dbl> 29.99, 118.70, 159.90, 45.00, 19.90, 147~
## $ customer_unique_id <chr> "7c396fd4830fd04220f754e42b4e5bff", "af0~
## $ customer_city <fct> sao paulo, barreiras, vianopolis, sao go~
## $ product_category_name_english <chr> "housewares", "perfumery", "auto", "pet_~
## $ date <date> 2017-10-02, 2018-07-24, 2018-08-08, 201~
## $ month <dbl> 10, 7, 8, 11, 2, 7, 5, 1, 7, 5, 5, 7, 6,~
## $ day <int> 2, 24, 8, 18, 13, 9, 16, 23, 29, 16, 16,~
## $ hour <int> 10, 20, 8, 19, 21, 21, 13, 18, 11, 19, 1~
Nice! tipe dataset berhasil di ganti.
data.frame(
row_of_data = dataset_clean %>% nrow(),
row_of_unique.data = dataset_clean %>% distinct() %>% nrow()
)
tidak terindikasi data terduplikat
colSums(is.na(dataset_clean))
## order_id order_purchase_timestamp
## 0 0
## order_item_id price
## 0 0
## customer_unique_id customer_city
## 0 0
## product_category_name_english date
## 0 0
## month day
## 0 0
## hour
## 0
Tidak terdapat dataset yang kosong atau NA
summary(dataset_clean)
## order_id order_purchase_timestamp order_item_id
## Length:110197 Min. :2016-09-15 12:16:38 1 :96478
## Class :character 1st Qu.:2017-09-15 06:32:42 2 : 9635
## Mode :character Median :2018-01-21 10:11:55 3 : 2243
## Mean :2018-01-02 02:49:51 4 : 937
## 3rd Qu.:2018-05-05 16:03:59 5 : 442
## Max. :2018-08-29 15:00:37 6 : 249
## (Other): 213
## price customer_unique_id customer_city
## Min. : 0.85 Length:110197 sao paulo :17400
## 1st Qu.: 39.90 Class :character rio de janeiro: 7592
## Median : 74.90 Mode :character belo horizonte: 3087
## Mean : 119.98 brasilia : 2341
## 3rd Qu.: 134.17 curitiba : 1727
## Max. :6735.00 campinas : 1626
## (Other) :76424
## product_category_name_english date month
## Length:110197 Min. :2016-09-15 Min. : 1.000
## Class :character 1st Qu.:2017-09-15 1st Qu.: 3.000
## Mode :character Median :2018-01-21 Median : 6.000
## Mean :2018-01-01 Mean : 6.032
## 3rd Qu.:2018-05-05 3rd Qu.: 8.000
## Max. :2018-08-29 Max. :12.000
##
## day hour
## Min. : 1.00 Min. : 0.00
## 1st Qu.: 8.00 1st Qu.:11.00
## Median :16.00 Median :15.00
## Mean :15.56 Mean :14.75
## 3rd Qu.:23.00 3rd Qu.:19.00
## Max. :31.00 Max. :23.00
##
Dari hasil summary bisa kita lihat:
- Price tertinggi yaitu 6735
- Price terendah yaitu 0.85
- Date terbesar yaitu 2018-08-29
- Date terendah yaitu 2016-09-15
- Customer terbanyak ada pada kota Sao Paolo
length(unique(dataset_clean$customer_unique_id))
## [1] 93358
terdapat 93358 customer
length(unique(dataset_clean$order_id))
## [1] 96478
terjadi 96478 transaksi
dataset_clean %>%
group_by(product_category_name_english) %>%
summarise(product_category=n()) %>%
arrange(desc(product_category))
terdapat 72 category barang dengan kategory dengan pesanan terbanyak yaitu bed_bath_table
Check salah satu data pelanggan
dataset_clean %>%
filter(customer_unique_id=="9a736b248f67d166d2fbb006bcb877c3")
dataset_clean %>%
filter(order_id=="895ab968e7bb0d5659d16cd74cd1650c")
bila kita bandingkan hasil filter antara order_id dan customer_unique_id , bisa kita simpulkan bahwa setiap rows pada dataset merupakan menyatakan 1 item pada sebuah order
dc_total_customer <- dataset_clean %>%
select(date,customer_unique_id) %>%
mutate(yearmonth = format(date,format="%Y-%m-1"),
yearmonth = ymd(yearmonth),
ym = as.yearmon(date)) %>%
select(customer_unique_id,ym,yearmonth) %>%
distinct() %>%
group_by(ym,yearmonth) %>%
summarise(total_customer=n()) %>%
ungroup() %>%
mutate(
popup=glue("{ym}
jumlah: {total_customer}")
)
dc_max <- dc_total_customer %>% arrange(total_customer) %>% tail(1)
dc_min <- dc_total_customer %>% arrange(total_customer) %>% head(1)
plot_total_customer <- dc_total_customer %>%
ggplot(aes(x=yearmonth,total_customer))+
geom_line(size=2)+
geom_point(size=3, aes(text=popup))+
geom_point(data=dc_max, aes(x=yearmonth, y=total_customer, text=popup), colour="green", size=3)+
geom_point(data=dc_min, aes(x=yearmonth, y=total_customer, text=popup), colour="red", size=3)+
labs(
title = "Total Pelanggan per Bulan",
x = "Bulan-Tahun",
y = NULL
)+
scale_x_date(breaks=date_breaks('1 months'),
labels=date_format('%b %y'))+
my_plot_theme(10)+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(plot_total_customer, tooltip="text") %>%
config(displayModeBar = F, scrollzoom = F)
berdasarkan grafik di atas bisa kita lihat bahwa jumlah pelanggan selalu meningkat walaupun terjadi penurunan pelanggan pada Dec 2017. Pelanggan terbanyak terjadi pada Nov 2017 dan Pelanggan paling sedikit terjadi pada Sep 16 dan Dec 2016.
dc_growth_customer <-
dataset_clean %>%
group_by(customer_unique_id) %>%
summarise(first_order=min(date)) %>%
ungroup() %>%
mutate(yearmonth=format(first_order,format="%Y-%m-1"),
yearmonth=ymd(yearmonth),
ym=as.yearmon(first_order)) %>%
group_by(ym,yearmonth) %>%
summarise(total_new_customer=n()) %>%
ungroup() %>%
mutate(popout=glue("{ym}
Jumlah Pelanggan Baru:{total_new_customer}"))
dc_growth_max <- dc_growth_customer %>% arrange(desc(total_new_customer)) %>% head(1)
dc_growth_min <- dc_growth_customer %>% arrange(desc(total_new_customer)) %>% tail(1)
plot_growth_customer <-
dc_growth_customer %>%
ggplot(aes(
x=yearmonth,
y=total_new_customer
))+
geom_line(size=2)+
geom_point(size=3,aes(text=popout))+
geom_point(data = dc_growth_max,aes(x=yearmonth,y=total_new_customer,text=popout),colour="green",size=3)+
geom_point(data = dc_growth_min,aes(x=yearmonth,y=total_new_customer,text=popout),colour="red",size=4)+
labs(
title = "Total Pertumbuhan Pelanggan Baru Perbulan",
x = "Bulan-Tahun",
y = NULL
)+
scale_x_date(
breaks= date_breaks('1 months'),
labels= date_format('%b %y')
)+
my_plot_theme(10)+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(plot_growth_customer, tooltip="text") %>%
config(displayModeBar = F, scrollzoom = F)
berdasarkan grafik di atas bisa kita lihat bahwa jumlah pelanggan baru selalu meningkat walaupun terjadi penurunan pelanggan baru pada Dec 2017. Pelanggan baru terbanyak terjadi pada Nov 2017 dan Pelanggan baru paling sedikit terjadi pada Aug 16.
library(grid)
library(gridExtra)
#monthly
dc_monthly <- dataset_clean %>%
select(date,month,day,customer_unique_id) %>%
distinct() %>%
group_by(month,day) %>%
summarise(total=n()) %>%
ungroup() %>%
group_by(day) %>%
summarise(avg_monthly = as.integer(median(total))) %>%
ungroup() %>%
mutate(popup = glue("Date : {day}
Total Transaction: {avg_monthly}"))
dc_monthly %>%
ggplot(aes(x=as.factor(day),y=avg_monthly))+
geom_bar(stat = "identity",aes(fill=avg_monthly),show.legend = F)+
labs(
title="Bulanan",
x = "Date",
y = NULL
)+
theme_minimal()+
theme(
axis.title = element_blank(),
legend.position = "none",
plot.title = element_text(hjust=0.5,size=2,face = "bold"),
plot.subtitle = element_text(hjust = 0.5,size=10),
axis.text.y =element_blank(),
axis.text.x = element_text(size=11, face ="bold"))+
scale_fill_gradient(
low=my_theme_hex("col2"),na.value = "#C0C0C0",high = my_theme_hex("col7"))+
coord_polar()->polar1
# Daily
dc_wday <- dataset_clean %>%
select(customer_unique_id,date,month) %>%
distinct() %>%
mutate(wday=wday(date,week_start = getOption("lubridate.week.start",1))) %>%
group_by(month,wday) %>%
summarise(total=n()) %>%
ungroup() %>%
group_by(wday) %>%
summarise(avg_wday=as.integer(median(total))) %>%
ungroup() %>%
mutate(popup=glue("wday:{wday}
Total Transaction: {avg_wday}"))
dc_wday %>%
ggplot(aes(wday,avg_wday))+
geom_bar(width=1, stat="identity", show.legend = FALSE, aes(fill=avg_wday))+
labs(
title = "Harian",
x = "Day",
y = NULL)+
scale_x_continuous(breaks = c(1,2,3,4,5,6,7),
labels = c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"))+
theme_minimal()+
theme(axis.title = element_blank(),
legend.position = "none",
plot.title = element_text(hjust = 0.5,size=12, face="bold"),
plot.subtitle = element_text(hjust = 0.5,size=10),
axis.text.y = element_blank(),
axis.text.x=element_text(size=11, face="bold"))+
scale_fill_gradient(low=my_theme_hex("col2") ,na.value = "#C0C0C0", high=my_theme_hex("col7"))+
coord_polar()-> polar2
dc_hours <- dataset_clean %>%
select(customer_unique_id,date,hour) %>%
mutate(hour=replace(hour,hour==0,24)) %>%
distinct() %>%
group_by(hour) %>%
summarise(total=n()) %>%
ungroup() %>%
group_by(hour) %>%
summarise(avg_hour=as.integer(median(total))) %>%
ungroup() %>%
mutate(popup=glue("hour :{hour}
Total Transaction: {avg_hour}"))
dc_hours %>%
ggplot(aes(x=as.factor(hour),y=avg_hour))+
geom_bar(stat = "identity",aes(fill=avg_hour),show.legend = F)+
labs(
title="JAM",
x = "Hour",
y = NULL
)+
theme_minimal()+
theme(
axis.title = element_blank(),
legend.position = "none",
plot.title = element_text(hjust=0.5,size=2,face = "bold"),
plot.subtitle = element_text(hjust = 0.5,size=10),
axis.text.y =element_blank(),
axis.text.x = element_text(size=11, face ="bold"))+
scale_fill_gradient(
low=my_theme_hex("col2"),na.value = "#C0C0C0",high = my_theme_hex("col7"))+
coord_polar() -> polar3
grid.arrange(polar1,polar2,polar3,ncol=3)
Berdasarkan Grafik di atas bisa kita lihat transaaksi berdasarkan Tanggal, Hari dan Jam. Warna gelap mengartikan tingginya frekuensi transaksi
dc_monthly_transactions <- dataset_clean %>%
select(date,customer_unique_id) %>%
distinct() %>%
mutate(yearmonth = ymd(format(date, format="%Y-%m-1")),
ym = as.yearmon(date)) %>%
group_by(ym,yearmonth) %>%
summarise(total_transaction = n()) %>%
ungroup() %>%
mutate(
popup=glue("{ym}
{comma(total_transaction)}")
)
dc_monthly_max <- dc_monthly_transactions %>% arrange(total_transaction) %>% tail(1)
dc_monthly_min <- dc_monthly_transactions %>% arrange(total_transaction) %>% head(1)
plot_monthly_transactions <- dc_monthly_transactions %>%
ggplot(aes(x=yearmonth,total_transaction))+
geom_line(size=1)+
geom_point(size=2, aes(text=popup))+
geom_point(data=dc_monthly_max, aes(x=yearmonth, y=total_transaction,text=popup), colour="green", size=3)+
geom_point(data=dc_monthly_min, aes(x=yearmonth, y=total_transaction,text=popup), colour="red", size=3)+
labs(title = "Frekuensi Transaksi Bulanan",
x = "Bulan-Tahun",
y = " ")+
scale_x_date(breaks=date_breaks('1 months'),
labels=date_format('%b %y'))+
my_plot_theme(10)+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(plot_monthly_transactions,tooltip="text") %>%
config(displayModeBar = F)
Berdasarkan pola grafik Frekuensi transaksi bulanan di atas kita bisa melihat bahwa pola tersebut sama dengan pertumbuhan customer, ini bisa menjadi indikasi bahwa customer kita banyak yang tidak melakukan repeat order.
dataset_clean %>%
group_by(product_category_name_english) %>%
summarise(n=n()) %>%
arrange(desc(n)) %>%
head(10) %>%
ggplot(aes(
y= n,
x=reorder(product_category_name_english,n),
fill=n
))+
geom_col(show.legend = F)+
labs(title="Top 10 Kategori paling populer berdasarkan urutan frequency",
x=NULL,
y="Frequency")+
coord_flip()+
scale_fill_gradient()
Berdasarkan grafik di atas bisa di simpulkan bahwa , kategory produk paling banyak dibeli yaitu bad_bath_table.
dataset_clean %>%
select(customer_unique_id,customer_city) %>%
group_by(customer_city) %>%
summarise(customer =n()) %>%
arrange(desc(customer)) %>%
head(10) %>%
ggplot(aes(
y= customer,
x=reorder(customer_city,customer),
fill=customer
))+
geom_col(show.legend = F)+
labs(title="Top 10 Kota dengan customer terbanyak",
x=NULL,
y="order")+
coord_flip()+
scale_fill_gradient()
Berdasarkan grafik di atas bisa kita simpulkan bahwa pelanggan / customer terbanyak berasal dari kota
sao paolo
untuk mengetahui apakah monetary penjualan meningkat atau menurun
dc_monetary <- dataset_clean %>%
mutate(yearmonth = format(date,format = "%Y-%m-1"),
yearmonth = ymd(yearmonth),
ym = as.yearmon(date)) %>%
group_by(ym,yearmonth) %>%
summarise(total_order_amount = sum(price)) %>%
ungroup() %>%
mutate(
popup=glue("{ym}
Monetary Bulanan: $ {comma(total_order_amount)}")
)
dc_mon_max <- dc_monetary %>% arrange(total_order_amount) %>% tail(1)
dc_mon_min <- dc_monetary %>% arrange(total_order_amount) %>% head(1)
plot_monthly_monetary <- dc_monetary %>%
ggplot(aes(x=yearmonth,total_order_amount))+
geom_line(size=1)+
geom_point(size=2,aes(text=popup))+
geom_point(data=dc_mon_max, aes(x=yearmonth, y=total_order_amount, text=popup), colour="green", size=3)+
geom_point(data=dc_mon_min, aes(x=yearmonth, y=total_order_amount, text=popup), colour="red", size=3)+
labs(
title = "Total Monetary per Bulan",
x = "Bulan-Tahun",
y = NULL
)+
scale_x_date(breaks=date_breaks('1 months'),
labels=date_format('%b %y'))+
my_plot_theme(10)+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(plot_monthly_monetary, tooltip="text") %>%
config(displayModeBar = F, scrollzoom = F)
Berdasarkan grafik di atas bisa kita lihat bahwa price transaksi tertinggi terjadi pada bulan Nov 2017 dan price transaksi terendah terjadi pada bulan Dec 2016
Metode analisis Recency, Frequency, Monetary Value (RFM) adalah salah satu metode analisis dan segmentasi pelanggan berdasarkan kebiasan customer. Variabel yang digunakan untuk melakukan RFM analisis yaitu:
Recency : Seberapa baru pelanggan melakukan transaksi.
Frequency : Seberapa sering pelanggan melakukan transaksi
Monetary : Seberapa besar transaksi yang sudah dilakukan pelanggan
Adapun cara untuk mendapatkan nilai Recency, Frequency maupun Monetary yaitu:
Recency : Selisih antara hari terakhir pelanggan melakukan transaksi dan hari melakukan analisis (max date). Dalam case ini, hari analisis menggunakan data hari terakhir transaksi.
Frequency : Jumlah transaksi yang dilakukan oleh pelanggan dari September 2016 sampai 29 Agustus 2018.
Monetary : Jumlah total order amount yang sudah dikeluarkan pelanggan dari 15 September 2016 sampai 29 Agustus 2018.
analisisdatemax <- date(max(dataset_clean$date))
#first_order, last_order, recency,monetary
RFM_Analisis <- dataset_clean %>%
group_by(customer_unique_id) %>%
summarise(
last_order = as.Date(max(date)),
recency =as.integer(analisisdatemax-date(last_order)),
frequency = n_distinct(order_id),
monetary = sum(price)
)
RFM_Analisis %>%
select(customer_unique_id,recency) %>%
ggplot(aes(x=recency))+
geom_histogram(breaks=seq(0, 600, by=30),
col="red",
aes(fill=..count..)) +
scale_fill_gradient("Count", low="green", high="red")+
my_plot_theme(10)
berdasarkan dari grafik histogram di atas dapat kita lihat bahwa persebaran data recency tidak terdistribusi normal
RFM_Analisis %>%
select(customer_unique_id,frequency) %>%
ggplot(aes(x=frequency))+
geom_histogram(breaks=seq(0,5 , by=1),
col="red",
aes(fill=..count..)) +
scale_fill_gradient("Count", low="green", high="red")+
my_plot_theme(10)
RFM_Analisis %>%
select(customer_unique_id,monetary) %>%
ggplot(aes(x=monetary))+
geom_histogram(breaks=seq(20, 1000, by=20),
col="red",
aes(fill=..count..)) +
scale_fill_gradient("Count", low="green", high="red")+
my_plot_theme(10)
Berdasarkan grafik di atas, dapat kita lihat bahwa persebaran data monetary tidak terdistribusi dengan normal