1.Eksplorasi Data Awal

data("lego_sales")
str(lego_sales)
## spc_tbl_ [620 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ first_name  : chr [1:620] "Kimberly" "Neel" "Neel" "Chelsea" ...
##  $ last_name   : chr [1:620] "Beckstead" "Garvin" "Garvin" "Bouchard" ...
##  $ age         : num [1:620] 24 35 35 41 41 41 19 19 37 37 ...
##  $ phone_number: chr [1:620] "216-555-2549" "819-555-3189" "819-555-3189" NA ...
##  $ set_id      : num [1:620] 24701 25626 24665 24695 25626 ...
##  $ number      : chr [1:620] "76062" "70595" "21031" "31048" ...
##  $ theme       : chr [1:620] "DC Comics Super Heroes" "Ninjago" "Architecture" "Creator" ...
##  $ subtheme    : chr [1:620] "Mighty Micros" "Rise of the Villains" NA NA ...
##  $ year        : num [1:620] 2018 2018 2018 2018 2018 ...
##  $ name        : chr [1:620] "Robin vs. Bane" "Ultra Stealth Raider" "Burj Khalifa" "Lakeside Lodge" ...
##  $ pieces      : num [1:620] 77 1093 333 368 1093 ...
##  $ us_price    : num [1:620] 9.99 119.99 39.99 29.99 119.99 ...
##  $ image_url   : chr [1:620] "http://images.brickset.com/sets/images/76062-1.jpg" "http://images.brickset.com/sets/images/70595-1.jpg" "http://images.brickset.com/sets/images/21031-1.jpg" "http://images.brickset.com/sets/images/31048-1.jpg" ...
##  $ quantity    : num [1:620] 1 1 1 1 1 1 1 3 1 2 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 14
##   .. ..$ first_name  : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ last_name   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ age         : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ phone_number: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ set_id      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ number      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ theme       : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ subtheme    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ year        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ name        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ pieces      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ us_price    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ image_url   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ quantity    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ skip   : num 1
##   ..- attr(*, "class")= chr "col_spec"
summary(lego_sales)
##   first_name         last_name              age        phone_number      
##  Length:620         Length:620         Min.   :16.00   Length:620        
##  Class :character   Class :character   1st Qu.:25.00   Class :character  
##  Mode  :character   Mode  :character   Median :33.00   Mode  :character  
##                                        Mean   :34.36                     
##                                        3rd Qu.:41.00                     
##                                        Max.   :68.00                     
##                                                                          
##      set_id         number             theme             subtheme        
##  Min.   :24548   Length:620         Length:620         Length:620        
##  1st Qu.:24725   Class :character   Class :character   Class :character  
##  Median :24805   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :25125                                                           
##  3rd Qu.:25640                                                           
##  Max.   :26060                                                           
##                                                                          
##       year          name               pieces          us_price     
##  Min.   :2018   Length:620         Min.   :  13.0   Min.   :  3.99  
##  1st Qu.:2018   Class :character   1st Qu.:  70.0   1st Qu.:  9.99  
##  Median :2018   Mode  :character   Median : 114.0   Median : 19.99  
##  Mean   :2018                      Mean   : 254.2   Mean   : 29.04  
##  3rd Qu.:2018                      3rd Qu.: 313.0   3rd Qu.: 29.99  
##  Max.   :2018                      Max.   :4634.0   Max.   :349.99  
##                                    NA's   :69                       
##   image_url            quantity    
##  Length:620         Min.   :1.000  
##  Class :character   1st Qu.:1.000  
##  Mode  :character   Median :1.000  
##                     Mean   :1.437  
##                     3rd Qu.:2.000  
##                     Max.   :5.000  
## 
sum(is.na(lego_sales))
## [1] 392
lego_sales <- na.omit(lego_sales)
lego_sales <- unique(lego_sales)

2.Visualisasi Data

  1. 10 Customer dengan Jumlah Transaksi Terbanyak
set.seed(123)
lego_sales$Customer <- sample(paste("Customer", 1:50), nrow(lego_sales), replace = TRUE)

top_customers <- lego_sales %>%
  count(Customer, sort = TRUE) %>%
  slice_max(n, n = 10)

ggplot(top_customers, aes(x = reorder(Customer, n), y = n)) +
  geom_col(fill = "pink4") +
  coord_flip() +
  labs(title = "Top 10 Customer Berdasarkan Jumlah Transaksi (Simulasi)", x = "Customer", y = "Jumlah Transaksi")

