UTS Pengantar Statistika

Ujian Tengah Semester

Fadli Nafsin

LinkedIn | GitHub | Email

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 dilakukan untuk memperoleh informasi yang sesuai dengan tujuan penelitian. Data primer dikumpulkan langsung, misalnya melalui survei atau wawancara, sedangkan data sekunder berasal dari sumber yang sudah tersedia, seperti laporan atau basis data. Sampling adalah proses memilih sebagian anggota populasi untuk diteliti. Metode probability sampling memberi peluang terpilih yang diketahui kepada anggota populasi, contohnya simple random sampling, systematic sampling, stratified sampling, dan cluster sampling. Non-probability sampling tidak memberikan peluang terpilih yang sama atau diketahui, contohnya convenience, purposive, quota, dan snowball sampling. Pemilihan metode harus mempertimbangkan tujuan, kerangka sampel, waktu, biaya, dan potensi bias. Sampel yang besar belum tentu mewakili populasi apabila proses 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

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
prop.table(freq)             # frekuensi relatif
## contoh_kategori
## Offline  Online 
##     0.4     0.6
cumsum(freq)                 # frekuensi kumulatif
## Offline  Online 
##       2       5
barplot(table(contoh_kategori), col = c("#78a9c5", "#e6ad65"),
        main = "Contoh Frekuensi Kanal", ylab = "Frekuensi")

2.5 Minggu 5 – Ukuran Pemusatan dan Sebaran

Ukuran pemusatan menjelaskan nilai yang mewakili pusat data. Mean adalah rata-rata, median adalah nilai tengah setelah data diurutkan, dan modus adalah nilai yang paling sering muncul. Ukuran sebaran menunjukkan variasi data. Rentang merupakan selisih nilai maksimum dan minimum, varians mengukur rata-rata kuadrat penyimpangan dari mean, dan standar deviasi merupakan akar varians. Koefisien variasi (CV) membandingkan standar deviasi terhadap mean dalam bentuk persentase sehingga berguna untuk membandingkan variasi relatif antarvariabel dengan mean positif. Kuartil membagi data terurut menjadi empat bagian, sedangkan IQR adalah selisih kuartil ketiga dan pertama. Contohnya, dua kanal dapat memiliki rata-rata transaksi serupa tetapi standar deviasi berbeda; kanal dengan standar deviasi lebih besar memiliki jumlah transaksi yang lebih bervariasi.

\[ \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 suatu nilai dalam data yang telah diurutkan. Kuartil membagi data menjadi empat bagian, desil menjadi sepuluh bagian, dan persentil menjadi seratus bagian. Median merupakan kuartil kedua atau persentil ke-50. IQR dihitung dari selisih kuartil ketiga dan pertama, sehingga menggambarkan sebaran 50% data tengah. Outlier dapat ditandai dengan batas bawah \(Q_1-1{,}5(IQR)\) dan batas atas \(Q_3+1{,}5(IQR)\). Cara lain adalah z-score, yaitu jarak suatu nilai dari mean dalam satuan standar deviasi; nilai dengan \(|z|>3\) sering diperiksa sebagai nilai ekstrem. Distribusi dapat simetris atau miring ke kanan maupun kiri. Boxplot merangkum median, kuartil, dan nilai yang berpotensi ekstrem. Outlier tidak langsung dihapus karena dapat berasal dari kesalahan pencatatan atau kejadian nyata yang perlu dijelaskan.

\[ 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
IQR(x_posisi)
## [1] 3.75
z_score <- as.numeric(scale(x_posisi))
boxplot(x_posisi, main = "Boxplot Contoh Data", ylab = "Nilai")

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.

df <- read_excel("Dataset_EDA_30_Observasi.xlsx", sheet = "Data") %>%
  mutate(Tanggal = as.Date(Tanggal))

head(df, 10)

3.1.2 Struktur dan dimensi data

dim(df)
## [1] 30  6
names(df)
## [1] "Tanggal"                 "Kanal"                  
## [3] "Jenis_Layanan"           "Jumlah_Transaksi"       
## [5] "Waktu_Proses_Menit"      "Nilai_Transaksi_Juta_Rp"
str(df)
## 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),
  Tipe_data = c("Tanggal", "Kategorikal", "Kategorikal",
                "Numerik diskrit", "Numerik kontinu", "Numerik kontinu"),
  Skala_pengukuran = c("Interval waktu/temporal", "Nominal", "Nominal",
                       "Rasio", "Rasio", "Rasio"),
  Alasan = c(
    "Menunjukkan urutan waktu pengamatan harian.",
    "Online dan Offline merupakan kategori tanpa tingkatan.",
    "Reguler, Express, dan Premium merupakan kategori layanan.",
    "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."
  )
)
kable(tabel_tipe, caption = "Identifikasi tipe dan skala pengukuran", booktabs = TRUE)
Identifikasi tipe dan skala pengukuran
Variabel Tipe_data Skala_pengukuran Alasan
Tanggal Tanggal Interval waktu/temporal Menunjukkan urutan waktu pengamatan harian.
Kanal Kategorikal Nominal Online dan Offline merupakan kategori tanpa tingkatan.
Jenis_Layanan Kategorikal Nominal Reguler, Express, dan Premium merupakan kategori layanan.
Jumlah_Transaksi Numerik diskrit Rasio Jumlah kejadian transaksi berupa hitungan dan memiliki nol mutlak.
Waktu_Proses_Menit Numerik kontinu Rasio Durasi proses dapat memiliki nilai pecahan dan nol berarti tidak ada durasi.
Nilai_Transaksi_Juta_Rp Numerik 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))
  )
)
kable(cek_kualitas, caption = "Ringkasan pemeriksaan kualitas data")
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)))
)
kable(missing_kolom, caption = "Missing value pada setiap variabel")
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.

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)

