회귀분석은 하나의 종속변수를 가지고 하나의 독립변수를 가지는 것을 단순 회귀분석이라고 하고,
하나의 종속변수를 가지고 여러개의 독립변수를 가지는 것을 다중 회귀 분석이라고 합니다.
회귀모형을 생성하고 평가는 잔차 검정을 통해 하게 됩니다.
사용되는 패키지는 다음과 같습니다.
install.packages('lmtest')
library(lmtest)
lmtest는 검정을 위해 사용되는 패키지입니다.
선형회귀 함수인 lm()의 경우 내장되어있으므로 따로 패키지를 설치할 필요가 없습니다.
이제 회귀식을 만들기전에 전제조건인 공선성이 위배되는지 먼저 확인을 해보겠습니다.
model <- lm(formula = Sepal.Length ~ Sepal.Width +
Petal.Length + Petal.Width, data = iris)
model
vif(model)
처음에 이렇게 모든 독립변수들을 포함시켜 회귀식을 생성해 보겠습니다.
그뒤 vif()함수를 이용하여 공선성을 확인하겠습니다.
> vif(model)
Sepal.Width Petal.Length Petal.Width
1.270815 15.097572 14.234335
꽃잎의 길이와, 꽃잎의 넓이가 공선성이 10보다 높기때문에 회귀식을 세우기위한 전제조건에 위배된다고 볼 수 있습니다.
때문에 서로의 상관관계를 확인하고 적절한 회귀식을 생성하기위해서 독립변수를 제거해주는 과정을 거치도록 하겠습니다.
상관관계는 cor()함수를 이용하면 쉽게 변수간의 상관관계를 알 수 있습니다.
cor(iris[, -5])
위 같이 입력하면 다음과 같은 결과값이 나옵니다.
> cor(iris[, -5])
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
꽃잎의 넓이와 길이가 강한 상관관계를 가지고 있는 것을 확인할수 있습니다.
x <- sample(1:nrow(iris), 0.7*nrow(iris))
train <- iris[x, ]
test <- iris[-x, ]
model <- lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length, data = train)
model
summary(model)
테스트와 트레이닝 데이터를 분리하고 꽃잎의 넓이를 제외하고 회귀모델을 생성해보도록 하겠습니다.
결과는 다음과 같습니다.
> summary(model)
Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length, data = train)
Residuals:
Min 1Q Median 3Q Max
-0.74133 -0.23585 -0.02134 0.23476 0.69660
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.62196 0.32930 7.962 2.47e-12 ***
Sepal.Width 0.50747 0.08959 5.664 1.37e-07 ***
Petal.Length 0.44377 0.02328 19.063 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3399 on 102 degrees of freedom
Multiple R-squared: 0.7923, Adjusted R-squared: 0.7882
F-statistic: 194.5 on 2 and 102 DF, p-value: < 2.2e-16
p-value도 유의함을 알수있습니다.
결정계수는 78.82가 나왔으므로 좋은 결과가 나왔다고 볼수 있습니다.
pred <- predict(model, test)
pred # 데이터 분류값에 따라서 예측치는 달라질 수 있음!
# 5. 회귀모델 평가
cor(pred, test$Sepal.Length)
예측을 하고 예측값이 얼마나 상관성이 있는지 알아보겠습니다.
> cor(pred, test$Sepal.Length)
[1] 0.951823
약 95퍼센트의 상관성이 있음을 알 수 있습니다.
회귀분석의 모형 적합도에 대한 평가를 해보도록 하겠습니다.
# 더빈왓슨값
dwtest(model)
# 2-2 등분산성 검정 - 잔차와 적합값의 분포
plot(model, which = 1)
# 2-3 잔차의 정규성 검정
attributes(model)
res <- residuals(model)
shapiro.test(res)
par(mfrow = c(1,2))
hist(res, freq = F)
qqnorm(res)
더빈왓슨의 값은 1.9가 나왔습니다. 이는 잔차끼리 상관관계를 가지지 않음을 알 수 있습니다.
더빈왓슨 값은 0<d<4의 값을 가지게됩니다.
2에 가까울수록 상관성을 가지지않고 0,4에 가까울수록 자기상관이 심함을 구분 할 수있습니다.
다음은 등분산성 검정을 위해 생성된 플롯을 보도록 하겠습니다.
약간의 이상치를 제외하면 등분산성을 만족하는 것을 볼 수있습니다.
다음은 정규성 검정에 대한 플롯을 보겠습니다.
두플롯 모두 정규성을 띄고있는 분포임을 알 수 있습니다.
이것으로 회귀분석에 대한 포스팅을 끝내 겠습니다.
'R > Machine-Learning' 카테고리의 다른 글
R을 이용한 머신러닝 알고리즘 -인공신경망- (0) | 2022.03.12 |
---|---|
R을 이용한 머신러닝 알고리즘 -부스팅- (0) | 2022.03.12 |
R을 이용한 머신러닝 알고리즘 -배깅- (0) | 2022.03.12 |
R을 이용한 머신러닝 알고리즘 -랜덤포레스트- (0) | 2022.03.12 |
R을 이용한 머신러닝 알고리즘 -로지스틱회귀분석- (0) | 2022.03.10 |