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:
Maka, tujuan dari analisis ini adalah untuk mengeksplorasi data secara visual sehingga dapat memberikan insight strategis bagi pengelola restoran dalam pengambilan keputusan berbasis 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. | 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) |
| 6. | Kategori |
Jenis menu yang dibeli (Makanan, Minuman) |
| 7. | Jumlah.Produk |
Jumlah menu yang dibeli |
| 8. | Harga.Produk |
Harga menu yang dibeli |
| 9. | Total |
Tagihan total per menu yang dibeli/Pendapatan Total per menu bagi restoran |
Untuk mempermudah analisis, dilakukan proses feature
engineering seperti mengubah format waktu, menambahkan variabel
tanggal (Tanggal), 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),
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
Tanggal, Hari, dan kategori Jam
(pagi, siang, sore, malam).
| No. | Variabel | Keterangan |
|---|---|---|
| 1. | Tanggal |
Tanggal, bulan, tahun saat transaksi (2023-01-01 hingga 2025-12-31) |
| 2. | Hari |
Hari saat transaksi (Senin, Selasa, Rabu, Kamis, Jumat, Sabtu, Minggu) |
| 3. | 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: 18
## $ 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…
## $ 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:
ID.Struk, Outlet,
Layanan, Menu, Kategori,
Hari, JamJumlahHarga, TotalTanggalKombinasi 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.
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.
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%.
Namun demikian, jika kedua layanan non-dine in digabungkan (Online dan Take Away), totalnya mencapai 50,1%, yang berarti secara keseluruhan transaksi justru sedikit lebih didominasi oleh layanan non-dine in. Kondisi ini menunjukkan bahwa meskipun makan di tempat masih menjadi pilihan utama secara individu, terdapat kecenderungan yang kuat bahwa pelanggan mulai beralih ke alternatif layanan yang lebih fleksibel. Dengan kata lain, preferensi pelanggan tidak sepenuhnya terpusat pada pengalaman makan di tempat, melainkan mulai terdistribusi ke berbagai kanal layanan.
Insight & Implikasi Kebijakan:
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.
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.
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 ketiga 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:
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.
# 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 keempat 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:
# 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 kelima 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:
# 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:
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. Meskipun layanan Dine in memiliki proporsi terbesar secara individual, secara keseluruhan transaksi sedikit lebih didominasi oleh layanan non-dine in (Online dan Take Away), sementara lonjakan transaksi yang sangat masif pada waktu siang (lunch rush) dan akhir pekan menunjukkan adanya periode permintaan tertinggi yang signifikan. 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:
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.