Library

library(dsbox)
library(dplyr)
library(ggplot2)
library(scales)
library(data.table)
library(tidyr)
library(dplyr)
library(skimr)
data("lego_sales")

Nomor 1

  1. Informasi Umum Dataset
dim(lego_sales)
## [1] 620  14

Dataset terdiri dari 470 baris (data transaksi) dan 16 kolom (variabel).

glimpse(lego_sales)
## 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, …

Dataset memuat berbagai tipe data:

Character: seperti first_name, last_name, theme, CustomerID, dll.

Numeric: seperti age, set_id, pieces, us_price, quantity.

Factor: hanya AgeGroup, dengan 4 kategori (Dewasa Muda, Dewasa, Lanjut Usia, Remaja).

skim(lego_sales)
Data summary
Name lego_sales
Number of rows 620
Number of columns 14
_______________________
Column type frequency:
character 8
numeric 6
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
first_name 0 1.00 2 10 0 211 0
last_name 0 1.00 2 17 0 229 0
phone_number 92 0.85 12 12 0 213 0
number 0 1.00 5 10 0 258 0
theme 0 1.00 4 23 0 25 0
subtheme 172 0.72 3 34 0 64 0
name 0 1.00 3 41 0 257 0
image_url 59 0.90 50 55 0 234 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
age 0 1.00 34.36 11.28 16.00 25.00 33.00 41.00 68.00 ▇▇▇▃▁
set_id 0 1.00 25124.98 506.76 24548.00 24724.75 24804.50 25640.25 26060.00 ▇▂▁▂▃
year 0 1.00 2018.00 0.00 2018.00 2018.00 2018.00 2018.00 2018.00 ▁▁▇▁▁
pieces 69 0.89 254.21 357.74 13.00 70.00 114.00 313.00 4634.00 ▇▁▁▁▁
us_price 0 1.00 29.04 34.63 3.99 9.99 19.99 29.99 349.99 ▇▁▁▁▁
quantity 0 1.00 1.44 0.71 1.00 1.00 1.00 2.00 5.00 ▇▃▁▁▁

Berdasarkan hasil eksplorasi data, sebagian besar variabel bertipe karakter seperti first_name, last_name, number, theme, dan name memiliki data yang lengkap tanpa nilai kosong. Namun, phone_number dan subtheme memiliki tingkat kelengkapan yang rendah, masing-masing hanya 85% dan 72%, sehingga perlu diperhatikan jika digunakan dalam analisis lebih lanjut. Variabel image_url juga memiliki beberapa data kosong, tapi masih cukup lengkap (90%).

Untuk variabel numerik, sebagian besar data lengkap, kecuali pieces yang memiliki 69 nilai kosong. Rata-rata usia pelanggan adalah 34 tahun, mencakup rentang usia 16–68 tahun. Semua data tercatat hanya untuk tahun 2018. Set LEGO memiliki rata-rata 254 keping, namun terdapat variasi besar hingga lebih dari 4000 keping. Harga berkisar antara $3.99 hingga $349.99, dengan rata-rata $29, mencerminkan variasi produk dari standar hingga premium. Rata-rata pembelian adalah 1,44 unit per transaksi, menunjukkan kebanyakan pelanggan membeli satu set saja per transaksi.

  1. Pembersihan Data
lego_sales <- lego_sales %>%
  group_by(theme) %>%
  mutate(pieces = ifelse(is.na(pieces), median(pieces, na.rm = TRUE), pieces)) %>%
  ungroup() %>%
  mutate(
    subtheme = ifelse(is.na(subtheme), "Unknown", subtheme),
    image_url = ifelse(is.na(image_url), "Missing", image_url),
    phone_number = ifelse(is.na(phone_number), "Not Provided", phone_number)
  ) %>%
  dplyr::filter(!is.na(pieces)) 

colSums(is.na(lego_sales))
##   first_name    last_name          age phone_number       set_id       number 
##            0            0            0            0            0            0 
##        theme     subtheme         year         name       pieces     us_price 
##            0            0            0            0            0            0 
##    image_url     quantity 
##            0            0

Hasil pembersihan data menunjukkan bahwa seluruh variabel dalam dataset lego_sales telah bersih sepenuhnya dari nilai hilang (NA). Hal ini menandakan bahwa dataset memiliki kualitas yang baik dan siap digunakan untuk analisis lebih lanjut tanpa perlu penanganan tambahan terkait kelengkapan data. Dengan kondisi data yang lengkap, proses analisis dapat dilakukan secara lebih akurat dan efisien,

sum(duplicated(lego_sales))
## [1] 0

Berdasarkan hasil fungsi sum(duplicated(lego_sales)) yang menghasilkan nilai 0, dapat disimpulkan bahwa tidak terdapat data ganda (duplikasi) dalam dataset lego_sales. Hal ini menunjukkan bahwa setiap baris data bersifat unik dan tidak ada pengulangan entri yang dapat menyebabkan bias atau redundansi dalam analisis. Dengan demikian, integritas data terjaga dengan baik, sehingga analisis yang dilakukan selanjutnya akan lebih valid dan dapat diandalkan.

