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
library(tidyverse)
# คำนวณสรุปข้อมูล
q1_summary <- lib %>%
group_by(faculty) %>%
summarise(
total_borrows = sum(borrows),
avg_students = mean(students),
borrows_per_student = sum(borrows) / mean(students)
)
# สร้าง Column ใหม่เพื่อเช็กว่าคณะไหนได้ค่ามากที่สุด
q1_summary <- q1_summary %>%
mutate(
is_top_total = ifelse(total_borrows == max(total_borrows), "Top", "Other"),
is_top_per_student = ifelse(borrows_per_student == max(borrows_per_student), "Top", "Other")
)
# กราฟที่ 1: ยอดรวมทั้งหมด (Highlight คณะที่ยอดรวมสูงสุด)
# p1 <- ggplot(q1_summary, aes(x = reorder(faculty, total_borrows), y = total_borrows, fill = is_top_total)) +
#geom_col() +
#coord_flip() +
#scale_fill_manual(values = c("Top" = "#d95f02", "Other" = "#d9d9d9")) + # สีเด่น (ส้ม) / สีปกติ (เทา)
#labs(
#title = "1. ยอดการยืมหนังสือรวมทั้งหมด (Total Borrows)",
#x = "คณะ",
#y = "จำนวนเล่มที่ยืมรวม (เล่ม)"
#) +
#theme_minimal() +
#theme(legend.position = "none")
# กราฟที่ 2: ยอดต่อหัวนิสิต (Highlight คณะที่ยอดต่อหัวสูงสุด)
p2 <- ggplot(q1_summary, aes(x = reorder(faculty, borrows_per_student), y = borrows_per_student, fill = is_top_per_student)) +
geom_col() +
coord_flip() +
scale_fill_manual(values = c("Top" = "#d95f02", "Other" = "#d9d9d9")) + # สีเด่น (ส้ม) / สีปกติ (เทา)
labs(
title = "2. อัตราส่วนการยืมหนังสือต่อจำนวนนิสิต (Borrows per Student)",
x = "คณะ",
y = "จำนวนเล่มที่ยืมต่อนิสิต 1 คน"
) +
theme_minimal() +
theme(legend.position = "none")
#p1
p2
คำตอบ (3–4 บรรทัด — “มากที่สุด” ของคุณนับจากอะไร และทำไมเลือกนับแบบนั้น)
คำว่า “มากที่สุด” ในที่นี้เลือกนับจาก อัตราส่วนจำนวนเล่มที่ยืมต่อจำนวนนิสิต (Borrows per Student) เนื่องจากแต่ละคณะมีขนาดและจำนวนประชากรนิสิตแตกต่างกันอย่างมาก การนับยอดยืมรวมเพียวๆ จะทำให้คณะขนาดใหญ่ได้เปรียบโดยเปรียบเทียบ การคิดอัตราส่วนต่อหัวช่วยขจัดปัจจัยเรื่องขนาดคณะ ทำให้เห็นความต้องการใช้งานจริงต่อนิสิต 1 คน ซึ่งพบว่า คณะเภสัชศาสตร์ มีความเข้มข้นในการยืมใช้งานสูงที่สุด (ประมาณ 9 เล่ม/คน) ข้อมูลนี้จึงสะท้อนความคุ้มค่าและความต้องการที่แท้จริง ซึ่งเหมาะสำหรับผู้อำนวยการนำไปใช้พิจารณาอนุมัติตัวงบประมาณเพิ่มหนังสือได้อย่างมีประสิทธิภาพสูงสุด
# สรุปยอดยืมรวมรายเดือนทั้งมหาวิทยาลัย
q2_summary <- lib %>%
group_by(month) %>%
summarise(total_borrows = sum(borrows))
# จัดลำดับเดือนตามปฏิทิน (ม.ค. - ธ.ค.)
month_order <- c("ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.",
"ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค.")
q2_summary <- q2_summary %>%
mutate(month = factor(month, levels = month_order)) %>%
arrange(month)
# ดึงตัวเลขจริงมาใส่ชื่อกราฟ และหาเดือนที่มียอดยืมต่ำสุด/สูงสุด
min_row <- q2_summary %>% filter(total_borrows == min(total_borrows))
max_row <- q2_summary %>% filter(total_borrows == max(total_borrows))
# สร้างกราฟเส้น
ggplot(q2_summary, aes(x = month, y = total_borrows, group = 1)) +
geom_line(color = "#2b5c8f", size = 1.2) +
geom_point(color = "#d95f02", size = 3) +
labs(
title = paste0("ยอดยืมหนังสือต่ำที่สุดในเดือน ", min_row$month,
" (เพียง ", format(min_row$total_borrows, big.mark=","),
" เล่ม) เหมาะแก่การจัดกิจกรรมกระตุ้นการอ่าน"),
subtitle = paste0("เปรียบเทียบกับช่วงที่มีการยืมสูงสุดในเดือน ", max_row$month,
" (จำนวน ", format(max_row$total_borrows, big.mark=","), " เล่ม)"),
x = "เดือน",
y = "จำนวนยอดยืมรวม (เล่ม)"
) +
theme_minimal()
คำตอบ (2 บรรทัด — แนะนำเดือนไหน เพราะอะไร)
ควรจัดกิจกรรมส่งเสริมการอ่านในเดือน มิ.ย. เนื่องจากมียอดการยืมหนังสือต่ำที่สุดในเดือนนี้เพียง 966 เล่ม การจัดกิจกรรมในช่วงเดือนนี้จะช่วยกระตุ้นและดึงดูดให้นิสิตกลับเข้ามาใช้บริการในห้องสมุดเพิ่มมากขึ้น
# แปลงข้อมูลให้อยู่ในรูปแบบ SharedData (ตัวกลางเชื่อม Filter + Graph + Table)
shared_lib <- SharedData$new(lib)
# สร้างตัวกรองเลือกคณะ (Dropdown Filter)
filter_faculty <- filter_select(
id = "faculty_filter",
label = "เลือกคณะที่ต้องการดูข้อมูล:",
sharedData = shared_lib,
group = ~faculty
)
# สร้างกราฟที่ผูกกับ SharedData
p_interactive <- plot_ly(
data = shared_lib,
x = ~month,
y = ~borrows,
color = ~faculty,
type = "bar"
) %>%
layout(
title = "ยอดยืมหนังสือรายเดือนตามคณะ",
xaxis = list(title = "เดือน"),
yaxis = list(title = "จำนวนยอดยืม (เล่ม)"),
barmode = "group"
)
# สร้างตารางแสดงข้อมูลที่ผูกกับ SharedData
dt_interactive <- datatable(
shared_lib,
options = list(pageLength = 6, scrollX = TRUE),
rownames = FALSE,
colnames = c("คณะ", "เดือน", "ยอดยืม (เล่ม)", "นิสิตทั้งหมด", "คะแนนพึงพอใจ", "ผู้ตอบประเมิน")
)
# แสดงผลเรียงกันในหน้าเดียว ( Filter -> Graph -> Table )
bscols(
widths = c(12),
filter_faculty,
p_interactive,
dt_interactive
)
# คำนวณสรุปข้อมูล
q4_check <- lib %>%
group_by(faculty) %>%
summarise(
avg_satisfaction = mean(satisfaction, na.rm = TRUE),
total_responses = sum(responses, na.rm = TRUE),
total_students = mean(students, na.rm = TRUE)
) %>%
mutate(
# สร้างคอลัมน์ไว้ไฮไลต์เฉพาะคณะเภสัชศาสตร์
is_pharmacy = ifelse(faculty == "เภสัชศาสตร์", "Pharmacy", "Other")
)
# กราฟแท่งแสดงจำนวนผู้ตอบแบบประเมิน (responses) + Label คะแนนพึงพอใจ
ggplot(q4_check, aes(x = reorder(faculty, total_responses), y = total_responses, fill = is_pharmacy)) +
geom_col() +
# ใส่ตัวเลขคะแนนพึงพอใจไว้ที่ปลายแท่งกราฟ
geom_text(aes(label = paste0("ความพึงพอใจ: ", round(avg_satisfaction, 2), " คะแนน")),
hjust = -0.1, size = 3.5, color = "#333333") +
coord_flip() +
# ปรับสีคุมโทน: คณะเภสัชฯ เป็นสีส้มเด่น (#d95f02) / คณะอื่นเป็นสีเทา (#d9d9d9)
scale_fill_manual(values = c("Pharmacy" = "#d95f02", "Other" = "#d9d9d9")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.25))) +
labs(
title = "คณะเภสัชศาสตร์มีคะแนนพึงพอใจสูงที่สุด แต่มียอดผู้ตอบประเมินน้อยที่สุดอย่างเห็นได้ชัด",
subtitle = "เปรียบเทียบจำนวนผู้ตอบแบบประเมินรวมตลอดทั้งปี (คน) และคะแนนความพึงพอใจเฉลี่ยรายคณะ",
x = "คณะ",
y = "จำนวนผู้ตอบแบบประเมินรวม (คน)"
) +
theme_minimal() +
theme(legend.position = "none")
ตัวเลข 4.7 ถูกไหม
ถูก จากการคำนวณค่าเฉลี่ยคะแนนความพึงพอใจตลอดทั้งปีของคณะเภสัชศาสตร์ด้วย mean(satisfaction, na.rm = TRUE) ได้ผลลัพธ์ตรงกับที่รองอธิการบดีระบุไว้คือ 4.7 คะแนน
ข้อสรุปนี้มีปัญหาอะไร (พร้อมตัวเลขยืนยัน)
ข้อสรุปนี้มีปัญหาตรงที่ คณะเภสัชศาสตร์ได้คะแนนความพึงพอใจที่สูงก็จริง (4.7 คะแนน) แต่ว่าจำนวนของการตอบแบบสอบถามมีจำนวนที่น้อยจนเกินไป เนื่องจากมียอดผู้ตอบแบบสอบถามเพียง 32 คน เทียบกับจำนวนนิสิตทั้งหมดของคณะเภสัชศาสตร์ที่มีถึง 420 คน คิดเป็นอัตราการตอบแบบประเมินเพียงไม่กี่เปอร์เซ็นต์เท่านั้น (7.62%) การนำความเห็นของคนกลุ่มน้อยมากมาเป็นตัวแทนของคนทั้งคณะ จึงไม่อาจสะท้อนความเป็นจริงและไม่ควรนำวิธีปฏิบัติไปใช้กับคณะอื่น
prompt ที่ใช้ (คัดลอกมาเต็ม ๆ อย่างน้อย 1 อัน)
ขอโค้ด ที่ทำแบบนับรวมจำนวนเพียวๆทั้งหมดและเฉลี่ยต่อคนให้ทีครับ เพื่อใช้เปรียบเทียบกัน
สิ่งที่แก้จากที่ AI ให้มา และทำไมต้องแก้
สิ่งที่ Ai ให้มา ############################################################## library(tidyverse) # 1. คำนวณสรุปข้อมูลตามคณะ q1_summary <- lib %>% group_by(faculty) %>% summarise( total_borrows = sum(borrows), avg_students = mean(students), borrows_per_student = sum(borrows) / mean(students) ) # 2. กราฟที่ 1: ยอดการยืมรวมเพียวๆ (Total Borrows) p1 <- ggplot(q1_summary, aes(x = reorder(faculty, total_borrows), y = total_borrows, fill = faculty)) + geom_col() + coord_flip() + labs( title = “1. ยอดการยืมหนังสือรวมทั้งหมด (Total Borrows)”, x = “คณะ”, y = “จำนวนเล่มที่ยืมรวม (เล่ม)” ) + theme_minimal() + theme(legend.position = “none”) # 3. กราฟที่ 2: ยอดการยืมเฉลี่ยต่อหัวนิสิต (Borrows per Student) p2 <- ggplot(q1_summary, aes(x = reorder(faculty, borrows_per_student), y = borrows_per_student, fill = faculty)) + geom_col() + coord_flip() + labs( title = “2. อัตราส่วนการยืมหนังสือต่อจำนวนนิสิต (Borrows per Student)”, x = “คณะ”, y = “จำนวนเล่มที่ยืมต่อนิสิต 1 คน” ) + theme_minimal() + theme(legend.position = “none”) # แสดงผลกราฟ (สามารถเลือกแสดง p1 และ p2 หรือใช้ patchwork เพื่อแสดงคู่กันได้) print(p1) print(p2) - ##################################################################### สิ่งที่ผมแก้ ##################################################################### # คำนวณสรุปข้อมูล q1_summary <- lib %>% group_by(faculty) %>% summarise( total_borrows = sum(borrows), avg_students = mean(students), borrows_per_student = sum(borrows) / mean(students) ) # สร้าง Column ใหม่เพื่อเช็กว่าคณะไหนได้ค่ามากที่สุด q1_summary <- q1_summary %>% mutate( is_top_total = ifelse(total_borrows == max(total_borrows), “Top”, “Other”), is_top_per_student = ifelse(borrows_per_student == max(borrows_per_student), “Top”, “Other”) ) # กราฟที่ 1: ยอดรวมทั้งหมด (Highlight คณะที่ยอดรวมสูงสุด) # p1 <- ggplot(q1_summary, aes(x = reorder(faculty, total_borrows), y = total_borrows, fill = is_top_total)) + #geom_col() + #coord_flip() + #scale_fill_manual(values = c(“Top” = “#d95f02”, “Other” = “#d9d9d9”)) + # สีเด่น (ส้ม) / สีปกติ (เทา) #labs( #title = “1. ยอดการยืมหนังสือรวมทั้งหมด (Total Borrows)”, #x = “คณะ”, #y = “จำนวนเล่มที่ยืมรวม (เล่ม)” #) + #theme_minimal() + #theme(legend.position = “none”) # กราฟที่ 2: ยอดต่อหัวนิสิต (Highlight คณะที่ยอดต่อหัวสูงสุด) p2 <- ggplot(q1_summary, aes(x = reorder(faculty, borrows_per_student), y = borrows_per_student, fill = is_top_per_student)) + geom_col() + coord_flip() + scale_fill_manual(values = c(“Top” = “#d95f02”, “Other” = “#d9d9d9”)) + # สีเด่น (ส้ม) / สีปกติ (เทา) labs( title = “2. อัตราส่วนการยืมหนังสือต่อจำนวนนิสิต (Borrows per Student)”, x = “คณะ”, y = “จำนวนเล่มที่ยืมต่อนิสิต 1 คน” ) + theme_minimal() + theme(legend.position = “none”) #p1 p2 - ################################################################################# ->ในบรรทัด 212 ผมสร้างคอลัมน์ใหม่ใน q1_summary ครับ ตั้งชื่อเป็น is_top_total และ is_top_per_student เพื่อใช้เก็บค่า Top & Other โดยกำหนดเงื่อนไขด้วย ifelse เงื่อนไขเป็นดังนี้ครับ (ข้อมูลแบ่งกลุ่มตามคณะ) ในส่วนของบรรทัด 215 ถ้า คณะไหนมียอดรวมสูงที่สุด(เอาค่ายอดรวมมาจากคอลัมน์ borrow_total ที่เราสร้างไว้ในบรรทัดที่ 208) ให้เก็บค่า Top ไว้ ถ้าไม่ใช่ให้เก็บค่า Other ในบรรทัดที่ 216 ถ้าคณะไหนมีอัตราการยืมหนังสือเฉลี่ยต่อคนมากที่สุด ให้เก็บค่า Top ไว้ในคอลัมน์ is_top_per_student ครับ ถ้าไม่ใช่ให้เก็บค่า Other (ตัวเลขอัตราเฉลี่ยต่อคนเราได้จากคอลัมน์ที่เราสร้างไว้ในบรรทัดที่ 210) ->พอสร้างคอลัมน์ใหม่ใน q1_summary เสร็จก็ถึงตอนทำกราฟครับ แนวคิดคือ ผมอยากให้กราฟมันโชว์แค่สีของคณะที่มีการยืมสูงที่สุดก็พอครับ ให้มันเด่นๆไปเลย เพราะถ้าเอาตาม Ai แบบไม่แก้เลยตัวกราฟจะมีสีทั้งหมด 6 สีเลยครับ ทำให้มองยาก และสีที่ต่างกันก็ไม่ได้สรุปอะไรเลย ใช้เพื่อแบ่งแยกกลุ่มเฉยๆ แต่มันคือการทำซ้ำซ็อน เพราะเราใส่ชื่อกำกับแต่ละคณะไว้แล้ว ผมเลยอยากให้มันเน้นแค่คณะที่มีตัวเลขที่เยอะที่สุดก็พอครับ ส่วนคณะอื่นๆจะใช้เป็นโทนสีเดียวกันทั้งหมดครับ เพราะตอนแรกที่ Ai เจนโค้ดมาให้ มันกำหนดสีตาม คณะเลยครับ ผมเข้าใจว่ามันสุ่มสีขึ้นมาเอง จากคำสั่ง fill = faculty แต่รอบที่เราแก้ไข โดยการเน้นแค่คณะที่มากที่สุด พอถึงคำสั่ง fill = เราจะใส่เป็น is_top_total & is_top_per_student ตามลำดับของกราฟครับ เราก็จะได้กราฟออกมาสองใบ เป็นยอดรวมเพียวๆ 1 อัน และอัตราเฉลี่ยต่อคนอีก 1 อันครับ ตอนแรกที่ AI มา มันได้เป็นอัตราส่วนมาเลยครับ แต่คำใบ้ของอาจารย์คือให้ลองใช้หลายๆวิธีการนับดูด้วย เลยอยากเปรียบเทียบกันกับอีกแบบครับ ->พอได้ข้อสรุปก็ตอบคำถามว่าทำไมถึงเลือกกราฟที่แสดงอัตราเฉลี่ยต่อคน เพราะว่ามันจะไม่ bias ไปกับคณะที่มีจำนวนนิสิตเยอะครับ อัตราเฉลี่ยต่อคนจะบอกเราจริงๆครับ ว่าคณะไหนมีความต้องการที่จะยืมหนังสือหรือใช้งานหอสมุดจริงๆตามที่ได้ตอบไปในข้อที่ 1 ครับ
ถ้า knit ไม่ผ่าน เขียนไว้ตรงนี้ว่าติดตรงไหน