비선형 회귀모형 > 다항 모형, Log 모형

2020. 10. 4. 21:04계량경제학

반응형

회귀모형은 주로 종속변수와 독립변수 간에 선형적 관계를 추론하는데 많이 활용합니다. 하지만 실제 종속변수와 독립변수 간의 관계가 선형적이지 않은 경우도 많습니다. 이럴 때, 활용하는 방안이 비선형 회귀모형을 적합해보는 것입니다. 이번 포스팅에서는 대표적인 비선형 회귀모형으로써 다항 모형(Polynomials)과 Log 모형(Logarithms)에 대해서 정리해 보도록 하겠습니다.

[다항 모형(Polynomial)]

회귀모형에 활용할 독립변수 $X$가 있다고 가정해보겠습니다. 다항 모형에서는 회귀 모형에 Fitting하기 위한 독립변수로써 $X$뿐만 아니라 $X^2$, $X^3$와 같이 고차항을 독립변수로 함께 활용함으로써 비선형관계도 나타낼 수 있도록 합니다. 즉 다항 모형은 다항식의 Degree를 $k$라고 했을 때, 아래와 같이 표현될 수 있습니다.

Python을 활용해서 1차항 부터, 3차항 까지 Fitting을 해보겠습니다. (데이터는 이전 포스팅에서 말씀드린 것처럼 R 패키지에서 다운로드 받았습니다.)

import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

## Data Load
CASchools = pd.read_csv("CASchools.csv")
CASchools.info()

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

## simple regression
linear_model = smf.ols("score~income", data=CASchools).fit()
linear_model.summary()

## quandratic
quadratic_model = smf.ols("score~income+I(income**2)", data=CASchools).fit()
quadratic_model.summary()

## poly- degree:3
from sklearn.preprocessing import PolynomialFeatures
X = CASchools["income"]
Y = CASchools["score"]
polynomial_features= PolynomialFeatures(degree=3)
XP = polynomial_features.fit_transform(X.values.reshape(-1,1))
poly_model = sm.OLS(Y, XP).fit()
poly_model.summary()

##시각화
sns.regplot(x="income",  y="score", data=CASchools)
sns.regplot(x="income",  y="score", data=CASchools, order=2, color="r", scatter= False)
sns.regplot(x="income",  y="score", data=CASchools, order=3, color="g", scatter= False)

고차항을 활용하여 Fitting 모델 중 어떤 것을 활용할지에 대해 결정하기 위해서 몇가지 기준을 수립할 수 있습니다. $R^2$을 기준으로 정의할수도 있고 앞 포스팅에서 언급한 F-Test를 통해서도 계수들의 유의성을 검증해볼 수도 있을 것입니다. 

[로그 모형(Logarithms)]

비선형 회귀모형에서 다항 모형과 함께 대표적으로 많이 활용되는 모델은 로그모형입니다. 이는 종속변수 $Y$ 또는 독립변수 $X$에 Log를 취하여 회귀모형을 적합하는 것을 뜻합니다. 특히 아래와 같은 대표적인 3가지 유형의 로그모형이 있습니다.

유형 모형 계수 해석
1 $$ Y_i = \beta_0+\beta_1ln(X_i)+\mu_i $$ $X$가 1% 변하면, Y는 0.01*$\beta_1$만큼 변함
2 $$ ln(Y_i) = \beta_0+\beta_1X_i+\mu_i $$ $X$가 1 단위 변하면, Y는 100*$\beta_1$%만큼 변함
3 $$ ln(Y_i) = \beta_0+\beta_1ln(X_i)+\mu_i $$ $X$가 1%  변하면, Y는 $\beta_1$%만큼 변함

Python을 활용해서 3가지 유형에 대해서 Fitting을 해보겠습니다. 

#####linear-log model
Linearlog_model = smf.ols("score~np.log(income)", data=CASchools).fit()
Linearlog_model.summary()

##시각화
y_fitted = Linearlog_model.fittedvalues

xs = CASchools["income"]
ys = y_fitted
xs, ys = zip(*sorted(zip(xs, ys)))

plt.scatter(CASchools["income"],CASchools["score"])
plt.plot(xs, ys, 'r-')
plt.show()

#####log-linear model
LogLinear_model = smf.ols("np.log(score)~income", data=CASchools).fit()
LogLinear_model.summary()

##시각화
y_fitted = LogLinear_model.fittedvalues

xs2 = CASchools["income"]
ys2 = y_fitted
xs2, ys2 = zip(*sorted(zip(xs2, ys2)))

plt.scatter(CASchools["income"],np.log(CASchools["score"]))
plt.plot(xs2, ys2, 'r-')
plt.show()

#####log-log model
LogLog_model = smf.ols("np.log(score)~np.log(income)", data=CASchools).fit()
LogLog_model.summary()

##시각화
y_fitted = LogLog_model.fittedvalues

xs3 = CASchools["income"]
ys3 = y_fitted
xs3, ys3 = zip(*sorted(zip(xs3, ys3)))

plt.scatter(CASchools["income"],np.log(CASchools["score"]))
plt.plot(xs3, ys3, 'r-')
plt.show()

## log-linear vs log-log 시각화

plt.scatter(CASchools["income"],np.log(CASchools["score"]), color="cyan")
plt.plot(xs2, ys2, 'r-', label = "log-linear")
plt.plot(xs3, ys3, 'g-' , label = "log-log")
plt.legend()
plt.show()

반응형

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

회귀분석의 해석  (0) 2020.10.18
회귀분석 with interaction term  (0) 2020.10.12
회귀분석 가설검정 > F-test  (1) 2020.10.03
회귀분석 가설검정  (0) 2020.09.17
VIF(분산팽창요인), 결정계수  (0) 2020.09.13