Members

NURUL IFFAH
NIM: 52250037
1. Summary Data Exploration & Confidence Interval
2. Visualisasi Line Chart
3. Central Tendency
4. Statistical Dispersion
5. Probability Distributions
NAISYA
NIM: 52250040
1. Summary Basic Visualization & Essential Probability
2. Visualisasi Pie Chart & Bar Chart
3. Case Study Confidence Interval
VANESSA
NIM: 52250048
1. Summary Intro to Statistics & Statistical Dispersion
2. Case Study Nonparametric Methods
CHELSEA
NIM: 52250041
1. Summary Central Tendency & Probability Distributions
2. Case Study Statistical Inference
RONI
NIM: 52250020
1. Summary Statistical Inference & Nonparametric Methods
2. Mencari Dataset (Dummy)
UAS STATISTIK
Program Studi
Sains Data
Universitas
INSTITUT TEKNOLOGI SAINS BANDUNG
Dosen Pengampu
Bakti Siregar, M.Sc., CSD

Summary of Basic Statistics

## Column

Chapter 1

Intro to Statistics

Data Exploration

Data Exploration Mind Map

Chapter 3

Basic Visualizations

Histogram

  • Menampilkan distribusi data numerik
  • Melihat pola sebaran & skewness
  • Mengidentifikasi beberapa modus

Boxplot

  • Membandingkan distribusi antar kelompok data
  • Mendeteksi outlier
  • Melihat sebaran antar kuartil, median & kemiringan data

Scatter Plot

  • Menampilkan hubungan dua variabel
  • Mendeteksi tren/korelasi
  • Mendeteksi outlier

Histogram

Boxplot

Scatter Plot

Chapter 4

Central Tendency

Chapter 5

Statistical Dispersion

Chapter 6

Essentials of Probability

Event

  • Seorang pengguna memiliki tingkat kepuasan tinggi (Kepuasan ≥ 4)
  • Event diambil dari dataset yang kami tunjukkan di bab selanjutnya

Peluang

    Diketahui:
  • Total observasi (n) = 100
  • Jumlah pengguna dengan Kepuasan ≥ 4 = 69 pengguna
  • \[P(A): \frac {69}{100}\]
  • \[P(Kepuasan ≥ 4): 0.69\]

Interpretasi

    Peluang seorang pengguna food delivery memiliki tingkat kepuasan tinggi adalah 0,69 atau 69%.
  • Mayoritas pengguna puas
  • Layanan cenderung positif
  • Layak dianalisis lanjut

Chapter 7

Probability Distributions

Confidence Interval

1️⃣ Confidence Interval

Rentang nilai untuk memperkirakan parameter populasi dengan tingkat kepercayaan tertentu.

CI = Point Estimate ± Margin of Error

2️⃣ Point vs Interval Estimate

Point estimate satu nilai, interval estimate menunjukkan rentang ketidakpastian.

x̄ → point estimate

3️⃣ Margin of Error

Nilai yang menentukan lebar confidence interval.

E = Critical Value × (σ / √n)

4️⃣ Confidence Level

Persentase interval yang mengandung parameter populasi dalam jangka panjang.

Confidence Level = 1 − α

5️⃣ Interpretasi CI

Format interpretasi yang BENAR secara statistik.

“We are 95% confident μ is between LCL and UCL”

6️⃣ CI (σ Diketahui)

Menggunakan distribusi Z (normal).

x̄ ± zα/2 (σ / √n)

7️⃣ CI (σ Tidak Diketahui)

Menggunakan distribusi t dengan df = n − 1.

x̄ ± tα/2, n−1 (s / √n)

8️⃣ Faktor Lebar CI

Confidence ↑ → CI makin lebar, n ↑ → CI makin sempit.

CI ∝ Critical Value / √n

Chapter 9

Statistical Inference

Chapter 10

Nonparametric Methods

Dataset

Table

All About Basic Visualizations

## Column

Pie-Chart

Interpretasi

Hasil visualisasi menunjukkan bahwa GrabFood merupakan platform food delivery yang paling sering digunakan oleh pengguna dibandingkan Gojek dan ShopeeFood . Hal ini menunjukkan adanya kecenderungan preferensi pengguna terhadap GrabFood, meskipun penggunaan ketiga platform masih relatif berimbang.

Bar-Chart

Line-Chart

Interpretasi Line Chart

  • Line chart menunjukkan tren kepuasan rata-rata dari bulan ke bulan untuk tiap platform.

  • Pertanda garis

    • Garis naik = kepuasan meningkat
    • Garis turun = kepuasan menurun

Kesimpulan:

Berdasarkan grafik, berikut periode performa terbaik dan periode yang perlu perbaikan pada tiap platform.

Performa terbaik (nilai tertinggi): 1. Gojek (Apr) 2. GrabFood (Nov) 3. ShopeeFood (Jan)

Perlu perbaikan (nilai terendah): 1. Gojek (Mar) 2. GrabFood (Jun) 3. ShopeeFood (Apr)


Visualisasi Line Chart

Central_Tendency

Tabel Central Tendency (Kepuasan per Platform)

Interpretasi Central Tendency

Central tendency dipakai untuk mencari angka yang paling mewakili data kepuasan pada tiap platform.

Kesimpulan:
  • Secara umum kepuasan semua platform baik karena median = 4.
  • Untuk membedakan performa, kita lihat mean:
    • Mean tertinggi = platform yang rata-rata paling memuaskan: ShopeeFood (3.97).
    • Mean terendah = platform yang perlu evaluasi: GrabFood (3.79).
  • Modus menunjukkan rating yang paling sering dipilih. Pada dataset ini, modus = 4 artinya mayoritas pengguna di tiap platform memberi nilai 4 (puas).

Statistical Dispersion

Keterangan: SD-P = Standar Deviasi Pengeluaran, IQR-P = Interquartile Range Pengeluaran, RP = Range Pengeluaran, SD-W = Standar Deviasi Waktu Tunggu, IQR-W = Interquartile Range Waktu Tunggu.

Waktu Tunggu
Tabel Dispersion
Boxplot Pengeluaran Pengguna
Interpretasi & Kesimpulan

Gojek: Memiliki variasi pengeluaran dan waktu tunggu yang cukup besar. Hal ini menunjukkan bahwa pengalaman pengguna Gojek cenderung kurang konsisten , karena sebagian pengguna bisa mendapatkan layanan cepat dan murah, sementara yang lain mengalami waktu tunggu atau biaya yang lebih tinggi.

GrabFood: Menunjukkan variasi paling tinggi pada pengeluaran dan waktu tunggu. Nilai SD, IQR, dan range yang lebih besar menandakan bahwa pengalaman pengguna sangat beragam , sehingga kualitas layanan yang diterima pengguna bisa sangat berbeda antara satu pesanan dan pesanan lainnya.

ShopeeFood: Memiliki variasi waktu tunggu paling kecil dan sebaran pengeluaran yang relatif lebih sempit. Hal ini menunjukkan bahwa ShopeeFood memberikan layanan yang paling stabil dan konsisten dibandingkan platform lainnya.

Kesimpulan: Analisis dispersion menegaskan bahwa konsistensi layanan menjadi pembeda utama antar platform. Platform dengan variasi lebih kecil memberikan pengalaman pengguna yang lebih dapat diprediksi, meskipun rata-rata pengeluaran atau waktu tunggu terlihat mirip.

Probability Distribution

Kepuasan
Frekuensi Order
Pengeluaran
Interpretasi & Kesimpulan

Distribusi probabilitas menunjukkan bahwa ShopeeFood memiliki tingkat kepuasan tertinggi dengan dominasi rating 4–5, diikuti oleh Gojek , sedangkan GrabFood memiliki proporsi kepuasan rendah yang relatif lebih besar.

Pola ini diperkuat oleh frekuensi order, di mana pengguna ShopeeFood paling banyak berada pada kategori order sering hingga sangat sering (≥ 5 kali), menunjukkan loyalitas pengguna yang lebih tinggi dibandingkan platform lainnya.

