Dataset Sakila merupakan data contoh sistem rental film yang mencakup informasi mengenai pelanggan, transaksi rental, film, genre, wilayah (negara), serta pendapatan (amount). Saya mengambil insight dari dataset ini untuk menganalisis pola konsumsi film di kawasan ASEAN berdasarkan jumlah rental, preferensi genre, serta kontribusi pendapatan.
Film apa saja yang termasuk dalam Top 5 film terlaris berdasarkan jumlah rental di negara-negara ASEAN?
Bagaimana distribusi genre film yang paling banyak diminati oleh pelanggan di kawasan ASEAN?
Bagaimana performa toko (store) di wilayah ASEAN berdasarkan jumlah pelanggan, jumlah transaksi, dan market share (kontribusi) masing-masing negara ASEAN terhadap total rental film?
Bagaimana jumlah pendapatan dari setiap negara di ASEAN
# Persiapan dan import data
library(DBI)
library(odbc)
library(dplyr)
library(ggplot2)
library(RMySQL)
library(knitr)
con2 = dbConnect(odbc(),
Driver = "MySQL ODBC 8.0 ANSI Driver",
SERVER = "127.0.0.1",
UID = "root",
PWD = "tata230207",
Port = 3306,
database = "sakila")
dbIsValid(con2)## [1] TRUE
datafilm = dbGetQuery(con2,"SELECT f.title AS judul_film, COUNT(r.rental_id) AS total_rental
FROM country co
JOIN city ci ON co.country_id = ci.country_id
JOIN address a ON ci.city_id = a.city_id
JOIN customer c ON a.address_id = c.address_id
JOIN rental r ON c.customer_id = r.customer_id
JOIN inventory i ON r.inventory_id = i.inventory_id
JOIN film f ON i.film_id = f.film_id
WHERE co.country IN (
'Indonesia','Malaysia','Singapore',
'Thailand','Philippines','Vietnam',
'Brunei','Cambodia','Laos','Myanmar')
GROUP BY f.title
ORDER BY total_rental DESC")
top5 <- head(datafilm, 5)
print(top5)## judul_film total_rental
## 1 STRANGELOVE DESIRE 7
## 2 SUSPECTS QUILLS 6
## 3 OPERATION OPERATION 6
## 4 HORN WORKING 6
## 5 CROOKED FROGMEN 6
datagenre = dbGetQuery(con2, "SELECT cat.name AS Genre, COUNT(r.rental_id) AS Total_Rental
FROM country co
JOIN city ci ON co.country_id = ci.country_id
JOIN address a ON ci.city_id = a.city_id
JOIN customer c ON a.address_id = c.address_id
JOIN rental r ON c.customer_id = r.customer_id
JOIN inventory i ON r.inventory_id = i.inventory_id
JOIN film_category f ON i.film_id = f.film_id
JOIN category cat ON f.category_id = cat.category_id
WHERE co.country IN (
'Indonesia','Malaysia','Singapore',
'Thailand','Philippines','Vietnam',
'Brunei','Cambodia','Laos','Myanmar')
GROUP BY Genre
ORDER BY Total_Rental DESC")
print(datagenre)## Genre Total_Rental
## 1 Animation 113
## 2 Foreign 102
## 3 Family 100
## 4 Action 99
## 5 Drama 96
## 6 Sports 95
## 7 Comedy 91
## 8 Games 86
## 9 Sci-Fi 86
## 10 New 84
## 11 Children 84
## 12 Travel 80
## 13 Music 79
## 14 Documentary 79
## 15 Classics 78
## 16 Horror 76
con2 = dbConnect(odbc(),
Driver = "MySQL ODBC 8.0 ANSI Driver",
SERVER = "127.0.0.1",
UID = "root",
PWD = "tata230207",
Port = 3306,
database = "sakila")
tabelperforma = dbGetQuery(con2, "SELECT co.country, COUNT(DISTINCT cu.customer_id) AS jumlah_pelanggan,
COUNT(r.rental_id) AS jumlah_transaksi,
ROUND(COUNT(r.rental_id) * 1.0 / COUNT(DISTINCT cu.customer_id), 2) AS rata_transaksi_per_pelanggan,
CONCAT(ROUND(COUNT(r.rental_id) * 100.0 / SUM(COUNT(r.rental_id)) OVER(), 2), '%') AS market_share
FROM country co
JOIN city ci ON co.country_id = ci.country_id
JOIN address a ON ci.city_id = a.city_id
JOIN customer cu ON a.address_id = cu.address_id
JOIN rental r ON cu.customer_id = r.customer_id
WHERE co.country IN (
'Indonesia','Malaysia','Singapore',
'Thailand','Philippines','Vietnam',
'Brunei','Cambodia','Laos','Myanmar'
)
GROUP BY co.country
ORDER BY jumlah_transaksi DESC")
print(tabelperforma)## country jumlah_pelanggan jumlah_transaksi rata_transaksi_per_pelanggan
## 1 Philippines 20 568 28.40
## 2 Indonesia 14 367 26.21
## 3 Vietnam 6 172 28.67
## 4 Thailand 3 96 32.00
## 5 Malaysia 3 85 28.33
## 6 Cambodia 2 53 26.50
## 7 Myanmar 2 52 26.00
## 8 Brunei 1 35 35.00
## market_share
## 1 39.78%
## 2 25.70%
## 3 12.04%
## 4 6.72%
## 5 5.95%
## 6 3.71%
## 7 3.64%
## 8 2.45%
datapendapatan = dbGetQuery(con2,"SELECT co.country, SUM(p.amount) AS total_Pendapatan
FROM country co
JOIN city ci ON co.country_id = ci.country_id
JOIN address a ON ci.city_id = a.city_id
JOIN customer c ON a.address_id = c.address_id
JOIN payment p ON c.customer_id = p.customer_id
WHERE co.country IN (
'Indonesia','Malaysia','Singapore',
'Thailand','Philippines','Vietnam',
'Brunei','Cambodia','Laos','Myanmar'
)
GROUP BY co.country
ORDER BY total_Pendapatan DESC")
print(datapendapatan)## country total_Pendapatan
## 1 Philippines 2381.32
## 2 Indonesia 1510.33
## 3 Vietnam 746.28
## 4 Thailand 419.04
## 5 Malaysia 369.15
## 6 Myanmar 194.48
## 7 Cambodia 191.47
## 8 Brunei 113.65
ggplot(top5, aes(x = judul_film, y = total_rental, fill = judul_film)) +
geom_bar(stat = "identity") +
scale_x_discrete(expand = expansion(add = c(0.8, 0.5))) +
scale_fill_manual(values =c("#1b4332", "#2d6a4f", "#40916c"
,"#52b788", "#74c69d")) +
labs(title = "Top 5 Film Terlaris di Negara ASEAN ",
x = "Judul Film",
y = "Jumlah Rental") +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 50, hjust = 1,vjust = 1, family = "Sans", size = 40, face = "bold"),
axis.text.y = element_text(family = "Sans", size = 40, face ="bold"),
plot.title = element_text(size = 50, face = "bold"),
axis.title.x = element_text(size = 46, face = "bold"),
axis.title.y = element_text(size = 46, face = "bold"),
legend.position = "none")ggplot(datagenre, aes(x = reorder(Genre, Total_Rental), y = Total_Rental, fill = Total_Rental)) +
geom_bar(stat = "identity")+
scale_fill_gradient(low = "#d8f3dc", high = "#1b4332") +
coord_flip() +
labs(title = "Genre Film Favourite di Negara ASEAN",
x = "Genre",
y = "Total Rental") +
theme_minimal()+
theme(
axis.text.x = element_text(family = "Sans", size = 40, face = "bold"),
axis.text.y = element_text(family = "Sans", size = 40, face ="bold"),
plot.title = element_text(size = 40, face = "bold"),
axis.title.x = element_text(size = 46, face = "bold"),
axis.title.y = element_text(size = 46, face = "bold"),
legend.position = "none")ggplot(datapendapatan, aes(x = reorder(country, total_Pendapatan), y = total_Pendapatan, fill = country)) +
geom_bar(stat = "identity") +
geom_text(aes(label = paste0("$", total_Pendapatan)), size=14, vjust= -0.5)+
scale_fill_manual(values =c("#1b4332", "#2d6a4f", "#40916c",
"#52b788", "#74c69d", "#95d5b2", "#b7e4c7", "#d8f3dc")) +
labs(title = "Total Pendapatan Setiap Negara ASEAN",
x = "Negara",
y = "Total Pendapatan (USD)") +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 50, hjust = 1,vjust = 1, family = "Sans", size = 40, face = "bold"),
axis.text.y = element_blank(),
plot.title = element_text(size = 50, face = "bold"),
axis.title.x = element_text(size = 46, face = "bold"),
axis.title.y = element_text(size = 46, face = "bold"),
legend.position = "none")Dalam perhitungan market share menggunakan rumus sebagai berikut: \[ \text{Market Share} = \frac{\text{Total Rental Negara}_i}{\sum_{i=1}^{n} \text{Total Rental Negara}_i} \times 100\% \]
knitr::kable(tabelperforma,
caption = "Tabel Peforma Toko di Wilayah Asean",
col.names = c("Negara", "Jumlah Pelanggan", "Jumlah Transaksi", "Rata Rata Transaksi", "Market Share"),
align = "lccccc")| Negara | Jumlah Pelanggan | Jumlah Transaksi | Rata Rata Transaksi | Market Share |
|---|---|---|---|---|
| Philippines | 20 | 568 | 28.40 | 39.78% |
| Indonesia | 14 | 367 | 26.21 | 25.70% |
| Vietnam | 6 | 172 | 28.67 | 12.04% |
| Thailand | 3 | 96 | 32.00 | 6.72% |
| Malaysia | 3 | 85 | 28.33 | 5.95% |
| Cambodia | 2 | 53 | 26.50 | 3.71% |
| Myanmar | 2 | 52 | 26.00 | 3.64% |
| Brunei | 1 | 35 | 35.00 | 2.45% |
Berdasarkan diagram batang di atas, STRANGELOVE DESIRE merupakan film dengan jumlah rental tertinggi di kawasan ASEAN dengan total 7 rental, sementara CROOKED FROGMEN, HORN WORKING, OPERATION OPERATION, dan SUSPECTS QUILLS masing-masing memiliki 6 rental. Secara keseluruhan, perbedaan jumlah rental antar film tidak terlalu signifikan, berkisar antara 6–7 rental. Hal ini mengindikasikan bahwa preferensi penonton di kawasan ASEAN terhadap kelima film tersebut relatif merata dan tidak ada dominasi yang mencolok dari satu film tertentu.
Berdasarkan diagram batang horizontal di atas, Animation menjadi genre film yang paling banyak disewa di kawasan ASEAN dengan total rental mendekati 100 rental, diikuti oleh Foreign dan Family yang juga mencatatkan angka rental sangat tinggi di kisaran 93–95 rental. Genre Action, Drama, dan Sports turut masuk dalam kelompok genre populer dengan jumlah rental yang tidak jauh berbeda, menunjukkan bahwa film-film bergenre dinamis dan penuh aksi memiliki daya tarik yang kuat di kalangan pelanggan ASEAN.
Di sisi lain, genre Horror tercatat sebagai genre dengan jumlah rental paling rendah, yaitu sekitar 65 rental, disusul oleh Classics dan Documentary yang berada di kisaran yang sama. Meskipun demikian, perbedaan antara genre tertinggi dan terendah tidak terlampau jauh, yakni sekitar 30 rental, yang menunjukkan bahwa seluruh genre film masih memiliki peminatnya masing-masing di kawasan ASEAN.
Secara keseluruhan, dapat disimpulkan bahwa pelanggan di kawasan ASEAN memiliki preferensi yang cukup beragam terhadap berbagai genre film. Namun, genre Animation mendominasi sebagai genre favorit, kemungkinan karena daya tariknya yang universal dan dapat dinikmati oleh berbagai kalangan usia.
Berdasarkan diagram di atas, Philippines mencatatkan total pendapatan tertinggi di kawasan ASEAN dengan nilai mencapai sekitar 2.400, jauh melampaui negara-negara lainnya. Indonesia berada di posisi kedua dengan total pendapatan sekitar 1.500, diikuti Vietnam di posisi ketiga sekitar 750. Sementara itu, Brunei menjadi negara dengan total pendapatan terendah, hanya sekitar 100. Kesenjangan yang cukup besar antara Philippines dan negara-negara lainnya mengindikasikan bahwa Philippines merupakan pasar rental film terbesar dan paling potensial di kawasan ASEAN.