Email:
RPubs: https://rpubs.com/juliansalomo ***

library(tidyverse)
library(lubridate)
library(scales)
library(readxl)
library(dplyr)
library(zoo)
library(plotly)
library(glue)
library(hrbrthemes)
library(treemapify)   
library(gridExtra)

Latar Belakang

Andikan Anda adalah seorang Manajer dibidang projek Data Scince, ingin melakukan analisis perilaku pelanggan menggunakan data transaksi perusahaan ritel online di Inggris (yang memperoleh dataset dalam kurung waktu antara 01/12/2010 dan 09/12/2011). Diketahui dari data tersebut banyak pelanggan perusahaan adalah grosir (pemasok). Selain itu, ada beberapa hal penting yang perlu diperhatikan mengenai data tersebut adalah sebagai berikut:

Variabel Deskripsi
invoice_no Nomor invoice terdiri dari 6 digit unik untuk setiap transaksi. Jika diawali dengan huruf C, ini menandakan bahwa transaksi tersebut berstatus Batal
stock_code Kode produk yang unik untuk setiap produk, terdiri dari 5 digit angka yang unik untuk setiap produk (Deskripsi Nama Produk).
quantity Jumlah produk yang dibeli
invoice_date Tanggal dan waktu transaksi
unit_price Harga produk per unit
customer_id ID Pelanggan terdiri dari 5 digit angka yang unik untuk setiap pelanggan.
country Negara pelanggan

Anda dapat mengunduh data yang digunakan dalam kasus ini di Google Classrom atau klik Retail.xlsx dan Retail.rds.

Tugas 1

Import kedua data tersebut ke Rstudio Anda sesuai dengan jenis file masing-masing (Proses import mana yang lebih baik menurut Anda?).

Retail<-read_excel("Retail.xlsx")   
head(Retail)
## # A tibble: 6 x 8
##   InvoiceNo StockCode Description Quantity InvoiceDate         UnitPrice
##   <chr>     <chr>     <chr>          <dbl> <dttm>                  <dbl>
## 1 536365    85123A    WHITE HANG~        6 2010-12-01 08:26:00      2.55
## 2 536365    71053     WHITE META~        6 2010-12-01 08:26:00      3.39
## 3 536365    84406B    CREAM CUPI~        8 2010-12-01 08:26:00      2.75
## 4 536365    84029G    KNITTED UN~        6 2010-12-01 08:26:00      3.39
## 5 536365    84029E    RED WOOLLY~        6 2010-12-01 08:26:00      3.39
## 6 536365    22752     SET 7 BABU~        2 2010-12-01 08:26:00      7.65
## # ... with 2 more variables: CustomerID <dbl>, Country <chr>
Retail <- readRDS("Retail.rds")
head(Retail)
## # A tibble: 6 x 8
##   InvoiceNo StockCode Description Quantity InvoiceDate         UnitPrice
##   <chr>     <chr>     <chr>          <dbl> <dttm>                  <dbl>
## 1 536365    85123A    WHITE HANG~        6 2010-12-01 08:26:00      2.55
## 2 536365    71053     WHITE META~        6 2010-12-01 08:26:00      3.39
## 3 536365    84406B    CREAM CUPI~        8 2010-12-01 08:26:00      2.75
## 4 536365    84029G    KNITTED UN~        6 2010-12-01 08:26:00      3.39
## 5 536365    84029E    RED WOOLLY~        6 2010-12-01 08:26:00      3.39
## 6 536365    22752     SET 7 BABU~        2 2010-12-01 08:26:00      7.65
## # ... with 2 more variables: CustomerID <dbl>, Country <chr>

Argumen Anda: Dari dua format data di atas, yaitu .rds dan .xlsx, saya lebih condong memilih pemasukan/peng-import-an data dari format .rds dikarenakan sekalipun hasil dari data yang di-import sama, meng-import data dengan format .xlsx mengharuskan kita untuk meng-install package yang dibutuhkan, yaiu package readxl, sedangkan untuk memasukkan data denan format .rds tidak memerlukan package apapun.

Tugas 2

Ubah nama variabel data tersebut agar lebih mudah dipelajari oleh pembaca.

names(Retail) <- c("Nomor Faktur",
                   "Kode Stok",
                   "Deskripsi Barang",
                   "Kuantitas",
                   "Tanggal Faktur",
                   "Harga Barang",
                   "ID Pembeli",
                   "Negara")

Argumen Anda: Disini saya mengubah header menjadi bahasa yang lebih di mudah mengerti, yaitu bahasa Indonesia agar lebih mudah dipahami oleh orang awam.

Tugas 3

Lakukan pemeriksaan struktur data untuk mengubah jenis kumpulan data (jika ada yang perlu diubah).

str(Retail)
## tibble [541,909 x 8] (S3: tbl_df/tbl/data.frame)
##  $ Nomor Faktur    : chr [1:541909] "536365" "536365" "536365" "536365" ...
##  $ Kode Stok       : chr [1:541909] "85123A" "71053" "84406B" "84029G" ...
##  $ Deskripsi Barang: chr [1:541909] "WHITE HANGING HEART T-LIGHT HOLDER" "WHITE METAL LANTERN" "CREAM CUPID HEARTS COAT HANGER" "KNITTED UNION FLAG HOT WATER BOTTLE" ...
##  $ Kuantitas       : num [1:541909] 6 6 8 6 6 2 6 6 6 32 ...
##  $ Tanggal Faktur  : POSIXct[1:541909], format: "2010-12-01 08:26:00" "2010-12-01 08:26:00" ...
##  $ Harga Barang    : num [1:541909] 2.55 3.39 2.75 3.39 3.39 7.65 4.25 1.85 1.85 1.69 ...
##  $ ID Pembeli      : num [1:541909] 17850 17850 17850 17850 17850 ...
##  $ Negara          : chr [1:541909] "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
data.frame(
  `Nomor Faktur` = Retail$`Nomor Faktur` %>% unique() %>% length(),
  `Kode Stok` = Retail$`Kode Stok` %>% unique() %>% length(),
  `Deskripsi Barang` = Retail$`Deskripsi Barang` %>% unique() %>% length(),
  `Negara` = Retail$Negara %>% unique() %>% length(),
  `ID Pembeli` = Retail$`ID Pembeli` %>% unique() %>% length()
)
##   Nomor.Faktur Kode.Stok Deskripsi.Barang Negara ID.Pembeli
## 1        25900      4070             4212     38       4373
Retail$`Negara`<-as.factor(Retail$`Negara`)
Retail$Kuantitas <- as.integer(Retail$Kuantitas)
str(Retail)
## tibble [541,909 x 8] (S3: tbl_df/tbl/data.frame)
##  $ Nomor Faktur    : chr [1:541909] "536365" "536365" "536365" "536365" ...
##  $ Kode Stok       : chr [1:541909] "85123A" "71053" "84406B" "84029G" ...
##  $ Deskripsi Barang: chr [1:541909] "WHITE HANGING HEART T-LIGHT HOLDER" "WHITE METAL LANTERN" "CREAM CUPID HEARTS COAT HANGER" "KNITTED UNION FLAG HOT WATER BOTTLE" ...
##  $ Kuantitas       : int [1:541909] 6 6 8 6 6 2 6 6 6 32 ...
##  $ Tanggal Faktur  : POSIXct[1:541909], format: "2010-12-01 08:26:00" "2010-12-01 08:26:00" ...
##  $ Harga Barang    : num [1:541909] 2.55 3.39 2.75 3.39 3.39 7.65 4.25 1.85 1.85 1.69 ...
##  $ ID Pembeli      : num [1:541909] 17850 17850 17850 17850 17850 ...
##  $ Negara          : Factor w/ 38 levels "Australia","Austria",..: 36 36 36 36 36 36 36 36 36 36 ...

