Berpura-pura Menjadi Data Analis Bagian Ketiga


Big or Small Bussines

Akhirnya selesai juga belajar analisa data Restoran, sebuah project belajar untuk menambah ilmu dalam dunia data dan pemrograman R dengan berpura-pura menjadi data analisi. Tulisan ini merupakan sambungan dari Berpura-pura menjadi data analis bagian pertama dan Berpura-pura menjadi data analis bagian kedua. Membuat tulisan berseri seperti ini memang membutuhkan effort yang cukup banyak, aja saja kendalanya yang terutama adalah kemalasan dalam diri tetapi jika tidak ditantang siapa lagi yang bisa mengendalikan diri sendiri. Selain faktor internal juga ada faktor eksternal. Mungkin suatu saat perlu belajar tentang Kaban atau sejenisnya bila ingin menjadi Data DevOps.

Kendala

Dalam membuat bagian ketiga ini ada sedikit kendala, yaitu tentang penggunaan sunburst diagram. Cari referensi sana-sini dan banyak sekali package R untuk sunburst ini, bahkan ada juga yang merupakan porting dari Python tapi aku lupa namanya. Dan ada beberapa diagram yang belum bisa saya buat dan menurut saya itu cukup perlu dibuat. Untuk membuat sunburst diagram saya menggunakan sunburstR yang cukup simple tetapi outputnya harus html agar sunburst bisa dilihat dan lebih interaktif.

Kode

Untuk bagain ketiga ini, kalian tambahkan dulu kode berikut pada chunk load library:

library(sunburstR)
library(d3r)

Setelah itu kalian bisa melanjutkan kode sebelumnya, seperti berikut:

Eksplore Top 250

Data terakhir dari Restaurant Business Rankings 2020, yaitu data Top 250 yang berisi 250 Restoran yang bagus selama tahun 2020. Mari kita cek datanya.

### Cek data top 250
str(tp250)
head(tp250)

Ternyata ada beberaa yang perlu dicleansing seperti YOY Unit, YOY Sales dan Segemen Kategori. Pertama kita ubah YOY Sales dan YOY Unit.

tp250_clean <- tp250
tp250_clean$YOY_Units <- sub("%", "", tp250_clean$YOY_Units)
tp250_clean$YOY_Sales <- sub("%", "", tp250_clean$YOY_Sales)
tp250_clean <-
  tp250_clean %>%
  mutate(YOY_Sales = as.numeric(YOY_Sales),
         YOY_Units = as.numeric(YOY_Units))

Kita lihat lagi data segmen kategorinya, berapa banyak segmennya.

tp250_clean[, .N, Segment_Category]

Ternyata ada 48 segment category yang harus kita olah agar dapat dianalisa lebih lanjut. Kita buat kolom baru yang berisi kategori dari restoran.

tp250_clean$Category <- paste(tp250_clean$Segment_Category)

tp250_clean[Category == "Quick Service & Burger", Category := "Burger"]
tp250_clean[Category == "Quick Service & Coffee Cafe", Category := "Cafe"]
tp250_clean[Category == "Quick Service & Chicken", Category := "Chicken"]
tp250_clean[Category == "Quick Service & Mexican", Category := "Mexican"]
tp250_clean[Category == "Quick Service & Sandwich", Category := "Sandwich"]
tp250_clean[Category == "Quick Service & Pizza", Category := "Pizza"]
tp250_clean[Category == "Fast Casual & Bakery Cafe", Category := "Cafe"]
tp250_clean[Category == "Fast Casual & Mexican", Category := "Mexican"]
tp250_clean[Category == "Casual Dining & Italian/Pizza", Category := "Pizza"]
tp250_clean[Category == "Casual Dining & Varied Menu", Category := "Varied Menu"]
tp250_clean[Category == "Fast Casual & Asian/Noodle", Category := "Asian"]
tp250_clean[Category == "Quick Service & Frozen Desserts", Category := "Desserts"]
tp250_clean[Category == "Casual Dining & Sports Bar", Category := "Sports Bar"]
tp250_clean[Category == "Family Dining & Family Style", Category := "Family"]
tp250_clean[Category == "Casual Dining & Steak", Category := "Steak"]
tp250_clean[Category == "Casual Dining & Seafood", Category := "Seafood"]
tp250_clean[Category == "Fast Casual & Sandwich", Category := "Sandwich"]
tp250_clean[Category == "Fast Casual & Chicken", Category := "Chicken"]
tp250_clean[Category == "Quick Service & Family Casual", Category := "Family"]
tp250_clean[Category == "Fast Casual & Burger", Category := "Burger"]
tp250_clean[Category == "Casual Dining & Asian", Category := "Asian"]
tp250_clean[Category == "Quick Service & Snack", Category := "Snack"]
tp250_clean[Category == "Quick Service & Beverage", Category := "Drinks"]
tp250_clean[Category == "Quick Service & Seafood", Category := "Seafood"]
tp250_clean[Category == "Quick Service & Bakery Cafe", Category := "Cafe"]
tp250_clean[Category == "Fast Casual & Pizza", Category := "Pizza"]
tp250_clean[Category == "Fine Dining & Steak", Category := "Steak"]
tp250_clean[Category == "Italian/Pizza", Category := "Pizza"]
tp250_clean[Category == "Frozen Desserts", Category := "Desserts"]
tp250_clean[Category == "Coffee Cafe", Category := "Cafe"]
tp250_clean[Category == "BBQ", Category := "Meat"]
tp250_clean[Category == "Bakery Cafe", Category := "Cafe"]
tp250_clean[Category == "Asian/Noodle", Category := "Asian"]
tp250_clean[Category == "Family Casual", Category := "Family"]
tp250_clean[Category == "Family Style", Category := "Family"]

