library(dsbox)
library(tidyverse)
library(ggplot2)
library(ggthemes)
library(scales)
library(ggcorrplot)

No 1

1. Eksplorasi Data Awal

Tampilkan informasi umum dataset (jumlah data, kolom, tipe data).
Lakukan pembersihan data sederhana jika diperlukan (null values, duplikat, dll).

Explorasi Data Awal

data <- lego_sales
glimpse(data)
## Rows: 620
## Columns: 14
## $ first_name   <chr> "Kimberly", "Neel", "Neel", "Chelsea", "Chelsea", "Chelse…
## $ last_name    <chr> "Beckstead", "Garvin", "Garvin", "Bouchard", "Bouchard", …
## $ age          <dbl> 24, 35, 35, 41, 41, 41, 19, 19, 37, 37, 19, 19, 20, 36, 3…
## $ phone_number <chr> "216-555-2549", "819-555-3189", "819-555-3189", NA, NA, N…
## $ set_id       <dbl> 24701, 25626, 24665, 24695, 25626, 24721, 24797, 24701, 2…
## $ number       <chr> "76062", "70595", "21031", "31048", "70595", "10831", "75…
## $ theme        <chr> "DC Comics Super Heroes", "Ninjago", "Architecture", "Cre…
## $ subtheme     <chr> "Mighty Micros", "Rise of the Villains", NA, NA, "Rise of…
## $ year         <dbl> 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 201…
## $ name         <chr> "Robin vs. Bane", "Ultra Stealth Raider", "Burj Khalifa",…
## $ pieces       <dbl> 77, 1093, 333, 368, 1093, 19, 233, 77, 108, NA, 13, 15, 6…
## $ us_price     <dbl> 9.99, 119.99, 39.99, 29.99, 119.99, 9.99, 24.99, 9.99, 9.…
## $ image_url    <chr> "http://images.brickset.com/sets/images/76062-1.jpg", "ht…
## $ quantity     <dbl> 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, …
sum(is.na(data))
## [1] 392
data <- distinct(data)

No 2

Visualisasi Wajib Buat minimal 5 visualisasi dari kategori berikut:

10 Customer dengan Jumlah Transaksi Terbanyak
10 Tema LEGO Terpopuler Berdasarkan Penjualan
Sebaran Jumlah Pieces dan Harga
Komposisi Penjualan Berdasarkan Usia
Heatmap Korelasi Antar Variabel Numerik
  1. 10 Customer dengan Jumlah Transaksi Terbanyak
top_customers <- data %>%
  group_by(first_name, last_name) %>%
  summarise(total_transactions = sum(quantity)) %>%
  arrange(desc(total_transactions)) %>%
  head(10)

ggplot(top_customers, aes(x = reorder(paste(first_name, last_name), total_transactions), y = total_transactions)) +
  geom_col(fill = "steelblue") +
  coord_flip() +
  geom_text(aes(label = total_transactions), hjust = -0.1) +
  labs(title = "10 Customer dengan Jumlah Transaksi Terbanyak", x = "Customer", y = "Jumlah Transaksi") +
  theme_minimal()

  1. 10 Tema LEGO Terpopuler Berdasarkan Penjualan
top_theme <- data %>%
  group_by(theme) %>%
  summarise(total_sales = sum(quantity)) %>%
  slice_max(total_sales, n = 10)

ggplot(top_theme, aes(x = reorder(theme, total_sales), y = total_sales)) +
  geom_col(fill = "darkorange") +
  coord_flip() +
  geom_text(aes(label = scales::comma(total_sales)), hjust = -0.1, size = 3) +
  labs(title = "10 Tema LEGO Terlaris", x = "", y = "Jumlah Terjual") +
  theme_minimal()

  1. Sebaran Jumlah Pieces dan Harga
ggplot(data, aes(x = pieces, y = us_price)) +
  geom_point(alpha = 0.6, color = "forestgreen", size = 2.5) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  coord_cartesian(xlim = c(0, 2000), ylim = c(0, 150)) +
  labs(
    title = "Hubungan Jumlah Pieces dan Harga LEGO Set",
    x = "Jumlah Pieces",
    y = "Harga (USD)"
  ) +
  theme_minimal()

  1. Komposisi Penjualan Berdasarkan Usia
