Central Tendency

Exercises ~ Week 6

Kelompok Geng Matcha


1 Laporan Analisis Data Pelanggan

1.1 Pendahuluan

Di laporan ini, saya menganalisis data tentang pelanggan sebuah toko. Tujuannya adalah untuk mengetahui gambaran umum tentang pelanggan, seperti:

  • Umur rata-rata pelanggan berapa
  • Jenis kelamin apa yang sering membeli produk di data tersebut
  • Berapa banyak uang yang mereka habiskan
  • Lokasi mana saja yang sering mereka datangi
  • Seberapa sering mereka datang
  • Produk apa yang paling sering dibeli
  • Bagaimana tingkat kepuasan mereka

Dengan analisis ini, kita bisa lebih paham pola pelanggan dalam berbelanja.

1.2 Deskripsi Data

Data ini berisi beberapa informasi tentang pelanggan, yaitu:

Jadi data ini intinya tentang siapa pelanggannya, belanja apa, belanjanya berapa banyak, seberapa sering datang, dan puas atau tidak.

1.3 Menganalisa Variabel & Visualisasi

1.3.1 Analisis Variabel Usia

# ANALISIS USIA - MEAN

# Menghitung nilai rata-rata (mean) dari variabel Age, 
# dengan mengabaikan data yang hilang (NA)
mean_age <- mean(mydata$Age, na.rm = TRUE)

# Membuat data frame hasil analisis yang berisi:
# - Nama variabel
# - Metode analisis yang digunakan
# - Nilai hasil mean (dibulatkan 2 angka desimal)
# - Keterangan tambahan tentang arti hasil
hasil_usia <- data.frame(
  Variabel = "Age",
  Metode_Analisis = "Mean", 
  Hasil = paste(round(mean_age, 2), "Years"),
  Keterangan = "Average Age Of Costumer"
)

# Menampilkan hasil analisis dalam bentuk tabel yang rapi 
# menggunakan fungsi kable dari library knitr
library(knitr)
kable(hasil_usia, caption = "Age Analysis - Mean")
Age Analysis - Mean
Variabel Metode_Analisis Hasil Keterangan
Age Mean 39.99 Years Average Age Of Costumer

1.3.2 Visualisasi Variabel Usia

# VISUALISASI USIA

# Memanggil library ggplot2 untuk membuat grafik
library(ggplot2)

# Membuat histogram dan kurva distribusi usia pelanggan
ggplot(mydata, aes(x = Age)) +
  
# Membuat histogram dengan lebar tiap batang 5 tahun,
# warna biru muda, dan batas putih
  geom_histogram(aes(y = after_stat(density)), 
                 binwidth = 5, fill = "skyblue", color = "white", alpha = 0.7) +
  
# Menambahkan garis kurva density (sebaran data)
  geom_density(color = "darkblue", size = 1, alpha = 0.7) +
 
# Menambahkan garis vertikal merah untuk menunjukkan nilai rata-rata usia
   geom_vline(xintercept = mean_age, color = "red", linetype = "dashed", size = 1.5) +
  
# Memberikan judul, subjudul, dan label sumbu
  labs(
    title = "ANALYSE THE AVERAGE AGE OF COSTUMER",
    subtitle = paste("Average Age:", mean_age, "Years"),
    x = "Age (Years)",
    y = "Density"
  ) +
 
# Menggunakan tema minimalis untuk tampilan bersih
   theme_minimal() +
  
