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
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.
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.
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.
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.
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.