Email: je070601@gmail.com
RPubs: https://rpubs.com/invokerarts/
Latar Belakang
Andaikan 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 |
Import kedua data tersebut ke Rstudio Anda sesuai dengan jenis file masing-masing (Proses import mana yang lebih baik menurut Anda?).
## # A tibble: 541,909 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 541,899 more rows, and 2 more variables: CustomerID <dbl>,
## # Country <chr>
## # A tibble: 541,909 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 541,899 more rows, and 2 more variables: CustomerID <dbl>,
## # Country <chr>
Menurut saya, import yang lebih baik adalah dari file Rds, karena mengimport file Rds tidak diperlukan packages seperti mengimport data dari excel (package readxl) dan proses pengimportan data rds lebih cepat dari pada data excel.
Ubah nama variabel data tersebut agar lebih mudah dipelajari oleh pembaca.
names(DataRds)[names(DataRds)==names(DataRds)] <- c(
"Nomor_Invoice" ,
"Kode_Stock" ,
"Deskripsi" ,
"Kuantitas" ,
"Tanggal_Invoice" ,
"Harga_per_Barang",
"ID_Pelanggan" ,
"Negara"
)
DataRds## # A tibble: 541,909 x 8
## Nomor_Invoice Kode_Stock Deskripsi Kuantitas Tanggal_Invoice
## <chr> <chr> <chr> <dbl> <dttm>
## 1 536365 85123A WHITE HA~ 6 2010-12-01 08:26:00
## 2 536365 71053 WHITE ME~ 6 2010-12-01 08:26:00
## 3 536365 84406B CREAM CU~ 8 2010-12-01 08:26:00
## 4 536365 84029G KNITTED ~ 6 2010-12-01 08:26:00
## 5 536365 84029E RED WOOL~ 6 2010-12-01 08:26:00
## 6 536365 22752 SET 7 BA~ 2 2010-12-01 08:26:00
## 7 536365 21730 GLASS ST~ 6 2010-12-01 08:26:00
## 8 536366 22633 HAND WAR~ 6 2010-12-01 08:28:00
## 9 536366 22632 HAND WAR~ 6 2010-12-01 08:28:00
## 10 536367 84879 ASSORTED~ 32 2010-12-01 08:34:00
## # ... with 541,899 more rows, and 3 more variables: Harga_per_Barang <dbl>,
## # ID_Pelanggan <dbl>, Negara <chr>
Disini saya mengubah nama dari variabel menggunakan perintah names untuk mengubah langsung semua nama judul variabel sekaligus
Lakukan pemeriksaan struktur data untuk mengubah jenis kumpulan data (jika ada yang perlu diubah).
## Rows: 541,909
## Columns: 8
## $ Nomor_Invoice <chr> "536365", "536365", "536365", "536365", "536365", ...
## $ Kode_Stock <chr> "85123A", "71053", "84406B", "84029G", "84029E", "...
## $ Deskripsi <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL...
## $ Kuantitas <dbl> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2...
## $ Tanggal_Invoice <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12...
## $ Harga_per_Barang <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1....
## $ ID_Pelanggan <dbl> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 1...
## $ Negara <chr> "United Kingdom", "United Kingdom", "United Kingdo...
DataRds$Kuantitas <- as.integer (DataRds$Kuantitas)
DataRds$ID_Pelanggan <- as.integer (DataRds$ID_Pelanggan)
glimpse(DataRds)## Rows: 541,909
## Columns: 8
## $ Nomor_Invoice <chr> "536365", "536365", "536365", "536365", "536365", ...
## $ Kode_Stock <chr> "85123A", "71053", "84406B", "84029G", "84029E", "...
## $ Deskripsi <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL...
## $ Kuantitas <int> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2...
## $ Tanggal_Invoice <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12...
## $ Harga_per_Barang <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1....
## $ ID_Pelanggan <int> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 1...
## $ Negara <chr> "United Kingdom", "United Kingdom", "United Kingdo...
Disini saya mengubah jenis variabel data yang saya miliki diantaranya Kuantitas(dbl menjadi integer), dan ID_Pelanggan(dbl menjadi integer)
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:
## # A tibble: 532,621 x 8
## Nomor_Invoice Kode_Stock Deskripsi Kuantitas Tanggal_Invoice
## <chr> <chr> <chr> <int> <dttm>
## 1 536365 85123A WHITE HA~ 6 2010-12-01 08:26:00
## 2 536365 71053 WHITE ME~ 6 2010-12-01 08:26:00
## 3 536365 84406B CREAM CU~ 8 2010-12-01 08:26:00
## 4 536365 84029G KNITTED ~ 6 2010-12-01 08:26:00
## 5 536365 84029E RED WOOL~ 6 2010-12-01 08:26:00
## 6 536365 22752 SET 7 BA~ 2 2010-12-01 08:26:00
## 7 536365 21730 GLASS ST~ 6 2010-12-01 08:26:00
## 8 536366 22633 HAND WAR~ 6 2010-12-01 08:28:00
## 9 536366 22632 HAND WAR~ 6 2010-12-01 08:28:00
## 10 536367 84879 ASSORTED~ 32 2010-12-01 08:34:00
## # ... with 532,611 more rows, and 3 more variables: Harga_per_Barang <dbl>,
## # ID_Pelanggan <int>, Negara <chr>
Pada proses ini, saya menghapus transaksi yang dibatalkan (berawalan huruf C) sehingga data berkurang dari 541,909 menjadi 532,621
## # A tibble: 532,618 x 8
## Nomor_Invoice Kode_Stock Deskripsi Kuantitas Tanggal_Invoice
## <chr> <chr> <chr> <int> <dttm>
## 1 536365 85123A WHITE HA~ 6 2010-12-01 08:26:00
## 2 536365 71053 WHITE ME~ 6 2010-12-01 08:26:00
## 3 536365 84406B CREAM CU~ 8 2010-12-01 08:26:00
## 4 536365 84029G KNITTED ~ 6 2010-12-01 08:26:00
## 5 536365 84029E RED WOOL~ 6 2010-12-01 08:26:00
## 6 536365 22752 SET 7 BA~ 2 2010-12-01 08:26:00
## 7 536365 21730 GLASS ST~ 6 2010-12-01 08:26:00
## 8 536366 22633 HAND WAR~ 6 2010-12-01 08:28:00
## 9 536366 22632 HAND WAR~ 6 2010-12-01 08:28:00
## 10 536367 84879 ASSORTED~ 32 2010-12-01 08:34:00
## # ... with 532,608 more rows, and 3 more variables: Harga_per_Barang <dbl>,
## # ID_Pelanggan <int>, Negara <chr>
Pada proses ini, saya menghapus data nomor invoice (yang tidak terdiri dari 6 digit) sehingga data berkurang dari 532,621 menjadi 532,618
## # A tibble: 531,282 x 8
## Nomor_Invoice Kode_Stock Deskripsi Kuantitas Tanggal_Invoice
## <chr> <chr> <chr> <int> <dttm>
## 1 536365 85123A WHITE HA~ 6 2010-12-01 08:26:00
## 2 536365 71053 WHITE ME~ 6 2010-12-01 08:26:00
## 3 536365 84406B CREAM CU~ 8 2010-12-01 08:26:00
## 4 536365 84029G KNITTED ~ 6 2010-12-01 08:26:00
## 5 536365 84029E RED WOOL~ 6 2010-12-01 08:26:00
## 6 536365 22752 SET 7 BA~ 2 2010-12-01 08:26:00
## 7 536365 21730 GLASS ST~ 6 2010-12-01 08:26:00
## 8 536366 22633 HAND WAR~ 6 2010-12-01 08:28:00
## 9 536366 22632 HAND WAR~ 6 2010-12-01 08:28:00
## 10 536367 84879 ASSORTED~ 32 2010-12-01 08:34:00
## # ... with 531,272 more rows, and 3 more variables: Harga_per_Barang <dbl>,
## # ID_Pelanggan <int>, Negara <chr>
Pada proses ini, saya menghapus data kuantitas (yang memiliki kuantitas minus maupun 0) sehingga data berkurang dari 532,618 menjadi 531,282
## # A tibble: 530,103 x 8
## Nomor_Invoice Kode_Stock Deskripsi Kuantitas Tanggal_Invoice
## <chr> <chr> <chr> <int> <dttm>
## 1 536365 85123A WHITE HA~ 6 2010-12-01 08:26:00
## 2 536365 71053 WHITE ME~ 6 2010-12-01 08:26:00
## 3 536365 84406B CREAM CU~ 8 2010-12-01 08:26:00
## 4 536365 84029G KNITTED ~ 6 2010-12-01 08:26:00
## 5 536365 84029E RED WOOL~ 6 2010-12-01 08:26:00
## 6 536365 22752 SET 7 BA~ 2 2010-12-01 08:26:00
## 7 536365 21730 GLASS ST~ 6 2010-12-01 08:26:00
## 8 536366 22633 HAND WAR~ 6 2010-12-01 08:28:00
## 9 536366 22632 HAND WAR~ 6 2010-12-01 08:28:00
## 10 536367 84879 ASSORTED~ 32 2010-12-01 08:34:00
## # ... with 530,093 more rows, and 3 more variables: Harga_per_Barang <dbl>,
## # ID_Pelanggan <int>, Negara <chr>
Pada proses ini, saya menghapus data kuantitas (yang memiliki Harga minus maupun 0) sehingga data berkurang dari 531,282 menjadi 530,103
DataRds <- DataRds%>%
filter(nchar(Kode_Stock)>=5)
DataRds %>% filter(nchar(Kode_Stock)>6) %>%
select(Kode_Stock,Deskripsi) %>%
distinct() %>%
arrange(Kode_Stock)## # A tibble: 16 x 2
## Kode_Stock Deskripsi
## <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
DataRds <- DataRds%>%
filter(!Kode_Stock %in% c("AMAZONFEE" ,"BANK CHARGES",
"DCGSSBOY" ,"DCGSSGIRL" ,
"gift_0001_10","gift_0001_20",
"gift_0001_30","gift_0001_40",
"gift_0001_50"
)
)
DataRds## # A tibble: 527,734 x 8
## Nomor_Invoice Kode_Stock Deskripsi Kuantitas Tanggal_Invoice
## <chr> <chr> <chr> <int> <dttm>
## 1 536365 85123A WHITE HA~ 6 2010-12-01 08:26:00
## 2 536365 71053 WHITE ME~ 6 2010-12-01 08:26:00
## 3 536365 84406B CREAM CU~ 8 2010-12-01 08:26:00
## 4 536365 84029G KNITTED ~ 6 2010-12-01 08:26:00
## 5 536365 84029E RED WOOL~ 6 2010-12-01 08:26:00
## 6 536365 22752 SET 7 BA~ 2 2010-12-01 08:26:00
## 7 536365 21730 GLASS ST~ 6 2010-12-01 08:26:00
## 8 536366 22633 HAND WAR~ 6 2010-12-01 08:28:00
## 9 536366 22632 HAND WAR~ 6 2010-12-01 08:28:00
## 10 536367 84879 ASSORTED~ 32 2010-12-01 08:34:00
## # ... with 527,724 more rows, and 3 more variables: Harga_per_Barang <dbl>,
## # ID_Pelanggan <int>, Negara <chr>
Pada proses ini, saya menghapus data kode stock (yang memiliki kode stock tidak jelas) sehingga data berkurang dari 530,103 menjadi 527,734
data.frame(
Kode_Stock_Unik = DataRds$Kode_Stock %>%
unique() %>%
length(),
Deskripsi_Unik = DataRds$Deskripsi %>%
unique() %>%
length(),
Kode_Gabung = DataRds %>%
select(Kode_Stock, Deskripsi) %>%
distinct() %>%
nrow()
)## Kode_Stock_Unik Deskripsi_Unik Kode_Gabung
## 1 3905 3999 4141
df_produk <- DataRds %>%
arrange(desc(Tanggal_Invoice)) %>%
select(Kode_Stock,Deskripsi) %>%
distinct()
df_produk %>% group_by(Kode_Stock) %>%
summarise(Jumlah_Deskripsi=n()) %>%
ungroup() %>%
filter(Jumlah_Deskripsi>1)## # A tibble: 217 x 2
## Kode_Stock 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
df_produk <- df_produk %>%
group_by(Kode_Stock) %>%
slice(1)
DataRds <- DataRds %>%
left_join(df_produk , by=c("Kode_Stock")) %>%
mutate(Deskripsi=Deskripsi.y) %>%
select(-Deskripsi.x,-Deskripsi.y)
data_frame(
Kode_Stock_Unik = DataRds$Kode_Stock %>%
unique() %>%
length(),
Deskripsi_Unik = DataRds$Deskripsi %>%
unique() %>%
length(),
Kode_Gabung = DataRds %>%
select(Kode_Stock,Deskripsi) %>%
distinct() %>%
nrow()
)## # A tibble: 1 x 3
## Kode_Stock_Unik Deskripsi_Unik Kode_Gabung
## <int> <int> <int>
## 1 3905 3770 3905
df_deskripsi <- DataRds %>%
arrange(desc(Tanggal_Invoice)) %>%
select(Kode_Stock,Deskripsi) %>%
distinct()
df_deskripsi <- df_deskripsi %>%
group_by(Deskripsi) %>%
slice(1)
DataRds <- DataRds %>% left_join(df_deskripsi , by=c("Deskripsi")) %>%
mutate(Kode_Stock=Kode_Stock.y) %>%
select(-Kode_Stock.x,-Kode_Stock.y)
data_frame(
Kode_Stock_Unik = DataRds$Kode_Stock %>%
unique() %>%
length(),
Deskripsi_Unik = DataRds$Deskripsi %>%
unique() %>%
length(),
Kode_Gabung = DataRds %>%
select(Kode_Stock,Deskripsi) %>%
distinct() %>%
nrow()
)## # A tibble: 1 x 3
## Kode_Stock_Unik Deskripsi_Unik Kode_Gabung
## <int> <int> <int>
## 1 3770 3770 3770
Pada proses ini, saya meungubah data berdasarkan Kode Stock dan Deskripsinya (yang memiliki kode stock dan deskripsi yang tidak sama) sehingga setelah diatur, setiap 1 kode stock memiliki deskripsi yang sama.
data_frame(
ID_Pelanggan_unik = DataRds %>%
select(ID_Pelanggan) %>%
distinct() %>%
nrow(),
Negara_unik = DataRds %>%
select(ID_Pelanggan,Negara) %>%
distinct() %>%
nrow()
)## # A tibble: 1 x 2
## ID_Pelanggan_unik Negara_unik
## <int> <int>
## 1 4335 4351
df_negara <- DataRds %>%
arrange(desc(Tanggal_Invoice,ID_Pelanggan)) %>%
select(ID_Pelanggan, Negara) %>%
group_by(ID_Pelanggan) %>%
slice(1)
DataRds <- DataRds %>%
select(-Negara) %>%
left_join(df_negara, by = c("ID_Pelanggan"))
data_frame(
Pelanggan_unik = DataRds %>%
select(ID_Pelanggan) %>%
distinct() %>%
nrow(),
Pelanggan_Negara = DataRds %>%
select(ID_Pelanggan,Negara) %>%
distinct() %>%
nrow())## # A tibble: 1 x 2
## Pelanggan_unik Pelanggan_Negara
## <int> <int>
## 1 4335 4335
Pada proses ini, saya meungubah data berdasarkan ID Pelanggan dan Negaranya (yang memiliki ID pelanggan di negara di negara yang berbeda) sehingga setelah diatur, setiap 1 ID Pelanggan memiliki Negara yang sama.
## # A tibble: 502,704 x 8
## Nomor_Invoice Kuantitas Tanggal_Invoice Harga_per_Barang ID_Pelanggan
## <chr> <int> <dttm> <dbl> <int>
## 1 536365 6 2010-12-01 08:26:00 2.55 17850
## 2 536365 6 2010-12-01 08:26:00 3.39 17850
## 3 536365 8 2010-12-01 08:26:00 2.75 17850
## 4 536365 6 2010-12-01 08:26:00 3.39 17850
## 5 536365 6 2010-12-01 08:26:00 3.39 17850
## 6 536365 2 2010-12-01 08:26:00 7.65 17850
## 7 536365 6 2010-12-01 08:26:00 4.25 17850
## 8 536366 6 2010-12-01 08:28:00 1.85 17850
## 9 536366 6 2010-12-01 08:28:00 1.85 17850
## 10 536367 32 2010-12-01 08:34:00 1.69 13047
## # ... with 502,694 more rows, and 3 more variables: Deskripsi <chr>,
## # Kode_Stock <chr>, Negara <chr>
Pada proses ini, saya menghapus data berdasarkan Tanggal Invoicenya (yang memiliki Tanggal lebih dari lebih dari tanggal 31 November) sehingga setelah diatur, data berkurang dari 527,734 menjadi 502,704
## Baris_Data Baris_Unik_Data
## 1 502704 497681
## # A tibble: 497,681 x 8
## Nomor_Invoice Kuantitas Tanggal_Invoice Harga_per_Barang ID_Pelanggan
## <chr> <int> <dttm> <dbl> <int>
## 1 536365 6 2010-12-01 08:26:00 2.55 17850
## 2 536365 6 2010-12-01 08:26:00 3.39 17850
## 3 536365 8 2010-12-01 08:26:00 2.75 17850
## 4 536365 6 2010-12-01 08:26:00 3.39 17850
## 5 536365 6 2010-12-01 08:26:00 3.39 17850
## 6 536365 2 2010-12-01 08:26:00 7.65 17850
## 7 536365 6 2010-12-01 08:26:00 4.25 17850
## 8 536366 6 2010-12-01 08:28:00 1.85 17850
## 9 536366 6 2010-12-01 08:28:00 1.85 17850
## 10 536367 32 2010-12-01 08:34:00 1.69 13047
## # ... with 497,671 more rows, and 3 more variables: Deskripsi <chr>,
## # Kode_Stock <chr>, Negara <chr>
Pada proses ini, saya menghapus data berdasarkan seluruh data (yang memiliki data yang sama) sehingga setelah diatur, data berkurang dari 502,704 menjadi 497,681
DataRds <- DataRds %>%
mutate(Total_Harga = Kuantitas*Harga_per_Barang) %>%
select(
Nomor_Invoice,Tanggal_Invoice ,ID_Pelanggan,
Negara ,Kode_Stock ,Deskripsi ,
Kuantitas ,Harga_per_Barang ,Total_Harga
)
DataRds## # A tibble: 497,681 x 9
## Nomor_Invoice Tanggal_Invoice ID_Pelanggan Negara Kode_Stock Deskripsi
## <chr> <dttm> <int> <chr> <chr> <chr>
## 1 536365 2010-12-01 08:26:00 17850 Unite~ 85123A CREAM HA~
## 2 536365 2010-12-01 08:26:00 17850 Unite~ 71053 WHITE MO~
## 3 536365 2010-12-01 08:26:00 17850 Unite~ 84406B CREAM CU~
## 4 536365 2010-12-01 08:26:00 17850 Unite~ 84029G KNITTED ~
## 5 536365 2010-12-01 08:26:00 17850 Unite~ 84029E RED WOOL~
## 6 536365 2010-12-01 08:26:00 17850 Unite~ 22752 SET 7 BA~
## 7 536365 2010-12-01 08:26:00 17850 Unite~ 21730 GLASS ST~
## 8 536366 2010-12-01 08:28:00 17850 Unite~ 22633 HAND WAR~
## 9 536366 2010-12-01 08:28:00 17850 Unite~ 22632 HAND WAR~
## 10 536367 2010-12-01 08:34:00 13047 Unite~ 84879 ASSORTED~
## # ... with 497,671 more rows, and 3 more variables: Kuantitas <int>,
## # Harga_per_Barang <dbl>, Total_Harga <dbl>
Pada proses ini, saya menambahkan variabel baru bernama total (didapat dari kuantitas dikali dengan harga per barang
## Nomor_Invoice Tanggal_Invoice ID_Pelanggan Negara
## 0 0 123540 0
## Kode_Stock Deskripsi Kuantitas Harga_per_Barang
## 0 0 0 0
## Total_Harga
## 0
df_transaksi_pelanggan <- drop_na(DataRds)
df_produk_terpersonal <- DataRds %>% select(ID_Pelanggan,Nomor_Invoice,Kode_Stock,Deskripsi)
DataRds <- na.omit(DataRds)
DataRds## # A tibble: 374,141 x 9
## Nomor_Invoice Tanggal_Invoice ID_Pelanggan Negara Kode_Stock Deskripsi
## <chr> <dttm> <int> <chr> <chr> <chr>
## 1 536365 2010-12-01 08:26:00 17850 Unite~ 85123A CREAM HA~
## 2 536365 2010-12-01 08:26:00 17850 Unite~ 71053 WHITE MO~
## 3 536365 2010-12-01 08:26:00 17850 Unite~ 84406B CREAM CU~
## 4 536365 2010-12-01 08:26:00 17850 Unite~ 84029G KNITTED ~
## 5 536365 2010-12-01 08:26:00 17850 Unite~ 84029E RED WOOL~
## 6 536365 2010-12-01 08:26:00 17850 Unite~ 22752 SET 7 BA~
## 7 536365 2010-12-01 08:26:00 17850 Unite~ 21730 GLASS ST~
## 8 536366 2010-12-01 08:28:00 17850 Unite~ 22633 HAND WAR~
## 9 536366 2010-12-01 08:28:00 17850 Unite~ 22632 HAND WAR~
## 10 536367 2010-12-01 08:34:00 13047 Unite~ 84879 ASSORTED~
## # ... with 374,131 more rows, and 3 more variables: Kuantitas <int>,
## # Harga_per_Barang <dbl>, Total_Harga <dbl>
Pada proses ini, saya menghapus data berdasarkan seluruh data (yang memiliki data yang sama) sehingga setelah diatur, data berkurang dari 497,681 menjadi 374,141
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:
• Gunakan Bar-Chart untuk memperlihatkan berapa banyak pelanggan yang melakukan transaksi setiap bulan?
Customer_per_Bulan <- DataRds %>%
select(Tanggal_Invoice, ID_Pelanggan) %>%
distinct() %>%
mutate(yearmonth = format(Tanggal_Invoice, format = "%y-%b-1"),
yearmonth = ymd(yearmonth)) %>%
group_by(yearmonth) %>%
summarise(total= n()) %>%
ungroup()
Customer_per_Bulan## # A tibble: 12 x 2
## yearmonth total
## <date> <int>
## 1 2010-12-01 1383
## 2 2011-01-01 984
## 3 2011-02-01 993
## 4 2011-03-01 1310
## 5 2011-04-01 1142
## 6 2011-05-01 1539
## 7 2011-06-01 1380
## 8 2011-07-01 1312
## 9 2011-08-01 1263
## 10 2011-09-01 1717
## 11 2011-10-01 1886
## 12 2011-11-01 2629
ggplot(Customer_per_Bulan,
aes(x = yearmonth, y = total)) +
geom_bar(width=24, fill = rainbow(12), color="azure4", stat= "identity" ) +
theme_minimal() +
labs(
x = "Bulan" ,
y = "Customer",
title = "Transaksi Pelanggan Setiap Bulan"
) +
theme(axis.text.x = element_text(angle = -45, hjust = -.2)) +
scale_x_date(breaks = date_breaks('1 month'),
labels = date_format("%b %y"))Pada proses ini, saya menunjukan data menggunakan grafik batang untuk mempermudah pembacaan data(Transaksi per bulan)
• Gunakan interaktif Line-Chart untuk memperlihatkan bagaimana pertumbuhan pelanggan baru setiap bulan?
df_pertumbuhan <- DataRds %>%
group_by(ID_Pelanggan) %>%
summarise(pertama = min(Tanggal_Invoice)) %>%
ungroup() %>%
mutate(yearmonth = format(pertama, format="%Y-%m-1"),
yearmonth = ymd(yearmonth)) %>%
group_by(yearmonth) %>%
summarise(total_new_customer = n()) %>%
ungroup() %>%
mutate(popup=glue(
"Year-Month : {yearmonth}
Total Customer : {total_new_customer}"
)
)
plot_pertumbuhan <- df_pertumbuhan %>%
ggplot(aes(x=yearmonth,total_new_customer))+
geom_line(size=1)+
geom_point(colour="#FF0000", size=2, aes(text=popup))+
labs(
title = "Total Growth of New Customer per Month",
x = "Month-Year",
y = NULL
)+
scale_x_date(breaks=date_breaks('1 months'),
labels=date_format('%b %y'))
ggplotly(plot_pertumbuhan, tooltip="text") %>%
config(displayModeBar = F, scrollzoom = F)Pada proses ini, saya menunjukan data menggunakan grafik garis untuk mempermudah pembacaan data (pertumbuhan pelanggan baru setiap bulan)
• Gunakan Radar-charts untuk menganalisis Waktu pemesanan yang terbaru dalam (bulanan, harian, dan per-jam)
# Bulanan
df_bulanan <- DataRds %>% select(Tanggal_Invoice,Nomor_Invoice) %>%
distinct() %>%
mutate(month = month(Tanggal_Invoice),
day = day(Tanggal_Invoice)) %>%
group_by(month,day) %>%
summarise(total = n()) %>%
ungroup() %>%
group_by(day) %>%
summarise(rata2_bulanan = as.integer(median(total))) %>%
ungroup() %>%
mutate(popup = glue("Date : {day}
Total Transaction: {rata2_bulanan}"))
df_bulanan %>%
ggplot(aes(x=as.factor(day), y=rata2_bulanan)) +
geom_bar(stat="identity", aes(fill=rata2_bulanan),show.legend = FALSE)+
labs(title = "Pemesanan Per Bulan",
x = "Date",
y = NULL)+
theme_minimal()+
scale_fill_gradient(low = "#C7CFB2", high="#000000")+
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"))+
coord_polar() -> bulanan
# Harian
df_harian <- DataRds %>% select(Nomor_Invoice,Tanggal_Invoice) %>%
distinct() %>%
mutate(month = month(Tanggal_Invoice),
wday = wday(Tanggal_Invoice,week_start = getOption("lubridate.week.start", 1))) %>%
group_by(month,wday) %>%
summarise(total = n()) %>%
ungroup() %>%
group_by(wday) %>%
summarise(Rata2_Transaksi_per_Hari = as.integer(median(total))) %>%
ungroup() %>%
mutate(popup = glue("wday : {wday}
Total Transaction: {Rata2_Transaksi_per_Hari}"))
df_harian %>%
ggplot(aes(wday,Rata2_Transaksi_per_Hari))+
geom_bar(width=1, stat="identity", show.legend = FALSE, aes(fill=Rata2_Transaksi_per_Hari))+
labs(
title = "Pemesanan Per Harian",
x = "Day",
y = NULL)+
scale_x_continuous(breaks = c(1,2,3,4,5,6,7),
labels = c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"))+
theme_minimal()+
scale_fill_gradient(low = "#C7CFB2", high="#000000")+
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"))+
coord_polar() -> harian
# Per-jam
df_per_Jam <- DataRds %>% select(Tanggal_Invoice,Nomor_Invoice) %>%
distinct() %>%
mutate(day = day(Tanggal_Invoice),
hour = hour(Tanggal_Invoice)) %>%
group_by(day,hour) %>%
summarise(total = n()) %>%
ungroup() %>%
group_by(hour) %>%
summarise(Rata2_Transaksi_per_Jam = as.integer(median(total))) %>%
ungroup() %>%
mutate(popup = glue("Hour of Day : {hour}
Total Transaction: {Rata2_Transaksi_per_Jam}"))
time_range = data_frame(hour = c(0:23))
data_frame(hour = c(0:23)) %>%
left_join(
df_per_Jam ,by=c("hour")) %>%
mutate(hour = as.factor(hour)) %>%
ggplot(aes(x=hour,y=Rata2_Transaksi_per_Jam))+
geom_bar(stat="identity",show.legend = FALSE, aes(fill=Rata2_Transaksi_per_Jam))+
labs(title = "Pesanan Per Jam",
x = "Hour of Day",
y = NULL)+
theme_minimal()+
scale_fill_gradient(low = "#C7CFB2", high="#000000")+
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"))+
coord_polar() -> perjam
grid.arrange(bulanan,harian,perjam, ncol = 3)Pada proses ini, saya menunjukan data menggunakan grafik radar untuk mempermudah pembacaan data (data pemesanan per bulan, hari, dan jam). Semakin gelap data semakin banyak jumlah datanya
• Gunakan interaktif Bar-Chart untuk memperlihatkan berapa frekuensi transaksi setiap bulan?
Transaksi_per_Bulan <- DataRds %>%
select(Tanggal_Invoice,Nomor_Invoice) %>%
distinct() %>%
mutate (yearmonth = format (Tanggal_Invoice, format = "%y-%m-1"),
yearmonth = ymd(yearmonth)) %>%
group_by (yearmonth) %>%
summarise(Total_Transaksi=n()) %>%
ungroup()
Frekuensi_per_Bulan <- plot_ly(Transaksi_per_Bulan,
x = ~yearmonth,
y = ~Total_Transaksi,
type = 'bar',
market = list(
color = rainbow(12),
line = list (color = "black",
width = 1.5)
)
)
Frekuensi_per_BulanPada proses ini, saya menunjukan data menggunakan grafik batang yang memiliki fitur tambahan untuk mempermudah pembacaan data (data pemesanan frekuensi transaksi per bulan).
• Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 teratas dari produk terpopuler berdasarkan frekuensi transaksinya!
Produk_Populer <- DataRds %>%
group_by(Kode_Stock,Deskripsi) %>%
summarise(Frekuensi = n()) %>%
ungroup() %>%
arrange(desc(Frekuensi)) %>%
head(10) %>%
mutate(Deskripsi = as.factor(Deskripsi),
Deskripsi = reorder(Deskripsi,Frekuensi)) %>%
ggplot(aes(x=Deskripsi, y=Frekuensi)) +
geom_bar(stat="identity", aes(fill=Deskripsi, text=Frekuensi), show.legend = FALSE) +
labs(title = "10 Barang Terpoluper Menurut Frekuensi Transaksi", x = NULL) +
coord_flip()## `summarise()` regrouping output by 'Kode_Stock' (override with `.groups` argument)
## Warning: Ignoring unknown aesthetics: text
ggplotly(Produk_Populer, 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'
Pada proses ini, saya menunjukan data menggunakan grafik batang secara horizontal yang memiliki fitur tambahan untuk mempermudah pembacaan data (data pemesanan frekuensi transaksinya).
• Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer berdasarkan jumlah pesanan!
Produk_Populer_Kuantitas <- DataRds %>%
group_by(Kode_Stock,Deskripsi) %>%
summarise(Total = sum(Kuantitas)) %>%
ungroup() %>%
arrange(desc(Total)) %>%
head(10) %>%
mutate(Deskripsi = as.factor(Deskripsi),
Deskripsi = reorder(Deskripsi,Total)) %>%
ggplot(aes(x=Deskripsi, y=Total)) +
geom_bar(stat="identity", aes(fill=Deskripsi, text=Total), show.legend = FALSE) +
labs(title = "10 Barang Terpoluper Menurut Banyak Pesanan", x = NULL) +
coord_flip()## `summarise()` regrouping output by 'Kode_Stock' (override with `.groups` argument)
## Warning: Ignoring unknown aesthetics: text
ggplotly(Produk_Populer_Kuantitas, 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'
Pada proses ini, saya menunjukan data menggunakan grafik batang secara horizontal yang memiliki fitur tambahan untuk mempermudah pembacaan data (data 10 barang terpopuler berdasarkan jumlah pesanan).
• Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer menurut total pelanggan!
Produk_Populer_Pelanggan <- DataRds %>%
select(ID_Pelanggan, Kode_Stock, Deskripsi) %>%
distinct() %>%
group_by(Kode_Stock,Deskripsi) %>%
summarise(Pelanggan= n()) %>%
ungroup() %>%
arrange(desc(Pelanggan)) %>%
head(10) %>%
mutate(Deskripsi = as.factor(Deskripsi),
Deskripsi = reorder(Deskripsi,Pelanggan)) %>%
ggplot(aes(x=Deskripsi, y=Pelanggan)) +
geom_bar(stat="identity", aes(fill=Deskripsi, text=Pelanggan), show.legend = FALSE) +
labs(title = "10 Barang Terpoluper Menurut Total Customer", x = NULL) +
coord_flip()## `summarise()` regrouping output by 'Kode_Stock' (override with `.groups` argument)
## Warning: Ignoring unknown aesthetics: text
ggplotly(Produk_Populer_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'
Pada proses ini, saya menunjukan data menggunakan grafik batang secara horizontal yang memiliki fitur tambahan untuk mempermudah pembacaan data (data 10 barang terpopuler berdasarkan total pelanggan).
• Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer berdasarkan Nilai Mata uang!
Produk_Populer_Mata_Uang <- DataRds %>%
group_by(Kode_Stock,Deskripsi) %>%
summarise(Total= sum(Total_Harga)) %>%
ungroup() %>%
arrange(desc(Total)) %>%
head(10) %>%
mutate(Deskripsi = as.factor(Deskripsi),
Deskripsi = reorder(Deskripsi,Total)) %>%
ggplot(aes(x=Deskripsi, y=Total)) +
geom_bar(stat="identity", aes(fill=Deskripsi, text=Total), show.legend = FALSE) +
labs(title = "10 Barang Terpoluper Menurut Nilai Mata Uang", x = NULL) +
coord_flip()## `summarise()` regrouping output by 'Kode_Stock' (override with `.groups` argument)
## Warning: Ignoring unknown aesthetics: text
ggplotly(Produk_Populer_Mata_Uang, 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'
Pada proses ini, saya menunjukan data menggunakan grafik batang secara horizontal yang memiliki fitur tambahan untuk mempermudah pembacaan data (data 10 barang terpopuler berdasarkan nilai mata uang).
• Lakukan Analisa dengan menggunakan Time Series apakah penjualan berdasarkan Nilai Mata Uang Meningkat-Menurun?
df_penjualan <- DataRds %>%
group_by(Deskripsi,Total_Harga) %>%
summarise(order = min(Tanggal_Invoice)) %>%
ungroup() %>%
mutate(yearmonth = as.yearmon(order)) %>%
group_by(yearmonth) %>%
summarise(total = sum(Total_Harga)) %>%
ungroup() %>%
mutate(USD = dollar(total),
detail = glue(
"Bulan : {yearmonth}
Penjualan : {USD}"
)
)
plot_penjualan <- ggplot(df_penjualan,
aes(x=yearmonth,
y=total,
group=1))+
geom_line()+
geom_point(colour="#FF0000", size=2, aes(text=detail))+
labs(
title = "Penjualan per Bulan",
x = "Bulan",
y = "USD"
)+
scale_y_continuous(
label = scales::format_format(big.mark =".",
decimal.mark = ",",
scientific = F)
)
ggplotly(plot_penjualan, tooltip="text")Pada proses ini, saya menunjukan data menggunakan grafik garis yang memiliki fitur tambahan untuk mempermudah pembacaan data (data [10 barang terpopuler berdasarkan total pelangganpenjualan dari bulan ke bulan). Pada grafik ini dapat dilihan bahwa terjadi lebih banyak penurunan penjualan. Penurunan paling tinggi terjadi pada bulan Februari 2011 dengan total penjualan sebesar $120,347 dan sempat naik pesat pada bulan September 2011 kemudian turun lagi sampai tanggal data terakhir yaitu bulan November 2011
• Gunakan Tree-Map untuk memvisualisasikan sebagian besar Konsumen menurut Negara?
treemap(DataRds,
index = c("Negara"),
vSize = "Kuantitas",
title = "Tree Map Konsumen per Negara",
border.col = "black")Pada proses ini, saya menunjukan data menggunakan treemap. Dapat dilihat bahwa konsumen sebagian besar berasal dari United Kingdom, kemudian diikuti dari Belanda
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!).
Menurut saya total konsumen pada negara UK dapat dijadikan menjadi sumber utama dari penghasilan bisnis online tersebut sehingga merekrut beberapa dropshipper yang dapat membantu mempercepat penyebaran informasi di daerah-daerah terutana UK karena hampir seluruh konsumen dari bisnis pembelanjaan online ini berasal dari UK yang menunjukan produk itu cocok bagi warga negara tersebut.