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)
Statistik Deskriptif Variabel Numerik
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"))
Distribusi Variabel Kategorikal
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:

  1. Data Preparation — membaca dan membersihkan data dari file .csv.

  2. Exploratory Analysis — menampilkan ringkasan variabel numerik dan kategorikal.

  3. Central Tendency Analysis — menghitung mean, median, dan modus setiap variabel.

  4. Visualization — menampilkan histogram, density plot, dan boxplot.

  5. Comparative Analysis — membandingkan ukuran pemusatan antar kategori.

  6. 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 + p2

kable(age_stats, caption = "Ukuran Pemusatan Data Umur") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Ukuran Pemusatan Data Umur
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_box

kable(purchase_stats, caption = "Ukuran Pemusatan Data Total Pembelian") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Ukuran Pemusatan Data Total Pembelian
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 + p6

kable(visits_stats, caption = "Ukuran Pemusatan Data Jumlah Kunjungan") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Ukuran Pemusatan Data Jumlah Kunjungan
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)
Ukuran Pemusatan Data Feedback Score
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"))
Ukuran Pemusatan berdasarkan Gender
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"))
Ukuran Pemusatan berdasarkan Lokasi Toko
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"))
Ukuran Pemusatan berdasarkan Kategori Produk
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)
Analisis Perbandingan Mean vs Median dan Skewness
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

References

Labs, Data Science. 2024. “4 Central Tendency — Introduction to Statistics.” 2024. https://bookdown.org/dsciencelabs/intro_statistics/04-Central_Tendency.html?authuser=0#dataset.