Members

Summary of Basic Statistics

## Column

Chapter 1

Chapter 2

### Chapter 3 {data-width=1200}

Chapter 4

Chapter 5

Chapter 6

Chapter 7

Chapter 8

Chapter 9

Chapter 10

Dataset

Table

Dataset interaktif berikut memiliki manfaat yang penting yaitu Menangani data yang tidak konsisten atau data yang “Hilang” di bagian kolom atau baris

All About Basic Visualizations

## Column

Pie-Chart

INTERPRETASI

Pie-Chart ini menunjukkan distribusi penggunaan moda transportasi OJOL di Pontianak. BIKE menjadi moda paling dominan dengan 32,0% transaksi, mencerminkan preferensi masyarakat terhadap ojek motor yang hemat dan efisien di perkotaan. FOOD menempati posisi kedua dengan 26,1%, mengindikasikan tingginya permintaan layanan pesan makanan. CAR dan SHOP masing-masing menyumbang 23,8% dan 18,1%. Secara keseluruhan, layanan transportasi (BIKE + CAR = 55,8%) masih mendominasi, namun layanan berbasis konsumsi (FOOD + SHOP = 44,3%) sudah mengejar ketat, menandakan diversifikasi penggunaan platform OJOL di masyarakat.

Bar-Chart

INTERPRETASI

Berdasarkan analisis frekuensi pesanan, perjalanan dengan jarak Sedang (3-7 km) mendominasi penggunaan layanan OJOL (±60-70%), menunjukkan preferensi konsumen untuk mobilitas sehari-hari dalam jarak menengah. Jarak pendek (<3 km) relatif rendah (±10-15%), kemungkinan karena kurang kompetitifnya biaya minimum, sedangkan jarak jauh (7-12 km) tetap signifikan (±15-25%) sebagai alternatif transportasi antar kecamatan. Insight utama: fokus optimasi pada layanan jarak 3-7 km sebagai core business, sambil pertahankan layanan jarak lainnya untuk diversifikasi.

Line-Chart

INTERPRETASI

Analisis tren pesanan harian menunjukkan pola penggunaan OJOL yang berbeda-beda per mode layanan: FOOD mendominasi dengan pola stabil 8-10 pesanan/hari sebagai kebutuhan pokok, BIKE sangat fluktuatif (2-15 pesanan) dengan penurunan 40-50% di akhir pekan untuk mobilitas kerja, SHOP konsisten 5-8 pesanan untuk belanja rutin, dan CAR rendah 2-5 pesanan untuk kebutuhan khusus. Pola mingguan jelas terlihat hari kerja didominasi BIKE, akhir pekan didominasi FOOD dan SHOP sehingga platform perlu mengalokasikan driver secara dinamis: lebih banyak driver BIKE di hari kerja dan lebih banyak driver FOOD/SHOP di akhir pekan untuk optimasi efisiensi operasional.

Central_Tendency

INTERPRETASI

Analisis Central Tendency pada grafik ini mengungkapkan anomali menarik yang bersifat kontra-intuitif: biaya perjalanan tidak selalu berbanding lurus dengan jarak. Secara mengejutkan, Median Biaya Tertinggi justru terjadi pada kategori Sedang (3-7 km), bukan pada jarak terjauh. Sementara itu, kategori Pendek menunjukkan ketidakstabilan harga yang ekstrem dengan rentang variasi terluas, sedangkan kategori Sangat Jauh memiliki median yang relatif rendah namun diwarnai oleh lonjakan biaya insidental (outliers). Pola ini mengindikasikan bahwa struktur harga lebih didorong oleh strategi platform atau densitas permintaan pada jarak menengah, dibandingkan sekadar faktor jarak fisik semata.

Statistical Dispersion

INTERPRETASI

Analisis dispersi statistik mengungkap bahwa layanan FOOD memiliki variabilitas biaya tertinggi akibat ragam preferensi konsumen, kontras dengan BIKE yang cenderung stabil dengan rentang harga yang sempit. Distribusi data seluruh moda terbukti Right Skewed (Mean > Median), menegaskan bahwa meskipun mayoritas transaksi bersifat ekonomis, keberadaan outlier bernilai tinggi tetap menarik nilai rata-rata naik. Temuan kunci lainnya adalah konsistensi Koefisien Variasi (CV) di kisaran 30-40% pada semua kategori, yang mengindikasikan bahwa fluktuasi harga terjadi secara proporsional terhadap rata-rata biaya layanan, mencerminkan struktur pricing yang konsisten di seluruh lini produk.

Probability Distributions

Confidence Interval

## Column

Case 1

One-Sample Z-Test

Manager operasional dari perusahaan ojol mengklaim bahwa rata-rata total biaya per transaksi di sebuah wilayah adalah Rp 34.000. Tetapi, tim analisis data menduga bahwa rata-rata aktual nya berbeda dari yang sudah diberikan oleh manajer perusahaan. Untuk membuktikan hal ini, tim analisis perusahaan mengambil data transaksi ojol dan melakukan analisis sehingga diketahui bahwa dari data histris diketahui bahwa standar deviasi populasi (\(\sigma\)) untuk biaya transaksi adalah Rp 34.533.

Tentukan Confidence Interval 95%

Komponen yang diketahui:

  • Rata-rata klaim (\(\mu\)): \(Rp 34.000\) (ini digunakan sebagai pembanding nanti).
  • Standar Deviasi Populasi (\(\sigma\)): \(Rp 34.533\).
  • Tingkat Kepercayaan: 95% (\(\alpha = 0,05\)).
  • Nilai \(Z\) untuk 95%: 1,96.
Ringkasan Z-Test
Keterangan Nilai
Rata-rata Sampel (x̄) 34000.00
Standar Deviasi Populasi (σ) 34533.00
Ukuran Sampel (n) 100.00
Nilai Z (95%) 1.96
Standard Error 3453.30
Margin of Error 6768.47
Batas Bawah CI 27232.00
Batas Atas CI 40768.00

Case 2

One-Sample T-Test

Berdasarkan transasksi ojol, manajemen perusahaan ingin mengetahui apakah rata-rata jarak perjalanan signifikan berbeda dari 7km. Gunakan taraf signifikansi 5%.

Lakukan uji hipotesis untuk menentukan apakah rata-rata jarak perjalanan berbeda dari 7 km

Tentukan Confidence Interval 95%.

Prosedur uji Hipotesis:

  • Hipotesis Nol (\(H_0\)): \(\mu = 7\) km (Rata-rata jarak perjalanan sama dengan 7 km).
  • Hipotesis Alternatif (\(H_a\)): \(\mu \neq 7\) km (Rata-rata jarak perjalanan tidak sama dengan 7 km).
  • Tingkat Signifikansi (\(\alpha\)): 0,05 (5%).
  • Kriteria Keputusan: Tolak \(H_0\) jika \(p-value < 0,05\) atau jika \(|t_{hitung}| > t_{tabel}\).
Ringkasan T-test
Keterangan Nilai
Rata-rata Sampel (x̄) 6.500
Standar Deviasi Sampel (s) 1.200
Ukuran Sampel (n) 25.000
Taraf Signifikansi 0.050
Statistik t -2.083
Nilai Kritis t 2.064
Batas Bawah CI 6.000
Batas Atas CI 7.000

Statistical Inference

## Column

Case 1

One-Sample Z-Test

Manager operasional dari perusahaan ojol mengklaim bahwa rata-rata total biaya per transaksi di sebuah wilayah adalah Rp 34.000. Tetapi, tim analisis data menduga bahwa rata-rata aktual nya berbeda dari yang sudah diberikan oleh manajer perusahaan. Untuk membuktikan hal ini, tim analisis perusahaan mengambil data transaksi ojol dan melakukan analisis sehingga diketahui bahwa dari data histris diketahui bahwa standar deviasi populasi (\(\sigma\)) untuk biaya transaksi adalah Rp 34.533.

Lakukan uji Hipotesis (Z-Test) dengan tingkat signifikansi (\(\alpha\)) 5% untuk menentukan apakah klaim dari manajer tersebut dapat diterima atau ditolak.

Perhitungan Statistik

Dari case tersebut, diketahui:

  • Ukuran sampel (\(n\)): \(n=1017\)
  • Rata-rata sampel (\(\bar{x}\)): \(\bar{x}=Rp \, 36.207\)
  • Standar Deviasi (\(\sigma\)): \(\sigma = Rp\, 34.533\)
  • Rata-rata Hipotesis (\(\mu_{0}\)): \(\mu_{0}=Rp \, 34.000\)
  • Hipotesis Nol (\(H_{0}\)): \(\mu = Rp\, 34.000\)
  • Hipotesis Alternatif (\(H_{1}\)): \(\mu \neq Rp\, 34.000\)
  • Tingkat signifikansi (\(\alpha\)): \(\alpha = 0.05\) atau \(5%\)
Ringkasan Z-Test
Parameter Nilai Rumus
Rata-rata sampel (x̄) 36.207 \(\bar{x}\)
Rata-rata hipotesis (μ₀) 34.000 \(\mu_{0}\)
Simpangan baku populasi (σ) 34.533 \(\sigma\)
Ukuran sampel (n) 1017.000 \(n\)
Statistik uji (z) 2.000 \(\frac{\bar{x}-\mu_{0}}{\sigma/\sqrt{n}}\)
p-value (two-tailed) 0.000 \(2\times{P}(Z\leq{z})\)
Tingkat signifikansi (α) 0.050 \(\alpha\)

