Email:
RPubs: https://rpubs.com/akun-rpubs-anda/


Latar Belakang

library(readxl)
library(dplyr)
library(ggplot2)
library(scales)
library(glue)
library(plotly)
library(lubridate)
library(gridExtra)
library(zoo)
library(treemap)
library(tidyr)
library(tidyverse)

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

#working directory
setwd("C:/Users/USER/Documents/SEMESTER 3/ALGORITMA/Uas")

OnlineRetail <- readRDS("Retail.rds")
head(OnlineRetail, 5)
## # A tibble: 5 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
## # ... with 2 more variables: CustomerID <dbl>, Country <chr>
#install.packages("readxl")                                     
library("readxl")
xlsx1   <- read_excel("OnlineRetail.xlsx", sheet=1)
head(xlsx1, 5)
## # A tibble: 5 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
## # ... with 2 more variables: CustomerID <dbl>, Country <chr>

Menurut saya: menggunakan rds lebih mudah karena tidak perlu menginstall package untuk membuka filenya. serta algoritma membuka rds lebih simple.

Tugas 2

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

names(OnlineRetail) <- c("Nomor Invoice",
                 "Kode barang",
                 "Deskripsi Barang",
                 "Jumlah",
                 "Tanggal Invoice",
                 "Harga Barang",
                 "Nomor Pelanggan",
                 "Negara")
head(OnlineRetail, 5)
## # A tibble: 5 x 8
##   `Nomor Invoice` `Kode barang` `Deskripsi Bara~ Jumlah `Tanggal Invoice`  
##   <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
## # ... with 3 more variables: `Harga Barang` <dbl>, `Nomor Pelanggan` <dbl>,
## #   Negara <chr>

Argumen Anda: kita terjemahkan ke dalam bahasa indonesia agar lebih mudah dipelajari dan dipahami oleh pembaca

Tugas 3

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

str(OnlineRetail)
## tibble [541,909 x 8] (S3: tbl_df/tbl/data.frame)
##  $ Nomor Invoice   : chr [1:541909] "536365" "536365" "536365" "536365" ...
##  $ Kode barang     : 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" ...
##  $ Jumlah          : num [1:541909] 6 6 8 6 6 2 6 6 6 32 ...
##  $ Tanggal Invoice : 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 ...
##  $ Nomor Pelanggan : num [1:541909] 17850 17850 17850 17850 17850 ...
##  $ Negara          : chr [1:541909] "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
data.frame(
  invoice_unique = OnlineRetail$`Nomor Invoice` %>% unique() %>% length(),
  kode_barang_unique = OnlineRetail$`Kode barang` %>% unique() %>% length(),
  deskripsi_unique = OnlineRetail$`Deskripsi Barang` %>% unique() %>% length(),
  negara_unique = OnlineRetail$Negara %>% unique() %>% length(),
  pelanggan_unique = OnlineRetail$`Nomor Pelanggan` %>% unique() %>% length()
)
##   invoice_unique kode_barang_unique deskripsi_unique negara_unique
## 1          25900               4070             4212            38
##   pelanggan_unique
## 1             4373
OnlineRetail$Negara <- as.factor(OnlineRetail$Negara)

Argumen Anda: disini saya merubah jenis kumpulan data Nomor Pelanggan dari Number menjadi karakter karena fungsi dari data Nomor Pelanggan sama dengan Nomor Invoice dimana sama-sama merupakan suatu kode pembelian pelanggan. lalu, ada negara yang berjumlah 38 sehingga dapat kita jadikan variabel kategori dengan menggunakan as.factor

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

cancel    <- OnlineRetail[grep("C", OnlineRetail$`Nomor Invoice`),]
count(cancel)
## # A tibble: 1 x 1
##       n
##   <int>
## 1  9288
OnlineRetail<- OnlineRetail[-grep("C", OnlineRetail$`Nomor Invoice` ), ]

Argumen Anda: Terdapat 9288 transaksi yang dibatalkan, dalam mengerjakan data ini kita tidak memerlukan transaksi yang dibtalakan sehingga dapat kita hilangkan . Transaksi yang dibatalkan dapat kita ketahui dengan melihat datanya yaitu pada Nomor Invoice jika terdapat huruf C maka transaski tersebut dibatalkan. saya memutuskan untuk menghapus transaksi-transaksi yang telah dibatalkan dari dalam data.