data <- data %>%
  mutate(age_group = cut(age,
                         breaks = seq(0, 70, by = 10),
                         labels = c("0–9", "10–19", "20–29", "30–39", "40–49", "50–59", "60–69"),
                         right = FALSE))

age_sales <- data %>%
  group_by(age_group) %>%
  summarise(total_sales = sum(quantity)) %>%
  arrange(desc(total_sales))

ggplot(age_sales, aes(x = reorder(age_group, total_sales), y = total_sales)) +
  geom_col(fill = "skyblue") +
  coord_flip() +
  geom_text(aes(label = total_sales), hjust = -0.1, size = 3) +
  labs(title = "Komposisi Penjualan Berdasarkan Kelompok Usia",
       x = "Kelompok Usia", y = "Jumlah Terjual") +
  theme_minimal()

  1. Heatmap Korelasi Antar Variabel Numerik
numeric_vars <- data %>%
  select(age, pieces, us_price, quantity) %>%
  drop_na(age, pieces, us_price, quantity)

cor_matrix <- cor(numeric_vars)

ggcorrplot(cor_matrix, lab = TRUE, type = "lower",
           colors = c("red", "white", "blue")) +
  labs(title = "Korelasi Antar Variabel Numerik")

No 3

Insight dan Narasi

Tuliskan 3–5 insight menarik dari visualisasi yang dibuat.
Contoh: Apakah tema tertentu mendominasi revenue? Apakah set dengan lebih banyak pieces selalu lebih mahal? Apakah ada preferensi tema LEGO pada kelompok usia tertentu?
  1. Tema-Tema Populer Mendominasi Penjualan : Visualisasi tema LEGO terlaris menunjukkan bahwa beberapa tema seperti “City”, “Ninjago”, dan “Star Wars” mendominasi penjualan. Tema-tema ini umumnya memiliki dukungan dari media seperti serial televisi atau film, yang meningkatkan daya tariknya di kalangan pembeli. Dominasi tema populer ini menjadi bukti bahwa branding dan eksposur media sangat berpengaruh terhadap keputusan pembelian.

  2. Set dengan Jumlah Pieces Lebih Banyak Cenderung Lebih Mahal : Hubungan antara jumlah pieces dan harga menunjukkan korelasi positif yang sangat kuat (sekitar 0.94). Artinya, semakin kompleks dan besar suatu set (diukur dari banyaknya pieces), maka semakin mahal pula harganya. Ini menunjukkan bahwa ukuran dan kompleksitas produk menjadi faktor utama dalam penentuan harga LEGO.

  3. Usia Pembeli Tidak Signifikan Mempengaruhi Preferensi Produk : Analisis korelasi antar variabel numerik menunjukkan bahwa variabel usia tidak memiliki korelasi kuat terhadap jumlah pembelian, harga, atau jumlah pieces. Hal ini mengindikasikan bahwa produk LEGO diminati lintas usia, dan tidak ada kategori khusus yang dominan pada kelompok usia tertentu. Baik anak-anak maupun dewasa membeli berbagai jenis set LEGO.

  4. Dominasi Pembelian oleh Segelintir Pelanggan dan Produk : Visualisasi menunjukkan bahwa hanya segelintir pelanggan yang menyumbang volume transaksi terbanyak, serta hanya sedikit tema atau set yang menyumbang porsi besar dalam total penjualan. Ini menunjukkan adanya skew atau ketimpangan dalam distribusi penjualan, yang bisa dimanfaatkan untuk fokus retensi pelanggan atau restok produk unggulan.

  5. Kelompok Usia 20–29 Tahun Mendominasi Pembelian : Komposisi penjualan berdasarkan usia memperlihatkan bahwa kelompok usia 20–29 tahun menjadi pembeli terbanyak. Hal ini menarik karena LEGO sering diasosiasikan dengan anak-anak, namun data menunjukkan bahwa dewasa muda aktif membeli LEGO, baik untuk koleksi, hobi, maupun sebagai hadiah. Ini menjadi potensi strategi pemasaran yang lebih menyasar segmen dewasa muda.