Argumen Anda: Dari hasil str pertama kita dapat melihat bahwa Negara merupakan tipe data character, tetapi hanya ada 38 Negara, sehingga alangkah baiknya jika kita mengubahnya menjadi faktor

Tugas 4

Pembersihan data atau disebut juga data scrubbing adalah proses menganalisis kualitas data dengan cara mengubah. Anda sebagai Manajer juga dapat memperbaiki atau menghapus data tersebut. Beberapa hal yang mungkin dilakukan dalam projek ini adalah:

4.1 Transaksi yang dibatalkan

Row <- grep("C", Retail$`Nomor Faktur` )
length(Row)
## [1] 9288
head(Row)
## [1] 142 155 236 237 238 239
Retail[head(Row),1]
## # A tibble: 6 x 1
##   `Nomor Faktur`
##   <chr>         
## 1 C536379       
## 2 C536383       
## 3 C536391       
## 4 C536391       
## 5 C536391       
## 6 C536391
Retail <- Retail[-Row, ]
Retail[head(Row),1]
## # A tibble: 6 x 1
##   `Nomor Faktur`
##   <chr>         
## 1 536382        
## 2 536384        
## 3 536392        
## 4 536392        
## 5 536392        
## 6 536392

Argumen Anda: Transaksi yang dibatalkan adalah transaksi yang memiliki huruf C didepan kode faktur. Disini saya mengasumsikan bahwa C adalah singkatan dari canceled, yang menandakan bahwa transaksi faktur tersebut dibatalkan. Sehingga kita perlu menghapus record tersebut.

4.2 Faktur tidak valid

inv_Invoice <- Retail[nchar(Retail$`Nomor Faktur`)>6,]
inv_Invoice
## # A tibble: 3 x 8
##   `Nomor Faktur` `Kode Stok` `Deskripsi Bara~ Kuantitas `Tanggal Faktur`   
##   <chr>          <chr>       <chr>                <int> <dttm>             
## 1 A563185        B           Adjust bad debt          1 2011-08-12 14:50:00
## 2 A563186        B           Adjust bad debt          1 2011-08-12 14:51:00
## 3 A563187        B           Adjust bad debt          1 2011-08-12 14:52:00
## # ... with 3 more variables: `Harga Barang` <dbl>, `ID Pembeli` <dbl>,
## #   Negara <fct>
Retail <- Retail[!nchar(Retail$`Nomor Faktur`)>6,]

Argumen Anda: Faktur tidak valid adalah transaksi dengan kode Nomor Faktur lebih dari 5.

4.3 Kuantitas tidak valid

Inv_Qty <- Retail[Retail$Kuantitas<=0,]
nrow(Inv_Qty)
## [1] 1336
Inv_Qty
## # A tibble: 1,336 x 8
##    `Nomor Faktur` `Kode Stok` `Deskripsi Bara~ Kuantitas `Tanggal Faktur`   
##    <chr>          <chr>       <chr>                <int> <dttm>             
##  1 536589         21777       <NA>                   -10 2010-12-01 16:50:00
##  2 536764         84952C      <NA>                   -38 2010-12-02 14:42:00
##  3 536996         22712       <NA>                   -20 2010-12-03 15:30:00
##  4 536997         22028       <NA>                   -20 2010-12-03 15:30:00
##  5 536998         85067       <NA>                    -6 2010-12-03 15:30:00
##  6 537000         21414       <NA>                   -22 2010-12-03 15:32:00
##  7 537001         21653       <NA>                    -6 2010-12-03 15:33:00
##  8 537003         85126       <NA>                    -2 2010-12-03 15:33:00
##  9 537004         21814       <NA>                   -30 2010-12-03 15:34:00
## 10 537005         21692       <NA>                   -70 2010-12-03 15:35:00
## # ... with 1,326 more rows, and 3 more variables: `Harga Barang` <dbl>, `ID
## #   Pembeli` <dbl>, Negara <fct>
average_qty <- round(mean(Retail$Kuantitas[Retail$Kuantitas>0]),
                     0)
Retail$`Kuantitas` <- ifelse(Retail$Kuantitas <= 0,
                             average_qty,
                             Retail$Kuantitas)

Argumen Anda: Kuantitas yang tidak valid adalah harga yang tidak memiliki 0 atau bahkan di bawahnya, jadi disini saya menghapus data dengan kuantitas sama atau kurang dari 0

4.4 Harga Satuan Tidak Valid

Inv_Price <- Retail[Retail$`Harga Barang`<=0,]
nrow(Inv_Price)
## [1] 2515
Inv_Price
## # A tibble: 2,515 x 8
##    `Nomor Faktur` `Kode Stok` `Deskripsi Bara~ Kuantitas `Tanggal Faktur`   
##    <chr>          <chr>       <chr>                <dbl> <dttm>             
##  1 536414         22139       <NA>                    56 2010-12-01 11:52:00
##  2 536545         21134       <NA>                     1 2010-12-01 14:32:00
##  3 536546         22145       <NA>                     1 2010-12-01 14:33:00
##  4 536547         37509       <NA>                     1 2010-12-01 14:33:00
##  5 536549         85226A      <NA>                     1 2010-12-01 14:34:00
##  6 536550         85044       <NA>                     1 2010-12-01 14:34:00
##  7 536552         20950       <NA>                     1 2010-12-01 14:34:00
##  8 536553         37461       <NA>                     3 2010-12-01 14:35:00
##  9 536554         84670       <NA>                    23 2010-12-01 14:35:00
## 10 536589         21777       <NA>                    11 2010-12-01 16:50:00
## # ... with 2,505 more rows, and 3 more variables: `Harga Barang` <dbl>, `ID
## #   Pembeli` <dbl>, Negara <fct>
average_prc <- round(mean(Retail$`Harga Barang`[Retail$`Harga Barang`>0]),
                     0)
