์์ฑ๋ ์์ธก ์์คํ - ๋จธ์ ๋ฌ๋๊ณผ ์์ฐ์ด ์ ๋ ฅ์ ๊ฒฐํฉํ ์ค์ฉ์ ์ ๊ทผ
# 19๊ฐ ๋ณต์กํ ํน์ฑ ์์ฑ
features = [
# ๊ธฐ๋ณธ ์๊ณ์ด
'month_index', 'month_num', 'quarter',
# ์ด๋ํ๊ท (ํธ๋ ๋)
'ma_2', 'ma_3', 'ma_6', 'mom_change', 'mom_change_ma3',
# ๊ณ์ ์ฑ (์ผ๊ฐํจ์ ์ธ์ฝ๋ฉ)
'sin_month', 'cos_month', 'sin_quarter', 'cos_quarter',
# ๋ณ๋์ฑ ๋ฐ ํธ๋ ๋
'volatility_3m', 'volatility_6m', 'linear_trend', 'detrended_cost',
# ๋น์ฆ๋์ค ํน์ฑ
'is_q1', 'is_q4', 'is_year_end'
]
# Prophet ๋ชจ๋ธ (๋จ์ํ์ง๋ง ๊ฐ๋ ฅ)
model = Prophet(
yearly_seasonality=True,
weekly_seasonality=False,
daily_seasonality=False,
changepoint_prior_scale=0.01, # ๊ณผ์ ํฉ ๋ฐฉ์ง
seasonality_prior_scale=1.0, # ๊ณ์ ์ฑ ์กฐ์
seasonality_mode='additive'
)
# ํต์ฌ ํน์ฑ 2๊ฐ๋ง ์ฌ์ฉ
model.add_regressor('is_year_end') # ์ฐ๋ง ํจ๊ณผ
model.add_regressor('is_q1') # ์ ๋
ํจ๊ณผ
# ํ์ต ๋ฐ ์์ธก
model.fit(historical_data)
forecast = model.predict(future_data)
| ๊ตฌ๋ถ | ์ ํต์ ML | Prophet |
|---|---|---|
| ํน์ฑ ์ | 19๊ฐ (๋ณต์ก) | 2๊ฐ (๋จ์) |
| ๋ชจ๋ธ ๊ตฌ์กฐ | 3๊ฐ ๋ชจ๋ธ ์์๋ธ | ๋จ์ผ ์๊ณ์ด ๋ชจ๋ธ |
| ํ๊ท ์ค์ฐจ | 35.2% | 9.4% |
| ์ค๋ฌด ํ์ฉ | โ ๊ธฐ์ค ๋ฏธ๋ฌ | โ ๋ชฉํ ๋ฌ์ฑ |
| ํด์ ๊ฐ๋ฅ์ฑ | ๋ณต์กํจ | ํธ๋ ๋/๊ณ์ ์ฑ ๋ถํด |
# ์ฌ์ฉ์ ์
๋ ฅ ์์
user_input = """
10์์ A์๋น์ค ์ข
๋ฃ ์์ ์ด๊ณ ,
12์์ Bํ๋ก์ ํธ ์์ํ๋๋ฐ ์ด๊ธฐ 3๊ฐ์์ ๋น์ฉ์ด 2๋ฐฐ ๋ค ๊ฒ ๊ฐ์.
"""
# ์์ฐ์ด ํ์ฑ (์ ๊ทํํ์ ๊ธฐ๋ฐ)
def parse_business_context(text):
events = []
# ์๋น์ค ์ข
๋ฃ ํจํด
shutdown_matches = re.findall(r'(\d+)์.*?(.+?)\s*(์ข
๋ฃ|์ค๋จ)', text)
for match in shutdown_matches:
events.append({
'type': 'shutdown',
'month': int(match[0]),
'service': match[1].strip(),
'impact': -30000 # ์ 3๋ง๋ฌ๋ฌ ์ ์ฝ
})
return events
| ์ | ML ์์ธก | ์กฐ์ ์์ธก | ๋ณํ |
|---|---|---|---|
| 2025-01 | โโโโ | โโโโ | $0 |
| 2025-03 | โโโโ | โโโโ | -โโโโ |
| 2025-05 | โโโโ | โโโโ | -โโโโ |
# ์ฌ์ฉ์ ํ์ธ ํ๋ก์ธ์ค
def validate_and_confirm(parsed_events):
print("ํ์
ํ ๋ด์ฉ:")
for event in parsed_events:
print(f" โข {event['description']}")
confirm = input("๋ง๋์? (y/n): ")
return confirm.lower() == 'y'
| ์ | ์ค์ ๋น์ฉ | ์ ํต์ ML | ๊ฐ์ ๋ ML (์ต์ ํ๋ Prophet) | ๊ฐ์ ๋ ML + NLP |
|---|---|---|---|---|
| 2025-01 | โโโโโโโโ | โโโโโโโโ (+20.5%) | โโโโโโโโ (-18.0%) | โโโโโโโโ (+0.1%) |
| 2025-02 | โโโโโโโโ | โโโโโโโโ (+51.9%) | โโโโโโโโ (+21.0%) | โโโโโโโโ (+0.7%) |
| 2025-03 | โโโโโโโโ | โโโโโโโโ (+38.2%) | โโโโโโโโ (+0.3%) ๐ฏ | โโโโโโโโ (+7.1%) |
| 2025-04 | โโโโโโโโ | โโโโโโโโ (+46.1%) | โโโโโโโโ (+4.7%) | โโโโโโโโ (+8.5%) |
| 2025-05 | โโโโโโโโ | โโโโโโโโ (+42.7%) | โโโโโโโโ (+2.8%) | โโโโโโโโ (+11.3%) |
| ํ๊ท ์ค์ฐจ | - | 35.2% | 9.4% ๐ | 5.5% (์ต์ ์๋๋ฆฌ์ค) |
| ํ๊ฐ ๊ธฐ์ค | ์ ํต์ ML | ๊ฐ์ ๋ ML (์ต์ ํ๋ Prophet) | ๊ฐ์ ๋ ML + NLP |
|---|---|---|---|
| ์์ธก ์ ํ๋ | โ 35.2% ์ค์ฐจ | โ 9.4% ์ค์ฐจ | โญ 5.5% ์ค์ฐจ (์ต์ ) |
| ์ค๋ฌด ๊ธฐ์ค | โ ๋ฏธ๋ฌ (ยฑ10%) | โ ๋ฌ์ฑ | โ ์ด๊ณผ ๋ฌ์ฑ |
| ๋ชจ๋ธ ๋ณต์ก๋ | โ ๋งค์ฐ ๋ณต์ก | โ ๋จ์ | โ ๏ธ ์ค๊ฐ (NLP ์ถ๊ฐ) |
| ํด์ ๊ฐ๋ฅ์ฑ | โ ๋ธ๋๋ฐ์ค | โ ํธ๋ ๋/๊ณ์ ์ฑ ๋ถํด | โ ์กฐ์ ๊ทผ๊ฑฐ + ๋ถํด |
| ์ฌ์ฉ ํธ์์ฑ | โ ๊ธฐ์ ์ ์ง์ ํ์ | โ ์ง๊ด์ | โ ์์ฐ์ด ์ ๋ ฅ |
| ์์ ์ฑ | โ ๏ธ ๊ณผ์ ํฉ ์ํ | โ ์ผ๊ด๋ ์ฑ๋ฅ | โ ๏ธ ์๋๋ฆฌ์ค ์์กด์ |
# ํต์ฌ ์ปดํฌ๋ํธ
components = {
'ml_predictor': 'RandomForest + GradientBoosting + LinearRegression',
'nlp_parser': '์ ๊ทํํ์ ๊ธฐ๋ฐ ์์ฐ์ด ํ์ฑ',
'adjustment_engine': '๋น์ฆ๋์ค ์ด๋ฒคํธ โ ์์ธก ์กฐ์ ',
'validation_system': '์ฌ์ฉ์ ํ์ธ + ์ ๋ขฐ์ฑ ๊ฒ์ฆ'
}
# ๋ฐ์ดํฐ ํ๋ก์ฐ
1. ๊ณผ๊ฑฐ ๋ฐ์ดํฐ โ ML ๋ชจ๋ธ ํ์ต โ ๊ธฐ๋ณธ ์์ธก
2. ์ฌ์ฉ์ ์์ฐ์ด ์
๋ ฅ โ NLP ํ์ฑ โ ๋น์ฆ๋์ค ์ด๋ฒคํธ
3. ๊ธฐ๋ณธ ์์ธก + ๋น์ฆ๋์ค ์ด๋ฒคํธ โ ์ต์ข
์กฐ์ ์์ธก
# ํตํฉ ์์ธก ์์คํ
class HybridBudgetPredictor:
def __init__(self):
self.ml_model = self.load_ml_model()
self.nlp_parser = NLPParser()
def predict(self, historical_data, business_context=""):
# 1. ML ๊ธฐ๋ณธ ์์ธก
base_prediction = self.ml_model.predict(historical_data)
# 2. ์์ฐ์ด ํ์ฑ
if business_context:
events = self.nlp_parser.parse(business_context)
# 3. ์ฌ์ฉ์ ํ์ธ
if self.validate_events(events):
# 4. ์์ธก ์กฐ์
adjusted_prediction = self.apply_adjustments(
base_prediction, events
)
return adjusted_prediction
return base_prediction
nlp_predictor_test.py์ ๊ตฌํ๋์ด ์์ต๋๋ค.
๊ธฐ์กด ์ ํต์ ML ๋ฐฉ์์ ํ๊ณ๋ฅผ ๋๋ผ๊ณ , "์๊ณ์ด ๋ฐ์ดํฐ์๋ ์๊ณ์ด ์ ์ฉ ๋ชจ๋ธ์ด ๋ ์ ํฉํ์ง ์์๊น?"๋ผ๋ ๊ฐ์ค์ ๊ฒ์ฆํ๊ธฐ ์ํ ์คํ์ ๋๋ค.
| ์๋๋ฆฌ์ค | ํ๊ท ์ค์ฐจ์จ | ํน์ง |
|---|---|---|
| Prophet ๋จ๋ | 9.4% | ๐ ๋ชฉํ ๋ฌ์ฑ (10% ๋ฏธ๋ง) |
| Prophet + AI ํ๋ก์ ํธ | 22.1% | ๊ณผ๋ํ ์กฐ์ ์ผ๋ก ์ค์ฐจ ์ฆ๊ฐ |
| Prophet + ๊ตฌ์ฒด์ ๋น์ฉ | 26.3% | ์ง์ ๋น์ฉ ์ ๋ ฅ ์์๋ ํ๊ณ |
| Prophet + ์์คํ ์ข ๋ฃ | 12.2% | ๋น์ฉ ์ ๊ฐ ์๋๋ฆฌ์ค์์ ์๋์ ๊ฐ์ |
# Prophet + NLP ํตํฉ ๋ชจ๋ธ
prophet_nlp_integrated.py # ์ด๊ธฐ ํตํฉ ๋ฒ์
prophet_nlp_integrated_v2.py # ๊ฐ์ ๋ ํ์ฑ ๋ก์ง
prophet_nlp_final.py # ํ์ค์ ์กฐ์ ๋ก์ง
# ํต์ฌ ๊ฒฐ๊ณผ
Prophet ๋จ๋
: 9.4% ์ค์ฐจ (๋ชฉํ ๋ฌ์ฑ)
์ ํต์ ML + NLP: 28.5% ์ค์ฐจ
Prophet + NLP: 9.4% ~ 26.3% (์๋๋ฆฌ์ค๋ณ)