Email: putriangelina865@gmail.com
RPubs: https://rpubs.com/putriangelinaw/
library(readxl)
library(dplyr)
library(ggplot2)
library(scales)
library(glue)
library(plotly)
library(lubridate)
library(gridExtra)
library(zoo)
library(treemap)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 |
Anda dapat mengunduh data yang digunakan dalam kasus ini di Google Classroom 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?).
Argumen Anda: Saya lebih memilih memasukkan data menggunakan file format .rds karena data dari soal ini ukurannya cukup besar sehingga jika kita menggunakan file format .xlsx prosesnya akan sangat lambat. Maka dari itu, saya sengaja menaruh # sebelum koding yang Excel.
Ubah nama variabel data tersebut agar lebih mudah dipelajari oleh pembaca.
Data_retail <- Retail %>%
rename("NoPesanan" = InvoiceNo,
"KodeProduk" = StockCode,
"NamaProduk" = Description,
"Kuantitas" = Quantity,
"TanggalPemesanan" = InvoiceDate,
"HargaSatuan" = UnitPrice,
"IdPelanggan" = CustomerID,
"Negara" = Country)Argumen Anda: Saya mengubah nama variabel menggunakan fungsi rename() dari package dplyr karena cukup mudah caranya.
Lakukan pemeriksaan struktur data untuk mengubah jenis kumpulan data (jika ada yang perlu diubah).
## tibble [541,909 x 8] (S3: tbl_df/tbl/data.frame)
## $ NoPesanan : chr [1:541909] "536365" "536365" "536365" "536365" ...
## $ KodeProduk : chr [1:541909] "85123A" "71053" "84406B" "84029G" ...
## $ NamaProduk : chr [1:541909] "WHITE HANGING HEART T-LIGHT HOLDER" "WHITE METAL LANTERN" "CREAM CUPID HEARTS COAT HANGER" "KNITTED UNION FLAG HOT WATER BOTTLE" ...
## $ Kuantitas : num [1:541909] 6 6 8 6 6 2 6 6 6 32 ...
## $ TanggalPemesanan: POSIXct[1:541909], format: "2010-12-01 08:26:00" "2010-12-01 08:26:00" ...
## $ HargaSatuan : num [1:541909] 2.55 3.39 2.75 3.39 3.39 7.65 4.25 1.85 1.85 1.69 ...
## $ IdPelanggan : num [1:541909] 17850 17850 17850 17850 17850 ...
## $ Negara : chr [1:541909] "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
Argumen Anda: Struktur data mungkin akan diperbaiki saat melakukan data cleaning
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
## NoPesanan KodeProduk NamaProduk Kuantitas TanggalPemesanan HargaSatuan
## <chr> <chr> <chr> <dbl> <dttm> <dbl>
## 1 536365 85123A WHITE HAN~ 6 2010-12-01 08:26:00 2.55
## 2 536365 71053 WHITE MET~ 6 2010-12-01 08:26:00 3.39
## 3 536365 84406B CREAM CUP~ 8 2010-12-01 08:26:00 2.75
## 4 536365 84029G KNITTED U~ 6 2010-12-01 08:26:00 3.39
## 5 536365 84029E RED WOOLL~ 6 2010-12-01 08:26:00 3.39
## 6 536365 22752 SET 7 BAB~ 2 2010-12-01 08:26:00 7.65
## 7 536365 21730 GLASS STA~ 6 2010-12-01 08:26:00 4.25
## 8 536366 22633 HAND WARM~ 6 2010-12-01 08:28:00 1.85
## 9 536366 22632 HAND WARM~ 6 2010-12-01 08:28:00 1.85
## 10 536367 84879 ASSORTED ~ 32 2010-12-01 08:34:00 1.69
## # ... with 532,611 more rows, and 2 more variables: IdPelanggan <dbl>,
## # Negara <chr>
Argumen Anda: Disini saya menghapus data yang di cancel, yang mana memiliki huruf C pada NoPesanan atau transaksinya. Saya menggunakan fungsi grepl untuk menghapus pada saat No Pesanan terdapat huruf C. Karena kita telah menghapus data cancel, sisa data observasi menjadi sebanyak 532621 dari 541909.
## Warning: NAs introduced by coercion
Argumen Anda: Menurut saya, variabel data NoPesanan harusnya berstuktur angka, karena sudah tidak ada lagi data yang di cancel. Jadi saya menggunakan function as.integer(). Karena muncul message yang mengatakan NAs introduced by coercion artinya masih ada yang mengandung karakter dan diubah menjadi NA. Jadi secara tidak langsung sudah dibersihkan.
## # A tibble: 531,285 x 8
## NoPesanan KodeProduk NamaProduk Kuantitas TanggalPemesanan HargaSatuan
## <int> <chr> <chr> <dbl> <dttm> <dbl>
## 1 536365 85123A WHITE HAN~ 6 2010-12-01 08:26:00 2.55
## 2 536365 71053 WHITE MET~ 6 2010-12-01 08:26:00 3.39
## 3 536365 84406B CREAM CUP~ 8 2010-12-01 08:26:00 2.75
## 4 536365 84029G KNITTED U~ 6 2010-12-01 08:26:00 3.39
## 5 536365 84029E RED WOOLL~ 6 2010-12-01 08:26:00 3.39
## 6 536365 22752 SET 7 BAB~ 2 2010-12-01 08:26:00 7.65
## 7 536365 21730 GLASS STA~ 6 2010-12-01 08:26:00 4.25
## 8 536366 22633 HAND WARM~ 6 2010-12-01 08:28:00 1.85
## 9 536366 22632 HAND WARM~ 6 2010-12-01 08:28:00 1.85
## 10 536367 84879 ASSORTED ~ 32 2010-12-01 08:34:00 1.69
## # ... with 531,275 more rows, and 2 more variables: IdPelanggan <dbl>,
## # Negara <chr>
Argumen Anda: Karena ada beberapa kuantitas yang minus artinya tidak valid, maka harus dihapus. Caranya dengan melakukan filter() data. Sehingga banyak data berkurang dari 532621 menjadi sebanyak 531285.
## # A tibble: 530,104 x 8
## NoPesanan KodeProduk NamaProduk Kuantitas TanggalPemesanan HargaSatuan
## <int> <chr> <chr> <dbl> <dttm> <dbl>
## 1 536365 85123A WHITE HAN~ 6 2010-12-01 08:26:00 2.55
## 2 536365 71053 WHITE MET~ 6 2010-12-01 08:26:00 3.39
## 3 536365 84406B CREAM CUP~ 8 2010-12-01 08:26:00 2.75
## 4 536365 84029G KNITTED U~ 6 2010-12-01 08:26:00 3.39
## 5 536365 84029E RED WOOLL~ 6 2010-12-01 08:26:00 3.39
## 6 536365 22752 SET 7 BAB~ 2 2010-12-01 08:26:00 7.65
## 7 536365 21730 GLASS STA~ 6 2010-12-01 08:26:00 4.25
## 8 536366 22633 HAND WARM~ 6 2010-12-01 08:28:00 1.85
## 9 536366 22632 HAND WARM~ 6 2010-12-01 08:28:00 1.85
## 10 536367 84879 ASSORTED ~ 32 2010-12-01 08:34:00 1.69
## # ... with 530,094 more rows, and 2 more variables: IdPelanggan <dbl>,
## # Negara <chr>
Argumen Anda: Karena data harga satuan itu pasti lebih dari 0 (tidak ada harga suatu barang yang 0 atau minus) maka kita filter() data nya yang lebih dari 0. Sehingga banyak data berkurang dari 531285 menjadi 530104
Data_retail <- Data_retail %>%
filter(nchar(KodeProduk) >= 5)
Data_retail %>%
filter(nchar(KodeProduk) > 6) %>%
select(KodeProduk, NamaProduk) %>%
distinct()%>%
arrange(KodeProduk)## # A tibble: 16 x 2
## KodeProduk NamaProduk
## <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
Data_retail <- Data_retail %>%
filter(!KodeProduk %in% c("AMAZONFEE","BANK CHARGES")) %>%
filter(!grepl("gift", KodeProduk)) %>%
filter(!grepl("DCGSS", KodeProduk))
Data_retail## # A tibble: 527,734 x 8
## NoPesanan KodeProduk NamaProduk Kuantitas TanggalPemesanan HargaSatuan
## <int> <chr> <chr> <dbl> <dttm> <dbl>
## 1 536365 85123A WHITE HAN~ 6 2010-12-01 08:26:00 2.55
## 2 536365 71053 WHITE MET~ 6 2010-12-01 08:26:00 3.39
## 3 536365 84406B CREAM CUP~ 8 2010-12-01 08:26:00 2.75
## 4 536365 84029G KNITTED U~ 6 2010-12-01 08:26:00 3.39
## 5 536365 84029E RED WOOLL~ 6 2010-12-01 08:26:00 3.39
## 6 536365 22752 SET 7 BAB~ 2 2010-12-01 08:26:00 7.65
## 7 536365 21730 GLASS STA~ 6 2010-12-01 08:26:00 4.25
## 8 536366 22633 HAND WARM~ 6 2010-12-01 08:28:00 1.85
## 9 536366 22632 HAND WARM~ 6 2010-12-01 08:28:00 1.85
## 10 536367 84879 ASSORTED ~ 32 2010-12-01 08:34:00 1.69
## # ... with 527,724 more rows, and 2 more variables: IdPelanggan <dbl>,
## # Negara <chr>
Argumen Anda: Untuk mencari produk yang tidak valid saya melihat dari KodeProduk nya, karena kode produk itu identik dengan minimal 5 digit angka yang unik setiap produk. Disini saya melakukan filter() data dimana KodeProduk dengan minimal 5 digit yang diperbolehkan. Kemudian saya cek langsung yang digit lebih dari 6 (karena yang digit sama dengan 6 itu merupakan variasi lain dari suatu produk yang kodenya identik dengan 5 angka 1 huruf jadi masih diperbolehkan) dan akan muncul 16 KodeProduk. Kita hapus yang memiliki NamaProduk aneh. Sehingga banyaknya data berkurang dari 530104 observasi menjadi 527734 observasi.
#1. Cek keunikan pada data KodeProduk dan NamaProduk
data.frame(
KodeProduk_unik = Data_retail$KodeProduk %>% unique() %>% length(),
NamaProduk_unik = Data_retail$NamaProduk %>% unique() %>% length(),
Kode_Nama_unik = Data_retail %>% select(KodeProduk,NamaProduk) %>% distinct() %>% nrow()
)## KodeProduk_unik NamaProduk_unik Kode_Nama_unik
## 1 3905 3999 4141
#2
data_kode <- Data_retail %>%
arrange(desc(TanggalPemesanan)) %>%
select(KodeProduk,NamaProduk)%>%
distinct()
data_kode <- data_kode %>%
group_by(KodeProduk)%>%
slice(1)
Data_retail <- Data_retail %>%
select(-NamaProduk) %>%
left_join(data_kode, by="KodeProduk")
data.frame(
KodeProduk_unik = Data_retail$KodeProduk %>% unique() %>% length(),
NamaProduk_unik = Data_retail$NamaProduk %>% unique() %>% length(),
Kode_Nama_unik = Data_retail %>% select(KodeProduk,NamaProduk) %>% distinct() %>% nrow()
)## KodeProduk_unik NamaProduk_unik Kode_Nama_unik
## 1 3905 3770 3905
#3
data_produk <- Data_retail %>%
arrange(desc(TanggalPemesanan)) %>%
select(KodeProduk,NamaProduk)%>%
distinct()
data_produk <- data_produk %>%
group_by(NamaProduk)%>%
slice(1)
Data_retail <- Data_retail %>%
select(-KodeProduk) %>%
left_join(data_produk, by="NamaProduk")
data.frame(
KodeProduk_unik = Data_retail$KodeProduk %>% unique() %>% length(),
NamaProduk_unik = Data_retail$NamaProduk %>% unique() %>% length(),
Kode_Nama_unik = Data_retail %>% select(KodeProduk,NamaProduk) %>% distinct() %>% nrow()
)## KodeProduk_unik NamaProduk_unik Kode_Nama_unik
## 1 3770 3770 3770
Argumen Anda: Pertama, kita cek apakah data NamaProduk dengan KodeProduk itu sudah unik? Karena hasilnya itu tidak sama satu sama lain, artinya masih ada yang ganda atau tidak unik. Kemungkinan datanya ganda ada dua yaitu ketika 1 Kode untuk 2 atau lebih Produk, dan ketika 1 Produk ada 2 atau lebih Kode. Maka dari itu, kita harus memperbaiki dari kedua kemungkinan ini. Selanjutnya saya menggunakan kemungkinan pertama untuk menyelesaikan masalahnya. Hasilnya sudah tidak ada lagi 1 KodeProduk untuk 2 atau lebih NamaProduk, jadi sudah disamakan karena menggunakan function left_join(). Begitupula saya lakukan untuk kemungkinan yang kedua. Hasil akhirnya, angka keunikan variabel-variabel ini sudah sama semua. slice() digunakan untuk memilih data yang 1 Kode untuk 1 Produk dan sebaliknya.
data_negara <- Data_retail %>%
arrange(desc(TanggalPemesanan,IdPelanggan)) %>%
select(IdPelanggan,Negara) %>%
group_by(IdPelanggan) %>%
slice(1)
Data_retail <- Data_retail %>%
select(-Negara) %>%
left_join(data_negara, by=c("IdPelanggan"))
data.frame(
pelanggan_unik = Data_retail %>% select(IdPelanggan) %>% distinct() %>% nrow(),
pelanggan_negara_unik = Data_retail %>% select(IdPelanggan,Negara) %>% distinct() %>% nrow()
)## pelanggan_unik pelanggan_negara_unik
## 1 4335 4335
Argumen Anda: Karena ada satu Pelanggan itu pasti berasal dari satu negara, maka cara perbaikannya sama dengan sebelumnya. Dengan begitu, sudah terperbaiki.
Data_retail <- Data_retail %>%
filter(TanggalPemesanan < as.POSIXct("2011-12-01 08:33:00"))%>%
arrange(desc(TanggalPemesanan))
Data_retail## # A tibble: 502,704 x 8
## NoPesanan Kuantitas TanggalPemesanan HargaSatuan IdPelanggan NamaProduk
## <int> <dbl> <dttm> <dbl> <dbl> <chr>
## 1 579885 26 2011-11-30 17:37:00 0.42 15444 SMALL HAN~
## 2 579885 5 2011-11-30 17:37:00 0.65 15444 HANGING H~
## 3 579885 11 2011-11-30 17:37:00 0.290 15444 MUSICAL Z~
## 4 579885 10 2011-11-30 17:37:00 0.85 15444 RETROSPOT~
## 5 579885 6 2011-11-30 17:37:00 1.25 15444 12 RED RO~
## 6 579885 10 2011-11-30 17:37:00 0.85 15444 HEART DEC~
## 7 579885 6 2011-11-30 17:37:00 0.65 15444 HEART DEC~
## 8 579885 6 2011-11-30 17:37:00 0.85 15444 LOVEBIRD ~
## 9 579885 1 2011-11-30 17:37:00 4.95 15444 MEMO BOAR~
## 10 579885 16 2011-11-30 17:37:00 1.69 15444 ASSORTED ~
## # ... with 502,694 more rows, and 2 more variables: KodeProduk <chr>,
## # Negara <chr>
Argumen Anda: Karena Data dibulan Desember 2011 tidak lengkap, kita lakukan pemutusan. Jadi data hanya sampai bulan November 2011. Sehingga banyak data berkurang dari 527734 observasi menjadi 502704 observasi.
Argumen Anda: Menghapus data yang duplikat. Data berkurang menjadi sebanyak 497681 observasi.
Argumen Anda: Menambahkan variabel TotalHarga.
## NoPesanan Kuantitas TanggalPemesanan HargaSatuan
## 0 0 0 0
## IdPelanggan NamaProduk KodeProduk Negara
## 123540 0 0 0
## TotalHarga
## 0
Argumen Anda: Karena sebuah data tidak boleh ada nilai yag hilang atau kosong, maka harus kita hapus nilai NA. Data berkurang dari 497681 observasi menjadi 374141 observasi.
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?
Data_retail <- readRDS("Data_retail.rds")
transaksibulan <- Data_retail %>%
mutate(yearmonth = substr(TanggalPemesanan,1,7))%>%
select(IdPelanggan,yearmonth) %>%
distinct() %>%
group_by(yearmonth)%>%
summarize(n = n())
ggplot(transaksibulan,
aes(x = yearmonth,
y = n))+
geom_bar(fill = "#ffba5b",
color = "black",
stat = "identity") +
geom_text(aes(label = n),
vjust = -0.25) +
theme_get() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "Bulan",
title = "Transaksi Pelanggan Tiap Bulan") +
scale_y_continuous(label = scales::format_format(big.mark = ".",
decimal.mark = ",",
scientific = F))Argumen Anda: Dapat dilihat bahwa pada bulan Januari 2011 itu memiliki jumlah transaksi yang lebih rendah dibanding bulan lainnya yaitu sebanyak 739 transaksi. Dan tertinggi ada pada bulan November 2011 sebanyak 1660 transaksi.
• Gunakan interaktif Line-Chart untuk memperlihatkan bagaimana pertumbuhan pelanggan baru setiap bulan?
Pelangganbaru <- Data_retail %>%
group_by(IdPelanggan) %>%
summarize(urutan = min(TanggalPemesanan))%>%
mutate(yearmonth = substr(urutan,1,7)) %>%
group_by(yearmonth) %>%
summarize(pelangganbaru = n()) %>%
mutate(detail = glue("Total Pelanggan adalah {pelangganbaru}"))
grafik_pelangganbaru <- ggplot(Pelangganbaru,
aes(x = yearmonth,
y = pelangganbaru,
group = 1)) +
geom_line() +
geom_point(size = 3,
aes(text = detail),
shape = 22,
colour = "darkorange",
fill = "#ffba5b") +
theme_get() +
labs(x = "Bulan",
y = "PelangganBaru",
title = "Pertumbuhan Pelanggan Baru Tiap Bulan") +
scale_y_continuous(label = scales::format_format(big.mark = ".",
decimal.mark = ",",
scientific = F))
ggplotly(grafik_pelangganbaru, tooltip = "text")Argumen Anda: Sangat disayangkan, padahal dari grafik Transaksi Tiap Bulan cukup meningkat sedangkan Pertumbuhan Pelanggan cenderung menurun. Hal ini dikarenakan ada pelanggan yang melakukan transaksi berulang kali. Maka perlu diatasi lebih lanjut supaya pendekatannya lebih baik, lebih optimal lagi nilai pelanggan, dan biaya pemasaran lebih efektif.
• Gunakan Radar-charts untuk menganalisis Waktu pemesanan yang terbaru dalam (bulanan, harian, dan per-jam)
#1. Perbulan
belanja_bulanan <- Data_retail %>%
select(TanggalPemesanan,NoPesanan) %>%
dplyr::distinct() %>%
dplyr::mutate(bulan = month(TanggalPemesanan),
tanggal = day(TanggalPemesanan)) %>%
dplyr::group_by(bulan,tanggal) %>%
summarize(n = n()) %>%
dplyr::group_by(tanggal) %>%
summarize(mean_bulanan = as.integer(mean(n)))
radar1 <- belanja_bulanan %>%
ggplot(aes(x = as.factor(tanggal),
y = mean_bulanan)) +
geom_bar(aes(fill = mean_bulanan),
show.legend = FALSE,
stat = "identity") +
labs(x = "Tanggal",
title = "Pemesanan Bulanan") +
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 = "#f29f05", high = "#a82f01")+
coord_polar()
#2. Perhari
belanja_harian <- Data_retail %>%
select(TanggalPemesanan,NoPesanan) %>%
dplyr::distinct() %>%
dplyr::mutate(bulan = month(TanggalPemesanan),
hari = wday(TanggalPemesanan,
week_start = getOption("lubridate.week.start",1))) %>%
group_by(bulan,hari) %>%
summarize(n=n()) %>%
group_by(hari) %>%
summarize(mean_harian = as.integer(mean(n)))
radar2 <- belanja_harian %>%
ggplot(aes(x = hari,
y = mean_harian)) +
geom_bar(aes(fill = mean_harian),
show.legend = FALSE,
stat = "identity",
width = 1) +
labs(x = "Hari",
title = "Pemesanan Harian") +
scale_x_continuous(breaks = c(1:7),
labels = c("Sen","Sel","Rab","Kam","Jum","Sab","Min")) +
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 = "#f29f05", high = "#a82f01")+
coord_polar()
#3. Perjam
belanja_perjam <- Data_retail %>%
select(TanggalPemesanan,NoPesanan) %>%
dplyr::distinct() %>%
dplyr::mutate(bulan = month(TanggalPemesanan),
jam = hour(TanggalPemesanan)) %>%
dplyr::group_by(bulan,jam) %>%
summarize(n = n()) %>%
dplyr::group_by(jam) %>%
summarize(mean_jam = as.integer(mean(n)))
radar3 <- tibble(jam = c(0:23)) %>%
left_join(belanja_perjam, by=c("jam")) %>%
mutate(jam = as.factor(jam)) %>%
ggplot(aes(x = jam,
y = mean_jam))+
geom_bar(aes(fill = mean_jam),
show.legend = FALSE,
stat = "identity")+
labs(x = "Jam Perhari",
title = "Pemesanan Perjam")+
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 = "#f29f05", high = "#a82f01")+
coord_polar()
grid.arrange(radar1,radar2,radar3,ncol=3,nrow=1)Argumen Anda: Pada Radar Chart diberitahukan bahwa semakin gelap suatu grafik maka menandakan semakin banyak transaksi yang terjadi pada saat itu. Dan sebaliknya.
• Gunakan interaktif Bar-Chart untuk memperlihatkan berapa frekuensi transaksi setiap bulan?
freqbulanan <- Data_retail %>%
mutate(yearmonth = substr(TanggalPemesanan,1,7),
bulan = as.yearmon(TanggalPemesanan))%>%
select(NoPesanan,yearmonth,bulan) %>%
distinct() %>%
group_by(bulan,yearmonth)%>%
summarize(n = n()) %>%
mutate(detail = glue("Bulan: {bulan}
Total Transaksi: {n}"))
chart1 <- ggplot(freqbulanan,
aes(x = yearmonth,
y = n))+
geom_bar(aes(fill = yearmonth,
text = detail),
stat = "identity",
show.legend = FALSE,
fill = rainbow(12)) +
theme_get() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "Bulan",
title = "Frekuensi Transaksi Tiap Bulan",
y = NULL) +
scale_y_continuous(label = scales::format_format(big.mark = ".",
decimal.mark = ",",
scientific = F))
ggplotly(chart1,tooltip = "text") %>%
layout(showlegend = FALSE)Argumen Anda: Dari Diagram diatas dapat saya simpulkan bahwa frekuensi terendah berada di bulan Februari yaitu sebanyak 992, dan tertinggi berada di bulan November yaitu sebanyak 2642.
• Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 teratas dari produk terpopuler berdasarkan frekuensi transaksinya!
chart2 <- Data_retail %>%
group_by(KodeProduk,NamaProduk) %>%
summarise(freq = n()) %>%
ungroup()%>%
arrange(desc(freq)) %>%
head(10) %>%
mutate(Produk = as.factor(NamaProduk),
Produk = reorder(Produk,freq)) %>%
ggplot(aes(x = Produk,
y = freq)) +
geom_bar(aes(fill = Produk,
text = freq),
show.legend = F,
stat = "identity") +
labs(title = "Top 10 Produk Populer Berdasarkan Frekuensi",
x = NULL,
y = NULL) +
coord_flip()+
theme_get()+
scale_y_discrete(label = scales::format_format(big.mark = "."))
ggplotly(chart2, tooltip = "text") %>%
layout(showlegend = F)Argumen Anda: Interaktif diatas menampilkan 10 Produk yang memiliki frekuensi transaksi tertinggi.
• Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer berdasarkan jumlah pesanan!
most_quan <- Data_retail %>%
group_by(KodeProduk,NamaProduk) %>%
summarise(quan = sum(Kuantitas)) %>%
ungroup() %>%
arrange(desc(quan)) %>%
head(10) %>%
mutate(Produk = as.factor(NamaProduk),
Produk = reorder(Produk,quan))
chart3 <- plot_ly(most_quan,
x = ~quan,
y = ~Produk,
type = "bar",
marker = list(color = rainbow(10)),
orientation = "h")
chart3 <- chart3 %>%
layout(title = "Top 10 Produk Berdasarkan Kuantitas",
xaxis = list(title ="quantity"),
yaxis = list(title =""))
chart3Argumen Anda: Interaktif diatas menampilkan 10 data Produk tertinggi berdasarkan Total Kuantitasnya.
• Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer menurut total pelanggan!
chart4 <- Data_retail %>%
select(IdPelanggan,KodeProduk,NamaProduk) %>%
distinct %>%
group_by( KodeProduk,NamaProduk) %>%
summarise(cust = n()) %>%
ungroup() %>%
arrange(desc(cust)) %>%
head(10) %>%
mutate(Produk = as.factor(NamaProduk),
Produk = reorder(Produk,cust)) %>%
ggplot(aes(x = Produk,
y = cust)) +
geom_bar(stat = "identity",
show.legend = F,
aes(fill = Produk,
text = cust)) +
labs(title = "Top 10 Produk Berdasarkan Pelanggan",
x = "") +
coord_flip() +
theme_get()
ggplotly(chart4, tooltip = "text") %>%
layout(showlegend = F)Argumen Anda: Data Interaktif diatas menampilkan 10 data Produk tertinggi berdasarkan Total Pelanggannya.
• Gunakan interaktif Bar-Chart yang horizontal untuk memperlihatkan 10 produk paling populer berdasarkan Nilai Mata uang!
most_price <- Data_retail %>%
group_by(KodeProduk,NamaProduk) %>%
summarise(price = sum(TotalHarga)) %>%
ungroup() %>%
arrange(desc(price)) %>%
head(10) %>%
mutate(Produk = as.factor(NamaProduk),
Produk = reorder(Produk,price))
chart5 <-plot_ly(most_price,
x = ~price,
y = ~Produk,
type = "bar",
marker = list(color = rainbow(10)),
orientation = "h")
chart5 <- chart5 %>%
layout(title = "Top 10 Produk Berdasarkan Mata Uang",
xaxis = list(title ="price"),
yaxis = list(title =""))
chart5Argumen Anda: Grafik diatas menunjukkan 10 Produk Teratas Berdasarkan Total Harga.
• Lakukan Analisa dengan menggunakan Time Series apakah penjualan berdasarkan Nilai Mata Uang Meningkat-Menurun?
penjualan <- Data_retail %>%
group_by(NamaProduk,TotalHarga) %>%
summarise(urutan = min(TanggalPemesanan)) %>%
ungroup() %>%
mutate(yearmonth = as.yearmon(urutan)) %>%
group_by(yearmonth) %>%
summarize(total = sum(TotalHarga)) %>%
mutate(dolar = dollar(total),
detail = glue("Bulan: {yearmonth}
Penjualan: {dolar}"))
grafik_pelangganbaru <- ggplot(penjualan,
aes(x = yearmonth,
y = total,
group = 1)) +
geom_line(aes(text = detail),
color = "#ffba5b") +
theme_get() +
labs(x = "Bulan",
y = "PelangganBaru",
title = "Penjualan Retail") +
scale_y_continuous(label = scales::format_format(big.mark = ".",
decimal.mark = ",",
scientific = F))
ggplotly(grafik_pelangganbaru, tooltip = "text")Argumen Anda: Dari Grafik Time Series diatas menandakan bahwa penjualan dari data retail cenderung menurun, tidak ada peningkatan yang signifikan. Hal ini juga bisa dikarenakan oleh Penurunan Pelanggan yang sudah dibahas sebelumnya.
• Gunakan Tree-Map untuk memvisualisasikan sebagian besar Konsumen menurut Negara?
treemap(Data_retail,
index = "Negara",
vSize = "Kuantitas",
title = "Besar Konsumen Tiap Negara",
border.col = "azure4")Argumen Anda: Kesimpulan yang didapat dari data diatas yaitu bahwa pelanggan tersebar diberbagai negara dan paling banyak berada pada United Kingdom.
Berikan pandangan dan pendapat terkait kasus yang sudah anda kerjakan diatas (Apa yang akan anda lakukan sebagai Manager mengenai kasus tersebeut untuk mengembangkan bisnis perbelanjaan online tersebut berdasarkan analisa yang anda temukan!).
Argumen Anda: Menurut saya, approvement dari kasus ini masih tergolong rendah, masih banyak yang harus diperbaiki dan ditingkatkan. Pada grafik pertumbuhan pelanggan baru, datanya memberitahu bahwa hal itu mengalami penurunan, otomatis kemungkinan minat orang dengan produk-produk kita itu cenderung rendah. Kita perlu mempelajari perilaku-perilaku dari pelanggan kita, dengan memahami apa yang pelanggan mau, kita bisa meningkatkan bisnis kita. Lakukan pemasaran dengan lebih baik. Jika dilihat dari persebaran pelanggan berdasarkan negara, pelanggan dari bisnis ini sebagian besar dari United Kingdom, dan perbandingannya sangat jauh dengan negara lain. Yang perlu dilakukan yaitu dengan meningkatkan pemasaran produk, dan menambah inovasi-inovasi baru supaya lebih banyak pelanggan tertarik dengan produk-produk kita. Karena itu, grafik dari Penjualan Retail cenderung menurun.
Kita harus menentukan dahulu dari awal siapa yang akan menjadi sasaran pemasaran kita. Tentukan produk yang sesuai minat sasaran kita. Jika sudah ditentukan dengan baik, baru bisa lanjut ke tahap pemasaran produk. Cobalah dengan membuat diskon atau program semacamnya yang bisa menarik lebih banyak pembeli.