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 คะแนน)

# 1. จัดกลุ่มและคำนวณสรุปข้อมูล
df_summary <- lib %>%
  group_by(faculty) %>%
  summarise(
    total_borrows = sum(borrows),
    students = max(students), # หรือ mean(students)
    borrows_per_student = total_borrows / students
  )

# 2. สร้างกราฟแท่ง (ตัวอย่างกรณีใช้ borrows_per_student)
ggplot(df_summary, aes(x = reorder(faculty, -borrows_per_student), y = borrows_per_student)) +
  geom_col(fill = "steelblue") +
  labs(
    title = "อัตราการยืมหนังสือต่อหัวนักศึกษาแยกตามคณะ",
    x = "คณะ",
    y = "จำนวนเล่มที่ยืมต่อนักศึกษา 1 คน"
  ) +
  theme_minimal()

คำตอบ (3–4 บรรทัด — “มากที่สุด” ของคุณนับจากอะไร และทำไมเลือกนับแบบนั้น) คำว่า “มากที่สุด” ในที่นี้วัดจาก อัตราการยืมหนังสือเฉลี่ยต่อนิสิต 1 คน (Borrows per Student) ไม่ใช่ยอดรวมการยืม สาเหตุที่เลือกใช้วิธีนี้เนื่องจาก แต่ละคณะมีจำนวนนิสิตไม่เท่ากัน การดูแค่ยอดยืมรวมจะทำให้คณะขนาดใหญ่ได้เปรียบ การคำนวณเป็นสัดส่วนต่อนิสิตจะช่วยให้ผู้อำนวยการเห็น “ความต้องการใช้งานจริงต่อหัว” เพื่อจัดสรรงบประมาณซื้อหนังสือเข้าคณะได้อย่างคุ้มค่าที่สุด >


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

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

q2_data <- lib %>%
  mutate(month = factor(month, levels = month_order)) %>%
  group_by(month) %>%
  summarise(total_borrows = sum(borrows, na.rm = TRUE))

# ดึงค่าเดือนที่มีการยิมน้อยที่สุด
min_month_info <- q2_data %>% filter(total_borrows == min(total_borrows))

ggplot(q2_data, aes(x = month, y = total_borrows, group = 1)) +
  geom_line(color = "#2b5c8f", size = 1) +
  geom_point(color = "#d9534f", size = 3) +
  labs(
    title = paste0("ยอดยืมรวมทั้งมหาวิทยาลัยต่ำสุดในเดือน ", min_month_info$month, 
                   " เพียง ", min_month_info$total_borrows, " เล่ม ควรจัดกิจกรรมช่วงนี้"),
    x = "เดือน",
    y = "ยอดยืมหนังสือรวม (เล่ม)"
  )

คำตอบ (2 บรรทัด — แนะนำเดือนไหน เพราะอะไร) แนะนำให้จัดการส่งเสริมการอ่านในเดือน มิถุนายนต์ เนื่องจากมียอดรวมต่ำที่สุด
การจักกิจกรรมในช่วงเดือนมิถุนายนต์จะช่วยกระตุ้นการเข้าใช้บริการในชาวงที่ซบเซาที่สุดและจะไม่รบกวนช่วงที่มีการยืมหนังสือมากที่สุด >


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

# ใช้ crosstalk สร้าง SharedData
shared_lib <- SharedData$new(lib)

# 1. ตัวกรองคณะ
filter_fac <- filter_select("fac_filter", "เลือกคณะ:", shared_lib, ~faculty)

# 2. กราฟ Interactive (plotly)
p <- ggplot(shared_lib, aes(x = month, y = borrows, fill = faculty)) +
  geom_col(position = "dodge") +
  labs(title = "ยอดยืมหนังสือรายเดือน", x = "เดือน", y = "จำนวนยืม") +
  theme(legend.position = "none")

graph_interactive <- ggplotly(p)