Retail$`Harga Barang` <- ifelse(Retail$`Harga Barang` <= 0,
                                average_prc,
                                Retail$`Harga Barang`)

Argumen Anda: Harga yang tidak valid adalah harga yang tidak memiliki 0 atau bahkan di bawahnya, jadi disini saya menghapus data dengan harga sama atau kurang dari 0

4.5 Produk Tidak Valid

Stock_Valid <- Retail %>% mutate(
  stock_code_validation = as.numeric (substr(`Kode Stok`, 1, 5))
) %>% select(
  stock_code_validation, `Kode Stok`, `Deskripsi Barang`
) %>% distinct()

Stock_Valid
## # A tibble: 5,732 x 3
##    stock_code_validation `Kode Stok` `Deskripsi Barang`                 
##                    <dbl> <chr>       <chr>                              
##  1                 85123 85123A      WHITE HANGING HEART T-LIGHT HOLDER 
##  2                 71053 71053       WHITE METAL LANTERN                
##  3                 84406 84406B      CREAM CUPID HEARTS COAT HANGER     
##  4                 84029 84029G      KNITTED UNION FLAG HOT WATER BOTTLE
##  5                 84029 84029E      RED WOOLLY HOTTIE WHITE HEART.     
##  6                 22752 22752       SET 7 BABUSHKA NESTING BOXES       
##  7                 21730 21730       GLASS STAR FROSTED T-LIGHT HOLDER  
##  8                 22633 22633       HAND WARMER UNION JACK             
##  9                 22632 22632       HAND WARMER RED POLKA DOT          
## 10                 84879 84879       ASSORTED COLOUR BIRD ORNAMENT      
## # ... with 5,722 more rows
Retail %>% filter(
  `Deskripsi Barang` %in% (Stock_Valid[is.na(Stock_Valid$stock_code_validation),] %>% 
                                            .$`Deskripsi Barang`)
  )
## # A tibble: 3,847 x 8
##    `Nomor Faktur` `Kode Stok` `Deskripsi Bara~ Kuantitas `Tanggal Faktur`   
##    <chr>          <chr>       <chr>                <dbl> <dttm>             
##  1 536370         POST        POSTAGE                  3 2010-12-01 08:45:00
##  2 536403         POST        POSTAGE                  1 2010-12-01 11:27:00
##  3 536414         22139       <NA>                    56 2010-12-01 11:52:00
##  4 536527         POST        POSTAGE                  1 2010-12-01 13:04:00
##  5 536540         C2          CARRIAGE                 1 2010-12-01 14:05:00
##  6 536544         DOT         DOTCOM POSTAGE           1 2010-12-01 14:32:00
##  7 536545         21134       <NA>                     1 2010-12-01 14:32:00
##  8 536546         22145       <NA>                     1 2010-12-01 14:33:00
##  9 536547         37509       <NA>                     1 2010-12-01 14:33:00
## 10 536549         85226A      <NA>                     1 2010-12-01 14:34:00
## # ... with 3,837 more rows, and 3 more variables: `Harga Barang` <dbl>, `ID
## #   Pembeli` <dbl>, Negara <fct>
Inv_Stock <- Stock_Valid[is.na(Stock_Valid$stock_code_validation),] %>%
  .$`Deskripsi Barang`
Inv_Stock
##  [1] "POSTAGE"                            "CARRIAGE"                          
##  [3] "DOTCOM POSTAGE"                     "Manual"                            
##  [5] "Bank Charges"                       "AMAZON FEE"                        
##  [7] "SUNJAR LED NIGHT NIGHT LIGHT"       "BOXED GLASS ASHTRAY"               
##  [9] "Dotcomgiftshop Gift Voucher £40.00" "CAMOUFLAGE DOG COLLAR"             
## [11] "Manual"                             "Dotcomgiftshop Gift Voucher £50.00"
## [13] "Dotcomgiftshop Gift Voucher £30.00" "Dotcomgiftshop Gift Voucher £20.00"
## [15] NA                                   NA                                  
## [17] NA                                   NA                                  
## [19] "OOH LA LA DOGS COLLAR"              NA                                  
## [21] "BOYS PARTY BAG"                     "GIRLS PARTY BAG"                   
## [23] "Dotcomgiftshop Gift Voucher £10.00" NA                                  
## [25] "SAMPLES"                            "PADS TO MATCH ALL CUSHIONS"        
## [27] "HAYNES CAMPER SHOULDER BAG"         "to push order througha s stock was"
## [29] "ebay"                               NA                                  
## [31] NA                                   "ebay"                              
## [33] "ebay"                               "ebay"                              
## [35] NA                                   "ebay"                              
## [37] NA                                   NA                                  
## [39] NA
Retail <- Retail %>% filter(!`Deskripsi Barang` %in% Inv_Stock)

Inv_Stock <- c( "check", "check?", "?", "??", "damaged", "found",
                "adjustment", "Amazon", "AMAZON", "amazon adjust",
                "Amazon Adjustment", "amazon sales", "Found", "FOUND",
                "found box", "Found by jackie ","Found in w/hse","dotcom",
                "dotcom adjust", "allocate stock for dotcom orders ta", "FBA",
                "Dotcomgiftshop Gift Voucher £100.00", "on cargo order",
                "wrongly sold (22719) barcode", "wrongly marked 23343",
                "dotcomstock", "rcvd be air temp fix for dotcom sit",
                "Manual", "John Lewis", "had been put aside",
                "for online retail orders", "taig adjust", "amazon",
                "incorrectly credited C550456 see 47", "returned",
                "wrongly coded 20713", "came coded as 20713",
                "add stock to allocate online orders", "Adjust bad debt",
                "alan hodge cant mamage this section", "website fixed",
                "did  a credit  and did not tick ret", "michel oops",
                "incorrectly credited C550456 see 47", "mailout", "test",
                "Sale error",  "Lighthouse Trading zero invc incorr", "SAMPLES",
                "Marked as 23343", "wrongly coded 23343","Adjustment",
                "rcvd be air temp fix for dotcom sit", "Had been put aside.", 
                "Damaged", "thrown away", "Unsaleable, destroyed.", 
                "wrongly marked. 23343 in box", "wrongly coded-23343", "wet/rusty", 
                "lost in space", "damages", "damages/display", "taig adjust no stock",
                "WET/MOULDY", "damages?", "wet", "sold as set on dotcom", "wet rusty", 
                "wrongly marked", "???", "broken", "Sold as 1 on dotcom", "Show Samples", 
                "damages?", "CHECK", "mystery! Only ever imported 1800", "re dotcom quick fix.",
                "samples", "POSSIBLE DAMAGES OR LOST?", "re dotcom quick fix.", 
                "?display", "mixed up", "wrong barcode", "sold as set on dotcom and amazon")