Dari sisi pengeluaran, ShopeeFood memiliki median pengeluaran yang lebih rendah sehingga relatif lebih hemat, sementara GrabFood menunjukkan pengeluaran yang lebih tinggi dan lebih bervariasi. Kombinasi faktor kepuasan, frekuensi order, dan pengeluaran ini menjadikan ShopeeFood sebagai platform dengan performa keseluruhan terbaik.

Confidence Interval

Case Study Example

Statistical Inference

Case Study Example

Nonparametric Methods

Case Study Example

---
title: "Kepuasan Tiap Platform Pesan Makanan"
output: 
  flexdashboard::flex_dashboard:
    vertical_layout: fill
    theme: yeti
    source_code: embed
---
```{=html}
<style>

/* ===== STRIP TAB (RAPI & NAIK) ===== */
.section.level2 > .nav-tabs {
  background: linear-gradient(
    90deg,
    #e0d7ff,
    #ffd6ec,
    #d6e9ff
  );
  padding: 6px 10px;          /* 🔥 DIPERKECIL */
  border-radius: 18px;
  border: none;
  box-shadow: 0 8px 20px rgba(160,140,220,.30);
  margin-bottom: 8px;        /* 🔥 JARAK HALUS */
}

/* ===== TAB ITEM ===== */
.section.level2 > .nav-tabs > li > a {
  font-family: 'Quicksand', sans-serif;
  font-weight: 600;
  font-size: 13px;
  color: #4a3f72;
  background: rgba(255,255,255,.6);
  border-radius: 14px;
  margin-right: 6px;
  padding: 6px 14px;         /* 🔥 LEBIH RINGKAS */
  border: none !important;
  transition: all .25s ease;
}

/* ===== TAB AKTIF ===== */
.section.level2 > .nav-tabs > li.active > a,
.section.level2 > .nav-tabs > li.active > a:hover {
  background: linear-gradient(135deg,#cbb6f5,#f7b7ff,#a5c8ff);
  color: white;
  font-weight: 700;
  box-shadow: 0 4px 12px rgba(140,120,220,.35);
}

<style>

/* ===== MATIIN JARAK BAWAAN FLEXDASHBOARD ===== */
.section.level2 {
  margin-top: 0 !important;
  padding-top: 0 !important;
}

/* ISI TAB LANGSUNG NAIK */
.tab-content {
  margin-top: 0 !important;
  padding-top: 8px !important;  /* cukup napas dikit */
}

</style>

</style>

```
```{=html}
<style>

/* ===== BACKGROUND GLOBAL ===== */
body {
  background: linear-gradient(
    180deg,
    #e9ddff 0%,
    #eaf2ff 35%,
    #ffffff 100%
  ) !important;
}

/* AREA ISI TAB */
.main-container,
.container-fluid {
  background: transparent !important;
}

/* SECTION / TAB */
.section,
.section.level2,
.section.level3,
.tab-content {
  background: transparent !important;
}

/* ROW */
.row {
  background: transparent !important;
}

/* ===== CARD / BOX ISI ===== */
.chart-wrapper,
.html-widget,
.plotly,
.datatables,
.shiny-table,
.member-card {
  background: white;
  border-radius: 22px;
  box-shadow: 0 18px 40px rgba(120,100,200,.18);
}

/* ===== JUDUL ===== */
.section.level2 > h2,
.section.level3 > h3 {
  font-family: 'Fredoka', cursive;
  font-size: 22px;
  color: #3d2f6e;
}

/* ===== TEKS ===== */
body, p, li, td {
  font-family: 'Quicksand', sans-serif;
  color: #2e2e2e;
}

</style>
```
```{=html}
<style>
@import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&family=Fredoka:wght@400;500;600&display=swap');

/* ===== GLOBAL ===== */
html, body, * {
  font-family: 'Quicksand', sans-serif;
}

/* ===== JUDUL BESAR ===== */
h1, h2, h3, h4 {
  font-family: 'Fredoka', cursive;
  font-weight: 600;
  letter-spacing: 2px;
}

/* ===== NAMA ORANG ===== */
.member-name {
  font-family: 'Fredoka', cursive;
  font-weight: 600;
  letter-spacing: 1.8px;
}

/* ===== NIM ===== */
.member-nim {
  font-family: 'Quicksand', sans-serif;
  font-weight: 600;
}

/* ===== ISI TUGAS ===== */
.member-task {
  font-family: 'Quicksand', sans-serif;
  font-weight: 500;
}

/* ===== UAS STATISTIK ===== */
.gradient-uas {
  font-family: 'Fredoka', cursive;
  font-weight: 600;
  letter-spacing: 4px;
}

/* ===== CHIP INFO ===== */
.info-title {
  font-family: 'Quicksand', sans-serif;
  font-weight: 500;
}

.info-main {
  font-family: 'Fredoka', cursive;
  font-weight: 500;
}
</style>
```
  
```{r setup, include=FALSE}
packages <- c(
  "flexdashboard",
  "tidyverse",
  "highcharter",
  "viridis",
  "DT",
  "gapminder",
  "jsonlite"
)

installed <- packages %in% rownames(installed.packages())
if (any(!installed)) {
  install.packages(packages[!installed])
}

# Load library
library(flexdashboard)
library(tidyverse)
library(highcharter)
library(viridis)
library(DT)
library(gapminder)
library(jsonlite)
```

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