Nilai kritis Z = \(2.00 - 0.25 =1.75\)

Kesimpulan:

Sehingga karena nilai dari Statistik uji Z > Nilai kritis Z, (\(2.00 > 1.75\)), maka menolak Hipotesis Nol (\(H_{0}\)). Berdasarkan data yang ada, terdapat bukti statistik yang cukup pada tingkat signifikansi 5% untuk menyatakan bahwa rata-rata total transaksi berbeda dari klaim manager sebesar Rp 34.000

Case 2

One-Sample t-Test

Menguji rata-rata satu populasi Berdasarkan transasksi ojol, manajemen perusahaan ingin mengetahui apakah rata-rata jarak perjalanan signifikan berbeda dari 7km. Gunakan taraf signifikansi 5%.

PERTANYAAN:

Lakukan uji hipotesis untuk menentukan apakah rata-rata jarak perjalanan berbeda dari 7 km

Perhitungan Statistik

Dalam kasus ini, one-sample t-test digunakan untuk menguji apakah rata-rata populasi (\(\mu\)) berbeda secara signifikan dari target (\(\mu=7\) km). Alasan pemilihannya:

  • Nilai Standar Deviasi Populasi (\(\sigma\)) tidak diketahui.
  • Ukuran sampel yang kecil yaitu \(n=19<30\) sehingga tidak cocok untuk distribusi normal

Dari data kasus tersebut, diketahui bahwa:

  • Ukuran sampel (\(n\)) = 19
  • Rata-rata sampel (\(\bar{x}\)) = 7.5 km
  • Standar deviasi Sampel (\(s\)) = 1.2 km
  • Hipotesis nol: \(H_{0}\): \(\mu=7\) km
  • Hipotesis alternatif: \(H_{1}\): \(\mu \neq 7\) km
  • Taraf signifikansi (\(\alpha\)) = 0.05

Rumus statistik t-Test: \(t=\frac{\bar{x} - \mu_{0}}{s / \sqrt{n}}\)

Komponen Perhitungan Rumus/Symbol Nilai Hasil Perhitungan
Rata-rata Sampel (\(\bar{x}\)) \(\bar{x} = \frac{\sum x_i}{n}\) 19.0000
Simpangan Baku Sampel (\(s\)) \(s = \sqrt{\frac{\sum (x_i - \bar{x})^2}{n-1}}\) 7.1764
Ukuran Sampel (\(n\)) \(n\) 5.0000
Nilai Hipotesis (\(\mu_0\)) \(\mu\) 7.0000
Statistik-t (\(t\)) \(t = \frac{\bar{x} - \mu_0}{s/\sqrt{n}}\) 3.7391
Derajat Kebebasan (\(df\)) \(df = n - 1\) 4.0000
p-value (dua arah) \(p = 2 \times P (T \geq t)\) 0.0201
Batas Bawah CI 95% \(\bar{x} - t_{\alpha/2, df} \cdot \frac{s}{\sqrt{n}}\) 10.0894
Batas Atas CI 95% \(\bar{x} + t_{\alpha/2, df} \cdot \frac{s}{\sqrt{n}}\) 27.9106

Dengan Confidence Interval 95%, ditemukan bukti yang signifikan bahwa rata-rata jarak perjalanan berbeda dari 7km. Berdasarkan sampel, rata-rata jarak perjalanan cenderung lebih panjang (7.5km).


Nonparametric Methods

## Column

Case 1

Wilcoxon Signed-Rank Test

Diketahui data total biaya transaksi layanan OJOL.
Uji apakah median total biaya per transaksi berbeda secara signifikan dari Rp 34.000
pada taraf signifikansi:

\[ \alpha = 0.05 \]

Hipotesis:

\[ H_0 : \eta = 34000 \]
\[ H_1 : \eta \neq 34000 \]

Hasil Uji Wilcoxon Signed-Rank Test (Nonparametric Case 1)
Komponen Rumus Nilai
Ukuran Sampel (n) \(n\) 1017.0000
Rata-rata Sampel (x̄) \(\bar{x} = \frac{\sum x_i}{n}\) 36206.9800
Median Sampel \(\tilde{x}\) 19200.0000
Median Hipotesis (H₀) \(\eta_0\) 34000.0000
Statistik Wilcoxon (V) \(W\) 272129.5000
p-value (dua arah) \(p = 2 \times P(W \geq w)\) 0.1556
Tingkat Signifikansi (α) \(\alpha\) 0.0500

Keputusan

Kriteria pengambilan keputusan adalah sebagai berikut:

  • Tolak \(H_0\) jika \(p\text{-value} < 0.05\)
  • Gagal menolak \(H_0\) jika \(p\text{-value} \ge 0.05\)

Berdasarkan output uji Wilcoxon yang diperoleh, nilai p-value dibandingkan dengan \(\alpha = 0.05\) untuk menentukan keputusan uji statistik.

Kesimpulan

Jika nilai p-value lebih kecil dari \(0.05\), maka hipotesis nol ditolak, yang berarti median total biaya transaksi berbeda secara signifikan dari Rp \(34.000\).

Sebaliknya, jika nilai p-value lebih besar atau sama dengan \(0.05\), maka hipotesis nol gagal ditolak. Sehingga median total biaya transaksi tidak berbeda secara signifikan dari Rp \(34.000\).

Case 2

Wilcoxon Signed-Rank Test

Diketahui data jarak perjalanan layanan OJOL.
Uji apakah median jarak perjalanan berbeda secara signifikan dari 7 km pada taraf signifikansi:

\[ \alpha = 0.05 \]

Hipotesis:

\[ H_0 : \eta = 7 \]
\[ H_1 : \eta \neq 7 \]

Hasil Uji Wilcoxon Signed-Rank Test
Komponen Rumus Nilai
Ukuran Sampel (n) \(n\) 1017.0000
Rata-rata Sampel (x̄) \(\bar{x} = \frac{\sum x_i}{n}\) 12.5100
Median Sampel \(\tilde{x}\) 6.9300
Median Hipotesis (H₀) \(\eta_0\) 7.0000
Statistik Wilcoxon (V) \(W\) 278577.5000
p-value (dua arah) \(p = 2 \times P(W \geq w)\) 0.0304
Tingkat Signifikansi (α) \(\alpha\) 0.0500

Keputusan

Kriteria pengambilan keputusan adalah sebagai berikut:

  • Tolak \(H_0\) jika \(p\text{-value} < 0.05\)
  • Gagal menolak \(H_0\) jika \(p\text{-value} \ge 0.05\)

Berdasarkan output uji Wilcoxon yang diperoleh, nilai p-value dibandingkan dengan \(\alpha = 0.05\) untuk menentukan keputusan uji statistik.

Kesimpulan

Jika nilai p-value lebih kecil dari 0.05, maka hipotesis nol ditolak, yang berarti median jarak perjalanan OJOL berbeda secara signifikan dari 7 km.

Sebaliknya, jika nilai p-value lebih besar atau sama dengan 0.05, maka hipotesis nol gagal ditolak. Sehingga median jarak perjalanan OJOL tidak berbeda secara signifikan dari 7 km.

---
title: "UAS StatDas"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows          # atau "rows" sesuai kebutuhan
    vertical_layout: fill         
    theme: yeti
    source_code: embed
    social: null                  # Nonaktifkan social menu
    navbar: null                  # Nonaktifkan navbar default
    favicon: null                 # Nonaktifkan favicon
    self_contained: true         # Semua dalam satu file
    css: style_dashboard.css 
---

  
```{r setup, include=FALSE, warning=FALSE}

# Load library
library(flexdashboard)
library(tidyverse)
library(highcharter)
library(viridis)
library(DT)
library(gapminder)
library(jsonlite)
library(lubridate)
library(gt)
library(kableExtra)
library(formattable)
library(reactable)
library(scales)
library(ggplot2)
library(dplyr)
library(lubridate)
library(RColorBrewer)
library(viridis)
library(ggthemes)
library(patchwork)
library(htmltools)
```

Members {data-orientation=rows}
=======================================================================

