8  การสร้างกราฟเชิงโต้ตอบสำหรับนักเศรษฐศาสตร์

Modified

April 29, 2026

Keywords

Python for Economics, Computational Economics, Applied Econometrics, Python สำหรับเศรษฐศาสตร์, เศรษฐศาสตร์คำนวณ, เศรษฐมิติเชิงประยุกต์

ในบทที่ผ่านมา เราได้เรียนรู้การสร้างกราฟภาพนิ่งที่สวยงามเพื่อใช้ในสื่อสิ่งพิมพ์ แต่ในโลกของการทำงานจริงที่ต้องมีการนำเสนอผ่านเว็บไซต์ หรือการวิเคราะห์ข้อมูลเชิงลึก (Exploratory Data Analysis: EDA) กราฟที่โต้ตอบได้จะเข้ามาตอบโจทย์ที่กราฟภาพนิ่งทำไม่ได้

Importantเมื่อไหร่ที่ควรเลือกใช้ Interactive Plot?

นักเศรษฐศาสตร์ควรพิจารณาใช้กราฟเชิงโต้ตอบในสถานการณ์ดังต่อไปนี้:

  1. เมื่อข้อมูลมีจุดหนาแน่นเกินไป (Data Density): กราฟภาพนิ่งมักจะมีปัญหาเมื่อจุดข้อมูลซ้อนทับกัน (Overplotting) การใช้ Interactive Plot จะช่วยให้ผู้อ่านสามารถซูม (Zoom) เข้าไปดูรายละเอียดเฉพาะจุดได้

  2. เมื่อต้องการความแม่นยำรายจุด (Precision): ในกราฟภาพนิ่ง ผู้อ่านต้อง “กะสายตา” จากแกน X และ Y เพื่อหาค่า แต่กราฟโต้ตอบช่วยให้ผู้อ่านนำเมาส์ไปชี้ (Hover) เพื่อดูตัวเลขทศนิยมที่แน่นอนได้ทันที

  3. เมื่อต้องการเปรียบเทียบข้อมูลหลายมิติ: กราฟโต้ตอบช่วยให้เราสามารถปิด-เปิด (Filter) ชุดข้อมูลบางส่วนจาก Legend ได้ ทำให้การเปรียบเทียบตัวแปรเศรษฐกิจหลายตัวในกราฟเดียวทำได้ง่ายและไม่สับสน

  4. การนำเสนอผ่าน Digital Platform: หากผลงานวิจัยถูกเผยแพร่ในรูปแบบ HTML Book, Website หรือ Dashboard การใช้ Interactive Plot จะสร้างความน่าเชื่อถือและเพิ่มประสบการณ์การรับรู้ข้อมูล (User Experience) ได้ดีกว่าภาพนิ่ง

Tipการเตรียมความพร้อมและการติดตั้ง

ก่อนเริ่มใช้งาน นักศึกษาจำเป็นต้องติดตั้งไลบรารี Plotly และ Kaleido (สำหรับการแสดงผลในไฟล์ PDF) ผ่าน Terminal ดังนี้:

pip install plotly kaleido

8.1 การสร้างกราฟอนุกรมเวลาแบบโต้ตอบ (Interactive Time Series)

จุดเด่นที่สุดของ Plotly ในงานเศรษฐศาสตร์คือการจัดการข้อมูลอนุกรมเวลาที่มีจำนวนมาก เช่น ข้อมูลราคารายวันย้อนหลังหลายปี

Note: กราฟด้านล่างเป็นแบบ Interactive ท่านสามารถนำเมาส์ไปชี้เพื่อดูค่าหรือซูมข้อมูลได้

คลิกเพื่อดูโค้ดไพธอน
import plotly.express as px
import yfinance as yf

# 1. เตรียมข้อมูล
df = yf.download("^SET.BK", period="2y")
df = df[['Close']].copy()
df.columns = ['Price']
df = df.reset_index()

# 2. สร้างกราฟ
fig = px.line(df, x='Date', y='Price', title='SET Index Analysis')
fig.update_layout(xaxis_title="Timeline", yaxis_title="Index Points", hovermode="x unified")

8.2 การวิเคราะห์ความสัมพันธ์ 3 มิติ (3D Macroeconomic Analysis)

ในกรณีที่ตัวแปรทางเศรษฐศาสตร์มีมากกว่า 2 มิติ เช่น การพิจารณาความสัมพันธ์ระหว่าง การเติบโต (GDP), เงินเฟ้อ (Inflation) และ การว่างงาน (Unemployment) กราฟ 3 มิติจะช่วยให้ผู้อ่านเห็นภาพรวมของระบบเศรษฐกิจได้ครบถ้วนกว่ากราฟ 2 มิติแบบปกติ

คลิกเพื่อดูโค้ดไพธอน
import pandas as pd
import plotly.express as px

