생각 작업실 The atelier of thinking

107. R을 이용한 회귀분석 예측값 구하기 본문

통계학 이야기

107. R을 이용한 회귀분석 예측값 구하기

knowledge-seeker 2024. 11. 28. 14:22

Chapter 107. R을 이용한 회귀분석 예측값 구하기

 

데이터 과학에서의 통계학에서 통계프로그램의 역할은 점점 더 커지고 있습니다. 이제 더이상 계산기 조차 사용하지 않습니다. 특히 시간측면에서의 효율성에서 통계프로그램은 필수적 요소입니다. 통계학 공부를 할 때 이론과 더불어 실습을 함께 한다면 더욱 효과가 좋습니다.  R은 통계학에서 가장 많이 사용하는 프로그램입니다.  

 

이번 회차에는 앞서 살펴봤던 회귀분석 예측값을 R을 이용하여 구해보겠습니다.

 

1. 자료 불러오기

 

◈ 예제 : 올림픽 100m 우승 기록

 

Andrew Tatem 등이 2004년 9월 Nature지에 발표한 논문에서 발췌한 것입니다. 1896~2004년까지의 남자와 여자의 육상 100m 우승 기록을 분석한 자료 입니다. 그 자료에 2016년까지의 기록을 추가한 자료입니다.

 

 

연도 우승기록 연도 우승기록 연도 우승기록
남자 여자 남자 여자 남자 여자
1896 12   1936 10.3 11.5 1988 9.92 10.54
1900 11   1948 10.3 11.9 1992 9.96 10.82
1904 11   1952 10.4 11.5 1996 9.84 10.94
1908 10.8   1956 10.5 11.5 2000 9.87 10.75
1916 10.8   1960 10.2 11.0 2004 9.85 10.93
1920 10.8   1964 10.0 11.4 2008 9.69 10.78
1924 10.6   1968 9.9 11.0 2012 9.63 10.75
1928 10.8 12.2 1976 10.14 11.07 2016 9.81 10.71
1932 10.3 11.9 1984 10.06 10.97      

100m.csv
0.00MB

 

 

olympic <- read.csv("100m.csv", header = TRUE, fileEncoding = "CP949",
                    encoding = "UTF-8")
head(olympic)
  year record gender
1 1896   12.0      M
2 1900   11.0      M
3 1904   11.0      M
4 1908   10.8      M
5 1912   10.8      M
6 1920   10.8      M

 

Year, Record, Gender 의 3개의 컬럼으로 이루어진 자료입니다.

 


2. 회귀분석(남자)

 

남자 기록에 대해서 회귀분석을 진행하면 아래와 같습니다.

 

male <- subset(olympic,gender=="M")

male.lm<-lm(record~year,data=male)

plot(record~year,data=male,col="blue",ylim=c(9,12),pch=16,xlab="연도")
abline(male.lm,col='green',lwd=2)

 

1 단계에서는 원 데이터에서 남자 선수 기록을 분류합니다. ( male <- subset(olympic,gender=="M"))

2 단계에서 분류한 남자 데이터(male)를 회귀분석(lm())을 실행합니다. ( lm(record~year,data=male) )

그래프를 나타내기 위해서 1단계에서 분류한 남자 선수 기록을 산점도로 나타냅니다.( 파란색 점 )

그리고 2단계에서 회귀분석을 실행한 데이터(male.lm)를 직선으로 나타냅니다. ( 초록색 선 )

 

3. 회귀계수에 대한 통계적 추론

 

회귀계수, 즉 회귀모델의 기울기와 절편에 대하여 구간추정을 해보겠습니다.

위 회귀분석에서 나온 결과는 아래와 같습니다.

 

male.lm<-lm(record~year,data=male)
male.lm
Call:
lm(formula = record ~ year, data = male)

Coefficients:
(Intercept)         year  
    34.9884      -0.0126

 

위 선형회귀모델은 기울기는 -0.126, 절편은 34.9884 입니다. 식으로 표현하면 아래와 같습니다.

 

$$ Y = -0.0126 X + 34.9884 $$

 

위 그래프에서 초록색 선의 함수입니다.

 

각각의 95% 신뢰구간은 confint( ) 함수로 구할 수 있습니다.

 

confint(male.lm)
                  2.5 %      97.5 %
(Intercept) 30.20924073 39.76752520
year        -0.01503952 -0.01015979

 

위 결과에서 기울기는 -0.015 ~ -0.010, 절편은 30.209 ~ 39.767 이 95% 신뢰구간임을 알 수 있다.

 