Nomor 2

  1. Visualisasi 10 customer dengan jumlah transaksi terbanyak

Visualisasi menunjukkan sepuluh pelanggan dengan jumlah transaksi terbanyak dalam dataset. Sembilan dari sepuluh pelanggan teratas tercatat melakukan masing-masing sebanyak 5 transaksi, di antaranya adalah Jackson_Dominguez, Josie_Paley, dan Abraham_Medlock. Hanya satu pelanggan, yaitu Alina_Calerich, yang mencatatkan 4 transaksi. Distribusi ini menunjukkan bahwa tidak terdapat perbedaan signifikan dalam frekuensi transaksi antar pelanggan teratas, yang mengindikasikan pola pembelian yang cukup seragam di antara pelanggan paling aktif. Situasi ini membuka peluang bagi perusahaan untuk mengembangkan strategi retensi melalui program loyalitas atau personalisasi penawaran, guna mendorong peningkatan transaksi lebih lanjut dari pelanggan-pelanggan potensial ini.

  1. 10 Tema LEGO Terpopuler Berdasarkan Penjualan
top_themes <- lego_sales %>%
  group_by(theme) %>%
  summarise(TotalSales = sum(quantity, na.rm = TRUE)) %>%
  arrange(desc(TotalSales)) %>%
  slice_head(n = 10)

ggplot(top_themes, aes(x = reorder(theme, TotalSales), y = TotalSales)) +
  geom_col(fill = "darkorange") +
  coord_flip() +
  labs(title = "10 Tema LEGO dengan Penjualan Terbanyak",
        x = "Tema LEGO", y = "Total Jumlah Terjual") +
    theme_minimal()

Visualisasi menunjukkan sepuluh tema LEGO dengan jumlah penjualan terbanyak dalam dataset yang dianalisis. Tema Star Wars menempati posisi teratas sebagai tema paling laris, diikuti oleh Nexo Knights dan Mixels. Tema-tema populer lainnya seperti City, Ninjago, dan Friends juga menempati posisi lima besar. Perbedaan jumlah penjualan antar tema terlihat cukup signifikan, menunjukkan adanya preferensi konsumen terhadap tema tertentu. Hal ini dapat menjadi dasar dalam pengambilan keputusan pemasaran atau pengembangan produk, dengan fokus pada tema yang memiliki permintaan tinggi.

  1. Sebaran Jumlah Pieces dan Harga
ggplot(lego_sales, aes(x = pieces, y = us_price)) +
  geom_point(alpha = 0.6, color = "#FFC300") +
  geom_smooth(method = "lm", se = FALSE, color = "darkorange", linewidth = 1) + 
  labs(title = "Sebaran Jumlah Unit vs Harga LEGO",
       x = "Jumlah Unit", y = "Harga (USD)") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Berdasarkan scatter plot yang menampilkan hubungan antara jumlah keping dan harga produk LEGO, terlihat bahwa secara umum terdapat pola hubungan positif antara keduanya. Produk dengan jumlah keping yang lebih banyak cenderung memiliki harga yang lebih tinggi. Meskipun demikian, penyebaran data menunjukkan adanya beberapa outlier, yaitu produk dengan jumlah keping sangat tinggi namun tidak selalu memiliki harga yang proporsional, dan sebaliknya. Hal ini mengindikasikan bahwa selain jumlah keping, terdapat faktor-faktor lain seperti lisensi tema, kompleksitas desain, atau kelangkaan produk yang turut memengaruhi harga LEGO.

  1. Komposisi Penjualan Berdasarkan Usia
lego_sales <- lego_sales %>%
  mutate(KelompokUsia = cut(age, breaks = c(0, 12, 18, 35, 50, 100),
                            labels = c("Anak", "Remaja", "Dewasa Muda", "Dewasa", "Lansia")))

penjualan_usia <- lego_sales %>%
  filter(!is.na(KelompokUsia)) %>%
  group_by(KelompokUsia) %>%
  summarise(JumlahPenjualan = sum(quantity, na.rm = TRUE)) %>%
  mutate(Persentase = round(JumlahPenjualan / sum(JumlahPenjualan) * 100, 1),
         Label = paste0(Persentase, "%"))

