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

กราฟขั้นบันไดStep Chart

ค่าคงที่จนกว่าจะมีการเปลี่ยน ไม่ได้ไหลต่อเนื่อง

2
ต่อยอดโดยตรงควรรู้ก่อน · อ่านกราฟเส้นเป็น
ลองเล่น

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

Step chart แสดงค่าที่คงที่ในช่วงหนึ่งแล้วเปลี่ยนแบบกระโดด ต่างจากกราฟเส้นที่ลากเฉียงซึ่งอ้างว่าค่าค่อย ๆ เปลี่ยนระหว่างสองจุด การใช้กราฟเส้นกับข้อมูลแบบนี้จึงเป็นการสื่อสิ่งที่ไม่จริง

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

เหมือนค่าโดยสารรถเมล์ที่คงที่มาหลายปีแล้วปรับขึ้นในวันหนึ่ง ระหว่างนั้นราคาไม่ได้ค่อย ๆ ขยับทีละสตางค์

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

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

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

ตัวอย่างคลาสสิก · กราฟอัตราดอกเบี้ยนโยบายของธนาคารกลาง

ธนาคารกลางประกาศอัตราดอกเบี้ยเป็นรอบ และอัตรานั้นมีผลคงที่จนกว่าจะมีการประชุมครั้งถัดไป การวาดด้วยกราฟเส้นเฉียงจะสื่อว่าดอกเบี้ยค่อย ๆ ขยับทุกวัน ซึ่งผิดข้อเท็จจริง กราฟขั้นบันไดจึงเป็นรูปแบบมาตรฐานของข้อมูลชนิดนี้

Federal Reserve Economic Data · Policy rate

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

ข้อมูลบางอย่างไม่ได้ไหลต่อเนื่อง แต่คงที่อยู่ระยะหนึ่งแล้วกระโดดเปลี่ยน เช่น ราคาที่ปรับปีละครั้ง หรืออัตราดอกเบี้ยที่ประกาศเป็นรอบ

ถ้าเราใช้กราฟเส้นธรรมดากับข้อมูลแบบนี้ เส้นเฉียงระหว่างสองจุดจะสื่อว่าค่าค่อย ๆ ขยับตลอดช่วง ซึ่งไม่เป็นความจริงเลย และอาจทำให้คนอ่านค่าผิดในช่วงกลาง

Step chart แก้ด้วยการลากเส้นแนวนอนจนถึงวันที่เปลี่ยนจริง แล้วค่อยกระโดดในแนวตั้ง ภาพที่ได้จึงตรงกับความจริงทุกจุดเวลา

ประโยชน์ที่ตามมาคือ "ความยาวของขั้น" กลายเป็นข้อมูลด้วย ขั้นยาวแปลว่าค่านั้นอยู่นาน ขั้นสั้นแปลว่าเปลี่ยนบ่อย ซึ่งกราฟเส้นบอกไม่ได้

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

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

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

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

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
dateวันที่มีการเปลี่ยนเวลาx5–60 จุดเปลี่ยนควรเป็นวันที่ค่าเปลี่ยนจริง ไม่ใช่วันที่สุ่มเก็บข้อมูล
valueค่าใหม่ตัวเลขต่อเนื่องyต่อเนื่องค่าที่มีผลตั้งแต่วันที่ระบุจนถึงวันที่เปลี่ยนครั้งถัดไป

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

  1. ตรวจว่าค่าเปลี่ยนเป็นครั้งจริง
  2. เก็บเฉพาะจุดที่ค่าเปลี่ยน ไม่ต้องเก็บทุกวัน
  3. ระบุว่าค่าใหม่มีผลตั้งแต่เมื่อใด

ค่าที่หายไป — ช่วงที่ไม่รู้ค่าต้องหักเส้น ห้ามลากขั้นต่อเนื่องเพราะจะอ้างว่าค่าคงเดิมทั้งที่ไม่รู้

สเกลของแกน — linear เป็นหลัก ใช้ log ได้ถ้าค่ากินหลายเท่า

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

ถ้าค่าเปลี่ยนแทบทุกจุดเวลา ขั้นจะสั้นจนกลายเป็นเส้นธรรมดา — ใช้ line-chart แทน

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