99% 신뢰구간을 구하려면 "level = 0.99" 로 설정하면 된다.

confint(male.lm, level=0.99)
                  0.5 %       99.5 %
(Intercept) 28.52782262 41.448943314
year        -0.01589793 -0.009301383

 

 

4. 예측값에 대한 통계적 추론

 

회귀분석에서 적합값(Fitted Value)과 예측값(Predicted Value)은 비슷한 개념이지만, 사용하는 맥락에서 조금 차이가 있습니다.

 

적합값은 이미 주어진 데이터(관측값)에서 얻어진 회귀모델로 계산된 값입니다. 반면 예측값은 새로운 데이터에 대하여 회귀모델로 계산된 값입니다. 직관적으로 적합값은 회귀 직선(초록색선) 상 위의 점들을 나타냅니다. 예측값은 회귀직선의 연장선 위에 있는 값입니다.

 

R에서 적합값과 예측값을 구할 때는 predict( ) 함수를 사용합니다.

 

적합값은 아래와 같이 구할 수 있습니다.

pred <- predict(male.lm)
pred

 

        1         2         3         4         5         6         7         8 
11.099436 11.049037 10.998638 10.948240 10.897841 10.797044 10.746645 10.696247 
        9        10        11        12        13        14        15        16 
10.645848 10.595449 10.444254 10.393855 10.343456 10.293058 10.242659 10.192260 
       17        18        19        20        21        22        23        24 
10.141862 10.091463 10.041065  9.990666  9.940267  9.889869  9.839470  9.789071 
       25        26        27        28 
 9.738673  9.688274  9.637876  9.587477

 

연도별 회귀직선 상의 값을 나타냅니다.

 

예측값은 아래와 같이 구할 수 있습니다.

 

male.new <- data.frame(year=c(2020,2024))
forecast <- predict(male.lm,newdata=male.new,se.fit=T)
forecast
$fit
       1        2 
9.537078 9.486680 

$se.fit
         1          2 
0.08502324 0.08913745 

$df
[1] 26

$residual.scale
[1] 0.2299028

 

예측값은 우선 구하고자 하는 새로운 데이터 값을 정합니다. (male.new <- data.frame(year=c(2020,2024)))

이 새로운 값은 회귀분석 모델에 적용하는 것입니다. 위 결과값에서 1 은 2020년을, 2는 2024년을 나타냅니다.

 

'$fit' 은 예측값입니다. 엄밀히 말하면 예측된 평균값입니다. 

'$se.fit' 은 예측값의 표준오차, '$df'는 잔차의 자유도, '$residual.scale'은 모델의 잔차 표준편차를 나타냅니다.

 

예측값은 회귀직선의 연장선 위에 있는 값이라 할 수 있습니다.

 

이 예측값(예측 기대값 평균)에 대한 통계적 추론으로 구간추정을 한다면 아래와 같이 할 수 있습니다.

 

forecast <- predict(male.lm,newdata=male.new,se.fit=T,interval ="confidence")
forecast
$fit
       fit      lwr      upr
1 9.537078 9.362311 9.711846
2 9.486680 9.303455 9.669904

$se.fit
         1          2 
0.08502324 0.08913745 

$df
[1] 26

$residual.scale
[1] 0.2299028

 

예측값의 구간은 2020년은 9.362311~9.711846, 2024년은 9.303455~9.669904 입니다.

 

2024년 파리올림픽 남자 100m 우승은 미국 노아 마일스 선수가 차지했습니다. 기록은 9.784초로 위 예측값의 구간 추정 범위 밖에 위치했습니다. 그렇다면 이 회귀 모델은 예측 성능이 떨어진 것일까요? 그렇지 않습니다. 9.784초는 예측값이 아닌 관측값입니다. 따라서 새로운관측값에 대한 구간추정을 해야합니다.

관측값에 대한 구간추정 범위는 오차가 더해져 예측값의 범위보다 더 넓게 나타납니다.

 

predict(male.lm,newdata=male.new,se.fit=T,interval="prediction")
$fit
       fit      lwr       upr
1 9.537078 9.033225 10.040932
2 9.486680 8.979831  9.993528

$se.fit
         1          2 
0.08502324 0.08913745 

$df
[1] 26

$residual.scale
[1] 0.2299028

 

2024년 관측값의 구간은 8.979831~9.993528 로 실제 관측값 9.784초를 포함하고 있습니다.