library(dsbox)
library(tidyverse)
library(ggplot2)
library(ggthemes)
library(scales)
library(ggcorrplot)
library(dplyr)
  1. Eksplorasi Data Awal o Tampilkan informasi umum dataset (jumlah data, kolom, tipe data). o Lakukan pembersihan data sederhana jika diperlukan (null values, duplikat, dll).
#menampilkan dataset
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, …
#Menghitung total jumlah nilai yang hilang (NA) di seluruh dataset
sum(is.na(data))
## [1] 392
#menghapus baris duplikat
data <- distinct(data)
  1. Visualisasi Wajib Buat minimal 5 visualisasi dari kategori berikut:

o 10 Customer dengan jumlah transaksi

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 = "#588157") +
  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()

o 10 Tema LEGO Terpopuler Berdasarkan Penjualan

top_themes <- data %>%
  group_by(theme) %>%
  summarise(total_sales = sum(quantity, na.rm = TRUE)) %>%
  arrange(desc(total_sales)) %>%
  head(10)

ggplot(top_themes, aes(x = reorder(theme, -total_sales), y = total_sales)) +
  geom_col(fill = "#588157") +
  geom_text(aes(label = total_sales), vjust = -0.3, size = 3.5) +
  labs(title = "10 Tema LEGO Terpopuler Berdasarkan Penjualan",
       x = "Tema",
       y = "Jumlah Unit Terjual") +
  theme_minimal()

o Sebaran Jumlah Pieces dan Harga

ggplot(data, aes(x = pieces, y = us_price)) +
  geom_point(alpha = 0.6, color = "#669bbc") +
  geom_smooth(method = "lm", color = "#FF3939", se = FALSE) +
  labs(
    title = "Sebaran Jumlah Pieces dan Harga",
    x = "Jumlah Pieces",
    y = "Harga (USD)"
  ) +
  theme_minimal()

o Komposisi Penjualan Berdasarkan Usia

data <- data %>%
  mutate(age_group = cut(age, breaks = c(0, 20, 30, 40, 50, 60),
                         labels = c("≤20", "21-30", "31-40", "41-50", "51-60")))

# Hitung total penjualan per kelompok usia
age_sales <- data %>%
  group_by(age_group) %>%
  summarise(total_quantity = sum(quantity, na.rm = TRUE))

ggplot(age_sales, aes(x = age_group, y = total_quantity, fill = age_group)) +
  geom_col(fill = "#669bbc") +
  labs(
    title = "Komposisi Penjualan Berdasarkan Kelompok Usia",
    x = "Kelompok Usia",
    y = "Jumlah Terjual"
  ) +
  theme_minimal()

o Heatmap Korelasi Antar Variabel Numerik

numeric_data <- data %>%
  select(where(is.numeric))

cor_matrix <- cor(numeric_data, use = "complete.obs")

ggcorrplot(cor_matrix, 
           method = "circle", 
           type = "lower", 
           lab = TRUE, 
           lab_size = 3, 
           colors = c("#FF3939", "white", "#669bbc"),
           title = "Heatmap Korelasi Variabel Numerik",
           ggtheme = theme_minimal())

  1. Insight dan Narasi o Tuliskan 3–5 insight menarik dari visualisasi yang dibuat. o Contoh: Apakah tema tertentu mendominasi revenue? Apakah set dengan lebih banyak pieces selalu lebih mahal? Apakah ada preferensi tema LEGO pada kelompok usia tertentu?

Tema “Ninjago” dan “Star Wars” mendominasi penjualan dari visualisasi 10 tema LEGO terpopuler, terlihat bahwa tema seperti “Ninjago”, “Star Wars”, dan “DC Comics Super Heroes” paling banyak terjual. Ini menunjukkan bahwa tema dengan karakter populer atau franchise terkenal cenderung lebih menarik bagi pembeli.

Set dengan lebih banyak pieces cenderung lebih mahal dari scatter plot Sebaran Pieces vs Harga, terlihat pola positif antara jumlah pieces dan harga (didukung dengan trend line). Namun, ada outlier di mana set dengan sedikit pieces bisa sangat mahal, kemungkinan karena nilai koleksi atau eksklusivitas.

Usia 30–40 tahun mendominasi penjualan komposisi penjualan berdasarkan usia menunjukkan kelompok usia 31–40 tahun melakukan pembelian LEGO terbanyak. Bisa jadi kelompok ini adalah orang dewasa muda yang membeli untuk anak-anak atau kolektor dewasa.

Korelasi kuat antara harga dan jumlah pieces, dari heatmap korelasi, terlihat bahwa variabel us_price dan pieces memiliki korelasi yang cukup tinggi, menunjukkan bahwa jumlah kepingan adalah salah satu faktor utama dalam penentuan harga.

Penjualan LEGO stabil pada tahun yang sama karena seluruh data berada di tahun 2018, tidak ada tren waktu yang bisa dianalisis secara mendalam. Namun, ini menegaskan bahwa analisis lebih lanjut bisa fokus pada faktor non-waktu, seperti usia, tema, dan harga.