Central Tendency Dataset
Practicum ~ Week 5
1

2 Definisi Central Tendency
Central tendency atau ukuran pemusatan data adalah konsep dasar dalam statistika yang digunakan untuk menggambarkan nilai tengah atau titik keseimbangan dari sekumpulan data. Tujuannya adalah memberikan satu nilai yang dapat mewakili keseluruhan data sehingga memudahkan dalam analisis dan interpretasi.
Ukuran pemusatan utama terdiri dari mean (rata-rata), median (nilai tengah), dan mode (nilai yang paling sering muncul).
2.1 Mean
Mean adalah nilai rata-rata yang diperoleh dengan menjumlahkan seluruh data kemudian membaginya dengan jumlah observasi. Mean memberikan gambaran umum posisi pusat data, namun nilai ini sangat sensitif terhadap data ekstrem (outlier). Ketika terdapat nilai yang sangat tinggi atau rendah, mean akan tertarik ke arah nilai tersebut sehingga tidak selalu mewakili pusat data dengan baik.
2.2 Median
Median adalah nilai yang berada tepat di tengah setelah data diurutkan dari yang terkecil ke terbesar. Jika jumlah data ganjil, median adalah nilai di posisi tengah. Jika jumlah data genap, median adalah rata-rata dari dua nilai di tengah. Median lebih stabil dibanding mean karena tidak terpengaruh oleh nilai ekstrem, sehingga sering digunakan untuk data yang memiliki sebaran tidak simetris.
2.3 Mode
Mode merupakan nilai yang paling sering muncul dalam data. Mode berguna untuk mengetahui kecenderungan nilai yang paling umum, terutama dalam data kategorik. Suatu data bisa memiliki satu mode (unimodal), dua mode (bimodal), atau lebih dari dua (multimodal).
3 Persiapan Data
Pada tahap ini digunakan dataset Customer Purchase Data yang masih berupa data mentah atau belum dilakukan proses pengolahan atau analisis apa pun. Dataset ini berisi informasi terkait pelanggan dan aktivitas belanja mereka di toko. Beberapa variabel yang tersedia di dalam data antara lain:
- CustomerID: sebagai kode identitas unik untuk setiap pelanggan.
- Age: menunjukkan usia dari masing-masing pelanggan.
- Gender: menjelaskan jenis kelamin pelanggan, yaitu M untuk laki-laki dan F untuk perempuan.
- StoreLocation: menggambarkan lokasi toko tempat transaksi dilakukan (North, South, East, atau West).
- ProductCategory: yaitu kategori produk yang dibeli oleh pelanggan.
- TotalPurchase: berisi total nilai pembelian pelanggan (dalam satuan uang, misalnya dolar atau ribuan rupiah).
- NumberOfVisits: menunjukkan seberapa sering pelanggan berkunjung ke toko.
- FeedbackScore: skor penilaian dari pelanggan terhadap pengalaman belanja mereka dengan skala 1 - 5.
library(readr)
library(ggplot2)
library(knitr)
library(DT)
library(statip)
# Import Data CSV
dataset_ct <- read_csv("Central Tendency.csv", show_col_types = FALSE)
# menampilkan Data CSV
datatable(head(dataset_ct, 200), caption = "Dataset Central Tendency")# Import data
library(modeest)
library(DT)
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
# Hitung CT age
mean_age <- mean(dataset_ct$Age, na.rm = TRUE)
median_age <- median(dataset_ct$Age, na.rm = TRUE)
mode_age <- mfv(dataset_ct$Age)
# Hitung CT purchase
mean_purchase <- mean(dataset_ct$TotalPurchase, na.rm = TRUE)
median_purchase <- median(dataset_ct$TotalPurchase, na.rm = TRUE)
mode_purchase <- mfv(dataset_ct$TotalPurchase)
# Hitung CT visits
mean_visits <- mean(dataset_ct$NumberOfVisits, na.rm = TRUE)
median_visits <- median(dataset_ct$NumberOfVisits, na.rm = TRUE)
mode_visits <- mfv(dataset_ct$NumberOfVisits)
# Hitung CT feedback
mean_feedback <- mean(dataset_ct$FeedbackScore, na.rm = TRUE)
median_feedback <- median(dataset_ct$FeedbackScore, na.rm = TRUE)
mode_feedback <- mfv(dataset_ct$FeedbackScore)
# Masukkan data ke dalam tabel
hasil <- data.frame(
Variabel = c("Age", "Total Purchase", "Number of Visits", "Feedback Score"),
Mean = c(mean_age, mean_purchase, mean_visits, mean_feedback),
Median = c(median_age, median_purchase, median_visits, median_feedback),
Mode = c(mode_age, mode_purchase, mode_visits, mode_feedback)
)
datatable(hasil)4 Visualisasi Central Tendency
4.1 Symmetrical Distribution
Distribusi simetris adalah bentuk sebaran data di mana nilai-nilai data tersebar merata di sekitar titik tengahnya. Pada distribusi ini, nilai mean, median, dan mode biasanya hampir sama dan terletak berdekatan di bagian tengah grafik. Bentuknya biasanya menyerupai lonceng atau bell-shaped curve, yang menunjukkan kalau data tidak condong ke kiri maupun ke kanan, jadi sebarannya seimbang.
library(ggplot2)
library(plotly)
library(dplyr)
library(readr)
# Import Data CSV
data_ct <- read_csv("Central Tendency.csv", show_col_types = FALSE)
# Pilih variabel NumberOfVisits untuk dianalisis
data_visits <- data_ct %>%
select(NumberOfVisits) %>%
filter(!is.na(NumberOfVisits))
# Hitung ukuran pemusatan
mean_val <- mean(data_visits$NumberOfVisits)
median_val <- median(data_visits$NumberOfVisits)
mode_val <- as.numeric(names(
sort(table(round(data_visits$NumberOfVisits, 0)), decreasing = TRUE)[1]
))
# Visualisasi: Histogram + Density Curve Interaktif
p <- ggplot(data_visits, aes(x = NumberOfVisits)) +
geom_histogram(
aes(y = after_stat(density)),
bins = 10,
fill = "#80cdc1", # warna batang lembut
color = "white",
alpha = 0.85
) +
geom_density(
color = "#01665e", # warna kurva lebih tegas
linewidth = 1.4,
alpha = 0.9,
adjust = 1.1
) +
geom_vline(aes(xintercept = mean_val, color = "Mean"), linewidth = 1.1) +
geom_vline(aes(xintercept = median_val, color = "Median"),
linewidth = 1.2, linetype = "dashed") +
geom_vline(aes(xintercept = mode_val, color = "Mode"),
linewidth = 1.2, linetype = "dotdash") +
scale_color_manual(
values = c("Mean" = "#b2182b", "Median" = "#4dac26", "Mode" = "#2166ac")
) +
labs(
title = "Distribusi Number of Visits (Symmetrical Distribution)",
subtitle = "Mean, Median, dan Mode berdekatan — distribusi cenderung normal",
x = "Number of Visits",
y = "Density",
color = "Ukuran Pemusatan"
) +
theme_minimal(base_size = 10) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 16),
plot.subtitle = element_text(hjust = 0.5, color = "gray40", size = 12),
legend.position = "bottom",
legend.title = element_text(face = "bold"),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank()
)
# Jadikan interaktif
ggplotly(p, tooltip = c("x", "y"))Interpretasi: Pada grafik distribusi Number of Visits, terlihat bahwa batang-batang histogram membentuk pola yang hampir seimbang di sisi kiri dan kanan titik tengah. Sebagian besar pelanggan memiliki jumlah kunjungan di sekitar nilai rata-rata, sedangkan semakin sedikit pelanggan yang memiliki jumlah kunjungan yang sangat rendah atau sangat tinggi. Garis lengkung kepadatan menunjukkan bentuk lonceng yang cukup halus, menandakan distribusi data yang stabil. Garis vertikal untuk mean, median, dan mode terlihat berdekatan di pusat grafik, yang mengindikasikan bahwa ketiga ukuran pemusatan tersebut memiliki nilai yang hampir sama.
Kesimpulan: Dari grafik tersebut dapat disimpulkan bahwa jumlah kunjungan pelanggan memiliki distribusi yang cenderung simetris atau stabil dan tidak menunjukkan kemiringan distribusi ke salah satu sisi, di mana data tersebar merata di sekitar nilai tengah. Hal ini menunjukkan bahwa sebagian besar pelanggan memiliki jumlah kunjungan yang relatif serupa, dan tidak ada perbedaan ekstrem antara pelanggan dengan kunjungan rendah dan tinggi.
library(ggplot2)
library(plotly)
library(dplyr)
library(tidyr)
library(readr)
# Import Data CSV
data_ct <- read_csv("Central Tendency.csv", show_col_types = FALSE)
# Pilih variabel Age untuk dianalisis
data_age <- data_ct %>%
select(Age) %>%
filter(!is.na(Age)) # hapus data kosong agar analisis bersih
# Hitung Ukuran Pemusatan (Central Tendency)
mean_val <- mean(data_age$Age)
median_val <- median(data_age$Age)
# Ambil nilai mode
mode_val <- as.numeric(names(
sort(table(round(data_age$Age, 0)),
decreasing = TRUE)[1]
))
# Visualisasi: Histogram + Density Curve Interaktif
p <- ggplot(data_age, aes(x = Age)) +
geom_histogram(
aes(y = after_stat(density)),
bins = 20, # jumlah batang histogram
fill = "#5ab4ac", # warna batang
color = "white", # garis tepi batang
alpha = 0.8 # transparansi
) +
geom_density(
color = "#2b8cbe", # warna garis kepadatan
linewidth = 1.3,
alpha = 0.9
) +
geom_vline(aes(xintercept = mean_val, color = "Mean"), linewidth = 1.2) +
geom_vline(aes(xintercept = median_val, color = "Median"),
linewidth = 1.2, linetype = "dashed") +
geom_vline(aes(xintercept = mode_val, color = "Mode"),
linewidth = 1.2, linetype = "dotdash") +
labs(
title = "Distribusi Umur (Symmetrical / Normal Distribution)",
subtitle = "Mean, Median, dan Mode berdekatan di pusat distribusi",
x = "Age (Umur)",
y = "Density",
color = "Ukuran Pemusatan"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 15),
plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
legend.position = "bottom"
)
ggplotly(p, tooltip = c("x", "y"))Interpretasi: Berdasarkan grafik distribusi variabel Age, terlihat bahwa nilai mean dan median berada cukup berdekatan, menunjukkan bahwa sebaran data mendekati distribusi simetris. Namun, mode sedikit bergeser ke kiri, menandakan bahwa sebagian besar responden berada pada kelompok usia muda, sementara hanya sedikit responden dengan usia yang lebih tua. Dengan demikian, data usia dapat dikatakan hampir simetris, tetapi masih ada sedikit kemiringan ke kanan karena adanya responden dengan usia tinggi.
Kesimpulan: Distribusi usia responden hampir simetris, dengan mayoritas berada di usia muda dan beberapa di usia lebih tinggi yang sedikit menarik distribusi ke kanan. Secara keseluruhan, sebaran usia cukup seimbang dan mendekati distribusi normal.
4.2 Extreme Values Right Skewed Distribution - Total Purchase
Distribusi dengan nilai ekstrem (skewed distribution) terjadi ketika data memiliki sebaran yang tidak merata.Pada right-skewed distribution, sebagian besar data berada di sisi kiri grafik dan ekor distribusi memanjang ke kanan karena adanya nilai yang sangat tinggi. Sebaliknya, left-skewed distribution memiliki ekor panjang di sisi kiri. Dalam kondisi seperti ini, mean tertarik ke arah ekor (nilai ekstrem), sementara median tetap lebih stabil sebagai ukuran pusat.
library(ggplot2)
library(dplyr)
library(plotly)
# Import Data CSV
dataset_ct <- read_csv("Central Tendency.csv", show_col_types = FALSE)
# Pilih variabel TotalPurchase
data_purchase <- dataset_ct %>%
select(TotalPurchase) %>%
filter(!is.na(TotalPurchase)) # hapus nilai NA
# Hitung ukuran pemusatan
mean_val <- mean(dataset_ct$TotalPurchase)
median_val <- median(dataset_ct$TotalPurchase)
mode_val <- as.numeric(names(sort(table(round(dataset_ct$TotalPurchase, 0)),
decreasing = TRUE)[1]))
# Visualisasi Right Skewed
p <- ggplot(dataset_ct, aes(x = TotalPurchase)) +
geom_histogram(
aes(y = after_stat(density)),
bins = 30,
fill = "#74a9cf",
color = "white",
alpha = 0.8
) +
geom_density(
color = "#045a8d",
linewidth = 1.3,
alpha = 0.9
) +
geom_vline(aes(xintercept = mean_val, color = "Mean"), linewidth = 1.2) +
geom_vline(aes(xintercept = median_val, color = "Median"), linewidth = 1.2,
linetype = "dashed") +
geom_vline(aes(xintercept = mode_val, color = "Mode"), linewidth = 1.2,
linetype = "dotdash") +
labs(
title = "Distribusi Total Purchase (Right-Skewed)",
subtitle = "Sebagian besar pelanggan memiliki pembelian kecil,
beberapa ekstrem di sisi kanan",
x = "Total Purchase",
y = "Density",
color = "Ukuran Pemusatan"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 15),
plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
legend.position = "bottom"
)
ggplotly(p, tooltip = c("x", "y")) # Visualisasi InteraktifInterpretasi: Berdasarkan grafik distribusi Total Purchase, terlihat bahwa sebagian besar pelanggan melakukan pembelian dengan jumlah kecil (berkumpul di sisi kiri grafik). Namun, ada beberapa pelanggan yang melakukan pembelian jauh lebih besar dari rata-rata, sehingga membentuk ekor panjang di sisi kanan. Posisi garis mean yang lebih ke kanan dibanding median menunjukkan bahwa rata-rata total pembelian dipengaruhi oleh beberapa nilai ekstrem (pelanggan dengan pembelian tinggi).
Kesimpulan: Distribusi Total Purchase menunjukkan pola miring ke kanan (right-skewed), di mana sebagian besar pelanggan berbelanja dalam jumlah kecil, namun ada beberapa pelanggan dengan pembelian besar yang menaikkan rata-rata total pembelian.
4.3 Boxplot (produk kaategori vs total purchase)
Boxplot digunakan untuk menggambarkan persebaran data berdasarkan lima nilai penting: minimum, kuartil pertama (Q1), median, kuartil ketiga (Q3), dan maksimum. Visualisasi ini juga menampilkan outlier sebagai titik yang terpisah dari kotak utama. Boxplot memudahkan dalam melihat persebaran data, mendeteksi nilai ekstrem, dan membandingkan distribusi antar kelompok secara cepat.
library(ggplot2)
library(dplyr)
library(tidyr)
library(plotly)
library(readr)
# Import Data CSV
dataset_ct <- read_csv("Central Tendency.csv", show_col_types = FALSE)
# Seleksi Variabel
data_box <- dataset_ct %>%
select(ProductCategory, TotalPurchase) %>%
drop_na()
# Hitung Mean dan Mode Keseluruhan
mean_val <- mean(data_box$TotalPurchase, na.rm = TRUE)
dens <- density(data_box$TotalPurchase, na.rm = TRUE)
mode_val <- dens$x[which.max(dens$y)]
# Membuat Boxplot Interaktif
p <- ggplot(data_box, aes(
x = ProductCategory,
y = TotalPurchase,
fill = ProductCategory,
text = paste0(
"Kategori Produk: ", ProductCategory, "<br>",
"Total Purchase: ", round(TotalPurchase, 2)
)
)) +
geom_boxplot(
alpha = 0.8,
color = "gray30",
outlier.colour = "red",
outlier.shape = 16,
outlier.size = 2
) +
# Garis Mean Global
geom_hline(yintercept = mean_val, color = "#1b9e77", linewidth = 1.2) +
# Garis Mode Global
geom_hline(yintercept = mode_val, color = "#d95f02", linewidth = 1.2, linetype
= "dashed") +
# Label anotasi nilai mean & mode
annotate(
"text", x = 5.3, y = mean_val,
label = sprintf("Mean = %.1f", mean_val),
color = "#1b9e77", hjust = 0, vjust = -0.5, fontface = "bold", size = 3.8
) +
annotate(
"text", x = 5.3, y = mode_val,
label = sprintf("Mode = %.1f", mode_val),
color = "#d95f02", hjust = 0, vjust = -0.5, fontface = "bold", size = 3.8
) +
labs(
title = "Distribusi Total Purchase per Product Category",
subtitle = "Garis hijau = Mean global | Garis oranye = Mode global",
x = "Kategori Produk",
y = "Total Purchase",
fill = "Kategori Produk"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 15),
plot.subtitle = element_text(hjust = 0.5, color = "gray30"),
legend.position = "none"
)
ggplotly(p, tooltip = c("x", "y", "text")) # agar interaktifInterpretasi: Berdasarkan grafik boxplot untuk variabel Total Purchase per kategori produk, terlihat bahwa nilai pembelian paling tinggi terdapat pada kategori Sports dan Electronics. Sementara kategori Books, Clothing, dan Home memiliki nilai pembelian yang relatif rendah. Terlihat juga adanya outlier pada kategori Electronics, yang menunjukkan ada beberapa pelanggan dengan jumlah pembelian jauh di atas rata-rata. Nilai mean yang lebih tinggi dari median menunjukkan adanya pengaruh nilai pembelian besar tersebut terhadap rata-rata total pembelian.
Kesimpulan: Dari grafik boxplot, terlihat bahwa pembelian produk tidak merata antar kategori. Kategori Sports dan Electronics mendominasi total pembelian, sementara kategori lain cenderung rendah. Adanya beberapa outlier pada Electronics membuat rata-rata total pembelian menjadi lebih tinggi dari median.
4.4 Violin + Boxplot of Bimodal Distribution
Violin plot adalah gabungan antara boxplot dan grafik kepadatan (density plot). Bentuknya seperti biola, di mana bagian yang lebih lebar menunjukkan banyaknya data di rentang nilai tersebut. Saat digabung dengan boxplot di tengahnya, kita bisa lihat dua hal sekaligus yaitu sebaran data (dari bentuk violin) dan ringkasan statistik seperti median serta kuartil (dari boxplot).Pada data yang bimodal, violin plot biasanya menunjukkan dua tonjolan yang menandakan adanya dua kelompok nilai dominan.
library(ggplot2)
library(dplyr)
library(plotly)
library(readr)
# Impor Data CSV
data <- read_csv("Central Tendency.csv", show_col_types = FALSE)
# Filter data (hanya pilih lokasi South)
data_south <- data %>%
filter(StoreLocation == "South") %>%
drop_na(FeedbackScore)
# Hitung Mean dan Median
mean_val <- mean(data_south$FeedbackScore, na.rm = TRUE)
median_val <- median(data_south$FeedbackScore, na.rm = TRUE)
# Plot Violin + Boxplot Interaktif
p <- ggplot(data_south, aes(x = "", y = FeedbackScore)) +
geom_violin(
fill = "#9ecae1",
color = "#3182bd",
alpha = 0.6,
trim = FALSE
) +
geom_boxplot(
width = 0.15,
fill = "#08519c",
color = "gray90",
alpha = 0.7,
outlier.colour = "#fb6a4a",
outlier.size = 2
) +
geom_hline(aes(yintercept = mean_val, color = "Mean"), linewidth = 1.2) +
geom_hline(aes(yintercept = median_val, color = "Median"),
linewidth = 1.2, linetype = "dashed") +
labs(
title = "Violin + Boxplot Distribusi Bimodal — Feedback Score (South)",
subtitle = "Menggambarkan kepadatan dan persebaran nilai feedback secara detail",
x = "",
y = "Feedback Score",
color = "Measure"
) +
scale_color_manual(values = c("Mean" = "#08519c", "Median" = "#ff7f00")) +
theme_minimal(base_size = 10) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
legend.position = "bottom"
)
ggplotly(p, tooltip = c("y"))Interpretasi: Berdasarkan grafik Violin + Boxplot untuk variabel Feedback Score (South), terlihat bahwa data memiliki dua puncak utama yaitu di sekitar skor 1–2 dan 4–5, dengan nilai mean dan median berada di sekitar skor 3, dan tidak terdapat outlier karena Feedback Score hanya memiliki rentang nilai antara 1 sampai 5.
Kesimpulan: Hal ini menunjukkan bahwa adanya dua kelompok pelanggan yang dominan dimana sebagian kelompok memberikan penilaian rendah dan sebagian lainnya memberikan penilaian tinggi. Sehingga secara keseluruhan persebaran data masih cukup seimbang (berada dalam rentang normal), meskipun pola distribusinya bimodal.
5 Solusi Keseluruhan
Berdasarkan hasil analisis ukuran pemusatan dan distribusi data, kita bisa mendapatkan solui dari masing masing hasil visualisasi berikut:
Total Purchase (Right-Skewed) Sebagian besar pelanggan berbelanja kecil dengan sedikit pelanggan bertransaksi besar. Solusi: Fokuskan strategi upselling dan cross-selling, serta buat program loyalitas untuk pelanggan bernilai tinggi agar rata-rata pembelian meningkat.
Number of Visits (Symmetrical) Frekuensi kunjungan pelanggan stabil dan merata. Solusi: Pertahankan pola ini dengan program reward kunjungan rutin dan pantau pelanggan dengan frekuensi rendah agar tetap aktif.
Product Category (Boxplot) Kategori Electronics dan Sports mendominasi penjualan, sementara kategori lain rendah. Solusi: Maksimalkan promosi dan stok pada kategori unggulan, serta gunakan cross-promotion untuk menaikkan kategori lemah seperti Books dan Clothing.
Feedback Score (Violin) Dua kelompok pelanggan muncul: sangat puas dan tidak puas. Solusi: Lakukan evaluasi layanan dan kualitas produk di wilayah bermasalah (South), tindak lanjuti pelanggan tidak puas, dan jaga hubungan dengan pelanggan puas melalui program loyalitas dan survei kepuasan.
Kesimpulan Akhir:
Pelanggan menunjukkan perilaku kunjungan yang stabil namun nilai pembelian dan kepuasan masih beragam. Untuk hasil optimal, perusahaan perlu menerapkan strategi peningkatan nilai transaksi, perbaikan layanan pelanggan, dan penguatan kategori produk unggulan berdasarkan data.Pendekatan ini akan membantu meningkatkan pendapatan, retensi pelanggan, dan citra merek secara berkelanjutan.