flowchart TD
A[<b>Ingest</b><br/>yfinance API] --> B[<b>Wrangle</b><br/>Resampling]
B --> C[<b>Integrate</b><br/>Merge GDP Data]
C --> D[<b>Transform</b><br/>Growth & Returns]
D --> E[<b>Visualize</b><br/>Dual-axis Analysis]
12 บทส่งท้าย: กรณีศึกษาการวิเคราะห์เศรษฐกิจไทย (บูรณาการความรู้จาก Data Ingestion สู่ Economic Insights)
Python for Economics, Computational Economics, Applied Econometrics, Python สำหรับเศรษฐศาสตร์, เศรษฐศาสตร์คำนวณ, เศรษฐมิติเชิงประยุกต์
ในบทส่งท้ายนี้ เราจะนำทักษะทั้งหมดที่ได้เรียนรู้มาตั้งแต่วันแรก ไม่ว่าจะเป็นการจัดการข้อมูลด้วย Pandas, การดึงข้อมูลจริงผ่าน API ด้วย yfinance, และการสื่อสารด้วยภาพผ่าน Matplotlib มาหลอมรวมกันเพื่อตอบคำถามสำคัญทางเศรษฐศาสตร์มหภาค:
12.1 กรณีศึกษาที่ 1: การวิเคราะห์พลวัตเศรษฐกิจและตลาดทุนไทย
“ตลาดหุ้นไทย (SET Index) ทำหน้าที่เป็นกระจกสะท้อน (Mirror) หรือเป็นเข็มทิศนำทาง (Leading Indicator) ของเศรษฐกิจจริงกันแน่?”
12.1.1 ️ Workflow การวิเคราะห์แบบ End-to-End
ในการทำงานจริง นักเศรษฐศาสตร์ดิจิทัลจะทำงานผ่านระบบ Pipeline ดังนี้:
12.1.2 การตั้งค่าโครงการและการดึงข้อมูล (Data Ingestion)
เราเริ่มต้นด้วยการดึงดัชนีราคาหุ้นตลาดหลักทรัพย์แห่งประเทศไทย (SET Index) โดยใช้ Ticker ^SET.BK ข้อมูลนี้เป็นแบบรายวัน (Daily) ซึ่งมีความถี่สูงกว่าข้อมูล GDP
คลิกเพื่อดูโค้ดไพธอน
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import display
# ดึงข้อมูล (แนะนำให้ใส่ auto_adjust=False เพื่อความแน่นอนของชื่อคอลัมน์)
market_raw = yf.download("^SET.BK", start="2014-01-01", end="2024-01-01", auto_adjust=False)
# ปรับแก้ตรงนี้ครับอาจารย์:
market_yearly = (
market_raw['Close']
.squeeze() # บีบให้เป็น Series ถ้ามีคอลัมน์เดียว หรือใช้ iloc[:,0]
.resample('YE')
.last()
.to_frame() # ตอนนี้จะเป็น Series แล้ว จึงใช้ to_frame() ได้ปกติ
.assign(year=lambda x: x.index.year)
.rename(columns={market_raw['Close'].columns[0] if isinstance(market_raw['Close'], pd.DataFrame) else 'Close': 'set_index'})
)
# วิธีที่ง่ายและ "Clean" ที่สุดสำหรับ Python 3.13 บ
market_yearly = (
market_raw[['Close']] # ใช้ double brackets เพื่อให้เป็น DataFrame ตั้งแต่ต้น
.resample('YE')
.last()
)
market_yearly.columns = ['set_index']
market_yearly['year'] = market_yearly.index.year
display(market_yearly.head())
[*********************100%***********************] 1 of 1 completed
| set_index | year | |
|---|---|---|
| Date | ||
| 2014-12-31 | 1497.670044 | 2014 |
| 2015-12-31 | 1288.020020 | 2015 |
| 2016-12-31 | 1542.939941 | 2016 |
| 2017-12-31 | 1753.709961 | 2017 |
| 2018-12-31 | 1563.880005 | 2018 |
12.1.3 การเตรียมข้อมูลเศรษฐกิจและการรวมข้อมูล (Data Integration)
เพื่อให้บทปฏิบัติการนี้ดำเนินไปได้อย่างสมบูรณ์ เราจะใช้ข้อมูลตัวเลข GDP ของประเทศไทย (ณ ราคาคงที่) เพื่อวิเคราะห์การเติบโตที่แท้จริงโดยปราศจากผลกระทบจากเงินเฟ้อ
คลิกเพื่อดูโค้ดไพธอน
# เตรียมข้อมูล GDP (หน่วย: ล้านล้านบาท)
gdp_data = pd.DataFrame({
"year": [2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023],
"gdp": [10.2, 10.5, 10.9, 11.3, 11.8, 12.1, 11.4, 11.6, 11.9, 12.2]
})
# รวมข้อมูลทั้งสองแหล่งเข้าด้วยกันด้วย Key 'year'
df = pd.merge(gdp_data, market_yearly, on="year")
display(df.head())| year | gdp | set_index | |
|---|---|---|---|
| 0 | 2014 | 10.2 | 1497.670044 |
| 1 | 2015 | 10.5 | 1288.020020 |
| 2 | 2016 | 10.9 | 1542.939941 |
| 3 | 2017 | 11.3 | 1753.709961 |
| 4 | 2018 | 11.8 | 1563.880005 |
12.1.4 การประมวลผลข้อมูล
เราจะคำนวณอัตราการเติบโต (Growth Rate) และผลตอบแทน (Returns) เพื่อเปรียบเทียบ “พลวัต” ของทั้งสองตัวแปร
คลิกเพื่อดูโค้ดไพธอน
df = (
df.assign(
gdp_growth = lambda x: x['gdp'].pct_change() * 100,
market_return = lambda x: x['set_index'].pct_change() * 100
)
.dropna() # ตัดปีแรกที่ไม่มีค่าเปรียบเทียบออก
)12.1.5 การแสดงผลเชิงลึก (Dual-Axis Visualization)
นักเศรษฐศาสตร์มืออาชีพมักใช้กราฟสองแกน (Dual-axis) เพื่อเปรียบเทียบตัวแปรที่มีความผันผวนต่างกัน
คลิกเพื่อดูโค้ดไพธอน
fig, ax1 = plt.subplots(figsize=(7, 4))
# แกนที่ 1: GDP Growth (Bar Chart)
ax1.bar(df['year'], df['gdp_growth'], color='#a2d2ff', alpha=0.7, label='GDP Growth (%)')
ax1.set_ylabel('Real GDP Growth (%)', color='#0077b6', fontweight='bold')
# แกนที่ 2: Market Return (Line Chart)
ax2 = ax1.twinx()
ax2.plot(df['year'], df['market_return'], color='#e63946', marker='o', linewidth=2, label='SET Return (%)')
ax2.set_ylabel('SET Index Return (%)', color='#e63946', fontweight='bold')
plt.title('Thailand Dynamics: Real GDP vs Stock Market Performance', fontsize=15)
ax1.axhline(0, color='black', linewidth=0.8, linestyle='--')
fig.legend(loc="upper left", bbox_to_anchor=(0.1, 0.9))
plt.grid(axis='y', alpha=0.2)
plt.show()12.1.6 การตีความเชิงเศรษฐศาสตร์ (Economic Synthesis)
จากการวิเคราะห์ด้วย Python เราพบข้อสังเกตที่น่าสนใจดังนี้:
Forward-Looking Nature: ตลาดหุ้น (SET Index) มักจะสะท้อนปัจจัยลบล่วงหน้า ดังจะเห็นได้จากปี 2020 ที่ตลาดหุ้นดิ่งลงอย่างรุนแรงก่อนที่ตัวเลข GDP จริงจะประกาศออกมา
Volatility Disparity: อัตราผลตอบแทนของตลาดหุ้นมีความผันผวนสูงกว่าเศรษฐกิจจริงถึง 3-5 เท่า สะท้อนว่าราคาหุ้นไม่ได้ขับเคลื่อนด้วยปัจจัยพื้นฐานเพียงอย่างเดียว แต่รวมถึงสภาพคล่องและจิตวิทยาตลาด
12.1.7 การปิดงาน: สู่การเป็นรายงานมืออาชีพ (Reporting)
หัวใจสำคัญของ Quarto คือการเปลี่ยน Code ให้กลายเป็น Document หากคุณต้องการส่งออกงานวิเคราะห์นี้เป็นไฟล์ Word (.docx) เพื่อเสนอผู้บริหาร คุณสามารถปรับเปลี่ยน YAML ที่หัวไฟล์ได้ดังนี้:
format:
docx:
toc: true
number-sections: true
highlight-style: pygments12.2 กรณีศึกษาที่ 2: เมื่อเงินเฟ้อพ่นไฟใส่ค่าเงิน (Inflation & FX Dynamics)
“ประเทศที่มีอัตราเงินเฟ้อสูงกว่า มักจะเผชิญกับค่าเงินที่อ่อนค่าลงจริงหรือไม่? และทฤษฎี PPP ยังทำงานได้ดีเพียงใดในโลกยุคใหม่?”
12.2.1 ️ Workflow การวิเคราะห์แบบ End-to-End
ในการทดสอบทฤษฎี Purchasing Power Parity (PPP) เราจะใช้กระบวนการทำงานดังนี้:
flowchart TD
A[<b>Ingest</b><br/>yfinance: USDTHB=X] --> B[<b>Wrangle</b><br/>Annual Averaging]
B --> C[<b>Integrate</b><br/>Merge Inflation Data]
C --> D[<b>Transform</b><br/>Calculate Inf. Differential]
D --> E[<b>Visualize</b><br/>Dual-axis & Area Chart]
12.2.2 การตั้งค่าโครงการและการดึงข้อมูล (Data Ingestion)
เราจะดึงข้อมูลอัตราแลกเปลี่ยน USD/THB โดยใช้ Ticker USDTHB=X ซึ่งเป็นข้อมูลความถี่รายวัน แล้วจึงนำมาหาค่าเฉลี่ยรายปีเพื่อให้สอดคล้องกับตัวเลขเงินเฟ้อ
คลิกเพื่อดูโค้ดไพธอน
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import display
# ดึงข้อมูลอัตราแลกเปลี่ยน
fx_raw = yf.download("USDTHB=X", start="2015-01-01", end="2024-01-01")
# Method Chaining
fx_yearly = (
fx_raw['Close']
.squeeze() # บังคับ DataFrame คอลัมน์เดียวให้เป็น Series ก่อน
.resample('YE')
.mean()
.to_frame()
.assign(year=lambda x: x.index.year)
)
# เปลี่ยนชื่อคอลัมน์ให้เป็น 'ex_rate' (รองรับทุกโครงสร้างชื่อจาก yfinance)
fx_yearly.columns = ['ex_rate', 'year']
display(fx_yearly.head())
[*********************100%***********************] 1 of 1 completed
| ex_rate | year | |
|---|---|---|
| Date | ||
| 2015-12-31 | 34.215303 | 2015 |
| 2016-12-31 | 35.219764 | 2016 |
| 2017-12-31 | 33.929663 | 2017 |
| 2018-12-31 | 32.307946 | 2018 |
| 2019-12-31 | 31.037386 | 2019 |
12.2.3 การเตรียมข้อมูลเศรษฐกิจและการรวมข้อมูล (Data Integration)
เราจะใช้ข้อมูลอัตราเงินเฟ้อ (CPI Inflation) ของประเทศไทยเปรียบเทียบกับสหรัฐอเมริกา เพื่อหา “ส่วนต่างของอำนาจซื้อ” (Purchasing Power Differential)
คลิกเพื่อดูโค้ดไพธอน
# เตรียมข้อมูลอัตราเงินเฟ้อ (%) - ตัวเลขโดยประมาณเพื่อการศึกษา
inflation_data = pd.DataFrame({
"year": [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023],
"inf_th": [-0.9, 0.2, 0.7, 1.1, 0.7, -0.8, 1.2, 6.1, 1.2],
"inf_us": [0.1, 1.3, 2.1, 2.4, 1.8, 1.2, 4.7, 8.0, 4.1]
})
# รวมข้อมูล FX และ Inflation เข้าด้วยกัน
df_fx = pd.merge(fx_yearly, inflation_data, on="year")
display(df_fx.head())| ex_rate | year | inf_th | inf_us | |
|---|---|---|---|---|
| 0 | 34.215303 | 2015 | -0.9 | 0.1 |
| 1 | 35.219764 | 2016 | 0.2 | 1.3 |
| 2 | 33.929663 | 2017 | 0.7 | 2.1 |
| 3 | 32.307946 | 2018 | 1.1 | 2.4 |
| 4 | 31.037386 | 2019 | 0.7 | 1.8 |
12.2.4 การประมวลผลข้อมูล
ในขั้นตอนนี้เราจะคำนวณ Inflation Differential (ส่วนต่างเงินเฟ้อ) ซึ่งตามทฤษฎี PPP หากค่านี้เป็นบวก (US Inflation > TH Inflation) ค่าเงิน USD ควรจะมีแนวโน้มอ่อนค่าลงเมื่อเทียบกับ THB
คลิกเพื่อดูโค้ดไพธอน
df_fx = df_fx.assign(
inf_diff = lambda x: x['inf_us'] - x['inf_th']
)12.2.5 การแสดงผลเชิงลึก (Visualization)
เราจะใช้กราฟผสมระหว่างเส้น (Line) สำหรับอัตราแลกเปลี่ยน และพื้นที่ (Area) สำหรับส่วนต่างเงินเฟ้อ เพื่อให้เห็นความสัมพันธ์เชิงทฤษฎี
คลิกเพื่อดูโค้ดไพธอน
fig, ax1 = plt.subplots(figsize=(7, 4))
# แกนที่ 1: อัตราแลกเปลี่ยน (Line Chart)
ax1.plot(df_fx['year'], df_fx['ex_rate'], color='#2a9d8f', marker='s', linewidth=3, label='USD/THB Rate')
ax1.set_ylabel('Exchange Rate (THB/USD)', color='#264653', fontweight='bold')
# แกนที่ 2: ส่วนต่างเงินเฟ้อ (Area Chart)
ax2 = ax1.twinx()
ax2.fill_between(df_fx['year'], df_fx['inf_diff'], color='#e9c46a', alpha=0.3, label='Inf. Differential (US-TH)')
ax2.set_ylabel('Inflation Differential (%)', color='#e76f51', fontweight='bold')
plt.title('Purchasing Power Parity Analysis: USD/THB vs Inflation', fontsize=15)
fig.legend(loc="upper left", bbox_to_anchor=(0.1, 0.9))
plt.grid(axis='y', alpha=0.2)
plt.show()12.2.6 การตีความเชิงเศรษฐศาสตร์ (Economic Synthesis)
PPP Theory vs Reality: ตามทฤษฎี PPP ระยะยาว หากเงินเฟ้อสหรัฐฯ สูงกว่าไทย ค่าเงินบาทควรจะแข็งค่าขึ้น แต่จากข้อมูลเราพบว่าปัจจัยเรื่อง อัตราดอกเบี้ย (Interest Rate) และ เงินทุนเคลื่อนย้าย มักส่งผลรุนแรงกว่าในระยะสั้น
The 2022 Shock: ในปี 2022 แม้ส่วนต่างเงินเฟ้อจะกว้างขึ้น แต่ค่าเงินบาทกลับอ่อนค่าลงอย่างรวดเร็ว สะท้อนถึงการไหลออกของเงินทุนไปหาดอลลาร์ในฐานะสินทรัพย์ปลอดภัย (Safe Haven)
12.2.7 ️ การปิดงาน: สู่การนำเสนอระดับผู้บริหาร (Reporting)
หากนักศึกษาต้องการนำเสนอผลการวิเคราะห์นี้ในห้องประชุมหรือส่งงานในรูปแบบสไลด์ PowerPoint (.pptx) Quarto สามารถจัดการให้คุณได้อย่างอัตโนมัติเพียงเปลี่ยนการตั้งค่า YAML ดังนี้:
title: "รายงานการวิเคราะห์ค่าเงินและเงินเฟ้อ"
author: "ชื่อนักศึกษา"
institute: "ชื่อคณะและสถาบัน"
date: now
date-format: long
format:
pptx:
toc: true
number-sections: trueการใช้ format: pptx ใน Quarto จะช่วยประหยัดเวลาในการ “Capture หน้าจอ” ไปวางในสไลด์ โดยระบบจะจัดวางกราฟและหัวข้อที่คุณเขียนไว้ลงในแผ่นสไลด์ให้โดยอัตโนมัติ
12.3 กรณีศึกษาที่ 3: การพิสูจน์เส้นโค้งฟิลลิปส์ในเศรษฐกิจไทย
“รัฐบาลต้องเลือกระหว่างเงินเฟ้อต่ำหรือการว่างงานต่ำจริงหรือไม่? และความสัมพันธ์นี้ยังคงอยู่หรือจางหายไปในเศรษฐกิจยุคดิจิทัล?”
12.3.1 ️ Workflow การวิเคราะห์แบบ End-to-End
ในการวิเคราะห์ความสัมพันธ์ระหว่างตัวแปรเชิงโครงสร้าง เราจะใช้กระบวนการทำงานดังนี้:
flowchart TD
A[<b>Ingest</b><br/>Unemployment & Inflation Data] --> B[<b>Wrangle</b><br/>Cleaning & Formatting]
B --> C[<b>Analyze</b><br/>Correlation Matrix]
C --> D[<b>Transform</b><br/>Polynomial Fitting]
D --> E[<b>Visualize</b><br/>Scatter Plot with Trendline]
12.3.2 การตั้งค่าโครงการและการเตรียมข้อมูล (Data Preparation)
เราจะใช้ข้อมูลอัตราว่างงานและอัตราเงินเฟ้อของไทยในช่วง 10 ปีที่ผ่านมา เพื่อตรวจสอบลักษณะของ Trade-off ทางเศรษฐกิจ
คลิกเพื่อดูโค้ดไพธอน
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import display
# เตรียมข้อมูลอัตราว่างงาน (%) และอัตราเงินเฟ้อ (%) ของไทย
data = pd.DataFrame({
"year": [2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023],
"unemployment": [0.84, 0.88, 0.94, 1.18, 1.06, 0.98, 1.69, 1.93, 1.32, 1.10],
"inflation": [1.9, -0.9, 0.2, 0.7, 1.1, 0.7, -0.8, 1.2, 6.1, 1.2]
})
display(data.head())| year | unemployment | inflation | |
|---|---|---|---|
| 0 | 2014 | 0.84 | 1.9 |
| 1 | 2015 | 0.88 | -0.9 |
| 2 | 2016 | 0.94 | 0.2 |
| 3 | 2017 | 1.18 | 0.7 |
| 4 | 2018 | 1.06 | 1.1 |
12.3.3 การประมวลผลข้อมูลและการหาความสัมพันธ์
ในทางเศรษฐมิติ เราต้องการทราบว่าตัวแปรทั้งสองมีทิศทางตรงกันข้ามกันจริงหรือไม่ ผ่านการคำนวณค่าสหสัมพันธ์ (Correlation)
คลิกเพื่อดูโค้ดไพธอน
# คำนวณค่า Correlation
correlation = data['unemployment'].corr(data['inflation'])
print(f"Correlation Coefficient: {correlation:.4f}")Correlation Coefficient: 0.0659
12.3.4 การแสดงผลเชิงลึก (Visualization)
นักเศรษฐศาสตร์มักใช้ Scatter Plot ร่วมกับเส้นแนวโน้ม (Trendline) เพื่อพิสูจน์ทฤษฎี Phillips Curve ว่ามีลักษณะลาดลง (Negative Slope) หรือไม่
คลิกเพื่อดูโค้ดไพธอน
# 1. วาดจุดข้อมูล (Actual Data)
plt.scatter(data['unemployment'], data['inflation'],
color='#e63946', s=120, alpha=0.8, edgecolors='white', label='Annual Data')
# 2. สร้างเส้น Trendline (Linear Regression)
z = np.polyfit(data['unemployment'], data['inflation'], 1)
p = np.poly1d(z)
plt.plot(data['unemployment'], p(data['unemployment']),
"r--", alpha=0.6, linewidth=2, label='Trendline')
# 3. ตกแต่งกราฟ
plt.title('Thailand: Phillips Curve Analysis (2014-2023)', fontsize=15, fontweight='bold')
plt.xlabel('Unemployment Rate (%)', fontsize=12)
plt.ylabel('Inflation Rate (%)', fontsize=12)
# ระบุจุดปี 2022 ที่เกิดภาวะผิดปกติ (Outlier)
plt.annotate('2022 Supply Shock', xy=(1.32, 6.1), xytext=(1.5, 5.5),
arrowprops=dict(facecolor='black', arrowstyle='->'), fontsize=10)
plt.grid(True, linestyle=':', alpha=0.5)
plt.legend()
plt.show()12.3.5 การตีความเชิงเศรษฐศาสตร์ (Economic Synthesis)
Flattening of Phillips Curve: จากข้อมูลไทย พบว่าเส้นแนวโน้มค่อนข้างแบน (Flat) สะท้อนว่าความเชื่อมโยงระหว่างตลาดแรงงานและเงินเฟ้อจางหายไป ซึ่งสอดคล้องกับปรากฏการณ์ทั่วโลกที่เงินเฟ้อถูกกำหนดโดยปัจจัยฝั่งอุปทาน (Supply-side) มากกว่า
Structural Change: ปี 2020-2021 แสดงให้เห็นว่าอัตราว่างงานพุ่งสูงขึ้นจากวิกฤตสุขภาพ แต่เงินเฟ้อไม่ได้ลดลงตามทฤษฎีดั้งเดิม เนื่องจากมีปัญหาการหยุดชะงักของห่วงโซ่อุปทาน (Supply Chain Disruption) แทรกซ้อน
12.3.6 การปิดงาน: สู่รายงานออนไลน์ (Interactive HTML Report)
จุดเด่นที่สุดของ Quarto คือการสร้างรายงานในรูปแบบ HTML ที่รองรับการอ่านผ่าน Web Browser ทุกชนิด และมีความเป็นมืออาชีพสูง โดยตั้งค่า YAML ดังนี้:
title: "รายงานการศึกษาเส้นโค้งฟิลลิปส์ของประเทศไทย"
author: "ชื่อนักศึกษา"
institute: "ชื่อคณะและสถาบัน"
date: now
date-format: long
format:
html:
theme: cosmo # เลือกธีมที่ดูสะอาดตาและทันสมัย
toc: true # เพิ่มสารบัญด้านข้าง
toc-location: left # ย้ายสารบัญไปไว้ด้านซ้าย
code-fold: true # ให้ผู้อ่านคลิกเพื่อดูโค้ดได้ (เพื่อความสะอาดของรายงาน)
self-contained: true # รวมทุกอย่างไว้ในไฟล์เดียวเพื่อให้ส่งต่อได้ง่ายการส่งรายงานแบบ HTML ช่วยให้ผู้อ่านสามารถซูมดูรูปภาพ คัดลอกข้อมูลจากตาราง และหากนักศึกษา ส่ไลบรารีประเภท Interactive อย่าง Plotly ลงไป รายงานฉบับนี้จะกลายเป็น Dashboard ที่มีชีวิตทันที


