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


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

2 Tugas 1

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

#setwd ("/cloud/project/uas")
Data2 <- readRDS("/cloud/project/uas/Retail.rds")
head(Data2,10)
##    InvoiceNo StockCode                         Description Quantity
## 1     536365    85123A  WHITE HANGING HEART T-LIGHT HOLDER        6
## 2     536365     71053                 WHITE METAL LANTERN        6
## 3     536365    84406B      CREAM CUPID HEARTS COAT HANGER        8
## 4     536365    84029G KNITTED UNION FLAG HOT WATER BOTTLE        6
## 5     536365    84029E      RED WOOLLY HOTTIE WHITE HEART.        6
## 6     536365     22752        SET 7 BABUSHKA NESTING BOXES        2
## 7     536365     21730   GLASS STAR FROSTED T-LIGHT HOLDER        6
## 8     536366     22633              HAND WARMER UNION JACK        6
## 9     536366     22632           HAND WARMER RED POLKA DOT        6
## 10    536367     84879       ASSORTED COLOUR BIRD ORNAMENT       32
##            InvoiceDate UnitPrice CustomerID        Country
## 1  2010-12-01 08:26:00      2.55      17850 United Kingdom
## 2  2010-12-01 08:26:00      3.39      17850 United Kingdom
## 3  2010-12-01 08:26:00      2.75      17850 United Kingdom
## 4  2010-12-01 08:26:00      3.39      17850 United Kingdom
## 5  2010-12-01 08:26:00      3.39      17850 United Kingdom
## 6  2010-12-01 08:26:00      7.65      17850 United Kingdom
## 7  2010-12-01 08:26:00      4.25      17850 United Kingdom
## 8  2010-12-01 08:28:00      1.85      17850 United Kingdom
## 9  2010-12-01 08:28:00      1.85      17850 United Kingdom
## 10 2010-12-01 08:34:00      1.69      13047 United Kingdom

Argumen Anda: Menurut saya, import data yang lebih baik adalah yang file rds, karena file excelnya cukup berat, sehingga importnya cukup memakan waktu dan R saya beberapa kali error karena itu.

3 Tugas 2

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

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
Data2 %>% 
  rename(
    "Nomor_Invoice"     = InvoiceNo ,
    "Kode_Produk"       = StockCode ,
    "Deskripsi"         = Description , 
    "Tanggal_Transaksi" = InvoiceDate , 
    "Harga_Produk"      = UnitPrice , 
    "ID_Pelanggan"      = CustomerID , 
    "Negara_Pelanggan"  = Country
    )
## # A tibble: 541,909 x 8
##    Nomor_Invoice Kode_Produk Deskripsi Quantity Tanggal_Transaksi   Harga_Produk
##    <chr>         <chr>       <chr>        <dbl> <dttm>                     <dbl>
##  1 536365        85123A      WHITE HA…        6 2010-12-01 08:26:00         2.55
##  2 536365        71053       WHITE ME…        6 2010-12-01 08:26:00         3.39
##  3 536365        84406B      CREAM CU…        8 2010-12-01 08:26:00         2.75
##  4 536365        84029G      KNITTED …        6 2010-12-01 08:26:00         3.39
##  5 536365        84029E      RED WOOL…        6 2010-12-01 08:26:00         3.39
##  6 536365        22752       SET 7 BA…        2 2010-12-01 08:26:00         7.65
##  7 536365        21730       GLASS ST…        6 2010-12-01 08:26:00         4.25
##  8 536366        22633       HAND WAR…        6 2010-12-01 08:28:00         1.85
##  9 536366        22632       HAND WAR…        6 2010-12-01 08:28:00         1.85
## 10 536367        84879       ASSORTED…       32 2010-12-01 08:34:00         1.69
## # … with 541,899 more rows, and 2 more variables: ID_Pelanggan <dbl>,
## #   Negara_Pelanggan <chr>

Argumen Anda: saya ubah variabelnya menjadi bahasa Indonesia supaya mudah dibaca.

4 Tugas 3

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

