ANALISIS PEMBELIAN PELANGGAN
Eksplorasi Central Tendency dan Insight Data Pelanggan
# Membaca data dari file raw_data.csv
customer_data <- read.csv("raw_data.csv")
# Membersihkan kolom pertama (index)
customer_data <- customer_data %>% select(-1)
# Konversi tipe data
customer_data <- customer_data %>%
mutate(
Gender = as.factor(Gender),
StoreLocation = as.factor(StoreLocation),
ProductCategory = as.factor(ProductCategory)
)1 PENDAHULUAN
Ukuran pemusatan data (central tendency) merupakan konsep dasar dalam statistika yang digunakan untuk menentukan nilai tengah atau nilai representatif dari suatu kumpulan data. Nilai ini membantu peneliti memahami bagaimana data tersebar dan di mana posisi nilai yang paling umum atau tipikal terjadi. Menurut sumber Labs (2024), central tendency menjadi salah satu teknik paling fundamental dalam analisis data karena dapat menjadi indikator awal dalam pengambilan keputusan berbasis data.
1.1 Latar Belakang
Dalam konteks bisnis dan pemasaran, memahami perilaku pelanggan merupakan faktor penting untuk meningkatkan strategi penjualan dan pengelolaan produk. Pada analisis ini, dataset raw_data.csv yang berisi informasi pembelian pelanggan digunakan sebagai objek penelitian. Dengan menganalisis ukuran pemusatan data seperti mean (rata-rata), median (nilai tengah), dan modus (nilai yang paling sering muncul), kita dapat memperoleh pemahaman yang lebih mendalam mengenai pola pembelian, kebiasaan kunjungan pelanggan, serta penilaian mereka terhadap layanan.
Pendekatan ini membantu perusahaan dalam:
Mengidentifikasi karakteristik pelanggan secara umum.
Mengetahui pola distribusi pembelian dan demografi pelanggan.
Menyediakan insight awal untuk strategi pengembangan bisnis berbasis data.
Dengan demikian, analisis ukuran pemusatan data pada dataset pembelian pelanggan tidak hanya memberikan gambaran mengenai kecenderungan data, tetapi juga menjadi landasan penting dalam pengambilan keputusan strategis berbasis analisis data.
1.2 Rumusan Masalah
Berdasarkan latar belakang yang telah dijelaskan, maka rumusan masalah dalam analisis ini adalah:
Bagaimana distribusi dan ukuran pemusatan data (mean, median, modus) dari variabel numerik pada data pelanggan?
Apakah terdapat perbedaan karakteristik pelanggan berdasarkan gender, lokasi toko, dan kategori produk?
Variabel mana yang memiliki kecenderungan distribusi tidak simetris (skewed) yang dapat memengaruhi interpretasi data?
Bagaimana hasil analisis ukuran pemusatan ini dapat memberikan insight bagi strategi bisnis dan pelayanan pelanggan?
1.3 Tujuan Penelitian
Analisis ini dilakukan dengan tujuan untuk:
Mengidentifikasi nilai rata-rata, median, dan modus dari variabel utama seperti usia, total pembelian, jumlah kunjungan, dan skor feedback pelanggan.
Menganalisis distribusi data untuk mengetahui pola dan kecenderungan yang muncul pada perilaku pelanggan.
Membandingkan ukuran pemusatan data berdasarkan kategori seperti gender, lokasi toko, dan kategori produk.
Memberikan rekomendasi strategis berbasis data untuk mendukung pengambilan keputusan bisnis dan peningkatan pengalaman pelanggan.
1.4 Data Overview
# Summary statistik numerik
numeric_summary <- customer_data %>%
select(Age, TotalPurchase, NumberOfVisits, FeedbackScore) %>%
psych::describe() %>%
select(n, mean, sd, min, max, median)
# Fungsi Statistik Utama
get_stats <- function(x) {
# hapus nilai NA
x_no_na <- x[!is.na(x)]
# mode_val akan menjadi NA jika vektor kosong atau mfv gagal
mode_val <- tryCatch({
# Gunakan mfv() dari package modeest untuk modus
as.numeric(modeest::mfv(x_no_na)[1])
}, error = function(e) {
NA
})
# Pastikan mean, median, dan SD dihitung dengan aman
if (length(x_no_na) == 0) {
return(data.frame(Mean = NA, Median = NA, Mode = NA, SD = NA))
}
# Output selalu 1 baris
return(data.frame(
Mean = mean(x_no_na),
Median = median(x_no_na),
Mode = mode_val,
SD = sd(x_no_na)
))
}
# Tampilkan summary
kable(numeric_summary, caption = "Statistik Deskriptif Variabel Numerik") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| n | mean | sd | min | max | median | |
|---|---|---|---|---|---|---|
| Age | 200 | 39.990 | 13.379648 | 18 | 70 | 39.0 |
| TotalPurchase | 200 | 211.795 | 196.060761 | 11 | 1128 | 108.5 |
| NumberOfVisits | 200 | 5.165 | 2.095167 | 1 | 11 | 5.0 |
| FeedbackScore | 200 | 2.800 | 1.456229 | 1 | 5 | 3.0 |
Bagian ini menunjukkan gambaran umum dari variabel numerik seperti usia pelanggan, total pembelian, jumlah kunjungan, dan skor feedback. Nilai mean dan median memberi informasi nilai tengah data, min–max menunjukkan rentang data, dan standar deviasi (SD) menggambarkan seberapa bervariasi perilaku pelanggan. Dengan statistik ini, kita dapat mengetahui karakteristik umum pelanggan serta apakah terdapat variasi signifikan dalam pola pembelian dan aktivitas mereka.
1.5 Struktur Data
# Summary variabel kategorikal
cat_summary <- customer_data %>%
select(Gender, StoreLocation, ProductCategory) %>%
tidyr::gather(key = "Variable", value = "Category") %>%
group_by(Variable, Category) %>%
summarise(Count = n(), .groups = "drop") %>%
mutate(Percentage = paste0(round(Count/nrow(customer_data)*100, 1), "%"))
kable(cat_summary, caption = "Distribusi Variabel Kategorikal") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| Variable | Category | Count | Percentage |
|---|---|---|---|
| Gender | F | 99 | 49.5% |
| Gender | M | 101 | 50.5% |
| ProductCategory | Books | 37 | 18.5% |
| ProductCategory | Clothing | 47 | 23.5% |
| ProductCategory | Electronics | 38 | 19% |
| ProductCategory | Home | 33 | 16.5% |
| ProductCategory | Sports | 45 | 22.5% |
| StoreLocation | East | 51 | 25.5% |
| StoreLocation | North | 47 | 23.5% |
| StoreLocation | South | 51 | 25.5% |
| StoreLocation | West | 51 | 25.5% |
Tabel kategorikal menampilkan jumlah dan persentase untuk variabel Gender, StoreLocation, dan ProductCategory. Hasil ini menunjukkan kelompok mana yang paling dominan, seperti jenis kelamin pelanggan terbanyak, lokasi toko dengan pelanggan terbanyak, dan kategori produk yang paling sering dibeli. Informasi ini membantu memahami profil pelanggan dan tren pembelian pada setiap kategori.
2 METODOLOGI ANALISIS
2.1 Deskripsi Data
Data yang digunakan berasal dari dataset raw_data.csv, yang berisi informasi mengenai perilaku pembelian pelanggan. Dataset ini mencakup variabel-variabel berikut:
Age — usia pelanggan (numerik).
Gender — jenis kelamin pelanggan (kategorikal).
StoreLocation — lokasi toko tempat transaksi dilakukan (kategorikal).
ProductCategory — kategori produk yang dibeli (kategorikal).
TotalPurchase — total nilai pembelian pelanggan (numerik).
NumberOfVisits — jumlah kunjungan pelanggan ke toko (numerik).
FeedbackScore — skor kepuasan pelanggan (numerik).
Sebelum dilakukan analisis, data dibersihkan dengan menghapus kolom indeks yang tidak relevan dan memastikan setiap variabel memiliki tipe data yang sesuai (factor untuk kategorikal, numeric untuk numerik).
2.2 Teknik Analisis
Metode yang digunakan dalam penelitian ini bersifat deskriptif kuantitatif, dengan fokus pada ukuran pemusatan data (central tendency). Analisis dilakukan melalui tahapan berikut:
2.2.1 Perhitungan Statistik Deskriptif
- Menghitung nilai mean, median, modus, standar deviasi, min, dan max untuk setiap variabel numerik menggunakan fungsi summarise() dari paket dplyr dan describe() dari paket psych.
2.2.2 Visualisasi Distribusi Data
Menggunakan histogram dan density plot untuk melihat pola distribusi setiap variabel numerik.
Menambahkan boxplot untuk mendeteksi adanya outlier dan melihat penyebaran data.
Menampilkan garis mean dan median dalam plot untuk memperjelas posisi ukuran pemusatan.
2.2.3 Analisis Berdasarkan Kategori
Membandingkan nilai mean dan median antar kelompok berdasarkan Gender, StoreLocation, dan ProductCategory.
Hasil ditampilkan dalam bentuk tabel ringkasan menggunakan kable() dan DT::datatable().
2.2.4 Analisis Skewness (Kecenderungan Distribusi)
- Mengukur perbedaan antara mean dan median untuk mendeteksi kemiringan distribusi data (positively atau negatively skewed).
2.3 Tools dan Software
Analisis dilakukan menggunakan bahasa pemrograman R, dengan pustaka utama sebagai berikut:
tidyverse (dplyr, ggplot2, tidyr) — untuk manipulasi dan visualisasi data.
psych — untuk statistik deskriptif.
kableExtra dan DT — untuk tampilan tabel interaktif.
rmdformats::readthedown — sebagai tema laporan untuk tampilan modern dengan navigasi table of contents.
patchwork — untuk menggabungkan beberapa visualisasi.
Seluruh kode dan analisis dijalankan di dalam R Markdown, sehingga proses analisis dan hasil dapat direproduksi secara transparan.
2.4 Alur Analisis
Langkah-langkah analisis data pelanggan secara keseluruhan meliputi:
Data Preparation — membaca dan membersihkan data dari file .csv.
Exploratory Analysis — menampilkan ringkasan variabel numerik dan kategorikal.
Central Tendency Analysis — menghitung mean, median, dan modus setiap variabel.
Visualization — menampilkan histogram, density plot, dan boxplot.
Comparative Analysis — membandingkan ukuran pemusatan antar kategori.
Insight Extraction — menginterpretasikan hasil untuk menghasilkan kesimpulan dan rekomendasi.
2.5 Tujuan dari Metodologi
Metodologi ini dirancang untuk:
Memberikan gambaran menyeluruh mengenai karakteristik pelanggan.
Menunjukkan seberapa sentral data pelanggan dalam tiap kategori (usia, pembelian, kunjungan, feedback).
Menjadi dasar dalam pengambilan keputusan strategis berbasis data.
3 ANALISIS CENTRAL TENDENCY
3.1 Analisis Umur Pelanggan
age_stats <- customer_data %>%
summarise(
Mean = round(mean(Age), 1),
Median = median(Age),
# PERUBAHAN: Menggunakan modeest::mfv()
Mode = as.numeric(modeest::mfv(Age)[1]),
SD = round(sd(Age), 1),
Min = min(Age),
Max = max(Age)
)
# Hitung jarak antara mean dan median
gap <- abs(age_stats$Mean - age_stats$Median)
# Visualisasi distribusi umur
p1 <- ggplot(customer_data, aes(x = Age)) +
geom_histogram(aes(y = after_stat(density)), bins = 15, fill = "#349", alpha = 0.7) +
geom_density(color = "#2c3e50", linewidth = 1) +
geom_vline(xintercept = age_stats$Mean, color = "#e74c3c", linewidth = 1, linetype = "dashed") +
geom_vline(xintercept = age_stats$Median, color = "#2ecc71", linewidth = 1, linetype = "dashed") +
annotate("label",
x = age_stats$Mean,
y = 0.03,
label = "Mean",
color = "#e74c3c",
fill = "white",
alpha = 0.6,
angle = 90,
vjust = 1.2,
hjust = 1.2,
size = 4.5,
label.size = 0) +
annotate("label",
x = age_stats$Median,
y = 0.01,
label = "Median",
color = "#2ecc71",
fill = "white",
alpha = 0.6,
angle = 90,
vjust = -0.5,
hjust = 1.2,
size = 4.5,
label.size = 0) +
labs(title = "Distribusi Umur Pelanggan",
x = "Umur", y = "Densitas") +
theme_minimal()
p2 <- ggplot(customer_data, aes(y = Age)) +
geom_boxplot(fill = "#349", alpha = 0.7) +
labs(title = "Boxplot Umur Pelanggan", y = "Umur") +
theme_minimal()
p1 + p2kable(age_stats, caption = "Ukuran Pemusatan Data Umur") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Mean | Median | Mode | SD | Min | Max |
|---|---|---|---|---|---|
| 40 | 39 | 18 | 13.4 | 18 | 70 |
Sebagian besar pelanggan berada pada rentang usia yang relatif sama (mean ≈ median), menunjukkan distribusi usia yang stabil dan tidak terlalu berpencar. Dengan analisis histogram dan boxplot sebagai :
Mean, median, dan modus menunjukkan rentang usia pelanggan berada pada kelompok usia tertentu yang paling dominan.
Histogram dan density menunjukkan apakah distribusi usia condong ke satu sisi (skewed) atau merata.
Boxplot membantu mendeteksi adanya outlier (pelanggan dengan usia jauh di atas/bawah mayoritas).
3.2 Analisis Total Pembelian
purchase_stats <- customer_data %>%
summarise(
Mean = round(mean(TotalPurchase), 1),
Median = median(TotalPurchase),
Mode = as.numeric(modeest::mfv(TotalPurchase)[1]),
SD = round(sd(TotalPurchase), 1),
Min = min(TotalPurchase),
Max = max(TotalPurchase)
)
# Visualisasi total pembelian
p3 <- ggplot(customer_data, aes(x = TotalPurchase)) +
geom_histogram(aes(y = after_stat(density)), bins = 20, fill = "#3498db", alpha = 0.7) +
geom_density(linewidth = 1.1, color = "#2c3e50") +
geom_vline(xintercept = purchase_stats$Mean, color = "#e74c3c", linewidth = 1, linetype = "dashed") +
geom_vline(xintercept = purchase_stats$Median, color = "#27ae60", linewidth = 1, linetype = "dashed") +
labs(
title = "Distribusi Total Purchase",
subtitle = paste0("Mean = ", round(purchase_stats$Mean,2),
" | Median = ", round(purchase_stats$Median,2),
" | Mode = ", purchase_stats$Mode),
x = "Total Purchase",
y = "Density"
) +
theme_minimal(base_size = 13)
# P4: Boxplot untuk Total Purchase
p4_box <- ggplot(customer_data, aes(y = TotalPurchase)) +
geom_boxplot(fill = "#3498db", alpha = 0.7) +
labs(title = "Boxplot Total Purchase", y = "Total Purchase") +
theme_minimal(base_size = 13)
p3 + p4_boxkable(purchase_stats, caption = "Ukuran Pemusatan Data Total Pembelian") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Mean | Median | Mode | SD | Min | Max |
|---|---|---|---|---|---|
| 211.8 | 108.5 | 33 | 196.1 | 11 | 1128 |
Melalui analisis total pembelian, dapat dilihat bahwa distribusi pembelian cenderung tidak simetris dengan adanya beberapa pelanggan yang melakukan pembelian dalam jumlah sangat besar. Hal ini terlihat dari perbandingan mean dan median serta visualisasi histogram dan boxplot sebagai berikut:
Mean dan median menggambarkan nilai rata-rata total pembelian pelanggan.
Jika mean > median, berarti terdapat beberapa pelanggan dengan pembelian sangat besar (big spender).
Histogram + garis mean & median menunjukkan apakah distribusinya simetris atau condong ke kanan (skewed).
3.3 Analisis Jumlah Kunjungan
visits_stats <- customer_data %>%
summarise(
Mean = round(mean(NumberOfVisits), 1),
Median = median(NumberOfVisits),
Mode = as.numeric(modeest::mfv(NumberOfVisits)[1]),
SD = round(sd(NumberOfVisits), 1),
Min = min(NumberOfVisits),
Max = max(NumberOfVisits)
)
# Visualisasi jumlah kunjungan
p5 <- ggplot(customer_data, aes(x = NumberOfVisits)) +
geom_bar(aes(y = after_stat(count)), fill = "#e67e22", alpha = 0.7, color = "black") +
geom_vline(xintercept = visits_stats$Mean, color = "#e74c3c", linewidth = 1, linetype = "dashed") +
geom_vline(xintercept = visits_stats$Median, color = "#2ecc71", linewidth = 1, linetype = "dashed") +
annotate("label",
x = visits_stats$Mean,
y = max(table(customer_data$NumberOfVisits)) * 0.8,
label = "Mean",
color = "#e74c3c",
fill = "white",
alpha = 0.6,
angle = 90,
vjust = 1.25,
hjust = -0.5,
size = 4.5,
label.size = 0) +
annotate("label",
x = visits_stats$Median,
y = max(table(customer_data$NumberOfVisits)) * 0.6,
label = "Median",
color = "#2ecc71",
fill = "white",
alpha = 0.6,
angle = 90,
vjust = -0.25,
hjust = 1.5,
size = 4.5,
label.size = 0) +
labs(title = "Distribusi Jumlah Kunjungan",
x = "Jumlah Kunjungan", y = "Frekuensi") +
theme_minimal()
p6 <- ggplot(customer_data, aes(y = NumberOfVisits)) +
geom_boxplot(fill = "#e67e22", alpha = 0.7) +
labs(title = "Boxplot Jumlah Kunjungan", y = "Jumlah Kunjungan") +
theme_minimal()
p5 + p6kable(visits_stats, caption = "Ukuran Pemusatan Data Jumlah Kunjungan") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Mean | Median | Mode | SD | Min | Max |
|---|---|---|---|---|---|
| 5.2 | 5 | 5 | 2.1 | 1 | 11 |
Sebagian besar pelanggan memiliki pola kunjungan tertentu yang konsisten (modus jelas dominan). Hal ini dapat dilihat dari analisis jumlah kunjungan dengan mean, median, dan modus serta visualisasi bar chart dan boxplot sebagai berikut:
Modus menunjukkan frekuensi kunjungan yang paling umum dilakukan pelanggan.
Mean dan median menunjukkan rata-rata aktivitas kunjungan.
Bar chart memperlihatkan frekuensi kunjungan terbanyak, sementara boxplot mengungkap adanya pelanggan yang sangat sering atau jarang berkunjung.
3.4 Analisis Feedback Score
feedback_stats <- customer_data %>%
summarise(
Mean = round(mean(FeedbackScore), 2),
Median = median(FeedbackScore),
Mode = as.numeric(modeest::mfv(FeedbackScore)[1]),
SD = round(sd(FeedbackScore), 2),
Min = min(FeedbackScore),
Max = max(FeedbackScore)
)
# Visualisasi feedback score
p7 <- ggplot(customer_data, aes(x = FeedbackScore)) +
geom_bar(aes(y = after_stat(prop), group = 1),
fill = "#1abc9c", alpha = 0.7, color = "black") +
geom_vline(xintercept = feedback_stats$Mean,
color = "#e74c3c", linewidth = 1, linetype = "dashed") +
geom_vline(xintercept = feedback_stats$Median,
color = "#2ecc71", linewidth = 1, linetype = "dashed") +
annotate("label",
x = feedback_stats$Mean,
y = 0.22,
label = "Mean",
color = "#e74c3c",
fill = "white",
alpha = 0.6,
angle = 90,
vjust = -0.2,
hjust = -0.5,
size = 4.5,
label.size = 0) +
annotate("label",
x = feedback_stats$Median,
y = 0.22,
label = "Median",
color = "#2ecc71",
fill = "white",
alpha = 0.6,
angle = 90,
vjust = 1.3,
hjust = -0.5,
size = 4.5,
label.size = 0) +
labs(
title = "Distribusi Feedback Score",
x = "Feedback Score", y = "Proporsi"
) +
theme_minimal() +
coord_cartesian(clip = "off")
p8 <- ggplot(customer_data, aes(y = FeedbackScore)) +
geom_boxplot(fill = "#1abc9c", alpha = 0.7) +
labs(title = "Boxplot Feedback Score", y = "Feedback Score") +
theme_minimal()
# Gabungkan kedua plot
p7 + p8 kable(feedback_stats, caption = "Ukuran Pemusatan Data Feedback Score") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Mean | Median | Mode | SD | Min | Max |
|---|---|---|---|---|---|
| 2.8 | 3 | 1 | 1.46 | 1 | 5 |
Penilaian pelanggan pada umumnya positif dan konsisten, menunjukkan tingkat kepuasan yang baik. Hal ini dapat dilihat dari analisis feedback score dengan mean, median, dan modus serta visualisasi bar chart dan boxplot sebagai berikut:
Mean dan median menunjukkan kualitas evaluasi pelanggan terhadap layanan/produk.
Jika mean ≈ median, berarti persepsi pelanggan stabil.
Boxplot membantu melihat apakah ada pelanggan yang memberi nilai sangat rendah atau sangat tinggi.
4 ANALISIS BERDASARKAN KATEGORI
4.1 Central Tendency berdasarkan Gender
gender_stats <- customer_data %>%
group_by(Gender) %>%
summarise(
Count = n(),
Percentage = paste0(round(n()/nrow(customer_data)*100, 1), "%"),
Mean_Age = round(mean(Age), 1),
Median_Age = median(Age),
Mean_Purchase = round(mean(TotalPurchase), 1),
Median_Purchase = median(TotalPurchase),
Mean_Visits = round(mean(NumberOfVisits), 1),
Median_Visits = median(NumberOfVisits),
Mean_Feedback = round(mean(FeedbackScore), 2)
)
# Plot A: Mean Purchase (Bar Chart)
p_gender_mean <- gender_stats %>%
ggplot(aes(x = Gender, y = Mean_Purchase, fill = Gender)) +
geom_bar(stat = "identity", position = "dodge", alpha = 0.8) +
geom_text(aes(label = scales::dollar(Mean_Purchase)), vjust = -0.5, size = 3.5, fontface = "bold") +
labs(title = "Rata-rata Pembelian", x = "Gender", y = "Rata-rata Pembelian (USD)") +
theme_minimal(base_size = 12) +
theme(legend.position = "none") +
scale_y_continuous(labels = scales::dollar_format())
# Plot B: Distribusi Total Pembelian (Boxplot)
p_gender_box <- customer_data %>%
ggplot(aes(x = Gender, y = TotalPurchase, fill = Gender)) + #
geom_boxplot(alpha = 0.7) +
labs(title = "Distribusi Pembelian", x = "Gender", y = "Total Pembelian (USD)") +
theme_minimal(base_size = 12) +
theme(legend.position = "none") +
scale_y_continuous(labels = scales::dollar_format())
# Gabungkan kedua visualisasi
print(p_gender_mean + p_gender_box)kable(gender_stats, caption = "Ukuran Pemusatan berdasarkan Gender") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| Gender | Count | Percentage | Mean_Age | Median_Age | Mean_Purchase | Median_Purchase | Mean_Visits | Median_Visits | Mean_Feedback |
|---|---|---|---|---|---|---|---|---|---|
| F | 99 | 49.5% | 40.3 | 39 | 206.6 | 105 | 5.3 | 5 | 2.88 |
| M | 101 | 50.5% | 39.7 | 38 | 216.9 | 116 | 5.0 | 5 | 2.72 |
Analisis ini menunjukkan bagaimana karakteristik pelanggan berbeda menurut gender. Dari tabel, kita dapat membandingkan rata-rata usia, total pembelian, jumlah kunjungan, dan feedback score antara kelompok gender.
Jika nilai mean pembelian atau jumlah kunjungan pada salah satu gender lebih tinggi, hal ini mengindikasikan bahwa gender tersebut memiliki kecenderungan melakukan transaksi lebih banyak atau lebih sering berkunjung ke toko.
4.2 Central Tendency berdasarkan Lokasi Toko
location_stats <- customer_data %>%
group_by(StoreLocation) %>%
summarise(
Count = n(),
Percentage = paste0(round(n()/nrow(customer_data)*100, 1), "%"),
Mean_Age = round(mean(Age), 1),
Median_Age = median(Age),
Mean_Purchase = round(mean(TotalPurchase), 1),
Median_Purchase = median(TotalPurchase),
Mean_Visits = round(mean(NumberOfVisits), 1),
Median_Visits = median(NumberOfVisits),
Mean_Feedback = round(mean(FeedbackScore), 2)
)
# Plot A: Mean Purchase (Bar Chart)
p_location_mean <- location_stats %>%
ggplot(aes(x = StoreLocation, y = Mean_Purchase, fill = StoreLocation)) +
geom_bar(stat = "identity", position = "dodge", alpha = 0.8) +
geom_text(aes(label = scales::dollar(Mean_Purchase)), vjust = -0.5, size = 3.5, fontface = "bold") +
labs(title = "Rata-rata Pembelian", x = "Lokasi Toko", y = "Rata-rata Pembelian (USD)") +
theme_minimal(base_size = 12) +
theme(legend.position = "none") +
scale_y_continuous(labels = scales::dollar_format())
# Plot B: Distribusi Total Pembelian (Boxplot)
p_location_box <- customer_data %>%
ggplot(aes(x = StoreLocation, y = TotalPurchase, fill = StoreLocation)) +
geom_boxplot(alpha = 0.7) +
labs(title = "Distribusi Pembelian", x = "Lokasi Toko", y = "Total Pembelian (USD)") +
theme_minimal(base_size = 12) +
theme(legend.position = "none") +
scale_y_continuous(labels = scales::dollar_format())
# Gabungkan kedua visualisasi
print(p_location_mean + p_location_box)kable(location_stats, caption = "Ukuran Pemusatan berdasarkan Lokasi Toko") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| StoreLocation | Count | Percentage | Mean_Age | Median_Age | Mean_Purchase | Median_Purchase | Mean_Visits | Median_Visits | Mean_Feedback |
|---|---|---|---|---|---|---|---|---|---|
| East | 51 | 25.5% | 38.7 | 37 | 211.1 | 113 | 5.1 | 5 | 2.78 |
| North | 47 | 23.5% | 39.1 | 41 | 220.1 | 126 | 5.2 | 5 | 2.68 |
| South | 51 | 25.5% | 40.4 | 37 | 183.7 | 89 | 4.9 | 5 | 2.98 |
| West | 51 | 25.5% | 41.7 | 39 | 232.8 | 135 | 5.5 | 5 | 2.75 |
Bagian ini menunjukkan perbedaan perilaku pelanggan pada masing-masing lokasi toko. Dengan membandingkan nilai mean pembelian dan rata-rata kunjungan, kita dapat mengetahui:
Lokasi mana yang memiliki pembelian tertinggi (peluang peningkatan strategi penjualan).
Lokasi dengan kunjungan terbanyak (potensi loyalitas pelanggan).
Tingkat kepuasan pelanggan berdasarkan rata-rata feedback score.
Lokasi dengan rata-rata pembelian atau kunjungan yang lebih tinggi dapat menjadi prioritas strategi pemasaran atau pengembangan layanan.
4.3 Central Tendency berdasarkan Kategori Produk
product_stats <- customer_data %>%
group_by(ProductCategory) %>%
summarise(
Count = n(),
Percentage = paste0(round(n()/nrow(customer_data)*100, 1), "%"),
Mean_Age = round(mean(Age), 1),
Median_Age = median(Age),
Mean_Purchase = round(mean(TotalPurchase), 1),
Median_Purchase = median(TotalPurchase),
Mode_Purchase = mlv(TotalPurchase, method = "mfv"),
Mean_Visits = round(mean(NumberOfVisits), 1),
Median_Visits = median(NumberOfVisits),
Mean_Feedback = round(mean(FeedbackScore), 2)
)
# Plot A: Mean Purchase
p_product_mean <- product_stats %>%
ggplot(aes(x = reorder(ProductCategory, Mean_Purchase),
y = Mean_Purchase,
fill = ProductCategory)) +
geom_col(alpha = 0.8) +
geom_text(aes(label = dollar(Mean_Purchase)),
vjust = -0.3, size = 3.5, fontface = "bold") +
labs(title = "Rata-rata Pembelian per Kategori Produk",
x = "Kategori Produk",
y = "Rata-rata Pembelian (USD)") +
theme_minimal(base_size = 12) +
theme(legend.position = "none",
plot.title = element_text(face = "bold", hjust = 0.5)) +
scale_y_continuous(labels = dollar_format())
# Plot B: Boxplot Distribusi Pembelian
p_product_box <- customer_data %>%
left_join(product_stats %>% select(ProductCategory, Mean_Purchase),
by = "ProductCategory") %>%
ggplot(aes(x = reorder(ProductCategory, Mean_Purchase),
y = TotalPurchase,
fill = ProductCategory)) +
geom_boxplot(alpha = 0.7) +
labs(title = "Distribusi Total Pembelian",
x = "Kategori Produk",
y = "Total Pembelian (USD)") +
theme_minimal(base_size = 12) +
theme(legend.position = "none",
plot.title = element_text(face = "bold", hjust = 0.5)) +
scale_y_continuous(labels = dollar_format())
# Gabungan kedua visualisasi
print(p_product_mean / p_product_box)# tabel ringkasan
kable(product_stats, caption = "Ukuran Pemusatan berdasarkan Kategori Produk") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| ProductCategory | Count | Percentage | Mean_Age | Median_Age | Mean_Purchase | Median_Purchase | Mode_Purchase | Mean_Visits | Median_Visits | Mean_Feedback |
|---|---|---|---|---|---|---|---|---|---|---|
| Books | 37 | 18.5% | 37.6 | 36.0 | 55.7 | 61.0 | 30 | 5.4 | 5 | 2.76 |
| Clothing | 47 | 23.5% | 40.0 | 37.0 | 91.4 | 79.0 | 66 | 5.5 | 5 | 2.79 |
| Electronics | 38 | 19% | 41.6 | 40.5 | 304.1 | 248.5 | 136 | 5.1 | 5 | 2.89 |
| Electronics | 38 | 19% | 41.6 | 40.5 | 304.1 | 248.5 | 327 | 5.1 | 5 | 2.89 |
| Home | 33 | 16.5% | 40.7 | 41.0 | 89.1 | 87.0 | 101 | 5.0 | 5 | 2.70 |
| Home | 33 | 16.5% | 40.7 | 41.0 | 89.1 | 87.0 | 107 | 5.0 | 5 | 2.70 |
| Home | 33 | 16.5% | 40.7 | 41.0 | 89.1 | 87.0 | 127 | 5.0 | 5 | 2.70 |
| Sports | 45 | 22.5% | 40.1 | 39.0 | 477.9 | 472.0 | 417 | 4.9 | 5 | 2.84 |
| Sports | 45 | 22.5% | 40.1 | 39.0 | 477.9 | 472.0 | 471 | 4.9 | 5 | 2.84 |
| Sports | 45 | 22.5% | 40.1 | 39.0 | 477.9 | 472.0 | 514 | 4.9 | 5 | 2.84 |
| Sports | 45 | 22.5% | 40.1 | 39.0 | 477.9 | 472.0 | 532 | 4.9 | 5 | 2.84 |
Analisis ini membantu mengetahui kategori produk mana yang paling diminati dan mana yang memberikan kontribusi lebih besar terhadap transaksi. Nilai mean total pembelian dan mean feedback score per kategori produk memberikan insight seperti:
Produk dengan pembelian rata-rata paling tinggi → kategori paling menguntungkan.
Produk dengan feedback tertinggi → kualitas pengalaman pelanggan terbaik.
Produk dengan kunjungan tertinggi → potensi loyalitas dan permintaan tinggi.
5 KESIMPULAN DAN REKOMENDASI
# Insight 1: Perbandingan mean vs median
mean_median_comparison <- customer_data %>%
summarise(
Age_Mean = mean(Age),
Age_Median = median(Age),
Purchase_Mean = mean(TotalPurchase),
Purchase_Median = median(TotalPurchase),
Visits_Mean = mean(NumberOfVisits),
Visits_Median = median(NumberOfVisits),
Feedback_Mean = mean(FeedbackScore),
Feedback_Median = median(FeedbackScore)
)
# Insight 2: Skewness analysis
skewness_analysis <- customer_data %>%
summarise(
Age_Skew = (mean(Age) - median(Age))/sd(Age),
Purchase_Skew = (mean(TotalPurchase) - median(TotalPurchase))/sd(TotalPurchase),
Visits_Skew = (mean(NumberOfVisits) - median(NumberOfVisits))/sd(NumberOfVisits),
Feedback_Skew = (mean(FeedbackScore) - median(FeedbackScore))/sd(FeedbackScore)
)
insights_df <- data.frame(
Metric = c("Age", "Total Purchase", "Number of Visits", "Feedback Score"),
Mean = c(mean_median_comparison$Age_Mean, mean_median_comparison$Purchase_Mean,
mean_median_comparison$Visits_Mean, mean_median_comparison$Feedback_Mean),
Median = c(mean_median_comparison$Age_Median, mean_median_comparison$Purchase_Median,
mean_median_comparison$Visits_Median, mean_median_comparison$Feedback_Median),
Skewness = round(c(skewness_analysis$Age_Skew, skewness_analysis$Purchase_Skew,
skewness_analysis$Visits_Skew, skewness_analysis$Feedback_Skew), 3)
)
kable(insights_df, caption = "Analisis Perbandingan Mean vs Median dan Skewness") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Metric | Mean | Median | Skewness |
|---|---|---|---|
| Age | 39.990 | 39.0 | 0.074 |
| Total Purchase | 211.795 | 108.5 | 0.527 |
| Number of Visits | 5.165 | 5.0 | 0.079 |
| Feedback Score | 2.800 | 3.0 | -0.137 |
5.1 Kesimpulan
Berdasarkan analisis central tendency dari dataset raw_data.csv, dapat disimpulkan:
Distribusi Umur: cenderung miring ke kanan (positively skewed) dengan rata-rata umur 40 tahun.
Total Pembelian: cenderung miring ke kanan (positively skewed) menunjukkan adanya beberapa pelanggan dengan nilai pembelian sangat tinggi.
Jumlah Kunjungan: Distribusi cenderung miring ke kanan (positively skewed).
Feedback Score: cenderung miring ke kiri (negatively skewed).
5.2 Rekomendasi
Target Pasar: Fokus pada kelompok usia 39 tahun sebagai target pasar utama
Strategi Penjualan: Optimalkan penjualan untuk kategori Books, Clothing, Electronics, Home, Sports yang memiliki nilai pembelian rata-rata tertinggi
Layanan Toko: Tingkatkan layanan di lokasi West yang menunjukkan performa pembelian terbaik
Program Loyalitas: Kembangkan program loyalitas untuk meningkatkan frekuensi kunjungan pelanggan