Risk in Project Management คืออะไร
Risk (ความเสี่ยง) ในการบริหารโครงการ คือเหตุการณ์ที่ไม่แน่นอนซึ่งอาจเกิดขึ้นและส่งผลกระทบต่อวัตถุประสงค์ของโครงการ ทั้งด้านขอบเขต (scope), เวลา (schedule), ต้นทุน (cost) และคุณภาพ (quality) การบริหารความเสี่ยง (Risk Management) เป็นกระบวนการที่เป็นระบบในการระบุ วิเคราะห์ วางแผนตอบสนอง และติดตามความเสี่ยงตลอดวงจรชีวิตโครงการ ตามมาตรฐาน PMI (PMBOK) และ ISO 31000 การจัดการความเสี่ยงเป็นหนึ่งใน knowledge areas ที่สำคัญที่สุดของ project management
กระบวนการบริหารความเสี่ยง
# risk_process.py — Risk management process
import json
class RiskManagementProcess:
STEPS = {
"plan": {
"name": "1. Plan Risk Management",
"description": "วางแผนว่าจะจัดการความเสี่ยงอย่างไร กำหนด methodology, roles, budget",
"output": "Risk Management Plan",
},
"identify": {
"name": "2. Identify Risks",
"description": "ระบุความเสี่ยงทั้งหมดที่อาจเกิดขึ้น ใช้ brainstorming, checklists, expert judgment",
"output": "Risk Register (ทะเบียนความเสี่ยง)",
"techniques": ["Brainstorming", "SWOT Analysis", "Delphi Technique", "Checklists", "Interviews"],
},
"qualitative": {
"name": "3. Qualitative Risk Analysis",
"description": "ประเมินความเสี่ยงเชิงคุณภาพ — จัดลำดับตาม probability × impact",
"output": "Risk Priority Matrix",
"scale": "Probability (1-5) × Impact (1-5) = Risk Score (1-25)",
},
"quantitative": {
"name": "4. Quantitative Risk Analysis",
"description": "ประเมินเชิงปริมาณ — คำนวณมูลค่าความเสี่ยง (EMV), simulation",
"output": "Expected Monetary Value, Monte Carlo results",
"techniques": ["EMV (Expected Monetary Value)", "Monte Carlo Simulation", "Decision Tree", "Sensitivity Analysis"],
},
"response": {
"name": "5. Plan Risk Responses",
"description": "วางแผนตอบสนองความเสี่ยง: หลีกเลี่ยง, ลด, โอน, หรือยอมรับ",
"output": "Risk Response Plan",
},
"monitor": {
"name": "6. Monitor Risks",
"description": "ติดตามความเสี่ยงตลอดโครงการ ตรวจสอบ triggers และ residual risks",
"output": "Risk Reports, Updated Risk Register",
},
}
def show_process(self):
print("=== Risk Management Process (PMBOK) ===\n")
for key, step in self.STEPS.items():
print(f"[{step['name']}]")
print(f" {step['description']}")
print(f" Output: {step['output']}")
print()
process = RiskManagementProcess()
process.show_process()
Risk Register & Analysis
# risk_register.py — Risk register and analysis tools
import json
import random
class RiskRegister:
RISK_CATEGORIES = {
"technical": {
"name": "Technical Risks",
"examples": ["Technology ใหม่ที่ยังไม่เสถียร", "Integration complexity", "Performance issues", "Security vulnerabilities"],
},
"schedule": {
"name": "Schedule Risks",
"examples": ["Scope creep", "Resource ไม่พอ", "Dependencies ล่าช้า", "Estimation ผิดพลาด"],
},
"cost": {
"name": "Cost Risks",
"examples": ["Budget overrun", "แรงงานแพงกว่าคาด", "Infrastructure costs", "License fees"],
},
"external": {
"name": "External Risks",
"examples": ["กฎหมายเปลี่ยน", "Vendor ปิดกิจการ", "Market changes", "Natural disasters"],
},
"organizational": {
"name": "Organizational Risks",
"examples": ["Stakeholder conflict", "Team turnover", "Lack of executive support", "Change resistance"],
},
}
REGISTER = """
# risk_register.py — Python risk register
import json
from datetime import datetime
class RiskItem:
def __init__(self, risk_id, title, category, probability, impact, owner):
self.risk_id = risk_id
self.title = title
self.category = category
self.probability = probability # 1-5
self.impact = impact # 1-5
self.score = probability * impact
self.owner = owner
self.status = "Open"
self.response = ""
self.created = datetime.now().isoformat()
def set_response(self, strategy, action):
self.response = {"strategy": strategy, "action": action}
def priority(self):
if self.score >= 15:
return "Critical"
elif self.score >= 10:
return "High"
elif self.score >= 5:
return "Medium"
return "Low"
def to_dict(self):
return {
"id": self.risk_id,
"title": self.title,
"category": self.category,
"probability": self.probability,
"impact": self.impact,
"score": self.score,
"priority": self.priority(),
"owner": self.owner,
"status": self.status,
"response": self.response,
}
class RiskRegister:
def __init__(self):
self.risks = []
def add_risk(self, **kwargs):
risk = RiskItem(**kwargs)
self.risks.append(risk)
return risk
def get_by_priority(self, priority):
return [r for r in self.risks if r.priority() == priority]
def summary(self):
total = len(self.risks)
critical = len(self.get_by_priority("Critical"))
high = len(self.get_by_priority("High"))
medium = len(self.get_by_priority("Medium"))
low = len(self.get_by_priority("Low"))
return {"total": total, "critical": critical, "high": high, "medium": medium, "low": low}
# Usage
register = RiskRegister()
register.add_risk(
risk_id="R001", title="API vendor ยกเลิกบริการ",
category="External", probability=2, impact=5, owner="Tech Lead"
)
register.add_risk(
risk_id="R002", title="Developer ลาออกกลางโปรเจค",
category="Organizational", probability=3, impact=4, owner="PM"
)
print(json.dumps(register.summary(), indent=2))
"""
def show_categories(self):
print("=== Risk Categories ===\n")
for key, cat in self.RISK_CATEGORIES.items():
print(f"[{cat['name']}]")
for ex in cat["examples"][:3]:
print(f" • {ex}")
print()
def show_register(self):
print("=== Risk Register Code ===")
print(self.REGISTER[:500])
def risk_matrix(self):
print(f"\n=== Risk Matrix (Probability × Impact) ===")
print(f" Impact → 1(Low) 2(Med) 3(High) 4(VHigh) 5(Critical)")
for p in range(5, 0, -1):
row = f" Prob {p}: "
for i in range(1, 6):
score = p * i
if score >= 15:
row += f" [{score:>2}]C"
elif score >= 10:
row += f" [{score:>2}]H"
elif score >= 5:
row += f" [{score:>2}]M"
else:
row += f" [{score:>2}]L"
print(row)
reg = RiskRegister()
reg.show_categories()
reg.risk_matrix()
Risk Response Strategies
# response.py — Risk response strategies
import json
class RiskResponse:
NEGATIVE_RISKS = {
"avoid": {
"name": "Avoid (หลีกเลี่ยง)",
"description": "เปลี่ยนแผนเพื่อกำจัดความเสี่ยงทั้งหมด",
"example": "เปลี่ยนจาก technology ใหม่ที่ไม่เสถียร ไปใช้ technology ที่พิสูจน์แล้ว",
"when": "High probability + High impact",
},
"mitigate": {
"name": "Mitigate (ลดผลกระทบ)",
"description": "ลด probability หรือ impact ให้อยู่ในระดับที่ยอมรับได้",
"example": "เพิ่ม testing coverage เพื่อลดโอกาส bugs ใน production",
"when": "Medium-High risks ที่หลีกเลี่ยงไม่ได้",
},
"transfer": {
"name": "Transfer (โอนย้าย)",
"description": "โอนความรับผิดชอบไปให้ third party",
"example": "ซื้อประกัน, outsource งานที่เสี่ยง, fixed-price contract",
"when": "Financial risks, specialized risks",
},
"accept": {
"name": "Accept (ยอมรับ)",
"description": "ยอมรับความเสี่ยงโดยไม่ดำเนินการ (passive) หรือเตรียม contingency (active)",
"example": "ตั้ง contingency budget 10% สำหรับ unexpected costs",
"when": "Low probability/impact, ไม่คุ้มที่จะจัดการ",
},
}
POSITIVE_RISKS = {
"exploit": {
"name": "Exploit (ใช้ประโยชน์)",
"description": "ทำให้โอกาสเกิดขึ้นแน่นอน",
"example": "Deploy early ถ้า development เร็วกว่ากำหนด",
},
"enhance": {
"name": "Enhance (เพิ่ม)",
"description": "เพิ่ม probability หรือ impact ของโอกาส",
"example": "เพิ่ม resources ให้ feature ที่ users ต้องการมาก",
},
"share": {
"name": "Share (แบ่งปัน)",
"description": "แบ่งปันโอกาสกับ partner ที่มีความสามารถ",
"example": "Joint venture สำหรับ market opportunity ใหม่",
},
}
def show_negative(self):
print("=== Negative Risk Responses (Threats) ===\n")
for key, resp in self.NEGATIVE_RISKS.items():
print(f"[{resp['name']}]")
print(f" {resp['description']}")
print(f" Example: {resp['example']}")
print(f" When: {resp['when']}")
print()
def show_positive(self):
print("=== Positive Risk Responses (Opportunities) ===")
for key, resp in self.POSITIVE_RISKS.items():
print(f" [{resp['name']}] {resp['description']}")
response = RiskResponse()
response.show_negative()
response.show_positive()
IT Project Risk Examples
# it_risks.py — Common IT project risks
import json
import random
class ITProjectRisks:
RISKS = [
{"id": "R001", "title": "Scope creep — ขอบเขตบานปลาย", "prob": 4, "impact": 4, "response": "Mitigate: Change control process เข้มงวด"},
{"id": "R002", "title": "Key developer ลาออก", "prob": 3, "impact": 5, "response": "Mitigate: Knowledge sharing, documentation, backup resources"},
{"id": "R003", "title": "Third-party API เปลี่ยน/ยกเลิก", "prob": 2, "impact": 4, "response": "Mitigate: Abstraction layer, backup provider"},
{"id": "R004", "title": "Security breach ใน production", "prob": 2, "impact": 5, "response": "Mitigate: SAST/DAST, penetration testing, incident response plan"},
{"id": "R005", "title": "Cloud costs เกิน budget", "prob": 3, "impact": 3, "response": "Mitigate: Cost alerts, reserved instances, auto-scaling limits"},
{"id": "R006", "title": "Performance ไม่ผ่าน load test", "prob": 3, "impact": 4, "response": "Mitigate: Early performance testing, capacity planning"},
{"id": "R007", "title": "Data migration ผิดพลาด", "prob": 2, "impact": 5, "response": "Mitigate: Dry run, validation scripts, rollback plan"},
{"id": "R008", "title": "Regulatory compliance ใหม่ (PDPA)", "prob": 3, "impact": 4, "response": "Mitigate: Legal review, privacy by design, DPO appointment"},
]
def show_risks(self):
print("=== Common IT Project Risks ===\n")
for r in self.RISKS:
score = r["prob"] * r["impact"]
priority = "CRIT" if score >= 15 else "HIGH" if score >= 10 else "MED"
print(f" [{r['id']}] [{priority:>4}] Score:{score:>2} | {r['title']}")
print(f" Response: {r['response']}")
print()
def emv_calculation(self):
print("=== EMV (Expected Monetary Value) ===")
risks = [
{"name": "Server downtime", "prob": 0.2, "cost": -500000},
{"name": "Scope creep (+20%)", "prob": 0.4, "cost": -300000},
{"name": "Early delivery bonus", "prob": 0.3, "cost": 200000},
{"name": "Data breach fine", "prob": 0.05, "cost": -5000000},
]
total_emv = 0
for r in risks:
emv = r["prob"] * r["cost"]
total_emv += emv
print(f" {r['name']}: P={r['prob']} × Cost={r['cost']:>10,} = EMV {emv:>10,.0f} บาท")
print(f"\n Total EMV: {total_emv:>10,.0f} บาท")
print(f" → ต้องตั้ง contingency reserve อย่างน้อย {abs(total_emv):,.0f} บาท")
it = ITProjectRisks()
it.show_risks()
it.emv_calculation()
Risk Management Tools
# tools.py — Risk management tools and frameworks
import json
class RiskTools:
TOOLS = {
"jira": {
"name": "Jira (Risk as Issues)",
"description": "ใช้ issue type 'Risk' + custom fields สำหรับ probability/impact",
"price": "Free-$8.15/user/month",
},
"riskwatch": {
"name": "RiskWatch",
"description": "Dedicated risk management platform",
"price": "Enterprise pricing",
},
"excel": {
"name": "Excel/Google Sheets (Risk Register)",
"description": "Template ง่ายๆ สำหรับ small-medium projects",
"price": "Free",
},
"monte_carlo": {
"name": "Monte Carlo Simulation Tools",
"description": "@Risk, Crystal Ball, Python (numpy/scipy)",
"price": "Free (Python) - $1,500+ (commercial)",
},
}
FRAMEWORKS = {
"pmbok": {"name": "PMBOK (PMI)", "focus": "Project risk management process"},
"iso31000": {"name": "ISO 31000", "focus": "Enterprise risk management standard"},
"prince2": {"name": "PRINCE2", "focus": "Risk management as theme"},
"fair": {"name": "FAIR", "focus": "Quantitative information risk analysis"},
}
def show_tools(self):
print("=== Risk Management Tools ===\n")
for key, tool in self.TOOLS.items():
print(f" [{tool['name']}] {tool['description']} | {tool['price']}")
def show_frameworks(self):
print(f"\n=== Frameworks ===")
for key, fw in self.FRAMEWORKS.items():
print(f" [{fw['name']}] {fw['focus']}")
tools = RiskTools()
tools.show_tools()
tools.show_frameworks()
FAQ - คำถามที่พบบ่อย
Q: Risk กับ Issue ต่างกันอย่างไร?
A: Risk: เหตุการณ์ที่ยังไม่เกิดขึ้น (อาจจะเกิดหรือไม่เกิดก็ได้) — จัดการเชิงรุก Issue: ปัญหาที่เกิดขึ้นแล้ว — ต้องแก้ไขทันที Risk ที่เกิดขึ้นจริง → กลายเป็น Issue ดังนั้น Risk Management ดี = ลด Issues ที่เกิดขึ้น
Q: Contingency Reserve กับ Management Reserve ต่างกัน?
A: Contingency Reserve: งบสำรองสำหรับ known risks (identified risks) — PM ใช้ได้เอง Management Reserve: งบสำรองสำหรับ unknown risks (unknown-unknowns) — ต้องขออนุมัติ management ทั่วไป: Contingency 5-15% + Management Reserve 5-10% ของ budget
Q: ใช้ Risk Matrix อย่างไร?
A: 1. ประเมิน Probability (1-5) และ Impact (1-5) ของแต่ละ risk 2. คำนวณ Score = P × I 3. จัดลำดับ: Critical (15-25), High (10-14), Medium (5-9), Low (1-4) 4. Focus ที่ Critical และ High ก่อน 5. Review ทุก sprint/milestone — risk อาจเปลี่ยนแปลง
Q: IT Project มีความเสี่ยงอะไรบ่อยที่สุด?
A: อันดับ 1: Scope creep (ขอบเขตบานปลาย) — ป้องกันด้วย change control อันดับ 2: Resource/skill shortage — ป้องกันด้วย cross-training, documentation อันดับ 3: Technology complexity — ป้องกันด้วย POC, prototyping อันดับ 4: Unrealistic timeline — ป้องกันด้วย bottom-up estimation, buffer อันดับ 5: Stakeholder misalignment — ป้องกันด้วย regular communication