# Menyesuaikan ukuran dan gaya teks agar lebih menarik
  theme(
    plot.title = element_text(size = 16, hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(size = 14, hjust = 0.5, color = "gray40"),
    axis.title = element_text(size = 12, face = "bold"),
    axis.text = element_text(size = 10),
    panel.grid.major = element_line(color = "grey90"),
    panel.grid.minor = element_line(color = "grey95")
  )

### Alasan & Interpretasi Interpretasi Usia

Hasil analisis menunjukkan bahwa usia median pelanggan adalah 39 tahun. Artinya, setengah dari pelanggan berusia di bawah 39 tahun, dan setengahnya lagi berusia di atas 39 tahun. Jadi, bisa dibilang sebagian besar pelanggan berada di usia dewasa produktif, yaitu usia yang umumnya sudah memiliki penghasilan tetap dan cukup aktif dalam melakukan pembelian produk.

Alasan

Karena data usia bersifat numerik dan berdistribusi cukup normal, maka mean (rata-rata) paling tepat digunakan untuk menggambarkan kecenderungan umum usia pelanggan secara keseluruhan.

1.3.3 Analisis Variabel Jenis Kelamin

# Menggunakan library modeest untuk menghitung nilai modus
library(modeest)
# ANALISIS JENIS KELAMIN - MODUS

# Menghitung modus (nilai yang paling sering muncul) dari variabel Gender
modus_jk <- mfv(mydata$Gender)

# Membuat data frame hasil analisis yang berisi:
# - Nama variabel (Gender)
# - Metode analisis yang digunakan (Mode)
# - Hasil perhitungan modus
# - Keterangan tambahan tentang arti hasil
hasil_jk <- data.frame(
  Variabel = "Gender",
  Metode_Analisis = "Mode",
  Hasil = as.character(modus_jk[1]), # Mengonversi hasil ke tipe karakter agar aman
  Keterangan = "The Most Genders",
  stringsAsFactors = FALSE  # Hindari factors
)
# Menampilkan hasil dalam tabel
kable(hasil_jk, caption = "Gender Analysis - Mode")
Gender Analysis - Mode
Variabel Metode_Analisis Hasil Keterangan
Gender Mode M The Most Genders

1.3.4 Visualisasi Variabel Jenis Kelamin

library(dplyr)
library(ggplot2)

# VISUALISASI 

# Mengecek apakah variabel "Gender" ada di dataset
if("Gender" %in% names(mydata)) {

# Membuat tabel frekuensi untuk setiap kategori Gender 
  gender_table <- table(mydata$Gender)
  
# Mengubah hasil tabel ke dalam bentuk data frame agar mudah diolah
  jk_summary <- data.frame(
    Gender = names(gender_table),
    n = as.numeric(gender_table),
    percentage = as.numeric(gender_table) / 
      sum(gender_table) * 100)
  
# Menambahkan kolom label yang berisi nama gender + jumlah + persentase
  jk_summary$label <- paste0(jk_summary$Gender, "\n", 
                            jk_summary$n, " (", 
                            round(jk_summary$percentage, 1), "%)")}

# Membuat visualisasi batang (bar chart) untuk distribusi jenis kelamin pelanggan
ggplot(jk_summary, aes(x = Gender, y = n, fill = Gender)) +
  
# Membuat batang berdasarkan jumlah pelanggan per gender
  geom_bar(stat = "identity", alpha = 0.8, width = 0.6) +
  
# Menambahkan label jumlah dan persentase di atas batang
  geom_text(aes(label = label), vjust = -0.5, size = 8, fontface = "bold") +
  
 # Memberikan judul, subjudul, dan label sumbu
  labs(
    title = "COSTUMER GENDER DISTRIBUTION ANALYSIS",
    subtitle = paste("Mode (The Most):", modus_jk[1], "-", 
    jk_summary$n[jk_summary$Gender == modus_jk[1]],
    "Costumer (", 
                    round(jk_summary$percentage[jk_summary$Gender == modus_jk[1]], 1), "%)"),
    x = "Gender",
    y = "Number Of Customers",
    caption = "Analyse Using Mode - The Most Common Value Appears"
  ) +
 
# Menggunakan tema minimalis agar tampilan bersih dan profesional
   theme_minimal() +
  
# Mengatur ukuran dan posisi teks serta tampilan grid
  theme(
    plot.title = element_text(size = 24, hjust = 0.5, face = "bold", margin = margin(b = 15)),
    plot.subtitle = element_text(size = 18, hjust = 0.5, color = "gray40", margin = margin(b = 20)),
    axis.title = element_text(size = 16, face = "bold"),
    axis.text = element_text(size = 14),
    plot.caption = element_text(size = 12, hjust = 0.5, margin = margin(t = 15)),
    legend.position = "none", # Menghilangkan legenda karena sudah ada label di batang
    panel.grid.major = element_line(color = "grey90"),
    panel.grid.minor = element_blank(),
    plot.margin = margin(2, 2, 2, 2, "cm")
  ) +
  
# Menentukan warna batang untuk setiap gender (misal M = biru, F = pink)
  scale_fill_manual(values = c("M" = "steelblue", "F" = "lightpink")) +
  
# Mengatur sumbu Y agar ada ruang kosong di atas batang
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)))

