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(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 เล่ม จึงสรุปว่าเป็นคณะที่ใช้งานมากที่สุด
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 บรรทัด — แนะนำเดือนไหน เพราะอะไร)
สำหรับเรามองว่า ควรจัดในเดือนมิถุนายนเพราะเป็นช่วงที่นิสิตยืมหนังสือน้อยที่สุด ดังนั้นถ้าเราจัดกิจกรรมในช่วงเดือนที่ว่า เราจะช่วยกระตุ้นให้นิสิตหันมาใช้บริการห้องสมุดได้มากขึ้น
# 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
)
# 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 ซึ่งเป็นจำนวนของเดือนไม่ใช่จำนวนผู้ตอบประเมินจริง
prompt ที่ใช้ (คัดลอกมาเต็ม ๆ อย่างน้อย 1 อัน)
ช่วยเขียนโค้ด R ทำ Interactive Dashboard และปรับสีสเกลกลุ่มคณะเป็นโทนฟ้าและเขียว
สิ่งที่แก้จากที่ AI ให้มา และทำไมต้องแก้
ปรับแก้การนับจำนวนผู้ตอบในกราฟข้อ 4 ให้ตรงกับโครงสร้างข้อมูลจริงในไฟล์ lib และขยับระยะห่างข้อความชื่อแกน Y เพื่อไม่ให้ทับสเกลตัวเลข และเพื่อให้สามารถ Knit เอกสารผ่านได้โดยไม่ติด Error
ถ้า knit ไม่ผ่าน เขียนไว้ตรงนี้ว่าติดตรงไหน