A. Studi Kasus

Dataset Serayu Chicken : Restraurant Sales (3 Years) merupakan data sintetis skala besar yang dirancang khusus untuk Time-Series Forecasting dan Trend Analysis, di mana data ini mensimulasikan riwayat transaksi penjualan di Restoran Ayam Serayu yang dipublikasikan oleh Bertnardo Mario Uskono di Kaggle pada link ini. Dataset ini mencakup informasi penting seperti waktu transaksi, outlet, jenis layanan, menu, harga, jumlah pembelian, dan lainnya setiap hari selama 3 tahun, yaitu dari Januari 2023 hingga Desember 2025.

Dalam analisis ini, variabel utama yang akan menjadi fokus adalah:

ID.Struk -> Kode identitas unik untuk setiap transaksi pesanan pelanggan.

Melalui visualisasi data ini, kita ingin memahami bagaimana dinamika transaksi yang terjadi di Restoran Ayam Serayu. Beberapa pertanyaan awal yang ingin dikaji dalam analisis ini adalah:

  • Apa jenis layanan yang paling diminati oleh pelanggan selama 3 tahun berjalan?
  • Menu apa yang menjadi terlaris di antara para pelanggan di setiap outlet, baik dari kategori makanan maupun minuman?
  • Bagaimana variasi penggunaan metode pembayaran dari para pelanggan? Bagaimana pula performa para kasir yang melayani transaksi di tiap metode pembayaran?
  • Bagaimana distribusi pendapatan total restoran selama 3 tahun berjalan? Apakah ada perilaku konsumen yang bisa dilihat dari daya belinya?
  • Bagaimana tren pendapatan total restoran selama 3 tahun? Di bulan apa penjualan menghasilkan pendapatan tertinggi? Apakah ada pola musiman?
  • Apakah terdapat pola waktu tertentu dalam aktivitas pemesanan, seperti jam atau hari sibuk?

Maka, tujuan dari analisis ini adalah untuk mengeksplorasi data secara visual sehingga dapat memberikan insight strategis bagi pengelola restoran dalam pengambilan keputusan berbasis data.

B. Memuat dan Mengeksplor Data

Dataset dimuat ke dalam R menggunakan fungsi read.csv() dari file lokal. Selanjutnya, fungsi colnames() digunakan untuk melihat struktur awal variabel dalam dataset sebelum dilakukan proses pembersihan dan transformasi data.

# Load data
resto_data <- read.csv("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"

Berdasarkan output tersebut, dataset ini memiliki 626.311 baris data dengan total 15 variabel yang terdiri dari variabel numerik maupun kategorik. Beberapa variabel penting antara lain:

No. Variabel Keterangan
1. Tanggal...Waktu Tanggal dan jam saat transaksi (2023-01-01 00:51:19 hingga 2025-12-31 23:10:57)
2. ID.Struk Kode transaksi unik tiap menu yang dibeli
3. Outlet Lokasi cabang restoran (AYAM SERAYU - PUSAT, AYAM SERAYU - CABANG 1, AYAM SERAYU - CABANG 2)
4. Tipe.Penjualan Cara layanan dari pelanggan yang membeli (Dine in, Take Away, Online)
5. Kasir Nama kasir yang melayani (Asep, Budi, Dewi, Dimas, Fikri, Nabila, Rina, Siti)
6. Nama.Produk Nama menu yang dibeli (Ayam Bakar Madu, Ayam Goreng Serayu - Dada, Ayam Goreng Serayu - Paha, Bebek Goreng Surabaya, Cah Kangkung, Kulit Ayam Crispy, Lele Crispy, Nasi Putih, Nasi Uduk, Nila Bakar, Tahu Tempe, Air Mineral, Es Jeruk, Es Kopi Susu, Es Teh Manis, Jus Alpukat, Teh Manis Panas)
7. Kategori Jenis menu yang dibeli (Makanan, Minuman)
8. Jumlah.Produk Jumlah menu yang dibeli
9. Harga.Produk Harga menu yang dibeli
10. Total Tagihan total per menu yang dibeli/Pendapatan Total per menu bagi restoran
11. Metode.Pembayaran Metode pembayaran tagihan per menu yang dibeli (Debit, QRIS, Tunai)

Untuk mempermudah analisis, dilakukan proses feature engineering seperti mengubah format waktu, menambahkan variabel bulan (Bulan), hari (Hari), serta kategori waktu (Jam). Proses ini bertujuan untuk mempermudah analisis berbasis waktu (time-based analysis). Selain itu, juga dilakukan rename beberapa variabel dengan nama yang panjang menjadi lebih singkat dan mudah dipahami.

# Rename
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
  )