kable(freq_kanal, caption = "Distribusi frekuensi Kanal")
Distribusi frekuensi Kanal
Kategori Frekuensi Frekuensi_Relatif Persentase Frekuensi_Kumulatif
Offline 15 0.5 50.0% 15
Online 15 0.5 50.0% 30
kable(freq_layanan, caption = "Distribusi frekuensi Jenis Layanan")
Distribusi frekuensi Jenis Layanan
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 tidak menunjukkan tingkatan alami antarkategori.

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
  )
})
kable(stat_deskriptif, digits = 2,
      caption = "Statistik deskriptif variabel numerik")
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

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_uts

pie_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())

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.

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")
}

par(mfrow = c(1, 1))

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_uts

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"
  )
kable(ringkasan_kanal, digits = 2,
      caption = "Perbandingan ringkasan berdasarkan kanal")
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

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_uts

3.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_uts

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_uts

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_uts

korelasi <- 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.

3.4 2.4 Analisis Multivariat

3.4.1 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) +
  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))

3.4.2 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))

3.4.3 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"
  )
kable(ringkasan_kombinasi, digits = 2,
      caption = "Ringkasan gabungan kanal dan jenis layanan")
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_uts

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.

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(
    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)

kable(tabel_outlier, digits = 2,
      caption = "Pengamatan yang terdeteksi oleh IQR atau |z-score| > 2")
Pengamatan yang terdeteksi oleh IQR atau |z-score| > 2
Tanggal Variabel Nilai Batas_IQR_Bawah Batas_IQR_Atas Z_score Outlier_IQR Perlu_diperhatikan_z Outlier_ekstrem_z
2026-01-08 Jumlah_Transaksi 145.00 13.88 130.88 2.91 TRUE TRUE FALSE
2026-01-23 Jumlah_Transaksi 12.00 13.88 130.88 -2.53 TRUE TRUE FALSE
2026-01-17 Nilai_Transaksi_Juta_Rp 9.80 1.29 4.77 4.58 TRUE TRUE TRUE
2026-01-28 Nilai_Transaksi_Juta_Rp 0.12 1.29 4.77 -2.12 TRUE TRUE FALSE
2026-01-12 Waktu_Proses_Menit 88.00 11.34 52.24 4.11 TRUE TRUE TRUE
2026-01-26 Waktu_Proses_Menit 3.50 11.34 52.24 -2.17 TRUE TRUE FALSE

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"
  )
kable(jumlah_outlier, caption = "Jumlah penanda outlier berdasarkan metode")
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

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",
  kanal_nilai <- 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.

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

  1. Evaluasi efisiensi proses. Bandingkan waktu proses Online dan Offline secara berkala. Periksa hari dengan waktu proses yang jauh berbeda untuk mengetahui apakah terdapat hambatan operasional.
  2. Pantau kinerja berdasarkan jenis layanan. Evaluasi jumlah transaksi, waktu proses, dan nilai transaksi untuk setiap layanan. Hasilnya dapat digunakan untuk menyesuaikan kapasitas dan standar pelayanan.
  3. Lakukan pemeriksaan pada nilai ekstrem. Cocokkan tanggal dan nilai yang terdeteksi dengan catatan transaksi asli. Jangan menghapus data sebelum penyebabnya dipastikan.
  4. Gunakan indikator kinerja secara bersamaan. Pantau jumlah transaksi, nilai transaksi, dan waktu proses agar keputusan tidak hanya berfokus pada banyaknya transaksi.
  5. Perbarui analisis secara rutin. Penambahan data harian akan membantu melihat apakah pola pada 30 hari ini konsisten pada periode berikutnya.

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.

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.