```{=html}
<style>
/* ===== GRID ===== */
.team-grid{
  display:flex;
  justify-content:center;
  gap:24px;
  flex-wrap:nowrap;     /* 🔥 BIKIN 5 SEJAJAR */
  padding:40px 20px;
}

/* ===== CARD ===== */
.member-card{
  width:210px;
  min-height:420px;
  border-radius:28px;
  padding:26px 16px;
  text-align:center;
  background:linear-gradient(
    180deg,
    #f4ecff 0%,
    #eef4ff 45%,
    #ffffff 85%
  );
  box-shadow:0 18px 35px rgba(0,0,0,.15);
}

/* ===== PHOTO RING ===== */
.avatar-ring{
  width:150px;
  height:150px;
  margin:0 auto 14px;
  border-radius:50%;
  padding:6px;
  background:linear-gradient(
    135deg,
    #cbb6f5,
    #f7b7ff,
    #a5c8ff
  );
  box-shadow:
    0 0 0 6px rgba(255,255,255,.9),
    0 18px 35px rgba(0,0,0,.18);
  display:flex;
  align-items:center;
  justify-content:center;
}

/* ===== PHOTO ===== */
.avatar-ring img{
  width:100%;
  height:100%;
  border-radius:50%;
  object-fit:cover;
  background:white;
}

/* ===== TEXT ===== */
.member-name{
  font-size:14px;
  font-weight:700;
  letter-spacing:1px;
  color:#2e2e4d;
  margin-top:8px;
}

.member-nim{
  font-size:12px;
  color:#555;
  margin-bottom:10px;
}

.member-task{
  font-size:12px;
  line-height:1.5;
  text-align:left;
  background:rgba(255,255,255,.7);
  padding:10px 12px;
  border-radius:14px;
}
</style>

<style>
/* ===== TEAM GRID (SUDAH ADA) ===== */
.team-grid{
  display:flex;
  justify-content:center;
  gap:26px;
  flex-wrap:wrap;
  padding:30px 30px 10px 30px; /* bawah diperkecil */
}

.study-section{
  display:flex;
  justify-content:center;
  gap:18px;
  margin-top:40px;
}

.study-card{
  min-width:260px;
  padding:14px 20px;
  border-radius:18px;
  text-align:center;
  font-size:13px;
  box-shadow:0 10px 25px rgba(0,0,0,.12);
}
.gradient-uas{
  background:linear-gradient(135deg,#ffdde1,#c1c8ff);
  color:#333;
  font-size:17px;
  font-weight:800;
  letter-spacing:1.5px;
  padding:18px 30px;
  box-shadow:0 12px 30px rgba(255,180,200,.45);
}

/* ===== SECTION BAWAH FOTO ===== */
.study-section{
  width:100%;
  margin-top:40px;
  padding-bottom:30px;
}

/* ===== INFO STRIP ===== */
.info-strip{
  display:flex;
  justify-content:center;
  gap:24px;
  flex-wrap:wrap;
}

/* ===== CHIP ===== */
.info-chip{
  padding:14px 28px;
  border-radius:18px;
  font-size:13px;
  font-weight:600;
  box-shadow:0 10px 24px rgba(0,0,0,.12);
  background:white;
}

/* WARNA GEMES */
.chip-study{
  background:linear-gradient(135deg,#ffd6e8,#ffeef6);
}

.chip-univ{
  background:linear-gradient(135deg,#e6ddff,#f3eeff);
}

.chip-dosen{
  background:linear-gradient(135deg,#e6f2ff,#f3f9ff);
}

/* TEKS */
.info-title{
  font-size:11px;
  opacity:.75;
  margin-bottom:4px;
  text-align:center;
}

.info-main{
  text-align:center;
  letter-spacing:.4px;
}
/* KARTU UAS STATISTIK – FINAL */
.gradient-uas{
  min-width:620px;          /* 🔥 LEBIH LEBAR */
  padding:30px 60px;        /* 🔥 LEBIH TEBAL */
  border-radius:26px;
  text-align:center;

  background:linear-gradient(
    135deg,
    #ffe1ef,
    #dfe5ff
  );

  color:#2b2b3a;

  font-size:26px;           /* 🔥 TULISAN GEDE */
  font-weight:900;
  letter-spacing:3px;

  box-shadow:
    0 20px 45px rgba(255,180,210,.45),
    inset 0 0 0 2px rgba(255,255,255,.6);
}

</style>

<div class="team-grid">

<!-- IFFAH -->
<div class="member-card">
  <div class="avatar-ring">
    <img src="aku.jpeg">
  </div>
  <div class="member-name">NURUL IFFAH</div>
  <div class="member-nim">NIM: 52250037</div>
  <div class="member-task">
    1. Summary Data Exploration & Confidence Interval<br>
    2. Visualisasi Line Chart<br>
    3. Central Tendency<br>
    4. Statistical Dispersion<br>
    5. Probability Distributions
  </div>
</div>

<!-- NAISYA -->
<div class="member-card">
  <div class="avatar-ring">
    <img src="naisya.jpeg">
  </div>
  <div class="member-name">NAISYA</div>
  <div class="member-nim">NIM: 52250040</div>
  <div class="member-task">
    1. Summary Basic Visualization & Essential Probability<br>
    2. Visualisasi Pie Chart & Bar Chart<br>
    3. Case Study Confidence Interval
  </div>
</div>

<!-- VANESSA -->
<div class="member-card">
  <div class="avatar-ring">
    <img src="panes.jpeg">
  </div>
  <div class="member-name">VANESSA</div>
  <div class="member-nim">NIM: 52250048</div>
  <div class="member-task">
    1. Summary Intro to Statistics & Statistical Dispersion<br>
    2. Case Study Nonparametric Methods
  </div>
</div>

<!-- CHELSEA -->
<div class="member-card">
  <div class="avatar-ring">
    <img src="celsi.jpeg">
  </div>
  <div class="member-name">CHELSEA</div>
  <div class="member-nim">NIM: 52250041</div>
  <div class="member-task">
    1. Summary Central Tendency & Probability Distributions<br>
    2. Case Study Statistical Inference
  </div>
</div>

<!-- RONI -->
<div class="member-card">
  <div class="avatar-ring">
    <img src="roni.jpeg">
  </div>
  <div class="member-name">RONI</div>
  <div class="member-nim">NIM: 52250020</div>
  <div class="member-task">
    1. Summary Statistical Inference & Nonparametric Methods<br>
    2. Mencari Dataset (Dummy)
  </div>
</div>

<div class="study-section study-bottom">
  <div class="study-card gradient-uas">
    <b>UAS STATISTIK</b>
  </div>
</div>

</div>

<div class="study-section">

  <div class="info-strip">

    <div class="info-chip chip-study">
      <div class="info-title">Program Studi</div>
      <div class="info-main">Sains Data</div>
    </div>

    <div class="info-chip chip-univ">
      <div class="info-title">Universitas</div>
      <div class="info-main">INSTITUT TEKNOLOGI SAINS BANDUNG</div>
    </div>

    <div class="info-chip chip-dosen">
      <div class="info-title">Dosen Pengampu</div>
      <div class="info-main">Bakti Siregar, M.Sc., CSD</div>
    </div>

  </div>

</div>

```

Summary of Basic Statistics {data-orientation=rows}
=======================================================================
  
## Column {.tabset .tabset-fade data-height=520}
-----------------------------------------------------------------------

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

Intro to Statistics

### Data Exploration {data-width=1200}

```{=html}
<style>
.mindmap-wrap {
  width: 100%;
  height: 600px;   /* AMAN, tidak 100vh */
  background: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
}

.mindmap-wrap img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  cursor: zoom-in;
  transition: transform 0.2s ease;
}
</style>

<div class="mindmap-wrap">
  <img
    src="My First Board (1).jpg"
    alt="Data Exploration Mind Map"
    onclick="this.classList.toggle('zoomed')"
    style="transform-origin:center;"
    id="mindmap-img"
  >
</div>

<script>
const img = document.getElementById("mindmap-img");
let zoom = false;

img.addEventListener("click", function () {
  zoom = !zoom;
  img.style.transform = zoom ? "scale(1.8)" : "scale(1)";
  img.style.cursor = zoom ? "zoom-out" : "zoom-in";
});
</script>
```

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

Basic Visualizations

<div style="display:flex; gap:16px; margin-top:10px;">