# Recode
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"
    )
  )

Hasil proses recode menghasilkan dataset yang lebih terstruktur dan mudah dianalisis. Variabel hasil rename Waktu telah dikonversi ke format yang sesuai (datetime), serta ditambahkan variabel turunan seperti Bulan, Hari, dan kategori Jam (pagi, siang, sore, malam).

No. Variabel Keterangan
1. Bulan Bulan dan tahun saat transaksi (Jan 2023 hingga Des 2025)
2. Tanggal Tanggal, bulan, tahun saat transaksi (2023-01-01 hingga 2025-12-31)
3. Hari Hari saat transaksi (Senin, Selasa, Rabu, Kamis, Jumat, Sabtu, Minggu)
4. Jam Kategori jam saat transaksi (Pagi (00:00-10:59), Siang (11:00-14:59), Sore (15:00-17:59), Malam (18:00-23:59))

Selain itu, nama outlet juga telah disederhanakan menjadi Pusat, Cabang 1, dan Cabang 2 untuk efisiensi keterbacaan visualisasi. Transformasi ini berguna dalam proses analisis karena memungkinkan eksplorasi data yang lebih mendalam dan informatif.

## 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…

Jadi, setelah proses pembersihan sebagian data dari dataset, variabel akhir yang digunakan dalam analisis ini terdiri dari:

  • Variabel kategorik: ID.Struk, Outlet, Layanan, Kasir, Menu, Kategori, Metode
  • Variabel diskrit: Jumlah
  • Variabel numerik: Harga, Total
  • Variabel waktu: Bulan, Tanggal, Hari, Jam

Kombinasi variabel ini memungkinkan analisis dilakukan dari berbagai sudut pandang, baik secara kategorik maupun kontinu.

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

Setelah seluruh proses pembersihan dan transformasi dilakukan, dataset telah siap digunakan untuk tahap eksplorasi dan visualisasi data guna menjawab pertanyaan penelitian yang telah dirumuskan sebelumnya.

C. Analisis Visualisasi Data

1. Visualisasi Kategorik

Visualisasi kategorik digunakan untuk menganalisis data yang berbentuk kategori atau kelompok. Tujuan dari visualisasi ini adalah untuk memahami komposisi/proporsi data dalam setiap kategori serta mengidentifikasi kategori yang dominan dari hasil perbandingan.

a. Pie Chart: Proporsi Jenis Layanan