Kategori Restoran sudah kita buat, selanjutnya kita akan membuat 2 kolom baru tentang trend penjualan dan cabang apakah negatif atau positif.

tp250_clean$Sales_Year <- ifelse(tp250_clean$YOY_Sales > 0, 'Positive', 'Negative')
tp250_clean$Unit_Stat <- ifelse(tp250_clean$YOY_Units > 0, 'Positive', 'Negative')

Biar terlihat rapi, kita buang beberapa kolom yang terdapat nilai NA. Seperti kolom Content dan Headquarters.

tp250_clean <- select(tp250_clean, -Content, -Headquarters)

Setelah data cleansing, kita lihat summary datanya.

### Ringkasan data
summary(tp250_clean)
### Cek data null
sum(is.na(tp250_clean))

Dari data tersebut sudah tidak ada data NA, sedangkan rata-rata penjualannya adalah 1242.7 atau 1243 dan rata-rata cabangnya adalah 850. Langkah selanjutnya adalah membuat grafik dari data Restoran Top 250.

Membuat plot Top 250

Kita lihat status penjualan YOY Sales selama 2019-2020 dari 250 Restoran.

sellstat <- data.frame(sort(table(tp250_clean$Sales_Year),decreasing = TRUE ))
setnames(sellstat,c("Status_Penjualan","Jumlah"))

pct <- round(100*sellstat$Jumlah/sum(sellstat$Jumlah))

ggplot(data = sellstat, aes(x = "", y = -Jumlah, 
                           fill = Status_Penjualan)) + 
  geom_bar(stat = "identity", color = "black") + 
  labs(title = "Status Penjualan 2020") +
  coord_polar("y") +
  geom_text(aes(label =paste0(pct, "%")), position = position_stack(vjust = 0.5)) +
  theme_void() +
  scale_fill_manual(values=c("#40E0D0", "#F33A6A"))

Dari diagram tersebut, selama 2020 penjualan sebanyak 34% dari 250 restoran penjualannya berstatus negatif atau mengalami penurunan penjualan.

Selanjutnya coba kita lihat kategori dan sub kategori restoran.

sb <- tp250_clean %>%
  select(Category, Segment_Category, Restaurant) %>%
  mutate_at(vars(2,3), funs(gsub("-", "", .))) %>%
  mutate(
    path = paste(Category, Segment_Category, Restaurant, sep = "-")
  ) %>%
  slice(1:250) %>%
  mutate(
    V2 = 1
  )

sunbrst <- sund2b(data = data.frame(xtabs(V2~path, sb)), rootLabel = 'Top 250 Restoran')
sunbrst

Agar diagramnya bisa lebih interaktif bisa kalian, bisa menjalkan file Rmarkdown atau export menjadi html. Selanjutnya mari kita cari tahu penjualan 10 besar restoran berdasarkan 5 YOY Sales tertinggi per kategori restoran.

### Mencari total penjualan
moresale <- aggregate(tp250_clean$YOY_Sales, .SD[1:10], by=list(Category=tp250_clean$Category), FUN=sum)

chicken <- tp250_clean[Category == "Chicken", .SD[1:10]]
mexican <- tp250_clean[Category == "Mexican", .SD[1:10]]
burger <- tp250_clean[Category == "Burger", .SD[1:10]]
steak <- tp250_clean[Category == "Steak", .SD[1:10]]
pizza <- tp250_clean[Category == "Pizza", .SD[1:10]]