### Alasan & Interpretasi Interpretasi Jenis Kelamin

Hasil analisis menunjukkan bahwa jenis kelamin yang paling banyak adalah laki-laki (M). Artinya, sebagian besar pelanggan dalam data pembelian merupakan pria. Dari sini bisa disimpulkan bahwa pelanggan laki-laki lebih dominan dalam aktivitas pembelian. Hasil ini bisa jadi bahan pertimbangan bagi perusahaan untuk menyesuaikan strategi pemasaran, misalnya dengan memahami kebiasaan dan minat belanja laki-laki agar promosi lebih tepat sasaran.

Alasan

Karena gender adalah data kategori (tidak berupa angka), jadi yang bisa dicari hanyalah nilai yang paling sering muncul — yaitu modus.

1.3.5 Analisis Variabel Lokasi Toko

# ANALISIS LOKASI TOKO - MODUS

# Menggunakan library modeest untuk menghitung nilai modus
library(modeest)

# Menghitung modus (lokasi toko yang paling sering dikunjungi pelanggan)
modus_sl <- mfv(mydata$StoreLocation)

# Membuat data frame hasil analisis yang berisi:
# - Nama variabel (Store Location)
# - Metode analisis yang digunakan (Mode)
# - Nilai hasil modus (lokasi toko paling sering dikunjungi)
# - Keterangan tambahan tentang arti hasil
hasil_sl <- data.frame(
  Variabel = "Store Location",
  Metode_Analisis = "Mode",
  Hasil = modus_sl[1],
  Keterangan = "Most Frequently Visited Store Locations"
)
# Menampilkan hasil dalam tabel
kable(hasil_sl, caption = "Store Location Analysis - Mode")
Store Location Analysis - Mode
Variabel Metode_Analisis Hasil Keterangan
Store Location Mode East Most Frequently Visited Store Locations

1.3.6 Visualisasi Variabel Lokasi Toko

library(dplyr)
library(ggplot2)

# VISUALISASI LOKASI TOKO

# Mengecek apakah kolom "StoreLocation" ada dalam dataset
if("StoreLocation" %in% names(mydata)) {
  
# Membuat tabel frekuensi jumlah kunjungan untuk setiap lokasi toko
  sl_table <- table(mydata$StoreLocation)
  
# Mengonversi hasil tabel ke dalam bentuk data frame agar mudah diolah dan divisualisasikan
  sl_summary <- data.frame(
    StoreLocation = names(sl_table),
    n = as.numeric(sl_table),
    percentage = as.numeric(sl_table) / sum(sl_table) * 100)
  
 # Membuat kolom label berisi nama lokasi, jumlah kunjungan, dan persentase
  sl_summary$label <- paste0(sl_summary$StoreLocation, "\n", 
                            sl_summary$n, " (", 
                            round(sl_summary$percentage, 1), "%)")
 
# Membuat visualisasi batang (bar chart) distribusi lokasi toko yang dikunjungi 
  print(
    ggplot(sl_summary, aes(x = reorder(StoreLocation, n), y = n, fill = StoreLocation)) +
      
# Membuat batang berdasarkan jumlah kunjungan
      geom_col(alpha = 0.8, width = 0.6) +
     
# Menambahkan label di atas setiap batang
   geom_text(aes(label = label), 
                vjust = -0.5, 
                size = 6, 
                fontface = "bold",
                color = "black",
                lineheight = 0.8) +

  # Menambahkan judul, subjudul, label sumbu, dan caption
  labs(
        title = "ANALYSIS OF STORE LOCATION DISTRIBUTION",
        subtitle = paste("Mode (The Most):", modus_sl, "-", 
        sl_summary$n[sl_summary$StoreLocation == modus_sl], 
                        "Visit (",
        round(sl_summary$percentage[sl_summary$StoreLocation == modus_sl], 1), "%)"),
        x = "Store Location", 
        y = "Number Of Visits",
        caption = "Analysis Using Mode - The Location Most Frequently Visited"
      ) +
      
# Mengatur tampilan tema agar terlihat bersih dan elegan
  theme_minimal() +
      theme(
        plot.title = element_text(size = 24, hjust = 0.5, face = "bold", margin = margin(b = 15)),
        plot.subtitle = element_text(size = 18, hjust = 0.5, color = "gray40", margin = margin(b = 20)),
        axis.title = element_text(size = 16, face = "bold"),
        axis.text = element_text(size = 14),
        plot.caption = element_text(size = 12, hjust = 0.5, margin = margin(t = 15)),
        legend.position = "none",
        panel.grid.major = element_line(color = "grey90"),
        panel.grid.minor = element_blank(),
        plot.margin = margin(2, 2, 2, 2, "cm")
      ) +
      
# Memberi warna lembut pada batang menggunakan palet "Set2"
      scale_fill_brewer(palette = "Set2") +
      
# Memberikan ruang tambahan di atas batang agar label tidak terpotong
  scale_y_continuous(expand = expansion(mult = c(0, 0.3))))} 

