본문 바로가기

나 취준생/R

R 회귀분석 - 1

320x100

# 회귀분석


회귀분석은 하나의 변수가 나머지 다른 변수들과의 선형관계를 갖는가의 여부를 분석하는 방법

하나의 종속변수(예측하고자 하는 값)와 독립변수 사이의 관계를 명시하는 것이 목적이다


ex) 집 값에 영향을 주는 요소


- 독립변수 : 종속변수에 영향을 주는 변수 (평수, 역세권, 학군, ....)

- 종속변수 : 독립변수의 영향을 받아 다르게 나타나는 변수 (집값)


# 최소 제곱 추정법


최적의 기울기 a와 절편 b를 결정하기 위해 최소 제곱으로 알려진 추정 기법을 사용한다.

실제값과 예측값 사이의 수직 직선이 오차(잔차)를 제곱해서 구한 총합을 알아야한다.



예제 : 어느 실험실에서 10,20,30,40시간 마다 물질의 방사능 수치를 측정한 자료가 있을 때,

35시간의 방사능 수치는 무엇인가?


x=c(10,20,30,40) # 시간

y=c(300,250,200,150) # 방사능 수치


x_mean=mean(x) # 25

y_mean=mean(y) # 225


a=cov(x,y)/var(x) # x,y 공분산 / x 분산

b =y_mean+a*x_mean


func_nuclear <- function( x_num ) {

  x = c(10, 20, 30, 40)

  y = c(300, 250, 200, 150)

  a = cov(x,y) / var(x)

  x_mean = mean(x)

  y_mean = mean(y)

  b = y_mean - a * x_mean

  y_hat = b + a * x_num  # y=b+ax

  print ( y_hat )

}  

func_nuclear(35) # 35 시간일 때



예제 : 탄닌 함유량과 애벌레의 성장 간의 실험표를 이용하여

탄닌 함유량이 9일 때 성장률이 어떻게 되는지 예측하기



- 이렇게 생긴 데이터이다.


reg<-read.table("regression.txt",header=T)

reg

func_nuclear <- function( x_num ) {

  x<-reg[,2]

  y<-reg[,1]

  a = cov(x,y) / var(x)

  x_mean = mean(x)

  y_mean = mean(y)

  b = y_mean - a * x_mean

  y_hat = b + a * x_num  #     y =  b + ax

  print ( y_hat )

}  

func_nuclear(9) #0.8055556


탄닌 함유량이 9라면, 성장률은 0.8로 계산하는 것이 최소 제곱 추정법이다.



# R 함수 lm을 이용해서 단순 회귀분석 실습

- 탄닌 함유량과 애벌레 성장 간의 관계에 대한 회귀식 도출


1. 데이터 로드


reg<-read.table("regression.txt",header=T)

reg


2. 데이터 시각화 (산포도 그래프)


attach(reg)

plot(growth~tannin, data=reg, pch=21, col='blue', bg='blue')

- plot(y~x, data=데이터프레임 이름)



음의 관계인 것을 확인


3. 회귀분석을 통해 회귀 계수인 기울기와 절편 구하기


model<-lm(growth~tannin,data=reg)

# lm -> 회귀 분석함수 ( 종속변수~독립변수 )


model



기울기 : -1.217

절편 : 11.756

y= -1.217x + 11.756


아까 직접 만든 함수에서, tannin이 9일때, 0.805를 예측했는데,

이 식의 x에 9를 대입해서 계산시켜보면, 0.803이 나온다.

소수점을 잘라서 계산의 결과에 약간의 차이가 있지만 동일한 식이라는 것을 알 수 있다.


4. 2번에서 시각화한 산포도 그래프에 회귀 직선을 겹쳐 그리기


plot(growth~tannin, data=reg, pch=21, col='blue', bg='blue')

model<-lm(growth~tannin,data=reg)

abline(model,col='red')


5. 그래프 제목 바꾸기


model$coefficients[2] # 기울기

model$coefficients[1] # 절편


title( paste( '성장률=', round(model$coefficients[2],2), 'x탄닌 + ', round(model$coefficients[1],2) ) )



반응형

'나 취준생 > R' 카테고리의 다른 글

R 신경망  (0) 2021.02.05
R 회귀분석 - 2  (0) 2021.02.01
R 규칙 기반 분류 (OneR/Ripper)  (0) 2021.02.01
R 의사결정트리  (0) 2021.01.30
R 나이브 베이즈 알고리즘  (0) 2021.01.30