```{r, echo=FALSE}

HTML('
<div class="polaroid-container">
  <div class="polaroid-gallery">
    <div class="polaroid-card">
      <div class="polaroid-frame">
        <div class="photo-container">
          <img src="https://drive.google.com/uc?export=download&id=1RvRFkTws5jUBt1RrFCpeCW0OFoS4qblF" alt="Yosef" class="polaroid-photo">
          <div class="photo-overlay"></div>
        </div>
        <div class="polaroid-tape"></div>
      </div>
      <div class="polaroid-info">
        <h3 class="student-name">Yosef Teofani Tamba</h3>
        <p class="student-nim">52250007</p>
        <p class="student-job">Dataset & Statistical Inference</p>
      </div>
    </div>

    <div class="polaroid-card">
      <div class="polaroid-frame">
        <div class="photo-container">
          <img src="https://drive.google.com/uc?export=download&id=1R3wBfKNCo7eM4Ba71qH3K3EIS2Q_lM3Z" alt="Arya" class="polaroid-photo">
          <div class="photo-overlay"></div>
        </div>
        <div class="polaroid-tape"></div>
      </div>
      <div class="polaroid-info">
        <h3 class="student-name">Arya Fharezi</h3>
        <p class="student-nim">52250008</p>
        <p class="student-job">Basic Visualization</p>
      </div>
    </div>

    <div class="polaroid-card">
      <div class="polaroid-frame">
        <div class="photo-container">
          <img src="https://drive.google.com/uc?export=download&id=1TY4w04hz9qlmJVPRrTPwtVgNe1hfpaag" alt="Yustian" class="polaroid-photo">
          <div class="photo-overlay"></div>
        </div>
        <div class="polaroid-tape"></div>
      </div>
      <div class="polaroid-info">
        <h3 class="student-name">M Yustian Putra Muhadi</h3>
        <p class="student-nim">52250015</p>
        <p class="student-job">Confidence Interval</p>
      </div>
    </div>

    <div class="polaroid-card">
      <div class="polaroid-frame">
        <div class="photo-container">
          <img src="https://drive.google.com/uc?export=download&id=1vdu-UnUDPJxAsj5nMpVM4bd_BYx6Ya5a" alt="Christian" class="polaroid-photo">
          <div class="photo-overlay"></div>
        </div>
        <div class="polaroid-tape"></div>
      </div>
      <div class="polaroid-info">
        <h3 class="student-name">Christian Michael Juliano</h3>
        <p class="student-nim">52250011</p>
        <p class="student-job">Nonparametric Methods & Summary ch 1-5</p>
      </div>
    </div>

    <div class="polaroid-card">
      <div class="polaroid-frame">
        <div class="photo-container">
          <img src="https://drive.google.com/uc?export=download&id=1ZsPAcSAkjq9OMEI9Alrerbr1u2Fh34wf" alt="Frenkhy" class="polaroid-photo">
          <div class="photo-overlay"></div>
        </div>
        <div class="polaroid-tape"></div>
      </div>
      <div class="polaroid-info">
        <h3 class="student-name">Frenkhy Tonga Retang</h3>
        <p class="student-nim">52250005</p>
        <p class="student-job">Summary of Basic Statistic ch 6-10</p>
      </div>
    </div>
  </div>
</div>

<style>
.polaroid-container { isolation: isolate; }
.polaroid-container .polaroid-gallery {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 20px;
  width: 100%;
  max-width: 1600px;
  margin: 0 auto;
  padding: 20px;
}
.polaroid-container .polaroid-card {
  perspective: 1000px;
  position: relative;
  transition: transform 0.3s ease;
  height: 520px;
}
.polaroid-container .polaroid-card:hover { transform: translateY(-8px); }
.polaroid-container .polaroid-frame {
  background: white;
  padding: 20px 20px 80px 20px;
  border-radius: 4px;
  box-shadow: 0 15px 35px rgba(0, 82, 204, 0.15);
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  height: 340px;
}
.polaroid-container .photo-container {
  position: relative;
  width: 160px;
  height: 220px;
  overflow: hidden;
  border-radius: 4px;
  background: #003366;
  border: 6px solid white;
  z-index: 2;
}
.polaroid-container .polaroid-photo {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.polaroid-container .polaroid-tape {
  position: absolute;
  top: -10px;
  left: 50%;
  transform: translateX(-50%) rotate(2deg);
  width: 60px;
  height: 20px;
  background: linear-gradient(45deg, #00b8d9, #0052cc);
  opacity: 0.8;
  z-index: 3;
}
.polaroid-container .polaroid-info {
  margin-top: 15px;
  text-align: center;
  padding: 15px;
  background: white;
  border-radius: 8px;
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
  min-height: 120px;
}
.polaroid-container .student-name {
  font-family: sans-serif;
  font-size: 1.1em;
  color: #003366;
  margin: 0 0 5px 0;
}
.polaroid-container .student-nim {
  font-family: sans-serif;
  font-size: 0.9em;
  color: #666;
  background: #f0f7ff;
  padding: 2px 10px;
  border-radius: 10px;
  display: inline-block;
  margin-bottom: 8px;
}
.polaroid-container .student-job {
  font-family: sans-serif;
  font-size: 0.8em;
  color: #0052cc;
  margin: 0;
  font-style: italic;
  font-weight: bold;
}

@media (max-width: 1200px) { .polaroid-container .polaroid-gallery { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 768px) { .polaroid-container .polaroid-gallery { grid-template-columns: repeat(1, 1fr); } }

@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(20px); }
  to { opacity: 1; transform: translateY(0); }
}
.polaroid-container .polaroid-card { animation: fadeInUp 0.5s ease-out forwards; opacity: 0; }
.polaroid-container .polaroid-card:nth-child(1) { animation-delay: 0.1s; }
.polaroid-container .polaroid-card:nth-child(2) { animation-delay: 0.2s; }
.polaroid-container .polaroid-card:nth-child(3) { animation-delay: 0.3s; }
.polaroid-container .polaroid-card:nth-child(4) { animation-delay: 0.4s; }
.polaroid-container .polaroid-card:nth-child(5) { animation-delay: 0.5s; }
</style>
')
```
Summary of Basic Statistics {data-orientation=rows}
=======================================================================
  
## Column {.tabset .tabset-fade data-height=520}
-----------------------------------------------------------------------

### Chapter 1 {data-width=1200}

```{r ch1-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1eqimjBStVFbWCxkr3-jY6LqDpddOl0kr")
```

### Chapter 2 {data-width=1200}

```{r ch2-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1iJ3eAlWOmNL_mOnBIjln0VRQvCt6hTjz")
```
### Chapter 3 {data-width=1200}

```{r ch3-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1XEBDxF1UeGm-rINqs1aGw3dsYhEEhPZs")
```

### Chapter 4  {data-width=1200}

```{r ch4-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1cPIPyoV7fR1zFLNsj2ZTZ7G8qd5_Mw4P")
```

### Chapter 5 {data-width=1200}

```{r ch5-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1NxoRw0Kmy-5vvxmP1l71fq4sWsImQy5h")
```

### Chapter 6 {data-width=1200}

```{r c6-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1woHXj4b5nHdUzrfuLTdEVDBftwvomKaR")
```

### Chapter 7 {data-width=1200}

```{r ch7-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1jABg9hEooTD2c7A1MzjGSBPIl-pgebrr")
```

### Chapter 8 {data-width=1200}

```{r ch8-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1O8UP3_sK_FuWXCuDn-UDU9Y4kgIBnMjy")
```

### Chapter 9  {data-width=1200}

```{r ch9-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1rckdPi6dFsN0pp0o9X_TbMfogEQ_eLHB")
```

### Chapter 10  {data-width=1200}

```{r ch10-mindmap, echo=FALSE, out.width="100%", fig.align='right'}
knitr::include_graphics("https://drive.google.com/uc?export=download&id=1ZexIsFyj7AQpWspmhcMg6qxJ2mY9-kHd")
```


Dataset {data-orientation=rows}
=======================================================================
  
### Table {data-height=520}

Dataset interaktif berikut memiliki manfaat yang penting yaitu **Menangani data yang tidak konsisten atau data yang "Hilang" di bagian kolom atau baris**

