เทคนิคที่ 013 · PYTHON / JAVASCRIPT

กราฟน้ำตกWaterfall Chart

อธิบายว่าจากยอดต้นงวดกลายเป็นยอดปลายงวดได้อย่างไร

3
ผสานหลายแนวคิดควรรู้ก่อน · อ่านกราฟแท่งเป็น
ลองเล่น

01ภาพรวมของกราฟนี้

Waterfall chart ตอบคำถามว่า "ทำไมยอดถึงเปลี่ยนจาก A เป็น B" โดยแตกส่วนต่างออกเป็นขั้นย่อยที่บวกและลบ แท่งแต่ละขั้นลอยอยู่ที่ระดับสะสม ทำให้มองเห็นเส้นทางของตัวเลขตั้งแต่ต้นจนจบ

เปรียบเทียบให้เห็นภาพ

เหมือนใบเสร็จที่เริ่มจากยอดรวม แล้วมีบรรทัดบวกค่าบริการและลบส่วนลด จนได้ยอดสุดท้าย เพียงแต่วาดเป็นภาพให้เห็นน้ำหนักของแต่ละบรรทัด

ใช้ที่ไหนบ้าง — อธิบายการเปลี่ยนแปลงของกำไร วิเคราะห์ที่มาของการเติบโตของผู้ใช้ หรือแจกแจงส่วนต่างงบประมาณ

สร้างอย่างไร

  1. ขั้นที่ 1กำหนดยอดตั้งต้นและยอดปลายทาง
  2. ขั้นที่ 2แตกส่วนต่างเป็นขั้นที่อธิบายได้
  3. ขั้นที่ 3เรียงขั้นตามลำดับที่มีเหตุผล
  4. ขั้นที่ 4ปิดท้ายด้วยแท่งยอดรวม

ตัวอย่างคลาสสิก · กราฟสะพานอธิบายการเปลี่ยนแปลงของกำไรในรายงานประจำปี

บริษัทจดทะเบียนมักต้องอธิบายให้นักลงทุนเข้าใจว่ากำไรเปลี่ยนจากปีก่อนเพราะอะไร waterfall chart กลายเป็นรูปแบบมาตรฐานของงานนี้เพราะบังคับให้ผู้เขียนแตกส่วนต่างออกมาให้ครบทุกบาท จะซ่อนส่วนที่อธิบายไม่ได้ไว้เฉย ๆ ไม่ได้

Financial Times · Visual Vocabulary

02อธิบายภาษาคนเข้าใจง่าย ๆ

เวลาบอกว่ากำไรปีนี้ลดลง 12% คำถามถัดไปที่ทุกคนถามคือ "เพราะอะไร" กราฟแท่งธรรมดาตอบไม่ได้ เพราะมันแสดงแค่สองยอดโดยไม่บอกว่าอะไรอยู่ระหว่างกลาง

Waterfall แตกส่วนต่างออกเป็นขั้น ๆ เช่น ลูกค้าใหม่ทำให้เพิ่ม ส่วนลดทำให้ลด ลูกค้าเลิกใช้ทำให้ลด ทุกขั้นวางต่อกันเหมือนบันไดจากยอดแรกไปยอดสุดท้าย

สิ่งที่ทำให้อ่านง่ายคือสี แท่งที่ดันขึ้นใช้สีหนึ่ง แท่งที่ดึงลงใช้อีกสีหนึ่ง และแท่งยอดรวมใช้สีกลาง ผู้อ่านจึงแยกออกทันทีโดยไม่ต้องดูเครื่องหมาย

ข้อบังคับที่สำคัญคือทุกขั้นต้องบวกกันแล้วได้ส่วนต่างจริงพอดี ถ้ามีส่วนที่อธิบายไม่ได้ ต้องใส่แท่ง "อื่น ๆ" ไว้ ห้ามปัดทิ้งเงียบ ๆ เพราะจะทำให้ภาพโกหก

ลำดับของขั้นเป็นการตัดสินใจเชิงบรรณาธิการ เรียงตามขนาดจะเห็นตัวที่สำคัญก่อน เรียงตามกระบวนการจริงจะเล่าเรื่องได้ดีกว่า ไม่ว่าเลือกแบบไหนต้องเขียนบอก

