R – 선형 회귀 스크립트로 알아보기

Script )

# 03 단순 선형 회귀 #

# 모델링: 현실 세계에서 일어나는 현상을 수학 식/ 모형으로 표현하는 행위, (수학 식/ 모형)을 모델이라고 한다.
# 모델링을 통해 모델을 만들면 그 모델로 예측까지 할 수 있다.
# Ex) 100만원 기본급에 자동차 1대 팔 때마다 90만원을 추가로 받음 
# 모델링 => y = 90만x + 100만

# 단순 선형 회귀는 위처럼 'y=a0x+a1'형태의 선형 방정식이 쓰임

x = c(3.0, 6.0, 9.0, 12.0)	# 설명 변수 x
y = c(3.0, 4.0, 5.5, 6.5)	# 반응 변수 y

# 위처럼 주어진 데이터를 '훈련 집합'이라고 부름
# 학습/훈련: 훈련 집합을 선형 방정식에 대입해보면서 최적의 계수(a0,a1)를 찾는 행위
# 만약 x=c(1,2,3), y=c(1,2,3)이면 a0=1, a1=0이 되서 y=x라는 선형 방정식을 갖게 됨

# 그러나 훈련집합을 통해 딱 떨어지는 a0,a1을 찾기 힘들 수도 있다. 
# 그럴 때는 수학 모형(그래프)를 그렸을 때 가장 오차가 적은 모델을 찾고, 그 모델에 해당하는 a0,a1을 찾음 
# => 우리 세계는 불확실적인 요소가 너무 많기 때문에 오차를 0으로 만들 수는 없음

# 학습은 lm이라는 함수를 이용해서 시행한다. 
m = lm(y ~ x)		# 모델 적합(학습)
m			# m 출력
# => intercept가 1.75, x가 0.4로 나올텐데, 앞이 a1, 뒤가 a0값에 해당됨 
# => y=0.4x+1.75

# lm함수로 찾은 최적 모델(선형 방정식)
plot(x,y)
abline(m,col='red') # 최적 모델 나타내기 

coef(m)       # 매개변수(계수) 값을 알려줌
fitted(m)     # 훈련집합에 있는 샘플에 대한 예측값 <최적 모델에 x를 대입했을 때 나오는 y값>
residuals(m)  # 오차를 알려줌
deviance(m)   # 오차제곱합를 알려줌
deviance(m)/length(x) # 오차제곱합/x개수 (오차제곱합 => 평균제곱오차로 변환)
summary(m)	# 모델의 상세 분석

# 선형 회귀: 모델링을 할 때 오차가 적은 쪽으로 선형 방정식을 만듦 

# --------------------------------------------------------------------------------- #

# 04 단순 선형 회귀의 적용 : cars 데이터 #
str(cars)
head(cars)

# cars데이터는 speed(속도)와 dist(제동 거리)가 존재함
# 속도에 따라 제동 거리가 변하니, speed: 설명 변수(x), dist: 반응 변수(y)

# 선형 회귀 작업 
car_model = lm(dist~speed, data = cars)
coef(car_model)

# 모델링 결과 보기 (최적 모델 결과)
plot(cars)
abline(car_model, col = 'red')

fitted(car_model) # 예측값: speed를 최적 모델에 대입했을 때 나오는 dist
residuals(car_model)  # 오차: 위 결과에 대한 오차를 알려줌

# predict함수는 데이터 프레임을 인수로 가짐 
nx1 = data.frame(speed = c(21.5))
# predict함수를 통해 최적 모델에 대한 예측 값을 구할 수 있음 
predict(car_model, nx1) 

# => 속도를 21.5로 달리다 브레이크를 밟으면 66.96에서 멈춘다. 

# 다른 예시
nx2 = data.frame(speed = c(25.0, 25.5, 26.0, 26.5, 27.0, 27.5, 28.0))
predict(car_model, nx2)

# 데이터 시각화 <x=speed, y=예측값 dist>
plot(nx2$speed, predict(car_model, nx2), col ='red', cex = 2, pch = 20) # cex인수는 원의 크기, pch인수는 원 안에 색깔 담기 
abline(car_model)

# 고차 다항식 적용 <선형 회귀 개념 응용>
plot(cars, xlab ='속도', ylab = '거리')      # cars 데이터를 그림
x = seq(0, 25, length.out = 200)            # 예측할 지점  <0부터 25까지 200개 수 생성>
x
for(i in 1:4) {  
  m = lm(dist~poly(speed, i), data = cars) #<poly를 이용해서 i차 방정식에 대한 학습도 가능>
    assign(paste('m', i, sep = '.'), m)        # i차 모델 m을 m.i라 부름 <첫 번째 인수: 변수 인수, 두 번째 인수: 변수 데이터>
  lines(x, predict(m, data.frame(speed = x)), col = i) # m으로 예측한 결과를 겹쳐 그림 
}

# 분산 분석
anova(m.1, m.2, m.3, m.4) 

북 참고) R로 배우는 데이터 과학

Leave a Reply

Your email address will not be published. Required fields are marked *