```{r, echo=FALSE, warning=FALSE}
# Membaca data
url_data1 = "https://drive.google.com/uc?id=1PTMLi4GO9QMgDynwrW3-oOjdMBF9uNr4&export=download" # menggunakan link url dari GDrive
url_data2 = "https://drive.google.com/uc?id=1mgMkk5GIZeGE45JKlMCTfeTPDVBs78Wj&export=download"

data1 <- read.csv(url_data1, 
                 sep = ";", 
                 stringsAsFactors = FALSE,
                 encoding = "UTF-8")

# 2. BERSIHKAN DAN FORMAT DATA
data_clean <- data1 %>%
  mutate(
    # Format tanggal
    date_order = as.POSIXct(date_order, format = "%d/%m/%Y %H.%M"),
    date_finished = as.POSIXct(date_finished, format = "%d/%m/%Y %H.%M"),
    
    # Hitung durasi perjalanan (dalam jam)
    duration_hours = as.numeric(difftime(date_finished, date_order, units = "hours")),
    
    # Format kolom numerik (ganti koma dengan titik)
    across(c(distance, amount_delivery, amount_merchant, transaction_amount_total),
           ~ as.numeric(gsub(",", ".", .))),
    
    # Buat kategori jarak
    distance_category = case_when(
      distance <= 3 ~ "Pendek (<3 km)",
      distance <= 7 ~ "Sedang (3-7 km)",
      distance <= 12 ~ "Jauh (7-12 km)",
      TRUE ~ "Sangat Jauh (>12 km)"
    ),
    
    # Format mata uang
    transaction_amount_total_formatted = paste0("Rp", format(transaction_amount_total, big.mark = ".", decimal.mark = ",")),
    
    # Buat kolom tanggal saja (tanpa waktu)
    order_date_only = as.Date(date_order)
  )

# 3. BUAT DATATABLE INTERAKTIF
datatable(
  data_clean %>%
    select(
      ID = id,
      Tanggal_Pesanan = order_date_only,
      Waktu_Pesanan = date_order,
      Mode = mode,
      Dari_Kecamatan = from_kecamatan,
      Ke_Kecamatan = to_kecamatan,
      Jarak_km = distance,
      Kategori_Jarak = distance_category,
      Durasi_Jam = duration_hours,
      Biaya_Pengiriman = amount_delivery,
      Biaya_Merchant = amount_merchant,
      Total_Biaya = transaction_amount_total_formatted,
      Nama_Customer = customer_name,
      Gender_Customer = customer_gender,
      Nama_Driver = driver_name,
      Kendaraan = kendaraan_merk,
      Nama_Merchant = merchant_name,
      Kategori_Merchant = merchant_category
    ),
  
  # OPTIONS DATATABLE
  options = list(
    pageLength = 15,                    # 15 baris per halaman
    lengthMenu = c(10, 15, 25, 50, 100), # Pilihan jumlah baris
    scrollX = TRUE,                     # Scroll horizontal
    scrollY = "500px",                  # Tinggi fixed
    autoWidth = TRUE,                   # Lebar otomatis
    dom = 'Blfrtip',                    # Kontrol tabel
    buttons = list(
      list(extend = 'copy', title = 'Data OJOL Transactions'),
      list(extend = 'csv', title = 'Data OJOL Transactions'),
      list(extend = 'excel', title = 'Data OJOL Transactions'),
      list(extend = 'pdf', title = 'Data OJOL Transactions'),
      list(extend = 'print', title = 'Data OJOL Transactions'),
      list(extend = 'colvis', text = 'Pilih Kolom')
    ),
    language = list(
      search = "Cari:",
      lengthMenu = "Tampilkan _MENU_ baris",
      info = "Menampilkan _START_ sampai _END_ dari _TOTAL_ transaksi",
      paginate = list(
        first = "Pertama",
        last = "Terakhir",
        `next` = "Berikutnya",    # GUNAKAN BACKTICK untuk reserved word
        previous = "Sebelumnya"
      )
    ),
    initComplete = JS(
      "function(settings, json) {",
      "$(this.api().table().header()).css({'background-color': '#2C3E50', 'color': '#fff'});",
      "}"
    )
  ),
  
  # KUSTOMISASI
  rownames = FALSE,
  filter = "top",                        # Filter di atas setiap kolom
  class = "display compact stripe hover", # Style tabel
  caption = tags$caption(
    style = 'caption-side: top; text-align: center; color: #2C3E50; font-size: 20px; font-weight: bold;',
    'DATA TRANSAKSI OJOL - PONTIANAK'
  ),
  extensions = c('Buttons')
) %>%
  
  # FORMATTING KOLOM
  formatStyle(
    columns = 'Total_Biaya',
    backgroundColor = styleInterval(
      cuts = c(50000, 100000),
      values = c('#E8F8F5', '#D1F2EB', '#A3E4D7')
    ),
    fontWeight = 'bold'
  ) %>%
  
  formatStyle(
    columns = 'Mode',
    backgroundColor = styleEqual(
      levels = c('BIKE', 'CAR', 'FOOD', 'SHOP'),
      values = c('#FEF9E7', '#E8F6F3', '#FDEDEC', '#F4ECF7')
    ),
    fontWeight = 'bold'
  ) %>%
  
  formatStyle(
    columns = 'Kategori_Jarak',
    backgroundColor = styleEqual(
      levels = c('Pendek (<3 km)', 'Sedang (3-7 km)', 'Jauh (7-12 km)', 'Sangat Jauh (>12 km)'),
      values = c('#D5F4E6', '#FEF9E7', '#FDEBD0', '#FADBD8')
    )
  ) %>%
  
  formatRound(
    columns = c('Jarak_km', 'Durasi_Jam'),
    digits = 2
  ) %>%
  
  formatCurrency(
    columns = c('Biaya_Pengiriman', 'Biaya_Merchant'),
    currency = "Rp",
    interval = 3,
    mark = ".",
    digits = 0,
    before = FALSE
  ) %>%
  
  # WARNA BERDASARKAN NILAI
  formatStyle(
    columns = 'Jarak_km',
    background = styleColorBar(data_clean$distance, '#AED6F1'),
    backgroundSize = '100% 90%',
    backgroundRepeat = 'no-repeat',
    backgroundPosition = 'center'
  )
```

All About Basic Visualizations {data-orientation=rows}
=======================================================================

## Column {.tabset .tabset-fade data-height=520}
-----------------------------------------------------------------------
  
### Pie-Chart

<div class="row"> <div class="col-md-6">
```{r, echo=FALSE}
# 1. LOAD PACKAGES
library(ggplot2)
library(dplyr)
library(plotly)

# 2. LOAD DATA
data <- read.csv(url_data2, stringsAsFactors = FALSE)

# 3. HITUNG DISTRIBUSI MODA
mode_data <- data %>%
  count(Mode) %>%
  mutate(
    persen = round(n / sum(n) * 100, 1),
    label = paste0(persen, "%"),
    hover_text = paste0(
      "<b>", Mode, "</b><br>",
      "Persentase: <b>", persen, "%</b><br>",
      "Jumlah Transaksi: <b>", format(n, big.mark = ","), "</b>"
    )
  )

# 4. WARNA SOFT YANG SAMA
warna <- c(
  "BIKE" = "#66B3FF",
  "FOOD" = "#99FF99", 
  "CAR"  = "#FFB366",
  "SHOP" = "#FF9999"
)

# 5. BUAT VISUALISASI DENGAN UKURAN NORMAL
donut_interactive <- plot_ly(
  mode_data,
  labels = ~Mode,
  values = ~persen,
  type = 'pie',
  hole = 0.5,
  textinfo = 'text',
  text = ~label,
  textposition = 'inside',
  textfont = list(
    size = 16,
    color = 'black', 
    weight = 'bold',
    family = 'Arial'
  ),
  hoverinfo = 'text',
  hovertext = ~hover_text,
  hoverlabel = list(
    font = list(size = 13, color = 'white'),
    bgcolor = '#333333',
    bordercolor = '#333333'
  ),
  marker = list(
    colors = warna,
    line = list(color = 'white', width = 2)
  ),
  showlegend = TRUE
) %>%
  layout(
    title = list(
      text = "<span style='font-size:18px; font-weight:bold'>Distribusi Moda Transportasi OJOL</span>",
      x = 0.5,
      y = 0.95,
      xanchor = 'center',
      yanchor = 'top'
    ),
    legend = list(
      font = list(size = 13),
      title = list(
        text = "<b style='font-size:14px'>KATEGORI</b>",
        font = list(size = 14)
      ),
      x = 1.05,
      y = 0.5,
      xanchor = 'left',
      bgcolor = '#f8f9fa',
      bordercolor = '#dee2e6',
      borderwidth = 1
    ),
    margin = list(
      t = 80,
      b = 20,
      l = 20,
      r = 130
    ),
    paper_bgcolor = '#FFFFFF',
    plot_bgcolor = '#FFFFFF',
    showlegend = TRUE
  )

# 6. RENDER
donut_interactive
```

</div>
<div class="col-md-6">
<div style="background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: white; padding: 15px 20px; border-radius: 6px; margin-bottom: 25px; box-shadow: 0 4px 12px rgba(30, 60, 114, 0.15);">
<div style="display: flex; align-items: center; gap: 15px;">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/>
<polyline points="22 4 12 14.01 9 11.01"/>
</svg>
<div style="flex: 1; text-align: center; background: white; padding: 8px 20px; border-radius: 6px; border: 1px solid #c8e1ff; box-shadow: 0 2px 6px rgba(0,0,0,0.05);">
<div style="font-family: 'Courier New', monospace; font-size: 18px; color: #1e3c72; font-weight: 700; letter-spacing: 1px;">
***INTERPRETASI***
</div>
</div>
</div>
</div>
<div style="padding: 20px; background: linear-gradient(135deg, #f5fbff 0%, #d9ecff 100%); border-radius: 8px; border: 2px solid #2196f3; box-shadow: 0 4px 6px rgba(33, 150, 243, 0.1);">
<p style="text-align: justify; text-indent: 40px; margin-bottom: 0; color: #0d47a1; font-weight: 500; line-height: 1.6;">
Pie-Chart ini menunjukkan distribusi penggunaan moda transportasi OJOL di Pontianak. BIKE menjadi moda paling dominan dengan 32,0% transaksi, mencerminkan preferensi masyarakat terhadap ojek motor yang hemat dan efisien di perkotaan. FOOD menempati posisi kedua dengan 26,1%, mengindikasikan tingginya permintaan layanan pesan makanan. CAR dan SHOP masing-masing menyumbang 23,8% dan 18,1%. Secara keseluruhan, layanan transportasi (BIKE + CAR = 55,8%) masih mendominasi, namun layanan berbasis konsumsi (FOOD + SHOP = 44,3%) sudah mengejar ketat, menandakan diversifikasi penggunaan platform OJOL di masyarakat.
</p>
</div>
</div>
</div>

### Bar-Chart {data-width=600 data-height=510}

<div class="row">
<div class="col-md-6">

```{r, echo=FALSE}
library(dplyr)
library(plotly)

# 1. LOAD & PREPARE DATA
data <- read.csv(url_data2, stringsAsFactors = FALSE)

jarak_data <- data %>%
  group_by(Kategori_Jarak) %>%
  summarise(
    Jumlah = n(),
    .groups = 'drop'
  ) %>%
  mutate(
    Persentase = round(Jumlah / sum(Jumlah) * 100, 1),
    Label = paste0(Persentase, "%"),
    Urutan = case_when(
      Kategori_Jarak == "Pendek (<3 km)" ~ 1,
      Kategori_Jarak == "Sedang (3-7 km)" ~ 2,
      Kategori_Jarak == "Jauh (7-12 km)" ~ 3,
      Kategori_Jarak == "Sangat Jauh (>12 km)" ~ 4
    )
  ) %>%
  arrange(Urutan)

# 2. CREATE INTERACTIVE BARCHART
fig <- plot_ly(
  jarak_data,
  x = ~Kategori_Jarak,
  y = ~Jumlah,
  type = "bar",
  marker = list(
    color = c("#66B3FF", "#99FF99", "#FFB366", "#FF9999"),
    line = list(color = "white", width = 1)
  ),
  hoverinfo = "text",
  hovertext = ~paste0(
    "<b>", Kategori_Jarak, "</b><br>",
    "Jumlah Pesanan: ", format(Jumlah, big.mark = "."), "<br>",
    "Persentase: ", Persentase, "%"
  ),
  text = ~Label,
  textposition = "outside"
)

# 3. CUSTOMIZE LAYOUT
fig <- fig %>% layout(
  title = list(
    text = "<b>Frekuensi Pesanan per Kategori Jarak</b>",
    x = 0.5,
    font = list(size = 18)
  ),
  xaxis = list(
    title = "",
    tickfont = list(size = 12),
    categoryorder = "array",
    categoryarray = jarak_data$Kategori_Jarak
  ),
  yaxis = list(
    title = "Jumlah Pesanan",
    tickfont = list(size = 12),
    gridcolor = "#f0f0f0"
  ),
  margin = list(t = 50, b = 50, l = 50, r = 50),
  plot_bgcolor = "white",
  paper_bgcolor = "white"
)

# 4. SHOW CHART
fig
```

