######################################################
## 7. Simple LinearRegression
## 연속 데이터에 대한 분석 방법
## 종속 변수와 독립변수의 관계가 1:1 이다.
## 예를 들면 독립변수는 차량의 속도 종속변수는 차량의 제동 거리가 될 수 있겠다.
######################################################
## (1) speed ,dist 두개의 컬럼으로 구성된 데이터 셋을 만들었다
speed = c(10,20,30,40,50,60,70)
dist = c(13,18,25,38,47,61,105)
data = data.frame(speed ,dist)
print(data)

## (2) 선형회귀식을 만든다
## – speed 1.371 0.237 5.786 0.00217 **
## ==> 기울기는 1.371 이며 이 기울기에 대한 P-Value 는 0.00217 로 회기식은 유의함
## – Adjusted R-squared: 0.8441
## ==> 조정된 설명력 : 해당 모형의 설득력을 지수화
## 아래는 회귀식의 Summary(out) 결과이다.
##
##Residuals:
## 1 2 3 4 5 6 7
## 10.286 1.571 -5.143 -5.857 -10.571 -10.286 20.000
##
##Coefficients:
## Estimate Std. Error t value Pr(>|t|)
##(Intercept) -11.000 10.600 -1.038 0.34696
##speed 1.371 0.237 5.786 0.00217 **
##—
##Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##
##Residual standard error: 12.54 on 5 degrees of freedom
##Multiple R-squared: 0.87, Adjusted R-squared: 0.8441
##F-statistic: 33.48 on 1 and 5 DF, p-value: 0.002171

out = lm(dist ~ speed , data=data)
out
summary(out)
## (3) 회귀식 확인
## plot(dist ~ speed, data=data, col=”blue”) 은 파란점으로 실제 데이터를 표시
## abline(out, col=”red”) 는 선형회귀식을 붉은선으로 표시한다.
## 앞에서 설명한 것처럼 오차가 가장적은 방향으로 식이 성립된다.

plot(dist ~ speed, data=data, col=”blue”)
abline(out, col=”red”)

## (4) 회귀식 보정
## 이 케이스에서 실제로 속도가 0 이라면 제동거리도 0이 되는 것이 맞다
## -1 을 통해서 Y 절편을 제거 할 수 있다.
summary(lm(dist ~ speed -1, data=data))
out = lm(dist ~ speed – 1 , data=data)
plot(dist ~ speed -1, data=data)
abline(out, col=”red”)

## (4) sqrt 변환
## sqrt 를 적용시 데이터의 퍼지는 정도가 줄어드는 것을 볼 수 있다.
## 단, 본 케이스의 경우 log 적용시 정규분포도가 오히려 나빠짐
plot(dist ~ speed -1, data=data)
plot(log(dist) ~ speed – 1, data=data)
plot(sqrt(dist) ~ speed- 1, data=data)

##미 적용
out = lm(dist ~ speed – 1 , data=data)
plot(dist ~ speed – 1, data=data)
abline(out, col=”red”)

##log 적용
out = lm(log(dist) ~ speed – 1 , data=data)
plot(log(dist) ~ speed – 1, data=data)
abline(out, col=”red”)

##sqrt 적용
out = lm(sqrt(dist) ~ speed – 1 , data=data)
plot(sqrt(dist) ~ speed – 1, data=data)
abline(out, col=”red”)

## (5) 모델 검증
## out 의 Normal Q-Q 는 직선의 형태를 갖으며 (normal Q-q 표준화된 그래프, 정렬)
## 나머지 관계도는 별다른 추세를 보이지 않는다.
## 또한 resid(out)을 통해 구한 잔차는
## 데이터 변환 없을 경우 P-Value 0.0.004615
## log 적용시 P-Value 0.8196
## sqrt 적용시 P-Value 0.9638

par(mfrow=c(2,2))
plot(out)
##qq Normal
plot(resid(out))
qqnorm(resid(out))
qqline(resid(out))
##정규성 검정
shapiro.test(resid(out))

## (6) 결과물 out 의 내용
## names(out) 을 통해서 얻을 수 있는 값을 확인 가능
names(out)
out$rank
out$residual
##예측치
fitted(out)
##잔차
resid(out)

##Residual Standard Error
sqrt(sum(resid(out)^2)/(length(data$dist)-2))

## (7) simulation
## – 편차를 제거하고 sqrt를 적용한 회귀식을 생성
## – rnorm 을 통해 data 수와 같은 수를 갖고, 평균이 거리 예측치이며, 분산은 오차와인
## 임의수 테스트 데이터를 만들어 낸다.
## – 다시 만들어낸 dist set 과 speed 의 관계를 그래프로 표현

## 회귀식 생성
out = lm(sqrt(dist) ~ speed-1, data=data)
## 분산
print(summary(out)$sigma)

## 평균
print(mean(fitted(out)))

##위와 같은 분산, 평균을 갖는 새로운 dist 데이터 생성
dist = rnorm(n=nrow(data), mean=fitted(out), sd=summary(out)$sigma)^2
plot(dist ~ data$speed)

## 모델과 R 명령어
##Model : Y = a + bX
##R Code : Y ~ X
##
##Model : Y = bX
##R Code : Y ~ X – 1
##
##Model : sqrt(Y) = a + bX
##R Code : sqrt(Y) ~ X
##
##Model : sqrt(Y) = bX
##R Code : sqrt(Y) ~ X – 1
##
##Model : lnY = a + bX
##R Code : log(Y) ~ X