str(Data2)
## tibble [541,909 × 8] (S3: tbl_df/tbl/data.frame)
##  $ InvoiceNo  : chr [1:541909] "536365" "536365" "536365" "536365" ...
##  $ StockCode  : chr [1:541909] "85123A" "71053" "84406B" "84029G" ...
##  $ Description: chr [1:541909] "WHITE HANGING HEART T-LIGHT HOLDER" "WHITE METAL LANTERN" "CREAM CUPID HEARTS COAT HANGER" "KNITTED UNION FLAG HOT WATER BOTTLE" ...
##  $ Quantity   : num [1:541909] 6 6 8 6 6 2 6 6 6 32 ...
##  $ InvoiceDate: POSIXct[1:541909], format: "2010-12-01 08:26:00" "2010-12-01 08:26:00" ...
##  $ UnitPrice  : num [1:541909] 2.55 3.39 2.75 3.39 3.39 7.65 4.25 1.85 1.85 1.69 ...
##  $ CustomerID : num [1:541909] 17850 17850 17850 17850 17850 ...
##  $ Country    : chr [1:541909] "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...

Argumen Anda: Menurut saya, data di atas sudah sesuai untuk character dan number nya

5 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:

library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union

5.1 Transaksi yang dibatalkan

TransaksiBatal <- Data2 %>% filter(grepl("C", Data2$InvoiceNo)) 
Data2 <- Data2 %>%
        filter(!grepl("C", Data2$InvoiceNo))
Data2
## # A tibble: 532,621 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
##  7 536365    21730     GLASS STAR…        6 2010-12-01 08:26:00      4.25
##  8 536366    22633     HAND WARME…        6 2010-12-01 08:28:00      1.85
##  9 536366    22632     HAND WARME…        6 2010-12-01 08:28:00      1.85
## 10 536367    84879     ASSORTED C…       32 2010-12-01 08:34:00      1.69
## # … with 532,611 more rows, and 2 more variables: CustomerID <dbl>,
## #   Country <chr>

Argumen Anda: Transaksi yang dibatalkan adalah ketika nomor invoice nya terdapat huruf C nya. Oleh karena itu saya memutuskan untuk menghapus transaksi tersebut.

5.2 Faktur tidak valid

Data2 %>% filter(nchar(InvoiceNo)>6)
## # A tibble: 3 x 8
##   InvoiceNo StockCode Description Quantity InvoiceDate         UnitPrice
##   <chr>     <chr>     <chr>          <dbl> <dttm>                  <dbl>
## 1 A563185   B         Adjust bad…        1 2011-08-12 14:50:00    11062.
## 2 A563186   B         Adjust bad…        1 2011-08-12 14:51:00   -11062.
## 3 A563187   B         Adjust bad…        1 2011-08-12 14:52:00   -11062.
## # … with 2 more variables: CustomerID <dbl>, Country <chr>
Data2 <- Data2 %>%
        filter(nchar(InvoiceNo)==6)
Data2
## # A tibble: 532,618 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
##  7 536365    21730     GLASS STAR…        6 2010-12-01 08:26:00      4.25
##  8 536366    22633     HAND WARME…        6 2010-12-01 08:28:00      1.85
##  9 536366    22632     HAND WARME…        6 2010-12-01 08:28:00      1.85
## 10 536367    84879     ASSORTED C…       32 2010-12-01 08:34:00      1.69
## # … with 532,608 more rows, and 2 more variables: CustomerID <dbl>,
## #   Country <chr>

Argumen Anda: Data yang valid adalah data yang terdiri dari 6 angka. Tetapi, ternyata terdapat data yang terdiri dari 6 digit, sehingga data itu tidak valid dan saya putuskan untuk dihapus.

5.3 Kuantitas tidak valid

Data2 %>% 
  filter(Quantity <=0) %>%
  nrow()
## [1] 1336
Data2 <- Data2 %>%
        filter(Quantity > 0)
Data2
## # A tibble: 531,282 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
##  7 536365    21730     GLASS STAR…        6 2010-12-01 08:26:00      4.25
##  8 536366    22633     HAND WARME…        6 2010-12-01 08:28:00      1.85
##  9 536366    22632     HAND WARME…        6 2010-12-01 08:28:00      1.85
## 10 536367    84879     ASSORTED C…       32 2010-12-01 08:34:00      1.69
## # … with 531,272 more rows, and 2 more variables: CustomerID <dbl>,
## #   Country <chr>

Argumen Anda: Terdapat 1336 data transaksi yang memiliki quantity<=0, sehingga data ini perlu dibuang karena tidak valid jika suatu transaksi tidak memiliki quantity.

5.4 Harga Satuan Tidak Valid

