Instrumental Variables
Definition
**도구변수(Instrumental Variables, IV)**는 내생성 문제를 해결하기 위해 사용하는 외생적 변수입니다.
유효한 도구변수 의 조건:
- 관련성(Relevance): — 도구가 내생 변수에 영향
- 배제 제한(Exclusion Restriction): — 도구가 결과에 직접 영향 없음
Intuitive Understanding
가격 내생성 문제에서 우리는 “수요와 무관한 가격 변동”을 찾아야 합니다.
도구변수는 마치 “자연 실험”처럼 작동합니다. 비용 충격(예: 원자재 가격 상승)은 가격에는 영향을 미치지만, 소비자의 지불 의사에는 직접 영향을 미치지 않습니다.
Key Properties
2SLS (Two-Stage Least Squares)
1단계: 내생 변수를 도구변수에 회귀
2단계: 결과를 예측된 내생 변수에 회귀
약한 도구변수 문제
1단계 F-통계량이 낮으면 약한 도구변수(Weak Instrument) 문제:
- 편향: OLS보다 심할 수 있음
- 신뢰 구간 왜곡
Stock-Yogo 규칙: F-통계량 > 10이면 안전
프라이싱에서의 유효한 도구변수
| 도구변수 유형 | 예시 | 타당성 |
|---|---|---|
| 비용 이동 변수 | 원자재 가격, 환율, 운송비 | 비용은 가격에 영향, 소비자 WTP에 직접 영향 없음 |
| Hausman IV | 다른 시장의 동일 제품 가격 | 비용 충격은 공통, 수요 충격은 지역적 |
| 경쟁 구조 | 경쟁자 수, BLP IV | 경쟁이 가격에 영향 |
Example
Python 구현
from linearmodels.iv import IV2SLS
import numpy as np
# 데이터
# Y: 로그 수량, X: 로그 가격 (내생적), Z: 비용 충격 (도구변수)
iv_model = IV2SLS(
dependent=np.log(data['quantity']),
exog=data<span class="wikilink-dead" title="비공개 노트">'const', 'quality'</span>, # 외생 통제 변수
endog=np.log(data['price']), # 내생 변수
instruments=data<span class="wikilink-dead" title="비공개 노트">'cost_shock', 'competitor_price'</span> # 도구변수
)
iv_results = iv_model.fit(cov_type='robust')
print(f"IV 탄력성: {iv_results.params['log_price']:.3f}")
print(f"표준오차: {iv_results.std_errors['log_price']:.3f}")
print(f"1단계 F-통계량: {iv_results.first_stage.diagnostics['f.stat'].stat:.2f}")
BLP 도구변수
Berry-Levinsohn-Pakes (1995)가 제안한 도구변수:
# 같은 시장 내 다른 제품의 특성 합
def create_blp_iv(data, characteristics, market_col='market', product_col='product'):
"""BLP 스타일 도구변수 생성"""
ivs = []
for char in characteristics:
# 같은 시장 내 다른 제품의 특성 합
market_sums = data.groupby(market_col)[char].transform('sum')
iv = market_sums - data[char]
ivs.append(iv)
return pd.DataFrame(ivs).T
blp_ivs = create_blp_iv(data, ['horsepower', 'weight', 'mpg'])
도구변수 진단
# 약한 도구변수 검정
from scipy import stats
# 1단계 회귀
first_stage = sm.OLS(data['log_price'], data[['const'] + instruments]).fit()
f_stat = first_stage.fvalue
print(f"1단계 F-통계량: {f_stat:.2f}")
if f_stat < 10:
print("경고: 약한 도구변수 가능성")
else:
print("도구변수 강도 적절")
# 과대식별 검정 (J-test) - 도구변수가 2개 이상일 때
# H0: 모든 도구변수가 유효
sargan_stat = iv_results.sargan.stat
sargan_pval = iv_results.sargan.pval
print(f"Sargan 검정: stat={sargan_stat:.2f}, p={sargan_pval:.3f}")
Related Concepts
- Endogeneity - IV가 해결하는 문제
- A-B Testing - 내생성 없는 대안
- Double-Debiased ML - ML과 결합한 IV (DRIV)
- Price Elasticity - IV로 추정하는 대상
References
- Angrist, J. D., & Pischke, J. S. (2008). Mostly Harmless Econometrics.
- Stock, J. H., & Yogo, M. (2005). “Testing for Weak Instruments in Linear IV Regression.”
- Berry, S., Levinsohn, J., & Pakes, A. (1995). “Automobile Prices in Market Equilibrium.”
- Comprehensive Personalized Pricing Guide, Part II, §6