layanan_prop <- 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(layanan_prop, 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()

Visualisasi pertama menggunakan pie chart untuk menggambarkan proporsi jenis layanan yang digunakan pelanggan selama tiga tahun terakhir. Variabel yang digunakan adalah Layanan sebagai kategori dan Jumlah Transaksi sebagai ukuran. Grafik ini bertujuan untuk mengidentifikasi preferensi cara pemesanan yang paling dominan di Restoran Ayam Serayu secara keseluruhan.

Berdasarkan grafik, terlihat bahwa layanan Dine in mendominasi memiliki proporsi yang paling tinggi, yaitu mencapai 49.9% (hampir setengah dari total transaksi). Sementara itu, layanan Take Away memiliki proporsi paling rendah, yakni sebesar 19.9%. Layanan Online berada di posisi tengah dengan kontribusi sebesar 30.2%.

Kondisi ini menunjukkan bahwa pengalaman makan di tempat (experience-based dining) masih menjadi “magnet” utama bagi para pelanggan Ayam Serayu. Dominasi Dine in yang menyentuh angka 50% mengindikasikan bahwa suasana restoran, kualitas pelayanan, dan fasilitas outlet secara fisik memegang peranan penting dalam perputaran bisnis.

Insight & Implikasi Kebijakan:

  • Optimasi Fasilitas Fisik: Karena hampir 50% pelanggan datang untuk makan di tempat, manajemen harus memastikan kapasitas kursi, kebersihan area makan, dan kenyamanan suhu ruangan selalu prima. Begitu juga estetika interior atau fasilitas tambahan (seperti Wi-Fi atau area parkir) akan sangat berdampak pada kepuasan mayoritas pelanggan.
  • Peluang Ekspansi Digital (Online): Dengan angka 30.2%, layanan Online sudah cukup kuat namun masih memiliki peluang tumbuh yang besar. Manajemen bisa mempertimbangkan promosi eksklusif aplikasi atau kerjasama merchant untuk meningkatkan porsi ini, guna mengurangi beban operasional antrean di area fisik untuk menjangkau lebih banyak pelanggan.
  • Evaluasi Strategi Take Away: Mengingat Take Away paling rendah (19.9%), perlu dicek apakah ada hambatan seperti kecepatan pengemasan atau kurangnya promo khusus “bawa pulang”. Jika Dine in sering penuh (overcapacity), mendorong pelanggan ke Take Away lewat diskon khusus bisa menjadi solusi agar tidak ada pelanggan yang “laba” (pergi karena tidak dapat tempat).

2. Visualisasi Bivariate

Visualisasi bivariat digunakan untuk menganalisis hubungan antara dua variabel dalam dataset, baik kategorik-kategorik, numerik-numerik, atau kategorik-numerik. Tujuan utama dari visualisasi ini adalah untuk melihat apakah terdapat pola, perbedaan, atau hubungan tertentu antara variabel tersebut.

a. Grouped Bar chart: Menu Terlaris per Outlet

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 sehingga 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" = "#9db31c",
    "Lele Crispy" = "#c1460d",
    "Es Jeruk" = "#eca129"
  )) +
  scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = "Menu Makanan dan Minuman Terlaris di Restoran Ayam Serayu",
    subtitle = "Perbandingan menu paling laku per outlet",
    x = "Outlet",
    y = "Jumlah Pembelian (pcs)",
    fill = "Nama Menu"
  ) +
  theme_minimal()

Visualisasi kedua ini menggunakan grouped bar chart untuk membandingkan satu menu makanan dan satu menu minuman dengan volume penjualan tertinggi di setiap outlet (Pusat, Cabang 1, dan Cabang 2). Variabel yang digunakan adalah Outlet sebagai sumbu x, Menu sebagai pembeda kategori, dan Total_Pcs sebagai ukuran. Grafik ini bertujuan untuk memetakan kelarisan produk unggulan (signature dish & drink) yang menjadi penggerak utama operasional dan pendapatan di masing-masing outlet.

Berdasarkan grafik, terlihat bahwa terdapat variasi menu terlaris antar lokasi. Di Outlet Pusat, kombinasi terlaris didominasi oleh Tahu Tempe dan Jus Alpukat. Sementara itu, Cabang 1 dan Cabang 2 menunjukkan pola yang identik, di mana Lele Crispy memimpin kategori makanan dan Es Jeruk menjadi jawara di kategori minuman. Volume penjualan di seluruh outlet terpantau sangat kompetitif dan stabil di kisaran angka 15.000 pcs selama 3 tahun terakhir ini.

Kondisi ini menunjukkan adanya perbedaan preferensi pelanggan antara pusat dengan area cabang. Namun, sebuah temuan kritis muncul: meskipun restoran ini menyandang nama “Ayam Serayu”, menu Ayam Goreng Serayu (baik paha maupun dada) tidak menempati posisi puncak di outlet mana pun. Hal ini mengindikasikan bahwa meskipun Ayam Goreng Serayu adalah identitas merek (brand identity), Lele Crispy dan Tahu Tempe bertindak sebagai penggerak jumlah transaksi yang lebih masif, kemungkinan besar karena faktor harga yang lebih ekonomis atau perannya sebagai menu pendamping (side dish) yang dipesan hampir di setiap transaksi.

