본문 바로가기
AI/회귀

[회귀 - 12] R을 이용한 다항 회귀 실습

by Nhahan 2022. 4. 24.

직극별 연봉 테이블 데이터 세트

새 직원을 뽑으려고 하는데 이 직원을 A라고 하겠다.

A는 20년의 경력을 가지고 있고 이전 회사에서 16만 달러의 연봉을 받았다고 말하고 있다.

그리고 이전 회사에서는 Region Manager 직급으로 2년간 일했다고 하고 있다.

그럼 이 직원에게 제시 될 연봉은 6행과 7행 사이의 어딘가가 될 것이다. (이를 대강 6.5 수준의 급여라고 하겠다)

 

다중 회귀를 통해서 위 내용이 사실인지 거짓인지 알아보자.

 

 

일단 Position과 Level은 사실상 같은 내용이기 때문에 2, 3열만 가지고 모델을 만들 것이다.

dataset = dataset[2:3]

좀 더 간단해진 데이터 세트

데이터 세트가 작으니 이번에는 훈련 세트와 테스트 세트를 나누지 않고 진행할 예정이다.

 

 


 

 

이 데이터 세트에 선형 회귀가 어울릴지, 다항 회귀가 어울릴지 아직 정확히 우린 모르기 때문에 둘 다 해보고 어떤 방식이 더 맞는지 볼 것이다.

 

 

1. 선형 회귀

lin_reg = lm(formula = Salary ~ .,
             data = dataset)

p-value가 0.00383 / 신뢰 수준은 별 2개

더보기
library(ggplot2)
ggplot() +
  geom_point(aes(x = dataset$Level, y = dataset$Salary),
             colour = 'red') +
  geom_line(aes(x = dataset$Level, y = predict(lin_reg, newdata = dataset)),
            colour = 'blue') +
  ggtitle('Truth or Bluff (Linear Regression)') +
  xlab('Level') +
  ylab('Salary')

 

이를 그래프로 나타내면 이와 같다. 딱 봐도 이건 아니다 싶다...

데이터가 비선형적이기 때문에 선형 회귀와는 맞지 않다.

 

 

 

 

2. 다항 회귀

dataset$Level2 = dataset$Level^2
dataset$Level3 = dataset$Level^3
dataset$Level4 = dataset$Level^4

다항 회귀 모델을 만들기 위해 더 높은 차 항을 추가해주어야한다. 더 높은 차수까지 추가해줄 수 있지만 일단 4차까지만 추가해주도록 한다.

Level4까지 추가되었다

poly_reg = lm(formula = Salary ~ .,
              data = dataset)

더보기
library(ggplot2)
ggplot() +
  geom_point(aes(x = dataset$Level, y = dataset$Salary),
             colour = 'red') +
  geom_line(aes(x = dataset$Level, y = predict(poly_reg, newdata = dataset)),
            colour = 'blue') +
  ggtitle('Truth or Bluff (Polynomial Regression)') +
  xlab('Level') +
  ylab('Salary')

비선형적 회귀를 만들었다! (Level을 높여줄 수록 좀 더 정확한 값을 얻을 수 있다)

다항 회귀를 이용하면 좀 더 새 직원에 대해 6.5수준의 급여를 쉽게 측정할 수 있을 것 같은 느낌이 든다. 와우!

 

 

 

3. 6.5 수준의 급여를 측정해보기

  • 선형 회귀 모델을 이용한 측정
predict(lin_reg, data.frame(Level = 6.5))

결과값 : 330378.8

 

  • 다항 회귀 모델을 이용한 측정
predict(poly_reg, data.frame(Level = 6.5,
                             Level2 = 6.5^2,
                             Level3 = 6.5^3,
                             Level4 = 6.5^4))

결과값 : 158862.5

 

이는 A가 말한 16만 달러와 매우 비슷한 결과고, 우리는 A가 정직한 사람이라는 것을 알았다. 그리고 우리는 이 결과를 통해 A와 올바른 협상을 이어나갈 수 있을 것이다.

 

 


 

 

R 코드 템플릿

더보기
# Polynomial Regression

# Importing the dataset
dataset = read.csv('Position_Salaries.csv')
dataset = dataset[2:3]

# Splitting the dataset into the Training set and Test set
# # install.packages('caTools')
# library(caTools)
# set.seed(123)
# split = sample.split(dataset$Salary, SplitRatio = 2/3)
# training_set = subset(dataset, split == TRUE)
# test_set = subset(dataset, split == FALSE)

# Feature Scaling
# training_set = scale(training_set)
# test_set = scale(test_set)

# Fitting Linear Regression to the dataset
lin_reg = lm(formula = Salary ~ .,
             data = dataset)

# Fitting Polynomial Regression to the dataset
dataset$Level2 = dataset$Level^2
dataset$Level3 = dataset$Level^3
dataset$Level4 = dataset$Level^4
poly_reg = lm(formula = Salary ~ .,
              data = dataset)

# Visualising the Linear Regression results
# install.packages('ggplot2')
library(ggplot2)
ggplot() +
  geom_point(aes(x = dataset$Level, y = dataset$Salary),
             colour = 'red') +
  geom_line(aes(x = dataset$Level, y = predict(lin_reg, newdata = dataset)),
            colour = 'blue') +
  ggtitle('Truth or Bluff (Linear Regression)') +
  xlab('Level') +
  ylab('Salary')

# Visualising the Polynomial Regression results
# install.packages('ggplot2')
library(ggplot2)
ggplot() +
  geom_point(aes(x = dataset$Level, y = dataset$Salary),
             colour = 'red') +
  geom_line(aes(x = dataset$Level, y = predict(poly_reg, newdata = dataset)),
            colour = 'blue') +
  ggtitle('Truth or Bluff (Polynomial Regression)') +
  xlab('Level') +
  ylab('Salary')

# Visualising the Regression Model results (for higher resolution and smoother curve)
# install.packages('ggplot2')
library(ggplot2)
x_grid = seq(min(dataset$Level), max(dataset$Level), 0.1)
ggplot() +
  geom_point(aes(x = dataset$Level, y = dataset$Salary),
             colour = 'red') +
  geom_line(aes(x = x_grid, y = predict(poly_reg,
                                        newdata = data.frame(Level = x_grid,
                                                             Level2 = x_grid^2,
                                                             Level3 = x_grid^3,
                                                             Level4 = x_grid^4))),
            colour = 'blue') +
  ggtitle('Truth or Bluff (Polynomial Regression)') +
  xlab('Level') +
  ylab('Salary')

# Predicting a new result with Linear Regression
predict(lin_reg, data.frame(Level = 6.5))

# Predicting a new result with Polynomial Regression
predict(poly_reg, data.frame(Level = 6.5,
                             Level2 = 6.5^2,
                             Level3 = 6.5^3,
                             Level4 = 6.5^4))
  • x_grid에 대한 추가 설명

0.1 단위의 Level을 추가(1.0, 1.1, 1.2, ..., 9.9, 10.0)하여 부드러운 곡선을 만드는 법

 

댓글