1. Latar Belakang

1.1 Pendahuluan

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.

1.2 Problem Statement

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.

1.3 Project Idea

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).

1.4 Problem Scope

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).

1.5 Output

Output dari project ini berupa dashboard analisis yang menampilkan Exploratory Data serta menunjukan segmentasi konsumen.

1.6 Business Impact

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

2 Data Preprocessing

2.1 Mengaktifkan Library

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
    
  )
}

2.2 Import Data

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")

2.3 Check Nama Kolom

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"

2.4 Mengganti nama kolom

Mengganti nama kolom untuk memudahkan proses penggabungan data

colnames(geolocation_dataset)[1]="customer_zip_code_prefix"
head(geolocation_dataset,5)

2.5 menggabungkan antar data

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"))

2.6 Filter Data

Memilih data yang digunakan berdasarkan proses yang telah selesai atau delivered

dataset_ <- dataseta %>%
  filter(order_status=="delivered") %>% 
  select(-c("order_status"))

2.7 Check dataset

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

2.8 Mengganti tipe data

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.

2.9 Check Data Duplikat

data.frame(
  row_of_data = dataset_clean %>% nrow(),
  row_of_unique.data = dataset_clean %>% distinct() %>% nrow()
)

tidak terindikasi data terduplikat

2.10 Check Data Kosong

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

2.11 Data Summary

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

3 Exploratory Data Analysis

3.1 Total Customer

length(unique(dataset_clean$customer_unique_id))
## [1] 93358

terdapat 93358 customer

3.2 Total Transaksi

length(unique(dataset_clean$order_id))
## [1] 96478

terjadi 96478 transaksi

3.3 Unique Produk

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

3.4 Check data pelanggan

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

3.5 Grafik Total Pelanggan setiap bulan

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.

3.6 Grafik Jumlah pelanggan baru

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.

3.7 Waktu Transaksi

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

3.8 Frekuensi Transaksi Bulanan

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.

3.9 Produk Paling Populer

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.

3.10 Top 10 kota dengan customer terbanyak

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

3.11 Price

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

4. RFM Analisis

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)
  )

4.1 Distribusi Recency

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

4.2 Frequency

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)

4.3 Monetary

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