7.4 직선의 연결과 추가

이번 절에서는 낮은 수준의 그래프 함수 세 번째로 lines(x, y), abline(a, b), abline(h=y), abline(v=x) 등의 함수를 이용한 직선 연결 및 추가에 대해서 소개하겠습니다.

MASS 패키지에 들어있는 Cars93 데이터프레임의 Weight (차의 무게)MPG.highway (고속도로 연비) 두 개의 변수를 가지고 산포도를 그린 후에, lines() 함수선형 회귀식을 추가해보고, abline() 함수로 x축과 y축의 평균으로 수직선과 수평선을 추가하여 보겠습니다.

lines()함수의 일반적인 사용법은 다음과 같습니다.

lines(x, y = NULL, type = "l", ...)
Table 7.3: lines() 함수의 기능 설명
구분 기능 설명
x, y x, y 좌표 벡터 (coordinate vectors of points to join)
type = "l" 선(line) 그래프라는 뜻임 (character indicating the type of plotting)
... 선 유형 (lty), 선 색깔 (col), 선 두께(lwd) 등의 그래프 모수 입력 (Further graphical parameters)

abline() 함수의 사용법은 다음과 같습니다.

abline(a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL,     
      coef = NULL, untf = FALSE, ...) 
Table 7.4: ablines() 함수의 기능 설명
구분 기능 설명
a, b 절편과 기울기, 단일 값
h y값을 지나는 수평선
v x값을 지나는 수직선
reg 회귀직선 추가
coef 절편과 기울기로 이루어진 벡터
untf 변환 안된 값을 쓸지를 묻는 옵션. 만약 y값을 로그변환한 경우 untf = TRUE 라고 설정하면 로그변환 전의 원래값 기준으로 좌표에 그래프가 그려짐

* 출처 : http://sites.stat.psu.edu/~dhunter/R/html/graphics/html/abline.html

7.4.1 선형 회귀선의 추가

먼저 회귀모형을 구하는 lm() 함수를 사용해서 y = MPG.highway (고속도로 연비), x = Weight (차의 무게) 변수 간의 선형 회귀모형을 만들면 아래와 같습니다.

library(MASS)

##------------------------------------ 
## 플롯에 선을 추가합니다.
##------------------------------------ 
 
# 회귀 모형을 적용합니다.
str(Cars93)
## 'data.frame':    93 obs. of  27 variables:
##  $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
##  $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
##  $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
##  $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
##  $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
##  $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
##  $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
##  $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
##  $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
##  $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
##  $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
##  $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
##  $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
##  $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
##  $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
##  $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
##  $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
##  $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
##  $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
##  $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
##  $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
##  $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
##  $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
##  $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
##  $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
##  $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
##  $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ...
# fitting regression model
fit.1 <- lm(MPG.highway ~ Weight, data = Cars93)

다음으로, Weight (무게)MPG.highway (고속도로 연비)의 두 변수 산포도를 그리고, 위에서 만든 선형 회귀선을 추가해보겠습니다.

플롯에 선을 추가하는 데에는 세 가지 방법이 있습니다.

  1. lines() 함수를 사용하는 방법,
  2. abline(reg = ) 함수를 사용하는 방법,
  3. abline(a = coef[1], b = coef[2])를 사용하는 방법 등입니다.

참고로, 이렇게 추가되는 선에 대하여 그래프 모수(parameters)로서 색깔 지정col, 선 유형 지정은 lty, 선 두께 지정은 lwd 를 사용하면 됩니다.

library(MASS)
## 현재의 플롯에 선을 추가하는 방법입니다.

# (1) lines() 함수의 이용
with(Cars93, plot(MPG.highway ~ Weight))                    # Weight와 MPG.highway의 산점도를 그립니다.
lines(Cars93$Weight, fit.1$fitted.values, col = "blue")     # 산점도 위에 선을 추가합니다.
title("회귀선의 추가 : lines()") 
선의 추가 : 낮은 수준의 함수 lines(), abline() 함수의 사용

Figure 7.13: 선의 추가 : 낮은 수준의 함수 lines(), abline() 함수의 사용