Retail <- Retail %>% filter(!`Deskripsi Barang` %in% Inv_Stock)

Argumen Anda: Disini, kita menghapus data dengan kode stok yang tidak terdiri dari 5 angka random dan juga produk dengan deskripsi barang yang diasumsikan terjai salah input.

4.6 Deskripsi Ganda & Stok

Retail_product <- Retail %>% select(`Kode Stok`,`Deskripsi Barang`) %>% distinct()
Retail_product <- Retail_product %>% 
  mutate(stock_code_lowercase = tolower(`Kode Stok`),
         description_lowercase = tolower(`Deskripsi Barang`))

data_frame(
  stock_code_unik = Retail_product$`Kode Stok` %>% unique() %>% length(),
  stock_code_unik_lowercase = Retail_product$stock_code_lowercase %>% unique() %>% length(),
  description_unik = Retail_product$`Deskripsi Barang` %>% unique() %>% length(),
  description_unik_lower = Retail_product$description_lowercase %>% unique() %>% length()
)
## # A tibble: 1 x 4
##   stock_code_unik stock_code_unik_lowerca~ description_unik description_unik_lo~
##             <int>                    <int>            <int>                <int>
## 1            3906                     3797             4096                 4090

Argumen Anda: Kita mulai dari mengecek keunikan Kode Stok dan Deskripsi Barang. Dan dapat kita lihat ada perbedaan antara keunikan kode stok dengan kode stok yang kita buat lowercase, sehingga dapat kita ketahui bahwa ada kode stok yang sama namun dianggap berbeda karena huruf kapital.

stock_code_check_dupli <- Retail_product %>% select(`Kode Stok`,stock_code_lowercase) %>% 
  distinct() %>% 
  group_by(stock_code_lowercase) %>% 
  summarise(freq = n()) %>% 
  ungroup() %>% 
  filter(freq>1)

Retail_product %>% filter(stock_code_lowercase %in% stock_code_check_dupli$stock_code_lowercase) %>% 
  arrange(stock_code_lowercase)
## # A tibble: 242 x 4
##    `Kode Stok` `Deskripsi Barang`      stock_code_lowerc~ description_lowercase 
##    <chr>       <chr>                   <chr>              <chr>                 
##  1 15056BL     EDWARDIAN PARASOL BLACK 15056bl            edwardian parasol bla~
##  2 15056bl     EDWARDIAN PARASOL BLACK 15056bl            edwardian parasol bla~
##  3 15056N      EDWARDIAN PARASOL NATU~ 15056n             edwardian parasol nat~
##  4 15056n      EDWARDIAN PARASOL NATU~ 15056n             edwardian parasol nat~
##  5 15056P      EDWARDIAN PARASOL PINK  15056p             edwardian parasol pink
##  6 15056p      EDWARDIAN PARASOL PINK  15056p             edwardian parasol pink
##  7 15060B      FAIRY CAKE DESIGN UMBR~ 15060b             fairy cake design umb~
##  8 15060b      FAIRY CAKE DESIGN UMBR~ 15060b             fairy cake design umb~
##  9 18098C      PORCELAIN BUTTERFLY OI~ 18098c             porcelain butterfly o~
## 10 18098c      PORCELAIN BUTTERFLY OI~ 18098c             porcelain butterfly o~
## # ... with 232 more rows

Argumen Anda Disini kita dapat melihat kode stok yang seharusnya sama tapi terdetect berbeda karena adanya perbedaan ekspresi huruf kapital, jadi dapat kita selesaikan dengan mengapitalkan kode stok.

Retail <- Retail %>% mutate(
  `Kode Stok` = toupper(`Kode Stok`)
)

data_frame(
  jumlah_stock_code_unik = Retail$`Kode Stok` %>% unique() %>% length(),
  stock_code_unik_lowercase = Retail$`Kode Stok` %>% tolower() %>% unique() %>% length(),
  description_unik = Retail$`Deskripsi Barang` %>% unique() %>% length(),
  description_unik_lower = Retail$`Deskripsi Barang` %>% tolower() %>% unique() %>% length()
)
## # A tibble: 1 x 4
##   jumlah_stock_code_u~ stock_code_unik_low~ description_unik description_unik_l~
##                  <int>                <int>            <int>               <int>
## 1                 3797                 3797             4096                4090
description_check <- Retail %>% select(`Kode Stok`,`Deskripsi Barang`) %>% 
  distinct() %>% 
  group_by(`Kode Stok`) %>% 
  summarise(freq = n()) %>% 
  ungroup() %>% 
  filter(freq>1)

description_check
## # A tibble: 300 x 2
##    `Kode Stok`  freq
##    <chr>       <int>
##  1 16156L          2
##  2 17107D          3
##  3 20622           2
##  4 20681           2
##  5 20725           2
##  6 20914           2
##  7 21109           2
##  8 21112           2
##  9 21175           2
## 10 21232           2
## # ... with 290 more rows

Argumen Anda Disini kita melihat ada Kode Stok yang memiliki lebih dari 1 Deskripsi Barang yang mana harus kita perbaiki.

Retail %>% filter(`Kode Stok` %in% description_check$`Kode Stok`) %>% 
  select(`Kode Stok`,`Deskripsi Barang`) %>% 
  distinct() %>% 
  arrange(`Kode Stok`,`Deskripsi Barang`)
## # A tibble: 649 x 2
##    `Kode Stok` `Deskripsi Barang`                 
##    <chr>       <chr>                              
##  1 16156L      WRAP CAROUSEL                      
##  2 16156L      WRAP, CAROUSEL                     
##  3 17107D      FLOWER FAIRY 5 DRAWER LINERS       
##  4 17107D      FLOWER FAIRY 5 SUMMER DRAW LINERS  
##  5 17107D      FLOWER FAIRY,5 SUMMER B'DRAW LINERS
##  6 20622       VIP PASSPORT COVER                 
##  7 20622       VIPPASSPORT COVER                  
##  8 20681       MIA                                
##  9 20681       PINK POLKADOT CHILDRENS UMBRELLA   
## 10 20725       LUNCH BAG RED RETROSPOT            
## # ... with 639 more rows

