Studi Kasus

(paragraf penjelasan: pendahuluan, rumusan masalah dan tujuan dalam poin-poin)

Memuat dan Mengeksplor Data

(paragraf penjelasan: syntax r input)

# Memuat dataset
resto_data <- read.csv("C:/Users/LENOVO/OneDrive/ドキュメント/4 VISDAT/AyamSerayu_3Years_Transaction_Data.csv")
colnames(resto_data)
##  [1] "Tanggal...Waktu"   "ID.Struk"          "Outlet"           
##  [4] "Tipe.Penjualan"    "Kasir"             "Nama.Produk"      
##  [7] "Kategori"          "Jumlah.Produk"     "Harga.Produk"     
## [10] "Penjualan.Kotor"   "Total"             "Metode.Pembayaran"
## [13] "Status.Pembayaran" "Diskon"            "Pajak"

(paragraf penjelasan: ukuran dataset, pengantar tujuan recode (feature engineering?) berikut)

resto_data <- resto_data %>%
  rename(
    Waktu = Tanggal...Waktu,
    Layanan = Tipe.Penjualan,
    Menu = Nama.Produk,
    Jumlah = Jumlah.Produk,
    Harga = Harga.Produk,
    Subtotal = Penjualan.Kotor,
    Metode = Metode.Pembayaran,
    Status = Status.Pembayaran
  )

resto_data <- resto_data %>%
  mutate(
    Waktu = ymd_hms(Waktu),
    Bulan = format(Waktu, "%b %Y"),
    Tanggal = floor_date(Waktu, "month") %>% as.Date(),
    Hari = wday(Waktu, label = TRUE, abbr = FALSE, locale = "id_ID"),
    Hari = factor(Hari, levels = c("Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu")),
    Jam = case_when(
      hour(Waktu) >= 0 & hour(Waktu) <= 10 ~ "Pagi (00:00-10:59)",
      hour(Waktu) >= 11 & hour(Waktu) <= 14 ~ "Siang (11:00-14:59)",
      hour(Waktu) >= 15 & hour(Waktu) <= 18 ~ "Sore (15:00-17:59)",
      hour(Waktu) >= 19 & hour(Waktu) <= 23 ~ "Malam (18:00-23:59)"
    ),
    Outlet = case_when(
      Outlet == "AYAM SERAYU - PUSAT" ~ "Pusat",
      Outlet == "AYAM SERAYU - CABANG 1" ~ "Cabang 1",
      Outlet == "AYAM SERAYU - CABANG 2" ~ "Cabang 2"
    )
  )

(paragraf penjelasan: dampak hasil recode di atas)

glimpse(resto_data)
## Rows: 626,311
## Columns: 19
## $ Waktu    <dttm> 2023-01-01 00:51:19, 2023-01-01 00:51:19, 2023-01-01 03:33:0…
## $ ID.Struk <chr> "TRX-20230101-8589", "TRX-20230101-8589", "TRX-20230101-3069"…
## $ Outlet   <chr> "Cabang 2", "Cabang 2", "Pusat", "Pusat", "Pusat", "Pusat", "…
## $ Layanan  <chr> "Dine in", "Dine in", "Dine in", "Dine in", "Dine in", "Dine …
## $ Kasir    <chr> "Rina", "Rina", "Budi", "Budi", "Budi", "Budi", "Budi", "Nabi…
## $ Menu     <chr> "Ayam Bakar Madu", "Air Mineral", "Cah Kangkung", "Kulit Ayam…
## $ Kategori <chr> "Makanan", "Minuman", "Makanan", "Makanan", "Makanan", "Makan…
## $ Jumlah   <int> 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1…
## $ Harga    <int> 31000, 5000, 12000, 19000, 20000, 29000, 31000, 5000, 12000, …
## $ Subtotal <int> 31000, 5000, 12000, 19000, 40000, 29000, 62000, 5000, 12000, …
## $ Total    <int> 36000, 36000, 162000, 162000, 162000, 162000, 162000, 46000, …
## $ Metode   <chr> "Tunai", "QRIS", "QRIS", "Tunai", "Debit", "Tunai", "Debit", …
## $ Status   <chr> "Success", "Success", "Success", "Success", "Success", "Succe…
## $ Diskon   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Pajak    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Bulan    <chr> "Jan 2023", "Jan 2023", "Jan 2023", "Jan 2023", "Jan 2023", "…
## $ Tanggal  <date> 2023-01-01, 2023-01-01, 2023-01-01, 2023-01-01, 2023-01-01, …
## $ Hari     <ord> Minggu, Minggu, Minggu, Minggu, Minggu, Minggu, Minggu, Mingg…
## $ Jam      <chr> "Pagi (00:00-10:59)", "Pagi (00:00-10:59)", "Pagi (00:00-10:5…