# 3. ตาราง Interactive (DT)
table_interactive <- datatable(shared_lib, options = list(pageLength = 6, autoWidth = TRUE))

filter_fac
graph_interactive
table_interactive


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

# 1. คำนวณตารางสรุปโดยใส่ na.rm = TRUE ทุกจุดเพื่อป้องกัน NA
q4_summary <- lib %>%
  group_by(faculty) %>%
  summarise(
    simple_mean = round(mean(satisfaction, na.rm = TRUE), 2),
    total_responses = sum(responses, na.rm = TRUE),
    weighted_mean = round(sum(satisfaction * responses, na.rm = TRUE) / sum(responses, na.rm = TRUE), 2)
  )

# แสดงตารางผลลัพธ์ (จะเห็นตัวเลข 4.7 และค่าอื่นๆ ครบ ไม่เป็น NA แล้ว)
q4_summary
## # A tibble: 6 × 4
##   faculty      simple_mean total_responses weighted_mean
##   <chr>              <dbl>           <int>         <dbl>
## 1 พยาบาลศาสตร์         4.1              654          4.11
## 2 มนุษยศาสตร์           4               1216          4.02
## 3 วิทยาศาสตร์           3.82            1688          3.8 
## 4 วิศวกรรมศาสตร์        3.5              853          3.49
## 5 ศึกษาศาสตร์           3.82            2101          3.81
## 6 เภสัชศาสตร์           4.74              32          4.73
# 2. คำนวณค่าเฉลี่ยรวมไว้ในตัวแปรก่อนนำไปใส่ใน geom_hline
overall_mean <- mean(q4_summary$simple_mean, na.rm = TRUE)

# 3. วาดกราฟ
ggplot(q4_summary, aes(x = total_responses, y = simple_mean, label = faculty)) +
  geom_point(aes(size = total_responses, color = faculty), alpha = 0.8, show.legend = FALSE) +
  scale_size_continuous(range = c(6, 16)) +
  geom_text(vjust = -1.3, fontface = "bold", size = 4) +
  geom_hline(yintercept = overall_mean, linetype = "dashed", color = "red") +
  scale_y_continuous(limits = c(1, 5.3)) +
  labs(
    title = "คะแนน 4.7 ของคณะเภสัชศาสตร์มาจากกลุ่มตัวอย่างที่น้อยผิดปกติ (Sample Bias)",
    subtitle = "แกน X แสดงจำนวนผู้ตอบประเมิน | แกน Y แสดงคะแนนความพึงพอใจ",
    x = "จำนวนผู้ตอบแบบประเมินทั้งหมด (คน)",
    y = "คะแนนความพึงพอใจเฉลี่ย (เต็ม 5)"
  ) +
  theme_minimal(base_size = 12)

ตัวเลข 4.7 ถูกไหม ตัวเลข 4.7 ถูก (หากคำนวณแบบถ่วงน้ำหนักตามจำนวนผู้ตอบจรืง) หรือเป็นเพียวค่าเฉี่ยอย่างง่าย >

ข้อสรุปนี้มีปัญหาอะไร (พร้อมตัวเลขยืนยัน) ข้อสรุปนี้มีปัญหาด้าน Sample Size /Response rate (จำนสนผู้ตอบ) เพราะคณะเภสัชศษสตร์มจำนวนผู็ตอบแบบประเมินรวมเพียง 32 คน ซึ่งน้อยกว่าคณะอื่นอย่างมาก ทำให้คะแนนสูงเกินจริงจากกลุ่มตัวอย่างที่ขนาดเล็ก ไม่สามารถนำมาเป็นตัวแทนมาตรฐานได้ >


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

prompt ที่ใช้ (คัดลอกมาเต็ม ๆ อย่างน้อย 1 อัน) #ข้อ 1 พร้อมต์ที่ใช้ “จากภาพข้อมูลที่ส่งให้ ควรสร้า” **โดยการแนบภำพข้อมูลที่รันออกมาจากไฟล์ และแนบภาพคำสั่ง

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