# 1. เตรียมข้อมูล Economic Indicators
data = {
    'Country': ['A', 'B', 'C', 'D', 'E'],
    'GDP_Growth': [2.5, 3.8, 1.2, 4.5, 0.5],
    'Inflation': [1.5, 2.0, 4.5, 1.8, 8.0],
    'Unemployment': [4.0, 3.5, 7.0, 2.5, 12.0]
}
df_econ = pd.DataFrame(data)

# 2. สร้างโครงสร้างกราฟ 3 มิติ
fig = px.scatter_3d(df_econ, x='GDP_Growth', y='Inflation', z='Unemployment',
                    color='GDP_Growth', text='Country',
                    title='3D Macroeconomic Indicators Analysis')

Interactive View: ท่านสามารถคลิกและลากเมาส์เพื่อหมุนดูความสัมพันธ์ในมุมต่าง ๆ ได้

คลิกเพื่อดูโค้ดไพธอน
# แสดงผลแบบ Interactive สำหรับ HTML
fig.show()

8.3 แผนที่เศรษฐกิจโลก (Choropleth Maps)

การวิเคราะห์เชิงพื้นที่ (Spatial Economics) เป็นอีกหนึ่งส่วนที่ Plotly ทำงานได้ดีเยี่ยม ผู้อ่านสามารถสร้างแผนที่โลกเพื่อเปรียบเทียบข้อมูลรายประเทศได้ทันที

คลิกเพื่อดูโค้ดไพธอน
# ใช้ข้อมูล Gapminder จากชุดข้อมูลตัวอย่างของ Plotly
df_gap = px.data.gapminder().query("year == 2007")

fig_map = px.choropleth(df_gap, locations="iso_alpha",
                        color="gdpPercap", 
                        hover_name="country",
                        projection="natural earth",
                        title="Global GDP per Capita Analysis")
คลิกเพื่อดูโค้ดไพธอน
fig_map.show()

สำหรับการจัดการฟังก์ชันการผลิต (Production Function) ซึ่งเป็นกราฟแบบ Surface Plot 3 มิติ เพื่อให้แสดงผลได้ทั้งใน HTML Book และ Typst/PDF โดยใช้คำสั่ง :::: visible ผู้อ่านสามารถวางโครงสร้างเนื้อหาในไฟล์ ch8.qmd ได้ดังนี้ครับ

8.4 การจำลองฟังก์ชันการผลิต (Visualizing Production Function)

ในทางเศรษฐศาสตร์ทฤษฎี การทำความเข้าใจฟังก์ชันการผลิต เช่น Cobb-Douglas Production Function มักจะมีความซับซ้อนเนื่องจากเกี่ยวข้องกับปัจจัยนำเข้าหลายตัว การใช้กราฟพื้นผิว 3 มิติ (Surface Plot) จะช่วยให้ผู้อ่านเห็นภาพการเปลี่ยนแปลงของผลผลิต (Output) เมื่อมีการปรับเปลี่ยนแรงงาน (Labor) และทุน (Capital) พร้อมกัน

คลิกเพื่อดูโค้ดไพธอน
import plotly.graph_objects as go
import numpy as np

# 1. จำลองข้อมูลตามทฤษฎี Cobb-Douglas: Q = A * L^alpha * K^beta
l_space = np.linspace(1, 100, 50) # Labor
k_space = np.linspace(1, 100, 50) # Capital
L, K = np.meshgrid(l_space, k_space)

A = 1
alpha = 0.5
beta = 0.3
Q = A * (L**alpha) * (K**beta) # Output (Q)

# 2. สร้างโครงสร้างกราฟพื้นผิว 3 มิติ
fig_surf = go.Figure(data=[go.Surface(z=Q, x=l_space, y=k_space, colorscale='Viridis')])

# 3. ปรับแต่งองค์ประกอบ (English Labels)
fig_surf.update_layout(
    title='Cobb-Douglas Production Function Analysis',
    scene = dict(
        xaxis_title='Labor (L)',
        yaxis_title='Capital (K)',
        zaxis_title='Output (Q)'
    ),
    width=800,
    height=700,
    margin=dict(l=65, r=50, b=65, t=90)
)

Interactive View: ท่านสามารถหมุนกราฟเพื่อดูความโค้งของฟังก์ชันผลิต และสังเกตปรากฏการณ์ Diminishing Marginal Returns ได้จากทุกมุมมอง

8.5 การวิเคราะห์กระแสข้อมูลด้วย Sankey Diagram

ในทางเศรษฐศาสตร์ เรามักต้องอธิบาย “การไหล” ของทรัพยากร เช่น การจัดสรรงบประมาณภาครัฐจากรายได้ภาษีไปสู่กระทรวงต่างๆ Sankey Diagram เป็นเครื่องมือที่ยอดเยี่ยมในการทำให้ผู้อ่านเห็นภาพปริมาณและการกระจายตัวของงบประมาณได้อย่างชัดเจน

คลิกเพื่อดูโค้ดไพธอน
import plotly.graph_objects as go

