본문 바로가기

Programming/R

[통계 분석] 대학생 90명의 키, 몸무게 데이터를 이용한 단순 선형 회귀 모델 분석

안녕하세요~ 깨륵입니다 '▽'/

오늘은 R이라는 통계언어를 이용하여 간단한 선형회귀모델을 만들어볼거에요!

기본적인 분석 순서대로 정리해보았으니, 차근차근 따라와주시면 되겠습니다 😉

(혹시 틀린 부분이나 어색한 부분이 있다면 가감없이 댓글로 남겨주시면 감사하겠습니다!)

 

 


0. 주제

대학생 90명의 키와 몸무게 데이터를 단순 선형회귀모델에 학습시킨 다음,

키에 따라 예측되는 몸무게 값의 예측구간과 신뢰구간을 구해보자!

 

 

먼저 아래 데이터를 다운받아, R 워크스페이스에 data 폴더를 만들어 넣어주세요!

 

student_info.csv
0.00MB

 

 

 

 

1. 데이터 셋 읽어오기

: 대학생 90명의 키와 몸무게 데이터 읽기

 

std90 <- read.csv("./data/student_info.csv",sep = ",",
			stringsAsFactors = FALSE,
                    	header = TRUE,
                    	na.strings = "") 
nrow(std90) 
head(std90)

 

 

 

 


2. 회귀 모델 생성

: 키와 몸무게 데이터를 이용한 단순 선형 회귀 모델 생성

(m <- lm(weight_kg ~ height_cm, data = std90))

 

단순 선형 회귀 모델 만들기

 


3. 회귀 계수 구하기

: 2에서 만든 단순 선형 회귀 모델으로 회귀 계수 구하기

coef(m)

위의 회귀 계수로 아래와 같은 회귀식을 도출할 수 있다.

 

 

 

> 학생의 키(height_cm)에 따른 몸무게(weight_kg) 회귀식

(weight_kg)= 32.6604 + 0.2247 * (height_cm)

 

 


 

4. 회귀 계수 값 검증하기

: 구한 회귀식이 알맞은 지 2가지 방법을 이용하여 검증

 

4-1 선형 회귀 모델에 1~4번째의 데이터값을 넣은 결과값을 확인

fitted(m)[1:4] //예측한 값 
((32.6604144) + (0.2246605) * (std90$height_cm[1:4])) //회귀식 대입한 값

 

원본 데이터의 1~4번째 예측된 값과 회귀식으로 1~4번째 대입한 값 확인하기

fitted() 결과값 과 회귀식 적용한 값이 같은 걸 보면, 회귀식을 알맞게 구했다는 것을 알 수 있다.

 

 

 

4-2 회귀 모델 진단을 위한 이상값 진단하기

: 이상값이 존재하면 회귀모형의 계수 추정값이 적절치 않다는 의미이기 때문

 

4-2-1. cooks.distance 그래프 그리기

plot(m, which = 4)

회귀모델에 대한 cooks.distance* 그래프를 그린다.

위의 코드에서 옵션 which = 4 는 모델에 대해 cooks.distance 그래프를 그린다는 것을 의미한다.

*cooks.distance : 잔차의 영향값으로 고안된 통계량.

회귀 직선의 모양(기울기나 절편 등)에 크게 영향을 끼치는 점들을 찾는 방법

 

키와 몸무게의 이상값 그래프

통상 값 1에 근접하거나, 그 이상인 세 개의 값을 이상치로 추정한다.

 

 

4-2-2. cook's distance 값 구하기

x_cooks.d <- cooks.distance(m) 
x_cooks.d[1:4] 
NROW(x_cooks.d) 
x_cooks.d[which(x_cooks.d>qf(0.5, df1 = 2, df2 = 88))]

 

cooks.distance() 함수를 이용하여 cook's distance값을 구한다.

F-분포*의 50% 분위수 이상이면 이상값으로 간주한다.

* F-분포 = 분모 자유도(df1) 2, 분자 자유도(df2) 88 으로 설정함, F-분포의 분위수가 수치적 탐색의 지표

 

named numeric(0)으로 50%보다 낮게 나왔으므로, 이상값으로 간주할 수 없다.

 

 

 

4-2-3 outlierTest를 이용한 이상값 진단

library("car") 
outlierTest(m)

 