<div style="border-radius:16px; padding:16px; width:30%;
background:linear-gradient(135deg,#FFE3EC,#FFF1C1);
box-shadow:0 10px 25px rgba(0,0,0,.08);">

<h4><b> Histogram</b></h4>
<ul>
<li>Menampilkan distribusi data numerik</li>
<li>Melihat pola sebaran & skewness</li>
<li>Mengidentifikasi beberapa modus</li>
</ul>
</div>

<div style="border-radius:16px; padding:16px; width:30%;
background:linear-gradient(135deg,#D6F5FF,#D6FFD6);
box-shadow:0 10px 25px rgba(0,0,0,.08);">

<h4> <b>Boxplot</b></h4>
<ul>
<li>Membandingkan distribusi antar kelompok data</li>
<li>Mendeteksi outlier</li>
<li>Melihat sebaran antar kuartil, median & kemiringan data</li>
</ul>
</div>

<div style="border-radius:16px; padding:16px; width:30%;
background:linear-gradient(135deg,#E0C3FC,#8EC5FC);
box-shadow:0 10px 25px rgba(0,0,0,.08);">

<h4> <b>Scatter Plot</b></h4>
<ul>
<li>Menampilkan hubungan dua variabel</li>
<li>Mendeteksi tren/korelasi</li>
<li>Mendeteksi outlier</li>
</ul>
</div>

</div>

<style>
.preview-box {
  display:flex;
  gap:16px;
  margin-top:15px;
}

.preview {
  width:30%;
  padding:14px;
  border-radius:16px;
  background:#ffffff;
  box-shadow:0 10px 25px rgba(0,0,0,.1);
  animation: float 3s ease-in-out infinite;
}

@keyframes float {
  0% { transform: translateY(0); }
  50% { transform: translateY(-6px); }
  100% { transform: translateY(0); }
}

.mini-plot {
  height:60px;
  background:#f7f7f7;
  border-radius:8px;
  display:flex;
  align-items:flex-end;
  gap:5px;
  padding:6px;
}
.bar { width:10px; background:#ff7aa2; border-radius:3px; }
.dot { width:6px; height:6px; background:#6a5acd; border-radius:50%; }
</style>

<div class="preview-box">

<div class="preview">
<h4> <b>Histogram</b></h4>

<div style="
  height:60px;
  display:flex;
  align-items:flex-end;
  padding:6px;
  background:#f7f7f7;
  border-radius:8px;
">

<div style="width:14px;height:20px;background:#ff7aa2;"></div>
<div style="width:14px;height:35px;background:#2ecc71;"></div>
<div style="width:14px;height:55px;background:#ff7aa2;"></div>
<div style="width:14px;height:40px;background:#2ecc71;"></div>
<div style="width:14px;height:25px;background:#ff7aa2;"></div>

</div>

</div>


<div class="preview">
<h4> <b>Boxplot</b></h4>
<div class="mini-plot" style="justify-content:center;">
<div style="width:50px;height:30px;border:2px solid #2ecc71;position:relative;">
<div style="position:absolute;top:-10px;left:50%;width:2px;height:10px;background:#2ecc71;"></div>
<div style="position:absolute;bottom:-10px;left:50%;width:2px;height:10px;background:#2ecc71;"></div>
</div>
</div>
</div>

<div class="preview">
<h4> <b>Scatter Plot</b></h4>
<div class="mini-plot" style="flex-wrap:wrap;align-items:flex-start;">
<div class="dot"></div>
<div class="dot" style="margin-left:12px"></div>
<div class="dot" style="margin-left:24px"></div>
<div class="dot" style="margin-left:8px"></div>
<div class="dot" style="margin-left:12px"></div>
<div class="dot" style="margin-left:24px"></div>
<div class="dot" style="margin-left:8px"></div>
</div>
</div>

</div>



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

Central Tendency

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

Statistical Dispersion 

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

Essentials of Probability

<div style="display:flex; gap:16px; margin-top:10px;">


<div style="
  width:30%;
  padding:14px;
  border-radius:16px;
  background:linear-gradient(135deg,#E3FDFD,#CBF1F5);
  box-shadow:0 10px 25px rgba(0,0,0,.08);
">
<h4> <b>Event</b></h4>
<ul>
<li>Seorang pengguna memiliki tingkat kepuasan tinggi (Kepuasan ≥ 4)</li>
*Event diambil dari dataset yang kami tunjukkan di bab selanjutnya*
</ul>
</div>


<div style="
  width:30%;
  padding:14px;
  border-radius:16px;
  background:linear-gradient(135deg,#FFF6E5,#FFE3B3);
  box-shadow:0 10px 25px rgba(0,0,0,.08);
">
<h4> <b>Peluang</b></h4>
<ul>
Diketahui:
<li>Total observasi (n) = 100</li>
<li>Jumlah pengguna dengan Kepuasan ≥ 4 = 69 pengguna</li>
<li> $$P(A): \frac {69}{100}$$</li>
<li> $$P(Kepuasan ≥ 4): 0.69$$</li>
</ul>
</div>


<div style="
  width:30%;
  padding:14px;
  border-radius:16px;
  background:linear-gradient(135deg,#E0C3FC,#8EC5FC);
  box-shadow:0 10px 25px rgba(0,0,0,.08);
">
<h4> <b>Interpretasi</b></h4>
<ul>
Peluang seorang pengguna food delivery memiliki tingkat kepuasan tinggi adalah 0,69 atau 69%.
<li>Mayoritas pengguna puas</li>
<li>Layanan cenderung positif</li>
<li>Layak dianalisis lanjut</li>
</ul>
</div>

</div>


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

Probability Distributions 

### Confidence Interval {data-width=1200}

```{=html}
<style>
html, body {
  margin: 0;
  padding: 0;
  height: 100%;
  overflow: hidden;
  font-family: "Segoe UI", sans-serif;
  background: #f7f9fc;
}

.ci-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(2, 1fr);
  gap: 16px;
  padding: 18px;
  height: calc(100vh - 160px);
  box-sizing: border-box;
}

.ci-card {
  background: #ffffff;
  border-radius: 18px;
  padding: 16px;
  box-shadow: 0 8px 20px rgba(0,0,0,0.08);
  border-top: 6px solid;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

.ci-card h4 {
  margin: 0 0 6px 0;
  font-size: 15px;
  font-weight: 700;
}

.ci-card p {
  margin: 0;
  font-size: 13px;
  line-height: 1.5;
}

.formula {
  margin-top: 8px;
  padding: 8px;
  background: #f3f6ff;
  border-radius: 10px;
  font-size: 13px;
  font-family: "Courier New", monospace;
  text-align: center;
  font-weight: 600;
}

/* warna gemes */
.c1 { border-color: #ff9aa2; }
.c2 { border-color: #ffb7b2; }
.c3 { border-color: #ffdac1; }
.c4 { border-color: #e2f0cb; }
.c5 { border-color: #b5ead7; }
.c6 { border-color: #c7ceea; }
.c7 { border-color: #d5c6e0; }
.c8 { border-color: #f3c4fb; }
</style>
```


```{=html}
<div class="ci-grid">

  <div class="ci-card c1">
    <h4>1️⃣ Confidence Interval</h4>
    <p>Rentang nilai untuk memperkirakan parameter populasi dengan tingkat kepercayaan tertentu.</p>
    <div class="formula">CI = Point Estimate ± Margin of Error</div>
  </div>

  <div class="ci-card c2">
    <h4>2️⃣ Point vs Interval Estimate</h4>
    <p>Point estimate satu nilai, interval estimate menunjukkan rentang ketidakpastian.</p>
    <div class="formula">x̄ → point estimate</div>
  </div>

  <div class="ci-card c3">
    <h4>3️⃣ Margin of Error</h4>
    <p>Nilai yang menentukan lebar confidence interval.</p>
    <div class="formula">E = Critical Value × (σ / √n)</div>
  </div>

  <div class="ci-card c4">
    <h4>4️⃣ Confidence Level</h4>
    <p>Persentase interval yang mengandung parameter populasi dalam jangka panjang.</p>
    <div class="formula">Confidence Level = 1 − α</div>
  </div>

  <div class="ci-card c5">
    <h4>5️⃣ Interpretasi CI</h4>
    <p>Format interpretasi yang BENAR secara statistik.</p>
    <div class="formula">“We are 95% confident μ is between LCL and UCL”</div>
  </div>

  <div class="ci-card c6">
    <h4>6️⃣ CI (σ Diketahui)</h4>
    <p>Menggunakan distribusi Z (normal).</p>
    <div class="formula">x̄ ± z<sub>α/2</sub> (σ / √n)</div>
  </div>

  <div class="ci-card c7">
    <h4>7️⃣ CI (σ Tidak Diketahui)</h4>
    <p>Menggunakan distribusi t dengan df = n − 1.</p>
    <div class="formula">x̄ ± t<sub>α/2, n−1</sub> (s / √n)</div>
  </div>

  <div class="ci-card c8">
    <h4>8️⃣ Faktor Lebar CI</h4>
    <p>Confidence ↑ → CI makin lebar, n ↑ → CI makin sempit.</p>
    <div class="formula">CI ∝ Critical Value / √n</div>
  </div>

</div>
```

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

Statistical Inference

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

Nonparametric Methods


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

```{r}
library(readr)
library(dplyr)
library(DT)

df <- read_csv(
  "C:/Users/Nurul Iffah/Downloads/UAS/UAS.csv",
  show_col_types = FALSE
)

```
```{r make_best_kep, include=FALSE}
library(dplyr)

mode1 <- function(x){
  x <- x[!is.na(x)]
  if(length(x)==0) return(NA)
  names(sort(table(x), decreasing = TRUE))[1]
}

# Ringkasan kepuasan per platform (buat dipakai global)
ct_kepuasan <- df %>%
  group_by(Platform) %>%
  summarise(
    Jumlah_Data     = n(),
    Mean_Kepuasan   = mean(Kepuasan, na.rm = TRUE),
    Median_Kepuasan = median(Kepuasan, na.rm = TRUE),
    Modus_Kepuasan  = mode1(Kepuasan),
    .groups = "drop"
  ) %>%
  mutate(
    Mean_Kepuasan   = round(Mean_Kepuasan, 2),
    Median_Kepuasan = round(Median_Kepuasan, 2)
  )

# best_kep & worst_kep (median jadi acuan, kalau median sama pakai mean sebagai pembeda)
best_kep <- ct_kepuasan %>%
  arrange(desc(Median_Kepuasan), desc(Mean_Kepuasan)) %>%
  slice(1)

worst_kep <- ct_kepuasan %>%
  arrange(Median_Kepuasan, Mean_Kepuasan) %>%
  slice(1)
```
```{r}
# This is going to be a datatable
df1 <- df %>% 
  arrange(desc(Pengeluaran)) %>% 
  select(
    ID, Gender, Platform, Hari, Bulan,
    Frekuensi_Order, Pengeluaran, Waktu_Tunggu, Kepuasan
  )

datatable(
  df1,
  options = list(scrollX = TRUE),
  caption = htmltools::tags$caption(
    style = 'caption-side: bottom; text-align: center;',
    'Table: ',
    htmltools::em('Food Delivery Users with High Satisfaction')
  )
)

```

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

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

<style>

.tab-content > .tab-pane { 
  height: 100% !important; 
  overflow-y: auto !important; 
}
.tab-content {
  min-height: auto;
  overflow-y: auto;
}

/* LAYOUT 2 KARTU NYAMPING */
.two-cards{
  display:flex;
  gap:16px;
  height:100%;
  align-items:stretch;
}
.two-cards .left{ flex:0 0 68%; min-width:0; }
.two-cards .right{ flex:1; min-width:0; }

/* STYLE KARTU */
.cardbox{
  height:100%;
  border-radius:18px;
  box-shadow:0 12px 24px rgba(0,0,0,.10);
  overflow:hidden;
  padding:12px;
  background:#fff;
}
.cardbox.soft{
  background:#fde7dd;
  font-size:13px;
  line-height:1.25;
}

/* RAPihin tabel DT biar muat */
table.dataTable thead th, table.dataTable tbody td{
  padding:6px 8px !important;
  font-size:12px !important;
}
.dataTables_wrapper{ width:100% !important; }
</style>

```{=html}
<style>
/* ====== KARTU INTERPRETASI (WARNA) ====== */
.card-soft .chart-wrapper{
  border-radius:18px; overflow:hidden;
  box-shadow:0 12px 24px rgba(0,0,0,.10);
}
.card-soft .chart-title,
.card-soft .chart-stage{
  background:#fde7dd;
  padding:16px 18px !important;
}
.card-soft{font-size:13px; line-height:1.25;}
.card-soft ul{margin:0 0 0 18px;}
.card-soft li{margin:4px 0;}

/* ====== KARTU VISUALISASI (PUTIH) ====== */
.card-plain .chart-wrapper{
  border-radius:18px; overflow:hidden;
  box-shadow:0 12px 24px rgba(0,0,0,.10);
}
.card-plain .chart-title,
.card-plain .chart-stage{
  background:#ffffff;
  padding:10px 12px !important;
}
</style>
```


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

<style>
.vis-layout {
  display: flex;
  gap: 24px;
  align-items: flex-start; 
  margin-top: 20px;
}

.vis-left {
  width: 60%;
}

.vis-right {
  width: 40%;
  padding: 16px;
  border-radius: 18px;
  background: linear-gradient(135deg, #FFE259, #FFA751);
  box-shadow: 0 10px 25px rgba(0,0,0,.12);
}


.plotly.html-widget {
  margin: 0 !important;
}
</style>

```{r} 

library(plotly)
library(dplyr)
library(readr)
library(htmltools)

df <- read_csv(
  "C:/Users/Nurul Iffah/Downloads/UAS/UAS.csv",
  show_col_types = FALSE
)

platform_count <- df %>% count(Platform)

pie_plot <- plot_ly(
  platform_count,
  labels = ~Platform,
  values = ~n,
  type = "pie",
  textinfo = "label+percent",
  hoverinfo = "label+value+percent",
  marker = list(
    colors = c("#FF005D", "#00F5D4", "#FFD60A"),
    line = list(color = "white", width = 2)
  )
) %>%
  layout(
    showlegend = FALSE,
    title = list(
      text = "Platform Food Delivery Paling Sering Digunakan",
      x = 0
    )
  )

div(
  class = "vis-layout",
  
  div(class = "vis-left", pie_plot),
  
div(
  class = "vis-right",
  h4 (strong("Interpretasi")),
  p(
    "Hasil visualisasi menunjukkan bahwa ",
    strong("GrabFood"),
    " merupakan platform food delivery yang paling sering digunakan oleh pengguna dibandingkan ",
    strong("Gojek"),
    " dan ",
    strong("ShopeeFood"),
    ". Hal ini menunjukkan adanya kecenderungan preferensi pengguna terhadap GrabFood, meskipun penggunaan ketiga platform masih relatif berimbang."
  )
 )
)

```

### Bar-Chart {data-width=600 data-height=510}
  
```{r}
bar_df <- df %>%
dplyr::group_by(Platform) %>%
dplyr::summarise(rata_kepuasan = mean(Kepuasan, na.rm = TRUE), .groups="drop")

highcharter::hchart(
bar_df, "column",
highcharter::hcaes(x = Platform, y = rata_kepuasan)
) %>%
highcharter::hc_title(text = "Rata-rata Kepuasan per Platform") %>%
highcharter::hc_chart(height = NULL) %>%
highcharter::hc_yAxis(title = list(text = "Kepuasan (1–5)"), min = 0, max = 5)

```

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

```{r line_prep, include=FALSE}
# urutan bulan biar nggak ngacak
bulan_levels <- c("Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des")

# bikin df_line dulu (dipakai untuk interpretasi + grafik)
df_line <- df %>%
  dplyr::mutate(
    Bulan = trimws(as.character(Bulan)),
    Bulan = factor(Bulan, levels = bulan_levels, ordered = TRUE)
  ) %>%
  dplyr::group_by(Bulan, Platform) %>%
  dplyr::summarise(rata_kepuasan = mean(Kepuasan, na.rm = TRUE), .groups = "drop") %>%
  dplyr::arrange(Bulan, Platform)
```

#### Interpretasi Line Chart {.card-soft data-height=180}

```{r echo=FALSE, results='asis'}
best <- df_line %>%
  dplyr::filter(!is.na(rata_kepuasan)) %>%
  dplyr::group_by(Platform) %>%
  dplyr::slice_max(rata_kepuasan, n = 1, with_ties = FALSE) %>%
  dplyr::ungroup()

worst <- df_line %>%
  dplyr::filter(!is.na(rata_kepuasan)) %>%
  dplyr::group_by(Platform) %>%
  dplyr::slice_min(rata_kepuasan, n = 1, with_ties = FALSE) %>%
  dplyr::ungroup()

cat("- Line chart menunjukkan **tren kepuasan rata-rata** dari bulan ke bulan untuk tiap platform.\n\n")
cat("- Pertanda garis\n")
cat("  - Garis **naik** = **kepuasan meningkat**\n")
cat("  - Garis **turun** = **kepuasan menurun**\n")

# ✅ paksa jarak (biar gak mepet)
cat("\n\n\n\n")

cat("**Kesimpulan:**\n\n")
cat("Berdasarkan grafik, berikut periode **performa terbaik** dan periode yang **perlu perbaikan** pada tiap platform.\n")

cat("\n\n\n\n")

cat("**Performa terbaik (nilai tertinggi):**\n")
for(i in seq_len(nrow(best))){
  cat(sprintf("%d. **%s** (%s)\n", i, best$Platform[i], as.character(best$Bulan[i])))
}

cat("\n\n\n\n")

cat("**Perlu perbaikan (nilai terendah):**\n")
for(i in seq_len(nrow(worst))){
  cat(sprintf("%d. **%s** (%s)\n", i, worst$Platform[i], as.character(worst$Bulan[i])))
}
```

---

#### Visualisasi Line Chart {.card-plain data-height=370}

```{r}
# 1) Urutan bulan (Indonesia)
bulan_levels <- c("Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des")

# 2) Pastikan Bulan jadi factor berurutan (biar gak ngacak)
df_line <- df %>%
  dplyr::mutate(
    Bulan = factor(Bulan, levels = bulan_levels, ordered = TRUE)
  ) %>%
  dplyr::group_by(Bulan, Platform) %>%
  dplyr::summarise(rata_kepuasan = mean(Kepuasan, na.rm = TRUE), .groups = "drop") %>%
  tidyr::complete(Bulan, Platform) %>%  # biar bulan yang kosong tetap kebentuk
  dplyr::arrange(Bulan, Platform)

# 3) Line chart: tiap Platform jadi 1 garis + tooltip jelas (Mar (GrabFood))
highcharter::hchart(
  df_line, "line",
  highcharter::hcaes(x = Bulan, y = rata_kepuasan, group = Platform)
) %>%
  highcharter::hc_title(text = "Tren Kepuasan per Bulan (per Platform)") %>%
  highcharter::hc_chart(
    height = NULL,
    spacingTop = 10,
    spacingBottom = 10,
    marginBottom = 40
  ) %>%
  highcharter::hc_yAxis(title = list(text = "Kepuasan (1–5)"), min = 0, max = 5) %>%
  highcharter::hc_xAxis(title = list(text = "Bulan")) %>%
  highcharter::hc_legend(
    layout = "horizontal",
    align = "center",
    verticalAlign = "top",
    y = 0
  ) %>%
  highcharter::hc_tooltip(
    shared = FALSE,
    pointFormat = "<b>{point.category} ({series.name})</b><br/>Kepuasan: <b>{point.y:.2f}</b>"
  )


```

### Central_Tendency

```{r echo=FALSE}
library(dplyr)
library(DT)
library(htmltools)

mode1 <- function(x){
  x <- x[!is.na(x)]
  if(length(x)==0) return(NA)
  names(sort(table(x), decreasing = TRUE))[1]
}

# ===== Ringkasan Central Tendency =====
ct_kepuasan <- df %>%
  group_by(Platform) %>%
  summarise(
    Jumlah_Data     = n(),
    Mean_Kepuasan   = mean(Kepuasan, na.rm = TRUE),
    Median_Kepuasan = median(Kepuasan, na.rm = TRUE),
    Modus_Kepuasan  = mode1(Kepuasan),
    .groups = "drop"
  ) %>%
  mutate(
    Mean_Kepuasan   = round(Mean_Kepuasan, 2),
    Median_Kepuasan = round(Median_Kepuasan, 2)
  )

# Median (umum)
best_median <- max(ct_kepuasan$Median_Kepuasan, na.rm = TRUE)

# Mean pembeda
best_mean  <- ct_kepuasan %>% slice_max(Mean_Kepuasan, n = 1, with_ties = FALSE)
worst_mean <- ct_kepuasan %>% slice_min(Mean_Kepuasan, n = 1, with_ties = FALSE)

# Modus global kepuasan
modus_global <- mode1(df$Kepuasan)

# Tabel tampil
ct_show <- ct_kepuasan
colnames(ct_show) <- c("Platform","Jumlah Data","Mean Kepuasan","Median Kepuasan","Modus Kepuasan")

tbl <- DT::datatable(
  ct_show,
  class = "compact stripe",
  options = list(
    dom = "t",
    paging = FALSE,
    ordering = FALSE,
    searching = FALSE,
    info = FALSE,
    autoWidth = TRUE
  ),
  rownames = FALSE
) %>%
  DT::formatRound(columns = c("Mean Kepuasan","Median Kepuasan"), digits = 2) %>%
  DT::formatStyle(
    columns = names(ct_show),
    `border-top` = "none",
    `border-bottom` = "none"
  ) %>%
  DT::formatStyle(
    columns = c("Jumlah Data","Mean Kepuasan","Median Kepuasan","Modus Kepuasan"),
    `text-align` = "center"
  ) %>%
  DT::formatStyle(
    columns = "Platform",
    `text-align` = "left",
    `font-weight` = "600"
  )

# CSS 2 kartu (muat frame putih)
css <- "
.ct-wrap{display:flex; gap:16px; min-height:auto; align-items:stretch;}
.ct-card{border-radius:18px; box-shadow:0 12px 24px rgba(0,0,0,.10); overflow:hidden; padding:14px;}
.ct-left{flex:0 0 58%; background:#fff; min-width:0;}
.ct-right{flex:1; background:#fde7dd; min-width:0; font-size:13px; line-height:1.35;}

.ct-right h4{margin:0 0 10px 0; font-size:15px;}
.ct-right p{margin:0 0 10px 0;}
.ct-right b{display:inline-block; margin:4px 0 6px 0;}  /* jarak setelah 'Kesimpulan:' */

.ct-right ul{margin:6px 0 0 18px; padding-left:12px;}
.ct-right li{margin:8px 0;}              /* jarak bullet */
.ct-right ul ul{margin-top:6px;}
.ct-right ul ul li{margin:6px 0;}        /* jarak sub-bullet */

table.dataTable{
  width:100% !important;
}
table.dataTable thead th{
  border-bottom: 1px solid rgba(0,0,0,.15) !important;
  padding:8px 10px !important;
  font-size:12px !important;
}
table.dataTable tbody td{
  padding:8px 10px !important;
  font-size:12px !important;
  vertical-align: middle !important;
}
"

tagList(
  tags$style(HTML(css)),
  tags$div(class="ct-wrap",

    # Kartu kiri: tabel
    tags$div(class="ct-card ct-left",
      tags$h4("Tabel Central Tendency (Kepuasan per Platform)"),
      tbl
    ),

    # Kartu kanan: interpretasi sesuai yang kamu minta
    tags$div(class="ct-card ct-right",
      tags$h4("Interpretasi Central Tendency"),
      tags$p(HTML("Central tendency dipakai untuk mencari <b>angka yang paling mewakili</b> data kepuasan pada tiap platform.")),
      tags$b("Kesimpulan:"),
      tags$ul(
        tags$li(HTML(paste0("Secara umum kepuasan semua platform baik karena median = <b>", best_median, "</b>."))),
        tags$li(
          HTML("Untuk membedakan performa, kita lihat mean:"),
          tags$ul(
            tags$li(HTML(paste0("Mean tertinggi = platform yang rata-rata paling memuaskan: <b>",
                                best_mean$Platform[1], "</b> (", round(best_mean$Mean_Kepuasan[1],2), ")."))),
            tags$li(HTML(paste0("Mean terendah = platform yang perlu evaluasi: <b>",
                                worst_mean$Platform[1], "</b> (", round(worst_mean$Mean_Kepuasan[1],2), ").")))
          )
        ),
        tags$li(HTML(paste0("Modus menunjukkan rating yang paling sering dipilih. Pada dataset ini, modus = <b>",
                            modus_global, "</b> artinya mayoritas pengguna di tiap platform memberi nilai ",
                            modus_global, " (puas).")))
      )
    )
  )
)
```
---


### Statistical Dispersion
```{r statical, echo=FALSE, message=FALSE, warning=FALSE}
library(dplyr)
library(highcharter)
library(DT)
library(htmltools)

box_data <- function(x){
  x <- x[!is.na(x)]
  as.numeric(quantile(x, probs = c(0, 0.25, 0.5, 0.75, 1)))
}

# pastikan df sudah ada
# df <- read_csv("UAS.csv")

# ===== DISPERSION TABLE (Pengeluaran & Waktu Tunggu) =====
disp_tbl <- df %>%
  group_by(Platform) %>%
  summarise(
    SD_Pengeluaran   = round(sd(Pengeluaran, na.rm = TRUE), 2),
    IQR_Pengeluaran  = round(IQR(Pengeluaran, na.rm = TRUE), 2),
    Range_Pengeluaran= max(Pengeluaran, na.rm = TRUE) - min(Pengeluaran, na.rm = TRUE),

    SD_WaktuTunggu   = round(sd(Waktu_Tunggu, na.rm = TRUE), 2),
    IQR_WaktuTunggu  = round(IQR(Waktu_Tunggu, na.rm = TRUE), 2),
    Range_WaktuTunggu= max(Waktu_Tunggu, na.rm = TRUE) - min(Waktu_Tunggu, na.rm = TRUE),
    .groups = "drop"
  )

# ===== Boxplot Waktu Tunggu =====
library(highcharter)
library(dplyr)

df_wait <- df %>%
  filter(!is.na(Platform), !is.na(Waktu_Tunggu)) %>%
  mutate(
    Platform = as.character(Platform),
    Waktu_Tunggu = as.numeric(Waktu_Tunggu)
  )

chart_wait <- highchart() %>%
  hc_chart(type = "boxplot", height = 240) %>%
  hc_title(text = "Boxplot Waktu Tunggu per Platform") %>%
  hc_xAxis(categories = c("Gojek", "GrabFood", "ShopeeFood")) %>%
  hc_yAxis(title = list(text = "Waktu Tunggu (menit)")) %>%

  hc_add_series(
    name = "Gojek",
    data = list(box_data(df_wait$Waktu_Tunggu[df_wait$Platform == "Gojek"])),
    color = "#00B4D8"
  ) %>%
  hc_add_series(
    name = "GrabFood",
    data = list(box_data(df_wait$Waktu_Tunggu[df_wait$Platform == "GrabFood"])),
    color = "#FF6B6B"
  ) %>%
  hc_add_series(
    name = "ShopeeFood",
    data = list(box_data(df_wait$Waktu_Tunggu[df_wait$Platform == "ShopeeFood"])),
    color = "#6BCF63"
  )

# ===== Tabel Statistical Dispersion =====

disp_tbl <- df %>%
  group_by(Platform) %>%
  summarise(
    `SD-P`  = round(sd(Pengeluaran, na.rm = TRUE), 2),
    `IQR-P` = round(IQR(Pengeluaran, na.rm = TRUE), 2),
    `RP`    = max(Pengeluaran, na.rm = TRUE) - min(Pengeluaran, na.rm = TRUE),

    `SD-W`  = round(sd(Waktu_Tunggu, na.rm = TRUE), 2),
    `IQR-W` = round(IQR(Waktu_Tunggu, na.rm = TRUE), 2),
    .groups = "drop"
  )

tbl_disp <- DT::datatable(
  disp_tbl,
  class = "compact stripe",
  options = list(
    dom = "t",
    paging = FALSE,
    ordering = FALSE,
    searching = FALSE,
    info = FALSE
  ),
  rownames = FALSE
)

tags$p(
  style="font-size:10.5px; margin-top:6px;",
  HTML("<b>Keterangan:</b> SD-P = Standar Deviasi Pengeluaran, 
       IQR-P = Interquartile Range Pengeluaran, 
       RP = Range Pengeluaran, 
       SD-W = Standar Deviasi Waktu Tunggu, 
       IQR-W = Interquartile Range Waktu Tunggu.")
)

# ===== Boxplot Pengeluaran Pengguna Tiap Platform =====

library(highcharter)
library(dplyr)

df_spend_pf <- df %>%
  filter(!is.na(Platform), !is.na(Pengeluaran)) %>%
  mutate(
    Platform = as.character(Platform),
    Spend = as.numeric(Pengeluaran)
  )

chart_sp <- hcboxplot(
  x   = df_spend_pf$Spend,
  var = df_spend_pf$Platform
) %>%
  hc_title(text = "Boxplot Pengeluaran per Platform") %>%
  hc_xAxis(title = list(text = "Platform")) %>%
  hc_yAxis(title = list(text = "Pengeluaran")) %>%
  hc_plotOptions(
    boxplot = list(
      colorByPoint = TRUE   # 🔥 INI KUNCINYA
    )
  ) %>%
  hc_colors(c(
    "#00B4D8",  # Gojek
    "#FF6B6B",  # GrabFood
    "#6BCF63"   # ShopeeFood
  )) %>%
  hc_chart(height = 240)



css_panel <- "
.vis-grid{
  display:grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr;
  height:calc(100vh - 300px);
  width:100%;
  border:1px solid #dcdcdc;
  overflow:hidden;
}
.vis-panel{
  background:#ffffff;
  border-right:1px solid #dcdcdc;
  border-bottom:1px solid #dcdcdc;
  display:flex;
  flex-direction:column;
  overflow:hidden;
}
.vis-panel:nth-child(2),
.vis-panel:nth-child(4){border-right:none;}
.vis-panel:nth-child(3),
.vis-panel:nth-child(4){border-bottom:none;}
.vis-head{
  background:#f2f2f2;
  padding:6px 8px;
  font-weight:600;
  font-size:12px;
}
.vis-body{
  flex:1;
  padding:6px;
  overflow:hidden;
  font-size:13px !important;
  line-height:1.3;
}

/* MATIKAN SCROLL TAB FLEXDASHBOARD */
.tab-content > .tab-pane {
  height: 100% !important;
  overflow-y: hidden !important;
}

.tab-content {
  height: 100% !important;
  overflow-y: hidden !important;
}

/* JAGA BIAR GRID TETAP 1 LAYAR */
.vis-grid {
  height: calc(100vh - 300px) !important;
  overflow: hidden !important;
}

/* === MATIKAN SEMUA SCROLL FLEXDASHBOARD === */
html, body {
  height: 100% !important;
  overflow: hidden !important;
}

.section.level2,
.section.level3,
.tab-content,
.tab-pane {
  height: 100% !important;
  overflow: hidden !important;
}

/* === GRID UTAMA === */
.vis-grid {
  height: calc(100vh - 300px) !important;
  overflow: hidden !important;
}

/* === PANEL === */
.vis-panel,
.vis-body {
  overflow: hidden !important;
}

/* === MATIKAN SCROLL DATATABLE === */
.dataTables_wrapper,
.dataTables_scroll,
.dataTables_scrollBody {
  overflow: hidden !important;
}

/* === PAKSA CHART TUNDUK === */
.highchart-container {
  height: 100% !important;
  max-height: 100% !important;
}
"


tags$style(HTML(css_panel))

div(
  class="vis-grid",

  # Kartu 1
  div(class="vis-panel",
      div(class="vis-head","Waktu Tunggu"),
      div(class="vis-body", chart_wait)
  ),

  # Kartu 2
  div(class="vis-panel",
      div(class="vis-head","Tabel Dispersion"),
      div(class="vis-body", tbl_disp)
  ),

  # Kartu 3
  div(class="vis-panel",
      div(class="vis-head","Boxplot Pengeluaran Pengguna"),
      div(class="vis-body", chart_sp)
  ),

  # Kartu 4
  div(class="vis-panel",
      div(class="vis-head","Interpretasi & Kesimpulan"),
      div(class="vis-body",
        p(
  strong("Gojek: "),
  "Memiliki variasi pengeluaran dan waktu tunggu yang cukup besar. ",
  "Hal ini menunjukkan bahwa pengalaman pengguna Gojek cenderung ",
  strong("kurang konsisten"),
  ", karena sebagian pengguna bisa mendapatkan layanan cepat dan murah, ",
  "sementara yang lain mengalami waktu tunggu atau biaya yang lebih tinggi."
),
p(
  strong("GrabFood: "),
  "Menunjukkan variasi paling tinggi pada pengeluaran dan waktu tunggu. ",
  "Nilai SD, IQR, dan range yang lebih besar menandakan bahwa ",
  strong("pengalaman pengguna sangat beragam"),
  ", sehingga kualitas layanan yang diterima pengguna bisa sangat berbeda antara satu pesanan dan pesanan lainnya."
),
p(
  strong("ShopeeFood: "),
  "Memiliki variasi waktu tunggu paling kecil dan sebaran pengeluaran yang relatif lebih sempit. ",
  "Hal ini menunjukkan bahwa ShopeeFood memberikan ",
  strong("layanan yang paling stabil dan konsisten"),
  " dibandingkan platform lainnya."
),
p(
  strong("Kesimpulan: "),
  "Analisis dispersion menegaskan bahwa ",
  strong("konsistensi layanan"),
  " menjadi pembeda utama antar platform. ",
  "Platform dengan variasi lebih kecil memberikan pengalaman pengguna yang lebih dapat diprediksi, ",
  "meskipun rata-rata pengeluaran atau waktu tunggu terlihat mirip."
)

      )
  )
)

```

### Probability Distribution

```{r probability-dist, echo=FALSE, message=FALSE, warning=FALSE}

library(dplyr)
library(tidyr)
library(highcharter)
library(readr)

df <- read_csv(
  "C:/Users/Nurul Iffah/Downloads/UAS/UAS.csv",
  show_col_types = FALSE
)

# ================= KEPUASAN =================
pmf <- df %>%
  filter(!is.na(Platform), !is.na(Kepuasan)) %>%
  mutate(
    Platform = as.character(Platform),
    Kepuasan = as.numeric(Kepuasan)
  ) %>%
  group_by(Platform, Kepuasan) %>%
  summarise(n = n(), .groups = "drop") %>%
  complete(Platform, Kepuasan = 1:5, fill = list(n = 0)) %>%
  group_by(Platform) %>%
  mutate(ProbPct = n / sum(n) * 100) %>%
  ungroup()

chart_kep <- hchart(
  pmf, "line",
  hcaes(x = Kepuasan, y = ProbPct, group = Platform)
) %>%
  hc_yAxis(labels = list(format = "{value}%")) %>%
  hc_title(text = "Probabilitas Kepuasan per Platform Menurut Pengguna")

# ================= FREKUENSI ORDER =================
df_freq_pf <- df %>%
  filter(!is.na(Platform), !is.na(Frekuensi_Order)) %>%
  mutate(
    Platform = as.character(Platform),
    Freq = as.numeric(Frekuensi_Order),
    FreqCat = ifelse(Freq >= 10, "10+", as.character(Freq))
  ) %>%
  group_by(Platform, FreqCat) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(Platform) %>%
  mutate(ProbPct = n / sum(n) * 100) %>%
  ungroup()

chart_freq <- hchart(
  df_freq_pf,
  "column",
  hcaes(x = FreqCat, y = ProbPct, group = Platform)
) %>%
  hc_title(text = "Pola Frekuensi Order Pengguna per Platform") %>%
  hc_plotOptions(
    column = list(stacking = "normal")
  ) %>%
  hc_xAxis(
    title = list(text = "Frekuensi Order (kali)")
  ) %>%
  hc_yAxis(
    title = list(text = "Probabilitas (%)"),
    labels = list(format = "{value}%")
  ) %>%
  hc_tooltip(
    pointFormat = "Probabilitas: <b>{point.y:.1f}%</b>"
  )

# ================= PENGELUARAN (BOXPLOT PER PLATFORM + WARNA) =================
library(highcharter)
library(dplyr)

df_spend_pf <- df %>%
  filter(!is.na(Platform), !is.na(Pengeluaran)) %>%
  mutate(
    Platform = as.character(Platform),
    Spend = as.numeric(Pengeluaran)
  )

hc <- highchart() %>%
  hc_chart(type = "boxplot", height = 240) %>%
  hc_title(text = "Boxplot Pengeluaran Pengguna per Platform") %>%
  hc_xAxis(categories = c("Gojek", "GrabFood", "ShopeeFood")) %>%
  hc_yAxis(title = list(text = "Pengeluaran"))

# ===== TAMBAH SERIES SATU-SATU (INI KUNCINYA) =====
hc <- hc %>%
  hc_add_series(
    name = "Gojek",
    data = list(boxplot.stats(
      df_spend_pf$Spend[df_spend_pf$Platform == "Gojek"]
    )$stats),
    color = "#00B4D8"
  ) %>%
  hc_add_series(
    name = "GrabFood",
    data = list(boxplot.stats(
      df_spend_pf$Spend[df_spend_pf$Platform == "GrabFood"]
    )$stats),
    color = "#FF6B6B"
  ) %>%
  hc_add_series(
    name = "ShopeeFood",
    data = list(boxplot.stats(
      df_spend_pf$Spend[df_spend_pf$Platform == "ShopeeFood"]
    )$stats),
    color = "#6BCF63"
  )

chart_sp <- hc

```


```{r dashboard, echo=FALSE, results='asis'}

library(htmltools)

css_panel <- "
.vis-grid{
  display:grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr;
  height:calc(100vh - 160px);   /* ⬅️ INI KUNCINYA */
  width:100%;
  border:1px solid #dcdcdc;
  overflow:hidden;
}

.vis-panel{
  background:#ffffff;
  border-right:1px solid #dcdcdc;
  border-bottom:1px solid #dcdcdc;
  display:flex;
  flex-direction:column;
  overflow:hidden;
}

.vis-panel:nth-child(2),
.vis-panel:nth-child(4){border-right:none;}

.vis-panel:nth-child(3),
.vis-panel:nth-child(4){border-bottom:none;}

.vis-head{
  background:#f2f2f2;
  padding:6px 8px;
  font-weight:600;
  font-size:12px;
  flex:0 0 auto;
}

.vis-body{
  flex:1;
  padding:6px;
  overflow:hidden;
  font-size:15px;
  line-height:1.35;
}
"


tags$style(HTML(css_panel))

div(
  class="vis-grid",

  div(class="vis-panel",
      div(class="vis-head","Kepuasan"),
      div(class="vis-body", chart_kep)
  ),

  div(class="vis-panel",
      div(class="vis-head","Frekuensi Order"),
      div(class="vis-body", chart_freq)
  ),

  div(class="vis-panel",
      div(class="vis-head","Pengeluaran"),
      div(class="vis-body", chart_sp)
  ),

  div(class="vis-panel",
      div(class="vis-head","Interpretasi & Kesimpulan"),
      div(class="vis-body",
          p( "Distribusi probabilitas menunjukkan bahwa ",
          strong("ShopeeFood"),
          " memiliki tingkat kepuasan tertinggi dengan dominasi rating 4–5, diikuti oleh ",
          strong("Gojek"),
          ", sedangkan ",
          strong("GrabFood"),
          " memiliki proporsi kepuasan rendah yang relatif lebih besar."),
          p("Pola ini diperkuat oleh frekuensi order, di mana pengguna ",
          strong("ShopeeFood"),
          " paling banyak berada pada kategori order sering hingga sangat sering (≥ 5 kali), ",
          "menunjukkan loyalitas pengguna yang lebih tinggi dibandingkan platform lainnya."
        ),
          p("Dari sisi pengeluaran, ",
          strong("ShopeeFood"),
          " memiliki median pengeluaran yang lebih rendah sehingga relatif lebih hemat, ",
          "sementara ",
          strong("GrabFood"),
          " menunjukkan pengeluaran yang lebih tinggi dan lebih bervariasi. ",
          "Kombinasi faktor kepuasan, frekuensi order, dan pengeluaran ini menjadikan ",
          strong("ShopeeFood"),
          " sebagai platform dengan performa keseluruhan terbaik."),
      )
  )
)

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

Case Study Example


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

Case Study Example


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

Case Study Example