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. จัดกลุ่มและคำนวณสรุปข้อมูล
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) ไม่ใช่ยอดรวมการยืม สาเหตุที่เลือกใช้วิธีนี้เนื่องจาก แต่ละคณะมีจำนวนนิสิตไม่เท่ากัน การดูแค่ยอดยืมรวมจะทำให้คณะขนาดใหญ่ได้เปรียบ การคำนวณเป็นสัดส่วนต่อนิสิตจะช่วยให้ผู้อำนวยการเห็น “ความต้องการใช้งานจริงต่อหัว” เพื่อจัดสรรงบประมาณซื้อหนังสือเข้าคณะได้อย่างคุ้มค่าที่สุด >
# จัดลำดับเดือนตามปฏิทิน
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 บรรทัด — แนะนำเดือนไหน เพราะอะไร)
แนะนำให้จัดการส่งเสริมการอ่านในเดือน มิถุนายนต์ เนื่องจากมียอดรวมต่ำที่สุด
การจักกิจกรรมในช่วงเดือนมิถุนายนต์จะช่วยกระตุ้นการเข้าใช้บริการในชาวงที่ซบเซาที่สุดและจะไม่รบกวนช่วงที่มีการยืมหนังสือมากที่สุด
>
# ใช้ 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
# 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 คน ซึ่งน้อยกว่าคณะอื่นอย่างมาก ทำให้คะแนนสูงเกินจริงจากกลุ่มตัวอย่างที่ขนาดเล็ก ไม่สามารถนำมาเป็นตัวแทนมาตรฐานได้ >
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)
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) )
q4_summary
overall_mean <- mean(q4_summary$simple_mean, na.rm = TRUE)
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 ไม่ผ่าน เขียนไว้ตรงนี้ว่าติดตรงไหน