Unemployment Rate Formula — สูตรคำนวณอัตราการว่างงาน 2026
อัตราการว่างงาน (Unemployment Rate) เป็นตัวชี้วัดทางเศรษฐกิจที่สำคัญที่สุดตัวหนึ่ง แสดงสัดส่วนของกำลังแรงงานที่ไม่มีงานทำแต่กำลังหางานอยู่ ใช้วัดสุขภาพของเศรษฐกิจ — อัตราว่างงานต่ำ = เศรษฐกิจดี อัตราว่างงานสูง = เศรษฐกิจมีปัญหา ธนาคารกลางและรัฐบาลใช้ตัวเลขนี้ในการกำหนดนโยบายการเงินและการคลัง บทความนี้อธิบายสูตรคำนวณ ประเภทของการว่างงาน และ Python tools สำหรับวิเคราะห์
สูตรคำนวณอัตราการว่างงาน
# formula.py — Unemployment rate formula
import json
class UnemploymentFormula:
FORMULAS = {
"basic": {
"name": "สูตรพื้นฐาน",
"formula": "Unemployment Rate = (Number of Unemployed / Labor Force) × 100",
"components": {
"unemployed": "จำนวนผู้ว่างงาน — คนที่ไม่มีงานทำ แต่กำลังหางานอยู่",
"labor_force": "กำลังแรงงาน = ผู้มีงานทำ + ผู้ว่างงาน (ไม่รวมคนที่ไม่หางาน)",
},
},
"labor_force": {
"name": "สูตรกำลังแรงงาน",
"formula": "Labor Force = Employed + Unemployed",
"note": "ไม่รวม: นักเรียน/นักศึกษา, แม่บ้าน, ผู้เกษียณ, ผู้พิการที่ทำงานไม่ได้, discouraged workers",
},
"lfpr": {
"name": "อัตราการมีส่วนร่วมของกำลังแรงงาน",
"formula": "LFPR = (Labor Force / Working Age Population) × 100",
"note": "Working Age Population = ประชากรอายุ 15-64 ปี (หรือ 15+ ในบางประเทศ)",
},
"employment_rate": {
"name": "อัตราการจ้างงาน",
"formula": "Employment Rate = (Employed / Working Age Population) × 100",
"note": "ใช้ดูว่าประชากรวัยทำงานมีงานทำกี่เปอร์เซ็นต์",
},
}
EXAMPLE = {
"country": "ประเทศ A",
"working_age_pop": 50000000,
"labor_force": 38000000,
"employed": 36000000,
"unemployed": 2000000,
"not_in_labor_force": 12000000,
"unemployment_rate": "2,000,000 / 38,000,000 × 100 = 5.26%",
"lfpr": "38,000,000 / 50,000,000 × 100 = 76%",
"employment_rate": "36,000,000 / 50,000,000 × 100 = 72%",
}
def show_formulas(self):
print("=== Unemployment Rate Formulas ===\n")
for key, f in self.FORMULAS.items():
print(f"[{f['name']}]")
print(f" {f['formula']}")
print()
def show_example(self):
print("=== Calculation Example ===")
for key, val in self.EXAMPLE.items():
print(f" [{key}] {val}")
formulas = UnemploymentFormula()
formulas.show_formulas()
formulas.show_example()
ประเภทของการว่างงาน
# types.py — Types of unemployment
import json
class UnemploymentTypes:
TYPES = {
"frictional": {
"name": "Frictional Unemployment (ว่างงานชั่วคราว)",
"description": "คนที่กำลังเปลี่ยนงาน หรือเพิ่งเข้าสู่ตลาดแรงงาน — ระยะสั้น",
"example": "จบมหาวิทยาลัยกำลังหางาน, ลาออกจากงานเก่ารอเริ่มงานใหม่",
"duration": "สั้น (1-3 เดือน)",
"solution": "ข้อมูลตลาดแรงงานที่ดีขึ้น, job matching platforms",
},
"structural": {
"name": "Structural Unemployment (ว่างงานเชิงโครงสร้าง)",
"description": "ทักษะแรงงานไม่ตรงกับความต้องการตลาด — technology change, industry shift",
"example": "คนงานโรงงานถูกแทนที่ด้วย automation, coal miners เมื่อเปลี่ยนเป็น renewable energy",
"duration": "ยาว (6 เดือน - หลายปี)",
"solution": "Reskilling/upskilling programs, education reform",
},
"cyclical": {
"name": "Cyclical Unemployment (ว่างงานตามวัฏจักรเศรษฐกิจ)",
"description": "เกิดจากเศรษฐกิจถดถอย (recession) — demand ลด → บริษัทเลิกจ้าง",
"example": "วิกฤต COVID-19, วิกฤตการเงิน 2008",
"duration": "กลาง-ยาว (ขึ้นกับ recovery)",
"solution": "นโยบายกระตุ้นเศรษฐกิจ (fiscal/monetary policy)",
},
"seasonal": {
"name": "Seasonal Unemployment (ว่างงานตามฤดูกาล)",
"description": "งานที่มีเฉพาะบางช่วง — เกษตร, ท่องเที่ยว, construction",
"example": "คนเก็บผลไม้ตามฤดู, พนักงานรีสอร์ทช่วง low season",
"duration": "สั้น-กลาง (ตามฤดู)",
"solution": "Diversified economy, seasonal adjustment in statistics",
},
}
NATURAL_RATE = {
"definition": "Natural Rate of Unemployment = Frictional + Structural unemployment",
"value": "ปกติ 4-6% ในประเทศพัฒนาแล้ว",
"meaning": "ว่างงาน 0% เป็นไปไม่ได้ — มีคนเปลี่ยนงานเสมอ",
"full_employment": "Full Employment = อัตราว่างงานเท่ากับ natural rate (ไม่มี cyclical)",
}
def show_types(self):
print("=== Types of Unemployment ===\n")
for key, t in self.TYPES.items():
print(f"[{t['name']}]")
print(f" {t['description']}")
print(f" Duration: {t['duration']}")
print()
def show_natural(self):
print("=== Natural Rate ===")
for key, val in self.NATURAL_RATE.items():
print(f" [{key}] {val}")
types = UnemploymentTypes()
types.show_types()
types.show_natural()
Python Unemployment Calculator
# calculator.py — Python unemployment rate calculator
import json
class UnemploymentCalculator:
CODE = """
# unemployment_calc.py — Calculate and analyze unemployment rates
import json
from dataclasses import dataclass
from typing import List, Dict, Optional
@dataclass
class LaborData:
year: int
quarter: Optional[int] = None
working_age_pop: int = 0
labor_force: int = 0
employed: int = 0
unemployed: int = 0
class UnemploymentCalculator:
def __init__(self):
self.data = []
def add_data(self, data: LaborData):
# Validate
if data.labor_force == 0:
data.labor_force = data.employed + data.unemployed
if data.unemployed == 0 and data.labor_force > 0:
data.unemployed = data.labor_force - data.employed
self.data.append(data)
def unemployment_rate(self, data: LaborData):
'''Calculate unemployment rate'''
if data.labor_force == 0:
return 0
return round(data.unemployed / data.labor_force * 100, 2)
def lfpr(self, data: LaborData):
'''Labor Force Participation Rate'''
if data.working_age_pop == 0:
return 0
return round(data.labor_force / data.working_age_pop * 100, 2)
def employment_rate(self, data: LaborData):
'''Employment-to-population ratio'''
if data.working_age_pop == 0:
return 0
return round(data.employed / data.working_age_pop * 100, 2)
def calculate_all(self, data: LaborData):
'''Calculate all labor metrics'''
not_in_lf = data.working_age_pop - data.labor_force
return {
'year': data.year,
'quarter': data.quarter,
'unemployment_rate': self.unemployment_rate(data),
'lfpr': self.lfpr(data),
'employment_rate': self.employment_rate(data),
'not_in_labor_force': not_in_lf,
'not_in_lf_pct': round(not_in_lf / max(data.working_age_pop, 1) * 100, 2),
}
def trend_analysis(self):
'''Analyze unemployment trend'''
if len(self.data) < 2:
return {}
rates = [self.unemployment_rate(d) for d in self.data]
years = [d.year for d in self.data]
# Direction
recent = rates[-1]
previous = rates[-2]
direction = 'increasing' if recent > previous else 'decreasing' if recent < previous else 'stable'
# Average
avg_rate = round(sum(rates) / len(rates), 2)
return {
'current_rate': recent,
'previous_rate': previous,
'change': round(recent - previous, 2),
'direction': direction,
'average_rate': avg_rate,
'min_rate': min(rates),
'max_rate': max(rates),
'period': f'{years[0]}-{years[-1]}',
}
def okun_law(self, gdp_growth_rate, natural_unemployment=5.0):
'''Estimate unemployment change using Okun's Law'''
# Okun's Law: 1% GDP above trend = 0.5% unemployment decrease
unemployment_change = -(gdp_growth_rate - 3.0) * 0.5
estimated_rate = natural_unemployment + unemployment_change
return {
'gdp_growth': gdp_growth_rate,
'estimated_unemployment_change': round(unemployment_change, 2),
'estimated_unemployment_rate': round(max(estimated_rate, 0), 2),
'note': "Okun's Law approximation (coefficient varies by country)",
}
def phillips_curve(self, unemployment_rate, expected_inflation=2.0):
'''Estimate inflation using Phillips Curve'''
# Simplified: higher unemployment = lower inflation
natural_rate = 5.0
gap = natural_rate - unemployment_rate
inflation = expected_inflation + gap * 0.5
return {
'unemployment_rate': unemployment_rate,
'estimated_inflation': round(max(inflation, 0), 2),
'unemployment_gap': round(gap, 2),
'note': "Phillips Curve approximation — short-run relationship",
}
# calc = UnemploymentCalculator()
# data = LaborData(year=2024, working_age_pop=50_000_000,
# labor_force=38_000_000, employed=36_100_000, unemployed=1_900_000)
# calc.add_data(data)
# result = calc.calculate_all(data)
# print(json.dumps(result, indent=2))
"""
def show_code(self):
print("=== Unemployment Calculator ===")
print(self.CODE[:600])
calc = UnemploymentCalculator()
calc.show_code()
อัตราว่างงานทั่วโลก
# global.py — Global unemployment rates
import json
class GlobalUnemployment:
RATES_2024 = {
"japan": {"country": "ญี่ปุ่น", "rate": 2.5, "note": "ต่ำสุดในโลก — aging population"},
"thailand": {"country": "ไทย", "rate": 1.1, "note": "ต่ำมาก — แต่ underemployment สูง"},
"us": {"country": "สหรัฐอเมริกา", "rate": 4.0, "note": "ใกล้ full employment"},
"eu": {"country": "สหภาพยุโรป", "rate": 6.0, "note": "หลากหลาย — Spain สูง, Germany ต่ำ"},
"india": {"country": "อินเดีย", "rate": 7.5, "note": "youth unemployment สูง 20%+"},
"south_africa": {"country": "แอฟริกาใต้", "rate": 32.0, "note": "สูงที่สุดในโลก"},
"spain": {"country": "สเปน", "rate": 11.5, "note": "สูงในยุโรป — youth 28%+"},
}
THAILAND = {
"official_rate": "~1.0-1.5% (ต่ำมาก)",
"reality": "ตัวเลขอาจไม่สะท้อนความเป็นจริง — criteria กว้าง",
"underemployment": "คนทำงานไม่เต็มเวลา/ไม่ตรงสาขา สูงกว่า official unemployment",
"informal_sector": "แรงงานนอกระบบ 55%+ — ไม่ถูกนับในสถิติ",
"source": "สำนักงานสถิติแห่งชาติ (NSO) — สำรวจทุกเดือน",
}
def show_global(self):
print("=== Global Unemployment Rates (2024) ===\n")
sorted_rates = sorted(self.RATES_2024.values(), key=lambda x: x['rate'])
for r in sorted_rates:
print(f" [{r['country']}] {r['rate']}% — {r['note']}")
def show_thailand(self):
print(f"\n=== Thailand Detail ===")
for key, val in self.THAILAND.items():
print(f" [{key}] {val}")
globe = GlobalUnemployment()
globe.show_global()
globe.show_thailand()
ความสัมพันธ์กับตัวชี้วัดอื่น
# relationships.py — Relationship with other indicators
import json
class EconomicRelationships:
RELATIONSHIPS = {
"gdp": {
"name": "GDP Growth",
"relationship": "Inverse — GDP โต → ว่างงานลด (Okun's Law)",
"okun": "GDP เพิ่ม 1% เหนือ trend → ว่างงานลด ~0.5%",
},
"inflation": {
"name": "Inflation",
"relationship": "Inverse (short-run) — ว่างงานต่ำ → เงินเฟ้อสูง (Phillips Curve)",
"note": "Long-run: ไม่มี trade-off — natural rate ไม่เปลี่ยนตาม inflation",
},
"interest_rate": {
"name": "Interest Rate",
"relationship": "ดอกเบี้ยสูง → ชะลอเศรษฐกิจ → ว่างงานเพิ่ม",
"policy": "ธนาคารกลางลดดอกเบี้ยเมื่อว่างงานสูง → กระตุ้นเศรษฐกิจ",
},
"stock_market": {
"name": "Stock Market",
"relationship": "ว่างงานต่ำ → consumer spending สูง → corporate earnings ดี → หุ้นขึ้น",
"lag": "ตลาดหุ้นมักนำหน้า unemployment data 6-12 เดือน",
},
"consumer_confidence": {
"name": "Consumer Confidence",
"relationship": "ว่างงานสูง → ความเชื่อมั่นผู้บริโภคลด → spending ลด → recession",
},
}
def show_relationships(self):
print("=== Economic Relationships ===\n")
for key, r in self.RELATIONSHIPS.items():
print(f"[{r['name']}]")
print(f" {r['relationship']}")
print()
rel = EconomicRelationships()
rel.show_relationships()
FAQ - คำถามที่พบบ่อย
Q: อัตราว่างงานของไทยต่ำมาก จริงไหม?
A: ตัวเลข official ต่ำจริง (~1-1.5%) แต่มีข้อจำกัด: criteria กว้าง — ทำงาน 1 ชั่วโมง/สัปดาห์ก็นับว่ามีงาน แรงงานนอกระบบ 55%+ — ไม่ได้อยู่ในสถิติครบ Underemployment สูง — คนทำงานไม่เต็มเวลา/ไม่ตรงสาขา ดูที่ดีกว่า: อัตราว่างงาน + underemployment rate + LFPR รวมกัน
Q: Full Employment หมายความว่าว่างงาน 0% ไหม?
A: ไม่ — Full Employment = อัตราว่างงานเท่ากับ Natural Rate (4-6%) เพราะ: มี frictional unemployment เสมอ (คนเปลี่ยนงาน) มี structural unemployment เสมอ (ทักษะไม่ตรง) ว่างงาน 0% เป็นไปไม่ได้ — จะเกิดเงินเฟ้อรุนแรงก่อน (NAIRU concept)
Q: U-3 กับ U-6 ต่างกันอย่างไร?
A: U-3: อัตราว่างงาน official — ผู้ว่างงานที่กำลังหางาน U-6: อัตราว่างงานที่กว้างกว่า — รวม underemployed + marginally attached + discouraged workers U-6 สูงกว่า U-3 เสมอ (ปกติ U-6 = U-3 × 1.5-2) U-6 สะท้อนความเป็นจริงมากกว่า — ดูว่า labor market ตึงตัวแค่ไหน
Q: อัตราว่างงานส่งผลต่อการลงทุนอย่างไร?
A: ว่างงานต่ำ → เศรษฐกิจดี → หุ้นมักขึ้น แต่: ว่างงานต่ำเกินไป → เงินเฟ้อ → ธนาคารกลางขึ้นดอกเบี้ย → หุ้นอาจลง ว่างงานสูงขึ้น → ธนาคารกลางอาจลดดอกเบี้ย → พันธบัตรราคาขึ้น Nonfarm Payrolls (US): ตัวเลขที่ตลาดจับตาดูมากที่สุดทุกเดือน สำหรับเทรดเดอร์: ดู NFP report ทุกวันศุกร์แรกของเดือน (US)
