UTS Pengantar Statistika
Ujian Tengah Semester
Fadli Nafsin
Menempuh pendidikan di bidang Sains Data di Institut Teknologi Sains Bandung (ITSB), dengan ketertarikan pada Data Science, Data Analytics, dan pengembangan solusi berbasis data. Memiliki semangat untuk terus belajar, bereksplorasi, dan mengembangkan kemampuan di dunia teknologi dan data.
1 Petunjuk dan Ruang Lingkup
Dokumen ini memuat ringkasan materi Minggu 1–7 dan analisis eksploratif terhadap dataset 30 hari. Analisis pada Soal 2 dilakukan menggunakan R agar hasil tabel, ukuran statistik, dan visualisasi dapat diperbarui langsung dari dataset. Nilai ekstrem tetap dipertahankan pada analisis awal dan diperiksa berdasarkan konteks, bukan langsung dihapus.
2 Soal 1 – Ringkasan Materi Minggu 1–7
2.1 Minggu 1 – Konsep Dasar Statistika dan Data
Statistika merupakan ilmu yang mempelajari cara mengumpulkan, mengolah, menyajikan, menganalisis, dan menafsirkan data untuk membantu pengambilan keputusan. Statistika deskriptif menggambarkan data yang tersedia, sedangkan statistika inferensial menarik kesimpulan tentang populasi berdasarkan sampel. Populasi adalah seluruh objek yang menjadi perhatian, sementara sampel merupakan sebagian anggota populasi yang diamati. Parameter menggambarkan karakteristik populasi dan statistik menggambarkan karakteristik sampel. Variabel numerik berupa angka yang dapat dihitung, sedangkan variabel kategorik menunjukkan kelompok. Variabel independen berperan sebagai faktor penjelas, sementara variabel dependen menjadi hasil yang diamati. Contohnya, perusahaan menilai apakah kanal transaksi (independen) berkaitan dengan nilai transaksi (dependen). Konsep ini digunakan untuk menentukan tujuan analisis dan memahami batas kesimpulan dari data.
2.2 Minggu 2 – Jenis Data dan Skala Pengukuran
Data dibedakan menjadi kualitatif dan kuantitatif. Data kualitatif berupa kategori, seperti kanal Online dan Offline, sedangkan data kuantitatif berupa angka. Data kuantitatif diskrit merupakan hasil hitungan, misalnya jumlah transaksi, sementara data kontinu dapat diukur, seperti waktu proses. Sumber data dapat berupa data primer yang dikumpulkan langsung melalui survei atau pengamatan dan data sekunder yang berasal dari laporan atau basis data yang sudah tersedia. Skala pengukuran terdiri atas nominal (kategori tanpa urutan), ordinal (kategori berurutan), interval (jarak sama tanpa nol mutlak), dan rasio (jarak sama dengan nol mutlak). Dalam dataset, observasi adalah baris pengamatan dan variabel adalah kolom. Feature merupakan variabel masukan untuk analisis atau model, sedangkan target adalah variabel yang ingin diprediksi.
| Skala | Karakteristik | Contoh |
|---|---|---|
| Nominal | Kategori tanpa urutan | Kanal transaksi |
| Ordinal | Kategori memiliki urutan | Tingkat kepuasan |
| Interval | Jarak sama, tanpa nol mutlak | Suhu Celsius |
| Rasio | Jarak sama, memiliki nol mutlak | Waktu proses, jumlah transaksi |
2.3 Minggu 3 – Pengumpulan Data dan Sampling
Pengumpulan data bertujuan memperoleh informasi sesuai kebutuhan penelitian. Data primer dikumpulkan langsung melalui survei atau wawancara, sedangkan data sekunder berasal dari laporan atau basis data yang tersedia. Sampling adalah pemilihan sebagian anggota populasi untuk diteliti. Pada probability sampling, peluang setiap anggota untuk terpilih dapat diketahui, misalnya simple random, systematic, stratified, dan cluster sampling. Pada non-probability sampling, peluang pemilihan tidak diketahui secara pasti, misalnya convenience, purposive, quota, dan snowball sampling. Pemilihan metode perlu mempertimbangkan tujuan, kerangka sampel, waktu, biaya, serta potensi bias. Sampel yang besar belum tentu mewakili populasi jika cara pemilihannya tidak tepat.
| Probability sampling | Non-probability sampling |
|---|---|
| Peluang pemilihan dapat diketahui | Peluang pemilihan tidak diketahui secara pasti |
| Mendukung generalisasi jika rancangan tepat | Generalisasi lebih terbatas |
| Contoh: acak sederhana, stratifikasi | Contoh: purposive, convenience |
| Jenis bias | Penyebab utama |
|---|---|
| Sampling bias | Sampel tidak mewakili populasi karena cara pemilihan |
| Response bias | Responden menjawab tidak jujur atau tidak akurat |
| Measurement bias | Alat atau prosedur pengukuran menghasilkan nilai yang keliru |
Data juga dapat dikumpulkan melalui observasi, yaitu mencatat kejadian tanpa memberi perlakuan, dan eksperimen, yaitu memberi perlakuan untuk menguji pengaruhnya. Perusahaan layanan digital, misalnya, dapat mengamati catatan transaksi harian atau menguji perubahan alur layanan pada kelompok tertentu. Observasi cocok untuk menggambarkan kondisi operasional secara alami, sedangkan eksperimen digunakan untuk menguji dampak suatu perubahan.
2.4 Minggu 4 – Penyajian dan Visualisasi Data
Penyajian data membantu pembaca melihat pola dan membandingkan informasi. Tabel distribusi frekuensi merangkum banyaknya data pada kategori atau kelas tertentu. Frekuensi relatif diperoleh dari frekuensi kelas dibagi jumlah seluruh data, sedangkan frekuensi kumulatif merupakan penjumlahan frekuensi secara bertahap. Untuk data numerik berkelompok, banyak kelas dapat diperkirakan dengan aturan Sturges, \(k = 1 + 3{,}322\log_{10}(n)\), lalu lebar kelas ditentukan dari rentang dibagi banyak kelas. Diagram batang dan lingkaran cocok untuk kategori, sedangkan histogram cocok untuk data numerik. Poligon frekuensi dan ogive juga dapat digunakan untuk menunjukkan bentuk distribusi dan frekuensi kumulatif. Visualisasi harus memiliki judul, label, skala yang wajar, serta tidak menyesatkan. Pemilihan grafik disesuaikan dengan jenis data dan tujuan analisis.
| Bentuk penyajian | Kegunaan utama |
|---|---|
| Diagram batang | Membandingkan frekuensi kategori |
| Diagram lingkaran | Menunjukkan proporsi kategori |
| Histogram | Melihat bentuk distribusi numerik |
| Poligon frekuensi | Membandingkan bentuk distribusi |
| Ogive | Melihat frekuensi kumulatif |
| Stem-and-leaf | Menampilkan pola sekaligus nilai data |
Contoh singkat di R:
contoh_kategori <- c("Online", "Offline", "Online", "Online", "Offline")
freq <- table(contoh_kategori)
freq # frekuensi absolut## contoh_kategori
## Offline Online
## 2 3
## contoh_kategori
## Offline Online
## 0.4 0.6
## Offline Online
## 2 5
barplot(table(contoh_kategori), col = c("#78a9c5", "#e6ad65"),
main = "Contoh Frekuensi Kanal", ylab = "Frekuensi")##
## The decimal point is 1 digit(s) to the right of the |
##
## 1 | 25
## 2 | 135
## 3 | 18
2.5 Minggu 5 – Ukuran Pemusatan dan Sebaran
Ukuran pemusatan menunjukkan pusat data: mean adalah rata-rata, median nilai tengah setelah data diurutkan, dan modus nilai yang paling sering muncul. Ukuran sebaran menggambarkan variasi data. Rentang adalah selisih maksimum dan minimum, varians merupakan rata-rata kuadrat penyimpangan dari mean, sedangkan standar deviasi adalah akar varians. Koefisien variasi (CV) membandingkan standar deviasi dengan mean dalam persentase dan berguna untuk membandingkan variasi relatif jika mean positif. Kuartil membagi data menjadi empat bagian, sementara IQR adalah selisih kuartil ketiga dan pertama. Nilai ekstrem dapat menarik mean dan memperbesar standar deviasi, tetapi median lebih tahan terhadap pengaruhnya. Mean dan standar deviasi sesuai untuk data relatif simetris; median dan IQR lebih informatif untuk distribusi miring atau data dengan nilai ekstrem.
\[ \bar{x}=\frac{\sum x_i}{n},\qquad s^2=\frac{\sum (x_i-\bar{x})^2}{n-1},\qquad s=\sqrt{s^2} \]
\[ CV=\frac{s}{\bar{x}}\times100\%,\qquad IQR=Q_3-Q_1 \]
Contoh singkat di R:
x_contoh <- c(12, 14, 15, 15, 19)
w_contoh <- c(1, 1, 2, 2, 1)
c(mean = mean(x_contoh), weighted_mean = weighted.mean(x_contoh, w_contoh),
median = median(x_contoh), sd = sd(x_contoh), range = diff(range(x_contoh)))## mean weighted_mean median sd range
## 15.00000 15.00000 15.00000 2.54951 7.00000
2.6 Minggu 6 – Distribusi Data dan Outlier
Ukuran posisi menunjukkan letak nilai dalam data terurut. Kuartil membagi data menjadi empat bagian, desil sepuluh bagian, dan persentil seratus bagian; median adalah kuartil kedua atau persentil ke-50. IQR, yaitu selisih kuartil ketiga dan pertama, menggambarkan sebaran 50% data tengah. Outlier dapat ditandai dengan batas \(Q_1-1{,}5(IQR)\) dan \(Q_3+1{,}5(IQR)\). Metode lain menggunakan z-score, yaitu jarak nilai dari mean dalam satuan standar deviasi; nilai \(|z|>3\) sering diperiksa sebagai nilai ekstrem. Boxplot merangkum median, kuartil, dan outlier. Nilai ekstrem tidak langsung dihapus karena mungkin merupakan kesalahan pencatatan atau kejadian nyata.
\[ IQR=Q_3-Q_1,\qquad z_i=\frac{x_i-\bar{x}}{s} \] \[ B_{bawah}=Q_1-1{,}5(IQR),\qquad B_{atas}=Q_3+1{,}5(IQR) \]
Contoh singkat di R:
x_posisi <- c(10, 12, 13, 14, 15, 16, 18, 40)
quantile(x_posisi, probs = c(0.1, 0.25, 0.5, 0.75, 0.9))## 10% 25% 50% 75% 90%
## 11.40 12.75 14.50 16.50 24.60
## [1] 3.75
## [1] -0.76210308 -0.55186775 -0.44675008 -0.34163242 -0.23651475 -0.13139708
## [7] 0.07883825 2.39142691
## mean median
## 17.25 14.50
Pada distribusi simetris, mean dan median biasanya berdekatan. Pada distribusi right-skewed, ekor memanjang ke nilai besar sehingga mean umumnya lebih tinggi daripada median. Pada distribusi left-skewed, ekor memanjang ke nilai kecil sehingga mean umumnya lebih rendah daripada median. Perbandingan mean dan median membantu mengenali kemencengan, tetapi histogram dan boxplot tetap perlu diperiksa.
Perbandingan metode IQR dan z-score dalam mendeteksi outlier:
| Aspek | Metode IQR | Metode z-score |
|---|---|---|
| Dasar | Kuartil (Q1, Q3) | Mean dan standar deviasi |
| Batas | Q1 − 1,5·IQR dan Q3 + 1,5·IQR | |z| > 2 atau |z| > 3 |
| Pengaruh nilai ekstrem | Lebih kebal | Ikut ditarik oleh nilai ekstrem |
| Cocok untuk | Distribusi miring | Distribusi mendekati simetris |
2.7 Minggu 7 – Exploratory Data Analysis (EDA)
Exploratory Data Analysis (EDA) merupakan proses mengeksplorasi data untuk memahami struktur, kualitas, pola, hubungan, dan kemungkinan anomali sebelum membuat kesimpulan. Tahapannya meliputi pemeriksaan kualitas data, analisis univariat, perbandingan kelompok, analisis bivariat atau multivariat, pemeriksaan outlier, dan penyusunan insight. Standardisasi z-score mengubah nilai berdasarkan mean dan standar deviasi sehingga menunjukkan posisi relatif suatu pengamatan. Dalam membandingkan kelompok, center dapat dilihat melalui mean atau median, spread melalui range atau standar deviasi, dan distribution melalui bentuk sebaran. Contohnya, waktu proses dapat dibandingkan antara kanal Online dan Offline untuk melihat perbedaan pusat, variasi, dan pola. EDA membantu menemukan pattern, anomaly, outlier, serta insight yang relevan. Namun, hubungan antarvariabel tidak otomatis membuktikan sebab-akibat; kesimpulan harus didukung tabel, grafik, dan konteks data.
\[ z_i=\frac{x_i-\bar{x}}{s} \]
Contoh singkat di R:
contoh_eda <- data.frame(
kanal = c("Online", "Online", "Offline", "Offline"),
waktu = c(12, 15, 18, 22)
)
aggregate(waktu ~ kanal, data = contoh_eda,
FUN = function(x) c(mean = mean(x), median = median(x), sd = sd(x)))contoh_eda$z_waktu <- as.numeric(scale(contoh_eda$waktu))
boxplot(waktu ~ kanal, data = contoh_eda,
xlab = "Kanal", ylab = "Waktu proses (menit)",
main = "Perbandingan Waktu Proses")2.8 Ringkasan Rumus
| Ukuran | Rumus | Keterangan |
|---|---|---|
| Mean | \(\bar{x}=\sum x_i/n\) | Rata-rata data |
| Weighted mean | \(\bar{x}_w=\sum w_ix_i/\sum w_i\) | Rata-rata berbobot |
| Varians sampel | \(s^2=\sum(x_i-\bar{x})^2/(n-1)\) | Sebaran kuadrat |
| Standar deviasi | \(s=\sqrt{s^2}\) | Sebaran dalam satuan asli |
| Koefisien variasi | \(CV=(s/\bar{x})\times100\%\) | Sebaran relatif |
| IQR | \(Q_3-Q_1\) | Rentang 50% data tengah |
| Batas outlier | \(Q_1-1{,}5IQR;\ Q_3+1{,}5IQR\) | Batas bawah dan atas |
| Z-score | \((x_i-\bar{x})/s\) | Posisi relatif nilai |
2.9 Keterkaitan Materi Minggu 1–7 dengan Studi Kasus
Materi Minggu 1–3 menjadi dasar untuk memahami tujuan analisis, jenis variabel, skala pengukuran, sumber data, dan kualitas proses pengumpulan data. Materi Minggu 4 digunakan untuk menyajikan frekuensi serta pola melalui tabel dan grafik. Materi Minggu 5 membantu merangkum pusat dan variasi setiap variabel. Materi Minggu 6 digunakan untuk memahami posisi data dan menandai nilai yang tidak biasa, sedangkan Minggu 7 menjadi alur kerja untuk menggabungkan pemeriksaan tersebut menjadi insight. Dengan demikian, analisis dataset transaksi pada Soal 2 dilakukan secara bertahap dan tetap mempertahankan konteks setiap pengamatan.
3 Soal 2 – Studi Kasus Exploratory Data Analysis
3.1 2.1 Data Understanding dan Data Quality
3.1.1 Import data
Letakkan file Dataset_EDA_30_Observasi.xlsx pada folder
yang sama dengan file R Markdown ini sebelum melakukan Knit.
# Gunakan nama file standar; nama alternatif disediakan agar file hasil unduhan tetap terbaca.
file_dataset <- if (file.exists("Dataset_EDA_30_Observasi.xlsx")) {
"Dataset_EDA_30_Observasi.xlsx"
} else if (file.exists("Dataset_EDA_30_Observasi(1).xlsx")) {
"Dataset_EDA_30_Observasi(1).xlsx"
} else {
stop("File Dataset_EDA_30_Observasi.xlsx tidak ditemukan. Letakkan file Excel satu folder dengan Rmd.")
}
df <- read_excel(file_dataset, sheet = "Data") %>%
mutate(Tanggal = as.Date(Tanggal))
head(df, 10)3.1.2 Struktur dan dimensi data
## [1] 30 6
## [1] "Tanggal" "Kanal"
## [3] "Jenis_Layanan" "Jumlah_Transaksi"
## [5] "Waktu_Proses_Menit" "Nilai_Transaksi_Juta_Rp"
## tibble [30 × 6] (S3: tbl_df/tbl/data.frame)
## $ Tanggal : Date[1:30], format: "2026-01-01" "2026-01-02" ...
## $ Kanal : chr [1:30] "Online" "Offline" "Online" "Offline" ...
## $ Jenis_Layanan : chr [1:30] "Reguler" "Reguler" "Reguler" "Express" ...
## $ Jumlah_Transaksi : num [1:30] 48 42 55 50 50 52 57 145 70 60 ...
## $ Waktu_Proses_Menit : num [1:30] 41.5 42.1 42.6 43.1 42.7 37.7 36.4 37 36.3 33.6 ...
## $ Nilai_Transaksi_Juta_Rp: num [1:30] 2.26 2.69 2.44 2.17 2.44 2.63 2.58 3.16 3.03 3.13 ...
Dataset terdiri dari 30 baris pengamatan dan 6 variabel. Setiap baris mewakili satu hari pengamatan.
3.1.3 Tipe dan skala pengukuran
tabel_tipe <- tibble(
Variabel = names(df),
Jenis_data = c("Temporal", "Kualitatif", "Kualitatif",
"Kuantitatif diskrit", "Kuantitatif kontinu", "Kuantitatif kontinu"),
Skala_pengukuran = c("Interval", "Nominal", "Nominal", "Rasio", "Rasio", "Rasio"),
Alasan = c(
"Tanggal memiliki jarak sama antarhari tetapi tidak memiliki nol mutlak.",
"Online dan Offline merupakan kategori tanpa tingkatan.",
"Reguler, Express, dan Premium merupakan kategori layanan (ubah ke ordinal jika kamu menganggap berurutan, beri alasan).",
"Jumlah kejadian transaksi berupa hitungan dan memiliki nol mutlak.",
"Durasi proses dapat memiliki nilai pecahan dan nol berarti tidak ada durasi.",
"Nilai uang memiliki nol mutlak dan dapat dibandingkan secara rasio."
)
)
tampil(tabel_tipe, caption = "Identifikasi jenis data dan skala pengukuran", booktabs = TRUE)| Variabel | Jenis_data | Skala_pengukuran | Alasan |
|---|---|---|---|
| Tanggal | Temporal | Interval | Tanggal memiliki jarak sama antarhari tetapi tidak memiliki nol mutlak. |
| Kanal | Kualitatif | Nominal | Online dan Offline merupakan kategori tanpa tingkatan. |
| Jenis_Layanan | Kualitatif | Nominal | Reguler, Express, dan Premium merupakan kategori layanan (ubah ke ordinal jika kamu menganggap berurutan, beri alasan). |
| Jumlah_Transaksi | Kuantitatif diskrit | Rasio | Jumlah kejadian transaksi berupa hitungan dan memiliki nol mutlak. |
| Waktu_Proses_Menit | Kuantitatif kontinu | Rasio | Durasi proses dapat memiliki nilai pecahan dan nol berarti tidak ada durasi. |
| Nilai_Transaksi_Juta_Rp | Kuantitatif kontinu | Rasio | Nilai uang memiliki nol mutlak dan dapat dibandingkan secara rasio. |
3.1.4 Pemeriksaan kualitas data
cek_kualitas <- tibble(
Pemeriksaan = c("Jumlah baris", "Jumlah kolom", "Missing value",
"Baris duplikat", "Tanggal paling awal", "Tanggal paling akhir"),
Hasil = c(
nrow(df), ncol(df),
sum(is.na(df)),
sum(duplicated(df)),
as.character(min(df$Tanggal, na.rm = TRUE)),
as.character(max(df$Tanggal, na.rm = TRUE))
)
)
tampil(cek_kualitas, caption = "Ringkasan pemeriksaan kualitas data")| Pemeriksaan | Hasil |
|---|---|
| Jumlah baris | 30 |
| Jumlah kolom | 6 |
| Missing value | 0 |
| Baris duplikat | 0 |
| Tanggal paling awal | 2026-01-01 |
| Tanggal paling akhir | 2026-01-30 |
missing_kolom <- tibble(
Variabel = names(df),
Jumlah_missing = sapply(df, function(x) sum(is.na(x)))
)
tampil(missing_kolom, caption = "Missing value pada setiap variabel")| Variabel | Jumlah_missing |
|---|---|
| Tanggal | 0 |
| Kanal | 0 |
| Jenis_Layanan | 0 |
| Jumlah_Transaksi | 0 |
| Waktu_Proses_Menit | 0 |
| Nilai_Transaksi_Juta_Rp | 0 |
Berdasarkan pemeriksaan tersebut, jumlah missing value adalah 0 dan jumlah baris duplikat adalah 0. Pemeriksaan ini menjadi dasar untuk menentukan kesiapan data sebelum analisis. Nilai ekstrem tidak dihapus pada tahap ini.
Berdasarkan pemeriksaan, dataset memiliki 30 baris dan 6 kolom, tidak
terdapat missing value maupun baris duplikat. Variabel
Tanggal telah diubah menjadi tipe Date, sedangkan
Kanal dan Jenis_Layanan terbaca sebagai
variabel kategorikal berbentuk karakter. Tiga variabel lainnya berupa
numerik: Jumlah_Transaksi bertipe bilangan bulat, sedangkan
Waktu_Proses_Menit dan Nilai_Transaksi_Juta_Rp
bertipe numerik desimal. Dengan kondisi tersebut, dataset sudah dapat
digunakan untuk analisis awal. Meskipun demikian, nilai ekstrem tetap
perlu diperiksa pada tahap berikutnya dan tidak langsung dihapus.
3.2 2.2 Analisis Univariat
3.2.1 Distribusi frekuensi variabel kategorikal
buat_frekuensi <- function(x) {
hasil <- as.data.frame(table(x), stringsAsFactors = FALSE)
names(hasil) <- c("Kategori", "Frekuensi")
hasil %>%
mutate(
Frekuensi_Relatif = Frekuensi / sum(Frekuensi),
Persentase = percent(Frekuensi_Relatif, accuracy = 0.1),
Frekuensi_Kumulatif = cumsum(Frekuensi)
)
}
freq_kanal <- buat_frekuensi(df$Kanal)
freq_layanan <- buat_frekuensi(df$Jenis_Layanan)
tampil(freq_kanal, caption = "Distribusi frekuensi Kanal")| Kategori | Frekuensi | Frekuensi_Relatif | Persentase | Frekuensi_Kumulatif |
|---|---|---|---|---|
| Offline | 15 | 0.5 | 50.0% | 15 |
| Online | 15 | 0.5 | 50.0% | 30 |
| Kategori | Frekuensi | Frekuensi_Relatif | Persentase | Frekuensi_Kumulatif |
|---|---|---|---|---|
| Express | 10 | 0.3333333 | 33.3% | 10 |
| Premium | 10 | 0.3333333 | 33.3% | 20 |
| Reguler | 10 | 0.3333333 | 33.3% | 30 |
Frekuensi kumulatif pada tabel kategori mengikuti urutan kategori yang ditampilkan. Karena Kanal dan Jenis_Layanan berskala nominal, frekuensi kumulatif hanya merupakan penjumlahan teknis dan tidak menunjukkan tingkatan alami antarkategori. Untuk membaca proporsi kategori, frekuensi relatif lebih bermakna.
3.2.2 Statistik deskriptif variabel numerik
modus <- function(x) {
x <- x[!is.na(x)]
nilai <- unique(x)
frek <- tabulate(match(x, nilai))
nilai[frek == max(frek)]
}
variabel_numerik <- c("Jumlah_Transaksi", "Waktu_Proses_Menit",
"Nilai_Transaksi_Juta_Rp")
stat_deskriptif <- map_dfr(variabel_numerik, function(v) {
x <- df[[v]]
tibble(
Variabel = v,
Mean = mean(x, na.rm = TRUE),
Median = median(x, na.rm = TRUE),
Modus = paste(modus(x), collapse = ", "),
Minimum = min(x, na.rm = TRUE),
Maksimum = max(x, na.rm = TRUE),
Rentang = diff(range(x, na.rm = TRUE)),
Varians = var(x, na.rm = TRUE),
Standar_Deviasi = sd(x, na.rm = TRUE),
CV_persen = sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE) * 100
)
})
tampil(stat_deskriptif, digits = 2,
caption = "Statistik deskriptif variabel numerik")| Variabel | Mean | Median | Modus | Minimum | Maksimum | Rentang | Varians | Standar_Deviasi | CV_persen |
|---|---|---|---|---|---|---|---|---|---|
| Jumlah_Transaksi | 73.83 | 72.00 | 50, 71, 73, 87 | 12.00 | 145.0 | 133.00 | 599.45 | 24.48 | 33.16 |
| Waktu_Proses_Menit | 32.66 | 30.10 | 30.1, 26.6 | 3.50 | 88.0 | 84.50 | 181.32 | 13.47 | 41.23 |
| Nilai_Transaksi_Juta_Rp | 3.18 | 3.13 | 2.44, 3.13 | 0.12 | 9.8 | 9.68 | 2.09 | 1.45 | 45.46 |
## [1] 6
# Pembanding mean-median dan urutan CV
stat_deskriptif %>%
mutate(Mean_minus_Median = Mean - Median) %>%
select(Variabel, Mean, Median, Mean_minus_Median, CV_persen) %>%
arrange(desc(CV_persen)) %>%
tampil(digits = 2, caption = "Pembanding mean-median dan koefisien variasi")| Variabel | Mean | Median | Mean_minus_Median | CV_persen |
|---|---|---|---|---|
| Nilai_Transaksi_Juta_Rp | 3.18 | 3.13 | 0.05 | 45.46 |
| Waktu_Proses_Menit | 32.66 | 30.10 | 2.56 | 41.23 |
| Jumlah_Transaksi | 73.83 | 72.00 | 1.83 | 33.16 |
3.2.3 Diagram batang dan lingkaran
ggplot(df, aes(x = Kanal, fill = Kanal)) +
geom_bar(width = 0.65, show.legend = FALSE) +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5) +
scale_fill_manual(values = c("Online" = "#4C91B8", "Offline" = "#E6A15C")) +
labs(title = "Frekuensi Transaksi Berdasarkan Kanal",
x = "Kanal transaksi", y = "Jumlah pengamatan") +
tema_utspie_data <- df %>% count(Jenis_Layanan) %>%
mutate(label = paste0(Jenis_Layanan, "\n", percent(n / sum(n), accuracy = 0.1)))
ggplot(pie_data, aes(x = "", y = n, fill = Jenis_Layanan)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
geom_text(aes(label = label), position = position_stack(vjust = 0.5),
size = 3.5) +
labs(title = "Proporsi Jenis Layanan", x = NULL, y = NULL, fill = "Layanan") +
tema_uts + theme(axis.text = element_blank(), axis.ticks = element_blank(),
panel.grid = element_blank())Distribusi kanal seimbang: Online berjumlah 15 hari (50%) dan Offline juga 15 hari (50%). Distribusi jenis layanan juga merata, yaitu Reguler 10 hari (33,3%), Express 10 hari (33,3%), dan Premium 10 hari (33,3%). Dengan demikian, tidak ada satu kanal atau jenis layanan yang memiliki frekuensi penggunaan paling tinggi; seluruh kategori memiliki jumlah pengamatan yang sama.
3.2.4 Histogram variabel numerik
Jumlah kelas histogram menggunakan pendekatan Sturges, yaitu \(k=1+3{,}322\log_{10}(n)\). Batas kelas disesuaikan otomatis oleh fungsi histogram. Untuk n = 30, aturan Sturges menghasilkan k = 6 kelas.
par(mfrow = c(3, 1), mar = c(4, 4, 3, 1))
for (v in variabel_numerik) {
x <- df[[v]]
hist(x, breaks = "Sturges", col = "#8DB7CC", border = "white",
main = paste("Histogram", v),
xlab = v, ylab = "Frekuensi")
}Jumlah transaksi memiliki distribusi yang relatif mendekati simetris, meskipun sedikit menceng ke kanan karena mean (73,83) sedikit lebih besar daripada median (72). Waktu proses dan nilai transaksi cenderung menceng ke kanan; mean waktu proses (32,66 menit) lebih tinggi daripada median (30,10 menit), sedangkan mean nilai transaksi (3,179 juta rupiah) sedikit lebih tinggi daripada median (3,13 juta rupiah). Nilai tinggi pada beberapa pengamatan ikut memperpanjang ekor kanan. Koefisien variasi tertinggi terdapat pada nilai transaksi, yaitu 45,46%, diikuti waktu proses 41,23% dan jumlah transaksi 33,16%. CV lebih tepat untuk membandingkan variasi relatif karena ketiga variabel memiliki satuan dan skala berbeda, sedangkan standar deviasi tetap menggunakan satuan asli masing-masing variabel.
3.2.5 Boxplot setiap variabel numerik
data_long <- df %>%
select(all_of(variabel_numerik)) %>%
pivot_longer(everything(), names_to = "Variabel", values_to = "Nilai")
ggplot(data_long, aes(x = "", y = Nilai)) +
geom_boxplot(fill = "#8DB7CC", color = "#24536A", width = 0.45) +
facet_wrap(~ Variabel, scales = "free_y", ncol = 1) +
labs(title = "Boxplot Variabel Numerik", x = NULL, y = "Nilai") +
tema_utsdf %>%
mutate(Obs_ke = row_number()) %>%
pivot_longer(all_of(variabel_numerik), names_to = "Variabel", values_to = "Nilai") %>%
group_by(Variabel) %>%
filter(Nilai == max(Nilai) | Nilai == min(Nilai)) %>%
arrange(Variabel, Nilai) %>%
tampil(digits = 2, caption = "Nilai minimum dan maksimum tiap variabel")| Tanggal | Kanal | Jenis_Layanan | Obs_ke | Variabel | Nilai |
|---|---|---|---|---|---|
| 2026-01-23 | Online | Express | 23 | Jumlah_Transaksi | 12.00 |
| 2026-01-08 | Online | Express | 8 | Jumlah_Transaksi | 145.00 |
| 2026-01-28 | Offline | Premium | 28 | Nilai_Transaksi_Juta_Rp | 0.12 |
| 2026-01-17 | Offline | Premium | 17 | Nilai_Transaksi_Juta_Rp | 9.80 |
| 2026-01-26 | Online | Express | 26 | Waktu_Proses_Menit | 3.50 |
| 2026-01-12 | Offline | Express | 12 | Waktu_Proses_Menit | 88.00 |
Boxplot menunjukkan nilai yang berada di luar batas IQR pada ketiga variabel numerik. Pada jumlah transaksi, nilai ekstrem terdapat pada observasi ke-8 (145 transaksi) dan ke-23 (12 transaksi). Pada waktu proses, nilai ekstrem terdapat pada observasi ke-12 (88 menit) dan ke-26 (3,5 menit). Pada nilai transaksi, nilai ekstrem terdapat pada observasi ke-17 (9,80 juta rupiah) dan ke-28 (0,12 juta rupiah). Titik-titik tersebut perlu diperiksa lebih lanjut karena dapat memengaruhi ringkasan statistik dan pola visual.
3.3 2.3 Analisis Bivariat
3.3.1 Ringkasan numerik berdasarkan kanal
ringkasan_kanal <- df %>%
group_by(Kanal) %>%
summarise(
Jumlah_hari = n(),
Rata_rata_transaksi = mean(Jumlah_Transaksi, na.rm = TRUE),
Median_transaksi = median(Jumlah_Transaksi, na.rm = TRUE),
Rata_rata_waktu = mean(Waktu_Proses_Menit, na.rm = TRUE),
Rata_rata_nilai = mean(Nilai_Transaksi_Juta_Rp, na.rm = TRUE),
.groups = "drop"
)
tampil(ringkasan_kanal, digits = 2,
caption = "Perbandingan ringkasan berdasarkan kanal")| Kanal | Jumlah_hari | Rata_rata_transaksi | Median_transaksi | Rata_rata_waktu | Rata_rata_nilai |
|---|---|---|---|---|---|
| Offline | 15 | 74.80 | 74 | 34.72 | 3.33 |
| Online | 15 | 72.87 | 71 | 30.59 | 3.03 |
ringkasan_kanal_lengkap <- df %>%
group_by(Kanal) %>%
summarise(across(all_of(variabel_numerik),
list(Mean = mean, Median = median, SD = sd),
.names = "{.col}__{.fn}"), .groups = "drop") %>%
pivot_longer(-Kanal, names_to = c("Variabel", "Statistik"),
names_sep = "__", values_to = "Nilai") %>%
pivot_wider(names_from = Statistik, values_from = Nilai)
tampil(ringkasan_kanal_lengkap, digits = 2,
caption = "Mean, median, dan SD ketiga variabel berdasarkan kanal")| Kanal | Variabel | Mean | Median | SD |
|---|---|---|---|---|
| Offline | Jumlah_Transaksi | 74.80 | 74.00 | 19.58 |
| Offline | Waktu_Proses_Menit | 34.72 | 29.70 | 16.68 |
| Offline | Nilai_Transaksi_Juta_Rp | 3.33 | 3.22 | 2.02 |
| Online | Jumlah_Transaksi | 72.87 | 71.00 | 29.26 |
| Online | Waktu_Proses_Menit | 30.59 | 31.80 | 9.40 |
| Online | Nilai_Transaksi_Juta_Rp | 3.03 | 3.13 | 0.46 |
3.3.2 Rata-rata jumlah transaksi berdasarkan kanal
ggplot(ringkasan_kanal, aes(x = Kanal, y = Rata_rata_transaksi, fill = Kanal)) +
geom_col(width = 0.6, show.legend = FALSE) +
geom_text(aes(label = round(Rata_rata_transaksi, 1)), vjust = -0.5) +
scale_fill_manual(values = c("Online" = "#4C91B8", "Offline" = "#E6A15C")) +
labs(title = "Rata-rata Jumlah Transaksi Berdasarkan Kanal",
x = "Kanal", y = "Rata-rata transaksi per hari") +
tema_uts3.3.3 Waktu proses berdasarkan kanal
ggplot(df, aes(x = Kanal, y = Waktu_Proses_Menit, fill = Kanal)) +
geom_boxplot(alpha = 0.85, show.legend = FALSE) +
scale_fill_manual(values = c("Online" = "#4C91B8", "Offline" = "#E6A15C")) +
labs(title = "Sebaran Waktu Proses Berdasarkan Kanal",
x = "Kanal", y = "Waktu proses (menit)") +
tema_utsRata-rata jumlah transaksi Online adalah 72,87 per hari, sedikit lebih rendah daripada Offline sebesar 74,80. Median transaksi juga menunjukkan pola yang sama, yaitu 71 untuk Online dan 74 untuk Offline. Namun, sebaran jumlah transaksi Online lebih besar (SD 29,26) dibandingkan Offline (SD 19,58). Untuk waktu proses, median Online sebesar 31,8 menit dan Offline 29,7 menit, tetapi rata-rata Offline lebih tinggi, yaitu 34,72 menit dibandingkan Online 30,59 menit. Standar deviasi waktu Offline juga lebih besar (16,68 menit) daripada Online (9,40 menit). Ini menunjukkan waktu proses Offline lebih bervariasi dan rata-ratanya terdorong naik oleh nilai tinggi, terutama 88 menit pada salah satu pengamatan.
3.3.4 Nilai transaksi berdasarkan jenis layanan
ggplot(df, aes(x = Jenis_Layanan, y = Nilai_Transaksi_Juta_Rp,
fill = Jenis_Layanan)) +
geom_boxplot(show.legend = FALSE, alpha = 0.85) +
scale_fill_manual(values = c("Reguler" = "#8DB7CC",
"Express" = "#E6A15C",
"Premium" = "#8BB99B")) +
labs(title = "Sebaran Nilai Transaksi Berdasarkan Jenis Layanan",
x = "Jenis layanan", y = "Nilai transaksi (juta rupiah)") +
tema_utsBerdasarkan median, layanan Premium memiliki nilai transaksi relatif paling tinggi, yaitu 3,30 juta rupiah, dibandingkan Express sebesar 3,06 juta dan Reguler sebesar 2,935 juta. Rata-rata Premium juga paling tinggi, yaitu 3,605 juta rupiah. Namun, rata-rata tersebut dipengaruhi nilai ekstrem 9,80 juta rupiah pada observasi ke-17. Karena itu, median lebih mewakili nilai transaksi Premium yang tipikal dibandingkan mean pada data ini.
3.3.5 Hubungan jumlah transaksi dan nilai transaksi
ggplot(df, aes(x = Jumlah_Transaksi, y = Nilai_Transaksi_Juta_Rp,
color = Jenis_Layanan)) +
geom_point(size = 2.8, alpha = 0.85) +
geom_smooth(aes(group = 1), method = "lm", se = TRUE,
color = "#333333", linewidth = 0.8) +
labs(title = "Hubungan Jumlah Transaksi dan Nilai Transaksi",
x = "Jumlah transaksi", y = "Nilai transaksi (juta rupiah)",
color = "Jenis layanan") +
tema_utskorelasi <- cor(df$Jumlah_Transaksi, df$Nilai_Transaksi_Juta_Rp,
use = "complete.obs")
tibble(Hubungan = "Jumlah transaksi dan nilai transaksi",
Korelasi_Pearson = korelasi)Nilai korelasi Pearson sebesar 0.113 menunjukkan arah dan kekuatan hubungan linear pada dua variabel tersebut. Korelasi tidak membuktikan bahwa perubahan jumlah transaksi menyebabkan perubahan nilai transaksi. Pada scatter plot, titik-titik cenderung tersebar dan tidak membentuk pola garis yang rapat. Hal ini sejalan dengan korelasi yang sangat lemah: jumlah transaksi yang lebih banyak tidak selalu diikuti nilai transaksi yang lebih besar. Warna menunjukkan jenis layanan, tetapi dari grafik ini saja belum terlihat pemisahan kelompok yang tegas.
3.3.6 Hubungan jumlah transaksi dan waktu proses
ggplot(df, aes(x = Jumlah_Transaksi, y = Waktu_Proses_Menit)) +
geom_point(aes(color = Kanal), size = 2.8, alpha = 0.85) +
geom_smooth(method = "lm", se = TRUE, color = "#333333", linewidth = 0.8) +
labs(title = "Hubungan Jumlah Transaksi dan Waktu Proses",
x = "Jumlah transaksi", y = "Waktu proses (menit)", color = "Kanal") +
tema_uts## [1] -0.3551632
# Observasi yang menyimpang dari garis tren (|residual standar| > 2)
m_tw <- lm(Waktu_Proses_Menit ~ Jumlah_Transaksi, data = df)
m_tn <- lm(Nilai_Transaksi_Juta_Rp ~ Jumlah_Transaksi, data = df)
menyimpang <- bind_rows(
df %>% mutate(Obs_ke = row_number(), Hubungan = "Transaksi vs Waktu",
Residual_std = rstandard(m_tw)),
df %>% mutate(Obs_ke = row_number(), Hubungan = "Transaksi vs Nilai",
Residual_std = rstandard(m_tn))
) %>%
filter(abs(Residual_std) > 2) %>%
select(Hubungan, Obs_ke, Tanggal, Kanal, Jenis_Layanan, Residual_std)
tampil(menyimpang, digits = 2, caption = "Observasi menyimpang dari pola hubungan")| Hubungan | Obs_ke | Tanggal | Kanal | Jenis_Layanan | Residual_std |
|---|---|---|---|---|---|
| Transaksi vs Waktu | 12 | 2026-01-12 | Offline | Express | 4.29 |
| Transaksi vs Nilai | 17 | 2026-01-17 | Offline | Premium | 4.61 |
| Transaksi vs Nilai | 28 | 2026-01-28 | Offline | Premium | -2.27 |
Korelasi jumlah transaksi dengan nilai transaksi sebesar 0,113 menunjukkan hubungan positif yang sangat lemah. Sementara itu, korelasi jumlah transaksi dengan waktu proses sebesar -0,355 menunjukkan hubungan negatif yang lemah hingga sedang. Jadi, pada data ini jumlah transaksi yang lebih tinggi tidak selalu diikuti nilai transaksi yang lebih tinggi, dan cenderung berkaitan dengan waktu proses yang lebih rendah. Tabel observasi menyimpang menunjukkan observasi ke-12 pada hubungan transaksi-waktu, serta observasi ke-17 dan ke-28 pada hubungan transaksi-nilai. Pengamatan tersebut perlu ditinjau karena posisinya cukup jauh dari pola garis regresi.
3.4 2.4 Analisis Multivariat
3.4.1 Scatter plot multivariat
ggplot(df, aes(x = Jumlah_Transaksi, y = Nilai_Transaksi_Juta_Rp,
color = Kanal, size = Waktu_Proses_Menit)) +
geom_point(alpha = 0.7) +
scale_color_manual(values = c("Online" = "#4C91B8", "Offline" = "#E6A15C")) +
labs(title = "Jumlah vs Nilai Transaksi menurut Kanal dan Waktu Proses",
x = "Jumlah transaksi", y = "Nilai transaksi (juta rupiah)",
color = "Kanal", size = "Waktu proses (menit)") +
tema_utsdf %>%
group_by(Kanal) %>%
summarise(Korelasi = cor(Jumlah_Transaksi, Nilai_Transaksi_Juta_Rp), .groups = "drop") %>%
tampil(digits = 3, caption = "Korelasi jumlah dan nilai transaksi per kanal")| Kanal | Korelasi |
|---|---|
| Offline | 0.107 |
| Online | 0.279 |
Korelasi jumlah transaksi dan nilai transaksi bernilai positif pada kedua kanal, tetapi kekuatannya berbeda. Pada kanal Online, korelasi sebesar 0,279, sedangkan pada Offline sebesar 0,107. Keduanya tergolong lemah, sehingga hubungan linear jumlah transaksi dengan nilai transaksi tidak kuat. Pola Online terlihat sedikit lebih erat dibandingkan Offline, tetapi selisih ini perlu dibaca secara hati-hati karena setiap kanal hanya memiliki 15 pengamatan. Pada scatter plot multivariat, posisi horizontal menunjukkan jumlah transaksi, posisi vertikal menunjukkan nilai transaksi, warna membedakan kanal, dan ukuran titik menunjukkan waktu proses. Titik berukuran besar menandakan waktu proses yang lebih lama. Sebaran titik yang cukup luas memperlihatkan bahwa ketiga indikator tidak bergerak dalam satu pola sederhana; karena itu, evaluasi kanal sebaiknya mempertimbangkan volume, nilai, dan durasi secara bersamaan.
3.4.3 Pola jumlah transaksi dan waktu proses dari waktu ke waktu
tren_long <- df %>%
select(Tanggal, Jumlah_Transaksi, Waktu_Proses_Menit) %>%
pivot_longer(-Tanggal, names_to = "Variabel", values_to = "Nilai")
ggplot(tren_long, aes(x = Tanggal, y = Nilai, color = Variabel)) +
geom_line(linewidth = 0.8) +
geom_point(size = 1.8) +
geom_smooth(method = "lm", se = FALSE, linetype = "dashed", linewidth = 0.6) +
facet_wrap(~ Variabel, scales = "free_y", ncol = 1) +
scale_x_date(date_labels = "%d %b", date_breaks = "5 days") +
labs(title = "Perubahan Jumlah Transaksi dan Waktu Proses",
x = "Tanggal", y = "Nilai", color = "Variabel") +
tema_uts + theme(axis.text.x = element_text(angle = 45, hjust = 1))df_tren <- df %>% mutate(Hari_ke = as.numeric(Tanggal - min(Tanggal)) + 1)
m_trx <- lm(Jumlah_Transaksi ~ Hari_ke, data = df_tren)
m_wkt <- lm(Waktu_Proses_Menit ~ Hari_ke, data = df_tren)
tibble(
Variabel = c("Jumlah_Transaksi", "Waktu_Proses_Menit"),
Slope_per_hari = c(coef(m_trx)[2], coef(m_wkt)[2]),
R2 = c(summary(m_trx)$r.squared, summary(m_wkt)$r.squared),
p_value = c(summary(m_trx)$coefficients[2, 4], summary(m_wkt)$coefficients[2, 4])
) %>%
tampil(digits = 4, caption = "Kecenderungan tren linear selama 30 hari")| Variabel | Slope_per_hari | R2 | p_value |
|---|---|---|---|
| Jumlah_Transaksi | 1.4138 | 0.2584 | 0.0041 |
| Waktu_Proses_Menit | -0.9405 | 0.3781 | 0.0003 |
Selama periode pengamatan, jumlah transaksi menunjukkan kecenderungan meningkat dengan slope sekitar 1,414 transaksi per hari. Nilai R² sebesar 0,258 berarti tren linear menjelaskan sekitar 25,8% variasi jumlah transaksi, dan p-value 0,0041 menunjukkan tren tersebut signifikan secara statistik pada taraf 5%. Sebaliknya, waktu proses cenderung menurun dengan slope sekitar 0,941 menit per hari. R² sebesar 0,378 dan p-value 0,0003 menunjukkan tren penurunan linear yang signifikan pada taraf 5%. Meski demikian, pola ini menggambarkan periode 30 hari yang diamati dan belum cukup untuk memastikan bahwa tren akan terus berlanjut.
3.4.4 Hubungan beberapa variabel numerik
mat_korelasi <- cor(df %>% select(all_of(variabel_numerik)),
use = "pairwise.complete.obs")
korelasi_long <- as.data.frame(as.table(mat_korelasi)) %>%
rename(Variabel_1 = Var1, Variabel_2 = Var2, Korelasi = Freq)
ggplot(korelasi_long, aes(x = Variabel_1, y = Variabel_2, fill = Korelasi)) +
geom_tile(color = "white") +
geom_text(aes(label = round(Korelasi, 2)), size = 4) +
scale_fill_gradient2(low = "#C76D6D", mid = "white", high = "#4C91B8",
midpoint = 0, limits = c(-1, 1)) +
labs(title = "Matriks Korelasi Variabel Numerik",
x = NULL, y = NULL, fill = "Korelasi") +
tema_uts + theme(axis.text.x = element_text(angle = 25, hjust = 1))korelasi_long %>%
filter(as.character(Variabel_1) < as.character(Variabel_2)) %>%
arrange(desc(abs(Korelasi))) %>%
tampil(digits = 3, caption = "Pasangan variabel diurutkan dari korelasi terkuat")| Variabel_1 | Variabel_2 | Korelasi |
|---|---|---|
| Jumlah_Transaksi | Waktu_Proses_Menit | -0.355 |
| Nilai_Transaksi_Juta_Rp | Waktu_Proses_Menit | -0.204 |
| Jumlah_Transaksi | Nilai_Transaksi_Juta_Rp | 0.113 |
Pasangan dengan korelasi absolut paling kuat adalah jumlah transaksi dan waktu proses, dengan nilai -0,355, sehingga arahnya negatif dan kekuatannya lemah hingga sedang. Hubungan waktu proses dengan nilai transaksi sebesar -0,204 juga negatif tetapi lebih lemah, sedangkan jumlah transaksi dengan nilai transaksi sebesar 0,113 positif sangat lemah. Korelasi hanya menunjukkan keeratan hubungan linear, bukan bukti bahwa satu variabel menyebabkan perubahan variabel lain. Faktor lain seperti jenis layanan, kanal, kapasitas operasional, atau perubahan dari waktu ke waktu dapat ikut memengaruhi pola tersebut.
3.4.5 Perbandingan kanal dan jenis layanan
ringkasan_kombinasi <- df %>%
group_by(Kanal, Jenis_Layanan) %>%
summarise(
Jumlah_hari = n(),
Rata_rata_transaksi = mean(Jumlah_Transaksi, na.rm = TRUE),
Rata_rata_waktu = mean(Waktu_Proses_Menit, na.rm = TRUE),
Rata_rata_nilai = mean(Nilai_Transaksi_Juta_Rp, na.rm = TRUE),
.groups = "drop"
)
tampil(ringkasan_kombinasi, digits = 2,
caption = "Ringkasan gabungan kanal dan jenis layanan")| Kanal | Jenis_Layanan | Jumlah_hari | Rata_rata_transaksi | Rata_rata_waktu | Rata_rata_nilai |
|---|---|---|---|---|---|
| Offline | Express | 5 | 65.4 | 46.30 | 2.78 |
| Offline | Premium | 5 | 82.2 | 26.88 | 4.02 |
| Offline | Reguler | 5 | 76.8 | 30.98 | 3.18 |
| Online | Express | 5 | 80.2 | 25.16 | 3.25 |
| Online | Premium | 5 | 76.6 | 29.56 | 3.19 |
| Online | Reguler | 5 | 61.8 | 37.06 | 2.65 |
ggplot(ringkasan_kombinasi,
aes(x = Jenis_Layanan, y = Kanal, fill = Rata_rata_transaksi)) +
geom_tile(color = "white") +
geom_text(aes(label = round(Rata_rata_transaksi, 1)), size = 4) +
scale_fill_gradient(low = "#EAF2F5", high = "#286783") +
labs(title = "Rata-rata Transaksi Menurut Kanal dan Layanan",
x = "Jenis layanan", y = "Kanal",
fill = "Rata-rata transaksi") +
tema_utsHeatmap menunjukkan rata-rata jumlah transaksi tertinggi pada kombinasi Offline-Premium, yaitu 82,2 transaksi per hari, disusul Online-Express sebesar 80,2. Rata-rata terendah terdapat pada Online-Reguler, yaitu 61,8 transaksi per hari. Perbedaan ini memberi gambaran awal bahwa volume transaksi bervariasi menurut gabungan kanal dan layanan. Namun, setiap kombinasi hanya memiliki lima pengamatan, sehingga hasilnya belum cukup untuk menyimpulkan bahwa satu kombinasi selalu lebih unggul.
Analisis multivariat memperlihatkan beberapa variabel secara bersamaan. Grafik tren digunakan untuk membaca perubahan antarhari, matriks korelasi untuk melihat hubungan linear antarkuantitas numerik, dan tabel/heatmap gabungan untuk membandingkan kanal serta jenis layanan. Hasilnya perlu dibaca bersama ukuran ringkasan karena hubungan statistik tidak otomatis menunjukkan hubungan sebab-akibat.
3.5 2.5 Deteksi dan Evaluasi Outlier
Deteksi dilakukan menggunakan batas IQR dan z-score. Pengamatan dengan \(|z|>2\) ditandai sebagai nilai yang perlu diperhatikan, sedangkan \(|z|>3\) ditandai sebagai outlier ekstrem berdasarkan pedoman tugas. Batas IQR menggunakan 1,5 kali IQR.
tabel_iqr <- map_dfr(variabel_numerik, function(v) {
x <- df[[v]]
q1 <- as.numeric(quantile(x, 0.25, na.rm = TRUE))
q3 <- as.numeric(quantile(x, 0.75, na.rm = TRUE))
i <- q3 - q1
tibble(Variabel = v, Q1 = q1, Q3 = q3, IQR = i,
Batas_Bawah = q1 - 1.5 * i, Batas_Atas = q3 + 1.5 * i)
})
tampil(tabel_iqr, digits = 2, caption = "Perhitungan IQR dan batas outlier")| Variabel | Q1 | Q3 | IQR | Batas_Bawah | Batas_Atas |
|---|---|---|---|---|---|
| Jumlah_Transaksi | 57.75 | 87.00 | 29.25 | 13.88 | 130.88 |
| Waktu_Proses_Menit | 26.68 | 36.90 | 10.22 | 11.34 | 52.24 |
| Nilai_Transaksi_Juta_Rp | 2.59 | 3.46 | 0.87 | 1.29 | 4.77 |
hasil_outlier <- map_dfr(variabel_numerik, function(v) {
x <- df[[v]]
q1 <- quantile(x, 0.25, na.rm = TRUE)
q3 <- quantile(x, 0.75, na.rm = TRUE)
iqr_x <- IQR(x, na.rm = TRUE)
batas_bawah <- q1 - 1.5 * iqr_x
batas_atas <- q3 + 1.5 * iqr_x
z <- (x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)
tibble(
Obs_ke = seq_along(x),
Tanggal = df$Tanggal,
Variabel = v,
Nilai = x,
Batas_IQR_Bawah = as.numeric(batas_bawah),
Batas_IQR_Atas = as.numeric(batas_atas),
Z_score = as.numeric(z),
Outlier_IQR = x < batas_bawah | x > batas_atas,
Perlu_diperhatikan_z = abs(z) > 2,
Outlier_ekstrem_z = abs(z) > 3
)
})
tabel_outlier <- hasil_outlier %>%
filter(Outlier_IQR | Perlu_diperhatikan_z) %>%
arrange(Variabel, Tanggal)
tampil(tabel_outlier, digits = 2,
caption = "Pengamatan yang terdeteksi oleh IQR atau |z-score| > 2")| Obs_ke | Tanggal | Variabel | Nilai | Batas_IQR_Bawah | Batas_IQR_Atas | Z_score | Outlier_IQR | Perlu_diperhatikan_z | Outlier_ekstrem_z |
|---|---|---|---|---|---|---|---|---|---|
| 8 | 2026-01-08 | Jumlah_Transaksi | 145.00 | 13.88 | 130.88 | 2.91 | TRUE | TRUE | FALSE |
| 23 | 2026-01-23 | Jumlah_Transaksi | 12.00 | 13.88 | 130.88 | -2.53 | TRUE | TRUE | FALSE |
| 17 | 2026-01-17 | Nilai_Transaksi_Juta_Rp | 9.80 | 1.29 | 4.77 | 4.58 | TRUE | TRUE | TRUE |
| 28 | 2026-01-28 | Nilai_Transaksi_Juta_Rp | 0.12 | 1.29 | 4.77 | -2.12 | TRUE | TRUE | FALSE |
| 12 | 2026-01-12 | Waktu_Proses_Menit | 88.00 | 11.34 | 52.24 | 4.11 | TRUE | TRUE | TRUE |
| 26 | 2026-01-26 | Waktu_Proses_Menit | 3.50 | 11.34 | 52.24 | -2.17 | TRUE | TRUE | FALSE |
# Data lengkap pada hari yang terdeteksi (untuk menilai anomali operasional)
tgl_outlier <- hasil_outlier %>%
filter(Outlier_IQR | Perlu_diperhatikan_z) %>%
pull(Tanggal) %>%
unique()
df %>%
mutate(Obs_ke = row_number()) %>%
filter(Tanggal %in% tgl_outlier) %>%
tampil(digits = 2, caption = "Data lengkap pada hari yang terdeteksi outlier")| Tanggal | Kanal | Jenis_Layanan | Jumlah_Transaksi | Waktu_Proses_Menit | Nilai_Transaksi_Juta_Rp | Obs_ke |
|---|---|---|---|---|---|---|
| 2026-01-08 | Online | Express | 145 | 37.0 | 3.16 | 8 |
| 2026-01-12 | Offline | Express | 67 | 88.0 | 2.51 | 12 |
| 2026-01-17 | Offline | Premium | 74 | 27.8 | 9.80 | 17 |
| 2026-01-23 | Online | Express | 12 | 26.6 | 3.58 | 23 |
| 2026-01-26 | Online | Express | 100 | 3.5 | 3.69 | 26 |
| 2026-01-28 | Offline | Premium | 96 | 19.2 | 0.12 | 28 |
3.5.1 Jumlah outlier per variabel
jumlah_outlier <- hasil_outlier %>%
group_by(Variabel) %>%
summarise(
Jumlah_IQR = sum(Outlier_IQR, na.rm = TRUE),
Jumlah_z_di_atas_2 = sum(Perlu_diperhatikan_z, na.rm = TRUE),
Jumlah_z_di_atas_3 = sum(Outlier_ekstrem_z, na.rm = TRUE),
.groups = "drop"
)
tampil(jumlah_outlier, caption = "Jumlah penanda outlier berdasarkan metode")| Variabel | Jumlah_IQR | Jumlah_z_di_atas_2 | Jumlah_z_di_atas_3 |
|---|---|---|---|
| Jumlah_Transaksi | 2 | 2 | 0 |
| Nilai_Transaksi_Juta_Rp | 2 | 2 | 1 |
| Waktu_Proses_Menit | 2 | 2 | 1 |
3.5.2 Boxplot untuk pemeriksaan visual
ggplot(data_long, aes(x = "", y = Nilai)) +
geom_boxplot(fill = "#E6AD65", color = "#805A2B", outlier.color = "#B33A3A") +
facet_wrap(~ Variabel, scales = "free_y", ncol = 1) +
labs(title = "Pemeriksaan Visual Nilai Ekstrem",
x = NULL, y = "Nilai") +
tema_uts# Data asli tidak diubah; hanya membandingkan ringkasan dengan dan tanpa outlier IQR
sensitivitas <- map_dfr(variabel_numerik, function(v) {
d <- hasil_outlier %>% filter(Variabel == v)
tibble(Variabel = v,
Mean_semua = mean(d$Nilai),
Mean_tanpa_outlier = mean(d$Nilai[!d$Outlier_IQR]),
SD_semua = sd(d$Nilai),
SD_tanpa_outlier = sd(d$Nilai[!d$Outlier_IQR]))
})
tampil(sensitivitas, digits = 2,
caption = "Perbandingan mean dan SD dengan dan tanpa outlier IQR")| Variabel | Mean_semua | Mean_tanpa_outlier | SD_semua | SD_tanpa_outlier |
|---|---|---|---|---|
| Jumlah_Transaksi | 73.83 | 73.50 | 24.48 | 17.74 |
| Waktu_Proses_Menit | 32.66 | 31.72 | 13.47 | 6.99 |
| Nilai_Transaksi_Juta_Rp | 3.18 | 3.05 | 1.45 | 0.51 |
df_tanpa <- df %>% filter(!(Tanggal %in% tgl_outlier))
c(korelasi_semua = cor(df$Jumlah_Transaksi, df$Nilai_Transaksi_Juta_Rp),
korelasi_tanpa_outlier = cor(df_tanpa$Jumlah_Transaksi, df_tanpa$Nilai_Transaksi_Juta_Rp))## korelasi_semua korelasi_tanpa_outlier
## 0.1127959 0.8882371
Metode IQR menemukan 2 outlier pada setiap variabel numerik. Hasilnya sama dengan penanda |z-score| > 2: jumlah transaksi pada observasi ke-8 (145; 8 Januari 2026) dan ke-23 (12; 23 Januari 2026), waktu proses pada observasi ke-12 (88 menit; 12 Januari 2026) dan ke-26 (3,5 menit; 26 Januari 2026), serta nilai transaksi pada observasi ke-17 (9,80 juta; 17 Januari 2026) dan ke-28 (0,12 juta; 28 Januari 2026). Namun, dengan batas lebih ketat |z| > 3, hanya waktu proses observasi ke-12 dan nilai transaksi observasi ke-17 yang tergolong ekstrem; jumlah transaksi tidak memiliki nilai dengan |z| > 3. Standardisasi z-score membantu membandingkan posisi relatif nilai dari variabel yang satuannya berbeda karena semuanya dinyatakan dalam satuan standar deviasi. Outlier adalah nilai yang tidak biasa secara statistik, sedangkan anomali operasional memerlukan bukti bahwa nilai tersebut mencerminkan kejadian atau masalah proses yang tidak wajar. Dataset belum menjelaskan penyebab keenam tanggal tersebut, sehingga belum dapat dipastikan sebagai anomali. Pengaruhnya terlihat pada standar deviasi: jumlah transaksi turun dari 24,48 menjadi 17,74 setelah dua outlier IQR pada variabel itu dikeluarkan; waktu proses turun dari 13,47 menjadi 6,99; dan nilai transaksi turun dari 1,45 menjadi 0,51. Mean juga berubah, misalnya mean waktu proses dari 32,66 menjadi 31,72 menit. Dalam uji sensitivitas kode, korelasi jumlah transaksi dan nilai transaksi berubah dari 0,113 menjadi 0,888 setelah seluruh tanggal yang ditandai pada salah satu variabel dikeluarkan. Perubahan ini menunjukkan bahwa pengamatan ekstrem dapat sangat memengaruhi hubungan yang terlihat, tetapi korelasi setelah penghapusan tersebut bukan hasil utama. Seluruh nilai ekstrem sebaiknya tetap dipertahankan pada analisis awal dan diberi tanda untuk diverifikasi dengan catatan transaksi sebelum keputusan penghapusan dibuat.
Outlier tidak langsung dihapus karena dapat mencerminkan kejadian operasional yang nyata. Pengamatan perlu ditinjau dengan melihat tanggal, variabel, dan konteks proses. Nilai yang sangat berbeda dapat berasal dari lonjakan transaksi, keterlambatan proses, atau kesalahan pencatatan; dataset ini sendiri belum memberikan bukti penyebabnya. Karena itu, hasil deteksi merupakan penanda untuk pemeriksaan lebih lanjut, bukan bukti bahwa data pasti salah.
3.6 2.6 Insight Bisnis dan Rekomendasi Strategis
3.6.1 Ringkasan temuan utama
kanal_tertinggi <- ringkasan_kanal %>% slice_max(Rata_rata_transaksi, n = 1, with_ties = FALSE)
kanal_waktu_terendah <- ringkasan_kanal %>% slice_min(Rata_rata_waktu, n = 1, with_ties = FALSE)
layanan_nilai_tertinggi <- ringkasan_kombinasi %>%
slice_max(Rata_rata_nilai, n = 1, with_ties = FALSE)
cat(
"Kanal dengan rata-rata transaksi tertinggi adalah", kanal_tertinggi$Kanal,
"dengan rata-rata", round(kanal_tertinggi$Rata_rata_transaksi, 2),
"transaksi per hari.\n\n",
"Kanal dengan rata-rata waktu proses terendah adalah", kanal_waktu_terendah$Kanal,
"dengan rata-rata", round(kanal_waktu_terendah$Rata_rata_waktu, 2),
"menit.\n\n",
"Kombinasi kanal dan layanan dengan rata-rata nilai transaksi tertinggi adalah",
paste(layanan_nilai_tertinggi$Kanal,
layanan_nilai_tertinggi$Jenis_Layanan, sep = " - "),
"dengan rata-rata", round(layanan_nilai_tertinggi$Rata_rata_nilai, 2),
"juta rupiah."
)Kanal dengan rata-rata transaksi tertinggi adalah Offline dengan rata-rata 74.8 transaksi per hari.
Kanal dengan rata-rata waktu proses terendah adalah Online dengan rata-rata 30.59 menit.
Kombinasi kanal dan layanan dengan rata-rata nilai transaksi tertinggi adalah Offline - Premium dengan rata-rata 4.02 juta rupiah.
kpi_kanal <- df %>%
group_by(Kanal) %>%
summarise(
Hari = n(),
Total_transaksi = sum(Jumlah_Transaksi),
Rata_rata_transaksi = mean(Jumlah_Transaksi),
Rata_rata_nilai = mean(Nilai_Transaksi_Juta_Rp),
Rata_rata_waktu = mean(Waktu_Proses_Menit),
CV_waktu_persen = sd(Waktu_Proses_Menit) / mean(Waktu_Proses_Menit) * 100,
.groups = "drop"
)
tampil(kpi_kanal, digits = 2, caption = "Indikator kinerja per kanal")| Kanal | Hari | Total_transaksi | Rata_rata_transaksi | Rata_rata_nilai | Rata_rata_waktu | CV_waktu_persen |
|---|---|---|---|---|---|---|
| Offline | 15 | 1122 | 74.80 | 3.33 | 34.72 | 48.04 |
| Online | 15 | 1093 | 72.87 | 3.03 | 30.59 | 30.71 |
Selama 30 hari pengamatan, tercatat 2.215 transaksi atau rata-rata 73,83 transaksi per hari. Rata-rata nilai transaksi harian adalah 3,179 juta rupiah, sedangkan rata-rata waktu proses 32,66 menit. Jika dilihat dari volume, kanal Offline menunjukkan angka lebih tinggi: rata-rata 74,80 transaksi per hari dan rata-rata nilai transaksi 3,328 juta rupiah, dibandingkan Online sebesar 72,87 transaksi dan 3,030 juta rupiah. Namun, Online memiliki waktu proses rata-rata lebih rendah (30,59 menit dibandingkan 34,72 menit) dan variasi waktu yang lebih kecil (SD 9,40 dibandingkan 16,68 menit). Jadi, tidak ada satu kanal yang unggul pada semua indikator: Offline lebih tinggi dari sisi volume dan rata-rata nilai, sedangkan Online lebih baik dari sisi kecepatan dan kestabilan waktu proses. Peningkatan jumlah transaksi tidak otomatis berarti kinerja meningkat karena nilai transaksi dan efisiensi proses juga perlu diperhatikan; korelasi jumlah transaksi dengan nilai transaksi pada keseluruhan data hanya 0,113. Waktu proses yang terlalu tinggi berpotensi menimbulkan antrean, memperlambat penyelesaian layanan, meningkatkan beban operasional, dan menurunkan pengalaman pelanggan.
Berdasarkan tabel dan grafik, kinerja tidak cukup dinilai dari jumlah transaksi saja. Jumlah transaksi yang tinggi belum tentu menunjukkan proses paling efisien atau nilai transaksi terbesar. Waktu proses, nilai transaksi, jenis layanan, serta konsistensi hasil juga perlu dipertimbangkan. Nilai ekstrem yang ditemukan perlu ditelusuri lebih lanjut sebelum digunakan sebagai dasar keputusan operasional.
3.6.2 Rekomendasi strategis
- Evaluasi efisiensi kanal Offline. Rata-rata waktu proses Offline mencapai 34,72 menit dengan standar deviasi 16,68 menit, lebih tinggi dan lebih bervariasi daripada Online (30,59 menit; SD 9,40 menit). Periksa alur kerja Offline, terutama pengamatan 12 Januari 2026 yang mencatat waktu proses 88 menit.
- Tinjau proses layanan Express pada kanal Offline. Kombinasi Offline-Express memiliki median waktu proses 42,7 menit dari 5 pengamatan. Perusahaan dapat meninjau tahapan layanan dan kapasitas petugas pada kombinasi ini sebelum menetapkan perubahan prosedur.
- Verifikasi transaksi bernilai ekstrem. Periksa kembali nilai 9,80 juta rupiah pada 17 Januari 2026 dan 0,12 juta rupiah pada 28 Januari 2026 melalui catatan transaksi asli. Nilai tersebut jangan langsung dihapus karena belum ada bukti bahwa keduanya merupakan kesalahan.
- Gunakan indikator kinerja secara bersamaan. Pantau jumlah transaksi, nilai transaksi, dan waktu proses. Offline memiliki rata-rata transaksi lebih tinggi (74,80 dibandingkan 72,87), tetapi Online memiliki waktu proses yang lebih rendah; karena itu, keputusan tidak sebaiknya hanya berfokus pada volume.
- Pantau tren secara berkala. Dalam 30 hari ini jumlah transaksi menunjukkan tren naik sekitar 1,414 transaksi per hari, sedangkan waktu proses turun sekitar 0,941 menit per hari. Perbarui analisis pada periode berikutnya untuk memeriksa apakah kecenderungan tersebut tetap konsisten.
3.7 2.7 Kualitas dan Reproduksibilitas Analisis
Seluruh proses impor, pengolahan, perhitungan statistik, dan
visualisasi pada Soal 2 dilakukan menggunakan R. Kode disusun dalam
beberapa bagian agar dapat dijalankan ulang. Untuk menghasilkan dokumen
HTML, pastikan file Excel berada pada folder yang sama dengan file
.Rmd, kemudian pilih Knit di RStudio. Jika
muncul pesan paket belum tersedia, instal paket yang disebutkan pada
pesan tersebut melalui Console. File Excel harus tetap berada dalam
folder yang sama dengan Rmd saat proses Knit dilakukan.
3.8 Kesimpulan Umum
Berdasarkan 30 observasi, aktivitas transaksi relatif seimbang antara kanal Online dan Offline serta antara tiga jenis layanan. Kanal Offline memiliki rata-rata jumlah dan nilai transaksi yang sedikit lebih tinggi, sedangkan kanal Online memiliki waktu proses rata-rata yang lebih rendah dan lebih stabil. Hubungan jumlah transaksi dengan nilai transaksi sangat lemah, sehingga volume transaksi saja belum cukup untuk menggambarkan kinerja. Deteksi IQR menemukan dua nilai ekstrem pada masing-masing variabel numerik; seluruhnya dipertahankan dalam analisis awal karena belum ada bukti bahwa nilai tersebut merupakan kesalahan pencatatan. Secara keseluruhan, perusahaan perlu memantau volume, nilai, dan efisiensi proses secara bersamaan serta memverifikasi pengamatan ekstrem menggunakan catatan operasional.
4 Daftar Pustaka
Anderson, D. R., Sweeney, D. J., Williams, T. A., Camm, J. D., & Cochran, J. J. (2021). Statistics for Business & Economics. Cengage.
Diez, D. M., Barr, C. D., & Çetinkaya-Rundel, M. (2019). OpenIntro Statistics (4th ed.). OpenIntro.
Materi perkuliahan Pengantar Statistika SDT-1305, Minggu 1–7.