</div>
<div class="col-md-6">
<div style="background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: white; padding: 15px 20px; border-radius: 6px; margin-bottom: 25px; box-shadow: 0 4px 12px rgba(30, 60, 114, 0.15);">
<div style="display: flex; align-items: center; gap: 15px;">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
<line x1="3" y1="9" x2="21" y2="9"/>
<line x1="9" y1="21" x2="9" y2="9"/>
</svg>
<div style="flex: 1; text-align: center; background: white; padding: 8px 20px; border-radius: 6px; border: 1px solid #c8e1ff; box-shadow: 0 2px 6px rgba(0,0,0,0.05);">
<div style="font-family: 'Courier New', monospace; font-size: 18px; color: #1e3c72; font-weight: 700; letter-spacing: 1px;">
***INTERPRETASI***
</div>
</div>
</div>
</div>
<div style="padding: 20px; background: linear-gradient(135deg, #f5fbff 0%, #d9ecff 100%); border-radius: 8px; border: 2px solid #2196f3; box-shadow: 0 4px 6px rgba(33, 150, 243, 0.1);">
<p style="text-align: justify; text-indent: 40px; margin-bottom: 15px; color: #0d47a1; font-weight: 500; line-height: 1.6;">
Berdasarkan analisis frekuensi pesanan, perjalanan dengan jarak Sedang (3-7 km) mendominasi penggunaan layanan OJOL (±60-70%), menunjukkan preferensi konsumen untuk mobilitas sehari-hari dalam jarak menengah. Jarak pendek (<3 km) relatif rendah (±10-15%), kemungkinan karena kurang kompetitifnya biaya minimum, sedangkan jarak jauh (7-12 km) tetap signifikan (±15-25%) sebagai alternatif transportasi antar kecamatan. Insight utama: fokus optimasi pada layanan jarak 3-7 km sebagai core business, sambil pertahankan layanan jarak lainnya untuk diversifikasi.
</p>
</div>
</div>
</div>

### Line-Chart {data-width=600 data-height=510}

<div class="row">
<div class="col-md-6">

```{r}
library(dplyr)
library(plotly)
library(lubridate)

# 1. PREPARE DATA
data <- read.csv(url_data2, stringsAsFactors = FALSE)

trend_data <- data %>%
  mutate(
    Tanggal = as.Date(Tanggal_Pesanan),
    Hari = format(Tanggal, "%Y-%m-%d")
  ) %>%
  group_by(Hari, Mode) %>%
  summarise(
    Jumlah_Pesanan = n(),
    .groups = 'drop'
  ) %>%
  mutate(
    Tanggal = as.Date(Hari),
    Mode = factor(Mode, levels = c("BIKE", "CAR", "FOOD", "SHOP"))
  ) %>%
  arrange(Tanggal)

# 2. CREATE LINE CHART
fig <- plot_ly()

# Add lines for each mode
colors <- c("BIKE" = "#66B3FF", "CAR" = "#FFB366", 
            "FOOD" = "#99FF99", "SHOP" = "#FF9999")

for(mode in levels(trend_data$Mode)) {
  mode_df <- trend_data %>% filter(Mode == mode)
  
  fig <- fig %>% add_trace(
    data = mode_df,
    x = ~Tanggal,
    y = ~Jumlah_Pesanan,
    type = 'scatter',
    mode = 'lines+markers',
    name = mode,
    line = list(color = colors[mode], width = 3),
    marker = list(size = 6),
    hoverinfo = 'text',
    hovertext = ~paste0(
      "<b>", mode, "</b><br>",
      "Tanggal: ", format(Tanggal, "%d %b %Y"), "<br>",
      "Jumlah Pesanan: ", Jumlah_Pesanan
    )
  )
}

# 3. CUSTOMIZE LAYOUT
fig <- fig %>% layout(
  title = list(
    text = "<b>Tren Pesanan Harian per Mode Layanan</b>",
    x = 0.5,
    font = list(size = 18)
  ),
  xaxis = list(
    title = "Tanggal",
    tickformat = "%d %b",
    tickfont = list(size = 12),
    gridcolor = "#f0f0f0"
  ),
  yaxis = list(
    title = "Jumlah Pesanan",
    tickfont = list(size = 12),
    gridcolor = "#f0f0f0"
  ),
  hovermode = 'x unified',
  margin = list(t = 50, b = 50, l = 50, r = 50),
  plot_bgcolor = "white",
  paper_bgcolor = "white",
  legend = list(
    orientation = "h",
    x = 0.5,
    y = -0.15,
    xanchor = "center"
  )
)

# 4. SHOW CHART
fig
```

</div>
<div class="col-md-6">
<div style="background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: white; padding: 15px 20px; border-radius: 6px; margin-bottom: 25px; box-shadow: 0 4px 12px rgba(30, 60, 114, 0.15);">
<div style="display: flex; align-items: center; gap: 15px;">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
<line x1="3" y1="9" x2="21" y2="9"/>
<line x1="9" y1="21" x2="9" y2="9"/>
</svg>
<div style="flex: 1; text-align: center; background: white; padding: 8px 20px; border-radius: 6px; border: 1px solid #c8e1ff; box-shadow: 0 2px 6px rgba(0,0,0,0.05);">
<div style="font-family: 'Courier New', monospace; font-size: 18px; color: #1e3c72; font-weight: 700; letter-spacing: 1px;">
***INTERPRETASI***
</div>
</div>
</div>
</div>
<div style="padding: 20px; background: linear-gradient(135deg, #f5fbff 0%, #d9ecff 100%); border-radius: 8px; border: 2px solid #2196f3; box-shadow: 0 4px 6px rgba(33, 150, 243, 0.1);">
<p style="text-align: justify; text-indent: 40px; margin-bottom: 15px; color: #0d47a1; font-weight: 500; line-height: 1.6;">
Analisis tren pesanan harian menunjukkan pola penggunaan OJOL yang berbeda-beda per mode layanan: FOOD mendominasi dengan pola stabil 8-10 pesanan/hari sebagai kebutuhan pokok, BIKE sangat fluktuatif (2-15 pesanan) dengan penurunan 40-50% di akhir pekan untuk mobilitas kerja, SHOP konsisten 5-8 pesanan untuk belanja rutin, dan CAR rendah 2-5 pesanan untuk kebutuhan khusus. Pola mingguan jelas terlihat hari kerja didominasi BIKE, akhir pekan didominasi FOOD dan SHOP sehingga platform perlu mengalokasikan driver secara dinamis: lebih banyak driver BIKE di hari kerja dan lebih banyak driver FOOD/SHOP di akhir pekan untuk optimasi efisiensi operasional.
</p>
</div>
</div>
</div>

### Central_Tendency

<div class="row"> <div class="col-md-6">
```{r, echo=FALSE}

# Pastikan data_clean awal sudah memuat data asli kamu
# Anggaplah data_clean "MASTER" sudah ada sebelumnya

# --- 1. Persiapan Data Statistik ---
# Pastikan kolom ini benar-benar ada di data_clean awal
total_biaya <- as.numeric(data_clean$transaction_amount_total)
total_biaya <- total_biaya[!is.na(total_biaya)]

median_target <- 34000 
alpha <- 0.05

# Cek apakah data kosong sebelum lanjut
if(length(total_biaya) == 0) stop("Error: Data total_biaya kosong! Cek nama kolom.")

# --- 2. Uji Wilcoxon ---
uji_case1_np <- wilcox.test(total_biaya, mu = median_target, exact = FALSE)
# ... (lanjutan kode tabel statistik kamu aman di sini)

library(dplyr)
library(plotly)

# Load data mentah lagi jika perlu
# data <- read.csv(url_data2, stringsAsFactors = FALSE)

# --- PERBAIKAN DI SINI: Gunakan nama 'data_viz', JANGAN 'data_clean' ---
if(!exists("data") || nrow(data) == 0) {
  # Buat data dummy
  set.seed(123)
  data_viz <- data.frame(  # <--- Ganti nama variabel
    Kategori_Jarak = factor(rep(c("Pendek (<3 km)", "Sedang (3-7 km)", 
                                  "Jauh (7-12 km)", "Sangat Jauh (>12 km)"), each=100),
                            levels = c("Pendek (<3 km)", "Sedang (3-7 km)", 
                                       "Jauh (7-12 km)", "Sangat Jauh (>12 km)")),
    Total_Biaya_Clean = c(
      runif(100, 1000, 100000),     
      runif(100, 5000, 150000),     
      runif(100, 10000, 200000),    
      runif(100, 30000, 300000)     
    )
  )
} else {
  # Gunakan data asli
  data_viz <- data %>%  # <--- Ganti nama variabel
    mutate(
      Total_Biaya_Clean = as.numeric(gsub("[^0-9]", "", Total_Biaya)),
      Kategori_Jarak = factor(Kategori_Jarak,
        levels = c("Pendek (<3 km)", "Sedang (3-7 km)", 
                   "Jauh (7-12 km)", "Sangat Jauh (>12 km)")
      )
    ) %>%
    filter(!is.na(Total_Biaya_Clean) & Total_Biaya_Clean > 0)
}

# --- BOXPLOT (Gunakan data_viz) ---
plot_ly(
  data_viz,  # <--- Update referensi data di sini
  x = ~Kategori_Jarak,
  y = ~Total_Biaya_Clean,
  type = "box",
  color = ~Kategori_Jarak,
  colors = c("#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4"),
  boxpoints = "outliers"
) %>%
  layout(
    title = "<b>Distribusi Total Biaya per Kategori Jarak</b>",
    xaxis = list(title = "Kategori Jarak"),
    yaxis = list(title = "Total Biaya (Rp)", tickformat = ",d")
  )
```

