Analisis Eksploratif dan Visualisasi Data Transaksi Penjualan pada Dataset Online Retail
Studi Kasus
Analisis Transaksi Penjualan Toko Online “NapMart”
NapMart adalah sebuah toko online yang menjual berbagai produk kebutuhan rumah tangga dan dekorasi. Dalam beberapa waktu terakhir, jumlah transaksi di toko ini terus meningkat. Setiap harinya, ratusan hingga ribuan transaksi tercatat, mulai dari pembelian dalam jumlah kecil hingga transaksi besar dalam jumlah banyak. Meskipun data transaksi tersebut terus bertambah, pihak manajemen NapMart mulai menyadari bahwa mereka belum benar-benar memahami pola di balik data tersebut. Mereka tidak mengetahui produk apa yang sebenarnya paling diminati pelanggan, kapan waktu penjualan paling tinggi, serta bagaimana karakteristik pelanggan yang memberikan kontribusi terbesar terhadap pendapatan. Selama ini, keputusan bisnis lebih banyak didasarkan pada perkiraan dan pengalaman, bukan berdasarkan analisis data yang mendalam. Akibatnya, sering terjadi ketidaksesuaian dalam pengelolaan stok, strategi promosi yang kurang tepat sasaran, serta kurang optimalnya pemanfaatan peluang pasar. Berangkat dari permasalahan tersebut, analisis terhadap data transaksi penjualan yang telah dikumpulkan menjadi langkah yang perlu dilakukan. Data ini diharapkan dapat memberikan gambaran yang lebih jelas mengenai perilaku pelanggan dan pola penjualan yang terjadi. Melalui pendekatan eksploratif dan bantuan visualisasi data, setiap informasi yang tersembunyi di dalam dataset akan diungkap secara bertahap. Hasil dari analisis ini nantinya diharapkan dapat membantu NapMart dalam memahami bisnisnya secara lebih mendalam dan mengambil keputusan yang lebih tepat berbasis data.
Berdasarkan permasalahan yang dihadapi oleh manajemen NapMart, analisis eksploratif dan visualisasi data ini memiliki tujuan utama sebagai berikut: 1. Memetakan Pasar dan Produk Unggulan: Mengidentifikasi distribusi geografis pelanggan dan menemukan produk-produk utama yang menjadi tulang punggung penjualan. 2. Menganalisis Strategi Harga: Mengetahui pola sebaran harga produk yang paling sering dibeli oleh pelanggan untuk menentukan strategi promosi yang tepat. 3. Mengidentifikasi Pelanggan Paling Berharga: Melakukan segmentasi pelanggan berdasarkan frekuensi belanja dan total uang yang dihabiskan untuk menemukan kelompok pelanggan (VIP) yang berkontribusi terbesar. 4. Mendeteksi Tren dan Momentum Penjualan: Mengamati pergerakan transaksi dari waktu ke waktu (berdasarkan bulan dan tipe hari) untuk mengetahui kapan puncak penjualan terjadi dan kapan waktu terbaik untuk melakukan promosi.
Import Data
Nah sebelum memulai analisis kita, disini kami meng import dataset yang telah dibersihkan, dan memeriksa karakteristik variabel yang ada di dalam dataset.
## # A tibble: 6 × 9
## invoice_no stock_code description invoice_date customer_id country
## <chr> <chr> <chr> <dttm> <chr> <chr>
## 1 536365 21730 GLASS STAR FROS… 2010-12-01 08:26:00 17850 United…
## 2 536365 22752 SET 7 BABUSHKA … 2010-12-01 08:26:00 17850 United…
## 3 536365 71053 WHITE METAL LAN… 2010-12-01 08:26:00 17850 United…
## 4 536365 84029E RED WOOLLY HOTT… 2010-12-01 08:26:00 17850 United…
## 5 536365 84029G KNITTED UNION F… 2010-12-01 08:26:00 17850 United…
## 6 536365 84406B CREAM CUPID HEA… 2010-12-01 08:26:00 17850 United…
## # ℹ 3 more variables: quantity <dbl>, unit_price <dbl>, Revenue <dbl>
## tibble [519,611 × 9] (S3: tbl_df/tbl/data.frame)
## $ invoice_no : chr [1:519611] "536365" "536365" "536365" "536365" ...
## $ stock_code : chr [1:519611] "21730" "22752" "71053" "84029E" ...
## $ description : chr [1:519611] "GLASS STAR FROSTED T-LIGHT HOLDER" "SET 7 BABUSHKA NESTING BOXES" "WHITE METAL LANTERN" "RED WOOLLY HOTTIE WHITE HEART." ...
## $ invoice_date: POSIXct[1:519611], format: "2010-12-01 08:26:00" "2010-12-01 08:26:00" ...
## $ customer_id : chr [1:519611] "17850" "17850" "17850" "17850" ...
## $ country : chr [1:519611] "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
## $ quantity : num [1:519611] 6 2 6 6 6 8 6 6 6 3 ...
## $ unit_price : num [1:519611] 4.25 7.65 3.39 3.39 3.39 2.75 2.55 1.85 1.85 5.95 ...
## $ Revenue : num [1:519611] 25.5 15.3 20.3 20.3 20.3 ...
Nah disini kita melakukan pemeriksaan ulang apakah masih terdapat missing value, data duplikat, dan melihat statistik deskriptif dataset ini.
## invoice_no stock_code description invoice_date customer_id country
## 0 0 0 0 0 0
## quantity unit_price Revenue
## 0 0 0
## [1] 0
## invoice_no stock_code description
## Length:519611 Length:519611 Length:519611
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## invoice_date customer_id country
## Min. :2010-12-01 08:26:00.00 Length:519611 Length:519611
## 1st Qu.:2011-03-28 11:34:00.00 Class :character Class :character
## Median :2011-07-19 14:03:00.00 Mode :character Mode :character
## Mean :2011-07-04 08:55:54.34
## 3rd Qu.:2011-10-18 17:05:00.00
## Max. :2011-12-09 12:50:00.00
## quantity unit_price Revenue
## Min. : 1.00 Min. : 0.001 Min. : 0.00
## 1st Qu.: 1.00 1st Qu.: 1.250 1st Qu.: 4.13
## Median : 4.00 Median : 2.100 Median : 9.96
## Mean : 10.75 Mean : 3.922 Mean : 20.53
## 3rd Qu.: 12.00 3rd Qu.: 4.130 3rd Qu.: 17.70
## Max. :80995.00 Max. :13541.330 Max. :168469.60
Disini kita melakukan visualisasi dengan boxplot, guna melihat nilai pada kuantitas dan harga unit
Disini kami melakukan visualisasi dengan boxplot, guna melihat nilai pada kuantitas dan harga unit.
Boxplot quantity menunjukkan adanya nilai-nilai yang jauh dari kelompok utama data, baik pada sisi positif maupun negatif. Nilai positif yang sangat besar menunjukkan adanya pembelian dalam jumlah yang sangat banyak dalam satu transaksi, sementara sebagian besar transaksi berada pada nilai yang relatif kecil sehingga distribusinya tidak simetris. Pada boxplot harga, terlihat bahwa hampir semua data terkonsentrasi di kisaran nilai rendah yang berdekatan dengan nol. Namun terdapat beberapa nilai yang sangat jauh ke atas, menandakan adanya produk dengan harga yang jauh lebih tinggi dari harga produk pada umumnya.
Melihat Pola Distribusi
Setelah mengenal struktur datanya langkah pertama untuk memahami bisnis NapMart adalah melihat lanskap pasar secara makro. Dari mana saja sebenarnya pelanggan toko ini berasal? Dan produk apa yang paling sering mereka beli? Dua pertanyaan sederhana ini menjadi titik awal perjalanan eksplorasi kami.
top10 <- top10 %>%
mutate(group = ifelse(country == "United Kingdom", "UK", "Other"))
plot_ly(
data = top10,
x = ~n,
y = ~reorder(country, n),
type = "bar",
orientation = "h",
color = ~group,
colors = c("UK" = "orange", "Other" = "steelblue"),
text = ~paste(
"Negara:", country,
"<br>Jumlah Transaksi:", n
),
hoverinfo = "text",
textposition = "none"
) %>%
layout(
hoverlabel = list(
bgcolor = "black",
font = list(color = "white")
)
)Grafik menunjukkan bahwa United Kingdom memiliki jumlah transaksi yang sangat dominan dibandingkan negara lainnya. Perbedaan yang terlihat sangat signifikan ini menandakan bahwa sebagian besar aktivitas transaksi berasal dari UK. Negara-negara lain memang muncul dalam Top 10, namun kontribusinya relatif kecil jika dibandingkan dengan UK.
top10_no_uk <- top10 %>%
filter(country != "United Kingdom")
plot_ly(
data = top10_no_uk,
x = ~n,
y = ~reorder(country, n),
type = "bar",
orientation = "h",
marker = list(color = "steelblue"),
text = ~paste(
"Negara:", country,
"<br>Jumlah Transaksi:", n
),
hoverinfo = "text",
textposition = "none"
) %>%
layout(
hoverlabel = list(
bgcolor = "black",
font = list(color = "white")
)
)Setelah United Kingdom dikeluarkan dari Grafik, terlihat bahwa distribusi transaksi antar negara menjadi lebih merata. Beberapa negara seperti Germany, France, dan Netherlands muncul sebagai kontributor utama di pasar internasional. Perbedaan antar negara tidak terlalu ekstrem, menunjukkan bahwa tidak ada satu negara lain yang benar-benar mendominasi seperti UK.
top10_products <- data %>%
filter(quantity > 0, !is.na(description)) %>%
group_by(description) %>%
summarise(total_qty = sum(quantity)) %>%
arrange(desc(total_qty)) %>%
slice_head(n = 10)
plot_ly(
data = top10_products,
x = ~total_qty,
y = ~reorder(description, total_qty),
type = "bar",
orientation = "h",
text = ~paste(
"Produk:", description,
"<br>Total Terjual:", total_qty
),
hoverinfo = "text",
textposition = "none"
) %>%
layout(
hoverlabel = list(
bgcolor = "black",
font = list(color = "white")
)
)Grafik menunjukkan bahwa distribusi penjualan tidak merata di seluruh produk. Sebaliknya, terdapat konsentrasi penjualan yang signifikan pada beberapa produk tertentu yang memiliki jumlah pembelian jauh lebih tinggi dibandingkan produk lainnya.
Total penjualan yang dihasilkan oleh 10 produk terlaris juga menunjukkan kontribusi yang dominan terhadap keseluruhan transaksi. Hal ini mengindikasikan bahwa sebagian besar aktivitas pembelian pelanggan berfokus pada produk-produk tertentu yang memiliki tingkat permintaan tinggi.
Pola ini mencerminkan fenomena Pareto Principle (80/20), di mana sebagian kecil produk memberikan kontribusi besar terhadap total penjualan. Dengan kata lain, tidak semua produk memiliki peran yang sama dalam mendorong performa bisnis.
l <- ggplot(data, aes(x = unit_price)) +
geom_histogram(bins = 40, fill = "skyblue", color = "black") +
geom_vline(aes(xintercept = mean(unit_price, na.rm = TRUE)),
color = "red", linetype = "dashed", size = 1) +
labs(
title = "Distribusi Harga Dari Produk-Produk yang Dijual",
x = "Unit Price",
y = "Frekuensi"
) +
theme_minimal()
ggplotly(l)