Data

Column

[1] "fishbone" "survey"  

Check Sheet

Column

Frekuensi Hambatan dalam Menjalani Hidup Sehat

Column

Visualisasi Pie Chart Hambatan dalam Menjalani Hidup Sehat

Histogram

Column

Berapa rata-rata pengeluaran bulanan mahasiswa di Shopee?

Column

Visualisasi rata-rata pengeluaran mahasiswa

Hubungan Diskon yang Ditunggu dengan Frekuensi Pembelian

Scatter Plot

Column

Hubungan Persen Diskon Tunggu dengan Frekuensi Pembelian

Line Chart

Column

Perbandingan Pentingnya Layanan Pelanggan dan Skor Kepuasan

Pie Chart

Column

Frekuensi Produk Favorit

Column

Distribusi Produk Favorit Responden

Column

Produk Favorit

Pareto Chart

Column

Sumber Informasi Produk saat berbelanja

Fishbone

Column

Penyebab Kepuasan Layanan Shopee Rendah

Flowchart

Column

Hubungan diskon, pelayanan, dan pengalaman negatif terhadap kepuasan shopee

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