13.8 산포도 행렬 그리기

산포도두 변수간의 관계를 파악하는데 굉장히 유용한 시각화 방법입니다. 그리고 산포도 행렬다수의 변수들 간의 관계를 한눈에 파악하는데 유용한 시각화 방법입니다.

ggplot2로 두 변수만 가지고 산포도는 유연하게 그릴 수 있는데요, 3개 이상의 변수를 가지고 산포도 행렬을 그리기는 매우 힘이 듭니다. (프로그래밍을 해야 합니다) 따라서 산포도 행렬plot() 함수를 써서 한번에 그리는 것이 제일 편합니다.

이번 절에서는 Base Graphics 패키지 내에 pairs() 함수를 이용해서 산포도 행렬에 몇 가지 사용자 정의 함수를 추가하여 히스토그램도 집어 넣고 상관계수 숫자도 포함시키는 방법을 소개하겠습니다. 산포도 행렬에 많은 추가 정보를 담을 수 있어서 매우 보기에 좋고 유용합니다. 사용자 정의 함수는 pairs() 도움말(help)을 참조하였습니다.

13.8.1 데이터 세트

13.8.1.1 변수의 선택

예제로 사용한 데이터는 뉴욕의 1973년도 공기의 질을 측정한 airquality 데이터셋의 Ozone, Solar.R, Wind, Temp 4개의 변수가 되겠습니다.

str(airquality)
## 'data.frame':    153 obs. of  11 variables:
##  $ Ozone        : int  41 36 12 18 NA 28 23 19 8 NA ...
##  $ Solar.R      : int  190 118 149 313 NA NA 299 99 19 194 ...
##  $ Wind         : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
##  $ Temp         : int  67 72 74 62 56 66 65 59 61 69 ...
##  $ Month        : Factor w/ 5 levels "5","6","7","8",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Day          : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Month.ch_temp: chr  "5" "5" "5" "5" ...
##  $ Day.ch_temp  : chr  "1" "2" "3" "4" ...
##  $ Month.ch     : chr  "05" "05" "05" "05" ...
##  $ Day.ch       : chr  "01" "02" "03" "04" ...
##  $ Time         : Date, format: "2021-05-01" "2021-05-02" ...
# 1~4번째 변수만 선택
airquality_1 <- airquality[,c(1:4)]
str(airquality_1)
## 'data.frame':    153 obs. of  4 variables:
##  $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
##  $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
##  $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
##  $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...

13.8.1.2 결측치의 처리

결측값이 있으면 상관계수를 구할 때 NA 값이 나오므로, 결측값 여부 확인하고 결측값이 있는 행은 삭제한 후에 산포도 행렬을 그려보겠습니다.

# 결측값 개수 확인
sum(is.na(airquality_1$Ozone)) # 37
## [1] 37
sum(is.na(airquality_1$Solar.R)) # 7
## [1] 7
sum(is.na(airquality_1$Wind)) # 0
## [1] 0
sum(is.na(airquality_1$Temp)) # 0
## [1] 0
# 결측값 있는 상태에서 상관계수 계산했을 때
cor(airquality_1)
##         Ozone Solar.R  Wind  Temp
## Ozone       1      NA    NA    NA
## Solar.R    NA       1    NA    NA
## Wind       NA      NA  1.00 -0.46
## Temp       NA      NA -0.46  1.00
# 결측값 있는 행 전체 삭제
airquality_2 <- na.omit(airquality_1)
str(airquality_2)
## 'data.frame':    111 obs. of  4 variables:
##  $ Ozone  : int  41 36 12 18 23 19 8 16 11 14 ...
##  $ Solar.R: int  190 118 149 313 299 99 19 256 290 274 ...
##  $ Wind   : num  7.4 8 12.6 11.5 8.6 13.8 20.1 9.7 9.2 10.9 ...
##  $ Temp   : int  67 72 74 62 65 59 61 69 66 68 ...
##  - attr(*, "na.action")= 'omit' Named int [1:42] 5 6 10 11 25 26 27 32 33 34 ...
##   ..- attr(*, "names")= chr [1:42] "5" "6" "10" "11" ...
sum(is.na(airquality_2$Ozone)) # 0
## [1] 0
sum(is.na(airquality_2$Solar.R)) # 0
## [1] 0