# 1. นิยามโครงสร้างการไหล (Source -> Target)
# 0: Tax Revenue, 1: Social Welfare, 2: Education, 3: Military, 4: Healthcare
fig_sankey = go.Figure(data=[go.Sankey(
    node = dict(
      pad = 15, thickness = 20,
      line = dict(color = "black", width = 0.5),
      label = ["Tax Revenue", "Social Welfare", "Education", "Military", "Healthcare"],
      color = "royalblue"
    ),
    link = dict(
      source = [0, 0, 0, 0], # ต้นทางคือ Tax Revenue ทั้งหมด
      target = [1, 2, 3, 4], # กระจายไปยังปลายทางต่างๆ
      value = [45, 25, 15, 15] # สัดส่วนงบประมาณ
  ))])

fig_sankey.update_layout(title_text="Government Budget Allocation Flow", font_size=12)

Interactive View: ท่านสามารถนำเมาส์ไปชี้ที่เส้นการไหลเพื่อดูตัวเลขงบประมาณที่แน่นอนในแต่ละสายได้

8.6 การวิเคราะห์ตลาดการเงินด้วย Candlestick Chart

สำหรับผู้อ่านที่สนใจด้านเศรษฐศาสตร์การเงิน (Financial Economics) การใช้กราฟแท่งเทียนจะช่วยให้เห็นพฤติกรรมราคาในตลาดได้ละเอียดกว่ากราฟเส้นทั่วไป เพราะแสดงทั้งราคาเปิด (Open), สูงสุด (High), ต่ำสุด (Low), และราคาปิด (Close) ในแท่งเดียว

คลิกเพื่อดูโค้ดไพธอน
import yfinance as yf
import plotly.graph_objects as go

# 1. ดึงข้อมูล (เพิ่ม auto_adjust และ multi_level_index เพื่อให้จัดการง่าย)
df_fx = yf.download("USDTHB=X", period="12mo")

# เคลียร์ปัญหา Multi-index (ย้าย Ticker ออกไป)
if isinstance(df_fx.columns, pd.MultiIndex):
    df_fx.columns = df_fx.columns.get_level_values(0)

df_fx = df_fx.reset_index()

# 2. สร้างกราฟแท่งเทียน
fig_candle = go.Figure(data=[go.Candlestick(
                x=df_fx['Date'],
                open=df_fx['Open'], 
                high=df_fx['High'],
                low=df_fx['Low'], 
                close=df_fx['Close'])])

fig_candle.update_layout(
    title="USD/THB Exchange Rate Analysis (Candlestick)",
    xaxis_title="Date",
    yaxis_title="Exchange Rate",
    xaxis_rangeslider_visible=False,
    template="plotly_white" # ช่วยให้กราฟดูสะอาดตาในตำรา
)

Interactive View: ท่านสามารถใช้เมนูเครื่องมือในการซูม (Zoom) เพื่อดูลักษณะของแท่งเทียนในช่วงเวลาที่เกิดความผันผวนสูงได้

8.6.1 การวิเคราะห์โครงสร้างด้วย Sunburst Chart

ในทางเศรษฐศาสตร์ เรามักพบข้อมูลที่มีลักษณะเป็นลำดับชั้น (Hierarchy) เช่น โครงสร้าง GDP ที่แบ่งตามภาคการผลิตหลัก (เกษตร, อุตสาหกรรม, บริการ) และในแต่ละภาคยังมีการแบ่งย่อยเป็นสาขากิจกรรมต่าง ๆ การใช้ Sunburst Chart จะช่วยให้ผู้อ่านเห็นสัดส่วนของข้อมูลจากภาพรวม (วงใน) ไปสู่รายละเอียด (วงนอก) ได้อย่างเป็นระบบ

คลิกเพื่อดูโค้ดไพธอน
import plotly.express as px
import pandas as pd

# 1. จำลองข้อมูลโครงสร้างเศรษฐกิจ (GDP Structure)
# ระบุชื่อรายการ (labels) และรายการหลักที่เป็นต้นกำเนิด (parents)
data = dict(
    labels=["GDP", "Services", "Industry", "Agriculture", 
            "Tourism", "Finance", "Automotive", "Electronics", "Rice", "Rubber"],
    parents=["", "GDP", "GDP", "GDP", 
             "Services", "Services", "Industry", "Industry", "Agriculture", "Agriculture"],
    values=[100, 50, 30, 20, 30, 20, 15, 15, 12, 8]
)

# 2. สร้างโครงสร้างกราฟ Sunburst
fig_sun = px.sunburst(
    data,
    names='labels',
    parents='parents',
    values='values',
    title="Hierarchy of National Economic Structure"
)

Interactive View: ท่านสามารถคลิกที่วงกลมแต่ละส่วนเพื่อ “เจาะลึก” (Drill-down) เข้าไปดูสัดส่วนในหมวดหมู่ย่อยนั้น ๆ ได้อย่างชัดเจน

คลิกเพื่อดูโค้ดไพธอน
# แสดงผลแบบโต้ตอบสำหรับหน้าเว็บ
fig_sun.show()