1.3.7 Alasan & Interpretasi

Interpretasi

Dari hasil analisis, terlihat kalau toko yang paling sering dikunjungi ada di wilayah East. Jadi, bisa dibilang pelanggan paling banyak datang atau belanja di toko yang berada di area tersebut. Ini bisa jadi tanda kalau wilayah East punya minat belanja yang lebih tinggi dibanding lokasi lainnya.

Alasan

Ini juga data kategori (West, East, South, dll.), jadi ukuran pemusatan yang cocok adalah modus — lokasi yang paling sering muncul.

1.3.8 Analisis Variabel Kategori Produk

# ANALISIS KATEGORI - MODUS

# Memanggil library modeest untuk menghitung modus
# dan knitr untuk menampilkan hasil dalam bentuk tabel
library(modeest)
library(knitr)

# Menghitung modus (kategori produk yang paling sering dibeli oleh pelanggan)
modus_kp <- mfv(mydata$ProductCategory)

# Membuat data frame hasil analisis yang berisi:
# - Nama variabel (Product Category)
# - Metode analisis (Mode)
# - Nilai hasil modus (kategori produk paling sering dibeli)
# - Keterangan tambahan tentang arti hasil
hasil_kp <- data.frame(
  Variabel = "Product Category",
  Metode_Analisis = "Mode",
  Hasil = modus_kp[1],
  Keterangan = "Most Frequently Purchased Product Category"
)
# Menampilkan hasil dalam tabel
kable(hasil_kp, caption = "Product Category Analysis - Mode")
Product Category Analysis - Mode
Variabel Metode_Analisis Hasil Keterangan
Product Category Mode Clothing Most Frequently Purchased Product Category

1.3.9 Visualisasi Variabel Kategori Produk

library(ggplot2)
library(dplyr)
library(scales)

# Menghitung frekuensi setiap kategori produk dari variabel ProductCategory
kategori_freq <- as.data.frame(table(mydata$ProductCategory))
colnames(kategori_freq) <- c("ProductCategory", "n")

# Mengurutkan kategori berdasarkan jumlah pembelian (dari terbanyak ke paling sedikit)
kategori_freq <- kategori_freq[order(-kategori_freq$n), ]

# Menghitung persentase tiap kategori terhadap total pembelian
kategori_freq$percent <- round(kategori_freq$n / sum(kategori_freq$n) * 100, 1)

# Menyiapkan label untuk setiap batang pada grafik (jumlah dan persentase)
kategori_freq$label <- paste0(kategori_freq$n, " (", kategori_freq$percent, "%)")

# Visualisasi
ggplot(kategori_freq, aes(x = reorder(ProductCategory, n), y = n, fill = ProductCategory)) +
  
# Membuat batang berdasarkan jumlah pembelian tiap kategori
  geom_bar(stat = "identity", alpha = 0.8, width = 0.6) +
 
# Menambahkan label jumlah dan persentase di atas setiap batang
   geom_text(aes(label = label), vjust = -0.5, size = 6, fontface = "bold") +
  
# Menambahkan judul, subjudul, label sumbu, dan caption
  labs(
    title = "ANALYSIS OF PRODUCT CATEGORY DISTRIBUTION",
    subtitle = paste("Mode (The Most):", modus_kp[1], "-", 
              kategori_freq$n[kategori_freq$ProductCategory == modus_kp[1]], "Purchase (", 
kategori_freq$percent[kategori_freq$ProductCategory == modus_kp[1]], "%)"),
    x = "Product Category",
    y = "Purchase Amount",
    caption = "Analysis using Mode - the product category that is purchased the most"
  ) +
  