Argumen Anda Dari pengecekan di atas, ternyata kode stok tersebut memiliki deskripsi barang yang sama namun memiliki perbedaan model penulisan, sehingga kita dapat mengambil salah satunya. Mari kita ambil yang di atas dengan fungsi slice(1).

Retail_description <- Retail %>% select(`Kode Stok`,`Deskripsi Barang`) %>% 
  filter(`Kode Stok` %in% description_check$`Kode Stok`) %>% 
  distinct() %>% 
  group_by(`Kode Stok`) %>% 
  slice(1) %>% 
  ungroup()

Retail <- Retail %>% 
  left_join(Retail_description, by="Kode Stok") %>% 
  mutate(`Deskripsi Barang` = ifelse(is.na(`Deskripsi Barang.y`),`Deskripsi Barang.x`,`Deskripsi Barang.y`)) %>% 
  select(-c(`Deskripsi Barang.y`,`Deskripsi Barang.x`))


data_frame(
  jumlah_stock_code_unik = Retail$`Kode Stok` %>% unique() %>% length(),
  jumlah_description_unik = Retail$`Deskripsi Barang` %>% unique() %>% length()
)
## # A tibble: 1 x 2
##   jumlah_stock_code_unik jumlah_description_unik
##                    <int>                   <int>
## 1                   3797                    3771

Argumen Anda Dari hasil di atas, kita mendapatkan hasil yang berbeda untuk jumlah unik Deskrip Barang dan Kode Stok, yang mana artinya ada kesalahan dalam peletakkan Kode Stok. Karena Kode Stok unik lebih banyak, berarti ada Deskripsi Barang yang memiliki dua Kode Stok.

Retail_description <- Retail %>% select(`Kode Stok`,`Deskripsi Barang`) %>% 
  distinct() %>% 
  group_by(`Deskripsi Barang`) %>% 
  summarise(freq = n()) %>% 
  ungroup() %>% 
  filter(freq>1)

Retail_description
## # A tibble: 24 x 2
##    `Deskripsi Barang`               freq
##    <chr>                           <int>
##  1 BATHROOM METAL SIGN                 2
##  2 COLOURING PENCILS BROWN TUBE        2
##  3 COLUMBIAN CANDLE RECTANGLE          2
##  4 COLUMBIAN CANDLE ROUND              3
##  5 EAU DE NILE JEWELLED PHOTOFRAME     2
##  6 FRENCH FLORAL CUSHION COVER         2
##  7 FRENCH LATTICE CUSHION COVER        2
##  8 FRENCH PAISLEY CUSHION COVER        2
##  9 FROSTED WHITE BASE                  2
## 10 HEART T-LIGHT HOLDER                2
## # ... with 14 more rows

Argumen Anda Dari pengecekan di atas dapat kita pastikan Deskripsi Barang yang memiliki Dua atau lebih Kode Stok.

Retail %>% select(`Kode Stok`,`Deskripsi Barang`) %>% 
  distinct() %>% 
  filter(`Deskripsi Barang` %in% c(Retail_description$`Deskripsi Barang`)) %>% 
  arrange(`Deskripsi Barang`)
## # A tibble: 50 x 2
##    `Kode Stok` `Deskripsi Barang`             
##    <chr>       <chr>                          
##  1 82580       BATHROOM METAL SIGN            
##  2 21171       BATHROOM METAL SIGN            
##  3 10133       COLOURING PENCILS BROWN TUBE   
##  4 10135       COLOURING PENCILS BROWN TUBE   
##  5 72133       COLUMBIAN CANDLE RECTANGLE     
##  6 72131       COLUMBIAN CANDLE RECTANGLE     
##  7 72127       COLUMBIAN CANDLE ROUND         
##  8 72130       COLUMBIAN CANDLE ROUND         
##  9 72128       COLUMBIAN CANDLE ROUND         
## 10 85023B      EAU DE NILE JEWELLED PHOTOFRAME
## # ... with 40 more rows

Argumen Anda Untuk masalah di atas, kita dapat melakukan hal yang sama dengan sebelumnya. Kita cukup mengambil Kode Stok yang pertama dengan fungsi slice()

Retail_product_unik <- Retail %>% select(`Kode Stok`,`Deskripsi Barang`) %>% 
  filter(`Deskripsi Barang` %in% c(Retail_description$`Deskripsi Barang`)) %>% 
  distinct() %>% 
  group_by(`Deskripsi Barang`) %>% 
  slice(1) %>% 
  ungroup()

Retail <- Retail %>% left_join(Retail_product_unik, by="Deskripsi Barang") %>% 
  mutate(`Kode Stok` = ifelse(is.na(`Kode Stok.y`),`Kode Stok.x`,`Kode Stok.y`)) %>% 
  select(-c("Kode Stok.x","Kode Stok.y")) %>% 
  select("Nomor Faktur","Kode Stok","Deskripsi Barang",
         "Kuantitas","Tanggal Faktur","Harga Barang",
         "ID Pembeli","Negara")