ggplot(penjualan_usia, aes(x = "", y = JumlahPenjualan, fill = KelompokUsia)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  geom_text(aes(label = Label), 
            position = position_stack(vjust = 0.5), 
            size = 2.5) +
  labs(title = "Komposisi Penjualan Berdasarkan Kelompok Usia",
       fill = "Kelompok Usia") +
  theme_void() +
  theme(legend.position = "right")

Berdasarkan visualisasi pie chart, kelompok usia Dewasa Muda merupakan penyumbang penjualan terbesar dalam dataset, diikuti oleh kelompok Dewasa. Sementara itu, kelompok Lansia dan Remaja memberikan kontribusi yang relatif lebih kecil terhadap total penjualan. Hal ini menunjukkan bahwa produk LEGO dalam dataset ini paling banyak dibeli oleh konsumen usia produktif, khususnya dewasa muda, yang kemungkinan memiliki daya beli yang lebih stabil. Temuan ini dapat menjadi acuan dalam penentuan strategi pemasaran, seperti penyesuaian pesan promosi atau segmentasi pasar yang lebih tepat sasaran.

  1. Heatmap Korelasi Antar Variabel Numerik
num_vars <- lego_sales %>% select(where(is.numeric))
num_vars <- num_vars %>% select(where(~ var(., na.rm = TRUE) != 0))
cor_matrix <- round(cor(num_vars, use = "complete.obs"), 2)
melted_cor <- as.data.frame(cor_matrix) %>%
  tibble::rownames_to_column(var = "Var1") %>%
  pivot_longer(-Var1, names_to = "Var2", values_to = "value")

ggplot(melted_cor, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white",
                       midpoint = 0, limit = c(-1, 1), name = "Korelasi") +
  labs(title = "Heatmap Korelasi Variabel Numerik", x = "", y = "") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

Berdasarkan heatmap korelasi variabel numerik, terlihat bahwa terdapat korelasi positif yang cukup kuat antara jumlah keping (pieces) dan harga produk (us_price), yang mengindikasikan bahwa produk LEGO dengan lebih banyak keping cenderung memiliki harga lebih tinggi. Selain itu, terdapat korelasi lemah antara variabel lain seperti usia (age) dan jumlah pembelian (quantity), yang menunjukkan bahwa faktor-faktor tersebut tidak memiliki hubungan signifikan satu sama lain. Secara keseluruhan, korelasi antar variabel dalam dataset cenderung rendah, kecuali pada hubungan antara jumlah keping dan harga yang paling menonjol.

Nomor 3

  1. Visualisasi 1

Berdasarkan visualisasi, terlihat bahwa sepuluh pelanggan teratas dalam dataset memiliki jumlah transaksi yang relatif seragam. Sembilan dari sepuluh pelanggan tersebut, termasuk Jackson_Dominguez, Josie_Paley, dan Abraham_Medlock, tercatat melakukan masing-masing sebanyak lima transaksi. Satu-satunya pengecualian adalah Alina_Calerich yang mencatatkan empat transaksi. Distribusi ini menunjukkan bahwa tidak terdapat perbedaan mencolok dalam intensitas transaksi antar pelanggan paling aktif, yang mengindikasikan pola pembelian yang cukup konsisten. Temuan ini dapat dimanfaatkan oleh perusahaan untuk merancang strategi retensi pelanggan, seperti program loyalitas atau pendekatan penawaran yang lebih personal, guna meningkatkan intensitas pembelian dari kelompok pelanggan potensial ini.

  1. Visualisasi 2

Dari sisi tema, Star Wars menjadi tema LEGO yang paling populer dengan jumlah penjualan tertinggi, diikuti oleh Nexo Knights dan Mixels. Tema-tema tersebut memiliki daya tarik kuat karena menyajikan konsep fiksi, petualangan, dan karakter yang sudah dikenal luas oleh masyarakat. Hal ini menandakan bahwa minat konsumen lebih condong pada tema yang memiliki nilai hiburan tinggi dan keterikatan emosional, terutama dari film atau serial terkenal.

  1. Visualisasi 3

Scatter plot menunjukkan adanya korelasi positif antara jumlah keping (pieces) dan harga LEGO (USD). Secara umum, semakin banyak jumlah keping yang dimiliki oleh satu set, maka harga LEGO tersebut cenderung lebih tinggi. Namun demikian, terdapat beberapa outlier seperti set dengan lebih dari 4000 keping yang memiliki harga jauh lebih tinggi dari set lainnya. Ini menunjukkan bahwa walaupun tren umum menunjukkan hubungan positif, ada juga faktor lain seperti edisi khusus atau eksklusivitas yang memengaruhi harga.

  1. Visualisasi 4

Berdasarkan pie chart komposisi penjualan berdasarkan kelompok usia, kelompok Dewasa Muda mendominasi jumlah pembelian LEGO dibandingkan kelompok usia lainnya. Ini menunjukkan bahwa LEGO tidak hanya diminati oleh anak-anak atau remaja, tetapi juga oleh orang dewasa muda yang mungkin membeli LEGO sebagai hobi, koleksi, atau aktivitas relaksasi. Segmen usia ini tampaknya menjadi pasar yang potensial untuk pengembangan strategi pemasaran LEGO ke depan.

  1. Visualisasi 5

Heatmap korelasi memperlihatkan bahwa terdapat hubungan yang cukup kuat antara jumlah keping (pieces) dan harga (us_price), serta antara quantity dengan set_id. Hal ini mengindikasikan bahwa banyaknya komponen dalam satu set cenderung berkaitan dengan harga yang ditetapkan. Sementara itu, variabel usia (age) tidak menunjukkan korelasi yang signifikan dengan variabel numerik lainnya, menandakan bahwa faktor usia pembeli tidak terlalu memengaruhi jumlah pembelian, harga produk, ataupun karakteristik set yang dibeli.