03ข้อมูลที่ต้องใช้

รูปทรงของข้อมูลตารางแบบยาว (หนึ่งแถวหนึ่งสังเกต)
จำนวนมิติที่เข้ารหัสได้2 มิติ
จำนวนแถวที่เหมาะ4–8 ขั้นขั้นต่ำ 3 แถว
เส้นฐานศูนย์ต้องเริ่มที่ศูนย์แท่งยอดรวมสื่อความยาวจากศูนย์ และความสูงของขั้นต้องเทียบกันได้

คอลัมน์ที่ต้องเตรียม

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
stepขั้นตอนมีลำดับx4–10 ขั้นลำดับมีความหมาย ห้ามเรียงใหม่ตามใจ
deltaส่วนเปลี่ยนของขั้นนั้นตัวเลขต่อเนื่องyบวกหรือลบขั้นแรกคือยอดตั้งต้น ขั้นที่เหลือคือส่วนเปลี่ยน

ต้องเตรียมข้อมูลอย่างไรก่อนวาด

  1. ตรวจว่าผลรวมของทุกขั้นเท่ากับส่วนต่างจริง
  2. รวมขั้นที่เล็กกว่า 3% เป็น "อื่น ๆ"
  3. ตัดสินใจลำดับของขั้นและเขียนเหตุผล

ค่าที่หายไป — ส่วนที่อธิบายไม่ได้ต้องใส่เป็นแท่ง "อื่น ๆ" หรือ "ยังอธิบายไม่ได้" เสมอ การละทิ้งจะทำให้บันไดไปไม่ถึงยอดปลาย

สเกลของแกน — linear และควรให้เห็นเส้นศูนย์ในภาพ

กราฟจะเริ่มพังเมื่อไร

เกิน 12 ขั้น ผู้อ่านจะตามเส้นทางไม่ไหว — รวมขั้นเล็กเป็น "อื่น ๆ"

หน้าตาไฟล์ที่ต้องเตรียม

step,delta

04อ่านแล้วเห็นอะไร

สิ่งที่เห็นได้จากภาพ

  • ขั้นไหนดันยอดขึ้นมากที่สุด
  • ขั้นไหนดึงยอดลงมากที่สุด
  • ผลลัพธ์สุดท้ายเทียบกับยอดตั้งต้น

สิ่งที่กราฟนี้ตอบไม่ได้

  • ไม่บอกว่าขั้นเหล่านี้เกิดขึ้นเมื่อไรหรือพร้อมกันหรือไม่
  • ไม่บอกว่าขั้นต่าง ๆ ส่งผลต่อกันหรือเป็นอิสระ

อ่านตามลำดับนี้

  1. เริ่มที่แท่งซ้ายสุดซึ่งคือยอดตั้งต้น
  2. ไล่ตามบันไดทีละขั้นและสังเกตสี
  3. จบที่แท่งขวาสุดซึ่งคือยอดปลาย

คำถามที่ตอบได้

  • ทำไมยอดถึงเปลี่ยน
  • ถ้าแก้ขั้นที่แย่ที่สุดได้จะช่วยเท่าไร
  • ตัวบวกชนะตัวลบหรือไม่

สัญญาณว่ามีอะไรผิด

  • ผลรวมของขั้นไม่เท่ากับส่วนต่างจริง
  • ไม่มีแท่งยอดรวมปิดท้าย ทำให้ไม่รู้ว่าจบที่เท่าไร

05เหมาะกับการนำเสนอแบบไหน

ผู้ชมที่เหมาะผู้บริหารและทีมการเงินที่ต้องการคำอธิบาย ไม่ใช่แค่ตัวเลข
เวลาที่ผู้ชมต้องใช้ไม่กี่วินาที
ขนาดเล็กสุดที่ยังอ่านได้440×280 px
สไลด์ผู้บริหาร
รายงานเชิงวิเคราะห์
สิ่งพิมพ์
dashboard ที่อัปเดตตลอดต้องอ่านเป็นเรื่องเล่าตั้งแต่ต้นจนจบ ไม่เหมาะกับการเหลือบดู
มือถือบันไดต้องการความกว้างพอที่ทุกขั้นจะเห็นได้

ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย

  1. เขียนตัวเลขบวกลบไว้บนทุกขั้น
  2. ลากเส้นประเชื่อมระหว่างขั้นเพื่อให้ตามบันไดได้ง่าย
  3. เน้นขั้นที่ดึงลงมากที่สุดด้วยสีเข้ม