(paragraf penjelasan: list tabel variabel utama yang dianalisis beserta keterangan dan jenis data)

datatable(head(resto_data, 50), options = list(pageLength = 5, width = '100%'))

(paragraf penjelasan: “Setelah proses ini dilakukan, dataset siap digunakan untuk eksplorasi dan visualisasi.”)

Analisis Visualisasi Data

Visualisasi Kategorik

(paragraf penjelasan: penjelasan visualisasi kategorik adalah…)

Pie Chart: Proporsi Jenis Layanan

Jenis layanan apa yang paling diminati oleh pelanggan?

metode_ramai <- resto_data %>%
  group_by(Layanan) %>%
  summarise(
    Jumlah_Transaksi = n_distinct(ID.Struk),
    .groups = "drop"
  ) %>%
  mutate(
    Persentase = Jumlah_Transaksi / sum(Jumlah_Transaksi) * 100,
    Label = paste0(Layanan, "\n", round(Persentase, 1), "%")
  )

ggplot(metode_ramai, aes(x = "", y = Jumlah_Transaksi, fill = Layanan)) +
  geom_col(width = 2) +
  coord_polar(theta = "y") +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 4) +
  scale_fill_manual(values = c(
    "Dine in" = "#c1460d",
    "Online" = "#eca129",
    "Take Away" = "#e7ccb6"
  )) +
  labs(
    title = "Proporsi Jenis Layanan Restoran Ayam Serayu",
    subtitle = "Berdasarkan preferensi pelanggan",
    fill = "Jenis Layanan"
  ) +
  theme_void()

(3 paragraf penjelasan: Paragraf 1: jenis grafik, variabel, tujuan, Paragraf 2: apa yang terlihat (pola/data), Paragraf 3: interpretasi (makna, implikasi bagi restoran)

contoh: Visualisasi pertama menggunakan diagram batang untuk menggambarkan distribusi jumlah data pada masing-masing kategori variabel X. Grafik ini bertujuan untuk mengidentifikasi kategori yang dominan dalam dataset. Berdasarkan grafik, terlihat bahwa kategori A memiliki jumlah data yang paling tinggi dibandingkan kategori lainnya. Sementara itu, kategori C memiliki jumlah data paling rendah. Kondisi ini menunjukkan bahwa distribusi data tidak merata antar kategori. Dominasi kategori A mengindikasikan bahwa sebagian besar data terpusat pada kelompok tersebut, yang dapat memengaruhi hasil analisis lanjutan.

Visualisasi Bivariate

(paragraf penjelasan: penjelasan visualisasi bivariate adalah…)

Grouped Barchart: Menu Terlaris per Outlet

Menu apa yang menjadi langganan para pelanggan di tiap outlet, baik dari kategori makanan maupun minuman?

top_kategori <- resto_data %>%
  filter(Kategori %in% c("Makanan", "Minuman")) %>%
  group_by(Outlet, Kategori, Menu) %>%
  summarise(
    Total_Pcs = sum(Jumlah),
    .groups = "drop"
  ) %>%
  group_by(Outlet, Kategori) %>%
  slice_max(order_by = Total_Pcs, n = 1) %>% 
  ungroup() %>%
  mutate(Outlet = factor(Outlet, levels = c("Pusat", "Cabang 1", "Cabang 2")))

ggplot(top_kategori, aes(x = Outlet, y = Total_Pcs, fill = Menu)) +
  # position_dodge agar Makanan dan Minuman tidak bertumpuk
  # Kategori sebagai pemisah grup agar hanya ada 2 posisi per Outlet
  geom_col(aes(group = Kategori), position = position_dodge(width = 0.9)) +
  geom_text(aes(label = Menu, group = Kategori), 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, 
            size = 3) +
  scale_fill_manual(values = c(
    "Tahu Tempe" = "#e7ccb6",
    "Jus Alpukat" = "#788426",
    "Lele Crispy" = "#7f201c",
    "Es Jeruk" = "#ee7c1d"
  )) +
  scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = "Menu Makanan dan Minuman Restoran Ayam Serayu Terlaris",
    subtitle = "Perbandingan menu paling laku per outlet",
    x = "Outlet",
    y = "Jumlah Pembelian (pcs)",
    fill = "Nama Menu"
  ) +
  theme_minimal()

