01ภาพรวมของกราฟนี้
Word cloud แสดงคำด้วยขนาดที่แปรตามความถี่ จุดแข็งเดียวคือดึงดูดสายตาและสื่อ "หัวข้อโดยรวม" ได้เร็ว ส่วนข้อเสียมีหลายข้อและร้ายแรง คำยาวกินพื้นที่มากกว่าคำสั้นที่ความถี่เท่ากัน ตำแหน่งไม่มีความหมาย และเทียบขนาดตัวอักษรได้แย่กว่าความยาวแท่งมาก
เปรียบเทียบให้เห็นภาพ
เหมือนป้ายโฆษณาที่ตัวใหญ่สะดุดตา แต่บอกไม่ได้ว่าใหญ่กว่ากันกี่เท่า
ใช้ที่ไหนบ้าง — ภาพเปิดของรายงานเพื่อบอกหัวข้อโดยรวม หรือสื่อสารกับผู้ชมทั่วไปที่ต้องการความรู้สึกมากกว่าตัวเลข
สร้างอย่างไร
- ขั้นที่ 1★ ตัดคำหยุดออกให้หมดก่อน
- ขั้นที่ 2รวมคำที่มีรูปต่างกันแต่ความหมายเดียวกัน
- ขั้นที่ 3ให้พื้นที่ของคำแปรตามความถี่ ไม่ใช่ความสูงตัวอักษร
- ขั้นที่ 4ใส่ตารางอันดับคำประกอบเสมอ
ตัวอย่างคลาสสิก · ข้อวิจารณ์ต่อ word cloud ในวงการแสดงข้อมูล
ผู้เชี่ยวชาญด้านการแสดงข้อมูลหลายคนวิจารณ์ word cloud ซ้ำ ๆ ว่ามันเข้ารหัสค่าด้วยช่องทางที่อ่านแย่ที่สุด และยังปนตัวแปรที่ไม่เกี่ยวข้องอย่างความยาวของคำเข้าไปด้วย ข้อสรุปที่ตรงกันคือมันเหมาะกับการตกแต่งมากกว่าการวิเคราะห์ และควรมีกราฟแท่งวางคู่เสมอ
02อธิบายภาษาคนเข้าใจง่าย ๆ
Word cloud เป็นภาพที่พบบ่อยที่สุดแบบหนึ่งในการแสดงข้อมูลข้อความ และก็เป็นภาพที่ถูกวิจารณ์หนักที่สุดด้วย
ข้อเสียข้อแรกมาจากตัวอักษรเอง คำที่ยาวกว่ากินพื้นที่มากกว่าคำสั้นที่มีความถี่เท่ากัน ทำให้คำยาวดูสำคัญกว่าโดยอัตโนมัติ
ข้อที่สองคือตำแหน่งของคำไม่มีความหมายเลย คำที่อยู่ตรงกลางไม่ได้สำคัญกว่าคำที่อยู่ขอบ แต่ผู้อ่านเกือบทุกคนคิดว่าใช่
ข้อที่สามคือคนเทียบขนาดตัวอักษรได้แย่กว่าเทียบความยาวของแท่งมาก คำที่มีความถี่ต่างกันสองเท่าอาจดูแทบไม่ต่างกันเลย
สิ่งที่มันทำได้ดีจริงคือดึงดูดสายตาและสื่อ "เรื่องนี้พูดถึงอะไร" ได้ในเสี้ยววินาที ซึ่งมีค่าในบริบทของการเล่าเรื่องกับผู้ชมทั่วไป
ข้อสรุปที่ตรงไปตรงมาคือ ถ้าคำถามคือคำไหนพบบ่อยกว่ากันเท่าไร ให้ใช้กราฟแท่งเสมอ และถ้าจะใช้ word cloud ก็ควรมีตารางอันดับคำวางคู่ไว้
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
word | คำ | ข้อความ | text | 20–200 คำ | ★ ต้องตัดคำหยุดออกก่อน |
count | ความถี่ | จำนวนนับ | size | บวกเท่านั้น | ควบคุมขนาดตัวอักษร |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ★ ตัดคำหยุดออกให้หมด ไม่อย่างนั้นภาพจะเต็มไปด้วยคำว่า "ที่" และ "และ"
- รวมรูปคำที่ความหมายเดียวกัน
- ตัดสินใจว่าจะตัดที่ความถี่เท่าไร
ค่าที่หายไป — คำที่ถูกตัดออกด้วยเกณฑ์ความถี่ต้องระบุจำนวนไว้ในคำอธิบาย
สเกลของแกน — ★ พื้นที่ของคำควรแปรตามความถี่ ซึ่งแปลว่าความสูงตัวอักษรแปรตามรากที่สอง
กราฟจะเริ่มพังเมื่อไร
เกิน 200 คำ คำเล็กอ่านไม่ออกและกินที่โดยเปล่าประโยชน์
หน้าตาไฟล์ที่ต้องเตรียม
word,count
ส่งเร็ว,331
ราคา,179
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- คำที่โดดเด่นที่สุดสองสามคำ
- ความรู้สึกโดยรวมว่าข้อความชุดนี้พูดถึงอะไร
- คำที่ไม่คาดคิดว่าจะปรากฏในชุดข้อมูลนี้
สิ่งที่กราฟนี้ตอบไม่ได้
- ★ เทียบความถี่ระหว่างคำได้แย่มาก เพราะคนอ่านขนาดตัวอักษรไม่แม่น
- ★ คำยาวกินพื้นที่มากกว่าคำสั้นที่ความถี่เท่ากัน
- ตำแหน่งของคำไม่มีความหมายใด ๆ
- บริบทของการใช้คำนั้น
อ่านตามลำดับนี้
- ดูคำที่ใหญ่ที่สุดสองสามคำเท่านั้น
- ไม่พยายามเทียบคำที่ขนาดใกล้เคียงกัน
- ดูตารางอันดับคำที่วางคู่ไว้เพื่ออ่านค่าจริง
คำถามที่ตอบได้
- ข้อความชุดนี้พูดถึงเรื่องอะไรโดยรวม
- คำไหนเด่นที่สุด
สัญญาณว่ามีอะไรผิด
- ไม่ตัดคำหยุดออก
- ใช้ความสูงตัวอักษรแปรตรงกับความถี่
- ไม่มีตารางหรือกราฟแท่งประกอบ
- หมุนคำเอียงจนอ่านยาก
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ★ วางกราฟแท่งหรือตารางอันดับคำไว้คู่กันเสมอ
- ระบุว่าตัดคำหยุดอะไรออกบ้าง
- ไม่หมุนคำให้เอียงเกินสี่สิบห้าองศา
รูปแบบชื่อกราฟที่ควรใช้
คำที่พบบ่อยใน <แหล่งข้อมูล> โดย <คำ> พบมากที่สุด <จำนวน> ครั้ง
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ word-cloud-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด word-cloud-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
from wordcloud import WordCloud # pip install wordcloud
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("word-cloud-sample.csv")
df["count"] = pd.to_numeric(df["count"], errors="coerce")
NOTE = "length" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
freq = dict(zip(df["word"], df["count"]))
wc = WordCloud(width=900, height=500, background_color="#fcfcfb",
colormap="Blues", prefer_horizontal=0.95, # ไม่หมุนคำมาก
font_path="THSarabunNew.ttf", # ฟอนต์ไทยจำเป็น
random_state=42).generate_from_frequencies(freq)
ax.imshow(wc, interpolation="bilinear")
ax.set_axis_off()
ax.set_title("คำที่พบบ่อย — ดูตารางอันดับประกอบเพื่ออ่านค่าจริง", loc="left", fontsize=9)
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("word-cloud.png", dpi=160)
print("เขียน word-cloud.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ขนาดตัวอักษรไม่ได้แปรตามความถี่อย่างตรงไปตรงมา — คำยาวกินพื้นที่มากกว่าคำสั้นที่ความถี่เท่ากัน
ใช้เพื่อดึงความสนใจได้ แต่ถ้าต้องการเทียบความถี่จริง ให้ใช้กราฟแท่งความถี่คำแทน
ดูข้อมูลเป็นตาราง (14 แถว)
| คำ | ความถี่ |
|---|---|
| ส่งเร็ว | 331 |
| ราคา | 179 |
| คุณภาพ | 126 |
| บริการ | 95.0 |
| แพ็กเกจ | 89.0 |
| คุ้มค่า | 62.0 |
| สวย | 61.0 |
| ช้า | 54.0 |
| ใช้ง่าย | 54.0 |
| พัง | 48.0 |
| แนะนำ | 45.0 |
| ร้านตอบไว | 45.0 |
| ประทับใจ | 33.0 |
| ผิดรุ่น | 26.0 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: หาคำยาวกับคำสั้นที่ความถี่ใกล้เคียงกัน จะเห็นว่าคำยาวกินพื้นที่มากกว่ามาก — นี่คือการบิดที่ติดมากับรูปแบบนี้
ข้อควรระวัง
- ★ ใช้ตอบคำถามเชิงปริมาณ ทั้งที่อ่านค่าได้แย่ที่สุดแบบหนึ่ง
- ไม่ตัดคำหยุดออก ทำให้ภาพเต็มไปด้วยคำที่ไม่มีความหมาย
- ใช้ความสูงตัวอักษรแปรตรงกับความถี่ ทำให้คำเด่นดูใหญ่เกินจริงมาก
- หมุนคำเอียงหลายทิศเพื่อความสวยงาม ซึ่งทำให้อ่านยากขึ้นโดยไม่ได้อะไรกลับมา
เมื่อไหร่ไม่ควรใช้กราฟนี้
- ต้องเทียบความถี่ของคำ→ใช้แทน: word-frequency-bar
- ต้องดูว่าคำถูกใช้ในบริบทไหน→ใช้แทน: kwic-view
- ต้องเทียบคำข้ามเอกสารหลายชุด→ใช้แทน: term-document-heatmap