# Mengatur tema agar tampilan minimalis dan bersih
  theme_minimal() +
  theme(
    plot.title = element_text(size = 24, hjust = 0.5, face = "bold", margin = margin(b = 15)),
    plot.subtitle = element_text(size = 18, hjust = 0.5, color = "gray40", margin = margin(b = 20)),
    axis.title = element_text(size = 16, face = "bold"),
    axis.text = element_text(size = 14),
    plot.caption = element_text(size = 12, hjust = 0.5, margin = margin(t = 15)),
    legend.position = "none", # Menghilangkan legenda agar fokus ke batang
    panel.grid.major = element_line(color = "grey90"),
    panel.grid.minor = element_blank(),
    plot.margin = margin(2, 2, 2, 2, "cm")
  ) +
  
# Memberikan warna lembut untuk tiap kategori produk
  scale_fill_brewer(palette = "Set3") +
 
  # Memberikan ruang kosong di atas batang agar label tidak terpotong
   scale_y_continuous(expand = expansion(mult = c(0, 0.1)))

### Alasan & Interpretasi Interpretasi

Dari hasil analisis, diketahui bahwa produk yang paling sering dibeli pelanggan adalah kategori pakaian (Clothing). Artinya, dibandingkan dengan jenis produk lainnya, pakaian menjadi produk yang paling diminati dan paling banyak dibeli oleh pelanggan.

Alasan

Sama seperti lokasi, ini juga data kategori. Tidak bisa dihitung rata-ratanya, jadi gunakan modus untuk tahu kategori yang paling sering dibeli.

1.3.10 Analisis Variabel Total Pembelian

# ANALISIS TOTAL PEMBELIAN - MEDIAN

# Mengonversi kolom TotalPurchase ke tipe numerik
# (berguna jika datanya masih berupa karakter)
mydata$TotalPurchase <- as.numeric(mydata$TotalPurchase)

# Menghitung nilai median (nilai tengah) dari total pembelian pelanggan
# Parameter na.rm = TRUE digunakan untuk mengabaikan data yang hilang (NA)
median_purchase <- median(mydata$TotalPurchase, na.rm = TRUE)

# Membuat data frame hasil analisis yang berisi:
# - Nama variabel yang dianalisis (Total Purchase)
# - Metode analisis yang digunakan (Median)
# - Nilai hasil median yang sudah dibulatkan 2 desimal
# - Keterangan singkat tentang arti hasil
hasil_analisis <- data.frame(
  Variabel = "Total Purchase",
  Metode_Analisis = "Median",
  Hasil = paste("$", round(median_purchase, 2)),
  Keterangan = "The median total purchase of all customers"
)

# Tampilkan hasil dalam tabel
kable(hasil_analisis, caption = "Total Purchase Analysis - Median")
Total Purchase Analysis - Median
Variabel Metode_Analisis Hasil Keterangan
Total Purchase Median $ 108.5 The median total purchase of all customers

1.3.11 Visualisasi Variabel Total Pembelian

# VISUALISASI TOTAL PEMBELIAN
ggplot(mydata, aes(y = TotalPurchase)) +
  
# Membuat boxplot untuk melihat penyebaran data pembelian
  geom_boxplot(
    fill = "lightpink",    # Warna isi boxplot
    alpha = 0.7,           # Transparansi boxplot
    outlier.color = "red", # Warna titik outlier (nilai ekstrem)
    outlier.size = 2,      # Ukuran titik outlier
    outlier.shape = 16     # Bentuk titik outlier (bulat)
  ) +

# Menambahkan garis horizontal pada nilai median  
   geom_hline(
    aes(yintercept = median_purchase),  # Garis di posisi median
    color = "darkblue",                 # Warna garis median
    linetype = "dashed",                # Jenis garis putus-putus
    size = 1.2                          # Ketebalan garis
  ) +
  
# Memberi judul dan label sumbu
  labs(
    title = "TOTAL CUSTOMER PURCHASE DISTRIBUTION",
    subtitle = paste("Median Total Purchase: $", round(median_purchase, 2)),
    x = NULL,  # Hapus label sumbu X
    y = "Total Purchase ($)",
    caption = "Garis biru putus-putus menunjukkan nilai median"
  ) +
  
