본문 바로가기

회사생활/통계학 공부

선형 회귀분석의 4가지 기본가정




선형 회귀분석의 4가지 기본가정

How to make good linear regression model?




선형 회귀분석을 통해 좋은 모델을 만들기 위해서는 분석 데이터가 아래 4가지 기본가정을 만족해야 한다.

아래 4가지 기본가정을 만족하지 않으면 제대로 된 선형 회귀모델이 생성될 수 없다.


-

(1) 선형성

(2) 독립성

(3) 등분산성

(4) 정규성

-


각 기본가정의 의미와 지켜지지 않았을 때 어떻게 되는지,

그리고 이 기본가정을 만족하지 않는 경우 어떻게 해야하는지 해결방법을 R 코드 예제를 통해 살펴보도록 하자.



▼ 선형 회귀분석 이론 ▼

2017/07/02 - [ANALYSIS/Algorithm] - Linear Regression / 선형 회귀분석




(1) 선형성

선형성은 "선형" 회귀분석에서 중요한 기본가정으로, 당연히 "비선형" 회귀분석에서는 해당하지 않는다.

선형성이란, 예측하고자 하는 종속변수 y와 독립변수 x 간에 선형성을 만족하는 특성을 의미한다.


먼저 예제 데이터를 확인해보자.


# 분석 데이터 dt 만들기
dt <- iris[, -5]

# dt의 분포를 시각적으로 확인하기
plot(dt)

만약 Sepal.Length를 우리가 예측하려고 하는 종속변수 y라고 한다면,

위 그래프를 보았을 때 Sepal.Length와 대략적인 선형관계를 이루고 있는 변수는 Petal.Length와 Petal.Width이고,

선형성을 만족하지 않는 것은 Sepal.Width인 것으로 보인다.


그럼 이 상황에서 선형 회귀모델을 만들어 보자.


# 모델 mdl 생성
mdl <- lm(Sepal.Length ~ ., dt)

# 회귀분석 결과 출력
summary(mdl)



회귀분석 결과, 모든 변수가 유의한 모델이 만들어졌음을 확인할 수 있다.

선형성을 만족하지 않는 Sepal.Width까지 유의하다고 결과가 나왔는데 왜 이런 결과가 나왔을까?


그것은 가장 선형성을 만족하는 Petal.Length와 Petal.Width의 영향도를 뺀 나머지 값들이 종속변수 y인 Sepal.Width와 선형성을 이루기 때문이다.

무슨 얘기인지 이해가 안 간다면 아래 시각화로 살펴보자.


# Petal.Length와 Petal.Width의 영향도를 제거한 Rest.Sepal.Width를 만든다.
dt$Rest.Sepal.Width <- dt$Sepal.Length - mdl$coefficients[["Petal.Length"]] * dt$Petal.Length - mdl$coefficients[["Petal.Width"]] * dt$Petal.Width

# dt의 분포를 시각적으로 확인하기 
plot(dt)

종속변수 y인 Sepal.Length와 새로 만들어진 변수 Rest.Sepal.Width 간에 약간의 선형관계가 있음을 확인할 수 있다.

(단, 정말 약간이다. 기존 Sepal.Width 대비)


만약에 Petal.Length, Petal.Width 같은 다른 변수들 없이

선형성을 만족하지 않는 Sepal.Width 만 단독으로 사용하여 유의한 선형 회귀모델을 만들 수 있을까?


# Sepal.Width만 사용한 단순 선형 회귀분석 결과 출력
summary(lm(Sepal.Length ~ Sepal.Width, dt))



아까와 다르게 Sepal.Width 단독으로는 p-value가 0.152로 유의수준 0.05보다 크므로

Sepal.Length에 영향력이 없다는 귀무가설을 기각할 수 없다.


따라서 이 상황에서는 Sepal.Width가 Sepal.Length에 영향력이 없다는 의미로 해석된다.



따라서 본인이 가진 변수 중 일부가 선형성을 만족하지 않는다면,


