DQLab Internal Data Challenge - Case: Olist Datasets
DQLab Internal Data Challenge - Case: Olist Datasets
Penjelasan
Pada kali ini DQLab akan mengajak para membernya untuk mengerjakan Data Challenge dengan menggunakan dataset penjualan dari Olist, yang merupakan e-commerce terbesar di Brazil. Dataset ini tersedia secara online dan dapat diakses secara mudah di situs www.kaggle.com. Apabila para members ingin mendapatkan dataset dari berbagai bidang dan bentuk, kami sarankan untuk dapat mengunjungi situs tersebut.
Dalam Data Challenge kali ini, peserta akan diberikan 9 dataset penjualan dari tahun 2016 – 2018, yang dapat dieksplorasi semaksimal mungkin untuk menemukan insight sebanyak – banyaknya dari dataset tersebut. Namun untuk mengatasi seluruh challenge dengan baik, maka DQLab members juga perlu menyiapkan tambahan dataset yang dapat diakses secara bebas di internet.
Untuk memudahkan pembahasan, maka kita hanya akan menggunakan data dari tahun 2017 – 2018 saja, dan produk yang akan dianalisa lebih lanjut adalah top 10 Kategori Produk dengan Jumlah Penjualan Terbesar. Namun apabila members DQLab ingin mengeksplorasi data lebih lanjut, maka silahkan saja gunakan dataset secara lengkap.
Agar task/challenge yang diminta dapat diselesaikan dan dijelaskan dengan baik, maka DQLab members dalam Data Challenge kali ini diharapkan dapat menjawab task/challenge yang ada dengan sistematika seperti berikut:
- Data Preparation, merupakan proses membaca file dan memasukkannya ke dalam environment di RStudio, melakukan perubahan tipe data, cleansing, dan berbagai hal lainnya yang dibutuhkan agar data kita siap untuk dieksplorasi, dianalisa, dan divisualisasikan dengan baik.
- Data Exploration, yang ditujukan untuk mengeksplorasi data secara lebih lanjut, agar kita mendapatkan gambaran maupun informasi utuh dari dataset yang kita miliki. Tahapan ini sangat krusial untuk pemahaman data, dan dalam menjawab tugas/memberikan solusi.
- Data Visualization, dengan memvisualkan data kita ke dalam plot/chart, diharapkan kita mampu mendapatkan insight data kita secara lebih baik, seperti misalnya ketika ingin melihat tren/pola, mencari data anomali, data terbsear/terkecil, dan sebagainya.
Dan karena prosesnya cukup banyak, maka kita akan tuangkan dalam bentuk .Rmd file yang di-knit menjadi html file, sehingga runutan prosesnya bisa lebih mudah diikuti.
Data Preparation
Set Up Library
Untuk membantu kita dalam melakukan persiapan dan eksplorasi data, maka kita perlu memanggil beberapa library. Silahkan taruh library yang dibutuhkan di dalam chunk teratas file .Rmarkdown kita.
Adapun Library yang digunakan dalam Data Challenge kali ini adalah:
library(dplyr) # data wrangling
library(tidyr) # data wrangling
library(lubridate) # manipulasi data berbantuk date
library(scales) # adjusting skala axis grafik
library(ggplot2) # membuat grafik
library(ggthemes) # tema additional dalam ggplot untuk mempercantik
library(plotly) # untuk menampilkan grafik secara interaktif
Membuka sejumlah dataset berformat .csv secara sekaligus
folder <- "D:/DQLab/Data Challenge/Internal DQLab/brazilian-ecommerce/" # path menuju folder yang memiliki banyak file .csv
file_list <- list.files(path=folder, pattern="*.csv") # membuat list semua .csv files dalam folder
# read setiap .csv file di dalam file_list dan membuat data frame dengan nama yang sama seperti .csv file
for (i in 1:length(file_list)){
assign(file_list[i],
read.csv(paste(folder, file_list[i], sep=''))
)}Rename data frame dengan nama yang lebih singkat
cust <- olist_customers_dataset.csv
geol <- olist_geolocation_dataset.csv
ordr <- olist_orders_dataset.csv
prod <- olist_products_dataset.csv
sell <- olist_sellers_dataset.csv
orditm <- olist_order_items_dataset.csv
ordpay <- olist_order_payments_dataset.csv
ordrev <- olist_order_reviews_dataset.csv
trans <- product_category_name_translation.csvLihat Structure dari masing - masing dataset
## 'data.frame': 99441 obs. of 5 variables:
## $ customer_id : Factor w/ 99441 levels "00012a2ce6f8dcda20d059ce98491703",..: 2611 9562 30461 69606 30708 52562 98443 36424 35167 29245 ...
## $ customer_unique_id : Factor w/ 96096 levels "0000366f3b9a7992bf8c76cfdf3221e2",..: 50397 15434 2273 14193 19734 28806 65370 33034 6612 58226 ...
## $ customer_zip_code_prefix: int 14409 9790 1151 8775 13056 89254 4534 35182 81560 30575 ...
## $ customer_city : Factor w/ 4119 levels "abadia dos dourados",..: 1383 3429 3598 2344 708 1937 3598 3866 1144 454 ...
## $ customer_state : Factor w/ 27 levels "AC","AL","AM",..: 26 26 26 26 26 24 26 11 18 11 ...
## 'data.frame': 1000163 obs. of 5 variables:
## $ geolocation_zip_code_prefix: int 1037 1046 1046 1041 1035 1012 1047 1013 1029 1011 ...
## $ geolocation_lat : num -23.5 -23.5 -23.5 -23.5 -23.5 ...
## $ geolocation_lng : num -46.6 -46.6 -46.6 -46.6 -46.6 ...
## $ geolocation_city : Factor w/ 8011 levels "* cidade","...arraial do cabo",..: 7029 7029 7029 7029 7029 6249 7029 7029 7029 7029 ...
## $ geolocation_state : Factor w/ 27 levels "AC","AL","AM",..: 26 26 26 26 26 26 26 26 26 26 ...
## 'data.frame': 99441 obs. of 8 variables:
## $ order_id : Factor w/ 99441 levels "00010242fe8c5a6d1ba2dd792cb16214",..: 88951 32546 27770 57386 67044 63543 7553 39236 46083 89697 ...
## $ customer_id : Factor w/ 99441 levels "00012a2ce6f8dcda20d059ce98491703",..: 61761 68730 25514 96584 53774 31118 92191 60518 95387 19282 ...
## $ order_status : Factor w/ 8 levels "approved","canceled",..: 4 4 4 4 4 4 5 4 4 4 ...
## $ order_purchase_timestamp : Factor w/ 98875 levels "2016-09-04 21:15:19",..: 27602 90668 94566 35023 55222 15891 6386 9743 667 18535 ...
## $ order_approved_at : Factor w/ 90734 levels "","2016-09-15 12:16:38",..: 26910 83755 86887 33880 52143 15447 6368 9419 707 18033 ...
## $ order_delivered_carrier_date : Factor w/ 81019 levels "","2016-10-08 10:34:01",..: 24736 76469 78219 31487 49664 13978 1 9013 594 17711 ...
## $ order_delivered_customer_date: Factor w/ 95665 levels "","2016-10-11 13:46:32",..: 25876 88743 91784 33916 50233 15592 1 9155 597 18403 ...
## $ order_estimated_delivery_date: Factor w/ 459 levels "2016-09-30 00:00:00",..: 213 412 428 252 299 159 100 121 56 175 ...
## 'data.frame': 32951 obs. of 9 variables:
## $ product_id : Factor w/ 32951 levels "00066f42aeeb9f3007548bb9d3f33c38",..: 4054 7646 19352 26673 20306 8572 14931 4942 7250 18075 ...
## $ product_category_name : Factor w/ 74 levels "","agro_industria_e_comercio",..: 64 5 34 11 74 47 28 56 30 14 ...
## $ product_name_lenght : int 40 44 46 27 37 60 56 56 57 36 ...
## $ product_description_lenght: int 287 276 250 261 402 745 1272 184 163 1156 ...
## $ product_photos_qty : int 1 1 1 1 4 1 4 2 1 1 ...
## $ product_weight_g : int 225 1000 154 371 625 200 18350 900 400 600 ...
## $ product_length_cm : int 16 30 18 26 20 38 70 40 27 17 ...
## $ product_height_cm : int 10 18 9 4 17 5 24 8 13 10 ...
## $ product_width_cm : int 14 20 15 26 13 11 44 40 17 12 ...
## 'data.frame': 3095 obs. of 4 variables:
## $ seller_id : Factor w/ 3095 levels "0015a82c2db000af6aaaf3ae2ecb0532",..: 623 2541 2506 2326 982 2343 2749 322 1458 2490 ...
## $ seller_zip_code_prefix: int 13023 13844 20031 4195 12914 20920 55325 16304 1529 80310 ...
## $ seller_city : Factor w/ 611 levels "04482255","abadia de goias",..: 102 343 451 519 81 451 84 403 519 160 ...
## $ seller_state : Factor w/ 23 levels "AC","AM","BA",..: 23 23 17 23 23 17 14 23 23 16 ...
## 'data.frame': 112650 obs. of 7 variables:
## $ order_id : Factor w/ 98666 levels "00010242fe8c5a6d1ba2dd792cb16214",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ order_item_id : int 1 1 1 1 1 1 1 1 1 1 ...
## $ product_id : Factor w/ 32951 levels "00066f42aeeb9f3007548bb9d3f33c38",..: 8629 29598 25668 15323 22080 30848 18182 11123 6385 9013 ...
## $ seller_id : Factor w/ 3095 levels "0015a82c2db000af6aaaf3ae2ecb0532",..: 855 2679 1118 1920 2698 1224 1372 1091 1997 2231 ...
## $ shipping_limit_date: Factor w/ 93318 levels "2016-09-19 00:15:34",..: 24067 7194 45696 89769 1641 9384 39631 81823 60182 81339 ...
## $ price : num 58.9 239.9 199 13 199.9 ...
## $ freight_value : num 13.3 19.9 17.9 12.8 18.1 ...
## 'data.frame': 103886 obs. of 5 variables:
## $ order_id : Factor w/ 99440 levels "00010242fe8c5a6d1ba2dd792cb16214",..: 71446 65633 14657 72396 25967 16046 46192 23843 12217 2146 ...
## $ payment_sequential : int 1 1 1 1 1 1 1 1 1 1 ...
## $ payment_type : Factor w/ 5 levels "boleto","credit_card",..: 2 2 2 2 2 2 2 2 2 1 ...
## $ payment_installments: int 8 1 1 8 2 2 1 3 6 1 ...
## $ payment_value : num 99.3 24.4 65.7 107.8 128.4 ...
## 'data.frame': 100000 obs. of 7 variables:
## $ review_id : Factor w/ 99173 levels "0001239bc1de2e33cb583967c2ca4c67",..: 48013 50030 13322 89282 95962 8159 3060 48292 63672 52194 ...
## $ order_id : Factor w/ 99441 levels "00010242fe8c5a6d1ba2dd792cb16214",..: 45052 63915 97051 39397 55031 68818 88966 75802 60275 72099 ...
## $ review_score : int 4 5 5 5 5 1 5 5 5 4 ...
## $ review_comment_title : Factor w/ 4601 levels "","-","- Luminária de Mesa pelic",..: 1 1 1 1 1 1 1 1 1 3805 ...
## $ review_comment_message : Factor w/ 36923 levels "","'entrega feita dentro do prazo",..: 1 1 1 31778 25773 1 1 1 1 4357 ...
## $ review_creation_date : Factor w/ 637 levels "2016-10-02 00:00:00",..: 413 463 442 147 454 497 230 620 170 536 ...
## $ review_answer_timestamp: Factor w/ 99010 levels "2016-10-07 18:32:28",..: 45452 56963 51957 5910 54897 66179 15081 93211 7935 75810 ...
## 'data.frame': 71 obs. of 2 variables:
## $ ï..product_category_name : Factor w/ 71 levels "agro_industria_e_comercio",..: 12 45 9 14 55 33 62 71 69 65 ...
## $ product_category_name_english: Factor w/ 71 levels "agro_industry_and_commerce",..: 44 16 6 8 40 66 60 50 69 71 ...
Note: Jika ingin melihat ringkasan data, bisa gunakan fungsi summary(). Jika ingin lihat gambaran sepotong data tanpa menampilkan semua, gunakan fungsi head() dan tail(). Semakin banyak Anda mengeksplorasi data Anda, semakin baik Anda memahaminya.
Ada baiknya juga jika Anda memahami maksud dari setiap variabel yang ada. Untuk mengetahui definisi/arti dari setiap variabel/kolom yang ada, kami sarankan Anda mengunjungi: https://www.kaggle.com/olistbr/brazilian-ecommerce
Ubah Jenis data yang masih tidak sesuai
Dalam upaya untuk melakukan pengubahan, kita akan banyak menggunakan bantuan fungsi - fungsi dari package dplyr, tidyr dan lubridate. Jangan ragu untuk membuka fitur help() jika Anda ingin memahami lebih banyak fungsi - fungsi dalam package tersebut.
Untuk mempersingkat, dalam penjelasan kali ini kita hanya mengganti jenis data yang tidak sesuai pada variabel yang akan kita gunakan selanjutnya. Namun kami mendorong Anda untuk berlatih menemukan ketidaksesuaian data dan melakukan pengubahan dengan tepat.
Contoh: Mengubah Ketidakesuaian Jenis Data pada cust
cust <- cust %>%
mutate(customer_id = as.character(customer_id),
customer_unique_id = as.character(customer_unique_id))
str(cust)## 'data.frame': 99441 obs. of 5 variables:
## $ customer_id : chr "06b8999e2fba1a1fbc88172c00ba8bc7" "18955e83d337fd6b2def6b18a428ac77" "4e7b3e00288586ebd08712fdd0374a03" "b2b6027bc5c5109e529d4dc6358b12c3" ...
## $ customer_unique_id : chr "861eff4711a542e4b93843c6dd7febb0" "290c77bc529b7ac935b93aa66c333dc3" "060e732b5b29e8181a18229c7b0b2b5e" "259dac757896d24d7702b9acbbff3f3c" ...
## $ customer_zip_code_prefix: int 14409 9790 1151 8775 13056 89254 4534 35182 81560 30575 ...
## $ customer_city : Factor w/ 4119 levels "abadia dos dourados",..: 1383 3429 3598 2344 708 1937 3598 3866 1144 454 ...
## $ customer_state : Factor w/ 27 levels "AC","AL","AM",..: 26 26 26 26 26 24 26 11 18 11 ...
Note: Jangan lupa untuk jalankan fungsi str() untuk memeriksa apakah perubahan yang kita lakukan sudah sesuai.
Contoh: Mengubah Ketidakesuaian Jenis Data pada ordr
ordr <- ordr %>%
mutate(order_id = as.character(order_id),
customer_id = as.character(customer_id),
order_purchase_timestamp = ymd_hms(order_purchase_timestamp, tz="America/Sao_Paulo"),
order_approved_at = ymd_hms(order_approved_at, tz="America/Sao_Paulo"),
order_delivered_carrier_date = ymd_hms(order_delivered_carrier_date, tz="America/Sao_Paulo"),
order_delivered_customer_date = ymd_hms(order_delivered_customer_date, tz="America/Sao_Paulo"),
order_estimated_delivery_date = ymd_hms(order_estimated_delivery_date, tz="America/Sao_Paulo"))
str(ordr)## 'data.frame': 99441 obs. of 8 variables:
## $ order_id : chr "e481f51cbdc54678b7cc49136f2d6af7" "53cdb2fc8bc7dce0b6741e2150273451" "47770eb9100c2d0c44946d9cf07ec65d" "949d5b44dbf5de918fe9c16f97b45f8a" ...
## $ customer_id : chr "9ef432eb6251297304e76186b10a928d" "b0830fb4747a6c6d20dea0b8c802d7ef" "41ce2a54c0b03bf3443c3d931a367089" "f88197465ea7920adcdbec7375364d82" ...
## $ order_status : Factor w/ 8 levels "approved","canceled",..: 4 4 4 4 4 4 5 4 4 4 ...
## $ order_purchase_timestamp : POSIXct, format: "2017-10-02 10:56:33" "2018-07-24 20:41:37" ...
## $ order_approved_at : POSIXct, format: "2017-10-02 11:07:15" "2018-07-26 03:24:27" ...
## $ order_delivered_carrier_date : POSIXct, format: "2017-10-04 19:55:00" "2018-07-26 14:31:00" ...
## $ order_delivered_customer_date: POSIXct, format: "2017-10-10 21:25:13" "2018-08-07 15:27:45" ...
## $ order_estimated_delivery_date: POSIXct, format: "2017-10-18" "2018-08-13" ...
Mengubah Sisa Dataset yang Diperlukan
prod <- prod %>%
mutate(product_id = as.character(product_id))
sell <- sell %>%
mutate(seller_id = as.character(seller_id))
orditm <- orditm %>%
mutate(order_id = as.character(order_id),
product_id = as.character(product_id),
seller_id = as.character(seller_id),
shipping_limit_date = ymd_hms(shipping_limit_date, tz="America/Sao_Paulo"))
ordpay <- ordpay %>%
mutate(order_id = as.character(order_id))
ordrev <- ordrev %>%
mutate(review_id = as.character(review_id),
order_id = as.character(order_id),
review_creation_date = ymd_hms(review_creation_date, tz="America/Sao_Paulo"),
review_answer_timestamp = ymd_hms(review_answer_timestamp, tz="America/Sao_Paulo"))
#Membetulkan nama kolom yang terbaca error
colnames(trans)[1] <- "product_category_name" Task 1
Temukan Top 10 Kategori Produk dengan Jumlah Penjualan Terbesar, dengan Kategori Produknya yang berbahasa Inggris. (1 poin)
# Gabungkan antara dataset prod dan orditm, lalu terjemahkan product category ke dalam Bahasa Inggris dengan menggabungkannya dengan dataset 'trans'
orditm2 <- orditm %>%
merge(prod, by = "product_id") %>%
select(-product_name_lenght, -product_description_lenght, -product_photos_qty, -product_weight_g,
-product_length_cm, -product_height_cm, -product_width_cm ) %>%
merge(trans, by = "product_category_name") %>%
select(-product_category_name)
# Cari Top 10 Kategori Produk dengan Jumlah Penjualan Terbesar
orditm2 %>%
group_by(product_category_name_english) %>%
summarise(Count = n()) %>%
arrange(-Count)Siapkan Dataset
Filter Top 10 Produk dengan jumlah Penjualan Terbesar di Tahun 2017 - 2018
orditm2 <- orditm2 %>%
filter(product_category_name_english %in% c("bed_bath_table", "health_beauty", "sports_leisure", "furniture_decor", "computers_accessories",
"housewares", "watches_gifts", "telephony", "garden_tools", "auto")) %>%
droplevels()
# Checking levels
levels(orditm2$product_category_name_english)## [1] "auto" "bed_bath_table"
## [3] "computers_accessories" "furniture_decor"
## [5] "garden_tools" "health_beauty"
## [7] "housewares" "sports_leisure"
## [9] "telephony" "watches_gifts"
Filter Tahun 2017 - 2018 saja
Sebelumnya, Kita perlu menggabungkan beberapa dataset terlebih dulu, untuk mendapatkan informasi tanggal pembelian.
Lalu, kita perlu melakukan konversi format pada order_puchase_timestamp dari tipe POSIXCT menjadi Date. karena kita hanya membutuhkan informasi tanggal untuk menampilkan jumlah penjualan sepanjang tahun. Agar tidak mengubah struktur data, ada baiknya kita tambahkan variabel/kolom baru dengan nama Date_order_purchase_timestamp untuk menampung hasil konversi. Setelah itu, kita filter tahunnya hanya untuk yang mencakup 2017 dan 2018 saja.
# Merge dengan ordr and cust
orditm2 <- orditm2 %>%
merge(ordr, by = "order_id") %>%
merge(cust, by = "customer_id") %>%
droplevels()
# Merge dengan sell
orditm2 <- orditm2 %>%
merge(sell, by = "seller_id") %>%
droplevels()
# Merge dengan ordpay
orditm2 <- orditm2 %>%
merge(ordpay, by = "order_id") %>%
droplevels()
# Cek Berapa banyak Row yang Memiliki nilai 'NA'
orditm2[!complete.cases(orditm2),]# karena jumlah Row yang 'NA' Tidak Signifikan (2%), untuk memudahkan kita akan hilangkan semuanya.
orditm2 <- orditm2 %>% drop_na()
#Filter Tahun 2017 - 2018
orditm2 <- orditm2 %>%
mutate(Year_Order_Purchase = as.numeric(year(order_purchase_timestamp))) %>%
filter(Year_Order_Purchase > 2016) %>%
mutate(Date_order_purchase_timestamp = as.Date(as.POSIXct(order_purchase_timestamp,tz = "America/Sao_Paulo")))
orditm2Visualisasi
Visualkan Top 10 Penjualan Terbanyak tersebut dengan menggunakan ggplot2 dan plotly.
orditm21 <- orditm2 %>% group_by(product_category_name_english) %>%
summarise(Jumlah = n())
plot <- ggplot(orditm21, aes(x = reorder(product_category_name_english, Jumlah),
y = Jumlah,
fill=product_category_name_english,
text = paste("Jumlah:", label = comma(Jumlah),
"<br>",
"Kategori: ", product_category_name_english))) +
geom_col() +
theme(legend.position = "none") +
coord_flip() +
labs(title = paste("Top 10 Kategori Produk dengan Penjualan Terbanyak \nTahun 2017 - 2018"),
x = NULL,
y = NULL)
ggplotly(plot, tooltip = "text")Task 2
Siapkan Dataset yang diperlukan
Buat dataset untuk memvisualkan jumlah penjualan produk sepanjang 2017 - 2018.
Visualisasi
Visualkan dataset tersebut dengan menggunakan ggplot2 dan plotly.
plot1 <- ggplot(olist_a, aes(x=Date_order_purchase_timestamp,
y=count,
text = paste("Sales Numbers:", count,
'<br>Date:', Date_order_purchase_timestamp),
group = 1)) +
geom_line(col = "limegreen") +
scale_y_continuous("Sales Numbers",
breaks = seq(0, 900, 50)) +
labs(title = "Jumlah Penjualan Top 10 Product Sepanjang 2017 - 2018",
x = NULL) +
scale_x_date(breaks = "60 day") +
theme_igray() +
theme(plot.background = element_rect(fill="lightcyan1"),
text = element_text(color="dodgerblue"),
axis.text = element_text(color="grey19", size = 6))
ggplotly(plot1, tooltip = "text")Task 3
Jumlah Penjualan terbesar terjadi di tanggal berapa? Berapa jumlah produk terjual dan nilainya (satuan mata uang Real) pada tanggal tersebut? (1 poin)
Untuk menjawab Pertanyaan di Task 3, kita tinggal melihat grafik, dan dengan mudah kita bisa menemukan pada tanggal berapa terjadinya jumlah penjualan terbanyak. Sekarang mari kita lihat berapa Nilai Penjualan di tanggal tersebut. Jika hanya untuk menjawab nilainya, maka kita cukup subset saja datanya. Namun karena saat ini konteksnya belajar, maka mari kita plotkan pula dalam visualisasi.
Subset Nilai Penjualan pada saat Jumlah Penjualannya Terbanyak
Visualisasi Nilai Penjualan Sepanjang 2017 - 2018
plot2 <- ggplot(olist_a, aes(x=Date_order_purchase_timestamp,
y=sum,
text = paste("Sales Value:", sum, " Real",
'<br>Date:', Date_order_purchase_timestamp),
group = 1)) +
geom_line(col = "royalblue") +
scale_y_continuous("Sales Value (Real)",
breaks = seq(0, 150000, 5000)) +
labs(title = "Nilai Penjualan Top 10 Product Sepanjang 2017 - 2018 (Real)",
x = NULL) +
scale_x_date(breaks = "60 day") +
theme_igray() +
theme(plot.background = element_rect(fill="lightcyan1"),
text = element_text(color="dodgerblue"),
axis.text = element_text(color="grey19", size = 6))
ggplotly(plot2, tooltip = "text")Task 4
Berikan nama lengkap semua state seller dan customer, State mana yang memiliki seller dan customer paling banyak? (1 poin)
Web Scraping dengan Google Sheets
Untuk dapat memberikan nama lengkap semua State Seller dan Customer, maka kita membutuhkan tambahan data yang belum ada di dataset. Data ini bisa kita ambli di: https://en.wikipedia.org/wiki/States_of_Brazil
Namun jika kita langsung coba copy-paste tabelnya, bisa jadi kurang rapi tampilannya. Hal ini juga tidak akan efisien jika kita butuh mengambil informasi dalam jumlah yang lebih banyak. Maka dari itu, kita bisa gunakan fitur web-scraping secara sederhana melalui googlesheet. Cara melakukannya:
1. Login ke dalam googlesheets, dan buka spreadsheet baru.
2. Copy alamat laman https://en.wikipedia.org/wiki/States_of_Brazil dan pasti di cell ‘A1’.
3. Gunakan fungsi IMPORTHTML() sebagai berikut: =IMPORTHTML(A1,"table",6) Dimana A1 adalah target laman yang kita ingin ambil, “table” adalah jenis data yang ingin kita ambil, dan “6” adalah urutan tabel yang mau kita ambil di laman tersebut. Anda bisa hitung urutan tabel dari atas, namun tidak maslah jika Anda ingin memasukkan angkanya secara coba-coba, karena cukup sulit menentukan urtannya secara pas.
Buat Dataset yang diperlukan
Setelah melakukan scraping, buatlah 2 .csv file yang masing - masimg memiliki nama kolom customer_state dan seller_state, sehingga dapat kita merge dengan dataset orditm. Kemudian read-lah kedua .csv file tersebut.
cust.state <- read.csv("customer.state.csv")
sell.state <- read.csv("seller.state.csv")
orditm3 <- orditm2Gabungkan dataset orditm dengan cust.state dan sell.state untuk mendapatkan nama state yang lengkap (panjang).
orditm3 <- merge(orditm3, cust.state, by = "customer_state")
orditm3 <- merge(orditm3, sell.state, by = "seller_state")
orditm3 <- orditm3 %>% select(-seller_state, -customer_state)
orditm3Mencari State dengan Jumlah Customer terbanyak
Mencari State dengan Jumlah Seller Terbanyak
Gabungkan jml.cust dan jml.sell Untuk melihat State dengan Customer dan Seller Terbanyak.
jml.gab <- merge(jml.cust, jml.sell, by = "long_state")
jml.gab <- jml.gab %>% mutate(Jumlah_Total = Jumlah_Customer + Jumlah_Seller) %>%
arrange(desc(Jumlah_Total))
jml.gabJawabannya adalah São Paulo
Visualisasi
Bagaimana jika kita ingin memvisualkan informasi di atas? Maka ada tahapan yang perlu dilakukan.
Buat Long Dataset dengan menggunakan fungsi gather dari tidyr.
Visualisasi dengan ggplot dan plotly.
plot3 <- ggplot(gather.gab, aes(x=reorder(long_state, Jumlah),
y=Jumlah,
text = paste("Numbers:", label = comma(Jumlah),
"<br>",
"State: ", long_state))) +
geom_col(aes(fill=Kategori),
position = "dodge") +
coord_flip() +
theme(legend.position = "bottom",
title = element_text( hjust = 0.5)) +
scale_fill_manual(values = c("firebrick", "limegreen", "royalblue")) +
labs(title = "Jumlah Customer dan Seller pada Tiap State",
x = NULL,
y = NULL)
ggplotly(plot3, tooltip = "text")Seller dan Customer tidak selalu selaras. Ada daerah yang jumlah Seller-nya rendah, namun Customer-nya tinggi, dan sebaliknya.
Task 5
Berapa Total Nilai Penjualan, Jumlah Penjualan dan Jumlah Pembeli? (1 poin)
Gunakan dplyr untuk grouping dan hitung jumlah (count) maupun nilai (sum value) penjualan, serta jumlah (count) customer.
Total Nilai Penjualan
orditm2 %>% group_by(order_id) %>%
summarise(Nilai_Penjualan = sum(payment_value)) %>%
pull(Nilai_Penjualan) %>%
sum()## [1] 12146382
Total Jumlah Penjualan
orditm2 %>% group_by(order_id) %>%
summarise(Total_Penjualan = n()) %>%
pull(Total_Penjualan) %>%
sum()## [1] 72979
Task 6
Payment value terbesar dengan menggunakan metode apa? Berapa nilainya? (1 poin)
Siapkan Dataset
Sekali lagi, kita akan gunakan dplyr untuk tugas ini.
orditm4 <- orditm2 %>% group_by(payment_type) %>%
summarise(Nilai_Payment = sum(payment_value)) %>%
arrange(desc(Nilai_Payment))
orditm4Jawabannya adalah credit_card.
Visualisasi
plot4 <- ggplot(orditm4, aes(x=reorder(payment_type, -Nilai_Payment),
y=Nilai_Payment,
text = paste("Nilai Pembayaran:", label = comma(Nilai_Payment), " Real",
"<br>",
"Tipe Pembayaran: ", payment_type))) +
geom_col(aes(fill = payment_type)) +
theme(legend.position = "none") +
labs(title = "Nilai Pembayaran Berdasarkan Tipe Pembayaran",
x = NULL,
y = NULL)
ggplotly(plot4, tooltip = "text")Task 7
Berapa jumlah penjualan pada saat musim hujan di Brazil? (1 poin)
Untuk menjawab pertanyaan ini pun kita butuh informasi tambahan dari internet: https://www.climatestotravel.com/climate/brazil
Berdasarkan info dari laman tersebut, kita bisa mengetahui bahwa rainy season di Brazil adalah pada Oktober - Maret.
Siapkan Dataset
Mula-mula kita perlu siapkan dataset yang dapat menunjukkan Bulan pada tiap tanggal Pembelian.
orditm5 <- orditm2 %>% mutate(Month_Order_Purchase = as.factor(strftime(order_purchase_timestamp, format="%b")),
Month_Order_Purchase = factor(Month_Order_Purchase, levels=c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")))
orditm5Selanjutnya, kita perlu membuat fungsi untuk membedakan Season, dimana Season di Brazil hanya ada 2, yakni Wet dan Dry saja.
season <- function(m){
if(m == "Oct" | m == "Nov" | m == "Dec" |
m == "Jan" | m == "Feb" | m == "Mar") {
m <- "WET SEASON"
}else{
m <- "DRY SEASON"
}
}Aplikasikan fungsi season di atas pada Bulan Pembelian, dan buat kolom baru bernama season.
Hitung Jumlah Penjualan pada tiap Musim dengan dplyr.
Ternyata, jumlah penjualan pada saat musim penghujan di Brazil tahun 2017 - 2018 adalah: 32,372.
Visualisasi
ggplot(orditm5, aes(x = Month_Order_Purchase, fill = season)) +
geom_bar() +
theme_igray() +
labs(x = NULL, y = NULL,
title = "Jumlah Penjualan Olist Berdasarkan Musim",
subtitle = "Tahun 2017 - 2018",
fill = "Season") +
geom_text(aes(label=comma(..count..)),stat="count", position=position_dodge(0.9), vjust=-0.5, size = 3) +
scale_y_continuous(labels=comma) +
scale_fill_manual(values = c("darkorange", "royalblue")) +
theme(legend.position = "bottom",
legend.title = element_text(size = 8),
legend.text = element_text(size = 8))Task 8
Berdasarkan Jam Pembelian, bagilah ke dalam 4 kategori, 12AM-6AM, 6AM-12PM, 12PM-6PM, dan 6PM – 12AM. Manakah range waktu yang paling banyak terjadi pembelian? (1 poin)
Siapkan Dataset
Mula-mula kita perlu siapkan fungsi yang dapat membagi Jam pada tiap tanggal Pembelian sesuai dengan ketentuan yang diminta.
event <- function(x){
if(x < 6){
x <- "12AM to 6AM"
}else if(x >= 6 & x < 12){
x <- "6AM to 12PM"
}else if(x >= 12 & x < 18){
x <- "12PM to 6PM"
}else{
x <- "6PM to 12AM"
}
}Selanjutnya, siapkan datasetnya. Kali ini, kita coba pendekatan yang berbeda dibanding Task 7, dimana pengubahan tipe data, implementasi fungsi (event) dan juga reordering level kita lakukan sekaligus melalui fungsi mutate.
orditm6 <- orditm2 %>%
mutate(Hour_Order_Purchase = as.numeric(strftime(order_purchase_timestamp, format="%H")),
Order_Purchase_Time = factor(sapply(Hour_Order_Purchase, event)),
Order_Purchase_Time = factor(Order_Purchase_Time, levels = c("12AM to 6AM", "6AM to 12PM", "12PM to 6PM", "6PM to 12AM")))
orditm6Cari Mana Range Waktu yang Paling memiliki pembelian.
orditm6 %>% group_by(Order_Purchase_Time) %>%
summarise(Jumlah_Pembelian = n()) %>%
arrange(desc(Jumlah_Pembelian))Ternyata, Jumlah Pembelian terbanyak ada pada waktu 12AM to 6AM.
Visualisasi
Sebenarnya visualiasi dari Task ini sama saja dengan Task 7. Oleh karena itu, mari kita coba visualisasi baru dengan menggunakan package ggmosaic untuk membuat mosaic plot. Jenis plot ini jarang digunakan, namun sebenarnya cukup bermanfaat jika kita ingin melihat kaitan antara 2 variabel kategorik.
Dalam kasus kali ini, mari coba kita lihat kaitan antara Order_Purchase_Time dengan product_category_name_english. Apakah pembelian kategori produk tertentu lebih besar pada jam tertentu?
plot5 <- ggplot(orditm6) +
geom_mosaic(aes(x = product(Order_Purchase_Time),
fill=product_category_name_english)) +
labs(title = paste("Penjualan Produk Berdasarkan Kategori dan Waktu Pembelian \nTahun 2017 - 2018"),
x = NULL,
y = NULL) +
theme(legend.position = "none",
legend.title = element_text(size = 8),
legend.text = element_text(size = 8)) +
scale_fill_brewer(palette = "Paired")
ggplotly(plot5, tooltip = "text")Task 9
Berapa km jarak terjauh pengiriman yang pernah dilakukan? (1 poin)
Siapkan Dataset
Ada beberapa tahapan yang perlu dilalui untuk dapat menyiapkan dataset bagi Task 9.
Pertama, kita perlu tahu bahwa untuk menghitung jarak, kita harus menegtahui koordinat si penjual dan pembeli. Sedangkan di dataset orditm tidak ada. Dataset yang memiliki koordinat (long-lat) adalah geol berdasarkan zip code, dan unungnya, di orditm ada zip code dari pembeli dan penjual. Karena itu kita perlu menggabungkan mereka berdua. Selain itu, hal yang perlu diperhatikan adalah, karena di Task ini yang diminta adalah pengiriman, maka data harus di-filter hanya yang mencakup delivered saja.
Setelah lihat kondisi data di geol, ternyata ada cukup banyak zip code yang memiliki banyak koordinat. Dengan demikian, kita perlu filter unique zip code, berdasarkan jumlah koordinat terbanyak
geol2 <- geol %>%
group_by(geolocation_zip_code_prefix, geolocation_lat, geolocation_lng) %>%
summarise(count = n()) %>%
group_by(geolocation_zip_code_prefix) %>%
slice(which.max(count)) %>%
select(-count) %>%
ungroup()Sekarang, kita bisa merge dataset geol dengan orditm. Jangan lupa filter juga order statusnya hanya yang “delivered”.
orditm7 <- orditm2 %>%
inner_join(geol2, by = c("customer_zip_code_prefix" = "geolocation_zip_code_prefix")) %>%
mutate(customer_lat = geolocation_lat,
customer_lng = geolocation_lng) %>%
select(-geolocation_lat, -geolocation_lng) %>%
mutate(customer_zip_code_prefix = as.factor(customer_zip_code_prefix)) %>%
inner_join(geol2, by = c("seller_zip_code_prefix" = "geolocation_zip_code_prefix")) %>%
mutate(seller_lat = geolocation_lat,
seller_lng = geolocation_lng) %>%
select(-geolocation_lat, -geolocation_lng) %>%
mutate(seller_zip_code_prefix = as.factor(seller_zip_code_prefix)) %>%
filter(order_status == "delivered") %>%
droplevels()
orditm7Selanjutnya, kita hitung jarak antara penjual dan pembeli dengan menggunakan fungsi distHaversine dari package geosphere. Lalu simpan perhitungan jarak di dalam dataset baru kita dengan nama variabel distance. Namun perlu diingat, untuk menyederhanakan perhitungan, kita menggunakan fungsi distHaversine yang menghitung berdasarkan garis lurus. Nilai aktualnya bisa saja berbeda.
# Pilih Variabel yang Penting Saja
orditm7dist <- orditm7 %>%
select(customer_id, seller_id, customer_lng, customer_lat, seller_lng, seller_lat, order_purchase_timestamp,
order_delivered_customer_date, customer_state, seller_state)
orditm7dist$distance <- distHaversine(orditm7dist[,3:4], orditm7dist[,5:6])/1000 # dibagi 1000 untuk menghasilkan satuan km
# Cari Jarak Terjauh dengan Menggunakan fungsi Summary.
summary(orditm7dist$distance)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 215.0 438.6 603.0 789.3 8688.0
Jarak terjauh yang ditempuh dalam pengiriman barang adalah 8688 km.
Task 10
Berapa hari rata – rata waktu pengiriman barang? (1 poin)
Untuk menjawab pertanyaan di atas, kita bisa menggunakan dataset yang sudah dibentuk di Task 9. Tinggal hitung perbedaan waktu penerimaan barang dengan pembelian barang, menggunakan fungsi difftime yang akan menghasilkan unit dalam hari. Lalu simpan perhitungan durasi pengiriman di dalam dataset baru kita dengan nama variabel time.
orditm7dist$time <- as.numeric(difftime(orditm7dist$order_delivered_customer_date, orditm7dist$order_purchase_timestamp, units = "days"))
# Cari Rataan waktu Pengiriman dengan Menggunakan fungsi Summary.
summary(orditm7dist$time)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.7814 6.8437 10.2232 12.4833 15.4905 209.6286
Rataan waktu dalam pengiriman barang adalah sekitar 12.5 hari.