### Plot
ggplot(chicken, aes(x= reorder(Restaurant, -Sales), y=Sales, fill=Sales)) +
  labs(title="Top 10 Chicken Resataurant",
        x ="Restoran", y = "Total Penjualan") +
  geom_bar(stat="identity", position=position_dodge()) +
  scale_fill_gradient(low="#c7a37c",high="#583831") +
  theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(mexican, aes(x= reorder(Restaurant, -Sales), y=Sales, fill=Sales)) +
  labs(title="Top 10 Mexican Restaurant",
        x ="Restoran", y = "Total Penjualan") +
  geom_bar(stat="identity", position=position_dodge()) +
  scale_fill_gradient(low="#95d800",high="#626cbd") +
  theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(burger, aes(x= reorder(Restaurant, -Sales), y=Sales, fill=Sales)) +
  labs(title="Top 10 Burger Restairant",
        x ="Restoran", y = "Total Penjualan") +
  geom_bar(stat="identity", position=position_dodge()) +
  scale_fill_gradient(low="#e8a735",high="#8c0004") +
  theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(steak, aes(x= reorder(Restaurant, -Sales), y=Sales, fill=Sales)) +
  labs(title="Top 10 Steak Restaurant",
        x ="Restoran", y = "Total Penjualan") +
  geom_bar(stat="identity", position=position_dodge()) +
  scale_fill_gradient(low="#428fdd",high="#9758da") +
  theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(pizza, aes(x= reorder(Restaurant, -Sales), y=Sales, fill=Sales)) +
  labs(title="Top 10 Pizza Restaurant",
        x ="Restoran", y = "Total Penjualan") +
  geom_bar(stat="identity", position=position_dodge()) +
  scale_fill_gradient(low="#ff8888",high="#fc5f5f") +
  theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 90, hjust = 1))

Selanjutnya kita akan membandingkan berapa banyak Restoran kecil dan Restoran besar pada top 250.

tp250_clean$Type <- ifelse(tp250_clean$Units > mean(tp250_clean$Units), 'Besar', 'Kecil')

bisnis <- data.frame(sort(table(tp250_clean$Type),decreasing = TRUE ))
setnames(bisnis,c("Tipe","Jumlah"))

pct <- round(100*bisnis$Jumlah/sum(bisnis$Jumlah))

ggplot(data = bisnis, aes(x = "", y = -Jumlah, 
                           fill = Tipe)) + 
  geom_bar(stat = "identity", color = "black") + 
  labs(title = "Persentase Jenis Bisnis") +
  coord_polar("y") +
  geom_text(aes(label =paste0(pct, "%")), position = position_stack(vjust = 0.5)) +
  theme_void() +
  scale_fill_brewer(palette = "Accent") +
  theme(plot.title = element_text(hjust = 0.5), legend.position="right")

Dari diagram tersebut, dapat kita ketahui bahwa selama pandemi Restoran skala kecil sebanyak 206 restoran masih dapat survive dan masuk kedalam top 250.

Kesimpulan

  1. Restoran waralaba bisa dikatakan bisnis cukup menjanjikan selama pandemi dan kedepannya, hal ini di dukung dengan masuknya 29 restoran waralaba ke dalam future 50. Hal ini juga didukung dengan data YOY Salesnya yang cukup tinggi selama pandemi yaitu 1073.

  2. Meskipun begitu, restoran non-waralaba atau independen rata-rata melakukan penjualan selama pandemi sebanyak 17833434. Dan rata-rata menyajikan makanan sebanyak 317167.

  3. Basis 100 restoran indepen terdapat pada New York, disana terdapat 21 restoran dengan rata-rata penjualan 19355896.

  4. Dari 250 restoran, selama pandemi tren penjualan adalah positif. Hanya 34% yang mengalami tren negatif.

  5. Top 250 Restoran memiliki 18 kategori dan 5 kategori yang memiliki YOY Sales tertinggi adalah chicken, mexican, burger, steak dan pizza.

  6. Dari 5 kategori menu tersebut, berikut 5 restoran yang banyak penjualannya:

    a) Chicken: Chick-fil-A

    b) Mexican: Taco Bell

    c) Burger: McDonald’s

    d) Steak: Texas Roadhouse

    e) Pizza: Dominos

  7. Dan dari top 250 restoran, bisnis kecil masih menguasi pasar restoran dengan persentase sebanyak 82%.

Penutup

Untuk melihat kode full dari bagian pertama sampai ketiga, langsung lihat disini, dan untuk hasil outputnya saya sarankan untuk melihat pada file htmlnya disini, download lalu buka di browser bila download file pdf untuk sunburst tidak tampil. Segitu dulu pada bagain tiga ini, sampai jumpa mini project iseng saya lainnya. Terima kasih.

Referensi kode dan tulisan:

Restaurant Business Rankings 2020

Restaurant Business in 2020 in US

Restaurants Sales During COVID (EDA)

Visualize Nested Data with Sunburst plots in R

comments powered by Disqus