# (2) abline(reg = regression_model) 함수의 이용
with(Cars93, plot(MPG.highway ~ Weight)) 
abline(reg = fit.1, col = "red", lwd = 3) 
title("회귀선의 추가 : abline(reg = )")
선의 추가 : 낮은 수준의 함수 lines(), abline() 함수의 사용

Figure 7.14: 선의 추가 : 낮은 수준의 함수 lines(), abline() 함수의 사용

# (3) abline(a = fit.1$coef[1], b = fit.1$coef[2]) 함수의 이용
with(Cars93, plot(MPG.highway ~ Weight)) 
abline(a = fit.1$coef[1], b = fit.1$coef[2], col = "black", lwd = 3) 
title("회귀선의 추가 : abline(a = coef[1], b = coef[2])")
선의 추가 : 낮은 수준의 함수 lines(), abline() 함수의 사용

Figure 7.15: 선의 추가 : 낮은 수준의 함수 lines(), abline() 함수의 사용

fit.1$coef                # 회귀 모형의 계수(기울기와 절편)입니다.
## (Intercept)      Weight 
##     51.6014     -0.0073
fit.1$coef[1]             # 절편입니다.
## (Intercept) 
##          52
fit.1$coef[2]             # 기울기입니다.
##  Weight 
## -0.0073

7.4.2 비모수 회귀선의 추가

이번에는 loess.smooth() 함수비모수 회귀곡선을 적합시키고, lines() 함수평탄화된 회귀선(smoothed regression line)을 현재 그래프에 추가해보는 방법을 알아보겠습니다.

library(MASS)
## 현재의 플롯에 평탄화된 회귀선을 추가합니다.: lines(), loess.smooth() 

# (1) 비모수 회귀선 적합화
fit.2 <- loess.smooth(x = Cars93$Weight, y = Cars93$MPG.highway) 
names(fit.2) 
## [1] "x" "y"
fit.2$x 
##  [1] 1695 1744 1793 1843 1892 1941 1990 2039 2088 2138 2187 2236 2285 2334 2384
## [16] 2433 2482 2531 2580 2629 2679 2728 2777 2826 2875 2925 2974 3023 3072 3121
## [31] 3171 3220 3269 3318 3367 3416 3466 3515 3564 3613 3662 3712 3761 3810 3859
## [46] 3908 3957 4007 4056 4105
# (2) 평탄화된 회귄서의 추가
with(Cars93, plot(MPG.highway ~ Weight)) 
lines(fit.2$x, fit.2$y, col = "blue", lwd = 3) 
title("평탄화된 회귀선의 추가: lines(), loess.smooth()")
선형 회귀선의 추가 : 낮은 수준의 함수 lines(), abline() 함수의 사용

Figure 7.16: 선형 회귀선의 추가 : 낮은 수준의 함수 lines(), abline() 함수의 사용

7.4.3 수평선과 수직선의 추가

abline()함수를 이용하여 플롯에 x축과 y축의 평균을 나타내는 수평선과 수직선을 추가해 보겠습니다.

  • abline(v = ) : 수직선(vertical)을 추가합니다. v = 에 수직선을 표시할 X축의 값을 입력해 줍니다.
  • abline(h = ) : 수평선(horizontal)을 추가합니다. h = 에 수평선을 표시할 y축의 값을 입력해 줍니다.
library(MASS)
## 수평선과 수직선을 추가하기 : abline() 

with(Cars93, plot(MPG.highway ~ Weight)) 
# (1) 수직선의 추가 
abline(v = mean(Cars93$Weight), 
       col = "black", lty = 3, lwd = 2)  
 
# (2) 수평선의 추가
abline(h = mean(Cars93$MPG.highway), 
       col = "blue", lty = 3, lwd = 2) 
 
title("수평선과 수직선 추가 : abline()")
수평/수직선의 추가 : 낮은 수준의 함수 abline() 함수의 사용

Figure 7.17: 수평/수직선의 추가 : 낮은 수준의 함수 abline() 함수의 사용