데이터

(스터디) 실무로 통하는 인과추론 with 파이썬 - PART 2

Yuniverse. 2024. 11. 9. 15:02

 

[실무로 통하는 인과추론 with 파이썬]을 읽고 내용을 정리한다.

(스터디) 실무로 통하는 인과추론 with 파이썬 - PART 1에서 이어집니다.

 


PART 2. 편향 보정

4장 유용한 선형회귀

회귀분석: 인과추론의 핵심이자 가장 많이 사용되는 방법으로 응용 방법론의 주요 구성 요소이기도 하다.

*선형회귀분석은 평균제곱오차(MSE, Mean Squared Error)를 최소화하는 매개변수를 찾는다.

보정 공식



보정 공식을 적용하려면? 데이터를 특성 X에 따라 여러 그룹으로 나눠야 한다.

데이터가 특성이 많고 일부가 이산형이 아닌 연속형이라면? → 차원의 저주 발생

 

< 차원의 저주 >
차원이 늘어날수록 데이터 포인트 간의 거리 계산, 데이터의 밀도, 그리고 모델의 학습 및 일반화가 어려워 지는 현상

1. 데이터 희소성: 고차원 공간에서는 데이터 포인트가 서로 매우 멀리 떨어져 있게 되는데, 이로 인해 실제 데이터의 밀도가 낮아지며, 이는 모델이 데이터 패턴을 일반화하기 어려워진다.
2. 거리의 의미 상실: 데이터 차원이 높아지면, 모든 포인트가 서로 비슷하게 멀리 떨어지게 되어, 가까운 이웃 탐색이나 클러스터링 등 거리 기반 알고리즘의 성능이 저하된다. (데이터 포인트 간의 거리에 의미가 없어짐)
3. 모델 복잡도 증가: 차원이 증가함에 따라 요구되는 데이터 양도 기하급수적으로 증가. 이는 모델 훈련에 필요한 데이터 샘플 수가 많아져야 함을 의미하며, 반대로 데이터가 부족할 경우 오버피팅의 위험 상승.
4. 계산 비용 증가: 고차원 데이터에 대해 알고리즘을 실행할 때 필요한 계산 비용이 기하급수적으로 증가하여, 학습 및 예측 시간이 많이 소요.

 

차원의 저주에서 벗어나려면?

잠재적 결과를 선형회귀 같은 방식으로 모델링할 수 있다고 가정하고, X로 정의 된 각각의 셀을 내삽하고 외삽하는 것

 선형회귀분석을 일종의 차원 축소 알고리즘으로 생각한다고 보면 된다.

*변수가 너무 많은 범주를 포함하고 있을 때는, 범주형이 아닌 연속형 변수로 처리하는 편이 좋다.

*외삽(extrapolation)은 주어진 데이터나 증거를 바탕으로 그 범위를 넘어서는 값을 추정하거나 예측하는 방법이다.

 

교란 편향을 보정하려면,

이론적으로는 모든 교란 요인에 따라 1) 데이터를 나누고, 2) 나눈 각 그룹 내에서 채무불이행률을 신용 한도에 회귀하고, 3) 기울기 매개변수 추출을 통해 결과의 평균을 구하면 된다.

BUT 차원의 저주로 인해 모든 교란 요인에 따라 데이터를 나누면 개수가 하나뿐인 표본들이 생겨나고, 해당 표본으로는 회귀할 수가 없다.

교란 요인을 직접 보정하는 대신, 회귀분석모델에 교란 요인을 추가한다.

X: 교란 요인 벡터, θ: 교란 요인과 관련된 매개변수 벡터

import statsmodels.formula.api as smf

# 파이썬에서의 회귀 모델
# WatchTime = p0 + p1*Recommender + e 라는 회귀식을 모델로 표현해본다.
result = smf.ols('watch_time ~ C(recommender)', data=data).fit()
result.summary().tables[1]

# 교란 요인을 회귀 모델 식에 추가
# Default = p0 + p1*CreditLimit + θ*X + e 라는 회귀식을 모델로 표현해본다.
forumula = 'default ~ credit_limit + (wage+credit_score1+credit_score2)'
model = smf.ols(fromula, data=risk_data).fit()
model.summary().tables[1]

 

프리슈-워-로벨 정리(FWL, Frisch-Waugh-Lovell): 편향을 제거하는 데이터 전처리 기법

FWL의 추정 3단계

 

ex) 다음과 같은 상황을 가정해보자.

도메인 지식에서 비롯된 확실한 근거로 볼 때 처치와 결과는 양의 관계여야 하는데, 처치와 결과는 음의 기울기를 보인다.

→ 교란 요인 X가 영향을 미치고 있다. → 데이터의 편향을 제거해야 한다. → FWL의 3단계를 거친다.

 

1. 편향 제거 단계

편향이 제거된 처치 T - E[T❘X] 를 구한다.

 

