Insight: Apakah terdapat kategori film tertentu yang
mendominasi total pendapatan rental di Sakila DVD Store?
Analisis ini bertujuan untuk mengetahui kategori film mana yang paling
menguntungkan (menghasilkan revenue tertinggi) dan melihat
hubungannya dengan frekuensi penyewaan. Informasi ini sangat berguna
bagi manajemen untuk menentukan strategi pengadaan inventaris film ke
depannya. Fokus pada kategori dengan peminat tinggi dapat mengoptimalkan
keuntungan.
Dalam analisis ini, kita menghitung total pendapatan untuk setiap kategori. Misalkan \(R_c\) adalah total pendapatan untuk kategori \(c\), dan \(p_{c,i}\) adalah nominal pembayaran (payment) untuk transaksi penyewaan ke-\(i\) pada kategori tersebut. Total penyewaan pada kategori \(c\) adalah \(N_c\).
Maka, persamaan matematis untuk total pendapatan kategori \(c\) adalah:
\[ R_c = \sum_{i=1}^{N_c} p_{c,i} \]
Rata-rata pendapatan per transaksi penyewaan (\(\bar{R}_c\)) pada kategori tersebut dapat dirumuskan sebagai:
\[ \bar{R}_c = \frac{R_c}{N_c} \]
Kode di bawah ini menggunakan bahasa R untuk mengambil data dari database MySQL Sakila. Jika koneksi database gagal, skrip akan secara otomatis menggunakan fallback data hasil eksekusi query Sakila untuk memastikan laporan tetap dapat di-render dengan lancar.
library(DBI)
library(RMySQL)
library(ggplot2)
library(dplyr)
library(knitr)
library(scales)
db_connected <- FALSE
tryCatch({
con <- dbConnect(RMySQL::MySQL(),
dbname = "sakila",
host = "localhost",
user = "root",
password = "password_anda")
query <- "
SELECT c.name AS category,
COUNT(r.rental_id) AS total_rentals,
SUM(p.amount) AS total_revenue
FROM category c
JOIN film_category fc ON c.category_id = fc.category_id
JOIN inventory i ON fc.film_id = i.film_id
JOIN rental r ON i.inventory_id = r.inventory_id
JOIN payment p ON r.rental_id = p.rental_id
GROUP BY c.name
ORDER BY total_revenue DESC;
"
revenue_data <- dbGetQuery(con, query)
dbDisconnect(con)
db_connected <- TRUE
print("Koneksi database berhasil!")
}, error = function(e) {
message("Info: Menggunakan data fallback. Konfigurasi DB diperlukan untuk live data MySQL.")
})
if (!db_connected) {
revenue_data <- data.frame(
category = c("Sports", "Sci-Fi", "Animation", "Drama", "Comedy", "Action", "New", "Games", "Foreign", "Family", "Documentary", "Horror", "Children", "Classics", "Travel", "Music"),
total_rentals = c(1179, 1101, 1166, 1060, 941, 1112, 940, 969, 1033, 1096, 1050, 846, 945, 939, 837, 830),
total_revenue = c(5314.21, 4756.98, 4656.30, 4587.39, 4383.58, 4375.85, 4351.62, 4281.33, 4270.67, 4226.07, 4207.50, 3722.54, 3655.55, 3628.61, 3549.64, 3417.72)
)
}
revenue_data <- revenue_data %>%
mutate(avg_revenue_per_rental = total_revenue / total_rentals)
kable(head(revenue_data, 5), caption = "Top 5 Kategori Film Berdasarkan Pendapatan",
format.args = list(big.mark = ",", decimal.mark = ".", nsmall = 2))
| category | total_rentals | total_revenue | avg_revenue_per_rental |
|---|---|---|---|
| Sports | 1,179.00 | 5,314.21 | 4.507388 |
| Sci-Fi | 1,101.00 | 4,756.98 | 4.320600 |
| Animation | 1,166.00 | 4,656.30 | 3.993396 |
| Drama | 1,060.00 | 4,587.39 | 4.327726 |
| Comedy | 941.00 | 4,383.58 | 4.658427 |
Berikut adalah visualisasi diagram batang yang membandingkan total pendapatan untuk setiap kategori film.
ggplot(revenue_data, aes(x = reorder(category, total_revenue), y = total_revenue, fill = total_revenue)) +
geom_bar(stat = "identity") +
coord_flip() +
scale_fill_gradient(low = "#85c1e9", high = "#21618c", name = "Pendapatan ($)") +
scale_y_continuous(labels = dollar_format(prefix = "$")) +
labs(
title = "Total Pendapatan Rental per Kategori Film",
subtitle = "Data dari Sakila DVD Rental Database",
x = "Kategori Film",
y = "Total Pendapatan (USD)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 16),
axis.title = element_text(face = "bold"),
axis.text = element_text(size = 11)
)
Berdasarkan hasil visualisasi dan analisis data di atas, dapat ditarik beberapa interpretasi penting: