회귀분석 with interaction term

2020. 10. 12. 23:18계량경제학

반응형

일반적으로, 회귀분석에 Interaction term을 포함하는 이유는 한 독립변수의 변화가 "또다른 독립변수의 종속변수 Y에 대한 영향력을 어떻게 변경"하는지를 알아보기 위해서입니다. 예를 들어 Interaction term을 활용하여 학력수준이 연봉에 미치는 영향이 남,녀에 따라 다름을 보일 수 있습니다.

이러한 상호작용은 회귀분석에 크게 2가지 주요 유형으로 분류할 수 있습니다.

1. 두 개의 Binary 변수사이에 상호작용

2. 하나의 Binary 변수와 하나의 Continuous 변수사이에 상호작용

먼저, 두 개의 Binary 변수사이에 상호작용부터 알아보겠습니다.

[두 개의 Binary 변수사이에 상호작용]

두 개의 Binary 변수를 $D_1$(성별), $D_2$(학력)라고 해보겠습니다. 그렇다면 상호작용 회귀분석은 아래와 같이 표현될 수 있습니다.

여기서 $D_{1i}\cdot D_{2i}$가 상호작용 term이며, $\beta_3$이 성별에 따른 학력수준 영향력 차이를 보여줍니다. 예제를 통해 살펴보겠습니다.

import statsmodels.api as sm
import statsmodels.formula.api as smf

CASchools = pd.read_csv("CASchools.csv")

CASchools["size"]=CASchools["students"]/CASchools["teachers"]
CASchools["score"]=(CASchools["read"]+CASchools["math"])/2


CASchools["HiSTR"]=CASchools["size"].apply(lambda x : 1 if x>=20 else 0)
CASchools["HiEL"]=CASchools["english"].apply(lambda x : 1 if x>=10 else 0)

bi_model = smf.ols("score~HiSTR*HiEL",data = CASchools).fit()
bi_model.summary()

'''
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    664.1433      1.316    504.852      0.000     661.557     666.729
HiSTR         -1.9078      2.235     -0.854      0.394      -6.301       2.485
HiEL         -18.3155      2.144     -8.544      0.000     -22.529     -14.102
HiSTR:HiEL    -3.2601      3.223     -1.012      0.312      -9.596       3.075
==============================================================================
Omnibus:                        7.998   Durbin-Watson:                   0.569
Prob(Omnibus):                  0.018   Jarque-Bera (JB):                8.251
Skew:                           0.336   Prob(JB):                       0.0162
Kurtosis:                       2.856   Cond. No.                         6.50
==============================================================================

'''

위의 결과를 바탕으로 수식으로 표현하면 아래와 같습니다.

위에서 추정된 계수를 활용하여 위의 식을 해석해보겠습니다. HiEL이 1일 때(영어를 배운 아이들의 비율이 높은 지역)에서 HiSTR이 Testscore에 미치는 영향은 -1.9-3.3 = -5.2가 됩니다. HiEL이 0일 때(영어를 배운 아이들의 비율이 낮은 지역)에서는 HiSTR이 Testscore에 미치는 영향은 -1.9입니다. 즉, 영어를 배운 아이들의 비율이 높은 지역에서 HiSTR(학생-선생님 비율, 높을수록 선생님에 비해 학생이 많음)이 Testscore에 더 많은 영향을 미치고 있음을 알 수 있습니다.

[하나의 Binary 변수와 하나의 Continuous 변수사이에 상호작용]

하나의 Binary변수와 Continuous변수사이에 상호작용을 나타내는 모델은 3개로 표현될 수 있습니다.

첫 번째는 Different intercept, Same slope 입니다. 모델은 아래와 같습니다.

두 번째는 Different intercept, Different slope 입니다. 모델은 아래와 같습니다.

세 번째는 Same intercept, Different slope 입니다. 모델은 아래와 같습니다.

세 가지 모형에 대해서 시뮬레이션 데이터를 활용하여 비교해보도록 하겠습니다.

## Binary and Continuous
X = np.random.uniform(0, 15, 200)
D = np.random.randint(0,2,200)
Y = 450+150*X+500*D+50*(X*D)+np.random.normal(0, 300, 200)

data_ = pd.DataFrame(data=[X,D,Y]).T
data_.rename(columns = {0:"X",1:"D",2:"Y"}, inplace=True)
data_["log_Y"]=np.log(data_["Y"])

## Different intercept, Same Slope
mod1_=smf.ols("np.log(Y)~X+D", data=data_).fit()
mod1_.summary()
data_["pred1"]=mod1_.predict(data_[["X","D"]])

## Different intercept, Different Slope
mod2_=smf.ols("np.log(Y)~X+D+X:D", data=data_).fit()
mod2_.summary()
data_["pred2"]=mod2_.predict(data_[["X","D"]])

## Same InterCept, Different Slope
mod3_=smf.ols("np.log(Y)~X+X:D", data=data_).fit()
mod3_.summary()
data_["pred3"]=mod3_.predict(data_[["X","D"]])

## 시각화
fig = plt.figure()
ax1 = fig.add_subplot(3, 1, 1)
ax2 = fig.add_subplot(3, 1, 2)
ax3 = fig.add_subplot(3, 1, 3)

sns.scatterplot(data=data_.loc[data_["D"]==1], x="X", y="log_Y" , ax=ax1)
sns.scatterplot(data=data_.loc[data_["D"]==0], x="X", y="log_Y", color="r" , ax=ax1)
sns.lineplot(data=data_.loc[data_["D"]==1], x="X", y="pred1", ax=ax1)
sns.lineplot(data=data_.loc[data_["D"]==0], x="X", y="pred1", color="r", ax=ax1)
ax1.set_title("Different intercept, Same Slope")

sns.scatterplot(data=data_.loc[data_["D"]==1], x="X", y="log_Y" ,ax=ax2)
sns.scatterplot(data=data_.loc[data_["D"]==0], x="X", y="log_Y", color="r" ,ax=ax2)
sns.lineplot(data=data_.loc[data_["D"]==1], x="X", y="pred2",ax=ax2)
sns.lineplot(data=data_.loc[data_["D"]==0], x="X", y="pred2", color="r",ax=ax2)
ax2.set_title("Different intercept, Different Slope")


sns.scatterplot(data=data_.loc[data_["D"]==1], x="X", y="log_Y",ax=ax3 )
sns.scatterplot(data=data_.loc[data_["D"]==0], x="X", y="log_Y", color="r" ,ax=ax3)
sns.lineplot(data=data_.loc[data_["D"]==1], x="X", y="pred3",ax=ax3)
sns.lineplot(data=data_.loc[data_["D"]==0], x="X", y="pred3", color="r",ax=ax3)
ax3.set_title(" Same InterCept, Different Slope")

반응형

'계량경제학' 카테고리의 다른 글

Panel 회귀모형  (0) 2020.10.24
회귀분석의 해석  (0) 2020.10.18
비선형 회귀모형 > 다항 모형, Log 모형  (0) 2020.10.04
회귀분석 가설검정 > F-test  (1) 2020.10.03
회귀분석 가설검정  (0) 2020.09.17