Data2 %>% filter(UnitPrice <= 0) %>% nrow()
## [1] 1179
Data2 <- Data2 %>% filter(UnitPrice > 0)
Data2
## # A tibble: 530,103 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
##  7 536365    21730     GLASS STAR…        6 2010-12-01 08:26:00      4.25
##  8 536366    22633     HAND WARME…        6 2010-12-01 08:28:00      1.85
##  9 536366    22632     HAND WARME…        6 2010-12-01 08:28:00      1.85
## 10 536367    84879     ASSORTED C…       32 2010-12-01 08:34:00      1.69
## # … with 530,093 more rows, and 2 more variables: CustomerID <dbl>,
## #   Country <chr>

Argumen Anda: Terdapat 1174 data Unit Price yang tidak valid. Oleh karena itu saya memfilter data sehingga yang ditampilkan hanya data yang Harga Satuannya > 0

5.5 Produk Tidak Valid

Data2 <- Data2 %>% 
        filter(nchar(StockCode) >=5 )

Data2 %>% filter(nchar(StockCode) > 6) %>%
         select(StockCode,Description) %>%
         distinct() %>%
         arrange(StockCode)
## # A tibble: 16 x 2
##    StockCode    Description                       
##    <chr>        <chr>                             
##  1 15056bl      EDWARDIAN PARASOL BLACK           
##  2 15056BL      EDWARDIAN PARASOL BLACK           
##  3 AMAZONFEE    AMAZON FEE                        
##  4 BANK CHARGES Bank Charges                      
##  5 DCGS0003     BOXED GLASS ASHTRAY               
##  6 DCGS0004     HAYNES CAMPER SHOULDER BAG        
##  7 DCGS0069     OOH LA LA DOGS COLLAR             
##  8 DCGS0070     CAMOUFLAGE DOG COLLAR             
##  9 DCGS0076     SUNJAR LED NIGHT NIGHT LIGHT      
## 10 DCGSSBOY     BOYS PARTY BAG                    
## 11 DCGSSGIRL    GIRLS PARTY BAG                   
## 12 gift_0001_10 Dotcomgiftshop Gift Voucher £10.00
## 13 gift_0001_20 Dotcomgiftshop Gift Voucher £20.00
## 14 gift_0001_30 Dotcomgiftshop Gift Voucher £30.00
## 15 gift_0001_40 Dotcomgiftshop Gift Voucher £40.00
## 16 gift_0001_50 Dotcomgiftshop Gift Voucher £50.00

Argumen Anda: Terdapat stock code yang tidak valid, seperti AMAZONFEE, BANK CHARGES, gift, dan DCGSS. Maka harus difilter, dengan rumus seperti ini.

Data2 <- Data2 %>%
        filter(!StockCode %in% c("AMAZONFEE", "BANK CHARGES", 
                                   "gift_0001_10", "gift_0001_20", 
                                   "gift_0001_30", "gift_0001_40", 
                                   "gift_0001_50", "DCGSSBOY",
                                   "DCGSSGIRL"))
Data2
## # A tibble: 527,734 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
##  7 536365    21730     GLASS STAR…        6 2010-12-01 08:26:00      4.25
##  8 536366    22633     HAND WARME…        6 2010-12-01 08:28:00      1.85
##  9 536366    22632     HAND WARME…        6 2010-12-01 08:28:00      1.85
## 10 536367    84879     ASSORTED C…       32 2010-12-01 08:34:00      1.69
## # … with 527,724 more rows, and 2 more variables: CustomerID <dbl>,
## #   Country <chr>

Berdasarkan data di atas, dapat dilihat bahwa terdapat beberapa Stock Code yang tidak menyatakan Nama Barang yang dijual. Kode itulah yang saya hapus.

5.6 Deskripsi Ganda & Stok

# mencari keunikan dari datanya 

data.frame(
  StockCode_unique = Data2$StockCode %>% unique() %>% length(),
  Description_unique = Data2$Description %>% unique() %>% length(),
  KodeNama_unique   = Data2 %>%
                        select(StockCode, Description) %>%
                        distinct() %>%
                        nrow()
)
##   StockCode_unique Description_unique KodeNama_unique
## 1             3905               3999            4141

Terlihat bahwa setiap datanya berbeda-beda, yang berarti data terduplikasi.

# mencari StockCode yang lebih dari 1 deskripsi

Produk <- Data2 %>% 
  arrange(desc(InvoiceDate)) %>% 
  select(StockCode,Description) %>% 
  distinct()

Produk %>% 
  group_by(StockCode) %>% 
  summarise(description_count=n()) %>% 
  ungroup() %>%
  filter(description_count>1)
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 217 x 2
##    StockCode description_count
##    <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

Setelah didapatkan, kita perlu menyesuaikan deskripsi dari setiap produk dengan menggunakan deksripsi pada transaksi terakhir dari setiap produk. Setelah itu, dibersihkan.

