Email: ronaldokefas@gmail.com
RPubs: https://rpubs.com/kefasronaldo
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.
Import kedua data tersebut ke Rstudio Anda sesuai dengan jenis file masing-masing (Proses import mana yang lebih baik menurut Anda?).
## 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.
Ubah nama variabel data tersebut agar lebih mudah dipelajari oleh pembaca.
##
## 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.
Lakukan pemeriksaan struktur data untuk mengubah jenis kumpulan data (jika ada yang perlu diubah).
## 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
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:
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
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.
## # 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>
## # 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.
## [1] 1336
## # 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.
## [1] 1179
## # 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
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.
# 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.
# 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.
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.
## row_of_data row_of_unique_data
## 1 502704 497759
Argumen Anda: Berdasarkan rumus saya, maka sudah tidak ada data yang duplikat.
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)
## 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.
## # 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.
Simpan data yang sudah Anda bersihkan ke dalam folder dalam format .json atau .xml atau .rds.
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:
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## Attaching package: 'glue'
## The following object is masked from 'package:dplyr':
##
## collapse
##
## 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
• 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.
• 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
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.
• 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.
• 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
Argumen Anda: Dari chart di atas, maka kita tahu bahwa transaksi terbesar terjadi pada November 2011.
• 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.
• 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
• 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.
• 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))Argumen Anda: Berdasarkan grafik di atas, maka kita dapat mengetahui bahwa Regency Cakestand 3 Tier yang memiliki penjualan terbanyak.
• 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))## 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.
• 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.
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.