data_frame(
  jumlah_stock_code_unik = Retail$`Kode Stok` %>% unique() %>% length(),
  jumlah_description_unik = Retail$`Deskripsi Barang` %>% unique() %>% length(),
  jumlah_code_description_unik = Retail %>% select(`Kode Stok`,`Deskripsi Barang`) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 3
##   jumlah_stock_code_unik jumlah_description_unik jumlah_code_description_unik
##                    <int>                   <int>                        <int>
## 1                   3771                    3771                         3771

Argumen Anda Jumlah unik untuk Kode Stok dan Deskripsi Barang teah sama, sehingga masalahnya telah teratasi.

4.7 Negara Tidak Valid

data_frame(
  customer_id_unik = Retail %>% select(`ID Pembeli`) %>% distinct() %>% nrow(),
  customer_country_unik = Retail %>% select(`ID Pembeli`,Negara) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 2
##   customer_id_unik customer_country_unik
##              <int>                 <int>
## 1             4336                  4352

Argumen Anda: Kita dapat melihat adanya perbedaan jumlah unik ID Pembeli dan Negara yang mana menunjukkan ada customer dengan dua Negara. Hal ini dapat terjadi apabila seorang customer melakukan transaksi di dua negara berbeda. Untuk menyelesaikan proses ini, kita dapat menggunakan slice(1) lagi. Tapi kita akan mengambil Negara dari pembelian terakhir, jadi kita perlu mengurutkan Tanggal Faktur menjadi yang terbaru sampai yang terlama.

Retail_customer <- Retail %>% 
  arrange(desc(`Tanggal Faktur`,`ID Pembeli`)) %>% 
  select(`ID Pembeli`, Negara) %>% 
  group_by(`ID Pembeli`) %>%
  slice(1)

Retail <- Retail %>% select(-Negara) %>%
  left_join(Retail_customer, by = "ID Pembeli")

data_frame(
  customer_id_unik = Retail %>% select(`ID Pembeli`) %>% distinct() %>% nrow(),
  customer_country_unik = Retail %>% select(`ID Pembeli`,Negara) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 2
##   customer_id_unik customer_country_unik
##              <int>                 <int>
## 1             4336                  4336

Argumen Anda Dari hasil pengecekan di atas dapat kita lihat bahwa jumlah unik ID Pembeli dan Negara telah sama, sehingga masalah double Negara telah teratasi

4.8 Pemutusan Berkala

Retail$Month <- factor(format(Retail$`Tanggal Faktur`,
                              "%b %Y"),
                       levels=paste(month.abb, rep(2010:2011, each=12)))
Retail <- Retail[-grep("Dec 2011", Retail$Month),]

Argumen Anda: Data pembelian di Dec 2011 belum selesai jadi dapat kita hilangkan dari record.

4.9 Data Duplikat

Retail <- Retail %>% distinct()

Argumen Anda: Disini kita akan menghilangkan data yang terdeteksi duplikat sama persis dengan menggunakan fungsi dplyr::distinct().

4.10 Fitur ekstraksi

Retail$`Total Pembayaran` <- Retail$Kuantitas*Retail$`Harga Barang`
Fitur_ekstraksi <- sum(Retail$`Total Pembayaran`)
Fitur_ekstraksi
## [1] 9701904

Argumen Anda: Di fitur ekstraksi, kita menghitung total pembayaran untuk setiap unit berdasarkan kuantitas dan harga barang yang dibeli.

4.11 Nilai yang hilang

colSums(is.na(Retail))
##     Nomor Faktur        Kode Stok Deskripsi Barang        Kuantitas 
##                0                0                0                0 
##   Tanggal Faktur     Harga Barang       ID Pembeli           Negara 
##                0                0           124021                0 
##            Month Total Pembayaran 
##                0                0
list_na <- colnames(Retail)[ apply(Retail, 2, anyNA) ]
list_na
## [1] "ID Pembeli"
Retail <- na.omit(Retail)

Argumen Anda: Karena NA ada di data bertipe karakter, maka kita perlu menghilangkan baris yang memiliki NA. Dan ketika kita menghilangkan baris yang mengandung NA dengan fungsi na.omit(), kita dapat melihat bahwa tidak ada lagi nilai yang hilang.

list_na <- colnames(Retail)[ apply(Retail, 2, anyNA) ]
list_na
## character(0)

Tugas 5

Simpan data yang sudah Anda bersihkan ke dalam folder dalam format .json atau .xml atau .rds.

saveRDS(Retail, "Retail_New.rds")

Tugas 6

Import data yang sudah anda simpan pada Tugas 5, silahkan pilih salah satau jenis file saja. Kemudian, lakukan Analisis Data Eksplorasi dengan menggunakan Visualisasi yang telah Anda pelajari untuk menjawab setiap pertanyaan berikut:

6.1 Jumlah transaksi pelanggan setiap bulan

Gunakan Bar-Chart untuk memperlihatkan berapa banyak pelanggan yang melakukan transaksi setiap bulan?

Retail <- readRDS("Retail_New.rds")
head(Retail)
## # A tibble: 6 x 10
##   `Nomor Faktur` `Kode Stok` `Deskripsi Bara~ Kuantitas `Tanggal Faktur`   
##   <chr>          <chr>       <chr>                <dbl> <dttm>             
## 1 536365         85123A      WHITE HANGING H~         6 2010-12-01 08:26:00
## 2 536365         71053       WHITE METAL LAN~         6 2010-12-01 08:26:00
## 3 536365         84406B      CREAM CUPID HEA~         8 2010-12-01 08:26:00
## 4 536365         84029G      KNITTED UNION F~         6 2010-12-01 08:26:00
## 5 536365         84029E      RED WOOLLY HOTT~         6 2010-12-01 08:26:00
## 6 536365         22752       SET 7 BABUSHKA ~         2 2010-12-01 08:26:00
## # ... with 5 more variables: `Harga Barang` <dbl>, `ID Pembeli` <dbl>,
## #   Negara <fct>, Month <fct>, `Total Pembayaran` <dbl>
Retail$Month <- factor(format(Retail$`Tanggal Faktur`,
                              "%b %Y"),
                       levels=paste(month.abb, rep(2010:2011, each=12)))
Retail$Date <- format(Retail$`Tanggal Faktur`,
                      "%Y-%m-%d")

Pelanggan <- Retail %>% count(Month, `ID Pembeli`)  %>%
  select(-n) %>%
  group_by(Month) %>%
  summarise(cust = n())

library(ggplot2)                                  
library(scales)                              
ggplot(Pelanggan, aes(x = Month,
                      y= cust)) +
  geom_text(aes(label = cust),
            vjust = -0.25) +
  geom_bar(fill = rainbow(12),
           color = "black",
           stat = "identity")+
  theme_minimal() +
  labs(x = "Bulan", 
       y = "Pelanggan", 
       title  = "Jumlah Pelanggan per Bulan")+
  theme(axis.text.x = element_text(angle = 25, hjust = 1))

Argumen Anda: Dari hasil di atas kita dapat melihat, bahwa pelanggan terbanyak ada di bulan November 2011, yaitu 1661 pelanggan.

6.2 Pertumbuhan pelanggan baru setiap bulan

Gunakan interaktif Line-Chart untuk memperlihatkan bagaimana pertumbuhan pelanggan baru setiap bulan?

plot_monthly_new_customer <- Retail %>%
  group_by(`ID Pembeli`) %>% 
  summarise(first_order = min(`Tanggal Faktur`)) %>% 
  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(
     normalisasi = (total_new_customer-min(total_new_customer))/(max(total_new_customer)-min(total_new_customer)),
     popup=glue("Year-Month : {ym}
                 Total New Customer : {total_new_customer} ({round((total_new_customer/sum(total_new_customer))*100,1)}%)")
  ) %>% 
  ggplot(aes(yearmonth,normalisasi))+
  geom_line(size=0.7,color="#181818") +
  labs(
    title = "Growth of New Customer",
    x = "Month-Year",
    y = NULL
  )+
  geom_point(color="#181818", size = 2, alpha = 0.9, aes(text=popup))+
  scale_x_date(breaks=date_breaks('1 months'),
     labels=date_format('%b %y'))+
  theme(
    axis.text.y = element_blank()
  )


ggplotly(plot_monthly_new_customer, tooltip = "text")

Argumen Anda: Dapat kita lihat, pertumbuhan terbanyak setelah Desember 2010 adalah Maret 2011, yaitu meningkat 10.5%

6.3 Waktu pemesanan yang terbaru dalam (bulanan, harian, dan per-jam)

Gunakan charts-Radar untuk menganalisis Waktu pemesanan yang terbaru dalam (bulanan, harian, dan per-jam)

#1. Perbulan
Monthly_Sales <- Retail %>%
  select(`Tanggal Faktur`,`Nomor Faktur`) %>%
  distinct() %>%
  mutate(Month = month(`Tanggal Faktur`),
         Day = day(`Tanggal Faktur`)) %>%
  group_by(Month, Day) %>%
  summarize(Freq = n()) %>%
  group_by(Day) %>%
  summarize(Monthly_Mean = as.integer(mean(Freq)))

radar1 <- Monthly_Sales %>%
  ggplot(aes(x = as.factor(Day),
             y = Monthly_Mean)) +
  geom_bar(aes(fill = Monthly_Mean),
           show.legend = FALSE,
           stat = "identity") +
  labs(x = "Tanggal",
       title = "Pembelian Bulanan") +
  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 = "cyan", high = "darkblue")+
  coord_polar()


#2. Perhari
Daily_Sales  <- Retail %>%
  select(`Tanggal Faktur`,`Nomor Faktur`) %>%
  distinct() %>%
  mutate(Month = month(`Tanggal Faktur`),
         Day = wday(`Tanggal Faktur`,
                    week_start = getOption("lubridate.week.start",1))) %>%
  group_by(Month, Day) %>%
  summarize(Freq = n()) %>%
  group_by(Day) %>%
  summarize(Daily_Mean = as.integer(mean(Freq)))

radar2 <- Daily_Sales %>%
  ggplot(aes(x = Day,
             y = Daily_Mean)) +
  geom_bar(aes(fill = Daily_Mean),
           show.legend = FALSE,
           stat = "identity",
           width = 1) +
  labs(x = "Hari",
       title = "Pembelian Harian") +
  scale_x_continuous(breaks = c(1:7),
                     labels = c("Sen","Sel","Rab","Kam","Jum","Sab","Min")) +
  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 = "cyan", high = "darkblue")+
  coord_polar()

#3. Perjam
Hourly_Sales  <- Retail %>%
 select(`Tanggal Faktur`,`Nomor Faktur`) %>%
  distinct() %>%
  mutate(Month = month(`Tanggal Faktur`),
         Hour = hour(`Tanggal Faktur`)) %>%
  group_by(Month, Hour) %>%
  summarize(n = n()) %>%
  group_by(Hour) %>%
  summarize(Hourly_Mean = as.integer(mean(n)))
radar3 <- tibble(Hour = c(0:23)) %>%
  left_join(Hourly_Sales, by="Hour") %>%
  mutate(Hour = as.factor(Hour)) %>%
  ggplot(aes(x = Hour,
             y = Hourly_Mean))+
  geom_bar(aes(fill = Hourly_Mean),
           show.legend = FALSE,
           stat = "identity")+
  labs(x = "Jam per Hari",
       title = "Pembelian per Jam")+
                   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 = "cyan", high = "darkblue")+
                   coord_polar()

grid.arrange(radar1,radar2,radar3,ncol=3,nrow=1)

Argumen Anda: Dari hasil chart di atas, kita bisa mendapatkan bahwa transaksi banyak terjai pada pukul 12:00, Hari Kamis, pada tanggal 5, 8, 16, 24, dan 29.

6.4 Frekuensi transaksi setiap bulan

Gunakan interaktif Bar-Chart untuk memperlihatkan berapa frekuensi transaksi setiap bulan?

library(ggplot2)
library(dplyr)
library(plotly)
library(hrbrthemes)

Freq_Tran <- Retail %>% select(`Nomor Faktur`, `Month`) %>% 
  distinct() %>%
  group_by(Month) %>%
  summarise(Freq = n()) %>%
  ungroup() %>%
  mutate(popup = glue("Month Year : {Month}
                      Frekuensi : {Freq}"))
  
  
p <- Freq_Tran %>%
  ggplot( aes(x=Month, y=Freq)) +
  geom_bar(fill = rainbow(12),
           color = "black",
           stat = "identity",
           aes(text=popup)) +
  geom_area(fill="#69b3a2", alpha=0.5) +
  geom_line(color="#69b3a2") +
  ylab("Frekuensi") +
  theme_ipsum() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(p, tooltip = "text")

Argumen Anda: Dari chart di atas, kita dapat melihat bahwa transaksi terbesar terjadi pada November 2011.

6.5 10 teratas dari produk terpopuler berdasarkan frekuensi transaksinya

Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 teratas dari produk terpopuler berdasarkan frekuensi transaksinya!

Top_Product <- Retail %>%
  select(`Nomor Faktur`, `Deskripsi Barang`) %>%
  distinct() %>%
  group_by(`Deskripsi Barang`) %>%
  summarise(Freq = n()) %>% 
  ungroup() %>%
  arrange(desc(Freq)) %>%
  mutate(`Deskripsi Barang` = as.factor(`Deskripsi Barang`)
         ) %>%
  head(10) %>%
  mutate(popup = glue("Nama Barang : {`Deskripsi Barang`}
                      Frekuensi : {Freq}"))

chart1<-Top_Product %>%
ggplot( aes(x = reorder(`Deskripsi Barang`, Freq), 
            y = Freq)) +
  geom_bar(fill = rainbow(10),
           color = "black",
           stat = "identity",
           aes(text=popup)) +
  geom_line(color="#69b3a2") +
  ylab("Frekuensi") +
  xlab(NULL) +
  theme_ipsum() +
  coord_flip() 
ggplotly(chart1, tooltip = "text")

Argumen Anda: Dari data di atas, kita dapat melihat bahwa “White Hanging Heart T-Light Holder” merupakan produk dengan frekuensi transaksi terbanyak.

6.6 10 produk paling populer berdasarkan jumlah pesanan

Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer berdasarkan jumlah pesanan!

Top_Product <- Retail %>%
  select(`Deskripsi Barang`, Kuantitas) %>%
  group_by(`Deskripsi Barang`) %>%
  summarise(Freq = sum(Kuantitas)) %>% 
  ungroup() %>%
  arrange(desc(Freq)) %>%
  mutate(`Deskripsi Barang` = as.factor(`Deskripsi Barang`)) %>%
  head(10) %>%
  mutate(popup = glue("Nama Barang : {`Deskripsi Barang`}
                      Frekuensi : {Freq}"))

chart2 <-Top_Product %>%
ggplot( aes(x = reorder(`Deskripsi Barang`, Freq), 
            y = Freq)) +
  geom_bar(fill = rainbow(10),
           color = "black",
           stat = "identity",
           aes(text=popup)) +
  geom_line(color="#69b3a2") +
  ylab("Frekuensi") +
  xlab(NULL) +
  theme_ipsum() +
  coord_flip() 
ggplotly(chart2, tooltip = "text")

Argumen Anda: Dari data di atas, kita dapat melihat bahwa “Medium Ceramic Top Storage Jar” merupakan produk dengan jumlah pesanan terbanyak.

6.7 10 produk paling populer menurut total pelanggan

Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer menurut total pelanggan!

Top_Product_Cust <- Retail %>%
  select(`Deskripsi Barang`, `ID Pembeli`) %>%
  distinct() %>%
  group_by(`Deskripsi Barang`) %>%
  summarise(Freq = n()) %>%
  mutate(`Deskripsi Barang` = as.factor(`Deskripsi Barang`)) %>%
  arrange(desc(Freq)) %>%
  head(10) %>%
  mutate(popup = glue("Nama Barang : {`Deskripsi Barang`}
                      Frekuensi : {Freq}"))
  
chart3 <-Top_Product_Cust %>%
ggplot( aes(x = reorder(`Deskripsi Barang`, Freq), 
            y = Freq)) +
  geom_bar(fill = rainbow(10),
           color = "black",
           stat = "identity",
           aes(text=popup)) +
  geom_line(color="#69b3a2") +
  ylab("Frekuensi") +
  xlab(NULL) +
  theme_ipsum() +
  coord_flip() 
ggplotly(chart3, tooltip = "text")

Argumen Anda: Dari data di atas, kita dapat melihat bahwa “Regency Cakestand 3 Tier” merupakan produk dengan konsumen terbanyak.

6.8 10 produk paling populer berdasarkan Nilai Mata uang

Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer berdasarkan Nilai Mata uang!

Top_Product_amount <- aggregate(`Total Pembayaran`~`Deskripsi Barang`, data = Retail, sum) %>%
  mutate(`Deskripsi Barang` = as.factor(`Deskripsi Barang`)) %>%
  arrange(desc(`Total Pembayaran`)) %>%
  head(10) %>%
  mutate(popup = glue("Nama Barang : {`Deskripsi Barang`}
                      Total Pembayaran : {`Total Pembayaran`}"))

chart4 <-Top_Product_amount %>%
ggplot( aes(x = reorder(`Deskripsi Barang`, `Total Pembayaran`), 
            y = `Total Pembayaran`)) +
  geom_bar(fill = rainbow(10),
           color = "black",
           stat = "identity",
           aes(text=popup)) +
  geom_line(color="#69b3a2") +
  ylab("Frekuensi") +
  xlab(NULL) +
  theme_ipsum() +
  coord_flip() 
ggplotly(chart4, tooltip = "text")

Argumen Anda: Dari data di atas, kita dapat melihat bahwa “Regency Cakestand 3 Tier” merupakan produk dengan hasil penjualan terbanyak.

6.9 Time Series

Lakukan Analisa dengan menggunakan Time Series apakah penjualan berdasarkan Nilai Mata Uang Meningkat-Menurun?

TL_data <- Retail  %>%
  group_by(`Deskripsi Barang`,`Total Pembayaran`) %>%
  summarise(TL = min(`Tanggal Faktur`)) %>%
  ungroup() %>%
  mutate(yearmonth = as.yearmon(TL)) %>%
  group_by(yearmonth) %>%
  summarize(total = sum(`Total Pembayaran`)) %>%
  mutate(dolar = dollar(total),
  popup = glue("Bulan: {yearmonth}
                Penjualan: {dolar}({round((total/sum(total))*100,1)}%)"))

Timeline <- TL_data %>%
  ggplot(aes(x = yearmonth,
             y = total,
             group = 1)) +
  geom_line(aes(text = popup),
            color = "blue1") +
  theme_get() +
  labs(x = "Bulan",
       y = "Penjualan",
       title = "Penjualan Retail") +
  scale_y_continuous(label = scales::format_format(big.mark = ".",
                                                   decimal.mark = ",",
                                                   scientific = F))
ggplotly(Timeline, tooltip = "text")

Argumen Anda: Dari Timeline ini, kita dapat melihat naik turun hasil penjualan, dan kenaikan terbanyak terjadi pada September 2011.

6.10 Tree-Map

Gunakan Tree-Map untuk memvisualisasikan sebagian besar Konsumen menurut Negara?

Country <- Retail %>%
  select (`ID Pembeli`, Negara) %>%
  distinct() %>%
  group_by(Negara) %>%
  summarise(Konsumen = n()) %>%
  ungroup() %>%
  arrange(desc(Konsumen))

Country
## # A tibble: 37 x 2
##    Negara         Konsumen
##    <fct>             <int>
##  1 United Kingdom     3883
##  2 Germany              93
##  3 France               86
##  4 Spain                28
##  5 Belgium              23
##  6 Portugal             19
##  7 Switzerland          19
##  8 Italy                14
##  9 Finland              11
## 10 Norway               10
## # ... with 27 more rows
Country %>%
  ggplot(aes(fill = Negara,
             area = Konsumen,
             label = Negara))+
  geom_treemap()+
  geom_treemap_text(colour = "black", 
                    place = "centre") +
  labs (title = "Jumlah Konsumen berdasarkan Negara")

Argumen Anda: Dari tree-map di atas kita dapat melihat bahwa Negara dengan konsumen terbesar adalah United Kingdom

Tugas 7

Berikan pandangan dan pendapat terkait kasus yang sudah anda kerjakan diatas (Apa yang akan anda lakukan sebagai Manager mengenai kasus tersebeut untuk mengembangkan bisnis perbelanjaan online tersebut berdasarkan analisa yang anda temukan!).

Argumen Anda: Berdasarkan hasil analisa di atas, saya akan memfokuskan pengembangan penjualan di United Kingdom dengan merekrut dropshipper dan reseller agar lebih mudah diakses oleh pelanggan dan akan memperbanyak kuantitas dari produk-produk teratas dalam segi penjualan terbesar, transaksi terbanyak, konsumen terbanyak, dan hasil penjualan terbanyak, dalam rangkan meningkatkan Keuntungan penjualan. Saya juga akan membuat promosi-promosi untuk produk yang kurang laku, atau yang berada di bagian bawah penjualan supaya orang-orang tertarik untuk melakukan pembelian produk tersebut. Untuk mencegah adanya pelanggan yang tidak terlayani dengan baik, saya juga akan menambah personel di jam ramai, seperti jam 12:00.