รูปแบบชื่อกราฟที่ควรใช้

ยอดลดจาก <ต้น> เหลือ <ปลาย> โดย <ขั้น> เป็นตัวดึงลงมากที่สุดที่ <ค่า>

06เอาไปใช้ต่อ

โค้ดทุกชิ้นอ่านไฟล์ waterfall-chart-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง

# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด waterfall-chart-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg")   # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a"   # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"

df = pd.read_csv("waterfall-chart-sample.csv")
df["delta"] = pd.to_numeric(df["delta"], errors="coerce")
NOTE = "path"   # ← ค่าจาก Playground

fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)

vals = df["delta"].to_numpy()
starts = np.concatenate([[0], np.cumsum(vals)[:-1]])
starts[0] = 0
colors = ["#256abf"] + ["#008300" if v >= 0 else "#e34948" for v in vals[1:]]
ax.bar(df["step"], vals, bottom=starts, color=colors, width=0.62)
total = vals.sum()
ax.bar(["ยอดปลายงวด"], [total], color="#256abf", width=0.62)   # ต้องมีแท่งยอดรวมปิดท้าย
ax.axhline(0, color=INK, linewidth=1)
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")

ax.spines[["top", "right"]].set_visible(False)   # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("waterfall-chart.png", dpi=160)
print("เขียน waterfall-chart.png แล้ว ·", len(df), "แถว")

ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*" · ทดสอบกับเวอร์ชัน 3.10

07ลองเล่นเพื่อเข้าใจ

ข้อมูลตัวอย่าง · 6 แถว · seed 13● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
ไล่จากแท่งซ้ายสุดไปขวาสุด
เพิ่มลดยอดรวม
0.00100200300400500600ยอดต้นปีลูกค้าใหม่ขายเพิ่มลดราคาลูกค้าเลิกใช้คืนสินค้ายอดปลายปียอดต้นปี · 420ลูกค้าใหม่ · +47.0ขายเพิ่ม · +62.0ลดราคา · -80.0ลูกค้าเลิกใช้ · -40.0คืนสินค้า · -33.0376
ยอดสุดท้าย376
ตัวที่ดึงลงมากสุดลดราคา
ผลรวมส่วนบวก109
ดูข้อมูลเป็นตาราง (6 แถว)
waterfall chart จาก 420 เป็น 376
ขั้นส่วนเปลี่ยนยอดสะสม
ยอดต้นปี420420
ลูกค้าใหม่47.0467
ขายเพิ่ม62.0529
ลดราคา-80.0449
ลูกค้าเลิกใช้-40.0409
คืนสินค้า-33.0376

ลองแล้วจะเห็นอะไร

  • สังเกตอะไร: สังเกตว่าแท่งกลาง ๆ ลอยอยู่คนละระดับ การเทียบขนาดของสองขั้นที่ไม่ติดกันจึงยากกว่าที่คิด

ข้อควรระวัง

  1. ผลรวมของขั้นไม่เท่ากับส่วนต่างจริง ทำให้บันไดไปไม่ถึงยอดปลาย
  2. ใส่ขั้นมากเกินไปจนผู้อ่านตามเรื่องไม่ทัน
  3. ใช้สีที่ไม่ได้แยกบวกกับลบอย่างชัดเจน
  4. จัดลำดับขั้นใหม่เพื่อให้ข้อสรุปดูดีขึ้น ซึ่งเป็นการบิดเรื่องเล่า

เมื่อไหร่ไม่ควรใช้กราฟนี้

  • ต้องการดูองค์ประกอบ ณ จุดเวลาเดียวใช้แทน: stacked-bar หรือ treemap
  • มีหลายช่วงเวลาต่อเนื่องใช้แทน: line-chart หรือ stacked-area
  • ขั้นแต่ละขั้นคือการหลุดของคนในกรวยใช้แทน: funnel-chart

กราฟที่เกี่ยวข้อง

เทคนิคถัดไป · กราฟไอคอน