</div>
<div class="col-md-6">
<div style="background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: white; padding: 15px 20px; border-radius: 6px; margin-bottom: 25px; box-shadow: 0 4px 12px rgba(30, 60, 114, 0.15);">
<div style="display: flex; align-items: center; gap: 15px;">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
<line x1="3" y1="9" x2="21" y2="9"/>
<line x1="9" y1="21" x2="9" y2="9"/>
</svg>
<div style="flex: 1; text-align: center; background: white; padding: 8px 20px; border-radius: 6px; border: 1px solid #c8e1ff; box-shadow: 0 2px 6px rgba(0,0,0,0.05);">
<div style="font-family: 'Courier New', monospace; font-size: 18px; color: #1e3c72; font-weight: 700; letter-spacing: 1px;">
***INTERPRETASI***
</div>
</div>
</div>
</div>
<div style="padding: 20px; background: linear-gradient(135deg, #f5fbff 0%, #d9ecff 100%); border-radius: 8px; border: 2px solid #2196f3; box-shadow: 0 4px 6px rgba(33, 150, 243, 0.1);">
<p style="text-align: justify; text-indent: 40px; margin-bottom: 15px; color: #0d47a1; font-weight: 500; line-height: 1.6;">
Analisis Central Tendency pada grafik ini mengungkapkan anomali menarik yang bersifat kontra-intuitif: biaya perjalanan tidak selalu berbanding lurus dengan jarak. Secara mengejutkan, Median Biaya Tertinggi justru terjadi pada kategori Sedang (3-7 km), bukan pada jarak terjauh. Sementara itu, kategori Pendek menunjukkan ketidakstabilan harga yang ekstrem dengan rentang variasi terluas, sedangkan kategori Sangat Jauh memiliki median yang relatif rendah namun diwarnai oleh lonjakan biaya insidental (outliers). Pola ini mengindikasikan bahwa struktur harga lebih didorong oleh strategi platform atau densitas permintaan pada jarak menengah, dibandingkan sekadar faktor jarak fisik semata.
</p>
</div>
</div>
</div>

### Statistical Dispersion
<div class="row"> <div class="col-md-6">
```{r}
library(dplyr)
library(plotly)

# 1. LOAD DATA
data <- read.csv(url_data2, stringsAsFactors = FALSE)

# 2. BERSIHKAN DATA BIAYA
# Fungsi sederhana untuk membersihkan Rp
bersihkan_angka <- function(x) {
  angka <- gsub("[^0-9]", "", x)
  ifelse(angka == "", 0, as.numeric(angka))
}

data <- data %>%
  mutate(
    Biaya_Bersih = bersihkan_angka(Total_Biaya)
  )

# 3. FILTER DATA
# Pilih 4 moda utama
moda_utama <- c("BIKE", "CAR", "FOOD", "SHOP")
data_filtered <- data %>% filter(Mode %in% moda_utama)

# Warna-warna lembut
warna <- c("#88CCEE", "#CC6677", "#DDCC77", "#117733")

# Hitung statistik per moda
stat_moda <- data_filtered %>%
  group_by(Mode) %>%
  summarise(
    Mean = mean(Biaya_Bersih, na.rm = TRUE),
    Median = median(Biaya_Bersih, na.rm = TRUE),
    Jumlah = n(),
    .groups = 'drop'
  )

# 4. BUAT HISTOGRAM INTERAKTIF DENGAN MEAN DAN MEDIAN
fig <- plot_ly()

for (i in 1:length(moda_utama)) {
  moda <- moda_utama[i]
  data_moda <- data_filtered %>% filter(Mode == moda)
  stats <- stat_moda %>% filter(Mode == moda)
  
  # Tambah histogram
  fig <- fig %>% add_trace(
    x = ~Biaya_Bersih,
    data = data_moda,
    type = "histogram",
    name = paste(moda, " (n=", stats$Jumlah, ")", sep = ""),
    marker = list(color = warna[i]),
    opacity = 0.6,
    nbinsx = 30,
    hovertemplate = paste(
      "<b>", moda, "</b><br>",
      "Biaya: Rp %{x:,.0f}<br>",
      "Frekuensi: %{y}<br>",
      "<extra></extra>"
    ),
    showlegend = TRUE
  )
  
  # Tambah garis mean (garis solid)
  fig <- fig %>% add_trace(
    x = c(stats$Mean, stats$Mean),
    y = c(0, max(hist(data_moda$Biaya_Bersih, breaks = 30, plot = FALSE)$counts) * 1.1),
    type = "scatter",
    mode = "lines",
    name = paste("Mean", moda),
    line = list(
      color = warna[i],
      width = 2,
      dash = "solid"
    ),
    hoverinfo = "text",
    text = paste("<b>Mean", moda, "</b><br>Rp", format(stats$Mean, big.mark = ".", decimal.mark = ",")),
    showlegend = FALSE
  )
  
  # Tambah garis median (garis putus-putus)
  fig <- fig %>% add_trace(
    x = c(stats$Median, stats$Median),
    y = c(0, max(hist(data_moda$Biaya_Bersih, breaks = 30, plot = FALSE)$counts) * 1.1),
    type = "scatter",
    mode = "lines",
    name = paste("Median", moda),
    line = list(
      color = warna[i],
      width = 2,
      dash = "dash"
    ),
    hoverinfo = "text",
    text = paste("<b>Median", moda, "</b><br>Rp", format(stats$Median, big.mark = ".", decimal.mark = ",")),
    showlegend = FALSE
  )
}

# 5. BUAT TABEL STATISTIK UNTUK TAMBAHAN
# Tabel statistik dalam format yang lebih rapi
stat_table <- stat_moda %>%
  mutate(
    Mean_Formatted = paste("Rp", format(round(Mean), big.mark = ".", decimal.mark = ",")),
    Median_Formatted = paste("Rp", format(round(Median), big.mark = ".", decimal.mark = ",")),
    Mode = factor(Mode, levels = moda_utama)
  ) %>%
  arrange(Mode)

# 6. ATUR TAMPILAN HISTOGRAM
fig <- fig %>% layout(
  title = list(
    text = "Distribusi Biaya per Moda Transportasi<br><sub>Garis Solid = Mean | Garis Putus-putus = Median</sub>",
    x = 0.05
  ),
  xaxis = list(
    title = "Total Biaya (Rp)",
    tickformat = ",.0f",
    range = c(0, max(data_filtered$Biaya_Bersih) * 1.05)
  ),
  yaxis = list(
    title = "Jumlah Transaksi",
    rangemode = "tozero"
  ),
  barmode = "overlay",
  legend = list(
    title = list(text = "<b>Moda (Jumlah Data)</b>"),
    x = 1.02,
    y = 0.5
  ),
  hovermode = "x unified",
  margin = list(r = 150)  # Tambah margin untuk legend
)

# 7. TAMPILKAN HISTOGRAM
fig
```

</div>
<div class="col-md-6">
<div style="background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: white; padding: 15px 20px; border-radius: 6px; margin-bottom: 25px; box-shadow: 0 4px 12px rgba(30, 60, 114, 0.15);">
<div style="display: flex; align-items: center; gap: 15px;">
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
<line x1="3" y1="9" x2="21" y2="9"/>
<line x1="9" y1="21" x2="9" y2="9"/>
</svg>
<div style="flex: 1; text-align: center; background: white; padding: 8px 20px; border-radius: 6px; border: 1px solid #c8e1ff; box-shadow: 0 2px 6px rgba(0,0,0,0.05);">
<div style="font-family: 'Courier New', monospace; font-size: 18px; color: #1e3c72; font-weight: 700; letter-spacing: 1px;">
***INTERPRETASI***
</div>
</div>
</div>
</div>
<div style="padding: 20px; background: linear-gradient(135deg, #f5fbff 0%, #d9ecff 100%); border-radius: 8px; border: 2px solid #2196f3; box-shadow: 0 4px 6px rgba(33, 150, 243, 0.1);">
<p style="text-align: justify; text-indent: 40px; margin-bottom: 15px; color: #0d47a1; font-weight: 500; line-height: 1.6;">
Analisis dispersi statistik mengungkap bahwa layanan FOOD memiliki variabilitas biaya tertinggi akibat ragam preferensi konsumen, kontras dengan BIKE yang cenderung stabil dengan rentang harga yang sempit. Distribusi data seluruh moda terbukti Right Skewed (Mean > Median), menegaskan bahwa meskipun mayoritas transaksi bersifat ekonomis, keberadaan outlier bernilai tinggi tetap menarik nilai rata-rata naik. Temuan kunci lainnya adalah konsistensi Koefisien Variasi (CV) di kisaran 30-40% pada semua kategori, yang mengindikasikan bahwa fluktuasi harga terjadi secara proporsional terhadap rata-rata biaya layanan, mencerminkan struktur pricing yang konsisten di seluruh lini produk.
</p>
</div>
</div>
</div>