car 라이브러리에 있는 outlierTest 함수를 이용하여 이상값을 진단해보았다.

Bonferroni p 값이 0.73013 으로 0.05보다 크므로 이상치가 검출되지 않음을 알 수 있었다.

 


 

5. 잔차 구하기

: 선형 회귀 모델의 잔차값을 구하고, 정규성을 만족하는 지 확인

 

5-1. 잔차 값 구하고, 실제 데이터와 비교해보기

residuals(m)[1:4] 
std90$weight_kg[1:4] //실제 몸무게 
fitted(m)[1:4] + residuals(m)[1:4] //적합값 + 잔차 한 몸무게

 

1~4번째 학생 몸무게 데이터의 잔차 값

 

 

잔차 = 실제 값 - 예측값 이므로, 실제값 = 예측값 + 잔차 이다.

따라서, 우리가 만든 모델에 집어넣은 예측값+잔차 가 실제값과 같게 나온다면 알맞게 구한 건지 확인해 볼 수 있다.

 

위 캡쳐본과 같이 '실제 값'과 '적합값 + 잔차'를 한 값이 같게 나온 것을 확인할 수 있다.

 

 

 

5-2. 잔차의 정규성 확인

 

5-2-1. 정규분포와 생성한 모델의 Q-Q plot 비교

qqnorm(residuals(m)) //정규분포의 QQ plot 그래프 
qqline(residuals(m)) //정규분포의 QQ plot에서 1Q와 3Q를 지나는 선 그리기 

plot(m, which = 2) //우리 모델의 QQ plot 그래프

 

정규분포 QQ plot  /  생성한 회귀모델의 QQ plot

 

생성한 회귀모델(Q-Q plot)의 잔차 그래프를 보았을 때,

정규분포의 Q-Q plot과 비슷한 일직선의 형태이므로 해당 잔차는 정규성을 만족함을 알 수 있다.

 

 

5-2-2. shapiro 검정*

*shapiro 검정: 일변수 자료에 대해 수치적으로 정규성을 검정하는 기법

shapiro.test(residuals(m))

 

 

p-value가 0.2189로 유의수준 0.05보다 크므로 모델이 정규분포를 따른다는 귀무가설을 기각할 수 없다.

즉, 모델 m의 잔차가 정규성을 만족함을 알 수 있다.

 

 


 

6. 잔차 제곱 합 구하기

deviance(m)

 

 

diviance()함수를 이용하여 잔차 제곱의 합을 구해보았다.

결과는 15899.88 이 나왔다.

 


 

7. 회귀 계수의 신뢰구간 및 예측구간 구하기

 

7-1. 회귀 계수의 신뢰구간

7-1-1. 회귀 계수의 신뢰구간 구하기

//회귀 계수의 95% 신뢰구간 구하기 : confint(model) 
confint(m, level = 0.95) //신뢰구간 구하기 
(predict interval = "confidence" 신뢰구간) 
m_conf <- predict(m, level = 0.95, interval = "confidence") 
head(m_conf)

 

 

단순 선형 회귀의 절편과 기울기는 정규분포를 따르기 때문에, 회귀 계수의 신뢰구간*을 구할 수 있다.

여기서 fit은 예측 값을 뜻하고, lwr와 upr 컬럼은 각각 신뢰구간의 lower bound, upper bound를 뜻한다.

*회귀 계수의 신뢰구간 : 자유도가 n-2인 분포에서 회귀계수를 중심으로 확률이 0.95인 구간

회귀계수 신뢰구간

 

 

7-1-2. 신뢰구간 그래프 그리기

plot(weight_kg~height_cm, data=std90) //키와 몸무게 산포도 
lwr <- m_conf[,2] 
upr <- m_conf[,3] 
sx <- sort(std90$height_cm, index.return=TRUE) 
abline(coef(m), lwd=2) //추정된 평균 몸무게 
lines(sx$x, lwr[sx$ix], col="blue", lty=2) // 아래쪽 신뢰구간 
lines(sx$x, upr[sx$ix], col="blue", lty=2) // 윗쪽 신뢰구간

 

먼저 키와 몸무게 데이터의 산포도를 으로 그린다.

그 다음, 검정색 굵은 선으로 회귀계수로 추청된 평균 몸무게 선을 그린다.

마지막으로 파란색 점선으로 확률 95% 안에 드는 구간인 신뢰구간 그려준다.

 

 

 

