Tae Hyun Kim (Lowell)

Instrumental Variables

정의

**도구변수(Instrumental Variables, IV)**는 내생성(endogeneity) 문제를 풀기 위해 끌어오는 외생 변수다. 처치를 직접 무작위화할 수 없을 때, 처치에는 영향을 주되 결과에는 직접 영향을 주지 않는 외부 변동을 이용해 인과효과를 식별(identification)한다.

유효한 도구변수 ZZ는 두 조건을 만족한다.

  1. 관련성(Relevance): Cov(Z,X)0Cov(Z, X) \neq 0 — 도구가 내생 변수에 영향을 준다.
  2. 배제 제한(Exclusion Restriction): Cov(Z,u)=0Cov(Z, u) = 0 — 도구가 결과에 직접 영향을 주지 않는다.

XZ(only through X)YX \leftarrow Z \rightarrow \text{(only through } X \text{)} \rightarrow Y

직관적 이해

가격 내생성 문제에서는 “수요와 무관한 가격 변동”을 찾아야 한다.

도구변수는 마치 “자연 실험”처럼 작동한다. 비용 충격(예: 원자재 가격 상승)은 가격에는 영향을 주지만, 소비자의 지불 의사에는 직접 영향을 주지 않는다.

핵심 성질

2SLS (Two-Stage Least Squares)

1단계: 내생 변수를 도구변수에 회귀한다. X=π0+π1Z+vX = \pi_0 + \pi_1 Z + v

2단계: 결과를 예측된 내생 변수에 회귀한다. Y=β0+β1X^+uY = \beta_0 + \beta_1 \hat{X} + u

약한 도구변수 문제

1단계 F-통계량이 낮으면 약한 도구변수(Weak Instrument) 문제가 생긴다.

  • 편향(bias): OLS보다 심할 수 있다.
  • 신뢰 구간이 왜곡된다.

Stock-Yogo 규칙: F-통계량 > 10이면 안전하다.

프라이싱에서의 유효한 도구변수

도구변수 유형예시타당성
비용 이동 변수원자재 가격, 환율, 운송비비용은 가격에 영향, 소비자 WTP에 직접 영향 없음
Hausman IV다른 시장의 동일 제품 가격비용 충격은 공통, 수요 충격은 지역적
경쟁 구조경쟁자 수, BLP IV경쟁이 가격에 영향

예시

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}")

관련 개념

참고 문헌

  • 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

연결 그래프