# Mengatur tampilan tema grafik agar lebih minimalis
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    plot.subtitle = element_text(size = 14, hjust = 0.5, color = "darkblue", face = "bold"),
    axis.title.y = element_text(size = 12, face = "bold"),
    axis.text.y = element_text(size = 10),
    axis.title.x = element_blank(),   # Menghapus judul sumbu X
    axis.text.x = element_blank(), # Menghapus teks di sumbu X
    panel.grid.major = element_line(color = "grey90"),  # Warna grid besar
    panel.grid.minor = element_blank() # Menghilangkan grid kecil
  ) +
  
 # Menambahkan teks anotasi untuk menunjukkan nilai median pada grafik
  annotate("text", 
           x = 0.7, 
           y = median_purchase,
           label = paste("MEDIAN\n$", round(median_purchase, 2)),
           color = "darkblue", 
           fontface = "bold",
           size = 4,
           vjust = -0.5)

1.3.12 Alasan & Interpretasi

Interpretasi

Dari hasil analisis, diketahui kalau total pembelian tengahnya ada di angka Rp108,5. Maksudnya, setengah dari pelanggan belanjanya kurang dari Rp108,5 dan setengahnya lagi lebih dari itu. Jadi bisa dibilang, rata-rata pembelian pelanggan umumnya ada di sekitar angka tersebut.

Alasan

Karena analisis ini menggunakan median sebagai ukuran pemusatan, maka nilai tengah dipakai untuk menunjukkan pembelian rata-rata pelanggan secara umum. Median dipilih agar dapat menggambarkan posisi tengah data secara lebih akurat tanpa terpengaruh oleh perbedaan jumlah pembelian yang besar antar pelanggan.

1.3.13 Analisis Variabel Jumlah Kunjungan

# ANALISIS JUMLAH KUNJUNGAN - MEAN

# Menghitung rata-rata (mean) dari jumlah kunjungan pelanggan
mean_nov <- mean(mydata$NumberOfVisits, na.rm = TRUE)
# na.rm = TRUE digunakan agar nilai NA (kosong) tidak dihitung dalam perhitungan rata-rata

# Membuat data frame untuk menampung hasil analisis
hasil_nov <- data.frame(
  Variabel = "Number Of Visits",
  Metode_Analisis = "Mean", 
  Hasil = paste(round(mean_nov)),
  Keterangan = "Average Number of Customer Visits")

# Menampilkan hasil menggunakan kable
library(knitr)
kable(hasil_nov, caption = "Analysis of Visit Numbers - Mean")
Analysis of Visit Numbers - Mean
Variabel Metode_Analisis Hasil Keterangan
Number Of Visits Mean 5 Average Number of Customer Visits

1.3.14 Visualisasi Variabel Jumlah Kunjungan

library(ggplot2)
ggplot(mydata, aes(x = NumberOfVisits)) +  # Sumbu X merepresentasikan jumlah kunjungan
  geom_histogram(aes(y = after_stat(density)), # Membuat histogram dengan sumbu Y = kepadatan (density)
                 binwidth = 1, fill = "orange", color = "white", alpha = 0.7) +
  
# Menambahkan garis kurva density (kepadatan data)
  geom_density(color = "darkorange", size = 1.5, alpha = 0.7) +
 
# Menambahkan garis vertikal di posisi rata-rata
   geom_vline(xintercept = mean_nov, color = "red", linetype = "dashed", size = 2) +
  labs(
    title = "ANALYSIS OF VISIT DISTRIBUTION (MEAN)",
    subtitle = paste("Mean (Average):", round(mean_nov, 2), "number of visits"),
    x = "Number Of Visits",
    y = "Density",
    caption = "Red Line = Mean | Analysis using the Mean for numerical data"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 24, hjust = 0.5, face = "bold", margin = margin(b = 15)),
    plot.subtitle = element_text(size = 18, hjust = 0.5, color = "gray40", margin = margin(b = 20)),
    axis.title = element_text(size = 16, face = "bold"),
    axis.text = element_text(size = 14),
    plot.caption = element_text(size = 12, hjust = 0.5, margin = margin(t = 15)),
    panel.grid.major = element_line(color = "grey90"),
    panel.grid.minor = element_line(color = "grey95"),
    plot.margin = margin(2, 2, 2, 2, "cm")
  ) +
  scale_x_continuous(breaks = seq(0, 12, by = 1))