Insight & Implikasi Kebijakan:

  • Evaluasi Strategi Produk Utama: Manajemen perlu meninjau kembali mengapa menu Ayam Goreng Serayu tidak menjadi yang terlaris. Jika kendalanya adalah harga, manajemen bisa meluncurkan “Paket Ayam Hemat” untuk meningkatkan volume penjualan tanpa merusak citra eksklusivitas menu utamanya.
  • Strategi “Bundling” Berbasis Data: Karena Lele Crispy dan Es Jeruk adalah duet maut di cabang, promosi paket kombo untuk kedua menu tersebut akan sangat efektif meningkatkan loyalitas. Sebaliknya, di Pusat, promo bisa difokuskan pada menu ringan/sehat seperti Tahu Tempe dan Jus Alpukat.
  • Optimalisasi Rantai Pasok: Mengingat Lele dan Tahu-Tempe adalah tulang punggung volume penjualan, kontrol kualitas dan ketersediaan stok bahan baku ini di dapur harus menjadi prioritas utama untuk mencegah potensi kerugian akibat stok kosong (out of stock).

b. Grouped Bar chart: Kasir vs Metode Pembayaran

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

ggplot(top_kasir, aes(x = Metode, y = Jumlah_Transaksi, 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()

Visualisasi yang ketiga ini menggunakan grouped bar chart untuk menggambarkan distribusi penggunaan metode pembayaran (Debit, QRIS, dan Tunai) serta performa tiga kasir teratas di setiap metode tersebut. Variabel yang digunakan adalah Metode sebagai kategori utama, Kasir sebagai pembeda, Jumlah Transaksi sebagai ukuran. Grafik ini bertujuan untuk melihat apakah ada kecenderungan pelanggan pada alat pembayaran tertentu dan bagaimana produktivitas kasir dalam menanganinya.

Berdasarkan grafik, terlihat sebuah fenomena yang unik di mana penggunaan ketiga metode pembayaran menunjukkan angka yang sangat seimbang dan merata. Tidak ada satu pun metode yang mendominasi secara signifikan, dengan jumlah transaksi yang stabil di kisaran angka 17.500 transaksi per kategori. Begitu pula dengan performa para kasir (seperti Rina, Budi, dan Fikri) yang memiliki volume pelayanan hampir identik satu sama lain di setiap metode pembayaran.

Kondisi ini menunjukkan distribusi yang sangat ideal atau sempurna di seluruh kategori. Namun, seperti yang disebutkan di awal, bahwa karakteristik data yang sangat merata ini merupakan ciri khas dari data sintetis hasil simulasi komputer. Dalam realitas bisnis di lapangan, biasanya terdapat deviasi/kecenderungan kuat pada salah satu metode pembayaran (misalnya QRIS yang lebih dominan di kalangan anak muda atau Tunai di gerai tertentu), tidak seperti yang terlihat pada grafik ini yang menunjukkan konsistensi mutlak.

Insight & Implikasi Kebijakan:

  • Evaluasi Beban Kerja & Mitigasi Risiko SDM: Dominasi Rina sebagai peringkat pertama di seluruh metode pembayaran menunjukkan produktivitas tinggi, namun juga risiko kelelahan (burnout) dan ketergantungan pada satu individu. Manajemen perlu melakukan redistribusi beban kerja melalui pengaturan shift yang lebih strategis, yakni dengan menyebar kasir-kasir produktif di jadwal berbeda guna menjaga konsistensi kualitas pelayanan di setiap waktu operasional.
  • Standardisasi Kompetensi & Program Insentif: Hanya 4 dari 8 kasir yang mampu menembus jajaran “Top 3”, mengindikasikan adanya kesenjangan keterampilan antar staf. Manajemen disarankan untuk melakukan pelatihan ulang (re-training) bagi kasir lain agar memiliki kecepatan yang setara, serta meluncurkan program penghargaan “Employee of the Month” untuk mengapresiasi kinerja kasir produktif sekaligus memotivasi staf lainnya.
  • Kesiapan Operasional Multikanal: Karena volume transaksi merata, manajemen harus menjamin kesiapan seluruh alat pembayaran (mesin EDC, QRIS, dan ketersediaan uang tunai) secara simultan. Fokus keamanan juga harus dibagi secara adil antara sistem keamanan siber untuk transaksi digital dan prosedur keamanan fisik untuk pengelolaan uang tunai di outlet.

3. Visualisasi Kontinu

Visualisasi kontinu digunakan untuk menganalisis variabel numerik yang memiliki rentang nilai tertentu, seperti Harga, dan Total. Tujuan dari visualisasi ini adalah untuk memahami pola distribusi dan penyebaran data.

a. Histogram: Distribusi Total

ggplot(resto_data, aes(x = Total)) +
  geom_histogram(fill = "#7f201c", bins = 30, color = "#e7ccb6") +
  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()

Visualisasi keempat ini menggunakan histogram untuk menggambarkan sebaran frekuensi nilai pendapatan total per transaksi di seluruh outlet selama 3 tahun terakhir. Grafik ini bertujuan untuk mengidentifikasi pola pengeluaran pelanggan per kunjungan, yang membantu manajemen memahami spending power (daya beli) rata-rata konsumen Ayam Serayu.

Berdasarkan grafik, terlihat bahwa distribusi data cenderung right-skewed (miring ke kanan). Mayoritas transaksi terpusat pada kisaran nilai Rp50.000 hingga Rp100.000, dengan puncak frekuensi tertinggi berada di sekitar angka 60.000. Sementara itu, jumlah transaksi dengan nilai di atas Rp200.000 frekuensinya sangat rendah (ditunjukkan dengan ekor panjang di sisi kanan), yang menunjukkan bahwa transaksi bernilai besar adalah kejadian yang cukup jarang terjadi.

Kondisi ini mengindikasikan bahwa Restoran Ayam Serayu didominasi oleh segmen pelanggan “Individual/Pasangan” atau kelompok kecil, di mana nilai belanjanya berada pada kategori moderat/sedang. Meskipun terdapat transaksi bernilai tinggi (mungkin pesanan keluarga besar atau katering), kontribusi volumenya tidak sebesar pelanggan yang memesan menu standar harian.

Insight & Implikasi Kebijakan:

  • Potensi Segmentasi “Family Pack”: Mengingat transaksi di atas Rp200.000 masih sangat minim, terdapat peluang besar untuk menciptakan Segmentasi Pelanggan Kelompok. Manajemen dapat meluncurkan paket keluarga (Family Package) atau paket katering kantoran dengan harga Rp250.000 ke atas guna menarik nilai transaksi (average check) ke arah kanan histogram.
  • Optimasi Menu “Add-on”: Karena mayoritas pelanggan berbelanja di kisaran Rp60.000, manajemen bisa meningkatkan pendapatan dengan strategi micro-upselling. Misalnya, menawarkan kerupuk, sate usus, atau ekstra sambal seharga Rp5.000 - Rp10.000. Jika berhasil, titik puncak distribusi bisa bergeser dari Rp60.000 ke Rp75.000, yang secara akumulatif akan berdampak masif pada total profit.
  • Analisis Psikologi Harga: Manajemen perlu memastikan bahwa menu-menu favorit tetap berada dalam rentang “aman” psikologis pelanggan (di bawah Rp100.000). Jika ada rencana kenaikan harga yang membuat transaksi rata-rata melompat jauh melewati Rp100.000, ada risiko frekuensi kunjungan akan menurun karena pelanggan merasa restoran menjadi “mahal”.
  • Targeting Iklan: Data ini memberi tahu tim pemasaran bahwa target audiens utama mereka adalah orang-orang yang mencari makanan berkualitas dengan anggaran Rp50.000 - Rp80.000. Komunikasi iklan harus menonjolkan nilai ekonomis dan rasa yang sebanding dengan harga tersebut.

4. Visualisasi Data Time Series

Visualisasi time series digunakan untuk menganalisis data yang memiliki dimensi waktu, seperti tanggal atau periode tertentu. Tujuan utama dari visualisasi ini adalah untuk mengidentifikasi tren, pola musiman, dan fluktuasi dari waktu ke waktu. Pendekatan ini sangat penting dalam analisis bisnis karena dapat membantu dalam memahami dinamika penjualan, mengidentifikasi periode puncak, serta mendukung perencanaan strategi di masa mendatang.

a. Moving Average: Tren Penjualan Bulanan

# 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 = 2) +
  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 tua: Moving Average (per 6 bulan)",
    x = "Bulan",
    y = "Pendapatan Total (Rp)",
  ) +
  theme_minimal()

Visualisasi kelima ini menggunakan line chart dengan Moving Average (garis merah tua) per 6 bulan untuk menggambarkan fluktuasi pendapatan selama tiga tahun terakhir (2023-2025). Grafik ini bertujuan untuk mengidentifikasi tren pertumbuhan jangka panjang serta pola musiman (seasonality) yang memengaruhi penjualan Restoran Ayam Serayu.

Berdasarkan grafik, terlihat bahwa restoran mengalami tren pertumbuhan positif (uptrend) yang sangat konsisten dari tahun ke tahun. Titik terendah berada di awal 2023 (di bawah Rp1 Miliar) dan berhasil mencapai puncak tertingginya di pertengahan 2025 (mendekati Rp1,75 Miliar). Selain tren naik, terlihat pola gunung (lonjakan tajam) yang periodik yang terjadi di sekitar Maret-April setiap tahunnya. Lonjakan ini berkorelasi kuat dengan momen Ramadan dan Idul Fitri yang pada tahun 2023-2025 jatuh di rentang bulan tersebut.

Kondisi ini menunjukkan bahwa Restoran Ayam Serayu memiliki daya tarik yang sangat kuat sebagai destinasi “Buka Puasa Bersama” atau acara keluarga saat hari raya. Meskipun data ini bersifat sintetis, simulasi yang dibuat telah berhasil menangkap fenomena Holiday Season dan pola konsumsi masyarakat lokal secara akurat, di mana sektor kuliner selalu mengalami panen keuntungan pada periode tersebut.

Insight & Implikasi Kebijakan:

  • Kesiapan Musiman (Ramadan Strategy): Karena lonjakan tertinggi selalu terjadi secara konsisten di bulan Maret-April, manajemen harus menetapkan periode ini sebagai “Golden Month”. Kebijakan yang perlu diambil adalah memastikan ketersediaan bahan baku dua kali lipat lebih banyak, penambahan staf paruh waktu, dan optimalisasi sistem reservasi untuk menampung lonjakan Dine in yang masif.
  • Manajemen Arus Kas (Cash Flow): Dengan pertumbuhan pendapatan hampir 75% dalam 3 tahun (dari 1M ke 1.7M), manajemen memiliki ruang fiskal yang sehat untuk melakukan ekspansi. Pendapatan berlebih dari “bulan-bulan puncak” bisa dialokasikan untuk renovasi outlet atau pembukaan cabang baru di tahun ke-4 tanpa mengganggu biaya operasional harian.
  • Promo di Bulan “Lembah” (Low Season): Grafik menunjukkan adanya penurunan atau titik jenuh di akhir tahun (sekitar November). Manajemen bisa meluncurkan program loyalitas atau promo khusus di bulan-bulan sepi ini untuk menjaga agar grafik pendapatan tidak turun terlalu tajam dan mempertahankan performa kasir tetap stabil.
  • Optimalisasi Moving Average: Garis merah (Moving Average) yang terus mendaki menunjukkan bahwa secara fundamental, bisnis Ayam Serayu sehat dan terus diminati. Manajemen perlu menjaga momentum ini dengan tetap mempertahankan kualitas rasa (terutama Lele Crispy yang jadi primadona) agar tren naik ini tidak mengalami reversal (pembalikan arah).

b. Line Chart: Pola Pesanan Berdasarkan Jam

# 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.5) +
  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()

Visualisasi keenam ini menggunakan line chart untuk menggambarkan fluktuasi jumlah transaksi berdasarkan empat kategori waktu: Pagi (00:00-10:59), Siang (11:00-14:59), Sore (15:00-17:59), dan Malam (18:00-23:59). Grafik ini bertujuan untuk memetakan jam sibuk (peak hours) guna mengoptimalkan manajemen sumber daya manusia dan efisiensi operasional.

Berdasarkan grafik, terlihat lonjakan yang sangat tajam pada waktu Siang (11:00-14:59) yang mencapai titik tertinggi dengan jumlah transaksi mendekati 80.000. Ini menunjukkan adanya fenomena Lunch Rush yang sangat masif, di mana pelanggan terkonsentrasi pada jam makan siang. Setelah itu, jumlah transaksi mengalami penurunan secara bertahap pada waktu Sore dan Malam, sementara waktu Pagi menjadi periode dengan aktivitas terendah (di bawah 20.000 transaksi).

Kondisi ini menegaskan bahwa Restoran Ayam Serayu merupakan destinasi utama untuk makan siang. Pola “gunung” yang mengerucut di waktu siang menunjukkan bahwa restoran harus menghadapi tekanan operasional yang sangat besar dalam jendela waktu yang cukup sempit (4 jam), dibandingkan dengan waktu lainnya yang cenderung lebih landai.

Insight & Implikasi Kebijakan:

  • Strategi “All Hands on Deck” Saat Makan Siang: Mengingat waktu Siang adalah periode paling kritis, manajemen harus menerapkan kebijakan semua staf (termasuk kasir produktif seperti Rina) berada di posisi masing-masing tanpa ada jadwal istirahat atau briefing pada jam tersebut (pukul 11:00 - 14:00). Istirahat staf harus dijadwalkan secara bergantian pada waktu Sore agar tidak mengurangi kualitas pelayanan saat peak hours.
  • Persiapan Dapur (Pre-Cooking): Tim dapur harus menyelesaikan sebagian besar persiapan bahan baku sebelum pukul 11:00 pagi. Karena puncaknya sangat ekstrem, keterlambatan persiapan di pagi hari akan menyebabkan efek domino antrean panjang yang bisa merusak kepuasan pelanggan di jam makan siang.
  • Optimalisasi Menu Sore & Malam: Untuk meratakan beban kerja dan pendapatan, manajemen bisa meluncurkan promo khusus seperti “Happy Hour Sore” atau “Promo Makan Malam Hemat”. Tujuannya adalah untuk menarik sebagian pelanggan dari jam siang yang terlalu padat ke jam sore atau malam yang masih memiliki kapasitas sisa yang besar.

c. Line Chart: Pola Pesanan Berdasarkan Hari

# 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.5) +
  geom_point(color = "#7f201c", size = 3) +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Pola Pesanan Berdasarkan Hari dalam Seminggu",
    x = "Hari",
    y = "Jumlah Transaksi",
  ) +
  theme_minimal()

