---
title: "Flex Dashboards QC Seven Tools"
output:
flexdashboard::flex_dashboard:
vertical_layout: scroll
theme: yeti
source_code: embed
---
```{r setup, include=FALSE}
library(dplyr)
library(RSQLite)
library(flexdashboard)
library(tidyverse)
library(tidyr)
library(highcharter) #Buat Visual
library(gt)
library(htmltools)
library(DT)
library(readr)
library(stringr)
library(qcc)
library(DiagrammeR)
library(moments)
library(viridis)
library(forcats)
library(DBI)
library(plotly)
library(glue)
```
Data
======================================================================
Column {.tabset .tabset-fade data-width=1000}
-----------------------------------------------------------------------
```{r}
library(DBI)
library(RSQLite)
library(DT)
# Koneksi ke database (sesuaikan nama file SQLite)
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Cek daftar tabel
dbListTables(con) # Ini untuk verifikasi jika "survey" memang ada
# Ambil seluruh isi tabel survey
data_survey <- dbReadTable(con, "survey")
# Tutup koneksi setelah selesai ambil data
dbDisconnect(con)
# Tampilkan dengan datatable interaktif scrollable
DT::datatable(
data_survey,
options = list(
pageLength = 10,
scrollY = "400px",
scrollX = TRUE
),
caption = htmltools::tags$caption(
style = 'caption-side: top; text-align: left; font-weight: bold;',
"Tabel Data Survei"
)
)
```
Check Sheet
======================================================================
Column {.tabset .tabset-fade data-width=500}
-----------------------------------------------------------------------
### Frekuensi Hambatan dalam Menjalani Hidup Sehat
```{r}
# Koneksi ke SQLite
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Query produk favorit
df <- dbGetQuery(con, "SELECT produk_favorit FROM survey")
# Hitung frekuensi dan susun
check_sheet <- df %>%
group_by(produk_favorit) %>%
summarise(Jumlah = n()) %>%
arrange(desc(Jumlah))
# Tampilkan dalam tabel interaktif
DT::datatable(
check_sheet,
options = list(pageLength = 5),
caption = "Frekuensi Produk Favorit"
)
# Tutup koneksi database
dbDisconnect(con)
```
Column {.tabset .tabset-fade data-width=500}
---------------------------------------------------------------------
### Visualisasi Pie Chart Hambatan dalam Menjalani Hidup Sehat
```{r}
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
data_produk_fav <- dbGetQuery(con, "SELECT produk_favorit FROM survey")
data_pie <- data_produk_fav %>%
group_by(produk_favorit) %>%
summarise(Jumlah = n()) %>%
mutate(Persentase = round(Jumlah / sum(Jumlah) * 100, 2)) %>%
arrange(desc(Jumlah))
n_colors <- nrow(data_pie)
custom_colors <- viridis::inferno(n = n_colors)
hc <- highchart() %>%
hc_chart(type = "pie") %>%
hc_title(text = "Distribusi Produksi Favorit") %>%
hc_subtitle(text = "Berdasarkan Frekuensi Responden") %>%
hc_add_series(
name = "Produk",
data = list_parse(data.frame(
name = data_pie$produk_favorit,
y = data_pie$Jumlah,
color = custom_colors
))
) %>%
hc_tooltip(pointFormat = "<b>{point.name}</b>: {point.y} responden ({point.percentage:.2f}%)") %>%
hc_plotOptions(
pie = list(
allowPointSelect = TRUE,
cursor = "pointer",
innerSize = "50%",
dataLabels = list(
enabled = TRUE,
format = "<b>{point.name}</b>: {point.percentage:.2f}%"
)
)
)
hc
dbDisconnect(con)
```
Histogram
======================================================================
Column {data-width=650}
-----------------------------------------------------------------------
### Berapa rata-rata pengeluaran bulanan mahasiswa di Shopee?
```{r}
# Koneksi ke database
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil data pengeluaran
df_hist <- dbGetQuery(con, "SELECT pengeluaran_bulanan FROM survey")
# Bersihkan: pastikan kolom numerik dan tidak NA
df_hist <- df_hist %>%
filter(!is.na(pengeluaran_bulanan)) %>%
mutate(pengeluaran_bulanan = as.numeric(pengeluaran_bulanan))
# Tampilkan 10 data pertama untuk pengecekan
DT::datatable(
head(df_hist, 10),
caption = "Sampel Data Pengeluaran Bulanan"
)
# Tutup koneksi
dbDisconnect(con)
```
Column {data-width=650}
-----------------------------------------------------------------------
### Visualisasi rata-rata pengeluaran mahasiswa
```{r}
# Koneksi ke database
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil data pengeluaran
df_hist <- dbGetQuery(con, "SELECT pengeluaran_bulanan FROM survey") %>%
filter(!is.na(pengeluaran_bulanan)) %>%
mutate(pengeluaran_bulanan = as.numeric(pengeluaran_bulanan))
dbDisconnect(con)
# Buat breaks dan label custom
breaks <- c(0, 500000, 1500000, 2500000, 5000000, Inf)
labels <- c("Rp100rb–500rb", "Rp501rb–1,5jt", "Rp1,5jt–2,5jt", "Rp2,5jt–5jt", "> Rp5jt")
# Histogram binned
df_hist_binned <- df_hist %>%
mutate(bin = cut(pengeluaran_bulanan, breaks = breaks, labels = labels, include.lowest = TRUE)) %>%
group_by(bin) %>%
summarise(Jumlah = n())
# Hitung density keseluruhan (tanpa bin)
density_data <- density(df_hist$pengeluaran_bulanan)
# Normalisasi density agar cocok skala histogram
density_scaled <- density_data$y * max(df_hist_binned$Jumlah) / max(density_data$y)
# Visualisasi
highchart() %>%
hc_chart(type = "column") %>%
hc_title(text = "Distribusi Pengeluaran Bulanan Mahasiswa") %>%
hc_xAxis(
categories = df_hist_binned$bin,
title = list(text = "Rentang Pengeluaran")
) %>%
hc_yAxis_multiples(
list(title = list(text = "Jumlah Responden"), opposite = FALSE),
list(title = list(text = "Kepadatan (Density)"), opposite = TRUE)
) %>%
hc_add_series(
name = "Responden",
data = df_hist_binned$Jumlah,
type = "column",
yAxis = 0,
colorByPoint = TRUE
) %>%
hc_add_series(
name = "Kurva Density",
type = "spline",
data = list_parse2(data.frame(
x = scales::rescale(density_data$x, to = c(0, length(labels) - 1)),
y = round(density_scaled, 2)
)),
yAxis = 0,
color = "#E74C3C", # 🔴 Merah
dashStyle = "Dash", # ➖ Putus-putus
marker = list(enabled = FALSE),
tooltip = list(pointFormat = "<b>Kepadatan</b>: {point.y:.2f}")
)
```
### Hubungan Diskon yang Ditunggu dengan Frekuensi Pembelian
```{r}
library(dplyr)
library(DBI)
library(RSQLite)
library(highcharter)
# Koneksi database
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil data dua variabel
df_scatter <- dbGetQuery(con, "SELECT persen_diskon_tunggu, frekuensi_pembelian FROM survey") %>%
filter(!is.na(persen_diskon_tunggu), !is.na(frekuensi_pembelian)) %>%
mutate(
persen_diskon_tunggu = as.numeric(persen_diskon_tunggu),
frekuensi_pembelian = as.numeric(frekuensi_pembelian)
)
dbDisconnect(con)
# Format data ke list of lists
data_points <- df_scatter %>%
transmute(x = persen_diskon_tunggu, y = frekuensi_pembelian) %>%
list_parse()
# Scatter plot
highchart() %>%
hc_chart(type = "scatter") %>%
hc_title(text = "Hubungan Diskon yang Ditunggu dengan Frekuensi Pembelian") %>%
hc_xAxis(title = list(text = "Persen Diskon yang Ditunggu (%)")) %>%
hc_yAxis(title = list(text = "Frekuensi Pembelian")) %>%
hc_add_series(
data = data_points,
type = "scatter",
name = "Responden",
marker = list(symbol = "circle", radius = 5)
) %>%
hc_tooltip(pointFormat = "Diskon Ditunggu: <b>{point.x}%</b><br>Frekuensi: <b>{point.y}</b>")
```
Scatter Plot
======================================================================
Column
----------------------------------------------------------------------
### Hubungan Persen Diskon Tunggu dengan Frekuensi Pembelian
```{r scatter-frekuensi-diskon, warning=FALSE, message=FALSE}
library(DBI)
library(RSQLite)
library(dplyr)
library(highcharter)
# Koneksi ke database SQLite
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil data dari tabel 'survey'
df_scatter <- dbGetQuery(con, "
SELECT persen_diskon_tunggu, frekuensi_pembelian
FROM survey
WHERE persen_diskon_tunggu IS NOT NULL AND frekuensi_pembelian IS NOT NULL
")
# Tutup koneksi
dbDisconnect(con)
# Siapkan data dan pastikan numerik
df_scatter <- df_scatter %>%
mutate(
persen_diskon_tunggu = as.numeric(persen_diskon_tunggu),
frekuensi_pembelian = as.numeric(frekuensi_pembelian),
Responden = paste("Responden", row_number())
)
# Titik data
scatter_data <- df_scatter %>%
transmute(
name = Responden,
x = persen_diskon_tunggu,
y = frekuensi_pembelian
) %>%
list_parse()
# Regresi linier
model <- lm(frekuensi_pembelian ~ persen_diskon_tunggu, data = df_scatter)
x_seq <- seq(min(df_scatter$persen_diskon_tunggu), max(df_scatter$persen_diskon_tunggu), length.out = 100)
y_pred <- predict(model, newdata = data.frame(persen_diskon_tunggu = x_seq))
line_data <- data.frame(x = x_seq, y = y_pred) %>% list_parse()
# Visualisasi dengan highcharter
highchart() %>%
hc_chart(type = "scatter") %>%
hc_title(text = "Scatter Plot: Persen Diskon Tunggu vs Frekuensi Pembelian") %>%
hc_xAxis(title = list(text = "Persen Diskon Tunggu (%)")) %>%
hc_yAxis(title = list(text = "Frekuensi Pembelian (per Bulan)")) %>%
hc_add_series(data = scatter_data, type = "scatter", name = "Responden", color = "#1abc9c") %>%
hc_add_series(data = line_data, type = "line", name = "Regresi Linear", color = "#e74c3c", dashStyle = "ShortDash") %>%
hc_tooltip(pointFormat = "<b>{point.name}</b><br>Diskon Tunggu: {point.x}%<br>Frekuensi: {point.y}") %>%
hc_add_theme(hc_theme_gridlight())
```
Line Chart
======================================================================
Column
----------------------------------------------------------------------
### Perbandingan Pentingnya Layanan Pelanggan dan Skor Kepuasan
```{r linechart-penting-kepuasan, warning=FALSE, message=FALSE}
# Koneksi ke SQLite
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil data dari tabel 'survey'
df_line <- dbGetQuery(con, "
SELECT penting_layanan_pelanggan, skor_kepuasan
FROM survey
WHERE penting_layanan_pelanggan IS NOT NULL AND skor_kepuasan IS NOT NULL
")
# Tutup koneksi
dbDisconnect(con)
# Pastikan data numerik dan beri urutan
df_line <- df_line %>%
mutate(
penting_layanan_pelanggan = as.numeric(penting_layanan_pelanggan),
skor_kepuasan = as.numeric(skor_kepuasan),
urutan = row_number()
)
# Data untuk dua garis
data_penting <- df_line %>%
transmute(x = urutan, y = penting_layanan_pelanggan) %>%
list_parse()
data_kepuasan <- df_line %>%
transmute(x = urutan, y = skor_kepuasan) %>%
list_parse()
# Highchart line plot
highchart() %>%
hc_chart(type = "line") %>%
hc_title(text = "Perbandingan Pentingnya Layanan vs Skor Kepuasan") %>%
hc_xAxis(title = list(text = "Responden"), allowDecimals = FALSE) %>%
hc_yAxis(title = list(text = "Skor (1–10)")) %>%
hc_add_series(data = data_penting, name = "Pentingnya Layanan", color = "#2980B9") %>%
hc_add_series(data = data_kepuasan, name = "Skor Kepuasan", color = "#E67E22") %>%
hc_tooltip(shared = TRUE, crosshairs = TRUE, valueDecimals = 1) %>%
hc_add_theme(hc_theme_flat())
```
Pie Chart
======================================================================
Column {.tabset .tabset-fade data-width=500}
----------------------------------------------------------------------
### Frekuensi Produk Favorit
```{r}
# Koneksi ke database
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil data check sheet dari SQL
check_sheet <- dbGetQuery(con, "
SELECT produk_favorit, COUNT(*) AS Jumlah
FROM survey
WHERE produk_favorit IS NOT NULL
GROUP BY produk_favorit
ORDER BY Jumlah DESC
")
# Tutup koneksi
dbDisconnect(con)
# Tampilkan datatable
datatable(
check_sheet,
options = list(pageLength = 5),
caption = "Frekuensi Produk Favorit Responden Shopee"
)
```
Column {.tabset .tabset-fade data-width=500}
----------------------------------------------------------------------
### Distribusi Produk Favorit Responden
```{r}
library(viridis)
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
data_produk_fav <- dbGetQuery(con, "SELECT produk_favorit FROM survey")
dbDisconnect(con)
data_pie <- data_produk_fav %>%
group_by(produk_favorit) %>%
summarise(Jumlah = n()) %>%
mutate(Persentase = round(Jumlah / sum(Jumlah) * 100, 2)) %>%
arrange(desc(Jumlah))
n_colors <- nrow(data_pie)
custom_colors <- viridis::inferno(n = n_colors)
highchart() %>%
hc_chart(type = "pie") %>%
hc_title(text = "Distribusi Produk Favorit") %>%
hc_subtitle(text = "Berdasarkan Frekuensi Responden") %>%
hc_add_series(
name = "Produk",
data = list_parse(data.frame(
name = data_pie$produk_favorit,
y = data_pie$Jumlah,
color = custom_colors
))
) %>%
hc_tooltip(pointFormat = "<b>{point.name}</b>: {point.y} responden ({point.percentage:.2f}%)") %>%
hc_plotOptions(
pie = list(
allowPointSelect = TRUE,
cursor = "pointer",
innerSize = "50%",
dataLabels = list(
enabled = TRUE,
format = "<b>{point.name}</b>: {point.percentage:.2f}%"
)
)
)
```
Column {.tabset .tabset-fade data-width=500}
----------------------------------------------------------------------
### Produk Favorit
```{r}
# Koneksi ke database
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil dan olah data dari SQL
data_pie <- dbGetQuery(con, "
SELECT produk_favorit, COUNT(*) AS Jumlah
FROM survey
WHERE produk_favorit IS NOT NULL
GROUP BY produk_favorit
ORDER BY Jumlah DESC
") %>%
mutate(Persentase = round(Jumlah / sum(Jumlah) * 100, 2))
# Tutup koneksi
dbDisconnect(con)
# Warna untuk tiap kategori
n_colors <- nrow(data_pie)
custom_colors <- viridis::inferno(n = n_colors)
# Buat donut chart
hc <- highchart() %>%
hc_chart(type = "pie") %>%
hc_title(text = "Distribusi Produk Favorit Responden Shopee") %>%
hc_subtitle(text = "Berdasarkan Pilihan Responden") %>%
hc_add_series(
name = "Produk Favorit",
data = list_parse(data.frame(
name = data_pie$produk_favorit,
y = data_pie$Jumlah,
color = custom_colors
))
) %>%
hc_tooltip(
pointFormat = "<b>{point.name}</b>: {point.y} responden ({point.percentage:.2f}%)"
) %>%
hc_plotOptions(
pie = list(
allowPointSelect = TRUE,
cursor = "pointer",
innerSize = "50%",
dataLabels = list(
enabled = TRUE,
format = "<b>{point.name}</b>: {point.percentage:.2f}%"
)
)
)
hc
```
Pareto Chart
======================================================================
Column
----------------------------------------------------------------------
### Sumber Informasi Produk saat berbelanja
```{r}
# Koneksi ke database
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil data sumber_info_produk dari database
pareto_data <- dbGetQuery(con, "
SELECT sumber_info_produk, COUNT(*) AS n
FROM survey
WHERE sumber_info_produk IS NOT NULL
GROUP BY sumber_info_produk
ORDER BY n DESC
") %>%
mutate(
cum_freq = cumsum(n) / sum(n) * 100
)
dbDisconnect(con)
# Warna
colors <- colorRampPalette(RColorBrewer::brewer.pal(12, "Set3"))(nrow(pareto_data))
# Buat plot Pareto
fig <- plot_ly()
# Bar chart
fig <- fig %>% add_bars(
x = ~reorder(pareto_data$sumber_info_produk, -pareto_data$n),
y = ~pareto_data$n,
name = 'Jumlah Responden',
marker = list(color = colors),
yaxis = "y1"
)
# Garis kumulatif
fig <- fig %>% add_lines(
x = ~reorder(pareto_data$sumber_info_produk, -pareto_data$n),
y = ~pareto_data$cum_freq,
name = 'Kumulatif (%)',
yaxis = "y2",
line = list(color = 'red', dash = 'dash')
)
# Garis batas 80%
fig <- fig %>% add_lines(
x = ~reorder(pareto_data$sumber_info_produk, -pareto_data$n),
y = rep(80, nrow(pareto_data)),
name = 'Cut-off 80%',
yaxis = "y2",
line = list(color = 'green', dash = 'dot')
)
# Layout
fig <- fig %>% layout(
title = "Pareto Chart – Sumber Informasi Produk yang Paling Berpengaruh",
xaxis = list(
title = "Sumber Informasi Produk",
tickangle = -45, # Miringkan label
tickfont = list(size = 11),
automargin = TRUE
),
yaxis = list(
title = "Jumlah Responden"
),
yaxis2 = list(
title = "Kumulatif (%)",
overlaying = "y",
side = "right",
range = c(0, 100)
),
legend = list(
x = 0.5,
y = -0.2,
orientation = "h",
xanchor = "center"
),
margin = list(b = 100) # Tambahkan margin bawah agar label tidak terpotong
)
## Tampilan Plot
fig
```
Fishbone
======================================================================
Column
----------------------------------------------------------------------
### Penyebab Kepuasan Layanan Shopee Rendah
```{r}
library(DBI)
library(RSQLite)
library(DiagrammeR)
# Koneksi ke database
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
data_fishbone <- dbReadTable(con, "fishbone")
dbDisconnect(con)
# Buat node unik
nodes <- unique(c(data_fishbone$kategori, data_fishbone$sub_penyebab, "KEPUASAN LAYANAN SHOPEE RENDAH"))
# Buat warna per kategori
warna_kategori <- c(
"MANPOWER" = "lightblue",
"METHOD" = "lightgreen",
"MACHINE" = "khaki",
"MATERIAL" = "plum",
"MOTHER_NATURE" = "orange",
"MEASUREMENT" = "lightsalmon"
)
# Buat graph script dalam format DOT
edges <- ""
for (i in 1:nrow(data_fishbone)) {
kategori <- data_fishbone$kategori[i]
penyebab <- data_fishbone$sub_penyebab[i]
edges <- paste0(edges, "\"", penyebab, "\" -> \"", kategori, "\";\n")
}
# Tambahkan koneksi kategori ke masalah utama
kategori_unik <- unique(data_fishbone$kategori)
for (k in kategori_unik) {
edges <- paste0(edges, "\"", k, "\" -> \"KEPUASAN LAYANAN SHOPEE RENDAH\";\n")
}
# Tambahkan style node
style <- ""
for (k in kategori_unik) {
style <- paste0(style, "\"", k, "\" [style=filled, fillcolor=", warna_kategori[[k]], "];\n")
}
style <- paste0(style, "\"KEPUASAN LAYANAN SHOPEE RENDAH\" [style=filled, shape=ellipse, fillcolor=deeppink, fontcolor=white];\n")
# Gabungkan
script <- paste0("digraph fishbone {\nrankdir=LR;\nnode [shape=box];\n", edges, style, "}")
# Tampilkan
grViz(script)
```
```{r}
# Koneksi ke DB
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil data fishbone
fish_data <- dbGetQuery(con, "SELECT * FROM fishbone")
# Tutup koneksi
dbDisconnect(con)
# Kelompokkan berdasarkan kategori
nodes <- fish_data %>%
group_by(kategori) %>%
summarise(subs = paste0(" ", kategori, tolower(letters[1:length(sub_penyebab)]),
" [label='", sub_penyebab, "']\n",
kategori, tolower(letters[1:length(sub_penyebab)]),
" -> ", kategori, "\n", collapse = ""))
# Bangun bagian diagram fishbone secara dinamis
sub_nodes_code <- paste(nodes$subs, collapse = "\n")
# Buat template diagram
diagram_code <- glue('
digraph fishbone {{
graph [layout = dot, rankdir = LR]
node [fontname=Helvetica, fontsize=20, style=filled]
Problem [label="KEPUASAN LAYANAN SHOPEE RENDAH", shape=ellipse, fillcolor=deeppink, width=6.5, height=1.2]
node [shape=hexagon, width=2.4, height=0.9]
{paste(unique(fish_data$kategori), collapse = " -> Problem\n")} -> Problem
node [shape=rectangle, width=3, height=0.5, fillcolor=lightgray]
{sub_nodes_code}
}}
')
# Tampilkan diagram
grViz(diagram_code)
```
Flowchart
======================================================================
Column
----------------------------------------------------------------------
### Hubungan diskon, pelayanan, dan pengalaman negatif terhadap kepuasan shopee
```{r}
cols <- viridis(6)
# Koneksi database
con <- dbConnect(SQLite(), "data-survei-2025-06-13 (2).sqlite")
# Ambil ringkasan data
summary_data <- list(
penting_diskon = dbGetQuery(con, "
SELECT AVG(CASE WHEN penting_diskon = 'ya' THEN 1 ELSE 0 END) as rata
FROM survey")$rata,
tunggu_diskon_tinggi = dbGetQuery(con, "
SELECT AVG(CASE WHEN persen_diskon_tunggu > 50 THEN 1 ELSE 0 END) as rata
FROM survey")$rata,
penting_pelayanan = dbGetQuery(con, "
SELECT AVG(CASE WHEN penting_layanan_pelanggan > 7 THEN 1 ELSE 0 END) as rata
FROM survey")$rata,
pengalaman_buruk_tinggi = dbGetQuery(con, "
SELECT AVG(CASE WHEN pengaruh_pengalaman_negatif > 6 THEN 1 ELSE 0 END) as rata
FROM survey")$rata
)
dbDisconnect(con)
# Konversi ke jawaban teks
check <- function(x) ifelse(x > 0.5, "Ya", "Tidak")
grViz(glue("
digraph flow_shopee {{
graph [layout = dot, rankdir = TB, nodesep=0.6, ranksep=0.9]
node [style = filled, fontname = Helvetica, fontsize = 14, penwidth = 1.2]
Start [label = 'Mulai', shape = ellipse, fillcolor = '#FFFFFF']
End [label = 'Selesai', shape = ellipse, fillcolor = '#FFFFFF']
CekDiskon [label = 'Diskon Penting?\\n({check(summary_data$penting_diskon)})', shape = diamond, fillcolor = '{cols[5]}']
DiskonTinggi [label = 'Diskon Ditunggu > 50%?\\n({check(summary_data$tunggu_diskon_tinggi)})', shape = diamond, fillcolor = '{cols[3]}']
PentingPelayanan [label = 'Pelayanan Penting?\\n({check(summary_data$penting_pelayanan)})', shape = diamond, fillcolor = '{cols[4]}']
PengalamanBuruk [label = 'Pengalaman Negatif > 6?\\n({check(summary_data$pengalaman_buruk_tinggi)})', shape = diamond, fillcolor = '{cols[6]}']
TidakPuas [label = 'Resiko Tidak Puas Tinggi', shape = rectangle, fillcolor = '#FFCCCC']
CukupPuas [label = 'Puas Tapi Tidak Optimal', shape = rectangle, fillcolor = '#FFE066']
SangatPuas [label = 'Sangat Puas & Loyal', shape = rectangle, fillcolor = '#B2F7B8']
Start -> CekDiskon
CekDiskon -> DiskonTinggi [label = 'Ya']
CekDiskon -> PentingPelayanan [label = 'Tidak']
DiskonTinggi -> PentingPelayanan [label = 'Ya']
DiskonTinggi -> SangatPuas [label = 'Tidak']
PentingPelayanan -> PengalamanBuruk [label = 'Ya']
PentingPelayanan -> SangatPuas [label = 'Tidak']
PengalamanBuruk -> TidakPuas [label = 'Ya']
PengalamanBuruk -> CukupPuas [label = 'Tidak']
TidakPuas -> End
CukupPuas -> End
SangatPuas -> End
}}
"))
```