첫째로 다른 새로운 변수를 추가해보거나,

둘째로는 로그, 지수, 루트 등 변수 변환을 취해보는 것,

세번째로는 아예 선형성을 만족하지 않는 변수를 제거하는 것,

네번째로는 일단 선형 회귀모델을 만들고 변수 선택법을 통과시키는 것


등 여러 가지 방법이 있다. 



개인적으로 네번째 방법을 가장 추천한다.

왜냐하면 변수의 개수가 많아지면 개별 변수를 파악하기가 어려워지기 때문이다.


그리고 두번째 방법은 비추천하는데,

변환된 변수의 의미를 해석하기가 어렵기 때문이다.




(2) 독립성

독립성은 "다중" 회귀분석에서 중요한 기본가정으로, 당연히 "단순" 회귀분석에서는 해당하지 않는다.

독립성이란, 독립변수 x 간에 상관관계가 없이 독립성을 만족하는 특성을 의미한다.

(다중 회귀분석은 x변수가 2개 이상인 회귀분석이다.)


만약 서로 상관관계가 있는 독립변수 x들이 여러 개 들어간다면 회귀분석 결과는 어떻게 바뀔지 알아보자.


위에서 분석한 바로는, Sepal.Length와 Petal.Length는 선형성을 잘 만족하고 있는 유의한 변수이다.

이 Petal.Length와 유사한 변수를 3개 더 만들어 보자.


# 분석 데이터 dt 만들기
dt <- iris[, -5]

# Petal.Length와 상관성이 있는 변수를 강제로 만들기
dt$Petal.Length1 <- dt$Petal.Length + round(rnorm(nrow(dt), 0.05, 0.05), 1)
dt$Petal.Length2 <- dt$Petal.Length + round(rnorm(nrow(dt), 0.05, 0.05), 1)
dt$Petal.Length3 <- dt$Petal.Length + round(rnorm(nrow(dt), 0.05, 0.05), 1)

# dt의 분포를 시각적으로 확인하기
plot(dt)

강제로 만든 Petal.Length1 ~ Petal.Length3 변수들이 Petal.Length까지 해서 강한 상관관계를 띄고 있으므로

당연히 이 데이터는 독립성을 만족하지 못하고 있는 상태이다.


이 상태의 데이터를 바로 회귀분석하면 어떻게 될까?


# 모델 mdl 생성
mdl <- lm(Sepal.Length ~ ., dt)

# 회귀분석 결과 출력
summary(mdl)



회귀분석 결과를 살펴보면 Petal.Length는 원래 유의했던 변수임에도 불구하고

독립성을 위배하는 비슷한 변수가 많이 들어가게 되니 마치 유의하지 않는 것과 같은 결과를 나타내게 된다.


그렇기 때문에 다중공선성, 즉 서로 상관관계가 있다면 이를 제거해주어야 한다.


제거하는 방법은 다중공선성을 일으키는 변수를 제거하거나,

이것들을 모아서 다른 변수로 치환을 해주면 된다.


나는 변수선택법 중 Stepwise를 사용해서 다중공선성을 일으키는 변수들을 제거해보려고 한다.


# 변수선택법 - Stepwise
mdl_step <- step(mdl)

# 변수선택 결과 출력
summary(mdl_step)


Stepwise를 사용하니, 독립성을 위배하는 강제로 만들었던 변수들이 제거되고

유의한 모델이 만들어진 것을 확인할 수 있다.




(3) 등분산성

등분산성이란 분산이 같다는 것이고, 분산이 같다는 것은 특정한 패턴 없이 고르게 분포했다는 의미이다.

여기서 등분산성의 주체는 잔차이다.

(여기서는 표준화 잔차를 볼 것이다.)


# 분석 데이터 dt 만들기 dt <- iris[, -5] # 강제로 등분산성을 위배하는 변수 ydata 만들기 set.seed(1) dt$ydata <- c(round(rnorm(75, 1, 0.3), 1), round(rnorm(75, 10, 0.3), 1)) # dt의 분포를 시각적으로 확인하기 plot(dt)