Visualisasi terakhir ini juga menggunakan line chart untuk menggambarkan distribusi jumlah transaksi dari hari Senin hingga Minggu. Grafik ini bertujuan untuk mengidentifikasi hari-hari dengan trafik pelanggan tertinggi (peak days) guna menentukan strategi promosi dan pengaturan staf mingguan.

Berdasarkan grafik, terlihat perbedaan volume transaksi yang sangat tajam antara hari kerja (weekdays) dan akhir pekan (weekends). Dari Senin hingga Kamis, jumlah transaksi cenderung stabil dan berada di level rendah (sekitar 24.000 transaksi). Namun, lonjakan drastis mulai terjadi pada hari Jumat dan mencapai puncaknya pada hari Sabtu dengan total transaksi melebihi 36.000 (naik 1,5 kali lipat), sebelum sedikit melandai di hari Minggu.

Kondisi ini menunjukkan bahwa Restoran Ayam Serayu menjadi pilihan utama sebagai tempat berkumpul atau “makan enak” keluarga dan komunitas saat waktu senggang di akhir pekan. Lonjakan volume transaksi yang mencapai hampir 50% dibandingkan hari biasa ini mengonfirmasi pola musiman mingguan yang khas di sektor kuliner Indonesia.

Insight & Implikasi Kebijakan:

  • Strategi Penguatan Staf Akhir Pekan: Manajemen harus memastikan jumlah personel (dapur, pelayan, dan kasir) di hari Jumat hingga Minggu berada pada kapasitas maksimal. Mengingat hari Senin-Kamis cukup landai, hari-hari tersebut bisa digunakan untuk memberikan jatah libur (day off) bagi staf secara bergantian agar mereka bugar saat menghadapi “perang” di akhir pekan.
  • Promo “Weekday” untuk Meratakan Trafik: Untuk mengoptimalkan pendapatan di hari kerja yang masih rendah (Senin-Kamis), manajemen bisa meluncurkan promo khusus seperti “Senin Hemat” atau “Paket Makan Siang Kantoran”. Tujuannya adalah untuk menarik minat pelanggan agar tetap datang di hari biasa, sehingga beban operasional tidak hanya menumpuk di akhir pekan.
  • Persiapan Stok Bahan Baku: Berdasarkan tren ini, logistik ketersediaan bahan baku utama (seperti lele dan ayam) harus sudah diperkuat sejak Kamis malam atau Jumat pagi. Keterlambatan pasokan di hari Sabtu akan berakibat fatal karena itu adalah hari dengan potensi keuntungan terbesar dalam seminggu.
  • Optimalisasi Fasilitas Dine-in: Karena puncaknya di akhir pekan (di mana biasanya orang datang dalam kelompok besar/keluarga), manajemen perlu memastikan pengaturan meja (table management) di hari Sabtu dilakukan secara efisien untuk memaksimalkan turnover pelanggan tanpa mengurangi kenyamanan mereka.

