2026-07-14 saved
@@ -0,0 +1,2 @@
|
|||||||
|
analysis/.venv/
|
||||||
|
latex/aux/
|
||||||
@@ -0,0 +1,471 @@
|
|||||||
|
"""
|
||||||
|
================================================================================
|
||||||
|
국제 유가 충격의 국내 소비자물가 품목별 전이 시차 분석
|
||||||
|
- VAR 모형과 충격반응함수(IRF)를 이용한 다변량 시계열 분석
|
||||||
|
- 분석 기간: 2015.01 ~ 2024.12 (월별, 120개 관측치)
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
[분석 구조]
|
||||||
|
독립변수 : WTI 국제유가 (로그)
|
||||||
|
종속변수 : 에너지 / 식품 / 서비스 품목별 CPI (로그)
|
||||||
|
통제변수 : 원/달러 환율 (로그)
|
||||||
|
|
||||||
|
품목별로 [유가, 환율, 해당 품목 CPI] 3변수 VAR을 각각 추정하고,
|
||||||
|
유가 충격에 대한 각 품목의 반응(IRF)을 비교하여 전이 시차를 분석한다.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import io
|
||||||
|
import urllib.request
|
||||||
|
import warnings
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import pandas as pd
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from matplotlib import rc
|
||||||
|
|
||||||
|
from statsmodels.tsa.stattools import adfuller, grangercausalitytests
|
||||||
|
from statsmodels.tsa.api import VAR
|
||||||
|
|
||||||
|
warnings.filterwarnings("ignore") # 통계 경고 메시지 숨김 (결과 해석에 불필요)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# 0. 한글 폰트 설정 (그래프 제목·라벨을 한글로 표시하기 위함)
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
output_path = Path("./outputs")
|
||||||
|
output_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
rc('font', family='Nanum Gothic')
|
||||||
|
plt.rcParams["font.family"] = "Nanum Gothic"
|
||||||
|
plt.rcParams["axes.unicode_minus"] = False
|
||||||
|
plt.rcParams["figure.dpi"] = 300
|
||||||
|
plt.rcParams["savefig.dpi"] = 300
|
||||||
|
|
||||||
|
# 분석 기간 상수
|
||||||
|
START, END = "2015-01", "2024-12"
|
||||||
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# 1. 데이터 수집
|
||||||
|
# ==============================================================================
|
||||||
|
def fetch_csv(url):
|
||||||
|
"""URL에서 CSV를 받아 문자열로 반환하는 헬퍼 함수"""
|
||||||
|
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
|
||||||
|
return urllib.request.urlopen(req, timeout=30).read().decode()
|
||||||
|
|
||||||
|
|
||||||
|
def load_wti():
|
||||||
|
"""
|
||||||
|
WTI 국제유가 (일별 → 월평균)
|
||||||
|
출처: GitHub datasets/oil-prices (원출처: 미국 EIA)
|
||||||
|
"""
|
||||||
|
url = "https://raw.githubusercontent.com/datasets/oil-prices/main/data/wti-daily.csv"
|
||||||
|
df = pd.read_csv(io.StringIO(fetch_csv(url)))
|
||||||
|
df["Date"] = pd.to_datetime(df["Date"])
|
||||||
|
# 일별 데이터를 '월초(MS) 기준 월평균'으로 집계
|
||||||
|
monthly = df.set_index("Date").resample("MS").mean()
|
||||||
|
return monthly.loc[START:END, "Price"].rename("wti")
|
||||||
|
|
||||||
|
|
||||||
|
def load_fx():
|
||||||
|
"""
|
||||||
|
원/달러 환율 (월별)
|
||||||
|
출처: GitHub datasets/exchange-rates (원출처: 미국 연준 계열)
|
||||||
|
"""
|
||||||
|
url = "https://raw.githubusercontent.com/datasets/exchange-rates/main/data/monthly.csv"
|
||||||
|
df = pd.read_csv(io.StringIO(fetch_csv(url)))
|
||||||
|
df = df[df["Country"] == "South Korea"].copy()
|
||||||
|
df["Date"] = pd.to_datetime(df["Date"])
|
||||||
|
fx = df.set_index("Date")["Exchange rate"]
|
||||||
|
return fx.loc[START:END].rename("fx")
|
||||||
|
|
||||||
|
|
||||||
|
def load_cpi():
|
||||||
|
"""
|
||||||
|
품목별 소비자물가지수 (월별)
|
||||||
|
출처: 통계청 KOSIS, 지출목적별 소비자물가지수(2020=100)
|
||||||
|
로컬에 업로드된 CSV 파일을 읽어서 처리한다.
|
||||||
|
|
||||||
|
[품목 매핑]
|
||||||
|
에너지 <- '04 주택, 수도, 전기 및 연료'
|
||||||
|
식품 <- '01 식료품 및 비주류음료'
|
||||||
|
서비스 <- '11 음식 및 숙박'
|
||||||
|
"""
|
||||||
|
path = "./지출목적별_소비자물가지수_품목포함__2020100__20260713213203.csv"
|
||||||
|
df = pd.read_csv(path, encoding="utf-8")
|
||||||
|
|
||||||
|
# 분석에 사용할 지출목적별 항목 지정
|
||||||
|
mapping = {
|
||||||
|
"04 주택, 수도, 전기 및 연료": "energy",
|
||||||
|
"01 식료품 및 비주류음료": "food",
|
||||||
|
"11 음식 및 숙박": "service",
|
||||||
|
}
|
||||||
|
|
||||||
|
# YYYY.MM 형식의 월별 컬럼만 추출 (연간 집계 컬럼 '2023' 등은 제외)
|
||||||
|
month_cols = [c for c in df.columns if "." in str(c) and len(str(c)) == 7]
|
||||||
|
|
||||||
|
records = {}
|
||||||
|
for kor_name, eng_name in mapping.items():
|
||||||
|
row = df[df["지출목적별"] == kor_name][month_cols] # 해당 품목 행 추출
|
||||||
|
series = row.iloc[0].astype(float) # 값을 실수로 변환
|
||||||
|
series.index = pd.to_datetime(series.index, format="%Y.%m") # 인덱스를 날짜로
|
||||||
|
records[eng_name] = series
|
||||||
|
|
||||||
|
cpi = pd.DataFrame(records)
|
||||||
|
# ★ KOSIS CSV는 월 컬럼 순서가 뒤섞여 있으므로 반드시 날짜순 정렬
|
||||||
|
cpi = cpi.sort_index()
|
||||||
|
return cpi.loc[START:END] # 분석 기간으로 자름
|
||||||
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# 2. 데이터 병합 및 전처리
|
||||||
|
# ==============================================================================
|
||||||
|
def build_dataset():
|
||||||
|
"""세 데이터를 하나의 월별 데이터프레임으로 병합하고 로그 변환한다."""
|
||||||
|
wti = load_wti()
|
||||||
|
fx = load_fx()
|
||||||
|
cpi = load_cpi()
|
||||||
|
|
||||||
|
# 인덱스(월)를 기준으로 병합
|
||||||
|
data = pd.concat([wti, fx, cpi], axis=1)
|
||||||
|
data = data.dropna() # 결측 있는 월 제거
|
||||||
|
|
||||||
|
print("=" * 60)
|
||||||
|
print("[1] 데이터 병합 완료")
|
||||||
|
print(f" 기간: {data.index[0].date()} ~ {data.index[-1].date()}")
|
||||||
|
print(f" 관측치: {len(data)}개월, 변수: {list(data.columns)}")
|
||||||
|
print(data.head(3).round(2))
|
||||||
|
print()
|
||||||
|
|
||||||
|
# 로그 변환: 탄력성(% 반응) 해석 + 분산 안정화
|
||||||
|
# IRF 해석이 '유가 1% 충격 -> CPI x% 반응' 형태가 됨
|
||||||
|
log_data = np.log(data)
|
||||||
|
return data, log_data
|
||||||
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# 3. 단위근 검정 (ADF Test)
|
||||||
|
# ==============================================================================
|
||||||
|
def adf_test(series, name):
|
||||||
|
"""
|
||||||
|
ADF(Augmented Dickey-Fuller) 검정
|
||||||
|
귀무가설 H0: 단위근이 있다 (= 비정상 시계열)
|
||||||
|
p < 0.05 이면 H0 기각 -> 정상(stationary) 시계열
|
||||||
|
"""
|
||||||
|
result = adfuller(series.dropna(), autolag="AIC")
|
||||||
|
pval = result[1]
|
||||||
|
verdict = "정상 (I(0))" if pval < 0.05 else "비정상 (단위근 존재)"
|
||||||
|
print(f" {name:12s} | ADF통계량={result[0]:7.3f} | p값={pval:6.4f} | {verdict}")
|
||||||
|
return pval
|
||||||
|
|
||||||
|
|
||||||
|
def run_unit_root_tests(log_data):
|
||||||
|
"""수준(level)과 1차 차분에 대해 각각 ADF 검정을 수행한다."""
|
||||||
|
print("=" * 60)
|
||||||
|
print("[2] 단위근 검정 (ADF Test)")
|
||||||
|
print("-" * 60)
|
||||||
|
print(" (a) 수준 변수 (log level)")
|
||||||
|
for col in log_data.columns:
|
||||||
|
adf_test(log_data[col], col)
|
||||||
|
|
||||||
|
print("\n (b) 1차 차분 변수 (log difference)")
|
||||||
|
diff = log_data.diff().dropna()
|
||||||
|
for col in diff.columns:
|
||||||
|
adf_test(diff[col], f"d.{col}")
|
||||||
|
print()
|
||||||
|
return diff
|
||||||
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# 4. 품목별 VAR 모형 추정 + IRF + FEVD + Granger 인과성
|
||||||
|
# ==============================================================================
|
||||||
|
def analyze_item(log_data, item, item_kor, maxlags=12, irf_periods=12):
|
||||||
|
"""
|
||||||
|
특정 품목에 대해 [유가, 환율, 품목CPI] 3변수 VAR을 추정하고
|
||||||
|
유가 충격에 대한 해당 품목 CPI의 반응(IRF)을 분석한다.
|
||||||
|
|
||||||
|
[모형 설정 — 수준(level) VAR]
|
||||||
|
물가·유가·환율은 대부분 I(1) 비정상 시계열이지만, 차분하면 변수 간
|
||||||
|
장기 균형관계(공적분) 정보가 사라진다. 특히 서비스 물가는 추세가 강해
|
||||||
|
차분해도 정상성이 확보되지 않는다. 따라서 Sims, Stock & Watson(1990)이
|
||||||
|
제시한 대로 '로그 수준' 변수로 VAR을 추정한다. 변수 간 공적분이 존재하면
|
||||||
|
수준 VAR의 충격반응함수(IRF)는 일치추정량이 되므로, 유가-물가 전이 연구에서
|
||||||
|
널리 사용되는 표준적 접근이다. 계절성은 월별 계절더미로 통제한다.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
item : 품목 영문명 ('energy'/'food'/'service')
|
||||||
|
item_kor : 그래프에 쓸 한글명 ('에너지'/'식품'/'서비스')
|
||||||
|
"""
|
||||||
|
print("=" * 60)
|
||||||
|
print(f"[3] VAR 분석 — {item_kor} 품목")
|
||||||
|
print("-" * 60)
|
||||||
|
|
||||||
|
# (1) 분석 대상 변수 구성: 유가 -> 환율 -> 품목CPI 순서
|
||||||
|
# Cholesky 분해 순서 = 외생성이 강한 변수부터 (유가가 가장 외생적)
|
||||||
|
cols = ["wti", "fx", item]
|
||||||
|
sub = log_data[cols].copy() # 로그 '수준' 변수 (차분하지 않음)
|
||||||
|
|
||||||
|
# (2) 월별 계절더미 생성 (1~11월, 12월은 기준월로 제외)
|
||||||
|
# 식품·에너지 CPI의 계절성을 통제하기 위함
|
||||||
|
seasonal = pd.get_dummies(sub.index.month, prefix="m", drop_first=True)
|
||||||
|
seasonal.index = sub.index
|
||||||
|
seasonal = seasonal.astype(float)
|
||||||
|
|
||||||
|
# (3) VAR 모형 생성 및 최적 시차 선택 (AIC 기준)
|
||||||
|
model = VAR(sub, exog=seasonal) # 계절더미를 외생변수로 포함
|
||||||
|
sel = model.select_order(maxlags=maxlags)
|
||||||
|
lag = sel.aic # AIC가 최소가 되는 시차
|
||||||
|
if lag == 0:
|
||||||
|
lag = 1 # 최소 1시차는 확보
|
||||||
|
print(f" 최적 시차(AIC 기준): {lag}")
|
||||||
|
|
||||||
|
results = model.fit(lag) # VAR 추정 (계절더미는 모형에 이미 포함)
|
||||||
|
|
||||||
|
# (4) 그랜저 인과성 검정: 유가 -> 품목CPI 방향
|
||||||
|
print(f" 그랜저 인과성 검정 (유가 → {item_kor}):")
|
||||||
|
gc = grangercausalitytests(sub[[item, "wti"]], maxlag=lag, verbose=False)
|
||||||
|
pvals = [round(gc[i + 1][0]["ssr_ftest"][1], 4) for i in range(lag)]
|
||||||
|
print(f" 시차별 p값: {pvals} (0.05 미만이면 인과성 유의)")
|
||||||
|
|
||||||
|
# (5) 충격반응함수(IRF) 계산
|
||||||
|
irf = results.irf(irf_periods) # irf_periods개월까지 반응 추적
|
||||||
|
|
||||||
|
# 유가('wti') 충격에 대한 품목CPI(item)의 반응 추출
|
||||||
|
# irf.irfs shape = (기간, 반응변수, 충격변수)
|
||||||
|
wti_idx = cols.index("wti")
|
||||||
|
item_idx = cols.index(item)
|
||||||
|
response = irf.irfs[:, item_idx, wti_idx] # 유가충격 -> 품목 반응
|
||||||
|
cum_response = irf.cum_effects[:, item_idx, wti_idx] # 누적 반응
|
||||||
|
|
||||||
|
# (6) 전이 지표 3종 계산
|
||||||
|
# [중요] 우리 변수는 로그 '수준'이라 IRF는 누적되어 우상향한다.
|
||||||
|
# 단일 지표(peak 시점)는 오해를 부르므로 3가지를 함께 본다.
|
||||||
|
# ① onset : 충격 직후 1개월차 전이량 → '얼마나 빨리 반응이 시작되나'
|
||||||
|
# ② mean_lag : 전이량 무게중심(가중평균 시점) → '전이의 평균 시차'
|
||||||
|
# ③ cumulative : 12개월 누적 전이량 → '전이가 실제로 유의미한가'
|
||||||
|
increments = np.diff(response) # 월별 증가분(=수준 IRF 기울기)
|
||||||
|
months = np.arange(1, len(increments) + 1) # 1~12개월
|
||||||
|
|
||||||
|
onset = increments[0] # ① 1개월차 즉각 반응
|
||||||
|
pos = np.where(increments > 0, increments, 0) # 양(+) 전이량만 (음수 왜곡 방지)
|
||||||
|
mean_lag = (np.sum(months * pos) / np.sum(pos)) if np.sum(pos) > 0 else float("nan") # ②
|
||||||
|
cumulative = float(np.sum(increments)) # ③ 12개월 누적 전이량
|
||||||
|
|
||||||
|
print(f" ▶ onset(1개월 즉각반응) = {onset:+.5f}")
|
||||||
|
print(f" ▶ 평균 전이 시차(mean lag) = {mean_lag:.2f}개월")
|
||||||
|
print(f" ▶ 12개월 누적 전이량 = {cumulative:+.5f}")
|
||||||
|
print()
|
||||||
|
|
||||||
|
return {
|
||||||
|
"item": item,
|
||||||
|
"item_kor": item_kor,
|
||||||
|
"results": results,
|
||||||
|
"irf": irf,
|
||||||
|
"response": response,
|
||||||
|
"cum_response": cum_response,
|
||||||
|
"onset": onset,
|
||||||
|
"mean_lag": mean_lag,
|
||||||
|
"cumulative": cumulative,
|
||||||
|
"lag": lag,
|
||||||
|
"cols": cols,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# 5. 시각화
|
||||||
|
# ==============================================================================
|
||||||
|
def plot_raw_series(data):
|
||||||
|
"""원본 시계열 4개(유가·환율·품목별 CPI) 추이 그래프"""
|
||||||
|
fig, axes = plt.subplots(2, 2, figsize=(12, 7))
|
||||||
|
# fig.suptitle("원자료 시계열 추이 (2015–2024)", fontsize=15, fontweight="bold")
|
||||||
|
|
||||||
|
plots = [
|
||||||
|
("wti", "WTI 국제유가 (달러/배럴)", axes[0, 0]),
|
||||||
|
("fx", "원/달러 환율", axes[0, 1]),
|
||||||
|
("energy", "에너지 CPI", axes[1, 0]),
|
||||||
|
("food", "식품 CPI", axes[1, 1]),
|
||||||
|
]
|
||||||
|
for col, title, ax in plots:
|
||||||
|
ax.plot(data.index, data[col], color="#333333", linewidth=1.2)
|
||||||
|
ax.set_title(title, fontsize=12)
|
||||||
|
ax.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig("./outputs/01_원자료_시계열.png", bbox_inches="tight")
|
||||||
|
plt.close()
|
||||||
|
print(" 저장: 01_원자료_시계열.png")
|
||||||
|
|
||||||
|
|
||||||
|
def plot_irf_with_ci(analyses):
|
||||||
|
"""
|
||||||
|
품목별 유가충격 IRF를 개별 패널로 그리고 95% 신뢰구간을 함께 표시한다.
|
||||||
|
신뢰구간이 0을 포함하지 않는 구간 = 통계적으로 유의한 반응.
|
||||||
|
"""
|
||||||
|
fig, axes = plt.subplots(1, 3, figsize=(15, 4.5), sharey=True)
|
||||||
|
# fig.suptitle("유가 충격에 대한 품목별 소비자물가 반응 (95% 신뢰구간 포함)",
|
||||||
|
# fontsize=14, fontweight="bold")
|
||||||
|
|
||||||
|
colors = {"energy": "#c0392b", "food": "#e67e22", "service": "#16a085"}
|
||||||
|
for ax, a in zip(axes, analyses):
|
||||||
|
irf = a["irf"]
|
||||||
|
wti_idx = a["cols"].index("wti")
|
||||||
|
item_idx = a["cols"].index(a["item"])
|
||||||
|
|
||||||
|
resp = a["response"]
|
||||||
|
# 신뢰구간(표준오차 기반, 약 95% = ±1.96 SE)
|
||||||
|
stderr = irf.stderr()[:, item_idx, wti_idx]
|
||||||
|
months = np.arange(len(resp))
|
||||||
|
lower = resp - 1.96 * stderr
|
||||||
|
upper = resp + 1.96 * stderr
|
||||||
|
|
||||||
|
ax.plot(months, resp, color=colors[a["item"]], linewidth=1.8, marker="o", markersize=3)
|
||||||
|
ax.fill_between(months, lower, upper, color=colors[a["item"]], alpha=0.15) # 신뢰구간 음영
|
||||||
|
ax.axhline(0, color="gray", linewidth=0.8, linestyle="--")
|
||||||
|
ax.axvline(a["mean_lag"], color="gray", linewidth=0.8, linestyle=":") # 평균 전이 시차 표시
|
||||||
|
ax.set_title(f"{a['item_kor']} (평균 전이 시차: {a['mean_lag']:.1f}개월)", fontsize=12)
|
||||||
|
ax.set_xlabel("경과 개월")
|
||||||
|
ax.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
axes[0].set_ylabel("소비자물가 반응")
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig("./outputs/04_품목별_IRF_신뢰구간.png", bbox_inches="tight")
|
||||||
|
plt.close()
|
||||||
|
print(" 저장: 04_품목별_IRF_신뢰구간.png")
|
||||||
|
|
||||||
|
|
||||||
|
def plot_irf_comparison(analyses):
|
||||||
|
"""품목별 유가충격 IRF를 한 그래프에 겹쳐서 전이 시차를 비교"""
|
||||||
|
fig, ax = plt.subplots(figsize=(11, 6))
|
||||||
|
|
||||||
|
colors = {"energy": "#c0392b", "food": "#e67e22", "service": "#16a085"}
|
||||||
|
for a in analyses:
|
||||||
|
months = range(len(a["response"]))
|
||||||
|
ax.plot(months, a["response"],
|
||||||
|
marker="o", markersize=4, linewidth=1.5,
|
||||||
|
color=colors[a["item"]],
|
||||||
|
label=f"{a['item_kor']} (누적 {a['cumulative']:+.3f})")
|
||||||
|
|
||||||
|
ax.axhline(0, color="gray", linewidth=0.8, linestyle="--") # 0 기준선
|
||||||
|
# ax.set_title("유가 충격에 대한 품목별 소비자물가 반응 (충격반응함수)",
|
||||||
|
# fontsize=14, fontweight="bold")
|
||||||
|
ax.set_xlabel("유가 충격 이후 경과 개월")
|
||||||
|
ax.set_ylabel("소비자물가 반응 (로그 차분)")
|
||||||
|
ax.legend(title="품목", fontsize=11)
|
||||||
|
ax.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig("./outputs/02_품목별_IRF비교.png", bbox_inches="tight")
|
||||||
|
plt.close()
|
||||||
|
print(" 저장: 02_품목별_IRF비교.png")
|
||||||
|
|
||||||
|
|
||||||
|
def plot_monthly_increments(analyses):
|
||||||
|
"""
|
||||||
|
품목별 '월별 증가분'(수준 IRF의 기울기 = 그 달의 순수 전이량)을 그린다.
|
||||||
|
수준 IRF는 우상향해서 전이 시차가 안 보이지만, 증가분으로 보면
|
||||||
|
'언제 전이가 가장 활발한가'(=전이 시차)가 봉우리로 명확히 드러난다.
|
||||||
|
"""
|
||||||
|
fig, ax = plt.subplots(figsize=(11, 6))
|
||||||
|
|
||||||
|
colors = {"energy": "#c0392b", "food": "#e67e22", "service": "#16a085"}
|
||||||
|
for a in analyses:
|
||||||
|
inc = np.diff(a["response"]) # 월별 증가분
|
||||||
|
months = range(1, len(inc) + 1) # 1개월차부터
|
||||||
|
ax.plot(months, inc,
|
||||||
|
marker="o", markersize=4, linewidth=1.5,
|
||||||
|
color=colors[a["item"]],
|
||||||
|
label=f"{a['item_kor']} (평균 전이 시차: {a['mean_lag']:.1f}개월)")
|
||||||
|
|
||||||
|
ax.axhline(0, color="gray", linewidth=0.8, linestyle="--")
|
||||||
|
# ax.set_title("유가 충격의 월별 전이량 (수준 IRF의 기울기)",
|
||||||
|
# fontsize=14, fontweight="bold")
|
||||||
|
ax.set_xlabel("유가 충격 이후 경과 개월")
|
||||||
|
ax.set_ylabel("월별 전이량 (그 달의 물가 상승 기여분)")
|
||||||
|
ax.legend(title="품목", fontsize=11)
|
||||||
|
ax.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig("./outputs/05_월별_전이량.png", bbox_inches="tight")
|
||||||
|
plt.close()
|
||||||
|
print(" 저장: 05_월별_전이량.png")
|
||||||
|
|
||||||
|
|
||||||
|
def plot_cumulative_irf(analyses):
|
||||||
|
"""품목별 누적 반응(cumulative IRF) 비교"""
|
||||||
|
fig, ax = plt.subplots(figsize=(11, 6))
|
||||||
|
|
||||||
|
colors = {"energy": "#c0392b", "food": "#e67e22", "service": "#16a085"}
|
||||||
|
for a in analyses:
|
||||||
|
months = range(len(a["cum_response"]))
|
||||||
|
ax.plot(months, a["cum_response"],
|
||||||
|
marker="s", markersize=4, linewidth=1.5,
|
||||||
|
color=colors[a["item"]], label=a["item_kor"])
|
||||||
|
|
||||||
|
ax.axhline(0, color="gray", linewidth=0.8, linestyle="--")
|
||||||
|
# ax.set_title("유가 충격에 대한 품목별 소비자물가 누적 반응",
|
||||||
|
# fontsize=14, fontweight="bold")
|
||||||
|
ax.set_xlabel("유가 충격 이후 경과 개월")
|
||||||
|
ax.set_ylabel("누적 반응 (로그 차분 누적)")
|
||||||
|
ax.legend(title="품목", fontsize=11)
|
||||||
|
ax.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig("./outputs/03_품목별_누적반응.png", bbox_inches="tight")
|
||||||
|
plt.close()
|
||||||
|
print(" 저장: 03_품목별_누적반응.png")
|
||||||
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# 6. 메인 실행 흐름
|
||||||
|
# ==============================================================================
|
||||||
|
def main():
|
||||||
|
# --- 1) 데이터 준비 ---
|
||||||
|
data, log_data = build_dataset()
|
||||||
|
|
||||||
|
# 병합 데이터를 CSV로 저장 (보고서 부록/재현용)
|
||||||
|
data.to_csv("./outputs/00_병합데이터.csv", encoding="utf-8-sig")
|
||||||
|
|
||||||
|
# --- 2) 단위근 검정 ---
|
||||||
|
run_unit_root_tests(log_data)
|
||||||
|
|
||||||
|
# --- 3) 품목별 VAR 분석 ---
|
||||||
|
items = [
|
||||||
|
("energy", "에너지"),
|
||||||
|
("food", "식품"),
|
||||||
|
("service", "서비스"),
|
||||||
|
]
|
||||||
|
analyses = [analyze_item(log_data, eng, kor) for eng, kor in items]
|
||||||
|
|
||||||
|
# --- 4) 시각화 ---
|
||||||
|
print("=" * 60)
|
||||||
|
print("[4] 그래프 생성")
|
||||||
|
print("-" * 60)
|
||||||
|
plot_raw_series(data)
|
||||||
|
plot_irf_comparison(analyses)
|
||||||
|
plot_irf_with_ci(analyses)
|
||||||
|
plot_monthly_increments(analyses)
|
||||||
|
plot_cumulative_irf(analyses)
|
||||||
|
print()
|
||||||
|
|
||||||
|
# --- 5) 최종 요약 ---
|
||||||
|
print("=" * 70)
|
||||||
|
print("[5] 전이 지표 종합 (세 지표를 함께 해석)")
|
||||||
|
print("-" * 70)
|
||||||
|
print(f" {'품목':8s} | {'onset(즉각반응)':14s} | {'평균전이시차':12s} | {'12개월 누적':12s} | VAR시차")
|
||||||
|
print(" " + "-" * 64)
|
||||||
|
for a in analyses:
|
||||||
|
print(f" {a['item_kor']:8s} | {a['onset']:+.5f} | "
|
||||||
|
f"{a['mean_lag']:>6.2f}개월 | {a['cumulative']:+.4f} | lag={a['lag']}")
|
||||||
|
print()
|
||||||
|
print(" [해석 지침] 단일 지표는 오해를 부르므로 세 지표를 함께 본다:")
|
||||||
|
print(" · onset → 반응이 얼마나 빨리 시작되나 (전이 속도)")
|
||||||
|
print(" · mean_lag → 전이의 무게중심 (평균 시차)")
|
||||||
|
print(" · 누적 → 전이가 실제로 유의미한가 (양수여야 실질 전이)")
|
||||||
|
print(" ※ 식품은 mean_lag가 짧아도 누적≈0 → 전이 없음(반짝 후 반전)")
|
||||||
|
print("=" * 70)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
,wti,fx,energy,food,service
|
||||||
|
2015-01-01,47.219,1088.13,97.329,87.795,88.793
|
||||||
|
2015-02-01,50.58421052631579,1101.4605,97.629,88.385,88.946
|
||||||
|
2015-03-01,47.82363636363636,1112.9005,96.845,87.549,89.495
|
||||||
|
2015-04-01,54.45285714285714,1084.6709,96.961,87.461,89.702
|
||||||
|
2015-05-01,59.265,1092.6365,96.293,88.737,89.792
|
||||||
|
2015-06-01,59.819545454545455,1112.8832,96.409,88.473,89.936
|
||||||
|
2015-07-01,50.90090909090909,1146.5468,95.857,88.244,90.143
|
||||||
|
2015-08-01,42.86761904761905,1178.1438,96.003,88.825,90.323
|
||||||
|
2015-09-01,45.47952380952381,1184.33,96.39,88.649,90.431
|
||||||
|
2015-10-01,46.22363636363636,1143.199,97.271,87.769,90.539
|
||||||
|
2015-11-01,42.4435,1153.4721,97.387,86.607,90.656
|
||||||
|
2015-12-01,37.18863636363636,1169.9464,97.552,87.998,90.926
|
||||||
|
2016-01-01,31.683157894736844,1203.3179,96.797,88.711,91.231
|
||||||
|
2016-02-01,30.323,1216.2285,97.107,91.062,91.474
|
||||||
|
2016-03-01,37.54636363636364,1181.573,96.39,90.023,91.753
|
||||||
|
2016-04-01,40.7552380952381,1145.7967,96.438,90.067,92.005
|
||||||
|
2016-05-01,46.712380952380954,1173.7905,96.187,89.133,92.131
|
||||||
|
2016-06-01,48.75727272727273,1165.2023,96.332,87.742,92.221
|
||||||
|
2016-07-01,44.6515,1140.865,94.26,87.734,92.437
|
||||||
|
2016-08-01,44.72434782608696,1110.0183,94.386,88.94,92.59
|
||||||
|
2016-09-01,45.18238095238095,1108.3638,94.434,93.271,92.599
|
||||||
|
2016-10-01,49.775238095238095,1128.166,96.661,91.986,92.689
|
||||||
|
2016-11-01,45.66095238095238,1162.708,97.213,90.621,92.734
|
||||||
|
2016-12-01,51.9704761904762,1183.07,96.254,91.581,92.914
|
||||||
|
2017-01-01,52.504,1179.1074,96.545,94.346,93.346
|
||||||
|
2017-02-01,53.46842105263158,1140.4874,97.097,94.434,93.589
|
||||||
|
2017-03-01,49.32782608695652,1133.8617,97.426,93.606,93.85
|
||||||
|
2017-04-01,51.060526315789474,1134.1755,97.513,92.611,94.012
|
||||||
|
2017-05-01,48.47636363636364,1125.1359,97.852,92.312,94.291
|
||||||
|
2017-06-01,45.177727272727275,1130.8464,97.939,91.643,94.354
|
||||||
|
2017-07-01,46.630526315789474,1131.746,97.939,91.907,94.65
|
||||||
|
2017-08-01,48.03695652173913,1130.27,98.065,94.645,94.92
|
||||||
|
2017-09-01,49.822,1131.599,98.104,95.825,94.794
|
||||||
|
2017-10-01,51.57772727272727,1130.8838,98.336,93.465,94.983
|
||||||
|
2017-11-01,56.63857142857143,1099.7945,97.494,90.859,95.073
|
||||||
|
2017-12-01,57.8815,1082.902,97.678,91.951,95.433
|
||||||
|
2018-01-01,63.698571428571434,1065.641,97.852,93.324,95.865
|
||||||
|
2018-02-01,62.22947368421052,1078.4747,98.404,96.027,96.216
|
||||||
|
2018-03-01,62.724761904761905,1069.9418,98.569,94.486,96.531
|
||||||
|
2018-04-01,66.25380952380952,1068.0452,98.549,94.962,96.9
|
||||||
|
2018-05-01,69.97818181818182,1076.6595,98.53,94.073,97.233
|
||||||
|
2018-06-01,67.87333333333333,1094.3552,98.452,92.866,97.323
|
||||||
|
2018-07-01,70.98142857142857,1122.2029,96.903,93.148,97.637
|
||||||
|
2018-08-01,68.05565217391305,1120.427,97.145,98.026,97.853
|
||||||
|
2018-09-01,70.2321052631579,1119.82,98.801,101.424,97.691
|
||||||
|
2018-10-01,70.74869565217391,1131.615,99.072,98.748,97.835
|
||||||
|
2018-11-01,56.963499999999996,1125.345,98.995,95.675,98.033
|
||||||
|
2018-12-01,49.522777777777776,1122.4244,98.975,95.842,98.384
|
||||||
|
2019-01-01,51.37571428571429,1120.33,98.724,95.789,98.699
|
||||||
|
2019-02-01,54.95473684210527,1121.8333,99.876,96.441,98.87
|
||||||
|
2019-03-01,58.151428571428575,1131.6005,99.74,95.508,98.636
|
||||||
|
2019-04-01,63.862380952380946,1142.165,99.498,96.318,98.789
|
||||||
|
2019-05-01,60.82681818181818,1182.9527,99.576,95.816,98.978
|
||||||
|
2019-06-01,54.657500000000006,1173.7845,99.634,94.768,99.068
|
||||||
|
2019-07-01,57.35809523809524,1177.2345,98.249,93.923,99.284
|
||||||
|
2019-08-01,54.80590909090909,1210.3782,98.327,94.821,99.545
|
||||||
|
2019-09-01,56.947,1194.1145,99.905,97.304,99.05
|
||||||
|
2019-10-01,53.96304347826087,1183.4473,100.06,97.497,99.212
|
||||||
|
2019-11-01,57.048947368421054,1167.2989,100.05,94.988,99.23
|
||||||
|
2019-12-01,59.81666666666667,1174.7052,100.215,95.974,99.374
|
||||||
|
2020-01-01,57.519047619047626,1167.4624,100.17,97.16,99.72
|
||||||
|
2020-02-01,50.54263157894737,1195.3358,100.76,96.66,99.65
|
||||||
|
2020-03-01,29.207727272727276,1218.1945,100.68,98.06,99.5
|
||||||
|
2020-04-01,16.547619047619047,1223.1309,100.56,97.65,99.58
|
||||||
|
2020-05-01,28.5625,1228.134,100.2,98.45,99.79
|
||||||
|
2020-06-01,38.307272727272725,1206.9459,100.29,98.68,99.88
|
||||||
|
2020-07-01,40.710454545454546,1198.6186,98.14,99.15,100.12
|
||||||
|
2020-08-01,42.33904761904762,1186.8562,98.46,101.8,100.39
|
||||||
|
2020-09-01,39.63428571428571,1176.8619,99.97,104.79,100.21
|
||||||
|
2020-10-01,39.39590909090909,1143.7681,100.26,104.85,100.43
|
||||||
|
2020-11-01,40.93736842105263,1116.0978,100.18,101.24,100.23
|
||||||
|
2020-12-01,47.025,1093.7876,100.3,101.51,100.51
|
||||||
|
2021-01-01,52.008421052631576,1098.2367,100.35,103.39,100.79
|
||||||
|
2021-02-01,59.04631578947369,1111.8137,100.89,105.69,101.06
|
||||||
|
2021-03-01,62.333043478260876,1130.2543,101.18,105.84,101.42
|
||||||
|
2021-04-01,61.71666666666666,1117.8555,101.17,105.35,101.94
|
||||||
|
2021-05-01,65.1695,1123.6565,101.44,105.16,102.13
|
||||||
|
2021-06-01,71.37818181818182,1122.6073,101.61,104.56,102.32
|
||||||
|
2021-07-01,72.4852380952381,1146.3948,100.52,104.75,102.9
|
||||||
|
2021-08-01,67.73045454545455,1160.9945,100.78,106.2,103.39
|
||||||
|
2021-09-01,71.64619047619047,1172.819,102.28,107.87,103.44
|
||||||
|
2021-10-01,81.47666666666666,1181.89,102.87,106.72,103.82
|
||||||
|
2021-11-01,79.14750000000001,1184.06,103.11,107.25,104.28
|
||||||
|
2021-12-01,71.71181818181819,1183.8871,103.4,107.85,105.26
|
||||||
|
2022-01-01,83.22200000000001,1196.0345,103.95,109.34,106.26
|
||||||
|
2022-02-01,91.64105263157894,1199.1226,104.77,109.63,107.13
|
||||||
|
2022-03-01,108.50260869565217,1220.8409,104.9,109.55,107.91
|
||||||
|
2022-04-01,101.7775,1235.1533,105.83,110.29,108.51
|
||||||
|
2022-05-01,109.55238095238094,1268.8081,106.49,111.35,109.55
|
||||||
|
2022-06-01,114.83714285714285,1277.4057,106.83,111.32,110.38
|
||||||
|
2022-07-01,101.619,1308.0295,106.71,112.99,111.59
|
||||||
|
2022-08-01,93.66521739130435,1319.4122,106.91,114.56,112.61
|
||||||
|
2022-09-01,84.25809523809524,1396.3729,108.39,116.06,112.57
|
||||||
|
2022-10-01,87.5547619047619,1426.065,110.49,114.72,112.94
|
||||||
|
2022-11-01,84.37047619047618,1361.79,110.43,112.46,113.12
|
||||||
|
2022-12-01,76.43714285714286,1293.5629,110.57,113.53,113.83
|
||||||
|
2023-01-01,78.123,1243.0705,111.75,115.37,114.41
|
||||||
|
2023-02-01,76.83263157894737,1275.4205,112.35,115.91,115.0
|
||||||
|
2023-03-01,73.27782608695652,1306.0161,111.97,116.46,115.84
|
||||||
|
2023-04-01,79.44631578947369,1322.057,111.99,115.9,116.69
|
||||||
|
2023-05-01,71.57818181818182,1327.48,112.55,115.99,117.04
|
||||||
|
2023-06-01,70.24809523809525,1297.2514,113.11,116.3,117.25
|
||||||
|
2023-07-01,76.0695,1282.2835,111.75,117.3,117.94
|
||||||
|
2023-08-01,81.38608695652174,1321.7561,111.85,120.53,118.4
|
||||||
|
2023-09-01,89.425,1334.237,113.3,122.46,117.96
|
||||||
|
2023-10-01,85.63952380952381,1351.5071,113.67,122.85,118.18
|
||||||
|
2023-11-01,77.685,1308.154,113.58,119.8,118.38
|
||||||
|
2023-12-01,71.9,1304.3945,113.72,120.56,118.88
|
||||||
|
2024-01-01,74.15238095238095,1325.9119,113.84,122.2,119.09
|
||||||
|
2024-02-01,77.249,1331.3345,114.22,123.96,119.39
|
||||||
|
2024-03-01,81.27799999999999,1331.6752,114.11,124.22,119.78
|
||||||
|
2024-04-01,85.34727272727274,1367.8555,114.15,122.75,120.14
|
||||||
|
2024-05-01,80.02454545454545,1364.7241,114.26,121.9,120.38
|
||||||
|
2024-06-01,79.76736842105262,1379.0526,114.43,120.68,120.77
|
||||||
|
2024-07-01,81.80045454545454,1382.0473,113.07,121.54,121.32
|
||||||
|
2024-08-01,76.68318181818182,1351.4436,113.92,122.99,121.65
|
||||||
|
2024-09-01,70.236,1330.6985,115.36,124.72,121.02
|
||||||
|
2024-10-01,71.985,1362.3691,115.51,124.53,121.63
|
||||||
|
2024-11-01,69.95,1395.02,115.48,121.32,121.87
|
||||||
|
2024-12-01,70.11809523809524,1439.9967,115.67,123.61,122.18
|
||||||
|
|
After Width: | Height: | Size: 340 KiB |
|
After Width: | Height: | Size: 201 KiB |
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 236 KiB |
|
After Width: | Height: | Size: 221 KiB |
@@ -0,0 +1,14 @@
|
|||||||
|
"시도별","지출목적별",2015.01,2015.02,2015.03,2015.04,2015.05,2015.06,2015.07,2015.08,2015.09,2015.10,2015.11,2015.12,2016.01,2016.02,2016.03,2016.04,2016.05,2016.06,2016.07,2016.08,2016.09,2016.10,2016.11,2016.12,2017.01,2017.02,2017.03,2017.04,2017.05,2017.06,2017.07,2017.08,2017.09,2017.10,2017.11,2017.12,2018.01,2018.02,2018.03,2018.04,2018.05,2018.06,2018.07,2018.08,2018.09,2018.10,2018.11,2018.12,2019.01,2019.02,2019.03,2019.04,2019.05,2019.06,2019.07,2019.08,2019.09,2019.10,2019.11,2019.12,2020.01,2020.02,2020.03,2020.04,2020.05,2020.06,2020.07,2020.08,2020.09,2020.10,2020.11,2020.12,2021.01,2021.02,2021.03,2021.04,2021.05,2021.06,2021.07,2021.08,2021.09,2021.10,2021.11,2021.12,2022.01,2022.02,2022.03,2022.04,2022.05,2022.06,2022.07,2022.08,2022.09,2022.10,2022.11,2022.12,2023.01,2023.02,2023.03,2023.04,2023.05,2023.06,2023.07,2023.08,2023.09,2023.10,2023.11,2023.12,2024.01,2024.02,2024.03,2024.04,2024.05,2024.06,2024.07,2024.08,2024.09,2024.10,2024.11,2024.12,2025.01,2025.02,2025.03,2025.04,2025.05,2025.06,2025.07,2025.08,2025.09,2025.10,2025.11,2025.12,2026.01,2026.02,2026.03,2026.04,2026.05,2026.06
|
||||||
|
"전국","0 총지수",94.643,94.587,94.596,94.625,94.890,94.909,95.080,95.213,94.966,94.966,94.786,95.070,95.232,95.640,95.393,95.573,95.630,95.611,95.431,95.677,96.247,96.379,96.237,96.342,97.366,97.632,97.565,97.442,97.546,97.338,97.499,98.058,98.172,98.077,97.347,97.698,98.106,98.855,98.751,98.931,98.979,98.779,98.590,99.462,100.221,100.041,99.330,98.988,98.884,99.311,99.121,99.481,99.652,99.491,99.187,99.425,99.794,100.041,99.481,99.719,100.09,100.16,99.94,99.50,99.44,99.71,99.63,100.19,100.74,100.18,100.09,100.33,101.04,101.58,101.84,101.98,102.05,102.05,102.26,102.75,103.17,103.35,103.87,104.04,104.85,105.42,106.10,106.83,107.50,108.21,108.73,108.63,108.82,109.16,109.07,109.26,110.07,110.33,110.52,110.77,111.13,111.16,111.29,112.28,112.85,113.27,112.68,112.73,113.17,113.78,113.95,114.01,114.10,113.84,114.13,114.54,114.65,114.69,114.40,114.91,115.71,116.08,116.29,116.38,116.27,116.31,116.52,116.45,117.06,117.42,117.20,117.57,118.03,118.40,118.80,119.37,119.92,119.99
|
||||||
|
"전국","01 식료품 및 비주류음료",87.795,88.385,87.549,87.461,88.737,88.473,88.244,88.825,88.649,87.769,86.607,87.998,88.711,91.062,90.023,90.067,89.133,87.742,87.734,88.940,93.271,91.986,90.621,91.581,94.346,94.434,93.606,92.611,92.312,91.643,91.907,94.645,95.825,93.465,90.859,91.951,93.324,96.027,94.486,94.962,94.073,92.866,93.148,98.026,101.424,98.748,95.675,95.842,95.789,96.441,95.508,96.318,95.816,94.768,93.923,94.821,97.304,97.497,94.988,95.974,97.16,96.66,98.06,97.65,98.45,98.68,99.15,101.80,104.79,104.85,101.24,101.51,103.39,105.69,105.84,105.35,105.16,104.56,104.75,106.20,107.87,106.72,107.25,107.85,109.34,109.63,109.55,110.29,111.35,111.32,112.99,114.56,116.06,114.72,112.46,113.53,115.37,115.91,116.46,115.90,115.99,116.30,117.30,120.53,122.46,122.85,119.80,120.56,122.20,123.96,124.22,122.75,121.90,120.68,121.54,122.99,124.72,124.53,121.32,123.61,125.13,126.45,127.26,126.48,124.78,124.74,125.75,128.96,128.82,128.88,127.08,128.01,128.75,129.12,127.91,126.84,126.79,127.27
|
||||||
|
"전국","02 주류 및 담배",96.460,96.508,96.479,96.596,96.605,96.518,96.818,96.847,96.789,96.808,96.692,96.973,97.147,97.301,97.321,97.379,97.388,97.234,97.195,97.446,97.272,97.359,97.514,97.495,97.920,98.645,98.713,98.896,98.722,98.906,98.974,99.041,99.080,98.954,98.916,98.887,99.070,99.167,98.983,99.109,98.964,98.935,99.128,99.109,99.041,99.032,99.235,98.983,99.157,99.186,98.858,99.244,99.689,99.873,99.892,99.940,100.153,100.221,99.960,100.008,100.17,100.19,99.85,99.83,99.95,99.95,99.98,99.98,100.08,100.14,99.98,99.88,100.16,100.21,99.87,100.38,100.43,100.52,100.57,100.66,100.74,100.66,100.56,100.40,100.82,101.51,102.29,102.72,102.96,102.87,103.05,103.19,102.92,103.06,102.99,103.04,102.85,103.33,103.40,103.41,103.23,103.50,103.55,103.58,103.28,103.66,104.81,105.01,104.40,104.33,104.43,104.70,104.46,104.54,104.71,104.59,104.48,104.68,104.81,104.58,104.61,104.69,104.72,104.79,104.75,104.87,104.88,104.91,105.05,105.10,104.87,104.63,105.08,105.33,105.35,104.92,105.06,105.35
|
||||||
|
"전국","03 의류 및 신발",95.013,94.831,94.889,94.498,95.117,95.117,95.165,95.270,95.642,95.279,96.347,96.633,96.023,96.757,96.757,96.795,97.243,97.252,96.557,97.252,97.272,97.357,97.329,97.758,97.252,97.853,97.882,96.967,98.234,98.358,97.691,98.387,98.444,98.444,98.396,99.073,98.501,99.092,99.178,99.187,99.206,99.226,99.111,99.111,99.178,99.178,99.511,99.550,98.901,99.521,99.226,98.959,99.054,99.102,99.111,99.111,99.149,99.321,99.893,99.893,99.62,99.78,99.79,99.38,99.94,99.94,100.26,100.25,100.27,100.17,100.27,100.33,100.19,100.24,100.25,100.20,100.36,100.36,100.38,100.38,100.39,100.49,101.71,101.74,102.08,102.21,102.25,102.22,103.42,103.47,103.59,103.69,103.71,103.84,106.93,107.15,107.41,107.48,107.85,107.84,111.55,111.45,111.59,111.68,111.68,112.31,113.50,113.57,113.61,113.63,113.65,113.59,114.30,114.31,114.38,114.44,114.44,114.79,115.48,115.49,115.46,115.86,115.87,115.92,116.23,116.46,116.46,116.48,116.48,117.24,118.17,118.19,118.24,118.28,118.30,118.40,119.45,119.52
|
||||||
|
"전국","04 주택, 수도, 전기 및 연료",97.329,97.629,96.845,96.961,96.293,96.409,95.857,96.003,96.390,97.271,97.387,97.552,96.797,97.107,96.390,96.438,96.187,96.332,94.260,94.386,94.434,96.661,97.213,96.254,96.545,97.097,97.426,97.513,97.852,97.939,97.939,98.065,98.104,98.336,97.494,97.678,97.852,98.404,98.569,98.549,98.530,98.452,96.903,97.145,98.801,99.072,98.995,98.975,98.724,99.876,99.740,99.498,99.576,99.634,98.249,98.327,99.905,100.060,100.050,100.215,100.17,100.76,100.68,100.56,100.20,100.29,98.14,98.46,99.97,100.26,100.18,100.30,100.35,100.89,101.18,101.17,101.44,101.61,100.52,100.78,102.28,102.87,103.11,103.40,103.95,104.77,104.90,105.83,106.49,106.83,106.71,106.91,108.39,110.49,110.43,110.57,111.75,112.35,111.97,111.99,112.55,113.11,111.75,111.85,113.30,113.67,113.58,113.72,113.84,114.22,114.11,114.15,114.26,114.43,113.07,113.92,115.36,115.51,115.48,115.67,115.87,116.47,116.25,116.24,116.47,116.56,115.16,115.37,116.71,116.94,116.89,117.12,117.36,117.83,118.05,118.24,118.53,118.55
|
||||||
|
"전국","05 가정용품 및 가사 서비스",92.209,93.104,93.393,92.787,93.365,93.244,93.132,93.617,93.216,93.179,93.543,93.915,94.074,94.410,94.838,94.428,94.214,94.904,95.025,94.988,95.211,94.736,94.587,94.661,93.915,94.988,95.575,95.314,95.883,96.563,95.491,95.743,96.013,96.544,96.181,96.330,96.489,97.262,97.961,97.514,98.222,97.822,98.250,98.195,97.952,98.353,98.250,98.232,98.978,100.367,100.292,100.740,99.705,99.444,100.357,100.012,99.313,100.497,99.714,100.190,99.54,100.33,99.77,99.86,100.19,99.80,99.92,100.22,99.44,100.42,100.09,100.42,101.17,100.82,99.98,100.19,101.00,101.11,102.11,102.46,102.51,103.30,103.46,104.35,104.58,104.87,104.20,106.29,106.38,106.85,107.38,107.91,107.44,108.02,108.43,108.99,110.28,111.18,111.27,111.98,112.70,112.58,112.86,113.25,113.41,113.80,113.42,114.01,113.74,113.94,114.69,114.70,114.48,114.37,115.35,115.35,114.95,115.44,114.99,115.84,116.17,116.61,116.27,117.97,118.15,119.41,119.32,119.67,118.69,118.03,118.19,118.98,119.56,119.48,119.95,120.24,121.21,122.61
|
||||||
|
"전국","06 보건",96.143,96.336,96.394,96.346,96.336,96.336,96.297,96.326,96.105,96.374,96.288,96.297,97.251,97.203,97.193,97.251,97.270,97.289,97.270,97.193,97.231,97.174,97.289,97.347,98.349,98.349,98.252,97.944,97.973,98.435,98.483,98.493,97.963,97.809,97.559,97.694,98.714,98.753,98.849,98.426,98.406,98.570,97.568,97.617,97.568,97.472,97.395,97.357,98.262,98.358,98.329,98.406,98.416,98.714,98.522,98.531,98.618,98.666,98.637,98.734,100.40,100.31,100.36,100.34,100.36,100.80,99.84,99.76,99.31,99.62,99.50,99.40,100.22,100.23,100.31,100.03,99.88,99.79,99.91,99.92,99.70,99.63,99.74,99.70,100.83,100.86,100.40,100.57,100.53,100.61,100.62,100.78,100.61,101.09,101.11,101.06,102.13,102.23,102.28,101.90,102.01,102.40,102.47,102.56,102.51,102.63,102.80,102.83,103.98,104.06,104.25,104.26,104.52,104.25,104.27,104.37,104.50,104.44,104.56,104.56,105.42,105.43,105.45,105.53,105.56,105.54,105.50,105.56,105.49,105.60,105.66,105.57,106.63,106.41,106.83,106.77,106.72,106.92
|
||||||
|
"전국","07 교통",100.439,98.159,99.589,99.559,100.349,101.089,102.279,101.629,99.939,99.569,98.909,98.369,97.669,96.150,95.700,96.110,96.890,98.519,99.179,98.669,98.259,98.299,98.469,99.389,101.389,101.969,101.779,101.309,101.239,100.539,99.939,100.269,100.859,101.789,101.949,102.289,102.789,103.059,102.989,102.709,103.619,104.329,104.249,104.519,104.669,106.099,104.369,101.329,98.899,98.699,99.289,100.769,103.049,103.299,102.569,102.579,102.979,103.589,103.109,103.569,105.09,105.06,101.88,98.28,96.06,97.63,99.62,99.83,99.40,99.05,98.59,99.51,101.82,102.55,103.97,104.71,104.66,105.53,107.07,107.90,107.59,109.31,111.48,109.41,109.30,111.16,116.96,118.93,119.61,123.38,123.54,117.64,115.72,115.34,115.43,113.15,112.34,111.38,110.87,111.79,111.52,109.74,110.25,114.09,115.28,117.29,114.98,112.89,111.97,113.64,114.00,115.02,115.74,114.01,116.00,116.17,113.90,112.56,113.69,114.32,115.62,116.19,115.67,114.55,114.28,114.15,115.82,116.27,115.21,116.40,117.31,117.99,116.94,117.42,121.44,125.62,127.54,126.82
|
||||||
|
"전국","08 통신",105.435,105.435,105.425,104.774,104.732,105.309,105.309,105.309,104.858,104.406,104.606,104.606,104.249,104.249,104.249,105.456,105.456,105.456,105.456,105.456,105.530,105.572,105.068,105.068,105.026,105.026,104.249,105.078,105.078,105.351,105.960,105.960,105.971,105.855,105.740,105.624,104.900,104.763,104.669,105.173,105.057,104.952,104.375,104.270,104.186,104.133,103.955,103.650,103.283,102.390,102.127,102.411,102.201,102.043,101.613,102.001,102.285,102.211,101.413,101.361,100.75,100.70,100.66,101.29,101.25,101.84,101.76,101.69,101.62,87.78,99.89,100.75,99.22,99.25,99.32,99.32,98.88,98.87,98.87,98.88,98.89,98.39,99.62,99.63,99.64,99.65,99.43,99.70,99.71,99.72,99.75,99.76,100.06,100.92,100.92,100.92,100.92,100.93,100.94,100.95,100.95,100.97,100.97,100.98,101.19,101.21,101.23,101.24,101.24,101.24,101.24,101.24,101.32,101.32,101.32,101.32,101.32,101.32,101.32,101.34,101.34,101.34,101.35,101.34,101.34,101.34,101.35,87.87,101.38,101.73,101.73,101.75,101.76,101.78,101.97,101.98,101.96,101.88
|
||||||
|
"전국","09 오락 및 문화",98.945,98.292,97.323,98.787,99.192,97.936,100.359,100.597,99.113,99.578,98.025,98.727,98.985,99.667,99.252,99.618,101.279,100.438,102.614,103.287,102.031,101.180,100.290,100.112,101.675,100.795,100.458,102.021,100.953,98.985,102.080,102.199,100.715,101.695,98.866,98.925,99.351,100.755,100.448,102.011,102.199,100.300,101.922,102.674,102.792,102.347,100.696,99.766,100.468,101.319,100.587,101.615,101.200,100.181,101.685,102.515,101.418,101.774,100.092,99.420,100.12,99.83,99.40,99.71,100.02,99.84,100.23,100.69,100.03,100.33,99.92,99.89,100.13,100.03,99.82,100.40,100.53,99.89,100.72,101.21,100.63,100.65,100.38,100.81,101.56,101.01,101.62,102.37,102.61,103.27,104.18,104.96,104.17,104.18,104.24,105.34,106.06,106.09,106.39,106.79,106.96,107.10,107.57,107.92,107.63,107.69,107.24,107.35,107.35,108.41,107.96,108.45,108.81,108.74,109.45,109.35,108.86,108.71,108.15,108.66,109.63,108.89,108.99,109.86,110.14,109.49,110.16,110.38,109.58,110.99,109.66,109.93,110.57,112.17,112.01,113.65,115.70,115.44
|
||||||
|
"전국","10 교육",96.691,96.818,97.286,97.520,97.559,97.598,97.657,97.725,97.871,97.881,97.900,97.969,98.378,98.603,98.925,99.042,99.168,99.188,99.237,99.276,99.403,99.442,99.461,99.500,99.783,99.939,100.183,100.271,100.300,100.329,100.339,100.378,100.407,100.417,100.446,100.476,100.856,101.139,101.431,101.636,101.675,101.695,101.714,101.812,101.890,101.948,101.948,101.997,102.456,102.563,102.602,102.660,102.748,102.797,102.797,102.826,101.031,101.168,101.217,101.275,99.86,100.04,100.03,100.06,99.97,100.01,100.08,100.17,99.87,99.90,99.97,100.03,100.25,100.39,100.77,100.89,100.89,100.95,101.00,101.10,100.94,101.04,101.05,101.15,101.48,101.66,101.73,101.94,102.10,102.42,102.52,102.61,102.54,102.53,102.47,102.70,103.19,103.43,104.07,104.31,104.40,104.44,104.46,104.46,104.49,104.55,104.48,104.52,104.96,105.09,105.43,105.76,105.90,105.91,106.18,106.41,106.51,106.56,106.63,106.74,107.17,107.26,108.45,108.67,108.74,108.85,108.90,108.93,108.61,108.50,108.44,108.48,108.83,109.07,109.61,109.89,110.16,110.15
|
||||||
|
"전국","11 음식 및 숙박",88.793,88.946,89.495,89.702,89.792,89.936,90.143,90.323,90.431,90.539,90.656,90.926,91.231,91.474,91.753,92.005,92.131,92.221,92.437,92.590,92.599,92.689,92.734,92.914,93.346,93.589,93.850,94.012,94.291,94.354,94.650,94.920,94.794,94.983,95.073,95.433,95.865,96.216,96.531,96.900,97.233,97.323,97.637,97.853,97.691,97.835,98.033,98.384,98.699,98.870,98.636,98.789,98.978,99.068,99.284,99.545,99.050,99.212,99.230,99.374,99.72,99.65,99.50,99.58,99.79,99.88,100.12,100.39,100.21,100.43,100.23,100.51,100.79,101.06,101.42,101.94,102.13,102.32,102.90,103.39,103.44,103.82,104.28,105.26,106.26,107.13,107.91,108.51,109.55,110.38,111.59,112.61,112.57,112.94,113.12,113.83,114.41,115.00,115.84,116.69,117.04,117.25,117.94,118.40,117.96,118.18,118.38,118.88,119.09,119.39,119.78,120.14,120.38,120.77,121.32,121.65,121.02,121.63,121.87,122.18,122.65,122.86,123.38,123.99,124.35,124.39,125.15,125.46,125.05,125.52,125.40,125.84,126.10,126.59,126.76,127.26,127.65,127.70
|
||||||
|
"전국","12 기타 상품 및 서비스",89.991,90.118,90.515,90.163,90.343,90.118,90.045,90.488,90.100,90.262,90.614,90.497,92.880,93.205,93.467,93.476,93.710,93.674,93.376,93.358,93.467,93.340,93.512,93.069,96.075,96.175,96.211,95.796,96.202,95.696,95.931,95.850,95.868,96.139,95.778,95.877,95.787,96.157,96.382,96.617,96.572,96.707,96.455,96.698,96.807,96.626,96.879,96.707,97.357,97.664,97.836,98.052,98.395,98.152,98.224,98.188,98.188,98.260,98.323,98.341,99.40,99.74,99.66,99.44,99.84,99.97,100.21,100.11,100.87,100.16,100.40,100.20,101.41,101.31,101.55,102.14,102.31,102.00,102.08,102.30,102.10,102.23,101.80,102.81,105.00,106.35,106.09,105.83,107.73,108.70,109.12,109.22,109.61,110.06,110.46,111.04,112.99,113.27,113.61,114.75,114.29,114.47,114.77,115.19,115.30,115.25,115.27,115.58,118.38,118.25,118.49,119.14,119.13,119.63,119.78,119.23,118.97,120.08,120.20,119.71,123.00,123.07,123.52,124.98,124.94,124.93,124.98,124.93,125.17,125.26,125.23,125.57,129.10,129.38,129.19,130.06,130.11,130.19
|
||||||
|
|
After Width: | Height: | Size: 340 KiB |
|
After Width: | Height: | Size: 201 KiB |
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 236 KiB |
|
After Width: | Height: | Size: 221 KiB |
@@ -0,0 +1,254 @@
|
|||||||
|
\documentclass{article}
|
||||||
|
\usepackage{kotex}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{booktabs}
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage[margin=3cm]{geometry}
|
||||||
|
\usepackage[style=apa,backend=biber]{biblatex}
|
||||||
|
\usepackage{parskip} % 문단 사이 간격 자동 삽입
|
||||||
|
\usepackage{titlesec} % 섹션 제목 간격 조정
|
||||||
|
\usepackage{float}
|
||||||
|
|
||||||
|
% 줄 간격 (가독성)
|
||||||
|
\linespread{1.15}
|
||||||
|
|
||||||
|
% 문단 사이 간격
|
||||||
|
\setlength{\parskip}{0.6em}
|
||||||
|
|
||||||
|
% 섹션 제목 위아래 여백
|
||||||
|
\titlespacing*{\section}{0pt}{1.4em}{0.7em}
|
||||||
|
\titlespacing*{\subsection}{0pt}{1.1em}{0.5em}
|
||||||
|
|
||||||
|
% 표 안 행 간격
|
||||||
|
\renewcommand{\arraystretch}{1.3}
|
||||||
|
|
||||||
|
\addbibresource{references.bib}
|
||||||
|
\graphicspath{{images/}}
|
||||||
|
|
||||||
|
\title{국제 유가 충격의 국내 소비자물가 품목별 전이 분석\\
|
||||||
|
\large VAR 충격반응함수를 이용한 에너지, 식품, 서비스 비교}
|
||||||
|
\author{3513 이승준}
|
||||||
|
\date{July 11, 2026}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
\vspace{2cm}
|
||||||
|
|
||||||
|
\section{서론}
|
||||||
|
|
||||||
|
국제 유가가 소비자물가(CPI)에 영향을 미치는 외생 충격원이라는 사실은 명백히 연구된 사실이다~\parencite{kilian2009}.
|
||||||
|
그러나 대부분의 연구는 유가가 총물가에 미치는 영향에 집중하였으며, 유가 충격이 품목마다 얼마나 빠르게, 얼마나 강하게 전달되는지의 차이에 대한 연구는 부족한다.
|
||||||
|
품목별 전이 속도의 차이는 물가 안정 정책의 대응 시점을 설계하는 데 중요한 요소로 작용하기에, 품목별 영향에 대한 분석은 중요하다.
|
||||||
|
|
||||||
|
이에 따라 본 연구의 질문은 다음과 같다.
|
||||||
|
"유가 충격은 에너지, 식품, 서비스 세 품목으로 각각 어떻게 다르게 전이되는가?"
|
||||||
|
이를 하나의 시차 숫자로 일반화하는 것이 아닌, 전이 속도, 평균 시차, 누적 강도의 세 지표로 나누어 분석한다.
|
||||||
|
|
||||||
|
각 품목별 가설은 다음과 같다.
|
||||||
|
에너지는 유가와 직접 연동되므로 가장 빠르게, 서비스는 임금과 임대료 등 경직적 비용을 통해 가장 느리게 전이되며, 식품은 그 중간일 것으로 예상한다.
|
||||||
|
|
||||||
|
\section{선행연구}
|
||||||
|
|
||||||
|
국내 연구로, 유가를 외생변수로 포함한 VAR을 이용해 환율 충격이 수입물가에서 생산자물가를 거쳐 소비자물가로 단계적으로 전이됨을 보인 연구가 있다~\parencite{lee2009}.
|
||||||
|
또한 유가 상승이 소비자물가와 근원물가에 미치는 영향을 패널 모형으로 추정하여 그 효과가 상당 기간 지속됨을 확인한 연구도 있다~\parencite{ma2026}.
|
||||||
|
|
||||||
|
해외 연구로, 유가 충격을 공급 요인과 수요 요인으로 분해해야 함을 제시한 표준적 연구가 있다~\parencite{kilian2009}.
|
||||||
|
나아가 유가 충격이 헤드라인 물가에는 크게 반영되지만 근원물가로의 전이는 약하고 국가별로 이질적임을 보인 연구도 있다~\parencite{kilian2023}.
|
||||||
|
|
||||||
|
기존 연구가 총물가 또는 헤드라인과 근원의 이분법에 머문 데 비해, 본 연구는 소비자물가를 에너지, 식품, 서비스로 분해하고 전이를 세 지표로 측정하여 품목 간 이질성을 직접 비교한다는 점에서 차별성을 갖는다.
|
||||||
|
|
||||||
|
\section{자료 및 변수}
|
||||||
|
|
||||||
|
분석 기간은 2015년 1월부터 2024년 12월까지 월별 120개 관측치다. 변수는 세 종류로 구성된다.
|
||||||
|
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering
|
||||||
|
\small
|
||||||
|
\begin{tabular}{llll}
|
||||||
|
\toprule
|
||||||
|
구분 & 변수 & 출처 & 비고 \\
|
||||||
|
\midrule
|
||||||
|
독립변수 & WTI 국제유가 & EIA & 일별을 월평균으로 집계 \\
|
||||||
|
종속변수 & 에너지 CPI & 통계청 KOSIS & 주택, 수도, 전기, 연료 \\
|
||||||
|
& 식품 CPI & 통계청 KOSIS & 식료품, 비주류음료 \\
|
||||||
|
& 서비스 CPI & 통계청 KOSIS & 음식, 숙박 \\
|
||||||
|
통제변수 & 원/달러 환율 & 한국은행 & 유가의 원화 환산 효과 통제 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\caption{변수 정의 및 출처}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\subsection{로그 변환}
|
||||||
|
|
||||||
|
모든 변수는 분석에 앞서 자연로그로 변환했다. 로그 변환에는 세 가지 이유가 있다.
|
||||||
|
|
||||||
|
첫째, 로그값의 차이가 곧 변화율이 된다.
|
||||||
|
한 변수가 연속복리 형태로 변한다고 보면 다음이 성립한다.
|
||||||
|
\begin{equation}
|
||||||
|
x_{t+1} = x_t \, e^{r}
|
||||||
|
\end{equation}
|
||||||
|
양변을 정리하면 $e^{r} = x_{t+1}/x_t$ 이고, 로그를 취하면 다음을 얻는다.
|
||||||
|
\begin{equation}
|
||||||
|
r = \ln\!\left(\frac{x_{t+1}}{x_t}\right) = \ln x_{t+1} - \ln x_t
|
||||||
|
\end{equation}
|
||||||
|
즉 로그값의 1차 차분 $\ln x_{t+1} - \ln x_t$ 는 그 기간의 변화율 $r$ 과 같다. 이로써 충격반응을 탄력성, 곧 유가 1\% 충격에 대한 물가의 \% 반응으로 해석할 수 있다.
|
||||||
|
|
||||||
|
둘째, 변수마다 단위가 다르다. 유가는 달러, 환율은 원, CPI는 지수다. 로그를 취하면 모든 변수가 변화율(\%) 단위로 통일되어 품목 간 비교가 가능해진다.
|
||||||
|
|
||||||
|
셋째, 유가처럼 값이 클 때 변동폭도 커지는 변수는 로그 변환으로 분산이 안정화되어 통계적 처리에 유리하다.
|
||||||
|
|
||||||
|
\subsection{시계열의 비정상성}
|
||||||
|
|
||||||
|
유가와 CPI는 모두 시간에 따라 관측된 시계열이다.
|
||||||
|
그림 1의 원자료 추이를 보면 유가는 큰 폭으로 등락하고, 환율과 세 품목의 CPI는 완만한 상승 추세를 보인다.
|
||||||
|
특히 에너지 CPI와 서비스 CPI는 뚜렷한 우상향 추세를 가진다.
|
||||||
|
이처럼 평균이 시간에 따라 이동하는 시계열은 비정상일 가능성이 높으며, 비정상 시계열을 그대로 회귀하면 실제 관계가 없어도 상관이 있는 것처럼 나타나는 가성회귀 문제가 발생한다.
|
||||||
|
따라서 분석에 앞서 각 변수의 정상성 여부를 검정할 필요가 있다.
|
||||||
|
|
||||||
|
\begin{figure}[ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{01_원자료_시계열.png}
|
||||||
|
\caption{원자료 시계열 추이 (2015--2024): 유가, 환율, 에너지 CPI, 식품 CPI}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\section{연구 방법}
|
||||||
|
|
||||||
|
\subsection{단위근 검정과 차분}
|
||||||
|
|
||||||
|
정상성을 판정하기 위해 각 변수에 ADF(Augmented Dickey-Fuller) 검정을 수행했다. 어떤 시계열이 다음과 같이 자기 자신의 과거값에 의존한다고 하자.
|
||||||
|
\begin{equation}
|
||||||
|
y_t = \rho \, y_{t-1} + \varepsilon_t
|
||||||
|
\end{equation}
|
||||||
|
여기서 $\rho = 1$ 인 경우를 단위근이 있다고 하며, 충격이 사라지지 않고 누적되어 추세가 생긴다.
|
||||||
|
이때 시계열은 비정상이다.
|
||||||
|
반면 $\rho < 1$ 이면 충격이 시간이 지나며 소멸하여 평균으로 회귀하므로 정상이다.
|
||||||
|
ADF 검정의 귀무가설은 단위근 존재(비정상)이며, $p < 0.05$ 일 때 이를 기각하여 정상으로 판정한다.
|
||||||
|
|
||||||
|
수준 변수가 비정상으로 판정되면 차분을 시도한다.
|
||||||
|
차분은 이번 값에서 직전 값을 빼는 연산으로, 추세를 제거하여 비정상 시계열을 정상 시계열로 바꾸는 표준적 방법이다.
|
||||||
|
로그 변수의 1차 차분은 앞서 보았듯 변화율에 해당한다.
|
||||||
|
1차 차분으로 정상이 되는 시계열을 I(1)로 분류한다.
|
||||||
|
|
||||||
|
\subsection{모형 선택}
|
||||||
|
|
||||||
|
후술하는 검정 결과, 모든 변수가 수준에서 비정상이었고, 나아가 에너지와 서비스는 1차 차분 후에도 비정상이었다.
|
||||||
|
변수마다 정상화에 필요한 차분 차수가 다르면 하나의 차분 VAR로 묶기 어렵고, 과도한 차분은 장기 균형관계 정보를 훼손한다.
|
||||||
|
이에 본 연구는 차분 대신 로그 수준 변수로 VAR을 추정하는 접근을 택했다~\parencite{sims1990}.
|
||||||
|
변수 간 공적분이 존재하면 수준 VAR의 충격반응함수는 일치추정량이 되므로, 유가와 물가의 전이 분석에서 널리 사용되는 방법이다.
|
||||||
|
계절성은 월별 계절더미로 통제했다.
|
||||||
|
|
||||||
|
\subsection{VAR 모형}
|
||||||
|
|
||||||
|
VAR(Vector Autoregression)은 여러 시계열 변수를 각각 모든 변수의 과거값으로 설명하는 모형이다.
|
||||||
|
방향을 미리 정하지 않고 변수 간 상호작용을 열어둔 채 추정하므로, 유가와 물가가 서로 영향을 주고받는 구조를 담기에 적합하다.
|
||||||
|
본 연구는 품목별로 유가, 환율, 해당 품목 CPI의 3변수 VAR을 추정했다.
|
||||||
|
|
||||||
|
시차는 AIC(Akaike Information Criterion)로 선택했다.
|
||||||
|
AIC는 모형의 적합도와 복잡도를 동시에 반영하는 지표로, 시차를 늘리면 적합도가 좋아지는 대신 추정할 계수가 늘어 복잡도 벌점이 커진다.
|
||||||
|
두 항의 합이 최소가 되는 시차가 과소적합과 과적합 사이의 균형점이며, 본 연구는 시차 1부터 12까지 후보 중 AIC가 최소인 시차를 품목별로 선택했다.
|
||||||
|
|
||||||
|
충격반응함수(IRF)는 유가에 1단위 충격이 가해졌을 때 각 품목 CPI가 시간에 따라 반응하는 경로다.
|
||||||
|
이때 유가, 환율, CPI가 동시점에 얽혀 있으므로 순수한 유가 충격을 분리하기 위해 Cholesky 분해를 적용했다.
|
||||||
|
변수 순서는 외생성이 강한 순서, 곧 유가, 환율, 품목 CPI로 두었다.
|
||||||
|
국제 유가는 국내 변수에 동시점에서 영향받지 않는 가장 외생적인 변수이므로 이 순서가 타당하다.
|
||||||
|
|
||||||
|
\subsection{그랜저 인과성}
|
||||||
|
|
||||||
|
그랜저 인과성은 한 변수의 과거값이 다른 변수의 예측을 개선하는지를 검정한다.
|
||||||
|
유가의 과거값을 포함한 모형이 포함하지 않은 모형보다 품목 CPI를 유의하게 잘 예측하면, 유가가 품목 CPI를 그랜저 인과한다고 본다.
|
||||||
|
이는 원인과 결과를 뜻하기보다 유가가 물가에 선행하는지를 확인하는 검정으로, 본 연구에서는 유가와 각 품목의 2변수 검정으로 IRF 해석을 보조한다.
|
||||||
|
|
||||||
|
\subsection{전이 지표}
|
||||||
|
|
||||||
|
수준 VAR의 IRF는 물가 수준의 반응을 누적하여 우상향하므로, 반응이 최대인 시점 하나만으로는 전이 속도를 판단할 수 없다.
|
||||||
|
이에 세 지표를 함께 사용한다.
|
||||||
|
전이 속도는 충격 직후 1개월의 반응으로 전이가 얼마나 빨리 시작되는지를, 평균 시차는 월별 전이량의 가중평균 시점으로 전이의 무게중심을, 누적은 12개월 총 전이량으로 전이가 실질적으로 유의미한지를 나타낸다.
|
||||||
|
|
||||||
|
\section{분석 결과}
|
||||||
|
|
||||||
|
\subsection{단위근 검정}
|
||||||
|
|
||||||
|
표 2와 같이 모든 변수가 수준에서 비정상($p > 0.05$)이었다. 1차 차분 후 유가, 환율, 식품은 정상이 되었으나 에너지($p = 0.36$)와 서비스($p = 0.38$)는 여전히 비정상이었다. 서비스 물가는 임금과 임대료에 기반한 강한 추세를, 에너지는 강한 계절성을 갖기 때문으로 해석된다. 이 결과가 차분 VAR 대신 수준 VAR을 택한 근거다.
|
||||||
|
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering
|
||||||
|
\small
|
||||||
|
\begin{tabular}{lrrl}
|
||||||
|
\toprule
|
||||||
|
변수 & 수준 $p$값 & 1차 차분 $p$값 & 판정 \\
|
||||||
|
\midrule
|
||||||
|
유가 & 0.220 & 0.000 & I(1) \\
|
||||||
|
환율 & 0.903 & 0.000 & I(1) \\
|
||||||
|
에너지 & 0.943 & 0.364 & 차분 후에도 비정상 \\
|
||||||
|
식품 & 0.981 & 0.009 & I(1) \\
|
||||||
|
서비스 & 0.968 & 0.377 & 차분 후에도 비정상 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\caption{ADF 단위근 검정 결과}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\subsection{시차 선택 및 그랜저 인과성}
|
||||||
|
|
||||||
|
AIC 기준 최적 시차는 에너지 3, 식품 4, 서비스 2였다.
|
||||||
|
그랜저 인과성 검정에서 유가는 서비스($p = 0.0001$)와 에너지(3시차 $p = 0.004$)를 유의하게 선행했으나, 식품($p > 0.5$)은 유의하지 않았다.
|
||||||
|
유가가 식품 물가를 선행한다는 통계적 근거가 약한 것이다.
|
||||||
|
|
||||||
|
\subsection{품목별 전이 지표}
|
||||||
|
|
||||||
|
표 3에 세 지표를 정리했다. 그림 2는 유가 충격에 대한 품목별 반응과 95\% 신뢰구간을, 그림 3은 월별 전이량을 보여준다.
|
||||||
|
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering
|
||||||
|
\small
|
||||||
|
\begin{tabular}{lrrr}
|
||||||
|
\toprule
|
||||||
|
품목 & 전이 속도 & 평균 전이 시차 & 12개월 누적 \\
|
||||||
|
\midrule
|
||||||
|
에너지 & $+0.0072$ & 4.81개월 & $+0.0465$ \\
|
||||||
|
식품 & $+0.0170$ & 1.45개월 & $-0.0059$ \\
|
||||||
|
서비스 & $+0.0007$ & 5.00개월 & $+0.0185$ \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\caption{품목별 전이 지표}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\begin{figure}[ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{04_품목별_IRF_신뢰구간.png}
|
||||||
|
\caption{유가 충격에 대한 품목별 소비자물가 반응 (95\% 신뢰구간)}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[ht]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.75\textwidth]{05_월별_전이량.png}
|
||||||
|
\caption{유가 충격의 월별 전이량 (수준 IRF의 기울기)}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
에너지는 전이 속도가 크고 누적이 세 품목 중 가장 크다.
|
||||||
|
충격 즉시 강하게 반응하여 지속적으로 쌓인다.
|
||||||
|
서비스는 전이 속도가 거의 0으로 초기 반응은 없지만 이후 꾸준히 전이되어 누적이 유의한 양수다.
|
||||||
|
식품은 1개월차에 반짝 반응한 뒤 곧 반전하여 누적이 사실상 0이며, 그랜저 인과성도 유의하지 않다.
|
||||||
|
|
||||||
|
\section{결론}
|
||||||
|
|
||||||
|
분석 결과 세 품목의 양상은 분명하게 드러났으며, 명백한 차이도 존재했다.
|
||||||
|
에너지는 빠르고 강하게, 서비스는 느리지만 지속적으로 전이됐으며, 식품은 실질적 전이가 관측되지 않았다.
|
||||||
|
이는 유가 전이 속도가 품목의 비용 구조를 따른다는 가설과 대체로 부합한다.
|
||||||
|
다만 식품은 유가보다 작황과 수급 요인의 영향이 커 예상과 달랐다.
|
||||||
|
|
||||||
|
방법론적으로, 식품의 평균 전이 시차(1.45개월)만 보면 가장 빠른 것처럼 보이지만 누적이 0에 가까워 실제로는 전이가 없다.
|
||||||
|
그렇기에 단일 지표로는 이러한 왜곡을 잡아낼 수 없으며, 전이 속도, 평균 시차, 누적을 모두 반영하였기에 밝혀낼 수 있었다.
|
||||||
|
|
||||||
|
본 연구는 몇 가지 한계를 갖는다.
|
||||||
|
첫째, 한국 수입유의 다수를 차지하는 두바이유 대신 WTI를 사용했다.
|
||||||
|
둘째, 유가 충격을 공급과 수요로 분해하지 않은 단순 VAR을 사용했다.
|
||||||
|
셋째, 유류세 인하 등 정책 개입을 통제하지 않았다.
|
||||||
|
|
||||||
|
그럼에도 본 연구는 유가 충격의 물가 전이가 품목별로 질적으로 다름을 세 지표로 실증했으며, 이는 품목별로 차등화된 물가 대응 정책을 설계하는 데 유의미한 근거를 제공할 것이라 생각한다.
|
||||||
|
|
||||||
|
\printbibliography
|
||||||
|
|
||||||
|
\end{document}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
@article{kilian2009,
|
||||||
|
author = {Kilian, Lutz},
|
||||||
|
title = {Not All Oil Price Shocks Are Alike: Disentangling Demand and Supply Shocks in the Crude Oil Market},
|
||||||
|
journal = {American Economic Review},
|
||||||
|
volume = {99},
|
||||||
|
number = {3},
|
||||||
|
pages = {1053--1069},
|
||||||
|
year = {2009}
|
||||||
|
}
|
||||||
|
|
||||||
|
@report{kilian2023,
|
||||||
|
author = {Kilian, Lutz and Zhou, Xiaoqing},
|
||||||
|
title = {Oil Price Shocks and Inflation},
|
||||||
|
institution = {Federal Reserve Bank of Dallas},
|
||||||
|
type = {Working Paper},
|
||||||
|
number = {2312},
|
||||||
|
year = {2023}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{lee2009,
|
||||||
|
author = {이근영},
|
||||||
|
title = {수입 및 국내물가에 대한 환율전가효과},
|
||||||
|
journal = {경제학연구},
|
||||||
|
volume = {57},
|
||||||
|
number = {4},
|
||||||
|
pages = {39--71},
|
||||||
|
year = {2009}
|
||||||
|
}
|
||||||
|
|
||||||
|
@report{ma2026,
|
||||||
|
author = {마창석},
|
||||||
|
title = {최근 국제유가 상승이 소비자물가에 미치는 영향},
|
||||||
|
institution = {한국개발연구원},
|
||||||
|
type = {KDI 현안분석},
|
||||||
|
year = {2026}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{sims1990,
|
||||||
|
author = {Sims, Christopher A. and Stock, James H. and Watson, Mark W.},
|
||||||
|
title = {Inference in Linear Time Series Models with Some Unit Roots},
|
||||||
|
journal = {Econometrica},
|
||||||
|
volume = {58},
|
||||||
|
number = {1},
|
||||||
|
pages = {113--144},
|
||||||
|
year = {1990}
|
||||||
|
}
|
||||||