위 그래프에서 볼 수 있듯이 매우 이상한 ydata라는 변수를 만들었다.

앞에서 했던 것과 다르게 Sepal.Length 대신 ydata를 종속변수 y로 두고 예측해보자.


# 모델 mdl 생성
mdl <- lm(ydata ~ ., dt)

# 회귀분석 결과 출력
summary(mdl)

# 표준화 잔차의 분포를 시각적으로 확인하기
plot(rstandard(mdl))


회귀분석 결과 유의한 모델이 나오지 않았는데,

표준화 잔차의 분포를 살펴보면 그 이유를 알 수 있다.

표준화 잔차가 등분산성을 만족하지 않고 4개의 덩어리가 있는 특정 패턴을 가지고 있기 때문이다.

표준화 잔차가 이러한 분포를 가지고 있는 경우, 매우 중요한 변수가 분석 데이터에 추가되지 않고 빠져있다는 의미로 해석할 수 있다.


앞에서 우리가 만든 ydata는

위에 75행은 평균이 1인 랜덤값이고,

아래 75행은 평균이 10인 랜덤값이므로

1~75행과 76~150행을 나누어줄 수 있는 추가적인 변수가 필요하다.


-
-


(4) 정규성

마지막 정규성은 또한 잔차가 정규성을 만족하는지 여부로, 

정규분포를 띄는지 여부를 의미한다.


# 분석 데이터 dt 만들기
dt <- iris[, -5]

# 강제로 등분산성을 위배하는 변수 ydata 만들기
set.seed(1)
dt$ydata <- c(round(rnorm(20, 1, 0.3), 1), round(rnorm(30, 5, 0.3), 1), round(rnorm(100, 7, 1), 1))

# dt의 분포를 시각적으로 확인하기
plot(dt)

강제로 한쪽에 쏠려있어 정규분포가 아닌 변수 ydata를 만들어보았다.

이 변수로 회귀분석을 해보자.


# 모델 mdl 생성
mdl <- lm(ydata ~ ., dt)

# 회귀분석 결과 출력
summary(mdl)

# 표준화 잔차의 분포를 시각적으로 확인하기
hist(rstandard(mdl))



유의하지 않은 변수들이 섞여있는 것을 확인할 수 있다.

표준화 잔차의 히스토그램을 살펴보면 정규분포가 아님을 시각적으로 확인할 수 있다.

시각적으로 말고 수치적으로 확인하기 위해 

Shapiro-Wilk Test로 정규성 검정을 해보자.


# 정규성 검증
shapiro.test(rstandard(mdl))



정규성 검정의 귀무가설은 "정규분포와 차이가 없다" 이다.

p-value가 0.001 이므로 유의수준 0.05보다 작으므로 귀무가설을 기각한다.

즉, 이 데이터는 정규분포와 차이가 있다 = 정규성을 만족하지 않는다. 라는 해석을 할 수 있다.


정규성을 만족하기 위해서는 (3) 등분산성을 해결하기 위한 방식와 유사한 방법들이 필요하다.




요약

4가지 기본가정을 만족해야 유의한 회귀모델이 나온다.

가장 쉬운 방법은 Stepwise로 4가지 기본가정을 위배시키는 변수를 제거하자.



이 포스팅이 도움이 되셨다면 아래 하트를 눌러주세요. 큰 힘이 됩니다:)



▼ 로지스틱 회귀분석 이론 ▼

2017/03/21 - [ANALYSIS/Algorithm] - Logistic Regression / 로지스틱 회귀분석


▼ 로지스틱 회귀분석 R 예제 코드 ▼

2017/03/22 - [ANALYSIS/R] - [R 예제 코드] Logistic Regression / 로지스틱 회귀분석



#회귀분석#선형회귀분석#다중회귀분석#기본가정#잔차#오차#표준화잔차#다중공선성#Regression#Residual#StandardizedResidual