Dengan statistika, informasi kompleks dapat disederhanakan sehingga lebih mudah dipahami dan digunakan dalam pengambilan keputusan.
Pemahaman jenis data sangat penting karena menentukan metode analisis statistik yang dapat digunakan.
Statistika banyak digunakan dalam bidang pendidikan, ekonomi, kesehatan, industri, dan penelitian ilmiah.
Central tendency atau ukuran pemusatan data adalah konsep dasar dalam statistika deskriptif yang digunakan untuk menggambarkan nilai yang paling mewakili suatu kumpulan data.
Ukuran ini membantu menyederhanakan data kompleks menjadi satu nilai representatif, yaitu mean, median, dan modus.
Median adalah nilai tengah dari data yang telah diurutkan.
Modus adalah nilai yang paling sering muncul dalam data.
Mean merupakan rata-rata dari seluruh data.
Semakin besar nilai dispersi, semakin besar variasi data dalam suatu kumpulan observasi.
Setiap ukuran dispersi memberikan informasi yang berbeda tentang penyebaran data.
Analisis dispersi penting untuk menilai kestabilan dan keandalan suatu data.
Probabilitas adalah cara sederhana untuk memahami ketidakpastian, yaitu dengan menghitung seberapa besar kemungkinan suatu kejadian terjadi. Dengan probabilitas, kita bisa melihat pola dalam data dan membuat keputusan yang lebih masuk akal berdasarkan data, bukan sekadar tebakan.
Konsep Fundamental:
• Sample space & events
•
Complement rule: P(A’) = 1 - P(A)
• 0 ≤ P(A) ≤ 1
Independent vs Dependent:
• Independent: kejadian tidak
saling mempengaruhi
• Dependent: kejadian saling mempengaruhi
Union & Binomial:
• Union: probabilitas minimal satu
kejadian terjadi
• Binomial: eksperimen dengan 2 hasil
(sukses/gagal)
Definisi Event
Event diambil dari variabel Kepuasan pada dataset food delivery yang ditampilkan pada chapter selanjutnya.
Peluang pengguna memiliki kepuasan tinggi menggunakan food delivery adalah 0.69 atau 69%.
Probability Distribution menjelaskan bagaimana peluang dari setiap kemungkinan nilai suatu variabel acak tersebar. Konsep ini membantu memahami ketidakpastian, memodelkan data acak, serta menjadi dasar analisis statistik inferensial seperti uji hipotesis dan interval kepercayaan.
Variabel diskrit adalah variabel acak yang hanya dapat mengambil nilai tertentu yang dapat dihitung. Setiap nilai memiliki peluang tersendiri yang dijelaskan menggunakan Probability Mass Function (PMF).
Variabel kontinu adalah variabel acak yang dapat mengambil nilai apa pun dalam suatu rentang. Probabilitasnya tidak dihitung pada satu titik, melainkan pada suatu interval menggunakan PDF.
Perbedaan variabel diskrit dan kontinu juga terlihat dari cara visualisasinya. Visualisasi membantu memahami pola dan sebaran data.
Central Limit Theorem (CLT) menyatakan bahwa distribusi sampling dari rata-rata akan mendekati distribusi normal ketika ukuran sampel cukup besar.
Rentang nilai untuk memperkirakan parameter populasi dengan tingkat kepercayaan tertentu.
Point estimate satu nilai, interval estimate menunjukkan rentang ketidakpastian.
Nilai yang menentukan lebar confidence interval.
Persentase interval yang mengandung parameter populasi dalam jangka panjang.
Format interpretasi yang BENAR secara statistik.
Menggunakan distribusi Z (normal).
Menggunakan distribusi t dengan df = n − 1.
Confidence ↑ → CI makin lebar, n ↑ → CI makin sempit.
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.
Perbedaan rata-rata waktu tunggu antar platform menunjukkan adanya variasi kecepatan layanan. Platform dengan waktu tunggu lebih singkat berpotensi memberikan pengalaman pengguna yang lebih baik. Namun, meskipun GrabFood memiliki rata-rata waktu tunggu paling lama, platform ini tetap paling sering digunakan. Hal ini menunjukkan bahwa waktu tunggu bukan satu-satunya faktor dalam pemilihan platform food delivery, dan preferensi pengguna kemungkinan dipengaruhi oleh faktor lain di luar kecepatan layanan.
Grafik menunjukkan tren perubahan kepuasan pengguna dari bulan ke bulan pada tiap platform.
Makna garis:
Performa terbaik:
Perlu perbaikan:
Central tendency dipakai untuk mencari angka yang paling mewakili data kepuasan pada tiap platform.
Kesimpulan: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.
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.
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.
Case Study Example
Case Study Example
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 */
.nav-tabs {
background: linear-gradient(90deg, #f3e8ff, #fde7f3, #e8f1ff);
padding: 6px;
border-radius: 10px;
border: none;
}
/* TAB */
.nav-tabs > li > a {
background: rgba(255,255,255,.85);
color: #4a3f72;
border-radius: 4px; /* ⬅️ KOTAK */
padding: 6px 10px;
font-size: 12px;
font-weight: 600;
border: none;
}
/* HOVER */
.nav-tabs > li > a:hover {
background: #e9ddff;
color: #2f2458;
}
/* AKTIF */
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:focus {
background: #cbb6f5;
color: #2a1e4f;
font-weight: 700;
}
</style>
```
```{=html}
<style>
.navbar {
background: linear-gradient(
90deg,
#cbb6f5,
#f7b7ff,
#a5c8ff
) !important;
border: none !important;
}
/* Judul dashboard */
.navbar-brand {
color: #2f245a !important;
font-family: 'Fredoka', cursive;
font-weight: 700;
letter-spacing: 1px;
text-shadow: 0 1px 2px rgba(255,255,255,0.6);
}
/* Menu navbar */
.navbar-nav > li > a {
color: #2f245a !important;
font-family: 'Quicksand', sans-serif;
font-weight: 600;
opacity: 1;
text-shadow: 0 1px 2px rgba(255,255,255,0.5);
}
/* Hover menu */
.navbar-nav > li > a:hover {
background: rgba(255,255,255,0.35) !important;
border-radius: 10px;
}
/* Menu aktif */
.navbar-nav > li.active > a,
.navbar-nav > li.active > a:hover {
background: rgba(255,255,255,0.55) !important;
border-radius: 12px;
font-weight: 700;
color: #2b1f5e !important;
}
/* Source Code button */
.navbar-nav > li:last-child > a {
font-weight: 700;
}
</style>
```
```{=html}
<style>
/* Judul halaman flexdashboard */
.section.level1 > h1 {
margin-bottom: 6px !important;
padding-bottom: 0 !important;
}
/* HILANGKAN JARAK PALING ATAS */
.section.level1 {
margin-top: 0 !important;
padding-top: 0 !important;
}
/* ISI LEVEL 1 */
.section.level1 > .content {
margin-top: 0 !important;
padding-top: 6px !important; /* kasih napas dikit biar ga dempet */
}
/* HILANGKAN SPACER BOOTSTRAP */
.section.level1::before,
.section.level1::after {
display: none !important;
content: none !important;
}
/* AMANKAN TABSET */
.section.level2 {
margin-top: 0 !important;
padding-top: 0 !important;
}
</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>
/* ===================== */
/* ===== TEAM GRID ===== */
/* ===================== */
.team-grid{
display:flex;
justify-content:center;
gap:26px;
flex-wrap:wrap;
padding:10px 30px 30px; /* atas diperkecil */
}
@media (min-width:1400px){
.team-grid{
flex-wrap:nowrap;
}
}
/* ===================== */
/* ===== MEMBER CARD ==== */
/* ===================== */
.member-card{
width:210px;
min-height:215px; /* dipendekin */
padding:22px 14px;
border-radius:26px;
text-align:center;
background:linear-gradient(
180deg,
#f4ecff 0%,
#eef4ff 45%,
#ffffff 85%
);
box-shadow:0 18px 35px rgba(0,0,0,.15);
}
/* FOTO */
.avatar-ring{
width:135px;
height:135px;
margin:0 auto 10px; /* jarak diperkecil */
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;
}
.avatar-ring img{
width:100%;
height:100%;
border-radius:50%;
object-fit:cover;
background:white;
}
/* TEKS */
.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;
}
/* ===================== */
/* ===== UAS SECTION ==== */
/* ===================== */
.study-section{
width:100%;
display:flex;
justify-content:center;
}
/* UAS STATISTIK (NAIK) */
.study-section.study-bottom{
margin-top:4px;
margin-bottom:6px;
}
.gradient-uas{
min-width:620px;
padding:30px 60px;
border-radius:26px;
text-align:center;
background:linear-gradient(135deg,#ffe1ef,#dfe5ff);
color:#2b2b3a;
font-size:26px;
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);
}
/* ===================== */
/* ===== INFO STRIP ===== */
/* ===================== */
.study-section:not(.study-bottom){
margin-top:0; /* nempel ke UAS */
padding-bottom:30px;
}
.info-strip{
display:flex;
justify-content:center;
gap:24px;
flex-wrap:wrap;
}
.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;
}
.chip-study{
background:linear-gradient(135deg,#ffd6e8,#ffeef6);
}
.chip-univ{
background:linear-gradient(135deg,#e6ddff,#f3eeff);
}
.chip-dosen{
background:linear-gradient(135deg,#e6f2ff,#f3f9ff);
}
.info-title{
font-size:11px;
opacity:.75;
margin-bottom:4px;
text-align:center;
}
.info-main{
text-align:center;
letter-spacing:.4px;
}
/* =============================== */
/* 🚑 FIX UAS NYEMPIL KE KANAN */
/* =============================== */
/* Paksa elemen setelah kartu jadi baris baru */
.team-grid > .study-section{
flex-basis:100%;
width:100%;
}
/* UAS STATISTIK CENTER */
.study-section.study-bottom{
justify-content:center;
margin-top:12px;
}
/* INFO STRIP CENTER & NEMPEL */
.study-section:not(.study-bottom){
justify-content:center;
margin-top:6px;
}
/* =============================== */
/* 🚨 FIX PAKSA UAS TURUN KE BAWAH */
/* =============================== */
/* Biar member cards tetap sejajar */
.team-grid{
flex-wrap: wrap !important;
}
/* Paksa UAS & info jadi baris baru */
.team-grid > .study-section{
width: 100% !important;
flex: 0 0 100% !important;
max-width: 100% !important;
}
/* UAS CENTER */
.study-section.study-bottom{
justify-content: center;
margin-top: 12px;
}
/* INFO STRIP CENTER */
.study-section:not(.study-bottom){
justify-content: center;
margin-top: 6px;
}
/* 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="C:/Users/Darrell/OneDrive/Desktop/UAS PANES/iffah.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
6. Membuat Tampilan Dashboard
</div>
</div>
<!-- NAISYA -->
<div class="member-card">
<div class="avatar-ring">
<img src="C:/Users/Darrell/OneDrive/Desktop/UAS PANES/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="C:/Users/Darrell/OneDrive/Desktop/UAS PANES/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="C:/Users/Darrell/OneDrive/Desktop/UAS PANES/petrik.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="C:/Users/Darrell/OneDrive/Desktop/UAS PANES/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 data-height=520}
-----------------------------------------------------------------------
### Intro to Statistic {data-width=1200}
<div style="display:flex; gap:16px; margin-top:10px;">
<div style="border-radius:16px; padding:18px; width:30%;
background:linear-gradient(135deg,#FFE3EC,#FFF1C1);
box-shadow:0 10px 25px rgba(0,0,0,.08);">
<h4><b>Pengertian Statistika</b></h4>
<ul>
<li>Statistika adalah cabang ilmu yang mempelajari metode pengumpulan, pengolahan, penyajian, analisis, dan interpretasi data.</li>
<li>Data yang dianalisis berasal dari hasil pengamatan, survei, atau eksperimen.</li>
<li>Statistika berperan penting dalam mengubah data mentah menjadi informasi yang bermakna.</li>
</ul>
<p style="font-size:12px;color:#555;">
Dengan statistika, informasi kompleks dapat disederhanakan sehingga lebih mudah dipahami dan digunakan dalam pengambilan keputusan.
</p>
</div>
<div style="border-radius:16px; padding:18px; width:30%;
background:linear-gradient(135deg,#D6F5FF,#D6FFD6);
box-shadow:0 10px 25px rgba(0,0,0,.08);">
<h4><b>Data dan Klasifikasinya</b></h4>
<ul>
<li>Data kualitatif menggambarkan kategori atau sifat suatu objek.</li>
<li>Data kuantitatif dinyatakan dalam bentuk angka dan dapat diukur.</li>
<li>Berdasarkan skala pengukuran, data dibedakan menjadi nominal, ordinal, interval, dan rasio.</li>
</ul>
<p style="font-size:12px;color:#555;">
Pemahaman jenis data sangat penting karena menentukan metode analisis statistik yang dapat digunakan.
</p>
</div>
<div style="border-radius:16px; padding:18px; width:30%;
background:linear-gradient(135deg,#E0C3FC,#8EC5FC);
box-shadow:0 10px 25px rgba(0,0,0,.08);">
<h4><b>Tujuan dan Manfaat Statistika</b></h4>
<ul>
<li>Menyajikan data dalam bentuk yang ringkas dan informatif.</li>
<li>Menganalisis data untuk menemukan pola dan kecenderungan.</li>
<li>Mendukung penarikan kesimpulan dan pengambilan keputusan yang rasional.</li>
</ul>
<p style="font-size:12px;color:#555;">
Statistika banyak digunakan dalam bidang pendidikan, ekonomi, kesehatan, industri, dan penelitian ilmiah.
</p>
</div>
</div>
### Data Exploration {data-width=1200}
```{=html}
<style>
.mindmap-wrap {
width: 100%;
height: 600px;
background: #fff;
display: flex;
align-items: flex-start; /* 🔥 UBAH DARI center JADI flex-start */
justify-content: center;
padding-top: 20px; /* 🔥 KASIH PADDING DIKIT BIAR GA MEPET */
}
.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="C:/Users/Darrell/OneDrive/Desktop/UAS PANES/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>
```
### Basic Visualization {data-width=1200}
<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>
### Central Tendency {data-width=1200}
```{=html}
<style>
.ct-wrap{ margin-top:10px; padding:0 12px; }
.ct-hero{
border-radius:16px;
padding:14px 18px;
box-shadow:0 8px 20px rgba(0,0,0,.08);
background:linear-gradient(135deg,#FFE3EC,#FFF1C1);
}
.ct-hero h2{ margin:0 0 6px 0; font-weight:800; font-size:16px; }
.ct-hero p{ margin:4px 0; font-size:12px; line-height:1.45; }
.ct-grid{
display:grid;
grid-template-columns: repeat(4, minmax(200px, 1fr));
gap:12px;
margin-top:12px;
}
.ct-box{
border-radius:14px;
padding:12px 14px;
box-shadow:0 8px 20px rgba(0,0,0,.08);
min-height:170px;
}
.ct-box h3{ margin:0 0 6px 0; font-weight:800; font-size:13px; }
.ct-box p{ margin:4px 0; font-size:11px; line-height:1.4; }
.ct-box ul{ margin:6px 0 0 14px; font-size:11px; line-height:1.45; padding-left:0; }
.ct-box ul li{ margin-bottom:3px; }
@media (max-width: 1100px){
.ct-grid{ grid-template-columns: repeat(2, minmax(200px, 1fr)); }
}
@media (max-width: 650px){
.ct-grid{ grid-template-columns: 1fr; }
}
</style>
<div class="ct-wrap">
<div class="ct-hero">
<h2>Central Tendency</h2>
<p>
<b>Central tendency</b> atau ukuran pemusatan data adalah konsep dasar dalam statistika deskriptif
yang digunakan untuk menggambarkan nilai yang paling mewakili suatu kumpulan data.
</p>
<p>
Ukuran ini membantu menyederhanakan data kompleks menjadi satu nilai representatif, yaitu
<b>mean</b>, <b>median</b>, dan <b>modus</b>.
</p>
</div>
<div class="ct-grid">
<div class="ct-box" style="background:linear-gradient(135deg,#E0F2FE,#F0F9FF);">
<h3>Median</h3>
<p>Median adalah nilai tengah dari data yang telah diurutkan.</p>
<ul>
<li>50% data di bawah dan 50% di atas median</li>
<li>Tidak sensitif terhadap outlier</li>
<li>Cocok untuk distribusi tidak simetris</li>
</ul>
</div>
<div class="ct-box" style="background:linear-gradient(135deg,#FFF7ED,#FDECC8);">
<h3>Modus</h3>
<p>Modus adalah nilai yang paling sering muncul dalam data.</p>
<ul>
<li>Dapat lebih dari satu modus</li>
<li>Cocok untuk data kategorikal</li>
<li>Menunjukkan nilai paling umum</li>
</ul>
</div>
<div class="ct-box" style="background:linear-gradient(135deg,#EDE9FE,#F5F3FF);">
<h3>Mean</h3>
<p>Mean merupakan rata-rata dari seluruh data.</p>
<ul>
<li>Menggunakan semua observasi</li>
<li>Mudah dihitung</li>
<li>Sensitif terhadap nilai ekstrem</li>
</ul>
</div>
<div class="ct-box" style="background:linear-gradient(135deg,#ECFEFF,#F0FDF4);">
<h3>Interpretasi</h3>
<ul>
<li>Mean > Median → miring ke kanan</li>
<li>Median lebih stabil dari mean</li>
<li>Modus menunjukkan nilai populer</li>
</ul>
</div>
</div>
</div>
```
### Statical Dispersion {data-width=1200}
<div style="display:flex; gap:16px; margin-top:10px;">
<div style="border-radius:16px; padding:18px; width:30%;
background:linear-gradient(135deg,#FFE3EC,#FFF1C1);
box-shadow:0 10px 25px rgba(0,0,0,.08);">
<h4><b>Pengertian Statistical Dispersion</b></h4>
<ul>
<li>Statistical dispersion merupakan ukuran yang menunjukkan tingkat penyebaran data terhadap nilai pusatnya.</li>
<li>Dispersion menggambarkan sejauh mana data bervariasi atau menyebar.</li>
<li>Ukuran ini membantu memahami konsistensi atau keragaman suatu data.</li>
</ul>
<p style="font-size:12px;color:#555;">
Semakin besar nilai dispersi, semakin besar variasi data dalam suatu kumpulan observasi.
</p>
</div>
<div style="border-radius:16px; padding:18px; width:30%;
background:linear-gradient(135deg,#D6F5FF,#D6FFD6);
box-shadow:0 10px 25px rgba(0,0,0,.08);">
<h4><b>Ukuran Dispersi</b></h4>
<ul>
<li>Range menunjukkan selisih antara nilai maksimum dan minimum.</li>
<li>Varians mengukur rata-rata kuadrat selisih data terhadap mean.</li>
<li>Simpangan baku menunjukkan tingkat penyimpangan data dari mean.</li>
</ul>
<p style="font-size:12px;color:#555;">
Setiap ukuran dispersi memberikan informasi yang berbeda tentang penyebaran data.
</p>
</div>
<div style="border-radius:16px; padding:18px; width:30%;
background:linear-gradient(135deg,#E0C3FC,#8EC5FC);
box-shadow:0 10px 25px rgba(0,0,0,.08);">
<h4><b>Interpretasi Dispersi</b></h4>
<ul>
<li>Dispersi kecil menunjukkan data cenderung homogen.</li>
<li>Dispersi besar menunjukkan variasi data yang tinggi.</li>
<li>Digunakan untuk membandingkan sebaran antar kelompok data.</li>
</ul>
<p style="font-size:12px;color:#555;">
Analisis dispersi penting untuk menilai kestabilan dan keandalan suatu data.
</p>
</div>
</div>
### Esential of Probability {data-width=1200}
<div class="prob-card" style="
width:100%;
padding:18px;
border-radius:16px;
background:linear-gradient(135deg,#A8EDEA,#FED6E3);
margin-bottom:16px;
">
<h4><b>Essentials of Probability</b></h4>
<p style="font-size:14px;line-height:1.6;margin:8px 0;">
Probabilitas adalah cara sederhana untuk memahami ketidakpastian, yaitu dengan menghitung seberapa besar kemungkinan suatu kejadian terjadi. Dengan probabilitas, kita bisa melihat pola dalam data dan membuat keputusan yang lebih masuk akal berdasarkan data, bukan sekadar tebakan.
</p>
<div style="display:flex;gap:12px;margin-top:10px;">
<div style="flex:1;background:#ffffffaa;padding:8px;border-radius:8px;font-size:13px;">
<b>Konsep Fundamental:</b><br>
• Sample space & events<br>
• Complement rule: P(A') = 1 - P(A)<br>
• 0 ≤ P(A) ≤ 1
</div>
<div style="flex:1;background:#ffffffaa;padding:8px;border-radius:8px;font-size:13px;">
<b>Independent vs Dependent:</b><br>
• Independent: kejadian tidak saling mempengaruhi<br>
• Dependent: kejadian saling mempengaruhi
</div>
<div style="flex:1;background:#ffffffaa;padding:8px;border-radius:8px;font-size:13px;">
<b>Union & Binomial:</b><br>
• Union: probabilitas minimal satu kejadian terjadi<br>
• Binomial: eksperimen dengan 2 hasil (sukses/gagal)
</div>
</div>
</div>
<div style="display:flex; gap:16px; margin-top:10px;">
<div class="prob-card" style="
width:30%;
padding:14px;
border-radius:16px;
background:linear-gradient(135deg,#E3FDFD,#CBF1F5);
">
<h4> <b>Contoh Event</b></h4>
<span class="event-tag">Definisi Event</span>
<ul>
<li>Pengguna memiliki <b>kepuasan tinggi</b></li>
<li>Kriteria: Kepuasan ≥ 4</li>
<li>Event terjadi jika pengguna merasa puas terhadap layanan</li>
</ul>
<p style="font-size:12px;color:#555;">
Event diambil dari variabel <i>Kepuasan</i> pada dataset food delivery yang ditampilkan pada chapter selanjutnya.
</p>
</div>
<div class="prob-card" style="
width:30%;
padding:14px;
border-radius:16px;
background:linear-gradient(135deg,#FFF6E5,#FFE3B3);
">
<h4> <b>Peluang</b></h4>
<ul>
<li>Total observasi (n) = 100</li>
<li>Jumlah kejadian : 69 pengguna</li>
<li>\( P(A) = \frac{69}{100} \)</li>
<li><b>\( P(A) = 0.69 \)</b></li>
</ul>
<p style="font-size:12px;color:#555;">
Peluang pengguna memiliki kepuasan tinggi menggunakan food delivery adalah 0.69 atau 69%.
</p>
</div>
<div class="prob-card" style="
width:30%;
padding:14px;
border-radius:16px;
background:linear-gradient(135deg,#E0C3FC,#8EC5FC);
">
<h4> <b>Interpretasi</b></h4>
<ul>
<li><b>69%</b> pengguna memiliki kepuasan tinggi</li>
<li>Mayoritas pengguna merasa puas</li>
<li>Kualitas layanan cenderung positif</li>
</ul>
</div>
</div>
### Probability Distributions {data-width=1200}
<style>
.box-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 16px;
margin-top: 20px;
}
.box {
padding: 18px;
border-radius: 14px;
box-shadow: 0 4px 10px rgba(0,0,0,0.08);
background: #f8f9fa;
}
.box h4 {
margin-top: 0;
font-weight: 700;
}
.intro { background: linear-gradient(135deg, #c8f1f4, #f7d6e6); }
.diskrit { background: #e8f7ff; }
.kontinu { background: #fff2d8; }
.visual { background: #ede9fe; }
.clt { background: #e7f8ef; }
</style>
<div class="box intro">
<h4>Introduction</h4>
<p>
Probability Distribution menjelaskan bagaimana peluang dari setiap
kemungkinan nilai suatu variabel acak tersebar. Konsep ini membantu
memahami ketidakpastian, memodelkan data acak, serta menjadi dasar
analisis statistik inferensial seperti uji hipotesis dan interval
kepercayaan.
</p>
</div>
<div class="box-container">
<div class="box diskrit">
<h4>Discrete Variables</h4>
<p>
Variabel diskrit adalah variabel acak yang hanya dapat mengambil
nilai tertentu yang dapat dihitung. Setiap nilai memiliki peluang
tersendiri yang dijelaskan menggunakan Probability Mass Function (PMF).
</p>
<ul>
<li>Nilai terhitung (countable)</li>
<li>Menggunakan PMF</li>
<li>∑p(x) = 1</li>
<li>Contoh: dadu, nilai ujian, jumlah anak</li>
</ul>
</div>
<div class="box kontinu">
<h4>Continuous Variables</h4>
<p>
Variabel kontinu adalah variabel acak yang dapat mengambil nilai
apa pun dalam suatu rentang. Probabilitasnya tidak dihitung pada
satu titik, melainkan pada suatu interval menggunakan PDF.
</p>
<ul>
<li>Nilai dalam suatu rentang</li>
<li>Menggunakan PDF</li>
<li>P(X = x) = 0</li>
<li>Contoh: tinggi, berat, suhu</li>
</ul>
</div>
<div class="box visual">
<h4>Representasi Visual</h4>
<p>
Perbedaan variabel diskrit dan kontinu juga terlihat dari cara
visualisasinya. Visualisasi membantu memahami pola dan sebaran data.
</p>
<ul>
<li>Diskrit → Bar Chart</li>
<li>Kontinu → Histogram</li>
<li>Kontinu tidak ada jarak batang</li>
</ul>
</div>
<div class="box clt">
<h4>Central Limit Theorem</h4>
<p>
Central Limit Theorem (CLT) menyatakan bahwa distribusi sampling
dari rata-rata akan mendekati distribusi normal ketika ukuran
sampel cukup besar.
</p>
<ul>
<li>n ≥ 30 → distribusi sampling normal</li>
<li>Berlaku meski populasi tidak normal</li>
<li>Presisi meningkat saat n besar</li>
</ul>
</div>
</div>
### 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;
}
/* ====== FIX 1 LAYAR TANPA SCROLL ====== */
html, body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
background: #f7f9fc;
}
/* GRID PAS 1 LAYAR */
.ci-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 14px;
height: calc(100vh - 220px);
padding: 14px;
box-sizing: border-box;
overflow: hidden;
}
.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>
```
### Statistical Inference {data-width=1200}
```{=html}
<style>
.inf-grid{
display:grid;
grid-template-columns: 1fr 1fr;
gap:12px;
margin:0;
padding:12px;
max-height:100vh;
overflow:auto;
box-sizing:border-box;
}
.inf-card{
background:white;
border-radius:12px;
padding:12px 16px;
box-shadow:0 8px 20px rgba(0,0,0,.08);
font-size:13px;
line-height:1.5;
}
.card-hypo{background:linear-gradient(135deg,#f6e9ff,#fbefff);}
.card-method{background:linear-gradient(135deg,#eef6ff,#f4f9ff);}
.card-formula{background:linear-gradient(135deg,#fff1e6,#fff6ee);}
.card-result{background:linear-gradient(135deg,#eafffb,#f3fffd);}
.card-conclu{background:linear-gradient(135deg,#efe4ff,#f6eeff);}
.full{grid-column:1/-1;}
.inf-card h4{margin:0 0 8px 0;font-weight:800;font-size:15px;}
.formula{
background:white;
border-radius:10px;
padding:10px;
margin:8px 0;
text-align:center;
font-size:16px;
}
</style>
<div class="inf-grid">
<div class="inf-card card-hypo">
<h4>Perumusan Hipotesis</h4>
<b>H₀:</b> μ ≤ 3<br><br>
<b>H₁:</b> μ > 3
</div>
<div class="inf-card card-method">
<h4>Metode & Statistik Uji</h4>
Digunakan <b>uji t satu sampel</b> karena σ populasi tidak diketahui.
</div>
<div class="inf-card card-formula full">
<h4>Statistik Uji</h4>
<div class="formula">
$$
t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}
$$
</div>
x̄ = rata-rata sampel<br>
μ₀ = 3<br>
s = simpangan baku sampel<br>
n = ukuran sampel
</div>
<div class="inf-card card-result">
<h4>Hasil Uji</h4>
• Rata-rata = <b>3,8</b><br>
• t-hitung = <b>2,45</b><br>
• t-tabel = <b>1,69</b><br>
• α = 0,05
</div>
<div class="inf-card card-conclu">
<h4>Keputusan & Kesimpulan</h4>
Karena <b>t-hitung > t-tabel</b>, maka <b>H₀ ditolak</b>.<br><br>
Artinya pelanggan <b>secara signifikan merasa puas</b>.
</div>
</div>
```
### Nonparametric Methods {data-width=1200}
```{=html}
<style>
.np-grid{
display:grid;
grid-template-columns: 1fr 1fr;
gap:18px;
margin-top:10px;
}
.np-card{
background:white;
border-radius:18px;
padding:18px 22px;
box-shadow:0 14px 32px rgba(0,0,0,.12);
font-size:14px;
line-height:1.6;
}
.card-hypo{background:linear-gradient(135deg,#fff1f5,#ffe8f0);}
.card-method{background:linear-gradient(135deg,#eefcff,#f2fdff);}
.card-result{background:linear-gradient(135deg,#f0fffa,#eafff6);}
.card-decision{background:linear-gradient(135deg,#fff8e6,#fff3cf);}
.card-conclu{background:linear-gradient(135deg,#efe4ff,#f6eeff);}
.full{grid-column:1/-1;}
.np-card h4{
margin-top:0;
font-weight:800;
}
</style>
<div class="np-grid">
<div class="np-card card-hypo">
<h4>Perumusan Hipotesis</h4>
<b>H₀:</b> Tidak terdapat perbedaan tingkat kepuasan antara pelanggan laki-laki dan perempuan.<br><br>
<b>H₁:</b> Terdapat perbedaan tingkat kepuasan antara pelanggan laki-laki dan perempuan.
</div>
<div class="np-card card-method">
<h4>Metode Uji</h4>
Digunakan <b>uji Mann–Whitney U</b> karena data kepuasan berskala ordinal dan
tidak diasumsikan berdistribusi normal.
</div>
<div class="np-card card-result full">
<h4>Hasil Uji</h4>
• Nilai <b>U-hitung = 320</b><br>
• <b>p-value = 0,032</b><br>
• Tingkat signifikansi <b>α = 0,05</b>
</div>
<div class="np-card card-decision">
<h4>Keputusan Uji</h4>
Karena <b>p-value < α</b> (0,032 < 0,05), maka <b>H₀ ditolak</b>.
</div>
<div class="np-card card-conclu">
<h4>Kesimpulan</h4>
Berdasarkan uji <b>Mann–Whitney U</b>, terdapat
<b>perbedaan tingkat kepuasan yang signifikan</b>
antara pelanggan laki-laki dan perempuan dalam penggunaan layanan food delivery.
</div>
</div>
```
Dataset {data-orientation=rows}
=======================================================================
### Table {data-height=520}
```{r}
library(readr)
library(dplyr)
library(DT)
df <- read_csv(
"C:/Users/Darrell/OneDrive/Desktop/UAS PANES/food_delivery_behavior.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 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: 18px;
border-radius: 20px;
background: linear-gradient(
135deg,
#EDE9FE,
#DDD6FE,
#C4B5FD
);
box-shadow: 0 8px 20px rgba(124, 58, 237, 0.15);
color: #3B0764;
}
.plotly.html-widget {
margin: 0 !important;
}
</style>
```{r}
library(plotly)
library(dplyr)
library(readr)
library(htmltools)
df <- read_csv(
"C:/Users/Darrell/OneDrive/Desktop/UAS PANES/food_delivery_behavior.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("#C4B5FD", "#A5B4FC", "#DDD6FE"),
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}
library(plotly)
library(dplyr)
library(readr)
library(htmltools)
df <- read_csv(
"C:/Users/Darrell/OneDrive/Desktop/UAS PANES/food_delivery_behavior.csv",
show_col_types = FALSE
)
# Rata-rata Waktu Tunggu per Platform
avg_wait <- df %>%
group_by(Platform) %>%
summarise(Rata_Waktu_Tunggu = mean(Waktu_Tunggu))
bar_wait <- plot_ly(
data = avg_wait,
x = ~Platform,
y = ~Rata_Waktu_Tunggu,
type = "bar",
text = ~round(Rata_Waktu_Tunggu, 1),
textposition = "outside",
marker = list(
color = c("#C4B5FD", "#A5B4FC", "#DDD6FE"),
line = list(color = "white", width = 1)
)
) %>%
layout(
title = list(
text = "Rata-rata Waktu Tunggu per Platform",
x = 0
),
xaxis = list(title = "Platform"),
yaxis = list(title = "Rata-rata Waktu Tunggu (menit)"),
showlegend = FALSE
)
div(
class = "vis-layout",
div(class = "vis-left", bar_wait),
div(
class = "vis-right",
h4(strong("Interpretasi")),
p(
"Perbedaan rata-rata waktu tunggu antar platform menunjukkan adanya variasi kecepatan layanan. Platform dengan waktu tunggu lebih singkat berpotensi memberikan pengalaman pengguna yang lebih baik. Namun, meskipun GrabFood memiliki rata-rata waktu tunggu paling lama, platform ini tetap paling sering digunakan. Hal ini menunjukkan bahwa waktu tunggu bukan satu-satunya faktor dalam pemilihan platform food delivery, dan preferensi pengguna kemungkinan dipengaruhi oleh faktor lain di luar kecepatan layanan."
)
)
)
```
### Line Chart {data-width=600 data-height=510}
```{=html}
<style>
.line-wrap{
display:flex;
gap:16px;
height:100%;
align-items:stretch;
}
/* ===== KARTU INTERPRETASI ===== */
.card-interpret{
flex:0 0 38%;
border-radius:22px;
padding:18px;
background: linear-gradient(
180deg,
#ffe9f1 0%,
#f4ecff 100%
);
box-shadow:0 14px 32px rgba(180,140,220,.35);
font-size:13px;
line-height:1.5;
}
.card-interpret h4{
margin-top:0;
font-size:15px;
font-weight:800;
color:#3d2f6e;
}
/* ===== KARTU VISUALISASI ===== */
.card-chart{
flex:1;
border-radius:22px;
padding:14px;
background: linear-gradient(
180deg,
#eaf2ff 0%,
#ffffff 100%
);
box-shadow:0 14px 32px rgba(140,170,255,.35);
}
/* JUDUL MANIS */
.card-title{
font-size:15px;
font-weight:800;
margin-bottom:6px;
color:#2f245a;
}
/* BERSIHIN MARGIN CHART */
.highchart-container{
margin:0 auto !important;
}
.card-interpret {
font-size: 15.5px;
line-height: 1.6;
}
/* Judul kartu */
.card-interpret h4 {
font-size: 20px;
font-weight: 700;
margin-bottom: 10px;
}
/* Subjudul seperti "Makna garis", dll */
.card-interpret strong {
font-size: 16.5px;
}
/* List bullet */
.card-interpret ul {
margin-left: 18px;
}
.card-interpret li {
font-size: 15.5px;
margin-bottom: 6px;
}
html, body {
height: 100% !important;
overflow: hidden !important;
}
/* tabset area */
.section.level2,
.tab-content,
.tab-pane {
height: 100% !important;
overflow: hidden !important;
}
.line-wrap{
display: grid;
grid-template-columns: 36% 64%;
gap: 16px;
height: calc(100vh - 230px);
overflow: hidden;
}
/* Kartu */
.card-interpret,
.card-chart{
border-radius: 26px;
padding: 20px;
overflow: hidden;
}
/* Interpretasi */
.card-interpret{
background: linear-gradient(180deg,#ffe4ef,#f2e9ff);
}
/* Chart */
.card-chart{
background: linear-gradient(180deg,#eef4ff,#ffffff);
}
/* Paksa chart nurut tinggi kartu */
.highchart-container,
.html-widget{
height: 100% !important;
}
</style>
```
```{r echo=FALSE, results='asis'}
library(htmltools)
library(dplyr)
library(highcharter)
# ===============================
# DATA
# ===============================
bulan_levels <- c("Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des")
df_line <- df %>%
mutate(
Bulan = factor(trimws(as.character(Bulan)),
levels = bulan_levels,
ordered = TRUE)
) %>%
group_by(Bulan, Platform) %>%
summarise(rata_kepuasan = mean(Kepuasan, na.rm = TRUE), .groups = "drop") %>%
arrange(Bulan, Platform)
# ===============================
# PERFORMA TERBAIK & TERBURUK
# ===============================
best <- df_line %>%
filter(!is.na(rata_kepuasan)) %>%
group_by(Platform) %>%
slice_max(rata_kepuasan, n = 1, with_ties = FALSE) %>%
ungroup()
worst <- df_line %>%
filter(!is.na(rata_kepuasan)) %>%
group_by(Platform) %>%
slice_min(rata_kepuasan, n = 1, with_ties = FALSE) %>%
ungroup()
div(class="line-wrap",
# ==== KARTU INTERPRETASI ====
div(class="card-interpret",
h4("Interpretasi Line Chart"),
p("Grafik menunjukkan tren perubahan kepuasan pengguna dari bulan ke bulan pada tiap platform."),
p(strong("Makna garis:")),
tags$ul(
tags$li("Garis naik → kepuasan meningkat"),
tags$li("Garis turun → kepuasan menurun")
),
p(strong("Performa terbaik:")),
tags$ul(lapply(seq_len(nrow(best)), function(i){
tags$li(paste(best$Platform[i], "pada bulan", best$Bulan[i]))
})),
p(strong("Perlu perbaikan:")),
tags$ul(lapply(seq_len(nrow(worst)), function(i){
tags$li(paste(worst$Platform[i], "pada bulan", worst$Bulan[i]))
}))
),
# ==== KARTU CHART ====
div(class="card-chart",
h4("Tren Kepuasan per Bulan"),
hchart(
df_line, "line",
hcaes(x = Bulan, y = rata_kepuasan, group = Platform)
) %>%
hc_yAxis(title=list(text="Kepuasan (1–5)"), min=0, max=5) %>%
hc_xAxis(title=list(text="Bulan")) %>%
hc_legend(layout="horizontal", align="center", verticalAlign="top")
)
)
```
### 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
css <- "
/* ===== WRAPPER & KARTU (TIDAK UBAH UKURAN) ===== */
.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;
}
/* ===== WARNA KARTU ===== */
.ct-left{
flex:0 0 58%;
background:#ffffff;
min-width:0;
}
.ct-right{
flex:1;
background:#efe6ff;
min-width:0;
font-size:13px;
line-height:1.35;
}
/* ===== JUDUL & TEKS ===== */
.ct-card h4{
color:#3d2f6e;
}
.ct-right p,
.ct-right li{
color:#2e2e2e;
}
/* ===== LIST ===== */
.ct-right ul{margin:6px 0 0 18px; padding-left:12px;}
.ct-right li{margin:8px 0;}
.ct-right ul ul{margin-top:6px;}
.ct-right ul ul li{margin:6px 0;}
/* ===== DATATABLE ===== */
table.dataTable{
width:100% !important;
background:#ffffff;
}
/* HEADER TABEL */
table.dataTable thead th{
background:#e6ddff !important;
color:#3b2f6e !important;
border-bottom:1px solid rgba(0,0,0,.15) !important;
padding:8px 10px !important;
font-size:12px !important;
}
/* ISI TABEL */
table.dataTable tbody td{
padding:8px 10px !important;
font-size:12px !important;
vertical-align:middle !important;
}
/* STRIPE (BARIS SELANG-SELING) */
table.dataTable.stripe tbody tr:nth-child(odd){
background-color:#f8f6ff !important;
}
/* MATIKAN SCROLL */ html, body, .section.level2, .section.level3, .tab-content, .tab-pane, .vis-panel, .vis-body{ overflow:hidden !important; height:100%; } .highchart-container{ height:100% !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; } .vis-panel.interpret{ background: linear-gradient( 135deg, #E9DDFF, #FDE7F3, #E8F1FF ) !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
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
```{=html}
<style>
/* =============================== */
/* 🔒 STATISTICAL TAB ONLY */
/* =============================== */
/* Kunci hanya tab Statistical */
#statistical,
#statistical .section.level2 {
height: 100% !important;
overflow: hidden !important;
}
/* Grid khusus Statistical - FIXED */
#statistical .vis-grid {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr;
gap: 10px;
/* Sesuaikan height agar pas dengan header + tab */
height: calc(100vh - 240px);
width: 100%;
padding: 8px;
box-sizing: border-box;
overflow: hidden !important;
}
/* Panel */
#statistical .vis-panel {
display: flex;
flex-direction: column;
border-radius: 16px;
overflow: hidden !important;
min-height: 0;
background: white;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* Header panel */
#statistical .vis-head {
flex: 0 0 auto;
padding: 10px 14px;
font-weight: 600;
font-size: 13px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
/* Body panel - KUNCI UTAMA */
#statistical .vis-body {
flex: 1 1 auto;
min-height: 0;
overflow: hidden !important;
padding: 8px;
display: flex;
flex-direction: column;
}
/* Khusus panel yang butuh scroll (tabel & interpretasi) */
#statistical .vis-panel.scroll-inside .vis-body {
overflow-y: auto !important;
overflow-x: hidden !important;
}
/* Paksa widget nurut */
#statistical .vis-body > .html-widget,
#statistical .vis-body > .highchart,
#statistical .dataTables_wrapper {
height: 100% !important;
max-height: 100% !important;
overflow: hidden !important;
flex: 1;
}
/* Tabel lebih compact */
#statistical .vis-panel table {
font-size: 11px;
}
#statistical .vis-panel .dataTables_wrapper {
font-size: 11px;
}
/* Keterangan tabel */
#statistical .vis-body p {
font-size: 10px;
margin: 8px 0 0 0;
padding: 6px;
background: #f3f4f6;
border-radius: 6px;
line-height: 1.4;
}
/* Interpretasi text */
#statistical .scroll-inside .vis-body p {
font-size: 11px;
margin-bottom: 8px;
line-height: 1.5;
}
#statistical .scroll-inside .vis-body p:last-child {
margin-bottom: 0;
}
/* Scrollbar styling */
#statistical .scroll-inside .vis-body::-webkit-scrollbar {
width: 6px;
}
#statistical .scroll-inside .vis-body::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 10px;
}
#statistical .scroll-inside .vis-body::-webkit-scrollbar-thumb {
background: #888;
border-radius: 10px;
}
#statistical .scroll-inside .vis-body::-webkit-scrollbar-thumb:hover {
background: #555;
}
</style>
```
```{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)))
}
# ===== Boxplot Waktu Tunggu =====
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",
inverted = TRUE,
height = NULL # Let CSS control height
) %>%
hc_title(text = "") %>% # Remove title to save space
hc_xAxis(
categories = c("Gojek", "GrabFood", "ShopeeFood"),
title = list(text = "Platform", style = list(fontSize = "11px"))
) %>%
hc_yAxis(
title = list(text = "Waktu Tunggu (menit)", style = list(fontSize = "11px"))
) %>%
hc_add_series(
name = "Waktu Tunggu",
data = list(
box_data(df_wait$Waktu_Tunggu[df_wait$Platform == "Gojek"]),
box_data(df_wait$Waktu_Tunggu[df_wait$Platform == "GrabFood"]),
box_data(df_wait$Waktu_Tunggu[df_wait$Platform == "ShopeeFood"])
),
colorByPoint = TRUE,
colors = c("#00B4D8", "#FF6B6B", "#6BCF63")
) %>%
hc_legend(enabled = FALSE)
# ===== 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,
scrollY = FALSE,
scrollX = FALSE
),
rownames = FALSE
)
# ===== Boxplot Pengeluaran =====
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 = "") %>% # Remove title to save space
hc_xAxis(
title = list(text = "Platform", style = list(fontSize = "11px"))
) %>%
hc_yAxis(
title = list(text = "Pengeluaran (Rp)", style = list(fontSize = "11px"))
) %>%
hc_plotOptions(
boxplot = list(colorByPoint = TRUE)
) %>%
hc_colors(c("#00B4D8", "#FF6B6B", "#6BCF63")) %>%
hc_legend(enabled = FALSE) %>%
hc_chart(height = NULL) # Let CSS control height
# ✅ OUTPUT FINAL
tagList(
# ✅ GRID 2x2 (SEMUA PANEL MASUK SINI)
div(
class = "vis-grid",
# Panel 1: Waktu Tunggu
div(class="vis-panel",
div(class="vis-head","Boxplot Waktu Tunggu per Platform"),
div(class="vis-body", chart_wait)
),
# Panel 2: Tabel Dispersion + keterangan
div(class="vis-panel scroll-inside",
div(class="vis-head","Tabel Dispersion"),
div(class="vis-body",
tbl_disp,
tags$p(
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.")
)
)
),
# Panel 3: Boxplot Pengeluaran
div(class="vis-panel",
div(class="vis-head","Boxplot Pengeluaran per Platform"),
div(class="vis-body", chart_sp)
),
# Panel 4: Interpretasi (gradient)
div(class="vis-panel scroll-inside",
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/Darrell/OneDrive/Desktop/UAS PANES/food_delivery_behavior.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_chart(height = 280) %>%
hc_title(text = "Probabilitas Kepuasan per Platform Menurut Pengguna") %>%
hc_yAxis(
title = list(text = "Probabilitas (%)"),
labels = list(format = "{value}%"),
min = 0, # 🔥 JANGAN DIPAKSA 70
max = 100
) %>%
hc_plotOptions(
line = list(
lineWidth = 3,
marker = list(
enabled = TRUE,
radius = 5
)
)
)
# ================= 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",
inverted = TRUE, # 🔥 INI KUNCI HORIZONTAL
height = 240
) %>%
hc_title(text = "Boxplot Pengeluaran Pengguna per Platform") %>%
hc_xAxis(title = list(text = "Pengeluaran")) %>%
hc_yAxis(categories = c("Gojek", "GrabFood", "ShopeeFood"))
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: 1.35fr 1fr; /* 🔥 BARIS ATAS LEBIH TINGGI */
height:calc(100vh - 160px);
width:100%;
gap:12px;
overflow:hidden;
}
/* ================= */
/* PANEL UMUM */
/* ================= */
.vis-panel{
border-radius:22px;
display:flex;
flex-direction:column;
overflow:hidden;
background: linear-gradient(
135deg,
#F3E8FF,
#FDE7F3,
#E8F1FF
);
box-shadow:0 14px 32px rgba(160,140,220,.25);
}
/* HEADER */
.vis-head{
padding:8px 12px;
font-weight:800;
font-size:13px;
color:#2F245A;
background: linear-gradient(
135deg,
#CBB6F5,
#F7B7FF,
#A5C8FF
);
}
/* BODY */
.vis-body{
flex:1;
padding:10px;
background: rgba(255,255,255,.75);
overflow:hidden;
font-size:13px;
line-height:1.45;
}
/* ================= */
/* KHUSUS INTERPRETASI */
/* ================= */
.vis-panel.interpret{
background: linear-gradient(
135deg,
#E9DDFF,
#FDE7F3,
#E8F1FF
) !important;
}
.vis-panel.interpret .vis-body{
background: rgba(255,255,255,.55) !important;
}
/* MATIKAN PUTIH DARI WIDGET */
.vis-panel.interpret .html-widget,
.vis-panel.interpret .chart-wrapper{
background: transparent !important;
box-shadow:none !important;
}
/* ===================================== */
/* 🔥 FIX LAYOUT PROBABILITY (MACBOOK) */
/* ===================================== */
.prob-grid{
display:grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1.35fr 1fr; /* 🔥 BARIS ATAS LEBIH TINGGI */
gap:12px;
height: calc(100vh - 160px); /* 🔥 SAMA KAYA STATISTICAL */
width:100%;
overflow:hidden;
}
/* Panel umum */
.prob-grid .vis-panel{
display:flex;
flex-direction:column;
overflow:hidden;
}
/* Body ngisi penuh */
.prob-grid .vis-body{
flex:1;
padding:8px;
overflow:hidden;
}
/* Paksa chart ngisi panel */
.prob-grid .html-widget,
.prob-grid .highchart-container{
height:100% !important;
max-height:100% !important;
}
/* ===================================== */
/* 🔥 OVERRIDE FLEXDASHBOARD (WAJIB) */
/* ===================================== */
/* Paksa tab Probability ngisi layar */
.tab-pane.active,
.section.level2,
.section.level3{
height:100vh !important;
}
/* Grid probability */
.prob-grid{
display:grid !important;
grid-template-columns: 1fr 1fr !important;
grid-template-rows: 1.35fr 1fr !important;
height: calc(100vh - 200px) !important;
width:100% !important;
gap:14px !important;
}
/* Paksa panel ikut ngisi */
.prob-grid .vis-panel{
height:100% !important;
}
/* Chart ngisi penuh */
.prob-grid .html-widget,
.prob-grid .highchart-container{
height:100% !important;
min-height:260px !important;
}
/* ===================================== */
/* 🔥 LEBARIN 4 PANEL */
/* ===================================== */
.prob-grid .vis-panel{
margin:0 !important;
border-radius:20px;
}
/* Kurangi padding biar isi terasa luas */
.prob-grid .vis-body{
padding:6px 8px !important;
}
/* ===================================== */
/* 🔥 FIX RUANG BAWAH STATISTICAL DISPERSION */
/* ===================================== */
/* Paksa tab Statistical Dispersion ngisi layar */
.section.level2,
.section.level3,
.tab-content,
.tab-pane {
height: 100% !important;
}
/* KHUSUS grid Statistical Dispersion */
.vis-grid{
height: calc(100vh - 190px) !important; /* ⬅️ INI KUNCINYA */
}
/* Kurangi napas bawah panel */
.vis-panel{
margin-bottom: 0 !important;
}
/* Biar chart & tabel ngisi penuh */
.vis-body{
flex: 1 1 auto;
padding-bottom: 4px !important;
}
/* Paksa chart nurut tinggi */
.highchart-container,
.html-widget{
height: 100% !important;
}
/* ================================= */
/* 🔥 FIX PROBABILITY (MACBOOK) */
/* SAMA KAYA STATISTICAL */
/* ================================= */
.vis-grid{
height: calc(100vh - 110px) !important; /* ⬅️ INI KUNCINYA */
}
/* Paksa panel ikut tinggi */
.vis-grid .vis-panel{
height: 100% !important;
}
/* Chart isi penuh */
.vis-grid .html-widget,
.vis-grid .highchart-container{
height: 100% !important;
}
"
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
<style>
body, html {
overflow: hidden !important;
height: 100vh;
}
.chart-wrapper {
height: calc(100vh - 80px) !important;
overflow: hidden !important;
padding-top: 10px;
}
.ci-box {
background: linear-gradient(135deg, #F3F9FF, #FFFFFF);
border-radius: 8px;
padding: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,.06);
height: 100%;
overflow: hidden;
}
.ci-title {
font-size: 11px;
font-weight: bold;
color: #0D47A1;
margin-bottom: 3px;
}
.ci-desc {
font-size: 10px;
color: #555;
margin-bottom: 6px;
}
.stat-card {
background: white;
border-left: 3px solid;
border-radius: 6px;
padding: 5px 7px;
margin-bottom: 4px;
box-shadow: 0 1px 4px rgba(0,0,0,.05);
transition: all 0.2s;
}
.stat-card:hover {
transform: translateX(3px);
box-shadow: 0 2px 8px rgba(0,0,0,.1);
}
.badge {
display: inline-block;
background: #1976D2;
color: white;
padding: 2px 7px;
border-radius: 8px;
font-size: 9px;
margin-bottom: 4px;
font-weight: 600;
}
.insight-box {
background: linear-gradient(135deg, #FFF3E0, #FFFFFF);
border-left: 3px solid #FF9800;
padding: 6px 8px;
border-radius: 6px;
font-size: 9px;
margin-top: 6px;
box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
table.dataTable {
font-size: 10px !important;
}
table.dataTable thead th {
padding: 4px !important;
font-size: 10px !important;
}
table.dataTable tbody td {
padding: 4px !important;
}
.dataTables_wrapper {
padding: 0 !important;
}
.section-divider {
border-top: 1px solid #e0e0e0;
margin: 8px 0;
}
</style>
Row {data-height=100}
-----------------------------------------------------------------------
### Teori & Tabel CI {data-width=300}
```{r}
library(dplyr)
library(readr)
library(DT)
library(htmltools)
df <- read_csv(
"C:/Users/Darrell/OneDrive/Desktop/UAS PANES/food_delivery_behavior.csv",
show_col_types = FALSE
)
stat <- df %>%
group_by(Platform) %>%
summarise(
Mean = round(mean(Kepuasan), 2),
SD = round(sd(Kepuasan), 2),
N = n()
)
ci_stat <- df %>%
group_by(Platform) %>%
summarise(
mean = mean(Kepuasan),
sd = sd(Kepuasan),
n = n(),
se = sd / sqrt(n),
tval = qt(0.975, df = n - 1),
LCL = round(mean - tval * se, 2),
UCL = round(mean + tval * se, 2),
Mean = round(mean, 2)
) %>%
select(Platform, Mean, LCL, UCL)
colors <- c("GrabFood" = "#EF476F", "Gojek" = "#06D6A0", "ShopeeFood" = "#FFD166")
div(
style = "height: 100%; display: flex; flex-direction: column; padding: 4px;",
div(class = "badge", "Dasar Perhitungan CI"),
div(
style = "flex: 0 0 auto; margin-bottom: 8px;",
tags$ul(
style = "padding-left: 14px; margin: 0; font-size: 11px; line-height: 1.6;",
tags$li(HTML("<b>x̄</b> = Mean Kepuasan")),
tags$li(tags$b("s"), " = Standar deviasi"),
tags$li(tags$b("n"), " = Jumlah data"),
tags$li("σ populasi tidak diketahui"),
tags$li(tags$b("Metode:"), " CI Mean (t-test)")
)
),
div(
style = "flex: 0 0 auto; margin-bottom: 8px;",
lapply(1:nrow(stat), function(i) {
s <- stat[i,]
div(
class = "stat-card",
style = sprintf("border-left-color: %s;", colors[s$Platform]),
div(
style = "display: flex; justify-content: space-between; align-items: center; margin-bottom: 3px;",
tags$b(style = sprintf("color: %s; font-size: 11px;", colors[s$Platform]), s$Platform),
tags$span(style = "background: #f0f0f0; padding: 2px 6px; border-radius: 3px; font-size: 9px;",
sprintf("n=%d", s$N))
),
div(
style = "font-size: 10px; color: #666;",
sprintf("x̄: %.2f | SD: %.2f", s$Mean, s$SD)
)
)
})
),
div(class = "section-divider"),
div(class = "badge", style = "background: #4CAF50;", "Interval Kepercayaan 95%"),
div(
style = "flex: 1; min-height: 0;",
div(class = "ci-desc", "Estimasi rata-rata kepuasan (α = 0.05)"),
datatable(
ci_stat,
rownames = FALSE,
options = list(
dom = 't',
ordering = FALSE,
pageLength = 10,
scrollY = FALSE,
paging = FALSE,
columnDefs = list(
list(className = 'dt-center', targets = 1:3)
)
),
class = 'cell-border compact'
) %>%
formatStyle(
'Platform',
target = 'row',
backgroundColor = styleEqual(
c('GrabFood', 'Gojek', 'ShopeeFood'),
c('#FFF5F7', '#F0FDF9', '#FFFBEB')
)
)
)
)
```
### Visualisasi & Interpretasi {data-width=700}
```{r}
library(plotly)
ci_stat_plot <- df %>%
group_by(Platform) %>%
summarise(
mean = mean(Kepuasan),
sd = sd(Kepuasan),
n = n(),
se = sd / sqrt(n),
tval = qt(0.975, df = n - 1),
LCL = mean - tval * se,
UCL = mean + tval * se
)
div(
style = "height: 100%; display: flex; flex-direction: column; padding: 4px;",
div(
style = "flex: 0 0 60%; min-height: 0;",
{
plot_ci <- plot_ly(showlegend = FALSE)
for (p in unique(ci_stat_plot$Platform)) {
d <- ci_stat_plot %>% filter(Platform == p)
plot_ci <- plot_ci %>%
add_segments(
x = p, xend = p,
y = d$LCL, yend = d$UCL,
line = list(color = colors[p], width = 7),
hoverinfo = "text",
text = paste0(
"<b>", p, "</b><br>",
"Mean: ", round(d$mean, 2), "<br>",
"95% CI: [", round(d$LCL, 2), ", ", round(d$UCL, 2), "]"
)
) %>%
add_markers(
x = p,
y = d$mean,
marker = list(size = 13, color = colors[p],
line = list(color = 'white', width = 2)),
hoverinfo = "skip"
)
}
plot_ci %>%
layout(
title = list(text = "95% CI Kepuasan per Platform", font = list(size = 12)),
xaxis = list(title = "", tickfont = list(size = 10)),
yaxis = list(title = "Skor Kepuasan", titlefont = list(size = 10), tickfont = list(size = 9)),
margin = list(l = 50, r = 20, t = 35, b = 30),
plot_bgcolor = '#fafafa',
paper_bgcolor = 'white'
) %>%
config(displayModeBar = FALSE)
}
),
div(
style = "flex: 0 0 auto; margin-top: 8px; padding-bottom: 8px;",
div(class = "badge", style = "background: #FF9800;", "Interpretasi Hasil"),
div(
class = "insight-box",
tags$ul(
style = "margin: 0; padding-left: 14px; font-size: 10px; line-height: 1.6;",
tags$li("Titik pada setiap garis menunjukkan nilai rata-rata sampel"),
tags$li("Panjang garis merepresentasikan rentang confidence interval 95%"),
tags$li("Pada tingkat kepercayaan 95%, rata-rata kepuasan pengguna tiap platform food delivery berada dalam rentang CI yang relatif stabil untuk evaluasi layanan")
)
)
)
)
```
Statistical Inference {data-orientation=rows}
=======================================================================
Case Study Example
<style>
body, html { height: 100vh; overflow: hidden !important; }
.ci-box{
height: 100%;
overflow: visible !important;
min-height: 0;
padding: 6px !important;
}
.section-divider{ margin: 4px 0 !important; }
.dataTables_wrapper{ padding: 0 !important; margin: 0 !important; }
table.dataTable{ margin: 0 !important; font-size: 9px !important; }
table.dataTable thead th { padding: 3px !important; font-size: 9px !important; }
table.dataTable tbody td { padding: 3px !important; }
.badge{ margin-bottom: 2px !important; padding: 2px 6px !important; font-size: 8px !important; }
.stat-card{ margin-bottom: 2px !important; padding: 3px 5px !important; font-size: 9px !important; }
.insight-box {
background: linear-gradient(135deg, #FFF3E0, #FFFFFF);
border-left: 3px solid #FF9800;
padding: 5px 7px;
border-radius: 6px;
font-size: 9px;
box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
</style>
Row {data-height=100}
-----------------------------------------------------------------------
### Teori, Statistik, & Tabel Uji (Statistical Inference)
```{r}
library(dplyr)
library(readr)
library(DT)
library(htmltools)
library(broom)
df <- read_csv(
"C:/Users/Darrell/OneDrive/Desktop/UAS PANES/food_delivery_behavior.csv",
show_col_types = FALSE
)
df$Gender <- as.factor(df$Gender)
df$Platform <- as.factor(df$Platform)
alpha <- 0.05
tt <- t.test(Kepuasan ~ Gender, data = df) %>% tidy()
tt_tbl <- tt %>%
transmute(
Uji = "t-test (Kepuasan ~ Gender)",
Statistik = round(statistic, 3),
df = as.character(round(parameter, 1)),
p_value = signif(p.value, 3),
Mean_Diff = round(estimate1 - estimate2, 3)
)
aov_mod <- aov(Pengeluaran ~ Platform, data = df)
aov_tbl <- tidy(aov_mod) %>%
filter(term == "Platform") %>%
transmute(
Uji = "ANOVA (Pengeluaran ~ Platform)",
Statistik = round(statistic, 3),
df = paste(df, collapse = ", "),
p_value = signif(p.value, 3)
)
mean_pengeluaran <- df %>%
group_by(Platform) %>%
summarise(
Mean = round(mean(Pengeluaran, na.rm = TRUE), 2),
n = n(),
.groups = "drop"
)
cor1 <- cor.test(df$Waktu_Tunggu, df$Kepuasan, method = "pearson") %>% tidy()
cor2 <- cor.test(df$Frekuensi_Order, df$Pengeluaran, method = "pearson") %>% tidy()
cor_tbl <- bind_rows(
cor1 %>%
transmute(
Uji = "Korelasi (Waktu_Tunggu vs Kepuasan)",
r = round(estimate, 3),
p_value = signif(p.value, 3)
),
cor2 %>%
transmute(
Uji = "Korelasi (Frekuensi_Order vs Pengeluaran)",
r = round(estimate, 3),
p_value = signif(p.value, 3)
)
)
summary_tbl <- bind_rows(
tt_tbl %>% select(Uji, Statistik, df, p_value),
aov_tbl %>% select(Uji, Statistik, df, p_value)
)
div(
style = "height: 100%; display:flex; flex-direction:column; padding:4px;",
div(class = "badge", "Dasar Uji Hipotesis (α = 0.05)"),
div(
style = "margin-bottom:6px;",
tags$ul(
style = "padding-left:14px; font-size:10px; line-height:1.5; margin:2px 0;",
tags$li(tags$b("t-test:"), " numerik vs 2 kelompok"),
tags$li(tags$b("ANOVA:"), " numerik vs >2 kelompok"),
tags$li(tags$b("Korelasi:"), " hubungan antar numerik")
)
),
div(
class = "stat-card",
style = "border-left:3px solid #1976D2;",
tags$b("a) t-test: Kepuasan ~ Gender")
),
div(
class = "stat-card",
style = "border-left:3px solid #4CAF50;",
tags$b("b) ANOVA: Pengeluaran ~ Platform")
),
div(
class = "stat-card",
style = "border-left:3px solid #FF9800;",
tags$b("c) Korelasi: 2 pasang variabel")
),
div(class = "section-divider"),
div(class = "badge", style = "background:#4CAF50;", "Output Uji (p-value)"),
datatable(
summary_tbl,
rownames = FALSE,
options = list(dom = "t", paging = FALSE, ordering = FALSE),
class = "compact cell-border"
),
div(class = "section-divider"),
div(class = "badge", style = "background:#FF9800;", "Korelasi (r & p-value)"),
datatable(
cor_tbl,
rownames = FALSE,
options = list(dom = "t", paging = FALSE, ordering = FALSE),
class = "compact cell-border"
)
)
```
### Visualisasi & Interpretasi (Uji & Korelasi)
```{r}
library(plotly)
p1 <- plot_ly(
df,
x = ~Waktu_Tunggu,
y = ~Kepuasan,
type = "scatter",
mode = "markers",
marker = list(size = 6)
) %>%
layout(
title = list(text = "Waktu Tunggu vs Kepuasan", font = list(size = 11)),
xaxis = list(title = "Waktu Tunggu", titlefont = list(size = 9), tickfont = list(size = 8)),
yaxis = list(title = "Kepuasan", titlefont = list(size = 9), tickfont = list(size = 8)),
margin = list(t = 30, b = 30, l = 40, r = 20)
) %>%
config(displayModeBar = FALSE)
p2 <- plot_ly(
df,
x = ~Frekuensi_Order,
y = ~Pengeluaran,
type = "scatter",
mode = "markers",
marker = list(size = 6)
) %>%
layout(
title = list(text = "Frekuensi Order vs Pengeluaran", font = list(size = 11)),
xaxis = list(title = "Frekuensi Order", titlefont = list(size = 9), tickfont = list(size = 8)),
yaxis = list(title = "Pengeluaran", titlefont = list(size = 9), tickfont = list(size = 8)),
margin = list(t = 30, b = 30, l = 40, r = 20)
) %>%
config(displayModeBar = FALSE)
div(
style = "height: 100%; display:flex; flex-direction:column; padding:4px; min-height:0;",
div(
style = "flex: 0 0 65%; display:flex; gap:8px; min-height:0;",
div(style = "flex:1 1 0; min-height:0;", p1),
div(style = "flex:1 1 0; min-height:0;", p2)
),
div(
style = "flex: 0 0 auto; margin-top:8px; padding-bottom:8px;",
div(class = "badge", style = "background:#FF9800;", "Interpretasi Hasil"),
div(
class = "insight-box",
tags$ul(
style = "margin:0; padding-left:14px; font-size:9px; line-height:1.5;",
tags$li("Jika p-value < 0.05 → tolak H0 (signifikan)"),
tags$li("t-test: bandingkan rata-rata Kepuasan antar Gender"),
tags$li("ANOVA: cek perbedaan rata-rata Pengeluaran antar Platform"),
tags$li("Korelasi: lihat arah r (positif/negatif) & signifikansi p-value")
)
)
)
)
```
Nonparametric Methods {data-orientation=rows}
=======================================================================
Case Study Example
<style>
body, html {
overflow: hidden !important;
height: 100vh;
}
.chart-wrapper {
height: calc(100vh - 80px) !important;
overflow: hidden !important;
padding-top: 10px;
}
.ci-box {
background: linear-gradient(135deg, #F3F9FF, #FFFFFF);
border-radius: 8px;
padding: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,.06);
height: 100%;
overflow: hidden;
}
.ci-title {
font-size: 11px;
font-weight: bold;
color: #0D47A1;
margin-bottom: 3px;
}
.ci-desc {
font-size: 10px;
color: #555;
margin-bottom: 6px;
}
.stat-card {
background: white;
border-left: 3px solid;
border-radius: 6px;
padding: 5px 7px;
margin-bottom: 4px;
box-shadow: 0 1px 4px rgba(0,0,0,.05);
transition: all 0.2s;
}
.stat-card:hover {
transform: translateX(3px);
box-shadow: 0 2px 8px rgba(0,0,0,.1);
}
.badge {
display: inline-block;
background: #1976D2;
color: white;
padding: 2px 7px;
border-radius: 8px;
font-size: 9px;
margin-bottom: 4px;
font-weight: 600;
}
.insight-box {
background: linear-gradient(135deg, #FFF3E0, #FFFFFF);
border-left: 3px solid #FF9800;
padding: 6px 8px;
border-radius: 6px;
font-size: 9px;
margin-top: 6px;
box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
table.dataTable {
font-size: 10px !important;
}
table.dataTable thead th {
padding: 4px !important;
font-size: 10px !important;
}
table.dataTable tbody td {
padding: 4px !important;
}
.dataTables_wrapper {
padding: 0 !important;
}
.section-divider {
border-top: 1px solid #e0e0e0;
margin: 8px 0;
}
</style>
Row {data-height=100}
-----------------------------------------------------------------------
### Teori, Statistik, & Tabel CI (Nonparametrik)
```{r}
library(dplyr)
library(readr)
library(DT)
library(htmltools)
library(boot)
# Load data
df <- read_csv(
"C:/Users/Darrell/OneDrive/Desktop/UAS PANES/food_delivery_behavior.csv",
show_col_types = FALSE
)
# Fungsi bootstrap untuk median
boot_median <- function(data, index) {
median(data[index])
}
set.seed(123)
# Perhitungan CI bootstrap
ci_stat <- df %>%
group_by(Platform) %>%
summarise(
boot_obj = list(boot(Kepuasan, boot_median, R = 1000)),
Median = round(median(Kepuasan), 2),
LCL = round(boot.ci(boot_obj[[1]], type = "perc")$percent[4], 2),
UCL = round(boot.ci(boot_obj[[1]], type = "perc")$percent[5], 2),
N = n()
) %>%
select(Platform, Median, LCL, UCL, N)
# Warna platform
colors <- c(
"GrabFood" = "#EF476F",
"Gojek" = "#06D6A0",
"ShopeeFood" = "#FFD166"
)
# Tampilan UI
div(
style = "height: 100%; display: flex; flex-direction: column; padding: 4px;",
div(class = "badge", "Dasar Metode Nonparametrik"),
div(
style = "margin-bottom: 8px;",
tags$ul(
style = "padding-left: 14px; font-size: 11px; line-height: 1.6;",
tags$li(tags$b("Statistik pusat:"), " Median"),
tags$li("Data kepuasan berskala ordinal"),
tags$li("Distribusi tidak diasumsikan normal"),
tags$li(tags$b("Metode CI:"), " Bootstrap Percentile"),
tags$li(tags$b("Resampling:"), " 1000 kali")
)
),
lapply(1:nrow(ci_stat), function(i) {
s <- ci_stat[i,]
div(
class = "stat-card",
style = sprintf("border-left-color:%s;", colors[s$Platform]),
tags$b(style = sprintf("color:%s;", colors[s$Platform]), s$Platform),
div(
style = "font-size:10px;",
sprintf("Median Kepuasan: %.2f | n = %d", s$Median, s$N)
)
)
}),
div(class = "section-divider"),
div(class = "badge", style = "background:#4CAF50;", "95% Bootstrap Confidence Interval"),
datatable(
ci_stat %>% select(-N),
rownames = FALSE,
options = list(dom = 't', paging = FALSE),
class = "compact cell-border"
)
)
```
### Visualisasi & Interpretasi (Bootstrap CI)
```{r}
div(
style = "height: 100%; display: flex; flex-direction: column; padding: 4px; overflow-y: auto;",
div(
style = "flex: 0 0 55%; min-height: 300px;",
plot_ly(
ci_stat,
x = ~Platform,
y = ~Median,
type = "scatter",
mode = "markers",
marker = list(size = 12)
) %>%
add_segments(
x = ci_stat$Platform,
xend = ci_stat$Platform,
y = ci_stat$LCL,
yend = ci_stat$UCL,
line = list(width = 6)
) %>%
layout(
title = list(
text = "Bootstrap 95% CI Median Kepuasan",
font = list(size = 13)
),
yaxis = list(title = "Skor Kepuasan", tickfont = list(size = 10)),
xaxis = list(title = "Platform", tickfont = list(size = 10)),
margin = list(t = 40, b = 30, l = 50, r = 20)
) %>%
config(displayModeBar = FALSE)
),
div(
style = "flex: 0 0 auto; margin-top: 8px; padding-bottom: 10px;",
div(class = "badge", style = "background:#FF9800;", "Interpretasi Hasil"),
div(
class = "insight-box",
tags$ul(
style = "margin:0; padding-left:14px; font-size:10px; line-height:1.6;",
tags$li("Titik menunjukkan median skor kepuasan pengguna tiap platform"),
tags$li("Garis vertikal menunjukkan interval kepercayaan bootstrap 95%"),
tags$li("Interval yang relatif sempit menandakan estimasi median yang stabil"),
tags$li("Bootstrap digunakan karena data ordinal dan tidak memenuhi asumsi normalitas")
)
)
)
)
```