date,value

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

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

  • ค่าคงที่อยู่ที่ระดับไหนในแต่ละช่วง
  • ขนาดของการกระโดดแต่ละครั้ง
  • ความถี่ของการเปลี่ยน จากความยาวของขั้น

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

  • ไม่บอกว่าทำไมถึงเปลี่ยน
  • ไม่เหมาะกับข้อมูลที่เปลี่ยนต่อเนื่องจริง ๆ

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

  1. หาระดับของขั้นปัจจุบัน
  2. ดูความยาวของขั้นเพื่อรู้ว่าค่านั้นอยู่มานานแค่ไหน
  3. ดูขนาดของการกระโดดแต่ละครั้ง

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

  • ณ วันนี้ค่าเท่าไร
  • เปลี่ยนครั้งล่าสุดเมื่อไรและเปลี่ยนไปเท่าไร
  • ค่านี้อยู่มานานแค่ไหนแล้ว

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

  • ใช้กับข้อมูลที่เปลี่ยนต่อเนื่อง ซึ่งขั้นจะเป็นการบิดเช่นกัน
  • ไม่ระบุว่าค่าใหม่มีผลตั้งแต่เมื่อไร

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

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

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

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

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

<ตัวชี้วัด> คงที่ที่ <ค่า> มา <ระยะเวลา> ก่อนปรับเป็น <ค่าใหม่> เมื่อ <วันที่>

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

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

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

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

df = pd.read_csv("step-chart-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
SMOOTH = 1   # ← ค่าจาก Playground

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

df["date"] = pd.to_datetime(df["date"])
d = df.sort_values("date")
ax.step(d["date"], d["value"], where="post", color=C1, linewidth=2)   # post = ค่าใหม่มีผลตั้งแต่วันนั้น
ax.scatter(d["date"], d["value"], color=C1, s=26, zorder=3)
ax.set_ylabel("ค่า"); ax.grid(axis="y", alpha=0.25); ax.set_axisbelow(True)
fig.autofmt_xdate()

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

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

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

ข้อมูลตัวอย่าง · 18 แถว · seed 17● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
ลองทำให้ขั้นเรียบขึ้น
100105110115120125ก.พ. 68เม.ย. 681/1/2568 · 1018/1/2568 · 10115/1/2568 · 10022/1/2568 · 10229/1/2568 · 1035/2/2568 · 10412/2/2568 · 10719/2/2568 · 10926/2/2568 · 1095/3/2568 · 11212/3/2568 · 11619/3/2568 · 12126/3/2568 · 1182/4/2568 · 1179/4/2568 · 11416/4/2568 · 11323/4/2568 · 11430/4/2568 · 119119
เปลี่ยนจากจุดเริ่ม+18.0%
จุดสูงสุด121 · 19/3/2568
ค่าเฉลี่ย110
ดูข้อมูลเป็นตาราง (18 แถว)
กราฟขั้นบันได 18 จุดเวลา เปลี่ยนแปลง 18.0% จากจุดเริ่ม
วันที่ค่า
1/1/2568101
8/1/2568101
15/1/2568100
22/1/2568102
29/1/2568103
5/2/2568104
12/2/2568107
19/2/2568109
26/2/2568109
5/3/2568112
12/3/2568116
19/3/2568121
26/3/2568118
2/4/2568117
9/4/2568114
16/4/2568113
23/4/2568114
30/4/2568119

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

  • หน้าต่างค่าเฉลี่ยเคลื่อนที่: เพิ่มค่าแล้วจะเห็นว่าขั้นเริ่มกลายเป็นทางลาด ซึ่งทำลายเหตุผลเดียวที่ใช้กราฟขั้นบันไดตั้งแต่แรก

ข้อควรระวัง

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

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

  • ค่าเปลี่ยนแปลงต่อเนื่องจริงใช้แทน: line-chart
  • มีจุดเปลี่ยนน้อยมากเพียง 2-3 ครั้งใช้แทน: slope-chart หรือเขียนเป็นข้อความ
  • ต้องการเน้นปริมาณสะสมใช้แทน: area-chart ที่ใช้ curve แบบขั้น

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

เทคนิคถัดไป · กราฟจิ๋ว