#ในข้อ 4 AI ให้โค้ดที่รันแล้วแต่ข้อมูลเภสัชศษสตร์มี NA ทำให้ไม่สามารถพล็ฮตกราฟของเภสัชศษสตร์ออกมาได้ # 1. ตรวจสอบการคำนวณคะแนนเฉลี่ยและจำนวนผู้ตอบประเมินรวม q4_summary <- lib %>% group_by(faculty) %>% summarise( simple_mean = round(mean(satisfaction), 2), total_responses = sum(responses), weighted_mean = round(sum(satisfaction * responses) / sum(responses), 2) )

แสดงผลตารางตรวจตัวเลข

print(q4_summary)

2. วาดกราฟ Scatter / Bubble Plot เพื่อให้เห็นปัญหาเชิงสถิติทันที

ggplot(q4_summary, aes(x = total_responses, y = simple_mean, label = faculty)) + geom_point(aes(size = total_responses, color = faculty), alpha = 0.8, show.legend = FALSE) + scale_size_continuous(range = c(6, 16)) + geom_text(vjust = -1.3, fontface = “bold”, size = 4) + geom_hline(yintercept = mean(q4_summary$simple_mean), linetype = “dashed”, color = “red”) + scale_y_continuous(limits = c(1, 5.3)) + labs( title = “คะแนน 4.7 ของคณะเภสัชศาสตร์มาจากกลุ่มตัวอย่างที่น้อยผิดปกติ (Sample Bias)”, subtitle = “แกน X แสดงจำนวนผู้ตอบประเมิน | แกน Y แสดงคะแนนความพึงพอใจ”, x = “จำนวนผู้ตอบแบบประเมินทั้งหมด (คน)”, y = “คะแนนความพึงพอใจเฉลี่ย (เต็ม 5)” ) + theme_minimal(base_size = 12) > #อันนี้คือโค้ดที่แก้ใหม่ โดยการเติม na.rm = TRUE # 1. คำนวณตารางสรุปโดยใส่ na.rm = TRUE ทุกจุดเพื่อป้องกัน NA q4_summary <- lib %>% group_by(faculty) %>% summarise( simple_mean = round(mean(satisfaction, na.rm = TRUE), 2), total_responses = sum(responses, na.rm = TRUE), weighted_mean = round(sum(satisfaction * responses, na.rm = TRUE) / sum(responses, na.rm = TRUE), 2) )

แสดงตารางผลลัพธ์ (จะเห็นตัวเลข 4.7 และค่าอื่นๆ ครบ ไม่เป็น NA แล้ว)

q4_summary

2. คำนวณค่าเฉลี่ยรวมไว้ในตัวแปรก่อนนำไปใส่ใน geom_hline

overall_mean <- mean(q4_summary$simple_mean, na.rm = TRUE)

3. วาดกราฟ

ggplot(q4_summary, aes(x = total_responses, y = simple_mean, label = faculty)) + geom_point(aes(size = total_responses, color = faculty), alpha = 0.8, show.legend = FALSE) + scale_size_continuous(range = c(6, 16)) + geom_text(vjust = -1.3, fontface = “bold”, size = 4) + geom_hline(yintercept = overall_mean, linetype = “dashed”, color = “red”) + scale_y_continuous(limits = c(1, 5.3)) + labs( title = “คะแนน 4.7 ของคณะเภสัชศาสตร์มาจากกลุ่มตัวอย่างที่น้อยผิดปกติ (Sample Bias)”, subtitle = “แกน X แสดงจำนวนผู้ตอบประเมิน | แกน Y แสดงคะแนนความพึงพอใจ”, x = “จำนวนผู้ตอบแบบประเมินทั้งหมด (คน)”, y = “คะแนนความพึงพอใจเฉลี่ย (เต็ม 5)” ) + theme_minimal(base_size = 12)


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