1.3.15 Alasan & Interpretasi

Interpretasi

Dari hasil analisis, diketahui kalau rata-rata pelanggan berkunjung sekitar 5 kali. Jadi bisa dibilang, pelanggan cukup sering datang atau belanja, karena dalam data terlihat kebanyakan melakukan kunjungan lebih dari sekali.

Alasan Karena berupa angka dan bisa dijumlahkan, mean lebih menggambarkan rata-rata banyaknya kunjungan pelanggan.

1.3.16 Analisis Variabel Skor Umpan Balik

# ANALISIS SKOR UMPAN BALIK - MODUS
library(modeest)

modus_fs <- mfv(mydata$FeedbackScore)
hasil_fs <- data.frame(
  Variabel = "Feedback Score",
  Metode_Analisis = "Mode",
  Hasil = modus_fs[1],
  Keterangan = "Feedback Score given by many customers")

# Menampilkan hasil dalam tabel
kable(hasil_fs, caption = "Feedback Score Analysis - Mode")
Feedback Score Analysis - Mode
Variabel Metode_Analisis Hasil Keterangan
Feedback Score Mode 1 Feedback Score given by many customers

1.3.17 Visualisasi Variabel Skor Umpan Balik

feedback_table <- table(mydata$FeedbackScore)
feedback_freq <- data.frame(
  FeedbackScore = as.numeric(names(feedback_table)),
  n = as.numeric(feedback_table))

# Hitung persentase
feedback_freq$percent <- round(feedback_freq$n / sum(feedback_freq$n) * 100, 1)
feedback_freq$label <- paste0(feedback_freq$n, " (", feedback_freq$percent, "%)")

# VISUALISASI 
ggplot(feedback_freq, aes(x = factor(FeedbackScore), y = n, fill = factor(FeedbackScore))) +
  geom_bar(stat = "identity", alpha = 0.8, width = 0.7) +
  geom_text(aes(label = label), vjust = -0.5, size = 4, fontface = "bold") +
  labs(
    title = "DISTRIBUTION OF CUSTOMER FEEDBACK SCORES",
    subtitle = paste("Mode (Highest Score):", modus_fs[1], 
                    "-", feedback_freq$n[feedback_freq$FeedbackScore == modus_fs[1]], 
                    "responden (", 
                    feedback_freq$percent[feedback_freq$FeedbackScore == modus_fs[1]], "%)"),
    x = "Feedback Score",
    y = "Number of Respondents",
    caption = "Score 1: Very Dissatisfied | 5: Very Satisfied"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    plot.subtitle = element_text(size = 12, hjust = 0.5, color = "red", face = "bold", 
                                margin = margin(b = 15)),
    axis.title = element_text(size = 12, face = "bold"),
    axis.text = element_text(size = 10),
    legend.position = "none",
    panel.grid.major = element_line(color = "grey90"),
    panel.grid.minor = element_blank()
  ) +
  scale_fill_brewer(palette = "RdYlGn") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)))

1.3.18 Alasan & Interpretasi

Interpretasi

Dari grafik terlihat bahwa skor umpan balik yang paling banyak diberikan adalah skor 1 dengan 53 responden (26,5%). Artinya, sebagian besar responden memberikan penilaian rendah, jadi bisa dibilang umpan balik yang diterima cenderung kurang positif.

Alasan

Karena skor umpan balik termasuk data ordinal (bertingkat), ukuran pemusatan yang paling tepat digunakan adalah modus, yaitu nilai yang paling sering muncul dan dapat menunjukkan tingkat penilaian yang paling banyak diberikan pelanggan.

1.4 Kesimpulan

Berdasarkan hasil analisis data pelanggan, dapat disimpulkan bahwa mayoritas pelanggan berasal dari usia produktif dengan frekuensi belanja yang cukup rutin, serta didominasi oleh satu jenis kelamin tertentu. Produk yang sering dibeli menunjukkan preferensi utama pelanggan, sedangkan nilai mean, median, dan modus membantu memahami pola pengeluaran serta perilaku berbelanja secara umum. Secara keseluruhan, analisis ini memberikan gambaran yang berguna untuk menyusun strategi pemasaran dan meningkatkan pelayanan agar lebih sesuai dengan kebutuhan pelanggan.