### Probability Distributions

```{r}

```

Confidence Interval  {data-orientation=rows}
=======================================================================

## Column {.tabset .tabset-fade data-height=520}
-----------------------------------------------------------------------

### Case 1 {data-width=1200}

**One-Sample Z-Test**

Manager operasional dari perusahaan ojol mengklaim bahwa rata-rata total biaya per transaksi di sebuah wilayah adalah **Rp 34.000**. Tetapi, tim analisis data menduga bahwa rata-rata aktual nya berbeda dari yang sudah diberikan oleh manajer perusahaan.
Untuk membuktikan hal ini, tim analisis perusahaan mengambil data transaksi ojol dan melakukan analisis sehingga diketahui bahwa dari data histris diketahui bahwa standar deviasi populasi ($\sigma$) untuk biaya transaksi adalah **Rp 34.533**. 

Tentukan **Confidence Interval 95%** 

**Komponen yang diketahui:**

- **Rata-rata klaim ($\mu$)**: $Rp 34.000$ (ini digunakan sebagai pembanding nanti).
- **Standar Deviasi Populasi ($\sigma$)**: $Rp 34.533$.
- **Tingkat Kepercayaan**: 95% ($\alpha = 0,05$).
- **Nilai $Z$ untuk 95%**: 1,96.

```{r}
# Input data
x_bar <- 34000
sigma <- 34533
n <- 100
z <- 1.96

# Perhitungan
SE <- sigma / sqrt(n)
ME <- z * SE
lower <- x_bar - ME
upper <- x_bar + ME

# Tabel
tabel_CI <- data.frame(
  Keterangan = c(
    "Rata-rata Sampel (x̄)",
    "Standar Deviasi Populasi (σ)",
    "Ukuran Sampel (n)",
    "Nilai Z (95%)",
    "Standard Error",
    "Margin of Error",
    "Batas Bawah CI",
    "Batas Atas CI"
  ),
  Nilai = c(
    x_bar,
    sigma,
    n,
    z,
    round(SE, 2),
    round(ME, 2),
    round(lower, 0),
    round(upper, 0)
  )
)

# Tampilkan tabel rapi
knitr::kable(
  tabel_CI,
  caption = "Ringkasan Z-Test",
  align = c("l", "r")
)

```

### Case 2

**One-Sample T-Test**

Berdasarkan transasksi ojol, manajemen perusahaan ingin mengetahui apakah *rata-rata jarak perjalanan* signifikan berbeda dari 7km. Gunakan taraf signifikansi *5%*.

Lakukan uji hipotesis untuk menentukan apakah rata-rata jarak perjalanan berbeda dari 7 km

Tentukan **Confidence Interval 95%**.

**Prosedur uji Hipotesis:**

- **Hipotesis Nol ($H_0$)**: $\mu = 7$ km (Rata-rata jarak perjalanan sama dengan 7 km).
- **Hipotesis Alternatif ($H_a$)**: $\mu \neq 7$ km (Rata-rata jarak perjalanan tidak sama dengan 7 km).
- **Tingkat Signifikansi ($\alpha$)**: 0,05 (5%).
- **Kriteria Keputusan**: Tolak $H_0$ jika $p-value < 0,05$ atau jika $|t_{hitung}| > t_{tabel}$.

```{r}
# INPUT DATA
x_bar <- 6.5      # rata-rata sampel
mu0   <- 7        # nilai hipotesis
s     <- 1.2      # standar deviasi sampel
n     <- 25
alpha <- 0.05

# PERHITUNGAN
SE <- s / sqrt(n)
t_stat <- (x_bar - mu0) / SE
t_crit <- qt(1 - alpha/2, df = n - 1)

lower <- x_bar - t_crit * SE
upper <- x_bar + t_crit * SE

# TABEL RINGKASAN
tabel_ttest <- data.frame(
  Keterangan = c(
    "Rata-rata Sampel (x̄)",
    "Standar Deviasi Sampel (s)",
    "Ukuran Sampel (n)",
    "Taraf Signifikansi",
    "Statistik t",
    "Nilai Kritis t",
    "Batas Bawah CI",
    "Batas Atas CI"
  ),
  Nilai = c(
    x_bar,
    s,
    n,
    alpha,
    round(t_stat, 3),
    round(t_crit, 3),
    round(lower, 2),
    round(upper, 2)
  )
)

knitr::kable(
  tabel_ttest,
  caption = "Ringkasan T-test",
  align = c("l", "r")
)

```

Statistical Inference {data-orientation=rows}
=======================================================================

## Column {.tabset .tabset-fade data-height=520}
-----------------------------------------------------------------------

### Case 1 {data-width=1200}

**One-Sample Z-Test**

Manager operasional dari perusahaan ojol mengklaim bahwa rata-rata total biaya per transaksi di sebuah wilayah adalah **Rp 34.000**. Tetapi, tim analisis data menduga bahwa rata-rata aktual nya berbeda dari yang sudah diberikan oleh manajer perusahaan.
Untuk membuktikan hal ini, tim analisis perusahaan mengambil data transaksi ojol dan melakukan analisis sehingga diketahui bahwa dari data histris diketahui bahwa standar deviasi populasi ($\sigma$) untuk biaya transaksi adalah **Rp 34.533**.

Lakukan uji Hipotesis (Z-Test) dengan tingkat signifikansi ($\alpha$) 5% untuk menentukan apakah klaim dari manajer tersebut dapat diterima atau ditolak. 

#### **Perhitungan Statistik**
Dari case tersebut, diketahui:

- **Ukuran sampel ($n$)**: $n=1017$
- **Rata-rata sampel ($\bar{x}$)**: $\bar{x}=Rp \, 36.207$
- **Standar Deviasi ($\sigma$)**: $\sigma = Rp\, 34.533$
- **Rata-rata Hipotesis ($\mu_{0}$)**: $\mu_{0}=Rp \, 34.000$
- **Hipotesis Nol ($H_{0}$)**: $\mu = Rp\, 34.000$
- **Hipotesis Alternatif ($H_{1}$)**: $\mu \neq Rp\, 34.000$
- **Tingkat signifikansi ($\alpha$)**: $\alpha = 0.05$ atau $5%$

```{r, echo=FALSE}
# Data
mu0 <- 34.000          # Rata-rata hipotesis
sigma <- 34.533         # Simpangan baku populasi
n <- 1017             # Ukuran sampel
xbar <- 36.207         # Rata-rata sampel
alpha <- 0.05       # Tingkat signifikansi

# Hitung statistik uji dan p-value
z_stat <- (xbar - mu0) / (sigma / sqrt(n))
p_value <- 2 * pnorm(-abs(z_stat))  # Two-tailed p-value


# Buat summary table
summary_table <- data.frame(
  `Parameter` = c("Rata-rata sampel (x̄)", 
                  "Rata-rata hipotesis (μ₀)", 
                  "Simpangan baku populasi (σ)", 
                  "Ukuran sampel (n)", 
                  "Statistik uji (z)", 
                  "p-value (two-tailed)",
                  "Tingkat signifikansi (α)"),
  `Nilai` = c(xbar, mu0, sigma, n, 
              round(z_stat, 1), 
              round(p_value, 1), alpha),
  `Rumus` = c(
    r"($\bar{x}$)",
    r"($\mu_{0}$)",
    r"($\sigma$)",
    r"($n$)",
    r"($\frac{\bar{x}-\mu_{0}}{\sigma/\sqrt{n}}$)",
    r"($2\times{P}(Z\leq{z})$)",
    r"($\alpha$)"
  ),
  check.names = FALSE,
  stringsAsFactors = FALSE
)

# Render tabel
kable(summary_table,
      caption = "Ringkasan Z-Test")
```

Nilai kritis Z = $2.00 - 0.25 =1.75$ 

**Kesimpulan:**

Sehingga karena nilai dari **Statistik uji Z > Nilai kritis Z**, ($2.00 > 1.75$), maka menolak **Hipotesis Nol** ($H_{0}$). Berdasarkan data yang ada, terdapat bukti statistik yang
cukup pada **tingkat signifikansi 5%** untuk menyatakan bahwa rata-rata total transaksi berbeda dari klaim manager sebesar Rp 34.000

### Case 2

**One-Sample t-Test**

**Menguji rata-rata satu populasi**
Berdasarkan transasksi ojol, manajemen perusahaan ingin mengetahui apakah *rata-rata jarak perjalanan* signifikan berbeda dari 7km. Gunakan taraf signifikansi *5%*.

**PERTANYAAN:**

Lakukan uji hipotesis untuk menentukan apakah rata-rata jarak perjalanan berbeda dari 7 km

#### **Perhitungan Statistik**
Dalam kasus ini, **one-sample t-test** digunakan untuk menguji apakah rata-rata populasi ($\mu$) berbeda secara signifikan dari target ($\mu=7$ km). Alasan pemilihannya:

- **Nilai Standar Deviasi Populasi ($\sigma$)** tidak diketahui.
- Ukuran **sampel yang kecil** yaitu $n=19<30$ sehingga tidak cocok untuk distribusi normal

Dari data kasus tersebut, diketahui bahwa: 

- **Ukuran sampel** ($n$) = 19
- **Rata-rata sampel** ($\bar{x}$) = 7.5 km
- **Standar deviasi Sampel** ($s$) = 1.2 km
- **Hipotesis nol**: $H_{0}$: $\mu=7$ km
- **Hipotesis alternatif**: $H_{1}$: $\mu \neq 7$ km
- **Taraf signifikansi** ($\alpha$) = 0.05

Rumus statistik t-Test: $t=\frac{\bar{x} - \mu_{0}}{s / \sqrt{n}}$

```{r, echo=FALSE}
# Data
waktu <- c(10, 15, 19, 22, 29)
n <- length(waktu)
mu0 <- 7

# Perhitungan
x_bar <- mean(waktu)
s <- sd(waktu)
t_stat <- (x_bar - mu0) / (s / sqrt(n))
df <- n - 1
p_value <- 2 * pt(-abs(t_stat), df) # Two-tailed p-value
ci <- t.test(waktu, mu = mu0, conf.level = 0.95)$conf.int

# Membuat Tabel 
library(knitr)
hasil <- data.frame(
  Komponen = c("Rata-rata Sampel ($\\bar{x}$)", 
               "Simpangan Baku Sampel ($s$)",
               "Ukuran Sampel ($n$)",
               "Nilai Hipotesis ($\\mu_0$)",
               "Statistik-t ($t$)",
               "Derajat Kebebasan ($df$)",
               "p-value (dua arah)",
               "Batas Bawah CI 95%",
               "Batas Atas CI 95%"),
  Rumus_Symbol = c("$\\bar{x} = \\frac{\\sum x_i}{n}$",
                   "$s = \\sqrt{\\frac{\\sum (x_i - \\bar{x})^2}{n-1}}$",
                   "$n$",
                   "$\\mu$",
                   "$t = \\frac{\\bar{x} - \\mu_0}{s/\\sqrt{n}}$",
                   "$df = n - 1$",
                   "$p = 2 \\times P (T \\geq t)$",
                   "$\\bar{x} - t_{\\alpha/2, df} \\cdot \\frac{s}{\\sqrt{n}}$",
                   "$\\bar{x} + t_{\\alpha/2, df} \\cdot \\frac{s}{\\sqrt{n}}$"),
  Nilai_Hitung = c(round(x_bar, 4),
                   round(s, 4),
                   n,
                   mu0,
                   round(t_stat, 4),
                   df,
                   round(p_value, 4),
                   round(ci[1], 4),
                   round(ci[2], 4))
)
kable(hasil, align = 'c', col.names = c("Komponen Perhitungan", "Rumus/Symbol", "Nilai Hasil Perhitungan"))
```

Dengan Confidence Interval 95%, ditemukan bukti yang signifikan bahwa rata-rata jarak perjalanan **berbeda dari 7km**. Berdasarkan sampel, rata-rata jarak perjalanan cenderung lebih panjang (7.5km).

---

Nonparametric Methods {data-orientation=rows}
=======================================================================

## Column {.tabset .tabset-fade data-height=520}
---------------------------------------------------------------------

### Case 1 {data-width=1200}

**Wilcoxon Signed-Rank Test**

Diketahui data total biaya transaksi layanan OJOL.  
Uji apakah **median total biaya per transaksi** berbeda secara signifikan dari **Rp 34.000**  
pada taraf signifikansi:

\[
\alpha = 0.05
\]

**Hipotesis:**  

\[
H_0 : \eta = 34000
\]  
\[
H_1 : \eta \neq 34000
\]  

```{r, echo=FALSE, warning=FALSE, message=FALSE}
library(knitr)
library(kableExtra)

# ===============================
# 1. Persiapan Data
# ===============================
total_biaya <- as.numeric(data_clean$transaction_amount_total)
total_biaya <- total_biaya[!is.na(total_biaya)]
median_target <- 34000
alpha <- 0.05

# ===============================
# 2. Uji Wilcoxon Signed-Rank
# ===============================
uji_case1_np <- wilcox.test(total_biaya, mu = median_target, exact = FALSE)
V_stat <- uji_case1_np$statistic
p_val <- uji_case1_np$p.value
n <- length(total_biaya)
x_bar <- mean(total_biaya)
med <- median(total_biaya)

# ===============================
# 3. Buat Tabel Rapi
# ===============================
tabel_wilcox_np <- data.frame(
  Komponen = c(
    "Ukuran Sampel (n)",
    "Rata-rata Sampel (x̄)",
    "Median Sampel",
    "Median Hipotesis (H₀)",
    "Statistik Wilcoxon (V)",
    "p-value (dua arah)",
    "Tingkat Signifikansi (α)"
  ),
  Rumus = c(
    "$n$",
    "$\\bar{x} = \\frac{\\sum x_i}{n}$",
    "$\\tilde{x}$",
    "$\\eta_0$",
    "$W$",
    "$p = 2 \\times P(W \\geq w)$",
    "$\\alpha$"
  ),
  Nilai = c(
    n,
    round(x_bar, 2),
    round(med, 2),
    median_target,
    round(V_stat, 2),
    round(p_val, 4),
    alpha
  )
)

kable(tabel_wilcox_np, "html", 
      caption = "Hasil Uji Wilcoxon Signed-Rank Test (Nonparametric Case 1)", 
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  column_spec(3, bold = TRUE, color = "#1e3c72")
```

**Keputusan**

Kriteria pengambilan keputusan adalah sebagai berikut:

- Tolak \(H_0\) jika \(p\text{-value} < 0.05\)  
- Gagal menolak \(H_0\) jika \(p\text{-value} \ge 0.05\)  

Berdasarkan output uji Wilcoxon yang diperoleh, nilai *p-value* dibandingkan dengan
\(\alpha = 0.05\) untuk menentukan keputusan uji statistik.

**Kesimpulan**

Jika nilai *p-value* lebih kecil dari \(0.05\), maka hipotesis nol ditolak, yang berarti **median total biaya transaksi berbeda secara signifikan dari Rp \(34.000\)**.  

Sebaliknya, jika nilai *p-value* lebih besar atau sama dengan \(0.05\), maka hipotesis nol gagal ditolak. Sehingga **median total biaya transaksi tidak berbeda secara signifikan dari Rp \(34.000\)**.

### Case 2 {data-width=1200} 

**Wilcoxon Signed-Rank Test**  

Diketahui data jarak perjalanan layanan OJOL.  
Uji apakah **median jarak perjalanan** berbeda secara signifikan dari **7 km**
pada taraf signifikansi:

\[
\alpha = 0.05
\]


**Hipotesis:**  

\[
H_0 : \eta = 7
\]  
\[
H_1 : \eta \neq 7
\]  

```{r, echo=FALSE, warning=FALSE, message=FALSE}
library(knitr)
library(kableExtra)

# ===============================
# 1. Persiapan Data
# ===============================
jarak <- as.numeric(data_clean$distance)
jarak <- jarak[!is.na(jarak)]
median_target <- 7
alpha <- 0.05

# ===============================
# 2. Uji Wilcoxon Signed-Rank
# ===============================
uji_case1 <- wilcox.test(jarak, mu = median_target, exact = FALSE)
V_stat <- uji_case1$statistic
p_val <- uji_case1$p.value
n <- length(jarak)
x_bar <- mean(jarak)
med <- median(jarak)

# ===============================
# 3. Buat Tabel Rapi
# ===============================
tabel_wilcox <- data.frame(
  Komponen = c(
    "Ukuran Sampel (n)",
    "Rata-rata Sampel (x̄)",
    "Median Sampel",
    "Median Hipotesis (H₀)",
    "Statistik Wilcoxon (V)",
    "p-value (dua arah)",
    "Tingkat Signifikansi (α)"
  ),
  Rumus = c(
    "$n$",
    "$\\bar{x} = \\frac{\\sum x_i}{n}$",
    "$\\tilde{x}$",
    "$\\eta_0$",
    "$W$",
    "$p = 2 \\times P(W \\geq w)$",
    "$\\alpha$"
  ),
  Nilai = c(
    n,
    round(x_bar, 2),
    round(med, 2),
    median_target,
    round(V_stat, 2),
    round(p_val, 4),
    alpha
  )
)

kable(tabel_wilcox, "html", 
      caption = "Hasil Uji Wilcoxon Signed-Rank Test", 
      align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  column_spec(3, bold = TRUE, color = "#1e3c72")
```

**Keputusan**

Kriteria pengambilan keputusan adalah sebagai berikut:

- Tolak \(H_0\) jika \(p\text{-value} < 0.05\)
- Gagal menolak \(H_0\) jika \(p\text{-value} \ge 0.05\)

Berdasarkan output uji Wilcoxon yang diperoleh, nilai *p-value* dibandingkan dengan
\(\alpha = 0.05\) untuk menentukan keputusan uji statistik.



**Kesimpulan**

Jika nilai *p-value* lebih kecil dari 0.05, maka hipotesis nol ditolak, yang berarti **median jarak perjalanan OJOL berbeda secara signifikan dari 7 km**.  

Sebaliknya, jika nilai *p-value* lebih besar atau sama dengan 0.05, maka hipotesis nol gagal ditolak. Sehingga **median jarak perjalanan OJOL tidak berbeda secara signifikan dari 7 km**.