Email:
RPubs: https://rpubs.com/irenegani/


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("D:\\FILE IRENE\\SEMESTER 3\\Algoritma&Struktur Data (Pak Bakti)\\UAS")

Retail <- readRDS("Retail.rds")
head(Retail, 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("Retail.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: Menurut saya, dalam segi mengimport data keduanya sama mudahnya. Namun kalau diharuskan memilih, maka saya akan memilih menggunakan file rds, karena file excelnya sendiri pun tidak bisa dibuka melalui aplikasi Excel saya dikarenakan Microsoft saya sering error dan fungsinya sendiri sudah ada di R jadi tidak perlu install packages lagi.

Tugas 2

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

names(Retail) <- c("Nomor Invoice",
                 "Kode barang",
                 "Deskripsi Barang",
                 "Jumlah",
                 "Tanggal Invoice",
                 "Harga Barang",
                 "Nomor Pelanggan",
                 "Negara")
head(Retail, 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: Mengganti nama Variabel agar lebih mudah dibaca oleh pembaca sangat diperlukan, karena tidak semua orang memahami bahasa pemrogaman. Pemilihan bahasa disini bisa disesuaikan dengan kalangan pembacanya itu sendiri.

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 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 = Retail$`Nomor Invoice` %>% unique() %>% length(),
  kode_barang_unique = Retail$`Kode barang` %>% unique() %>% length(),
  deskripsi_unique = Retail$`Deskripsi Barang` %>% unique() %>% length(),
  negara_unique = Retail$Negara %>% unique() %>% length(),
  pelanggan_unique = Retail$`Nomor Pelanggan` %>% unique() %>% length()
)
##   invoice_unique kode_barang_unique deskripsi_unique negara_unique
## 1          25900               4070             4212            38
##   pelanggan_unique
## 1             4373
Retail$Negara <- as.factor(Retail$Negara)

Argumen Anda: Dengan menggunakan fungsi glimpse(), kita akan mendapatkan struktur data yang kita miliki dan menggunakan fungsi unique() untuk melihat berada banyak data yang beda dalam struktur data tersebut.Dikarenakan hanya ada 38 data pada negara/Country, maka kita dapat mengubah tipe datanya menjadi faktor dikarenakan data tersebut bisa dijadikan sebagai variabel kategori.

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    <- Retail[grep("C", Retail$`Nomor Invoice`),]
count(cancel)
## # A tibble: 1 x 1
##       n
##   <int>
## 1  9288
Retail<- Retail[-grep("C", Retail$`Nomor Invoice` ), ]

Argumen Anda: Sesuai dengan deskripsi variabel yaitu “C”, maka setiap data yang memiliki huruf depan C akan diidentifikasi sebagai Cancel. Setelah itu data yang tidak digunakan saya exclude.

4.2 Faktur tidak valid

Inv_Invoice <- Retail[nchar(Retail$`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>
Retail <- Retail[!nchar(Retail$`Nomor Invoice`)>6, ]

Argumen Anda: sesuai dengan deskripsi diatas yaitu Nomor invoice terdiri dari 6 digit unik untuk setiap transaksi, maka untuk transaksi yang terdiri lebih dari 6 digit akan dianggap tidak valid dan dapat di exclude.

4.3 Kuantitas tidak valid

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

Argumen Anda: Disini terdapat 1336 data yang memiliki Quantity sebanyak <=0, karena itu data ini kita anggap tidak valid. Kita bisa membuang data yang tidak valid ini.

4.4 Harga Satuan Tidak Valid

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

Argumen Anda: Disini saya menganggap bahwa harga satuan di bawah 0 atau sama dengan 0 adalah tidak valid. Kemudian saya membuang daya tidak valid tersebut.

4.5 Produk Tidak Valid

produk_valid <- Retail %>% 
              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"
Retail <- Retail %>% 
  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")

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

Argumen Anda: Seperti tertulis pada kolom deskripsi bahwa stock code terdiri dari 5 digit angka, maka dari itu disini saya menggunakan substring 5 digit pertama dari stock code dan kemudian saya convert ke tipe data numerik. Data yang betuliskan NA adalah data yang tidak valid.

4.6 Deskripsi Ganda & Stok

#1 Cek keunikan pada data 
library(dplyr)
data_frame(
  stok_kode_unik = Retail$`Kode barang` %>% unique() %>% length(),
  Deskripsi_unik = Retail$`Deskripsi Barang` %>% unique() %>% length(),
  deskripsi_barang_unik = Retail %>% 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 <- Retail %>% 
  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 deskripsi pada transaksi terakhir dari setiap produk. Mari kita bersihkan

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

Retail <-Retail %>% 
  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 = Retail$`Kode barang` %>% unique() %>% length(),
  Deskripsi_unik = Retail$`Deskripsi Barang` %>% unique() %>% length(),
  deskripsi_barang_unik = Retail %>% 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 <- Retail %>% 
  arrange(desc(`Tanggal Invoice`)) %>% 
  select(`Kode barang`,`Deskripsi Barang`) %>% 
  distinct()

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

Retail <-Retail %>% 
  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 = Retail$`Kode barang` %>% unique() %>% length(),
  Deskripsi_unik = Retail$`Deskripsi Barang` %>% unique() %>% length(),
  deskripsi_barang_unik = Retail %>% 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: Seluruh data sudah bersifat unik karena jumlah datanya sudah sama rata dimana itu artinya data yang kita miliki sudah tidak ada yang double.

4.7 Negara Tidak Valid

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

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

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

Argumen Anda: Data di atas menunjukan bahwa ada customer yang memiliki 2 negara. Untuk case ini, kita bisa berasumsi bahwa customer tersebut pindah lokasi tempat tinggal, sehingga kita bisa menyesuaikan negara customer berdasarkan negara terakhir ia melakukan transaksi. Maka dari itu kita harus membersihkannya.

4.8 Pemutusan Berkala

library(lubridate)
Retail <- Retail %>% filter(ymd(as.Date(Retail$`Tanggal Invoice`)) < ymd("2011-12-1"))
tail(Retail, 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: Data transaksi yang kita miliki dari 2010-12-01 sampai dengan 2011-12-09. Berhubung kita tidak memiliki data transaksi lengkap pada Desember 2011, maka saya memutuskan untuk take out data Desember 2011 dari analisa ini, sehingga kita memiliki transaksi full 1 tahun dari Desember 2010 sampai november 2011.

4.10 Data Duplikat

Retail <- Retail%>%distinct()

Argumen Anda: Data diatas masih ada yang duplikat, jadi harus kita bersihkan.

4.11 Fitur ekstraksi

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

Argumen Anda: Kita buat variabel baru untuk fitur ektrasi dimana merupakan total nilai transaksi. Fitur ekstraksi dilakukan untuk mempermudah proses analisis selanjutnya.

4.12 Nilai yang hilang

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

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(Retail,"retail2.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:

Retail2 <- readRDS("retail2.rds")

6.1 banyak pelanggan yang melakukan transaksi setiap bulan

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

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

Pelanggan <- Retail %>% 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 <- Retail2 %>%
  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 <- Retail2 %>% 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 <- Retail2 %>% 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 <-Retail2 %>% 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 <- Retail%>%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 <-Retail2%>%
            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 <-Retail2%>%
            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 <-Retail2%>%
            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 <- Retail2 %>%
              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, produk 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 <- Retail2 %>% 
            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 <- Retail2 %>%
  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 <- Retail2 %>%
  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: Terkait kasus diatas, banyak sekali data yang duplikat dimana data tersebut harus diperbaiki atau bahkan dibuang. Disini juga dapat kita lihat bahwa transaksi tertinggi jatuh pada bulan November 2011, namun pada bulan November tidak ada peningkatan pelanggan baru. Jadi, dapat kita asumsikan kalau pelanggan pada bulan November 2011 adalah orang yang sama atau dengan kata lain bukan pelanggan baru dan pelanggan sebagian besar berasal dari United Kingdom.