## 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, …

1. Eksplorasi data awal

1.1 Tampilkan informasi umum dataset (jumlah data, kolom, tipe data).

1.2 Lakukan pembersihan data sederhana jika diperlukan (null values, duplikat, dll).

Jawaban:

1.1 Informasi umum

# Load dataset
dimensi <- dim(lego_sales)
jumlah_baris <- dimensi[1]
jumlah_kolom <- dimensi[2]
tipe_data <- sapply(lego_sales, class)
summary(lego_sales) # statistik ringkasan
##   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  
## 

1.2 Pembersihan data

# Pembersihan dataset
na_total <- colSums(is.na(lego_sales)) # Cek missing values
duplikat_sebelum <- nrow(lego_sales) - nrow(lego_sales %>% distinct())

lego_sales <- lego_sales %>% distinct() # Hapus data duplikat

lego_sales <- lego_sales %>% # Menambahkan kolom data baru (Customer id) untuk no 2 visualisasi 1
  mutate(customer_id = paste(first_name, last_name, sep = "_"))

lego_sales <- lego_sales %>% # Menambahkan kolom data baru (Revenue) untuk no 2 visualisasi 5
  mutate(revenue = us_price * quantity)

# Tampilkan kesimpulan
list(
  Jumlah_Baris = jumlah_baris,
  Jumlah_Kolom = jumlah_kolom,
  Tipe_Data = tipe_data,
  Jumlah_Missing_Values_Per_Kolom = na_total,
  Duplikat_Terhapus = duplikat_sebelum
)
## $Jumlah_Baris
## [1] 620
## 
## $Jumlah_Kolom
## [1] 14
## 
## $Tipe_Data
##   first_name    last_name          age phone_number       set_id       number 
##  "character"  "character"    "numeric"  "character"    "numeric"  "character" 
##        theme     subtheme         year         name       pieces     us_price 
##  "character"  "character"    "numeric"  "character"    "numeric"    "numeric" 
##    image_url     quantity 
##  "character"    "numeric" 
## 
## $Jumlah_Missing_Values_Per_Kolom
##   first_name    last_name          age phone_number       set_id       number 
##            0            0            0           92            0            0 
##        theme     subtheme         year         name       pieces     us_price 
##            0          172            0            0           69            0 
##    image_url     quantity 
##           59            0 
## 
## $Duplikat_Terhapus
## [1] 0

2. Eksplorasi data awal

Visualisasi Wajib Buat minimal 5 visualisasi dari kategori berikut:

2.1 10 customer dengan jumlah transaksi terbanyak

2.2 10 tema LEGO Terpopuler Berdasarkan Penjualan

2.3 Sebaran Jumlah Pieces dan Harga

2.4 Komposisi Penjualan Berdasarkan Usia

2.5 Heatmap Korelasi Antar Variabel Numerik

Jawaban:

2.1 10 customer dengan jumlah transaksi terbanyak

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

ggplot(top_customers, aes(x = reorder(customer_id, n), y = n)) +
  geom_col(fill = "deeppink3") +
  coord_flip() +
  labs(title = "10 Customer dengan Jumlah Transaksi Terbanyak",
       x = "Customer", y = "Jumlah Transaksi") +
  theme_minimal()

Visualisasi di atas merupakan diagram batang yang menunjukkan 10 customer dengan jumlah transaksi terbanyak. Sumbu X dalam visualisasi ini adalah jumlah transaksi dan sumbu Y adalah nama customer yang didapat dengan menggunakan fungsi mutate untuk membuat kolom data baru, yaitu customer id. Visualisasi data ini menunjukkan bahwa Jackson_Dominguez adalah customer dengan jumlah transaksi terbanyak (lebih dari 6 kali), disusul oleh customer lainnya seperti Josie_Paley, Tristin_Marcy, dan Sarah_Wagner memiliki jumlah transaksi sebanyak 5 kali dan dapat dilihat sebagian besar customer dalam top 10 ini melakukan transaksi 4-5 kali, sehingga kesimpulan dari visuaisasi data ini adalah meskipun jumlah transaksi tiap customer relatif kecil (maksimal sekitar 6), mereka tetap menjadi pelanggan setia yang melakukan pembelian berulang. Ini menunjukkan kemungkinan adanya pola pembelian reguler oleh customer tertentu.

2.2 10 tema LEGO Terpopuler Berdasarkan Penjualan

lego_sales <- lego_sales %>%
  mutate(customer_id = paste(first_name, last_name, sep = "_"))

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

ggplot(top_customers, aes(x = reorder(customer_id, n), y = n)) +
  geom_col(fill = "deeppink3") +
  coord_flip() +
  labs(title = "10 Customer dengan Jumlah Transaksi Terbanyak",
       x = "Customer", y = "Jumlah Transaksi") +
  theme_minimal()