7-2. 회귀 계수의 예측구간

 

7-2-1. 회귀 계수의 예측구간 구하기

//키와 몸무게의 예측구간 
(predict interval = "predict" 예측구간)  
m_pred <- predict(m, level = 0.95, interval = "predict") 
head(m_pred)

 

신뢰구간과 같이 fit은 점추정값(예측값)이고,

lwr,upr 는 각각 예측구간의 lower bound, upper bound 이다.

 

 

7-2-2. 예측구간 그래프 그리기

//키와 몸무게 산포도, 예측구간 p_lwr <- m_pred[,2] p_upr <- m_pred[,3] lines(std90$height_cm, p_lwr, col="red", lty=2) // 아래쪽 예측구간 lines(std90$height_cm, p_upr, col="red", lty=2) // 윗쪽 예측구간

 

 

위에서 그렸던 신뢰구간 그래프에 빨간색 실선으로 윗쪽과 아랫쪽의 예측구간을 그려준다.

신뢰구간보다 상대적으로 더 광범위한 구간을 나타낸다는 것을 확인할 수 있다.

 

 

7-3. 회귀 계수의 신뢰구간과 예측구간에 차이가 발생하는 이유?

위의 그래프를 보면 신뢰구간보다 예측구간이 상대적으로 더 광범위하다는 것을 한눈에 알 수 있다.

predict 함수에 있는 interval 매개변수에 "confidence"를 줄 경우, 주어진 X값에 대한 Y의 평균(기대값)에 대한 신뢰구간(신뢰대, 95% 수준)을 도출하는 것이고, “predict”를 주면 주어진 X에서 하나의 예측값 Y가 속하는 예측구간(예측대)를 도출하는 것이다.

 

따라서 새로운 X값에 대해 예측되는 Y값을 도출하는 fit(점추정)의 경우, 동일한 값을 나타낸다.

하지만 구간 추정에 사용되는 신뢰구간의 '표준오차' 즉, 분산이 다르기 때문에 구간값의 경우 큰 차이를 보이는 것이다.

 

예측구간의 분산 =  신뢰구간의 분산 + 표준편차

 

 


 

8. 새로운 학생 키로 몸무게 예측하기

: 만들어진 선형 회귀 모델을 이용하여 특정 수치에 대한 값 도출하기

predict(m, newdata = data.frame(height_cm=160), interval = "confidence")

 

선형회귀모델과 predict() 함수를 이용하여, 학생 키 값에 대해 예상되는 몸무게를 예측해보았다.

그 결과 160cm 인 학생에 대해 예상 몸무게는 약 68.6kg라고 예측할 수 있었다.

또한 lower bound, upper bound 값은 각각 65kg, 71kg으로 도출되었다.

 


 

9. 회귀 모델 평가하기

 

9-1. summary() 함수로 선형 회귀 모델의 요약 통계량 확인하기

summary(m)

 

 

 

9-2. 각 수치들의 의미 파악

> Coefficients 표

: 모델의 계수와 나머지 계수들 간의 통계적 유의성 파악

- Estimate 열의 값을 통해 회귀식을 구할 수 있음

- Pr(>|t|) 열의 값은 t 분포를 사용하여, 각 속성의 p-value값을 나타냄

 

> F-statistic (F 통계량), p-value

전체 모델이 통계적으로 얼마나 유의미 한지 파악

 

> R-squared (결정계수)

: 모델이 데이터의 분산 얼마나 설명하는지, 신뢰도를 뜻함

 

 

9-3. 키와 몸무게 데이터의 선형 회귀 모델 분석

height의 Pr값을 확인해보면 0.00838으로 유의수준 0.05보다 아주 작은 값이므로,

절편과 계수는 통계적으로 유의하다고 말할 수 있다.

 

전체 모델의 유의성을 파악해보면, p-value = 0.008385 이여서 유의수준(0.05)보다 작으므로 이 모델은 유의하다고 할 수 있다.

다만, Multiple R-Squared 값은 0.07635 로 낮은 값이므로, 종속변수와 독립변수의 선형관계가 매우 낮은 것을 확인할 수 있다.

 

 


가감없는 피드백 언제나 환영합니다 🥺
도움이 되셨다면 댓글과 공감 부탁드려요! ❤️💜