4.2 Faktur tidak valid

Inv_Invoice <- OnlineRetail[nchar(OnlineRetail$`Nomor Invoice`)>6, ]
Inv_Invoice
## # A tibble: 3 x 8
##   `Nomor Invoice` `Kode barang` `Deskripsi Bara~ Jumlah `Tanggal Invoice`  
##   <chr>           <chr>         <chr>             <dbl> <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>, `Nomor Pelanggan` <dbl>,
## #   Negara <fct>
OnlineRetail <- OnlineRetail[!nchar(OnlineRetail$`Nomor Invoice`)>6, ]

Argumen Anda: untuk invoice yang tidak valid dapat kita ketahui jika karakter dalam datanya lebih dari 6, hal ini tidak kita perlukan didalam data kita sehingga dapat kita hilangkan.

4.3 Kuantitas tidak valid

OnlineRetail<- OnlineRetail%>%filter(Jumlah>0)

Argumen Anda: Terdapat kuantitas yang negatif atau 0 dimana kuantitas tersebut dianggap tidak valid karena tidak ada transaksi yang negatif atau 0 sehingga diputuskan untuk diperbaiki dengan cara mengahpusnya dari dalam data

4.4 Harga Satuan Tidak Valid

OnlineRetail <- OnlineRetail%>%filter(`Harga Barang`> 0)

Argumen Anda: jika terdapat harga produk yang kurang dari 0 dan sama dengan 0 maka harga produk tersebut tidak valid, jika terjadi hal seperti itu maka kita harus menghapusnya dari data.

4.5 Produk Tidak Valid

produk_valid <- OnlineRetail %>% 
              mutate (kode_valid = as.numeric (substr(`Kode barang`, 1, 5))) %>%
               select( kode_valid, `Kode barang`, `Deskripsi Barang`) %>%
              distinct()
## Warning: Problem with `mutate()` input `kode_valid`.
## i NAs introduced by coercion
## i Input `kode_valid` is `as.numeric(substr(`Kode barang`, 1, 5))`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
produk_valid
## # A tibble: 4,157 x 3
##    kode_valid `Kode barang` `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 4,147 more rows
produk_invalid <- produk_valid[is.na(produk_valid$kode_valid), ]%>% .$`Deskripsi Barang`
produk_invalid
##  [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] "OOH LA LA DOGS COLLAR"              "BOYS PARTY BAG"                    
## [17] "GIRLS PARTY BAG"                    "Dotcomgiftshop Gift Voucher £10.00"
## [19] "SAMPLES"                            "PADS TO MATCH ALL CUSHIONS"        
## [21] "HAYNES CAMPER SHOULDER BAG"
OnlineRetail <- OnlineRetail %>% 
  filter(!`Deskripsi Barang`%in% produk_invalid)

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

OnlineRetail <- OnlineRetail %>% 
  filter(!`Deskripsi Barang`%in% produk_invalid)

Argumen Anda: Setelah kita lakukan analisa terhadap banyaknya produk yang tidak valid, kita mendapati bahwa dari semua data hanya ada 1 produk yang tidak valid dan merupakan voucher yang dapat kita hapuskan dari dalam data.

4.6 Deskripsi Ganda & Stok

#1 Cek keunikan pada data 
library(dplyr)
data_frame(
  stok_kode_unik = OnlineRetail$`Kode barang` %>% unique() %>% length(),
  Deskripsi_unik = OnlineRetail$`Deskripsi Barang` %>% unique() %>% length(),
  deskripsi_barang_unik = OnlineRetail %>% select(`Kode barang`,`Deskripsi Barang`) %>% distinct() %>% nrow()
)
## Warning: `data_frame()` is deprecated as of tibble 1.1.0.
## Please use `tibble()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
## # A tibble: 1 x 3
##   stok_kode_unik Deskripsi_unik deskripsi_barang_unik
##            <int>          <int>                 <int>
## 1           3899           3993                  4135

Datanya terlihat berbeda-beda mengartikan bahwa terjadi duplikasi dalam data.

#2
Data_Produk <- OnlineRetail %>% 
  arrange(desc(`Tanggal Invoice`)) %>% 
  select(`Kode barang`,`Deskripsi Barang`) %>% 
  distinct()