Visualisasi di atas merupakan diagram batang yang menunjukkan 10 tema lego terpopler yang dihitung berdasarkan data penjualan. Sumbu X dalam visualisasi ini adalah jumlah terjual dan sumbu Y adalah tema lego yang dijual. Visualisasi data ini menunjukkan bahwa tema lego yang paling laris adalah tema Star Wars, disusul oleh tema Nexo Knights, Mixels, dan Gear, sehingga kesimpulan dari visuaisasi data ini adalah lego bertema basis cerita atau film yang kuat seperti Star Wars lebih diminati dan banyak dibeli.

2.3 Sebaran Jumlah Pieces dan Harga

ggplot(lego_sales, aes(x = pieces, y = us_price)) +
  geom_point(alpha = 0.6, color = "deeppink3") +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  labs(title = "Sebaran Jumlah Pieces vs Harga",
       x = "Jumlah Pieces", y = "Harga (USD)") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 69 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 69 rows containing missing values or values outside the scale range
## (`geom_point()`).

Visualisasi di atas merupakan scatter plot yang menunjukkan hubungan antara jumlah pieces (komponen LEGO) dengan harga dalam USD. Sumbu X adalah jumlah pieces, sedangkan sumbu Y adalah harga (USD). Garis linier hitam untuk menunjukkan tren hubungan antar variabel, sehingga visualisasi ini menunjukkan bahwa secara umum terdapat hubungan positif antara jumlah pieces dan harga—semakin banyak pieces, semakin mahal harga lego set tersebut. Hal ini ditunjukkan oleh garis regresi yang mengarah naik. Namun demikian, terdapat beberapa outlier, seperti produk dengan harga tinggi tapi jumlah pieces tidak terlalu banyak. Selain itu, ada warning bahwa 69 baris data dihapus karena memiliki nilai kosong atau di luar rentang skala.

2.4 Komposisi Penjualan Berdasarkan Usia

penjualan_usia <- lego_sales %>%
  group_by(age) %>%
  summarise(total_quantity = sum(quantity, na.rm = TRUE))

ggplot(penjualan_usia, aes(x = age, y = total_quantity)) +
  geom_col(fill = "deeppink3") +
  labs(title = "Komposisi Penjualan Berdasarkan Usia Customer",
       x = "Usia", y = "Jumlah Terjual") +
  theme_minimal()

Visualisasi di atas merupakan diagram batang menggambarkan jumlah produk lego yang terjual berdasarkan usia customer. Sumbu X adalah usia, sedangkan sumbu Y adalah total jumlah terjual. Data ini diperoleh dari agregasi penjualan berdasarkan usia customer. sehingga visualisasi ini menunjukkan bahwa penjualan tertinggi terjadi pada rentang usia 30-an, dengan puncak penjualan di usia sekitar 33 tahun. Usia 20–40 tahun merupakan kelompok usia yang paling banyak melakukan pembelian lego, sedangkan setelah usia 50 tahun terjadi penurunan signifikan. Hal ini menunjukkan bahwa produk lego paling banyak diminati oleh konsumen dewasa muda hingga usia pertengahan.

2.5 Heatmap Korelasi Antar Variabel Numerik

numerik_data <- lego_sales %>%
  select(age, pieces, us_price, quantity, revenue)

cor_matrix <- cor(numerik_data, use = "complete.obs")
cor_df <- as.data.frame(as.table(cor_matrix))

ggplot(cor_df, aes(x = Var1, y = Var2, fill = Freq)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(Freq, 2)), color = "white", size = 4) +
  scale_fill_gradient(low = "pink", high = "deeppink3") +
  labs(title = "Heatmap Korelasi Variabel Numerik", fill = "Korelasi") +
  theme_minimal()

Visualisasi di atas merupakan heatmap yang menggambarkan korelasi antar variabel numerik dalam dataset, yaitu age, pieces, us_price, quantity, dan revenue. Warna semakin gelap menunjukkan nilai korelasi yang semakin tinggi, dengan skala dari 0 (tidak berkorelasi) hingga 1 (sangat berkorelasi). Dari heatmap ini terlihat bahwa pieces memiliki korelasi sangat kuat dengan us_price (0.94) dan cukup tinggi dengan revenue (0.83), us_price juga berkorelasi tinggi dengan revenue (0.87), age memiliki korelasi sangat rendah dengan semua variabel lainnya, sehingga visualisasi ini menyimpulkan bahwa jumlah pieces dan harga sangat memengaruhi revenue, sementara usia customer tidak memiliki pengaruh yang signifikan terhadap variabel-variabel numerik lainnya dalam dataset ini.

3. Eksplorasi data awal

Jawaban: