str(lib)
## 'data.frame':    72 obs. of  6 variables:
##  $ faculty     : chr  "ศึกษาศาสตร์" "ศึกษาศาสตร์" "ศึกษาศาสตร์" "ศึกษาศาสตร์" ...
##  $ month       : chr  "ม.ค." "ก.พ." "มี.ค." "เม.ย." ...
##  $ borrows     : int  652 880 668 421 517 227 262 644 903 708 ...
##  $ students    : int  3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 ...
##  $ satisfaction: num  4.1 3.8 3.4 3.6 4 3.9 4 4 3.9 3.4 ...
##  $ responses   : int  200 202 158 170 162 69 70 241 267 182 ...
head(lib)
##     faculty month borrows students satisfaction responses
## 1 ศึกษาศาสตร์  ม.ค.     652     3200          4.1       200
## 2 ศึกษาศาสตร์  ก.พ.     880     3200          3.8       202
## 3 ศึกษาศาสตร์  มี.ค.     668     3200          3.4       158
## 4 ศึกษาศาสตร์ เม.ย.     421     3200          3.6       170
## 5 ศึกษาศาสตร์  พ.ค.     517     3200          4.0       162
## 6 ศึกษาศาสตร์  มิ.ย.     227     3200          3.9        69


ข้อ 1 — คณะไหนใช้ห้องสมุดมากที่สุด (3 คะแนน)

library(ggplot2)
library(dplyr)

# 1. สรุปผลรวมยอดการยืมจำแนกตามคณะ พร้อมสร้างเงื่อนไขสีไฮไลท์
df_summary <- lib %>%
  group_by(faculty) %>%
  summarise(
    total_borrows = sum(borrows),
    borrow_rate = sum(borrows) / max(students)
  ) %>%
  mutate(
    # กำหนดให้คณะวิทยาศาสตร์เป็นสีแดง คณะอื่นเป็นสีเทา
    is_science = ifelse(faculty == "วิทยาศาสตร์", "ไฮไลท์", "ปกติ")
  )

# 2. พลอตกราฟแท่งแบบปรับแต่งตามต้องการ
ggplot(df_summary, aes(x = reorder(faculty, -total_borrows), y = total_borrows, fill = is_science)) +
  geom_col(show.legend = FALSE) + # ซ่อน Legend
  
  # เพิ่มตัวเลขบนกราฟแท่ง
  geom_text(aes(label = total_borrows), vjust = -0.5, size = 3.8, fontface = "bold") +
  
  # กำหนดสีแบบกำหนดเอง (วิทยาศาสตร์ = สีแดง, คณะอื่น = สีเทา)
  scale_fill_manual(values = c("ไฮไลท์" = "#E63946", "ปกติ" = "#B0BEC5")) +
  
  # ขยายขอบเขตแกน Y เพื่อไม่ให้ตัวเลขบนแท่งโดนตัด
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  
  labs(
    title = "สรุปยอดการยืมหนังสือจำแนกตามคณะ",
    x = "คณะ",
    y = "จำนวนการยืมทั้งหมด (เล่ม)"
  ) +
  theme_minimal() +
  theme(
    # จัดหัวข้อให้อยู่ตรงกลาง
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    
    # ปรับเส้นแกน X และ Y ให้เข้ม/ชัดเจนขึ้น
    axis.line = element_line(color = "black", linewidth = 0.8),
    axis.ticks = element_line(color = "black", linewidth = 0.8),
    
    # ปรับข้อความแกนให้ชัดเจน
    axis.title = element_text(face = "bold"),
    axis.text = element_text(color = "black")
  )

คำตอบ (3–4 บรรทัด — “มากที่สุด” ของคุณนับจากอะไร และทำไมเลือกนับแบบนั้น)

คำว่า “มากที่สุด” เราพิจารณาจากการยืมหนังสือรวมกันของเเต่ล่ะคณะตลอดทั้งปี สาเหตุเพราะการยืมหนังสือสะท้ินถึงการเข้าใช้งานและนำทรัพยากรของห้องสมุดไปใช้จริงช่วยให้ผู้อำนวยการห้องสมุดพิจารณาการจัดซื้อได้ตรงตามความต้องการเเละจากกราฟนี้จะเห็นได้ว่าคณะวิทยาสาตร์นั้นได้มีการยืมสมุดในห้องสมุดสูงถึง 7,393 เล่ม จึงสรุปว่าเป็นคณะที่ใช้งานมากที่สุด


ข้อ 2 — ควรจัดกิจกรรมเดือนไหน (3 คะแนน)

library(ggplot2)
library(dplyr)

# 1. กำหนดลำดับเดือนตามปฏิทิน ม.ค. - ธ.ค.
month_order <- c("ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", 
                 "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค.")

# 2. รวมยอดยืมหนังสือรายเดือน
df_month_total <- lib %>%
  group_by(month) %>%
  summarise(total_borrows = sum(borrows, na.rm = TRUE)) %>%
  mutate(month = factor(month, levels = month_order)) %>%
  arrange(month)

# 3. พลอตกราฟเส้น พร้อมตั้งชื่อกราฟเป็นข้อสรุปที่มีตัวเลขจริง
ggplot(df_month_total, aes(x = month, y = total_borrows, group = 1)) +
  geom_line(color = "#1565C0", linewidth = 1.2) +
  geom_point(color = "#E63946", size = 3) +
  geom_text(aes(label = total_borrows), vjust = -1, fontface = "bold", size = 3.5) +
  scale_y_continuous(expand = expansion(mult = c(0.1, 0.2))) +
  labs(
    title = "ควรจัดกิจกรรมในเดือนมิถุนายนที่มีการยืมต่ำสุดเพียง 966 เล่ม เพื่อช่วยกระตุ้นการใช้งาน",
    x = "เดือน",
    y = "จำนวนการยืมรวม (เล่ม)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 12),
    axis.line = element_line(color = "black", linewidth = 0.8),
    axis.ticks = element_line(color = "black", linewidth = 0.8),
    axis.title = element_text(face = "bold"),
    axis.text = element_text(color = "black")
  )

คำตอบ (2 บรรทัด — แนะนำเดือนไหน เพราะอะไร)

สำหรับเรามองว่า ควรจัดในเดือนมิถุนายนเพราะเป็นช่วงที่นิสิตยืมหนังสือน้อยที่สุด ดังนั้นถ้าเราจัดกิจกรรมในช่วงเดือนที่ว่า เราจะช่วยกระตุ้นให้นิสิตหันมาใช้บริการห้องสมุดได้มากขึ้น


ข้อ 3 — หน้าที่ผู้อ่านกดดูเองได้ (4 คะแนน)

# 1. จัดลำดับเดือนตามปฏิทิน ม.ค. - ธ.ค.
month_order <- c("ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", 
                 "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค.")

# 2. เตรียมข้อมูลรายเดือนจำแนกตามคณะ
df_q3 <- lib %>%
  select(month, faculty, borrows) %>%
  mutate(
    month = factor(month, levels = month_order),
    faculty = factor(faculty)
  ) %>%
  arrange(month)

# 3. กำหนดเฉดสี: 3 คณะแรกโทนฟ้า (เข้ม->อ่อน), 3 คณะหลังโทนเขียว (เข้ม->อ่อน)
faculty_colors <- c(
  "พยาบาลศาสตร์" = "#0D47A1",  # ฟ้าเข้มมาก
  "เภสัชศาสตร์"  = "#1976D2",  # ฟ้าปานกลาง
  "มนุษยศาสตร์"  = "#64B5F6",  # ฟ้าอ่อน
  "วิทยาศาสตร์"   = "#1B5E20",  # เขียวเข้มมาก
  "วิศวกรรมศาสตร์" = "#388E3C",  # เขียวปานกลาง
  "ศึกษาศาสตร์"  = "#81C784"   # เขียวอ่อน
)

# 4. สร้าง SharedData สำหรับ Crosstalk
shared_lib <- SharedData$new(df_q3)

# 5. สร้างตัวกรองคณะ
filter_faculty <- filter_select(
  id = "faculty_filter",
  label = "เลือกคณะที่ต้องการดูข้อมูล:",
  sharedData = shared_lib,
  group = ~faculty,
  multiple = FALSE
)

# 6. สร้างกราฟเส้น Interactive (ปรับเส้นแกน X/Y ชัดเจน และเลื่อนตำแหน่งหัวข้อ)
p_interactive <- plot_ly(
  data = shared_lib,
  x = ~month,
  y = ~borrows,
  color = ~faculty,
  colors = faculty_colors,
  type = "scatter",
  mode = "lines+markers",
  marker = list(size = 8),
  text = ~paste("คณะ:", faculty, "<br>เดือน:", month, "<br>ยอดการยืม:", borrows, "เล่ม"),
  hoverinfo = "text"
) %>%
  layout(
    title = list(
      text = "แนวโน้มยอดการยืมหนังสือรายเดือนจำแนกตามคณะ", 
      x = 0.5, 
      y = 0.9,
      xanchor = "center",
      yanchor = "top"
    ),
    xaxis = list(
      title = "เดือน",
      showline = TRUE,
      linecolor = "black",
      linewidth = 1.5,
      ticks = "outside",
      tickcolor = "black"
    ),
    yaxis = list(
      title = "จำนวนการยืม (เล่ม)",
      showline = TRUE,
      linecolor = "black",
      linewidth = 1.5,
      ticks = "outside",
      tickcolor = "black"
    ),
    margin = list(t = 65, b = 50, l = 60, r = 20),
    showlegend = TRUE,
    legend = list(title = list(text = "<b>คณะ</b>"))
  )

# 7. สร้างตารางข้อมูล Interactive
tbl_interactive <- datatable(
  shared_lib,
  colnames = c("เดือน", "คณะ", "จำนวนการยืม (เล่ม)"),
  options = list(
    pageLength = 6, 
    lengthChange = FALSE,
    searching = FALSE,
    dom = "tp"
  ),
  rownames = FALSE
)

# 8. แสดงผลตัวกรอง กราฟ และตาราง
bscols(
  widths = c(12, 12, 12),
  filter_faculty,
  p_interactive,
  tbl_interactive
)


ข้อ 4 — ตรวจข้อสรุปของผู้บริหาร (3 คะแนน

# 1. คำนวณค่าเฉลี่ยความพึงพอใจและจำนวนข้อมูลบันทึกรายเดือน (N=12)
df_satisfaction <- lib %>%
  group_by(faculty) %>%
  summarise(
    avg_sat = round(mean(satisfaction, na.rm = TRUE), 2),
    n_resp = n()
  ) %>%
  mutate(is_pharmacy = if_else(faculty == "เภสัชศาสตร์", "เภสัชศาสตร์ (N น้อย)", "คณะอื่น"))
# 2. พลอตกราฟแท่งแสดง N รวมที่แท้จริง
ggplot(df_satisfaction, aes(x = reorder(faculty, -avg_sat), y = avg_sat, fill = is_pharmacy)) +
  geom_col(width = 0.65) +
  geom_text(
    aes(label = paste0(avg_sat, "\n(N=", n_resp, ")")), 
    vjust = -0.3, 
    fontface = "bold", 
    size = 3.8
  ) +
  scale_fill_manual(values = c("เภสัชศาสตร์ (N น้อย)" = "#E63946", "คณะอื่น" = "#457B9D")) +
  scale_y_continuous(limits = c(0, 5.8), breaks = 0:5) +
  labs(
    title = "คณะเภสัชศาสตร์ได้คะแนนสูงสุด 4.7 แต่มีผู้ตอบแบบสอบถามเพียงไม่กี่คน (N ต่ำเกินไป)",
    x = "คณะ",
    y = "คะแนนความพึงพอใจเฉลี่ย (เต็ม 5)",
    fill = ""
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 12, color = "#B71C1C"),
    axis.line = element_line(color = "black", linewidth = 0.8),
    axis.ticks = element_line(color = "black", linewidth = 0.8),
    axis.title.x = element_text(face = "bold", size = 11, margin = margin(t = 10)),
    axis.title.y = element_text(face = "bold", size = 10, angle = 90, margin = margin(r = 12)),
    axis.text = element_text(color = "black", size = 10),
    legend.position = "top"
  )

ตัวเลข 4.7 ถูกไหม

ตัวเลข 4.7 คำนวณถูกต้องตามข้อมูลจริง (คะแนนเฉลี่ยความพึงพอใจของคณะเภสัชศาสตร์อยู่ที่ 4.74 ซึ่งปัดเศษได้ 4.7)

ข้อสรุปนี้มีปัญหาอะไร (พร้อมตัวเลขยืนยัน)

ปัญหาคือ ความน่าเชื่อถือของขนาดกลุ่มตัวอย่าง เนื่อจากตัวเลข N = 12 ซึ่งเป็นจำนวนของเดือนไม่ใช่จำนวนผู้ตอบประเมินจริง


ข้อ 5 — บันทึกการใช้ AI (2 คะแนน)

prompt ที่ใช้ (คัดลอกมาเต็ม ๆ อย่างน้อย 1 อัน)

ช่วยเขียนโค้ด R ทำ Interactive Dashboard และปรับสีสเกลกลุ่มคณะเป็นโทนฟ้าและเขียว

สิ่งที่แก้จากที่ AI ให้มา และทำไมต้องแก้

ปรับแก้การนับจำนวนผู้ตอบในกราฟข้อ 4 ให้ตรงกับโครงสร้างข้อมูลจริงในไฟล์ lib และขยับระยะห่างข้อความชื่อแกน Y เพื่อไม่ให้ทับสเกลตัวเลข และเพื่อให้สามารถ Knit เอกสารผ่านได้โดยไม่ติด Error



ถ้า knit ไม่ผ่าน เขียนไว้ตรงนี้ว่าติดตรงไหน