Go Top

13.8.2 사용자 정의 함수 만들기

13.8.2.1 대각선에 히스트그램 추가하는 함수

산포도 행렬의 대각선에 히스토그램을 추가하는 사용자 정의 함수입니다. pairs() 도움말(help)에 나와있는 사용자 정의함수 그대로 가져왔습니다. 아래 사용자 정의 함수를 복사해서 사용하시기 바랍니다.

## put histograms on the diagonal
panel.hist <- function(x, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(usr[1:2], 0, 1.5) )
  h <- hist(x, plot = FALSE)
  breaks <- h$breaks; nB <- length(breaks)
  y <- h$counts; y <- y/max(y)
  rect(breaks[-nB], 0, breaks[-1], y, col = "cyan", ...)
} 

# source: help(pairs)

13.8.2.2 산포도 행렬 위쪽에 상관계수 숫자 삽입하는 함수 정의

다음으로 산포도 행렬의 위쪽에 상관계수 숫자를 집어넣는 사용자 정의 함수입니다. 이 또한 pairs() 도움말(help)에 나와있는 사용자 정의함수 그대로 가져왔습니다. 아래 사용자 정의 함수를 카피해서 사용하시기 바랍니다.

## put (absolute) correlations on the upper panels,
## with size proportional to the correlations.
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  r <- abs(cor(x, y))
  txt <- format(c(r, 0.123456789), digits = digits)[1]
  txt <- paste0(prefix, txt)
  if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
  text(0.5, 0.5, txt, cex = cex.cor * r)
} 

# source : help(pairs)

13.8.2.3 산포도에 선형 회귀선 추가하는 사용자 정의 함수

다음으로 산포도에 선형 회귀선을 추가하는 사용자 정의 함수입니다. 이는 R Graphics Cookbook (원스턴 챙 지음, 이제원 옮김)을 참조하였습니다. 아래 사용자 정의 함수를 카피해서 사용하시기 바랍니다.

## put linear regression line on the scatter plot
panel.lm <- function(x, y, col=par("col"), bg=NA, pch=par("pch"),
                     cex=1, col.smooth="black", ...) {
  points(x, y, pch=pch, col=col, bg=bg, cex=cex)
  abline(stats::lm(y~x), col=col.smooth, ...)
}

Go Top

13.8.3 산포도 행렬 그리기

이제 준비가 다 되었습니다. airquality의 4개 변수 간의 산포도 행렬, 상관계수 숫자, 히스토그램을 하나의 도표로 나타내보겠습니다.

## 산포도 행렬(scatter-plot matrix), 상관계수(correlation), 히스토그램(histogram)
pairs(airquality_2, 
      lower.panel = panel.lm, # 아래쪽 산포도에 선형 직선 추가
      upper.panel = panel.cor, # 위쪽에는 상관계수 숫자 (상관계수에 크기 비례)
      diag.panel = panel.hist, # 대각선에는 히스토그램
      pch="*",  # 점 모양은 * 로
      main = "scatter-plot matrix, correlation coef., histogram"
      )

13.8.3.1 그룹별로 점의 색깔 달리하기

보너스로, pairs() 함수를 사용해서 범주(그룹)별로 점의 색깔을 달리하는 방법도 소개하겠습니다. 이 역시 pairs() 함수 도움말(help)에 있는 R script 를 가져왔습니다. 도움말(help)이 정말 도움이 많이 됩니다. ^^ 사용한 데이터는 그 유명한 Iris 데이터가 되겠습니다.

# 범주(그룹)을 색깔로 구분하여 산포도 행렬 그리기
pairs(iris[1:4], main = "Anderson's Iris Data -- 3 species",
      pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])

* R script source : help(pairs)

Go Top