Produk <- Produk %>% 
  group_by(StockCode) %>% 
  slice(1) 

Data2 <- Data2 %>% left_join(Produk , by="StockCode") %>% 
  mutate(Description=Description.y) %>% 
  select(-Description.x,-Description.y)

data_frame(
  stock_code_unique = Data2$StockCode %>% unique() %>% length(),
  description_unique = Data2$StockCode %>% unique() %>% length(),
  stock_description_unique = Data2 %>% select(StockCode,Description) %>% 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
##   stock_code_unique description_unique stock_description_unique
##               <int>              <int>                    <int>
## 1              3905               3905                     3905

Argumen Anda: Setiap nama barang, memiliki kodenya masing masing dan seharusnya tidak ada barang yang kodenya ganda. Tetapi setelah dibersihkan dan telah mendapatkan hasilnya yang sama semua, itu berarti sudah tidak ada barang yang kodenya ganda, maupun sebaliknya.

5.7 Status Tidak Valid

# mengecek kesamaan customerID dan countrynya
data_frame(
  customer_unik = Data2 %>% select(CustomerID) %>% distinct() %>% nrow(),
  customercountry_unik = Data2 %>% select(CustomerID,Country) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 2
##   customer_unik customercountry_unik
##           <int>                <int>
## 1          4335                 4351

Terlihat bahwa adanya perbedaan jumlah unik customer dan country, yang berarti menunjukkan terdapat customer dengan lebih dari 1 negara. Oleh karena itu kita harus mengatasi masalah ini dengan rumus seperti berikut.

Data2.customer <- Data2 %>% 
  arrange(desc(InvoiceDate,CustomerID)) %>% 
  select(CustomerID, Country) %>% 
  group_by(CustomerID) %>%
  slice(1)

Data2 <- Data2 %>% select(-Country) %>%
  left_join(Data2.customer, by = "CustomerID")

data_frame(
  customer_id_unik = Data2 %>% select(CustomerID) %>% distinct() %>% nrow(),
  customer_country_unik = Data2 %>% select(CustomerID,Country) %>% distinct() %>% nrow()
)
## # A tibble: 1 x 2
##   customer_id_unik customer_country_unik
##              <int>                 <int>
## 1             4335                  4335

Argumen Anda: Setelah diatasi dengan rumus di atas, maka sudah tidak terdapat customer dengan lebih dari satu country.

5.8 Pemutusan Berkala

library(lubridate)
Data2 <- Data2 %>% filter(ymd(as.Date(Data2$InvoiceDate)) < ymd("2011-12-1"))
Data2
## # A tibble: 502,704 x 8
##    InvoiceNo StockCode Quantity InvoiceDate         UnitPrice CustomerID
##    <chr>     <chr>        <dbl> <dttm>                  <dbl>      <dbl>
##  1 536365    85123A           6 2010-12-01 08:26:00      2.55      17850
##  2 536365    71053            6 2010-12-01 08:26:00      3.39      17850
##  3 536365    84406B           8 2010-12-01 08:26:00      2.75      17850
##  4 536365    84029G           6 2010-12-01 08:26:00      3.39      17850
##  5 536365    84029E           6 2010-12-01 08:26:00      3.39      17850
##  6 536365    22752            2 2010-12-01 08:26:00      7.65      17850
##  7 536365    21730            6 2010-12-01 08:26:00      4.25      17850
##  8 536366    22633            6 2010-12-01 08:28:00      1.85      17850
##  9 536366    22632            6 2010-12-01 08:28:00      1.85      17850
## 10 536367    84879           32 2010-12-01 08:34:00      1.69      13047
## # … with 502,694 more rows, and 2 more variables: Description <chr>,
## #   Country <chr>

Argumen Anda: Data transaksi yang dimuat sebelumnya, di mulai dari 2010-12-01 sampai 2011-12-09. Karena data pada Desember 2011 tidak lengkap, maka lebih baik datanya dihapus dan transaksi yang digunakan adalah transaksi dari Desember 2010 sampai November 2011.

5.9 Data Duplikat

data.frame(
  row_of_data = Data2 %>% nrow(),
  row_of_unique_data = Data2 %>% distinct() %>% nrow()
)
##   row_of_data row_of_unique_data
## 1      502704             497759

Argumen Anda: Berdasarkan rumus saya, maka sudah tidak ada data yang duplikat.

5.10 Fitur ekstraksi

Data2 <- Data2 %>% 
        mutate(Harga_Total = Quantity * UnitPrice) %>% 
        select(InvoiceNo, InvoiceDate,CustomerID,Country, 
               StockCode, Description, Quantity, UnitPrice, 
               Harga_Total)
Data2
## # A tibble: 502,704 x 9
##    InvoiceNo InvoiceDate         CustomerID Country StockCode Description
##    <chr>     <dttm>                   <dbl> <chr>   <chr>     <chr>      
##  1 536365    2010-12-01 08:26:00      17850 United… 85123A    CREAM HANG…
##  2 536365    2010-12-01 08:26:00      17850 United… 71053     WHITE MORO…
##  3 536365    2010-12-01 08:26:00      17850 United… 84406B    CREAM CUPI…
##  4 536365    2010-12-01 08:26:00      17850 United… 84029G    KNITTED UN…
##  5 536365    2010-12-01 08:26:00      17850 United… 84029E    RED WOOLLY…
##  6 536365    2010-12-01 08:26:00      17850 United… 22752     SET 7 BABU…
##  7 536365    2010-12-01 08:26:00      17850 United… 21730     GLASS STAR…
##  8 536366    2010-12-01 08:28:00      17850 United… 22633     HAND WARME…
##  9 536366    2010-12-01 08:28:00      17850 United… 22632     HAND WARME…
## 10 536367    2010-12-01 08:34:00      13047 United… 84879     ASSORTED C…
## # … with 502,694 more rows, and 3 more variables: Quantity <dbl>,
## #   UnitPrice <dbl>, Harga_Total <dbl>

Argumen Anda: untuk mengekstrak total nilai transaksi atau total harga, kita dapat menggunakan rumus Quantity dikalikan Unitprice (kuantitas dikali harga per barang)

5.11 Nilai yang hilang

# mencari letak data yang memiliki nilai yg hilang
colSums(is.na(Data2))
##   InvoiceNo InvoiceDate  CustomerID     Country   StockCode Description 
##           0           0      123609           0           0           0 
##    Quantity   UnitPrice Harga_Total 
##           0           0           0

Ternyata, data dengan nilai yang hilang terdapat pada kolom CustomerID. Maka, harus dihapus.

Data2 <- na.omit(Data2)
Data2
## # A tibble: 379,095 x 9
##    InvoiceNo InvoiceDate         CustomerID Country StockCode Description
##    <chr>     <dttm>                   <dbl> <chr>   <chr>     <chr>      
##  1 536365    2010-12-01 08:26:00      17850 United… 85123A    CREAM HANG…
##  2 536365    2010-12-01 08:26:00      17850 United… 71053     WHITE MORO…
##  3 536365    2010-12-01 08:26:00      17850 United… 84406B    CREAM CUPI…
##  4 536365    2010-12-01 08:26:00      17850 United… 84029G    KNITTED UN…
##  5 536365    2010-12-01 08:26:00      17850 United… 84029E    RED WOOLLY…
##  6 536365    2010-12-01 08:26:00      17850 United… 22752     SET 7 BABU…
##  7 536365    2010-12-01 08:26:00      17850 United… 21730     GLASS STAR…
##  8 536366    2010-12-01 08:28:00      17850 United… 22633     HAND WARME…
##  9 536366    2010-12-01 08:28:00      17850 United… 22632     HAND WARME…
## 10 536367    2010-12-01 08:34:00      13047 United… 84879     ASSORTED C…
## # … with 379,085 more rows, and 3 more variables: Quantity <dbl>,
## #   UnitPrice <dbl>, Harga_Total <dbl>

Argumen Anda: Setelah menghapus data yang yang tidak valid tersebut, yaitu karena terdapat nilai yg hilang, maka sekarang data sudah valid lagi.

6 Tugas 5

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

saveRDS(Data2, "Data.Rds")                              

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

library(lubridate)
library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(glue)
## 
## Attaching package: 'glue'
## The following object is masked from 'package:dplyr':
## 
##     collapse
library(dplyr)
library(ggplot2)
library(scales)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout

7.1 Banyak Pelanggan Setiap Bulan

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

Data2$Month <- factor(format(Data2$`InvoiceDate`,
                       "%b %Y"), levels=paste (month.abb, rep(2010:2011, each=12)))
Customer       <- Data2%>%select( Month, `CustomerID`)%>%
                distinct()%>%group_by(Month)%>%summarize(n=n())
## `summarise()` ungrouping output (override with `.groups` argument)
ggplot(Customer, aes(x = Month, y = n )) +            
  geom_bar(fill = "blue",color= "black",stat="identity")+ 
   geom_text(aes(label = n),
            vjust = -0.35) +
  theme_minimal() +                                
  labs(x = "Bulan-Tahun",
       title  = "Jumlah Customer Setiap Bulan")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Argumen Anda: Dapat dilihat bahwa bulan November 2011 mencapai customer terbanyak dibanding bulan lainnya.

7.2 Pertumbuhan Pelanggan Setiap Bulan

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

plot_monthly_new_customer <- Data2 %>%
  group_by(CustomerID) %>% 
  summarise(first_order = min(InvoiceDate)) %>% 
  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_area(fill="blue",alpha=0.7)+
  geom_line(fill = "cornflowerblue",color= "black") +
  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()
  )
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` regrouping output by 'ym' (override with `.groups` argument)
## Warning: Ignoring unknown parameters: fill
## Warning: Ignoring unknown aesthetics: text
ggplotly(plot_monthly_new_customer, tooltip = "text")

Argumen Anda: Dengan grafik di atas, kita dapat memperlihatkan pertumbuhan pelanggan baru setiap bulannya. Dari grafik dapat dilihat pertambahan customer yang paling besar terjadi pada Desember 2010. Sedangkan yang paling rendah terjadi pada Agustus 2011.

7.3 Waktu Pemesanan

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

library(gridExtra)
# Waktu pemesanan dalam bulanan

Monthly_Sales <- Data2 %>%
  select(InvoiceDate,InvoiceNo) %>%
  distinct() %>%
  mutate(Month = month(InvoiceDate),
         Day = day(InvoiceDate)) %>%
  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 = "Pesanan dalam Bulan") +
  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()


# Waktu pemesanan dalam harian

Daily_Sales  <- Data2 %>%
  select(InvoiceDate,InvoiceNo) %>%
  distinct() %>%
  mutate(Month = month(InvoiceDate),
         Day = wday(InvoiceDate,
                    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 = "Pesanan dalam Hari") +
  scale_x_continuous(breaks = c(1:7),
                     labels = c("Mon","Tue","Wed","Thu","Fri","Sat","Sun")) +
  theme_minimal()+
  theme(axis.title = element_blank(),
        legend.position = "none",
        plot.title = element_text(hjust = 0.5,size = 12,face = "bold"),
        plot.subtitle = element_text(hjust = 0.5,size = 10),
        axis.text.y = element_blank(),
        axis.text.x = element_text(size = 11,face = "bold"))+
  scale_fill_gradient(low = "cyan", high = "darkblue")+
  coord_polar()

# Waktu pemesanan dalam jam

Hourly_Sales  <- Data2 %>%
 select(InvoiceDate,InvoiceNo) %>%
  distinct() %>%
  mutate(Month = month(InvoiceDate),
         Hour = hour(InvoiceDate)) %>%
  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 = "Pesanan dalam 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: Berdasarkan hasilnya, kita tahu bahwa semakin gelap warna nya, semakin banyak transaksinya. Jika dilihat berdasarkan Bulan, maka pada tanggal 5 dan 29 yang memiliki transaksi paling banyak. Jika dilihat berdasarkan hari, maka transaksi yang memiliki pesanan paling banyak ada pada hari Kamis. Lalu berdasarkan jam, maka pada pukul 12 siang yang memiliki transaksi paling banyak.

7.4 Frekuensi Transaksi Setiap Bulan

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

MonthlyFreq <- Data2%>%select( InvoiceNo, Month)%>%
                distinct()%>%
                group_by(Month)%>%
                 summarise(n=n())%>%
               mutate(detail = glue("Bulan : {Month}
                                    Total Transaksi: {n}"))
## `summarise()` ungrouping output (override with `.groups` argument)
BarChart1 <- ggplot(MonthlyFreq,
                 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 Setiap Bulan",
               y = NULL)
## Warning: Ignoring unknown parameters: palette
## Warning: Ignoring unknown aesthetics: text
ggplotly(BarChart1,tooltip = "text")

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

7.5 10 Produk Terpopuler Berdasarkan Frekuensi Transaksi

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

Produk_freq    <- Data2 %>% 
                  group_by(StockCode,Description) %>% 
                  summarise(Frekuensi = n()) %>% 
                  ungroup() %>% 
                  arrange(desc(Frekuensi)) %>%
                  head(10) %>%
                  mutate(nama = as.factor(Description),
                         nama = reorder(nama, Frekuensi)) %>% 
                  ggplot(aes(x=nama, 
                             y=Frekuensi))+
                  geom_bar(stat="identity", 
                           aes(fill= nama, text= Frekuensi), 
                           show.legend = FALSE)+
                  labs(title="10 Produk Terpopuler Berdasarkan Frekuensi Transaksi",
                       x=NULL,
                       y=NULL) +
                  coord_flip()
## `summarise()` regrouping output by 'StockCode' (override with `.groups` argument)
## Warning: Ignoring unknown aesthetics: text
ggplotly(Produk_freq, tooltip="text") %>% 
  layout(showlegend=FALSE) %>% 
  config(displayModeBar = T, scrollzoom = T)
## Warning: 'config' objects don't have these attributes: 'scrollzoom'
## Valid attributes include:
## 'staticPlot', 'plotlyServerURL', 'editable', 'edits', 'autosizable', 'responsive', 'fillFrame', 'frameMargins', 'scrollZoom', 'doubleClick', 'doubleClickDelay', 'showAxisDragHandles', 'showAxisRangeEntryBoxes', 'showTips', 'showLink', 'linkText', 'sendData', 'showSources', 'displayModeBar', 'showSendToCloud', 'showEditInChartStudio', 'modeBarButtonsToRemove', 'modeBarButtonsToAdd', 'modeBarButtons', 'toImageButtonOptions', 'displaylogo', 'watermark', 'plotGlPixelRatio', 'setBackground', 'topojsonURL', 'mapboxAccessToken', 'logging', 'notifyOnLogging', 'queueLength', 'globalTransforms', 'locale', 'locales'

Argumen Anda: Dengan melihat chart di atas, maka didapat 10 produk terpopuler, dengan jumlah terbanyak 1964 transaksi yaitu pada produk Cream Hanging Heart T-light Holder.

7.6 10 Produk Terpopuler Berdasarkan Jumlah Pesanan

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

Produk_pesanan <-Data2%>%
                 group_by(Description )%>%
                 summarise(q=sum(Quantity)) %>%
                 arrange(desc(q))%>%
                 head(10) %>%
                 mutate(Produk = as.factor(Description))%>%
  ggplot(aes(x = reorder(Produk,q),
             y = q)) +
  geom_bar(fill = rainbow(10),
                color = "black",
           stat = "identity")+
  labs( title = "10 Produk Terpopuler Berdasarkan Jumlah Pesanan")+
         ylab("Frekuensi") +
  xlab(NULL) +
  coord_flip()+
  theme_minimal()
ggplotly(Produk_pesanan)

Argumen Anda: Berdasarkan grafik yang kita buat di atas, dapat dilihat bahwa produk paling populer berdasarkan jumlah pesanan adalah MEDIUM CERAMIC TOP STORAGE JAR sebanyak 777729

7.7 10 Produk Terpopuler Berdasarkan Total Pelanggan

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

produk_pelanggan <- Data2 %>% 
                    group_by(StockCode,Description) %>% 
                    summarise(Jumlah = n()) %>% 
                    ungroup() %>% 
                    arrange(desc(Jumlah)) %>%
                    head(10) %>%
                    mutate(nama = as.factor(Description),
                           nama = reorder(nama, Jumlah)) %>% 
                    ggplot(aes(x=nama, 
                               y=Jumlah))+
                    geom_bar(stat="identity", 
                            aes(fill= nama, text= Jumlah), 
                            show.legend = FALSE)+
                    labs(title="10 Produk Popoler",
                         x=NULL,
                         y=NULL) +
                    coord_flip()
## `summarise()` regrouping output by 'StockCode' (override with `.groups` argument)
## Warning: Ignoring unknown aesthetics: text
ggplotly(produk_pelanggan, tooltip="text") %>% 
  layout(showlegend=FALSE) %>% 
  config(displayModeBar = T, scrollzoom = T)
## Warning: 'config' objects don't have these attributes: 'scrollzoom'
## Valid attributes include:
## 'staticPlot', 'plotlyServerURL', 'editable', 'edits', 'autosizable', 'responsive', 'fillFrame', 'frameMargins', 'scrollZoom', 'doubleClick', 'doubleClickDelay', 'showAxisDragHandles', 'showAxisRangeEntryBoxes', 'showTips', 'showLink', 'linkText', 'sendData', 'showSources', 'displayModeBar', 'showSendToCloud', 'showEditInChartStudio', 'modeBarButtonsToRemove', 'modeBarButtonsToAdd', 'modeBarButtons', 'toImageButtonOptions', 'displaylogo', 'watermark', 'plotGlPixelRatio', 'setBackground', 'topojsonURL', 'mapboxAccessToken', 'logging', 'notifyOnLogging', 'queueLength', 'globalTransforms', 'locale', 'locales'

Argumen Anda: Dari data di atas, kita dapat melihat bahwa produk Cream Hanging Heart T-light Holder merupakan produk dengan konsumen terbanyak.

7.8 10 Produk Terpopuler Berdasarkan Nilai Mata Uang

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

PopProd_matauang <- Data2 %>%
                    group_by(StockCode, Description) %>%
                    summarise(n=sum(Harga_Total))%>%
                    ungroup()%>%
                    arrange(desc(n))%>%
                    head(10)%>%
                    mutate(Barang = as.factor(Description)) %>% 
  ggplot(aes(x = reorder(Barang, n),
                        y = n))+
            geom_bar(fill = rainbow(10),
                     color = "black",
                     stat="identity")+
              labs(title = "10 Produk Terpopuler Berdasarkan Nilai Mata Uang",
                   x = NULL,
                   y = NULL)+
  coord_flip()+
                scale_y_continuous(label = scales::format_format(big.mark = ".",
                                                   decimal.mark = ",",
                                                   scientific = F))
ggplotly(PopProd_matauang)

Argumen Anda: Berdasarkan grafik di atas, maka kita dapat mengetahui bahwa Regency Cakestand 3 Tier yang memiliki penjualan terbanyak.

7.9 Perubahan Penjualan Berdasarkan Nilai Mata Uang

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

Penjualan_matauang <- Data2 %>% 
                      group_by(Description, Harga_Total)%>%
                      summarise(order = min(InvoiceDate))%>%
                      ungroup() %>%
                      mutate(ym = as.yearmon(order))%>%
                      group_by(ym)%>%
                      summarise( Total = sum(Harga_Total))%>%
                      mutate(Penjelasan = glue("Bulan : {ym}
                                                Nilai : {Total}")) %>%
          
        ggplot(aes(x = ym,
                   y = Total,
                   group = 1 )) +
        geom_line(aes(text = Penjelasan),
                      color = "coral")+
  theme_minimal()+
  labs(x = "Month",
       y = "Pelanggan",
       title = "Penjualan Berdasarkan Nilai Mata Uang") +
  scale_y_continuous(label = scales::format_format(big.mark = ".",
                                                   decimal.mark = ",",
                                                   scientific = F))
ggplotly(Penjualan_matauang, tooltip = "text")
## Warning: `group_by_()` is deprecated as of dplyr 0.7.0.
## Please use `group_by()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.

Argumen Anda: Berdasarkan chart yang kita dapatkan di atas, penjualan mencapai titik terendahnya pada bulan April 2011. Tetapi setelah itu meningkat lagi sampai bulan Oktober 2011, meskipun tetap mengalami penurunan juga.

7.10 Besar Konsumen Setiap Negara

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

library(treemap)

treemap(Data2,
        index      = c("Country"),
        vSize      = "Quantity",
        title      = "Konsumen Negara")

Argumen Anda: Dapat kita lihat pada tree map di atas, data menunjukan bahwa konsumen terbesar terdapat pada negara United Kingdom.

8 Tugas 7

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

Argumen Anda: berdasarkan analisa di atas, maka penjualan pada bisnis saya akan lebih detail lagi, dalam arti produk yang terjual paling banyak, akan diproduksi lebih banyak lagi dan dapat ditambahkan hal-hal menarik yang dapat mengundang orang untuk membeli lebih lagi dari sebelumnya. Selain itu hal yang dapat dilakukan adalah mencari cara supaya tidak terjadi ketidakrataan total pembelanjaan di setiap bulannya, mungkin dengan memberikan promo-promo atau diskon menarik di setiap bulannya, yang bisa menjadi daya tarik bagi customer. Lalu, jika dilihat, maka penjualan yang paling banyak terdapat di negara United Kingdom. Maka hal pertama yang dilakukan adalah memfokuskan penjualannya di negara tersebut seperti mempermudah lagi akses bagi pelanggan. Kemudian dapat dicari kebutuhan yang sesuai di setiap negaranya, supaya tidak terjadi kesenjangan pembelanjaan di setiap negaranya, dan penjualan dapat merata di setiap negaranya. Hal terpenting yang dapat dilihat dari kasus di atas adalah harus mengetahui keinginan pasar di setiap negara, seperti barang yang sering dipakai, yang sedang trendy, dan sebagainya. Maka barang-barang itulah yang dikembangkan di negara-negara tersebut.