1최적화 KPI 설계
AI 기반 공정 최적화의 효과를 정량화하려면 명확한 KPI(Key Performance Indicator) 체계가 필요합니다. 운영 효율, 품질, 비용, 환경 등 다차원 KPI를 정의하고 베이스라인 대비 개선도를 추적합니다.
최적화 KPI 프레임워크
효율성
OEE
72% → 85%
+18%
Throughput
100 → 120/hr
+20%
사이클타임
52s → 45s
-13%
품질
초도수율
95% → 98.5%
+3.7%
불량률
1200 → 500PPM
-58%
Cpk
1.2 → 1.5
+25%
비용
에너지/단위
3.2 → 2.5kWh
-22%
자재낭비
5.5% → 3.0%
-45%
유지보수비용
↓ 30%
-30%
지속가능
CO₂/단위
1.8 → 1.2kg
-33%
폐기물
2.1% → 1.2%
-43%
용수사용
↓ 25%
-25%
개선도
=
(현재값 - 베이스라인)
베이스라인
× 100%
목표달성률
=
(현재값 - 베이스라인)
(목표 - 베이스라인)
× 100%
from dataclasses import dataclass, field
from typing import Dict, List, Optional, Callable
from datetime import datetime, timedelta
from enum import Enum
import numpy as np
class KPICategory(Enum):
EFFICIENCY = "efficiency"
QUALITY = "quality"
COST = "cost"
SUSTAINABILITY = "sustainability"
@dataclass
class KPIDefinition:
"""KPI 정의"""
name: str
category: KPICategory
unit: str
direction: str # 'higher_better' or 'lower_better'
target: float
baseline: float
weight: float = 1.0
class OptimizationKPIFramework:
"""최적화 KPI 프레임워크"""
def __init__(self):
self.kpis: Dict[str, KPIDefinition] = {}
def setup_manufacturing_kpis(self):
"""제조 표준 KPI 설정"""
standard_kpis = [
KPIDefinition("OEE", KPICategory.EFFICIENCY, "%", "higher_better", 85.0, 72.0, 1.5),
KPIDefinition("Throughput", KPICategory.EFFICIENCY, "units/hr", "higher_better", 120, 100),
KPIDefinition("CycleTime", KPICategory.EFFICIENCY, "seconds", "lower_better", 45, 52),
KPIDefinition("FirstPassYield", KPICategory.QUALITY, "%", "higher_better", 98.5, 95.0, 1.3),
KPIDefinition("DefectRate", KPICategory.QUALITY, "PPM", "lower_better", 500, 1200),
KPIDefinition("EnergyPerUnit", KPICategory.COST, "kWh/unit", "lower_better", 2.5, 3.2),
KPIDefinition("MaterialWaste", KPICategory.COST, "%", "lower_better", 3.0, 5.5),
KPIDefinition("CO2PerUnit", KPICategory.SUSTAINABILITY, "kg/unit", "lower_better", 1.2, 1.8),
]
for kpi in standard_kpis:
self.kpis[kpi.name] = kpi
def calculate_improvement(self, kpi_name: str, current_value: float) -> Dict:
"""KPI 개선도 계산"""
kpi = self.kpis[kpi_name]
if kpi.direction == "higher_better":
improvement = (current_value - kpi.baseline) / kpi.baseline * 100
target_progress = (current_value - kpi.baseline) / (kpi.target - kpi.baseline) * 100
else:
improvement = (kpi.baseline - current_value) / kpi.baseline * 100
target_progress = (kpi.baseline - current_value) / (kpi.baseline - kpi.target) * 100
return {
'kpi_name': kpi_name, 'baseline': kpi.baseline, 'target': kpi.target,
'current': current_value, 'improvement_pct': improvement,
'target_progress_pct': min(target_progress, 100), 'on_track': target_progress >= 0
}2ROI 계산 및 비용 분석
AI 최적화 투자의 ROI를 계산하려면 직접 비용 절감, 간접 효과, 회피 비용 등을 종합적으로 분석해야 합니다. 에너지 절감, 불량 감소, 생산성 향상 등 각 요소별 경제적 가치를 화폐 단위로 환산합니다.
@dataclass
class CostComponent:
"""비용 구성요소"""
name: str
category: str # 'direct', 'indirect', 'avoided'
annual_savings: float
calculation_basis: str
class OptimizationROICalculator:
"""최적화 ROI 계산기"""
def __init__(self, investment_cost: float, annual_operating_cost: float):
self.investment_cost = investment_cost
self.annual_operating_cost = annual_operating_cost
self.savings_components: List[CostComponent] = []
def add_energy_savings(self, baseline_kwh: float, optimized_kwh: float,
rate_per_kwh: float, operating_hours: int = 8760):
"""에너지 절감 효과"""
annual_savings = (baseline_kwh - optimized_kwh) * rate_per_kwh * operating_hours
self.savings_components.append(CostComponent(
"Energy Savings", "direct", annual_savings,
f"{(baseline_kwh-optimized_kwh)/baseline_kwh*100:.1f}% reduction"
))
def add_quality_improvement(self, baseline_defect_rate: float,
optimized_defect_rate: float,
annual_production: int, cost_per_defect: float):
"""품질 향상 효과"""
baseline_defects = annual_production * baseline_defect_rate
optimized_defects = annual_production * optimized_defect_rate
annual_savings = (baseline_defects - optimized_defects) * cost_per_defect
self.savings_components.append(CostComponent(
"Quality Improvement", "direct", annual_savings,
f"{(baseline_defect_rate-optimized_defect_rate)*100:.2f}pp reduction"
))
def add_throughput_increase(self, baseline_units: int, optimized_units: int,
margin_per_unit: float):
"""생산성 향상 효과"""
annual_savings = (optimized_units - baseline_units) * margin_per_unit
self.savings_components.append(CostComponent(
"Throughput Increase", "indirect", annual_savings,
f"{(optimized_units-baseline_units)/baseline_units*100:.1f}% increase"
))
def calculate_roi(self, years: int = 5, discount_rate: float = 0.08) -> Dict:
"""ROI 및 NPV 계산"""
total_annual_savings = sum(c.annual_savings for c in self.savings_components)
net_annual_benefit = total_annual_savings - self.annual_operating_cost
# NPV (순현재가치)
npv = -self.investment_cost
for year in range(1, years + 1):
npv += net_annual_benefit / ((1 + discount_rate) ** year)
# IRR (내부수익률) - 이분법
irr_low, irr_high = 0.0, 1.0
for _ in range(100):
irr_mid = (irr_low + irr_high) / 2
test_npv = -self.investment_cost + sum(
net_annual_benefit / ((1 + irr_mid) ** y) for y in range(1, years + 1)
)
if test_npv > 0: irr_low = irr_mid
else: irr_high = irr_mid
payback_years = self.investment_cost / net_annual_benefit if net_annual_benefit > 0 else float('inf')
return {
'investment_cost': self.investment_cost,
'total_annual_savings': total_annual_savings,
'net_annual_benefit': net_annual_benefit,
'npv': npv, 'irr_pct': irr_mid * 100, 'payback_years': payback_years
}ROI 분석 팁: 직접 비용 절감(에너지, 자재)은 측정이 쉽지만, 간접 효과(생산성, 품질)와 회피 비용(다운타임)을 포함해야 전체 가치를 파악할 수 있습니다.
3성과 추적 및 리포팅
최적화 효과를 지속적으로 추적하고 이해관계자에게 보고하는 시스템이 필요합니다. 자동화된 대시보드와 정기 리포트로 투명한 성과 관리를 실현합니다.
class PerformanceTracker:
"""성과 추적 시스템"""
def __init__(self, kpi_framework: OptimizationKPIFramework,
roi_calculator: OptimizationROICalculator):
self.kpi_framework = kpi_framework
self.roi_calculator = roi_calculator
self.performance_history: List[Dict] = []
def record_daily_performance(self, date, kpi_values: Dict[str, float]):
"""일일 성과 기록"""
record = {'date': date.isoformat(), 'kpi_values': kpi_values, 'improvements': {}}
for kpi_name, value in kpi_values.items():
if kpi_name in self.kpi_framework.kpis:
record['improvements'][kpi_name] = self.kpi_framework.calculate_improvement(kpi_name, value)
self.performance_history.append(record)
return record
def generate_executive_report(self, period_days: int = 30) -> Dict:
"""경영진 보고서 생성"""
recent_records = self.performance_history[-period_days:]
report = {
'report_type': 'Executive Summary',
'period_days': period_days,
'generated_at': datetime.now().isoformat(),
'sections': {}
}
# KPI 성과 요약
kpi_performance = {}
for kpi_name in self.kpi_framework.kpis.keys():
values = [r['kpi_values'].get(kpi_name) for r in recent_records
if r['kpi_values'].get(kpi_name) is not None]
if values:
current = np.mean(values[-7:])
kpi_performance[kpi_name] = self.kpi_framework.calculate_improvement(kpi_name, current)
report['sections']['kpi_performance'] = kpi_performance
# 재무 성과
roi_data = self.roi_calculator.calculate_roi()
report['sections']['financial'] = {
'monthly_savings': roi_data['net_annual_benefit'] / 12,
'ytd_savings': roi_data['net_annual_benefit'] * (period_days / 365),
'roi_status': 'on_track' if roi_data['npv'] > 0 else 'at_risk'
}
# 주요 성취 및 주의 항목
achievements = [f"{k}: Target achieved" for k, v in kpi_performance.items() if v['target_progress_pct'] >= 100]
concerns = [f"{k}: Below baseline" for k, v in kpi_performance.items() if v['improvement_pct'] < 0]
report['sections']['achievements'] = achievements
report['sections']['concerns'] = concerns
return report4지속적 개선 프레임워크
AI 최적화는 일회성이 아닌 지속적 개선 프로세스입니다. PDCA(Plan-Do-Check-Act) 사이클을 자동화하고, 모델 재학습과 파라미터 튜닝을 체계적으로 관리합니다.
class ContinuousImprovementSystem:
"""지속적 개선 시스템"""
def __init__(self, tracker: PerformanceTracker):
self.tracker = tracker
self.improvement_actions: List[Dict] = []
def identify_improvement_opportunities(self) -> List[Dict]:
"""개선 기회 식별"""
opportunities = []
for kpi_name, kpi in self.tracker.kpi_framework.kpis.items():
recent_values = [r['kpi_values'].get(kpi_name)
for r in self.tracker.performance_history[-30:]
if r['kpi_values'].get(kpi_name)]
if not recent_values: continue
current_avg = np.mean(recent_values)
improvement = self.tracker.kpi_framework.calculate_improvement(kpi_name, current_avg)
if improvement['target_progress_pct'] < 80: # 목표 80% 미만
opportunities.append({
'kpi': kpi_name,
'gap_to_target': 100 - improvement['target_progress_pct'],
'priority': kpi.weight * (100 - improvement['target_progress_pct']),
'suggested_actions': self._suggest_actions(kpi_name)
})
return sorted(opportunities, key=lambda x: x['priority'], reverse=True)
def _suggest_actions(self, kpi_name: str) -> List[str]:
"""KPI별 개선 액션 제안"""
action_map = {
'OEE': ["설비 가동률 분석", "품질 손실 원인 분석", "계획 정지 최적화"],
'FirstPassYield': ["공정 파라미터 재최적화", "원자재 품질 검토"],
'EnergyPerUnit': ["피크 시간대 부하 분산", "대기 전력 감소"],
'CycleTime': ["병목 공정 분석", "작업 순서 최적화"],
}
return action_map.get(kpi_name, ["상세 분석 필요"])
def run_pdca_cycle(self) -> Dict:
"""PDCA 사이클 실행"""
# Plan
opportunities = self.identify_improvement_opportunities()
# Do
if opportunities:
for action in opportunities[0]['suggested_actions']:
self.improvement_actions.append({'action': action, 'status': 'in_progress'})
# Check & Act: 다음 사이클에서 결과 평가 및 표준화
return {
'opportunities': len(opportunities),
'actions_initiated': len(self.improvement_actions),
'next_cycle': (datetime.now() + timedelta(days=7)).isoformat()
}
# 통합 사용 예시
def demo_optimization_roi():
roi_calc = OptimizationROICalculator(investment_cost=500000, annual_operating_cost=50000)
roi_calc.add_energy_savings(100, 78, 0.12) # 22% 에너지 절감
roi_calc.add_quality_improvement(0.05, 0.02, 1000000, 50) # 불량률 감소
roi_calc.add_throughput_increase(100000, 115000, 10) # 15% 생산성 향상
result = roi_calc.calculate_roi(years=5)
print(f"NPV: ${result['npv']:,.0f}")
print(f"IRR: {result['irr_pct']:.1f}%")
print(f"Payback: {result['payback_years']:.1f} years")성공의 핵심: AI 최적화의 진정한 가치는 일회성 개선이 아닌 지속적 개선 문화를 정착시키는 데 있습니다. 데이터 기반 의사결정, 빠른 피드백 루프, 조직 학습이 선순환을 만듭니다.