(3 paragraf penjelasan: Paragraf 1: jenis grafik, variabel, tujuan, Paragraf 2: apa yang terlihat (pola/data), Paragraf 3: interpretasi (makna, implikasi bagi restoran)

contoh: Visualisasi pertama menggunakan diagram batang untuk menggambarkan distribusi jumlah data pada masing-masing kategori variabel X. Grafik ini bertujuan untuk mengidentifikasi kategori yang dominan dalam dataset. Berdasarkan grafik, terlihat bahwa kategori A memiliki jumlah data yang paling tinggi dibandingkan kategori lainnya. Sementara itu, kategori C memiliki jumlah data paling rendah. Kondisi ini menunjukkan bahwa distribusi data tidak merata antar kategori. Dominasi kategori A mengindikasikan bahwa sebagian besar data terpusat pada kelompok tersebut, yang dapat memengaruhi hasil analisis lanjutan.

Grouped Barchart: Kasir vs Metode Pembayaran

Bagaimana variasi penggunaan metode pembayaran dari para pelanggan? Bagaimana pula distribusi performa kasir yang melayani tiap metode pembayaran?

top_kasir <- resto_data %>%
  group_by(Metode, Kasir) %>%
  summarise(
    Jumlah = n_distinct(ID.Struk),
    .groups = "drop"
    ) %>%
  group_by(Metode) %>%
  slice_max(order_by = Jumlah, n = 3) %>%
  # Langkah kunci: Urutkan Kasir berdasarkan Jumlah (descending) di tiap Layanan
  mutate(Kasir_Order = reorder_within(Kasir, -Jumlah, Metode)) %>%
  ungroup()

ggplot(top_kasir, aes(x = Metode, y = Jumlah, fill = Kasir, group = Kasir_Order)) +
  geom_col(position = position_dodge(width = 0.9)) +
  scale_fill_manual(values = c(
    "Rina" = "#e7ccb6",
    "Budi" = "#eca129",
    "Fikri" = "#c1460d",
    "Siti" = "#7f201c"
  )) +
  labs(
    title = "Top 3 Kasir Restoran Ayam Serayu Terproduktif",
    subtitle = "Perbandingan kasir yang paling aktif melayani di tiap metode pembayaran",
    x = "Metode Pembayaran",
    y = "Jumlah Transaksi",
    fill = "Nama Kasir"
  ) +
  theme_minimal()

(3 paragraf penjelasan: Paragraf 1: jenis grafik, variabel, tujuan, Paragraf 2: apa yang terlihat (pola/data), Paragraf 3: interpretasi (makna, implikasi bagi restoran)

contoh: Visualisasi pertama menggunakan diagram batang untuk menggambarkan distribusi jumlah data pada masing-masing kategori variabel X. Grafik ini bertujuan untuk mengidentifikasi kategori yang dominan dalam dataset. Berdasarkan grafik, terlihat bahwa kategori A memiliki jumlah data yang paling tinggi dibandingkan kategori lainnya. Sementara itu, kategori C memiliki jumlah data paling rendah. Kondisi ini menunjukkan bahwa distribusi data tidak merata antar kategori. Dominasi kategori A mengindikasikan bahwa sebagian besar data terpusat pada kelompok tersebut, yang dapat memengaruhi hasil analisis lanjutan.

Visualisasi Kontinu

(paragraf penjelasan: penjelasan visualisasi kontinu adalah…)

Histogram: Distribusi Total

“Bagaimana distribusi pendapatan total restoran?”

ggplot(resto_data, aes(x = Total)) +
  geom_histogram(fill = "#7f201c", bins = 30, color = "grey") +
  scale_x_continuous(labels = comma) +
  labs(
    title = "Distribusi Pendapatan Total Restoran Ayam Serayu",
    subtitle = "Berdasarkan hasil penjualan (per transaksi) seluruh outlet selama 3 tahun",
    x = "Pendapatan Total (Rp)",
    y = "Frekuensi"
  ) +
  theme_minimal()

(3 paragraf penjelasan: Paragraf 1: jenis grafik, variabel, tujuan, Paragraf 2: apa yang terlihat (pola/data), Paragraf 3: interpretasi (makna, implikasi bagi restoran)

contoh: Visualisasi pertama menggunakan diagram batang untuk menggambarkan distribusi jumlah data pada masing-masing kategori variabel X. Grafik ini bertujuan untuk mengidentifikasi kategori yang dominan dalam dataset. Berdasarkan grafik, terlihat bahwa kategori A memiliki jumlah data yang paling tinggi dibandingkan kategori lainnya. Sementara itu, kategori C memiliki jumlah data paling rendah. Kondisi ini menunjukkan bahwa distribusi data tidak merata antar kategori. Dominasi kategori A mengindikasikan bahwa sebagian besar data terpusat pada kelompok tersebut, yang dapat memengaruhi hasil analisis lanjutan.

Visualisasi Data Time Series

(paragraf penjelasan: penjelasan visualisasi data time series adalah…)

Moving Average: Tren Penjualan Bulanan

Bagaimana tren penjualan selama 3 tahun? Di bulan apa penjualan menghasilkan pendapatan tertinggi? Apakah ada pola musiman?

# Agregasi per bulan
bulanan <- resto_data %>%
  group_by(Tanggal) %>%
  summarise(
    Total_Pendapatan = sum(Total, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  arrange(Tanggal)
# Hitung Moving Average
bulanan$MA3 <- rollmean(bulanan$Total_Pendapatan, 
                        k = 3, 
                        fill = NA, 
                        align = "center")

ggplot(bulanan, aes(x = Tanggal)) +
  geom_line(aes(y = Total_Pendapatan), color = "#e7ccb6", size = 1) +
  geom_line(aes(y = MA3), color = "#c1460d", size = 1.3) +
  geom_point(aes(y = Total_Pendapatan), color = "#eca129", size = 1.5) +
  scale_x_date(date_labels = "%b %Y", date_breaks = "6 months") +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Tren Pendapatan Bulanan Restoran Ayam Serayu",
    subtitle = "Garis merah: Moving Average (per 3 bulan)",
    x = "Bulan",
    y = "Pendapatan Total (Rp)",
  ) +
  theme_minimal()

(3 paragraf penjelasan: Paragraf 1: jenis grafik, variabel, tujuan, Paragraf 2: apa yang terlihat (pola/data), Paragraf 3: interpretasi (makna, implikasi bagi restoran)

contoh: Visualisasi pertama menggunakan diagram batang untuk menggambarkan distribusi jumlah data pada masing-masing kategori variabel X. Grafik ini bertujuan untuk mengidentifikasi kategori yang dominan dalam dataset. Berdasarkan grafik, terlihat bahwa kategori A memiliki jumlah data yang paling tinggi dibandingkan kategori lainnya. Sementara itu, kategori C memiliki jumlah data paling rendah. Kondisi ini menunjukkan bahwa distribusi data tidak merata antar kategori. Dominasi kategori A mengindikasikan bahwa sebagian besar data terpusat pada kelompok tersebut, yang dapat memengaruhi hasil analisis lanjutan.

Line Chart: Pola Pesanan Berdasarkan Jam

Bagaimana pola pesanan berdasarkan jam? Apakah lonjakan pesanan tertinggi di sekitar jam makan siang (lunch rush)?

# Agregasi jumlah pesanan per kategori jam
jam_pesanan <- resto_data %>%
  group_by(Jam) %>%
  summarise(
    Jumlah_Transaksi = n_distinct(ID.Struk),
    .groups = "drop"
  ) %>%
  # Urutkan jam sesuai urutan waktu
  mutate(Jam = factor(Jam, levels = c("Pagi (00:00-10:59)", "Siang (11:00-14:59)", "Sore (15:00-17:59)", "Malam (18:00-23:59)")))

ggplot(jam_pesanan, aes(x = Jam, y = Jumlah_Transaksi, group = 1)) +
  geom_line(color = "#ee7c1d", size = 1) +
  geom_point(color = "#7f201c", size = 3) +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Pola Pesanan Berdasarkan Waktu dalam Sehari",
    x = "Waktu",
    y = "Jumlah Transaksi",
  ) +
  theme_minimal()

(3 paragraf penjelasan: Paragraf 1: jenis grafik, variabel, tujuan, Paragraf 2: apa yang terlihat (pola/data), Paragraf 3: interpretasi (makna, implikasi bagi restoran)

contoh: Visualisasi pertama menggunakan diagram batang untuk menggambarkan distribusi jumlah data pada masing-masing kategori variabel X. Grafik ini bertujuan untuk mengidentifikasi kategori yang dominan dalam dataset. Berdasarkan grafik, terlihat bahwa kategori A memiliki jumlah data yang paling tinggi dibandingkan kategori lainnya. Sementara itu, kategori C memiliki jumlah data paling rendah. Kondisi ini menunjukkan bahwa distribusi data tidak merata antar kategori. Dominasi kategori A mengindikasikan bahwa sebagian besar data terpusat pada kelompok tersebut, yang dapat memengaruhi hasil analisis lanjutan. Interpretasi

Line Chart: Pola Pesanan Berdasarkan Hari

Bagaimana pula pola pesanan berdasarkan hari? Apakah saat hari pekan menunjukkan pola tertinggi dibandingkan hari biasa?

# Agregasi jumlah pesanan per hari
hari_pesanan <- resto_data %>%
  group_by(Hari) %>%
  summarise(
    Jumlah_Transaksi = n_distinct(ID.Struk),
    .groups = "drop"
  ) %>%
  # Urutkan hari Senin–Minggu
  mutate(Hari = factor(Hari, levels = c("Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu")))

ggplot(hari_pesanan, aes(x = Hari, y = Jumlah_Transaksi, group = 1)) +
  geom_line(color = "#ee7c1d", size = 1) +
  geom_point(color = "#7f201c", size = 3) +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Pola Pesanan Berdasarkan Hari dalam Seminggu",
    x = "Hari",
    y = "Jumlah Pesanan (transaksi)",
  ) +
  theme_minimal()

(3 paragraf penjelasan: Paragraf 1: jenis grafik, variabel, tujuan, Paragraf 2: apa yang terlihat (pola/data), Paragraf 3: interpretasi (makna, implikasi bagi restoran)

contoh: Visualisasi pertama menggunakan diagram batang untuk menggambarkan distribusi jumlah data pada masing-masing kategori variabel X. Grafik ini bertujuan untuk mengidentifikasi kategori yang dominan dalam dataset. Berdasarkan grafik, terlihat bahwa kategori A memiliki jumlah data yang paling tinggi dibandingkan kategori lainnya. Sementara itu, kategori C memiliki jumlah data paling rendah. Kondisi ini menunjukkan bahwa distribusi data tidak merata antar kategori. Dominasi kategori A mengindikasikan bahwa sebagian besar data terpusat pada kelompok tersebut, yang dapat memengaruhi hasil analisis lanjutan.

Kesimpulan & Saran

(2-3 paragraf penjelasan: kesimpulan yang menjawab rumusan masalah dan tujuan penelitian. Minimal 1–2 paragraf. Setiap paragraf dalam penulisan laporan minimal terdiri dari 3 kalimat (gagasan utama, gagasan pendukung), lanjut dalam poin-poin jelaskan saran peneliti ke depannya)