D. Kesimpulan & Saran

Berdasarkan seluruh rangkaian analisis visualisasi data selama tiga tahun terakhir, dapat disimpulkan bahwa Restoran Ayam Serayu berada dalam kondisi bisnis yang sangat sehat dengan tren pertumbuhan pendapatan yang konsisten meningkat. Dominasi layanan Dine in serta lonjakan transaksi yang sangat masif pada waktu siang (lunch rush) dan akhir pekan menunjukkan bahwa pengalaman makan di tempat adalah pilar utama bisnis ini. Selain itu, temuan unik mengenai populernya menu alternatif (Lele Crispy dan Tahu-Tempe) di atas menu utama Ayam Serayu mengindikasikan adanya preferensi harga dan perilaku pelanggan yang cenderung berada pada kategori pengeluaran menengah.

Sebagai langkah strategis ke depan, manajemen disarankan untuk fokus pada tiga aspek utama:

  1. Efisiensi Operasional: Melakukan optimalisasi layanan pada jam dan hari sibuk melalui pengaturan shift kasir yang produktif serta manajemen perputaran meja (table turnover) yang lebih cepat.
  2. Inovasi Produk & Harga: Melakukan re-evaluasi harga atau inovasi paket bundling pada menu “Ayam Serayu” agar tetap kompetitif, sembari mempertahankan kualitas menu primadona saat ini.
  3. Strategi Pemasaran Berbasis Data: Mengembangkan promosi berbasis waktu (seperti Happy Hour di jam sepi) dan menciptakan paket kelompok (Family Package) untuk menggeser distribusi pendapatan ke arah nilai transaksi yang lebih tinggi.

Dan untuk penelitian ke depannya, penggunaan data riil (bukan sintetis) serta pendekatan statistik inferensial sangat disarankan untuk memberikan akurasi yang lebih tajam dalam mendukung pengambilan keputusan manajemen yang lebih kompleks.