Data_Produk %>% 
  group_by(`Kode barang`) %>% 
  summarise(Jumlah_Deskripsi=n()) %>% 
  ungroup() %>% 
  filter(Jumlah_Deskripsi>1)
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 217 x 2
##    `Kode barang` Jumlah_Deskripsi
##    <chr>                    <int>
##  1 16156L                       2
##  2 17107D                       3
##  3 20622                        2
##  4 20725                        2
##  5 20914                        2
##  6 21109                        2
##  7 21112                        2
##  8 21175                        2
##  9 21232                        2
## 10 21243                        2
## # ... with 207 more rows

Terdapat 212 stock_code yang memiliki lebih dari 1 deskripsi. Untuk case ini, kita perlu menyesuaikan deskripsi dari setiap produk dengan menggunakan deksripsi pada transaksi terakhir dari setiap produk. Mari kita bersihkan

#3
Data_Produk <- Data_Produk%>%
  group_by(`Kode barang`)%>%
  slice(1)

OnlineRetail <-OnlineRetail %>% 
  left_join(Data_Produk, by="Kode barang") %>% 
  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(
  stok_kode_unik = OnlineRetail$`Kode barang` %>% unique() %>% length(),
  Deskripsi_unik = OnlineRetail$`Deskripsi Barang` %>% unique() %>% length(),
  deskripsi_barang_unik = OnlineRetail %>% select(`Kode barang`,`Deskripsi Barang`) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 3
##   stok_kode_unik Deskripsi_unik deskripsi_barang_unik
##            <int>          <int>                 <int>
## 1           3899           3764                  3899
Data_deskripsi <- OnlineRetail %>% 
  arrange(desc(`Tanggal Invoice`)) %>% 
  select(`Kode barang`,`Deskripsi Barang`) %>% 
  distinct()

Data_deskripsi <- Data_deskripsi %>% 
  group_by(`Deskripsi Barang`) %>% 
  slice(1)

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

data_frame(
  stok_kode_unik = OnlineRetail$`Kode barang` %>% unique() %>% length(),
  Deskripsi_unik = OnlineRetail$`Deskripsi Barang` %>% unique() %>% length(),
  deskripsi_barang_unik = OnlineRetail %>% select(`Kode barang`,`Deskripsi Barang`) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 3
##   stok_kode_unik Deskripsi_unik deskripsi_barang_unik
##            <int>          <int>                 <int>
## 1           3764           3764                  3764

Argumen Anda: Data setiap produk yang kita miliki telah bersifat unik dan tidak ada deskripsi ganda.

4.7 Negara Tidak Valid

data_frame(
  pelanggan_unik = OnlineRetail %>% select(`Nomor Pelanggan`) %>% distinct() %>% nrow(),
  pelanggan_negara_unik = OnlineRetail %>% select(`Nomor Pelanggan`, `Negara`) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 2
##   pelanggan_unik pelanggan_negara_unik
##            <int>                 <int>
## 1           4335                  4351
Data_negara <- OnlineRetail %>% 
  arrange(desc(`Tanggal Invoice`,`Nomor Pelanggan`)) %>% 
  select(`Nomor Pelanggan`, Negara) %>% 
  group_by(`Nomor Pelanggan`) %>% 
  slice(1)

OnlineRetail <- OnlineRetail %>% select(-Negara) %>% 
  left_join(Data_negara, by = c("Nomor Pelanggan"))

data_frame(
  customer_unik = OnlineRetail %>% select(`Nomor Pelanggan`) %>% distinct() %>% nrow(),
  customer_country_unik = OnlineRetail %>% select(`Nomor Pelanggan`, Negara) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 2
##   customer_unik customer_country_unik
##           <int>                 <int>
## 1          4335                  4335

Argumen Anda: kita dapat mengatasi status yang tidak valid ini dengan cara menghapus baris yang terkandung alphabet atau hanya menghapus alphabetnya

4.8 Pemutusan Berkala

library(lubridate)
OnlineRetail <- OnlineRetail %>% filter(ymd(as.Date(OnlineRetail$`Tanggal Invoice`)) < ymd("2011-12-1"))
tail(OnlineRetail, 10)
## # A tibble: 10 x 8
##    `Nomor Invoice` Jumlah `Tanggal Invoice`   `Harga Barang` `Nomor Pelangga~
##    <chr>            <dbl> <dttm>                       <dbl>            <dbl>
##  1 579885               2 2011-11-30 17:37:00           4.95            15444
##  2 579885              12 2011-11-30 17:37:00           0.38            15444
##  3 579885               6 2011-11-30 17:37:00           1.45            15444
##  4 579885               1 2011-11-30 17:37:00           4.15            15444
##  5 579885               2 2011-11-30 17:37:00           3.75            15444
##  6 579885               4 2011-11-30 17:37:00           1.25            15444
##  7 579885               2 2011-11-30 17:37:00           5.95            15444
##  8 579885               6 2011-11-30 17:37:00           2.08            15444
##  9 579885               1 2011-11-30 17:37:00           7.95            15444
## 10 579885               1 2011-11-30 17:37:00           5.95            15444
## # ... with 3 more variables: `Deskripsi Barang` <chr>, `Kode barang` <chr>,
## #   Negara <fct>

Argumen Anda: terdapat data yang tidak lengkap pada bulan desember 2011, jadi diputuskan untuk dilakukan pemutusan berkala dimana datanya hanya sampai November 2011

4.10 Data Duplikat

OnlineRetail <- OnlineRetail%>%distinct()

Argumen Anda: untuk data yang memiliki duplikat akan dihilangkan dan mempertahankan baris pertama sebelum terdapat duplikat.

4.11 Fitur ekstraksi

OnlineRetail$Transaksi <- OnlineRetail$`Jumlah` * OnlineRetail$`Harga Barang`

Argumen Anda: Kita buat variabel baru untuk fitur ektrasi dimana merupakan total nilai transaksi

4.12 Nilai yang hilang

colSums(is.na(OnlineRetail))
##    Nomor Invoice           Jumlah  Tanggal Invoice     Harga Barang 
##                0                0                0                0 
##  Nomor Pelanggan Deskripsi Barang      Kode barang           Negara 
##           123530                0                0                0 
##        Transaksi 
##                0
OnlineRetail <- na.omit(OnlineRetail)

Argumen Anda: kita mengetahui jika terdapat NA pada Deskripsi Barang dan Nomor Pelanggan, dan diputuskan untuk kita hilangkan data yang terdapat NA.dapat kita lihat bahwa sudah tidak terdapat data yang NA

Tugas 5

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

saveRDS(OnlineRetail,"Clean_OnlineRetail.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:

Online_Retail <- readRDS("Clean_OnlineRetail.rds")

6.1 banyak pelanggan yang melakukan transaksi setiap bulan

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

OnlineRetail$Month <- factor(format(OnlineRetail$`Tanggal Invoice`,
                              "%b %Y"),
                       levels=paste(month.abb, rep(2010:2011, each=12)))
OnlineRetail$Date <- format(OnlineRetail$`Tanggal Invoice`,
                      "%Y-%m-%d")

Pelanggan <- OnlineRetail %>% count(Month, `Nomor Pelanggan`)  %>%
  select(-n) %>%
  group_by(Month) %>%
  summarise(n = n())

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

Argumen Anda: dari Bar-Chart kita bisa lihat bahwa pada bulan November 2011 jumlah Pelanggan mencapai paling tinggi dari bulan-bulan sebelumnya

6.2 pertumbuhan pelanggan baru setiap bulan

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

library(dplyr)
Pertumbuhan_pelanggan <- Online_Retail %>%
  group_by(`Nomor Pelanggan`) %>% 
  summarise(urutan_1 = min(`Tanggal Invoice`)) %>% 
  ungroup() %>% 
  mutate( yearmonth = format(urutan_1, format="%Y-%m-1"),
          yearmonth = ymd(yearmonth),
          ym = as.yearmon(urutan_1)) %>% 
  group_by(ym, yearmonth) %>% 
  summarise(total_pelanggan_baru = n()) %>% 
  mutate (normalisasi = (total_pelanggan_baru-min(total_pelanggan_baru))/(max(total_pelanggan_baru)-min(total_pelanggan_baru)),
    detail = glue("Total Pelanggan baru adalah {total_pelanggan_baru}"))

min <- Pertumbuhan_pelanggan %>% arrange(total_pelanggan_baru) %>% head(1)
max <- Pertumbuhan_pelanggan %>% arrange(total_pelanggan_baru) %>% tail(1)

plot_pelanggan <- ggplot(Pertumbuhan_pelanggan,
       aes(x=ym,
           y=total_pelanggan_baru))+
  geom_line()+
  geom_point(size=3, aes(text=detail))+
  geom_point(data=max, aes(x=ym, y = total_pelanggan_baru, text=detail), colour="salmon1", size=3)+
  geom_point(data=min, aes(x=ym, y = total_pelanggan_baru, text=detail), colour="salmon1", size=3)+
    labs(x = "Bulan",
         y = "Pelanggan baru",
         title = "Pertumbuhan Pelanggan baru setiap Bulan")
   theme(axis.text.y = element_blank())
## List of 1
##  $ axis.text.y: list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi FALSE
##  - attr(*, "validate")= logi TRUE
  ggplotly(plot_pelanggan, tooltip="text")

Argumen Anda: kita bisa melihat jika grafiknya semakin menurun pada agustus 2011 sebanyak 169 customer. sedanngkan mempunyai peningkatan pada desember 2010 sebanyak 884.

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

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

library(RColorBrewer)
# bulanan
pemesanan_bulan <- Online_Retail %>% select(`Tanggal Invoice`, `Nomor Invoice`) %>% 
  distinct() %>%
  mutate(bulan = month(`Tanggal Invoice`),
         hari = day(`Tanggal Invoice`)) %>% 
  group_by(bulan,hari) %>% 
  summarise(total = n()) %>% 
  ungroup() %>% 
  group_by(hari) %>% 
  summarise(rataan_transaksi_bulanan = as.integer(median(total))) 

radar_1 <-pemesanan_bulan %>% 
  ggplot(aes(x=as.factor(hari), y=rataan_transaksi_bulanan)) +
  geom_bar(stat="identity", aes(fill=rataan_transaksi_bulanan),show.legend = FALSE)+
  labs(title = "Pemesanan Bulanan",
    x = "Tanggal", 
    y = NULL)+
  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 = "salmon", high = "salmon4")+
                   coord_polar()

# Harian
pemesanan_mingguan <- Online_Retail %>% select(`Nomor Invoice`
                                               ,`Tanggal Invoice`) %>% 
  distinct() %>% 
  mutate(bulan = month(`Tanggal Invoice`),
        pekan = wday(`Tanggal Invoice`,week_start = getOption("lubridate.week.start", 1))) %>% 
  group_by(bulan,pekan) %>% 
  summarise(total = n()) %>% 
  ungroup() %>% 
  group_by(pekan) %>% 
  summarise(Rataan_mingguan = as.integer(median(total))) 

radar_2 <-pemesanan_mingguan <- pemesanan_mingguan%>% 
    ggplot(aes(pekan,Rataan_mingguan))+
    geom_bar(width=1, stat="identity", show.legend = FALSE, aes(fill=Rataan_mingguan))+
    labs(
      title = "pelanggan perhari",
      x = "hari", 
      y = NULL)+
    scale_x_continuous(breaks = c(1,2,3,4,5,6,7),
                       labels = c("Senin", "Selasa", "Rabu", "Kamis", "Jumat", "sabtu", "Minggu"))+
    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 = "salmon", high = "salmon4")+
                   coord_polar()
    coord_polar() -> polar2


#Jam
 
Pesanan_jam <-Online_Retail %>% select(`Nomor Invoice`,`Tanggal Invoice`) %>% 
  distinct() %>% 
  mutate(hari = day(`Tanggal Invoice`),
        jam = hour(`Tanggal Invoice`)) %>% 
  group_by(hari,jam) %>% 
  summarise(total = n()) %>% 
  ungroup() %>% 
  group_by(jam) %>% 
  summarise(rataan_jam = as.integer(median(total)))

skala_waktu = data_frame(jam = c(0:23))

radar_3 <- data_frame(jam = c(0:23)) %>% 
  left_join(
    Pesanan_jam ,by=c("jam")) %>%
  mutate(jam = as.factor(jam)) %>% 
  ggplot(aes(x=jam, y=rataan_jam))+
  geom_bar(stat="identity",show.legend = FALSE, aes(fill=rataan_jam))+
  labs(title = "pemesanan jam",
    x = "Jam Hari", 
    y = NULL)+
  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 = "salmon", high = "salmon4")+
                   coord_polar()

grid.arrange(radar_1,radar_2,radar_3, ncol = 3)

Argumen Anda: dari radar yang telah kita buat memperlihatkan bahwa semakin gelap warna dalam radar menunjukkan bahwa customer paling banyak untuk bulanan paling banyak pada tanggal 5, 14, dan 30, dalam 1 minggu transaksi paling banyak pada Kamis. Lalu untuk jamnya, paling banyak pada jam 12 siang.

6.4 frekuensi transaksi setiap bulan

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

transaksi_bulan <- OnlineRetail%>%select( `Nomor Invoice`, Month)%>%
                distinct()%>%
                group_by(Month)%>%
                 summarise(n=n())%>%
               mutate(detail = glue("Bulan : {Month}
                                    Total Transaksi: {n}"))

BarChart1 <- ggplot(transaksi_bulan,
                 aes(x = Month,
                     y = n))+
          geom_bar(aes(fill = Month,
                       text = detail),
                   stat = "identity",
                   show.legend = FALSE,
                    palette = "Accent") +
          theme_get() +
          theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
          labs(x = "Bulan",
               title = "Transaksi Tiap Bulan",
               y = NULL)
  

ggplotly(BarChart1,tooltip = "text")

Argumen Anda: Frekuensi transaksi paling banyak terjadi pada bulan november 2011 yaitu 2642 transaksi

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!

BarChart2 <-Online_Retail%>%
            group_by(`Deskripsi Barang`, `Kode barang` )%>%
            summarise(n=n()) %>%
            arrange(desc(n))%>%
            head(10) %>%
            mutate(Barang = as.factor(`Deskripsi Barang`))%>%
  ggplot(aes(x = reorder(Barang,n),
             y = n)) +
  geom_bar(aes( fill = Barang,
                text = n),
           stat = "identity",
           palette = "Accent")+
  labs( title = "10 Produk terpopuler berdasarkan frekuensi transaksi",
        x = NULL,
        y = NULL)+
  coord_flip()+
  theme_minimal()

ggplotly(BarChart2)

Argumen Anda: kita dapati 10 produk terpopuler berdasarkan frekuensi transaksi yang palig banyak adalah CREAM HANGIG HEART T-LIGHT HOLDER yaitu 1976

6.6 10 produk paling populer berdasarkan jumlah pesanan

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

BarChart3 <-Online_Retail%>%
            group_by(`Deskripsi Barang` )%>%
            summarise(q=sum(Jumlah)) %>%
            arrange(desc(q))%>%
            head(10) %>%
            mutate(Barang = as.factor(`Deskripsi Barang`))%>%
  ggplot(aes(x = reorder(Barang,q),
             y = q)) +
  geom_bar(fill = rainbow(10),
                color = "black",
           stat = "identity")+
  labs( title = "10 Produk Terpopuler Berdasarkan Kuantitas")+
         ylab("Frekuensi") +
  xlab(NULL) +
  coord_flip()+
  theme_minimal()

ggplotly(BarChart3)

Argumen Anda: kita telah mendapati dari grafik yang dibuat 10 produk paling populer berdasarkan jumlah pesanan dapat dilihat bahwapaling tinggi adalah MEDIUM CERAMIC TOP STORAGE JAR sebanyak 777729

6.7 Top 10 Produk berdasarkan total pelanggan

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

BarChart4 <-Online_Retail%>%
            select(`Nomor Pelanggan`, `Kode barang`, `Deskripsi Barang`)%>%
            distinct%>%
            group_by(`Deskripsi Barang`, `Kode barang` )%>%
            summarise(Pelanggan=n()) %>%
            ungroup()%>%
            arrange(desc(Pelanggan))%>%
            head(10) %>%
            mutate(Barang = as.factor(`Deskripsi Barang`))%>%
  ggplot(aes(x = reorder(Barang,Pelanggan),
             y = Pelanggan)) +
  geom_bar( fill = rainbow(10),
              color = "black",stat = "identity",
                      show.legend = F)+
  labs( title = "10 Produk Terpopuler Berdasarkan Total Pelanggan")+
           ylab("jumlah") +
  xlab(NULL) +
  coord_flip()+
  theme_minimal()

ggplotly(BarChart4)

Argumen Anda: Dari grafik yang kita dapati dari grafik adalah 10 Produk Terpopuler Berdasarkan Total Pelanggan yang paling banyak adalah REGENCY CAKESTAND 3 TIER sebanyak 873

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!

BarChart5 <- Online_Retail %>%
              group_by(`Kode barang`, `Deskripsi Barang`) %>%
              summarise(n=sum(Transaksi))%>%
              ungroup()%>%
              arrange(desc(n))%>%
              head(10)%>%
              mutate(Barang = as.factor(`Deskripsi Barang`)) %>% 
  ggplot(aes(x = reorder(Barang, n),
                        y = n))+
            geom_bar(fill = rainbow(10),
                     color = "black",
                     stat="identity")+
              labs(title = "Top 10 Produk berdasarkan nilai mata uang",
                   x = NULL,
                   y = NULL)+
  coord_flip()+
                scale_y_continuous(label = scales::format_format(big.mark = ".",
                                                   decimal.mark = ",",
                                                   scientific = F))
ggplotly(BarChart5)

Argumen Anda: grafik yang telah kita buat menunjukkan 10 produk populer berdasarkan nilai mata uang yang paling banyak adalah REGENCY CAKESTAND 3 TIER

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

Transaksi1 <- Online_Retail %>% 
            group_by(`Deskripsi Barang`, Transaksi)%>%
            summarise(order = min(`Tanggal Invoice`))%>%
            ungroup() %>%
            mutate(ym = as.yearmon(order))%>%
            group_by(ym)%>%
            summarise( Total = sum(Transaksi))%>%
            mutate(Penjelasan = glue("Bulan : {ym}
                                  Nilai : {Total}")) %>%
          
        ggplot(aes(x = ym,
                   y = Total,
                   group = 1 )) +
        geom_line(aes(text = Penjelasan),
                      color = "#00FF00")+
  theme_minimal()+
  labs(x = "Month",
       y = "Pelanggan",
       title = "Penjualan Barang") +
  scale_y_continuous(label = scales::format_format(big.mark = ".",
                                                   decimal.mark = ",",
                                                   scientific = F))
ggplotly(Transaksi1, tooltip = "text")

Argumen Anda: Berdasarkan data yang kita dapatkan, time seriesnya turun drastis pada bulan januari hingga maret 2011 namun setelah itu dia naik lagi hingga oktober 2011.

6.10 Konsumen menurut Negara

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

library(ggplot2)                                     
library(treemapify)                                  
library(scales)


plotdata <- Online_Retail %>%
  select(`Nomor Pelanggan`, Negara)%>% 
  distinct()%>%
  group_by(Negara)%>%
  summarise(Konsumen=n())

plotdata%>%
  ggplot(aes(fill = Negara,
           area = Konsumen,
           label = Negara))+
  geom_treemap() + 
  geom_treemap_text(colour="black",
                    place = "centre")+
  labs(title = "Konsumen berdasarkan Negara")

Argumen Anda:berdasarkan Tree Map bahwa sebagian customer berasal dari United Kingdom.

plotdata2 <- Online_Retail %>%
  select(Transaksi, Negara)%>% 
  distinct()%>%
  group_by(Negara)%>%
  summarise(Transaksi_negara=n())

plotdata2%>%
  ggplot(aes(fill = Negara,
           area = Transaksi_negara,
           label = Negara))+
  geom_treemap() + 
  geom_treemap_text(colour="black",
                    place = "centre")+
  labs(title = "Transaksi berdasarkan Negara")

Argumen anda berdasarkan treemap transaksi negara terlihat bahwa United Kingdom tetp yang pertama sedangkan yang kedua dipegang oleh EIRE

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 data yang kita dapatkan diatas, bahwa masih banyak data yang harus diperbaiki dan dihapus karena ada yang merupakan data duplikat dan tidak valid. pada grafik total transaksi kita dapat melihat bahwa terjadi penurunan drastis dan termasuk data yang kurang stabil yang mengartikan kita perlu melakukan tindakan terhadapat minat customer dalam produk kita seperti perlu ditingkatkan penjualan pada jam 12 karena penjualan perusahaan tinggi pada jam 12 hari kamis atau pada akhir bulan diberikan semacam diskon atau promo akhir bulan untuk menarik pelanggan lebih banyak lagi. dilihat dari grafik tree map, kita dapat menargetkan pelanggan kita yaitu ke Unite Kingdom karena customer kita paling banyak dari sana.