일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 추정
- 확률
- 반복없음
- 변량효과모형
- 분산분석
- 정규분포
- 경제학
- 오블완
- 혼합효과모형
- r
- 인공지능
- 고정효과모형
- html
- 가설검정
- 회귀분석
- JavaScript
- 이원배치 분산분석
- 모평균에 대한 통계적추론
- 변동분해
- 산점도
- 에세이
- version 1
- 글쓰기
- 데이터 과학
- 통계학
- 두 평균의 비교
- 티스토리챌린지
- 이항분포
- css
- 반복있음
- Today
- Total
생각 작업실 The atelier of thinking
107. R을 이용한 회귀분석 예측값 구하기 본문
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 |
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초를 포함하고 있습니다.
'통계학 이야기' 카테고리의 다른 글
106. 회귀분석 - 예측값과 관측값 (0) | 2024.11.20 |
---|---|
105. 회귀 계수에 대한 통계적 추론 (0) | 2024.08.27 |
104. 회귀분석에서의 통계적 추론 (0) | 2024.08.22 |
103. R을 이용한 회귀분석 (0) | 2024.08.06 |
102. 단순선형 회귀모형 (1) | 2024.07.26 |