LEGO tidak hanya mainan, tapi juga nostalgia. Tema-tema populer seperti Star Wars dan Harry Potter menarik konsumen lintas generasi, menciptakan gelombang pembelian yang konsisten.

  1. 10 Tema LEGO Terpopuler Berdasarkan Penjualan
top_themes <- lego_sales %>%
  group_by(theme) %>%
  summarise(Total = sum(quantity)) %>%
  slice_max(Total, n = 10)

ggplot(top_themes, aes(x = reorder(theme, Total), y = Total)) +
  geom_col(fill = "plum3") +
  coord_flip() +
  labs(title = "Top 10 Tema LEGO Terlaris", x = "Tema", y = "Jumlah Terjual")

LEGO bertema Star Wars jelas menjadi juara di hati para penggemar, dengan jumlah penjualan yang melesat jauh dibandingkan tema lainnya. Diikuti oleh City dan Mixels, data ini menunjukkan bahwa kombinasi antara dunia fantasi dan kehidupan sehari-hari berhasil menarik minat pasar. Keberadaan tema superhero seperti DC dan Marvel juga mengindikasikan kekuatan budaya pop dalam mendorong penjualan. LEGO tampaknya tahu betul bagaimana menggabungkan imajinasi, petualangan, dan tren global ke dalam setiap keping mainannya.

  1. Sebaran Jumlah Pieces dan Harga
ggplot(lego_sales, aes(x = pieces, y = us_price)) +
  geom_point(alpha = 0.5, color = "palevioletred2", size = 3) +
  labs(title = "Sebaran Jumlah Pieces vs Harga", x = "Pieces", y = "Harga") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 10, face = "bold"),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 12)
  )

Semakin banyak jumlah pieces dalam satu set LEGO, umumnya harga juga ikut meningkat. Namun, terlihat beberapa outlier—set dengan pieces sangat banyak tapi harga jauh lebih tinggi dari tren umum—yang kemungkinan berasal dari seri eksklusif atau koleksi khusus. Hal ini menegaskan bahwa selain jumlah keping, nilai tema dan kompleksitas desain juga memainkan peran penting dalam menentukan harga LEGO.

  1. Komposisi Penjualan Berdasarkan Usia
set.seed(123) 
lego_sales$Age <- sample(10:50, nrow(lego_sales), replace = TRUE)

lego_sales$Age_Group <- cut(
  lego_sales$Age,
  breaks = c(10, 20, 30, 40, 50),
  labels = c("10-19", "20-29", "30-39", "40-49"),
  right = FALSE
)
library(ggplot2)

ggplot(lego_sales, aes(x = Age_Group)) +
  geom_bar(fill = "plum2") +
  labs(
    title = "Komposisi Penjualan Berdasarkan Kelompok Usia",
    x = "Kelompok Usia",
    y = "Jumlah Transaksi"
  ) +
  theme_minimal()

LEGO bukan lagi sekadar mainan anak-anak—grafik ini membuktikan bahwa justru usia 30–39 tahun mendominasi pembelian. Generasi ini, yang tumbuh bersama LEGO, kini kembali merakit set impian mereka sebagai bentuk nostalgia dan hobi yang serius. Dengan daya beli yang lebih besar, mereka menjadikan LEGO bukan hanya permainan, tapi juga pelarian kreatif dan koleksi berharga di usia dewasa.

  1. Heatmap Korelasi Antar Variabel Numerik
set.seed(123) 
num_data <- lego_sales %>%
  select(pieces, us_price, quantity, age)  

cor_matrix <- cor(num_data)
ggcorrplot(cor_matrix,
           lab = TRUE,
           type = "upper",
           colors = c("skyblue", "snow2", "pink1"),
           title = "Heatmap Korelasi Variabel Numerik")

Heatmap ini memperlihatkan bahwa harga LEGO sangat dipengaruhi oleh jumlah keping dalam satu set, dengan korelasi kuat sebesar 0,94—semakin banyak pieces, semakin mahal harganya. Menariknya, variabel lain seperti usia dan jumlah transaksi justru tidak memiliki hubungan berarti. Temuan ini menegaskan bahwa nilai sebuah set LEGO tidak ditentukan oleh siapa yang membelinya atau seberapa sering, tetapi oleh kompleksitas dan skala bangunan yang ditawarkannya. LEGO benar-benar menjual pengalaman merakit, bukan sekadar mainan.