2. 잡음 제거 단계

잡음이 제거된 결과 Y - E[Y❘X] 를 만든다.

 

3. 결과 모델 단계

편향과 잡음을 제거하자 처치와 결과 사이의 관계를 더 명확히 볼 수 있게 되었다.

 

비선형 데이터일 경우에는 [편향 제거 단계] 이전에 T와 Y의 관계를 선형화하는 함수 F를 찾는 [처치 선형화 단계]를 거쳐야 한다.

 

5장 성향점수

성향점수 가중치(propensity weighting)

  • 처치 배정 메커니즘을 모델링하고 모델 예측을 사용하여 데이터를 재조정하면서 편향을 제거하는 방법
  • 교란 요인 X를 직접 통제할 필요 없이, E[T|X]를 추정하는 균형점수(=처치의 조건부 확률, 성향점수)를 통제하는 것만으로 조건부 독립성을 만족할 수 있다.
  • 성향점수가 동일한 상황에서 처치는 사실상 무작위 배정된 것과 같다.

성향점수 e(X)의 인과그래프

# 성향점수 추정값 계산
ps_model = smf.logit("""intervention ~ 
tenure + last_engagement_score + department_score
+ C(n_of_reports) + C(gender) + C(role)""", data=df).fit(disp=0)

propensity_score = ps_model.predict(df)

 

OLS는 선형회귀분석을 사용 <> 성향점수 추정값은 로지스틱 회귀분석을 사용 → 결과값은 매우 유사

 

매칭 추정량(matching estimator)

  • 관측 가능한 특징이 비슷한 실험 대상의 짝을 찾아 실험군과 대조군을 비교

Yjm(i): 실험군에 속한 대상 i에 짝지어진 대상의 결과

  • 매칭 추정량 사용시 우려점
    1. 편향될 가능성이 있다.
    2. 분산을 추정하기 어렵다.
    3. KNN은 X가 고차원인 경우, 대체로 효율이 낮다.

 

역확률 가중치(IPW, inverse propensity weighting)

  • 처치의 역확률에 따라 데이터의 가중치를 재조정하여 해당 데이터에서 처치가 무작위 배정된 것처럼 보이게 하는 것
  • → 실험군에 속한 대상이 처치 받을 확률이 낮다면(=대조군과 매우 유사하다면) or 대조군에 속한 대상이 실험군과 매우 유사하다면 각 대상에 더 많은 가중치를 부여한다.

 

  • IPW 추정값의 신뢰구간을 얻는 가장 간단한 방법: 부트스트랩
    1. 데이터를 반복적으로 복원추출해서 여러 IPW 추정값을 구한다.
    2. 이 추정값의 2.5번째와 97.5번째 백분위수를 계산하여 95% 신뢰구간을 얻는다.

 

이중 강건(DR, doubly robust)

  • 모델 기반과 디자인 기반 식별을 모두 결합하여, 적어도 둘 중 하나가 정확하기를 기대하는 방법
  • 모델 기반 식별: 처치 및 추가 공변량을 조건부로 설정하고 잠재적 결과에 대한 모델 형태로 가정
  • 디자인 기반 식별: 처치 배정 메커니즘에 대한 가정

# 이중 강건 추정량 구하기
# e^와 m^은 각각 로지스틱 회귀와 선형회귀로 설정

from sklearn.linear_model import LinearRegressioin

def doubly_robust(df, formula, T, Y):
	X = dmatrix(formula, df)
    
    ps_model = LogisticRegression(penalty="none",
    							  max_iter=1000).fit(X, df[T])
    ps = ps_model.predict_proba(X)[:, 1]
    
    m0 = LinearRegression().fit(X[df[T]==0, :], df.query(f"{T}==0")[Y])
    m1 = LinearRegression().fit(X[df[T]==1, :], df.query(f"{T}==1")[Y])
    
    m0_hat = m0.predict(X)
    m1_hat = m1.predict(X)
    
    return (
    	np.mean(df[T]*(df[Y] - m1_hat)/ps +m1_hat) -
        np.mean((1-df[T])*(df[Y] - m0_hat)/(1-ps) + m0_hat)
    )

formula = """tenure + last_engagement_score + department_score 
			+ C(n_of_reports) + C(gender) + C(role)"""
T = "intervention"
Y = "engagement_score"

DR_ATE doubly_robust(df, formula, T, Y) # 이중 강건 추정량

est_fn = partial(doubly_robust, formula=formula, T=T, Y=Y)
CI_95_percent = bootstrap(df, est_fn) # 95% 신뢰구간

 

성향점수가 연속형 처치일 때의 방법론

  1. 연속형 처치를 이산화한다.
  2. 일반화 성향점수(GPS, generalized propensity score)를 사용한다.

 

(스터디) 실무로 통하는 인과추론 with 파이썬 - PART 3에서 이어집니다.