Post List

2019년 9월 1일 일요일

그래픽 문법(Grammar of Graphics) 관점에서 이해하는 ggplot






'R을 이용한 퀀트 투자 포트폴리오 만들기'가 출간 되었습니다.
많은 관심 부탁드리겠습니다.

↓↓ 구매링크 ↓↓

http://bit.ly/2ZaG5Bb

====================


그래픽 문법(Grammar of Graphics)은 릴랜드 윌킨스(Leland Wilkinson)의 책 The Grammar of Graphics에서 따온 것으로써, 데이터를 어떻게 표현할 것인지에 대한 내용입니다.



문법은 언어의 표현을 풍부하게 만든다. 단어만 있고 문법이 없는 언어가 있다면(단어 = 문장), 오직 단어의 갯수만큼만 생각을 표현할 수 있다. 문장 내에서 단어가 어떻게 구성되는 지를 규정함으로써, 문법은 언어의 범위를 확장한다.

Leland Wilkinson, 《The Grammar of Graphics》



그래픽 문법에서 말하는 요소는 다음과 같습니다.

  1. Data: 시각화에 사용될 데이터
  2. Aesthetics: 데이터를 나타내는 시각적인 요소(x축, y축, 사이즈, 색깔, 모양 등)
  3. Geometrics: 데이터를 나타내는 도형
  4. Facets: 하위 집합으로 분할하여 시각화
  5. Statistics: 통계값을 표현
  6. Coordinates: 데이터를 표현 할 이차원 좌표계
  7. Theme: 그래프를 꾸밈

ggplot2 패키지의 앞글자가 gg인 것에서 알 수 있듯이, 해당 패키지는 그래픽 문법을 토대로 시각화를 표현하며, 전반적인 시각화의 순서는 위의 순서와 같습니다.

ggplot2 패키지의 특징은 각 요소를 연결할 때 플러스(+) 기호를 사용한다는 점이며, 이는 그래픽 문법의 순서에 따라 요소들을 쌓아나간 후 최종적인 그래픽을 완성하는 패키지의 특성 때문입니다.


1. Data, Aesthetics, Geometrics


library(ggplot2)

data(diamonds)
head(diamonds)

## # A tibble: 6 x 10
##   carat cut       color clarity depth table price     x     y     z
## 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
## 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
## 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
## 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
## 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
## 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48


ggplot2 패키지를 불러온 후, 기본적으로 제공되는 다이아몬드 데이터를 불러오도록 하겠습니다. 데이터의 각 변수는 다음과 같습니다.

  • carat: 다이아몬드 무게
  • cut: 컷팅의 가치
  • color: 다이아몬스 색상
  • clarity: 깨끗한 정도
  • depth: 깊이 비율, z / mean(x, y)
  • table: 가장 넓은 부분의 너비 대비 다이아몬드 꼭대기의 너비
  • price: 가격
  • x: 길이
  • y: 너비
  • z: 깊이

먼저 가장 중요한 Data와 Aesthetics를 정의해주도록 하겠습니다.


ggplot(data = diamonds, aes(x = carat, y = price))



  1. ggplot() 함수 내부의 data에 diamonds를 지정해줍니다.
  2. aes() 함수를 통해 데이터를 매핑해주며 x축에 carat을, y축에 price를 지정해줍니다. 

x축과 y축에 우리가 매핑한 carat과 price가 표현되었지만, 어떠한 모양(Geometrics)으로 시각화를 할지 정의하지 않았으므로 빈 그림이 생성됩니다. 다음으로 Geometrics을 통해 데이터를 그림으로 표현해주도록 하겠습니다.


ggplot(data = diamonds, aes(x = carat, y = price)) +
  geom_point()



Data와 Aesthetics을 정의한 후, 플러스(+) 기호를 통해 geom_point() 함수를 입력하여 산점도가 표현되었습니다. geom은 Geometrics의 약자이며, 이처럼 geom_*() 함수를 통해 원하는 형태의 시각화를 할 수 있습니다.


library(magrittr)

diamonds %>%
  ggplot(aes(x = carat, y = price)) +
  geom_point()


일반적으로 Data는 ggplot() 함수 내에서 정의하기 보다는, 일반적으로 dplyr 패키지의 함수들을 이용하여 데이터를 가공한 후 파이프 오퍼레이터를 통해 연결합니다.


diamonds %>%
  ggplot(aes(x = carat, y = price)) +
  geom_point(aes(color = cut))



geom_point() 내부에서 aes()를 통해 점의 색깔을 매핑해줄 수 있습니다. color = cut을 지정하여 cut에 따라 점의 색깔이 다르게 표현됩니다. 이 외에도 shape, size를 통해 모양과 크기를 각각 다르게 표현할 수 있습니다.


2. Facets

Facets은 여러 집합을 하나의 그림에 표현하기 보다 하위 집합으로 나누어 시각화하는 요소입니다.


diamonds %>%
  ggplot(aes(x = carat, y = price)) +
  geom_point() +
  facet_grid(. ~ cut)

facet_grid() 혹은 facet_wrap() 함수를 통해 그림을 분할할 수 있습니다. 물결 표시(~)를 통해 하위 집합으로 나누고자 하는 변수를 선택할 수 있으며, 위 예제에서는 cut에 따라 각기 다른 그림으로 표현되었습니다.


3. Statistics

Statistics는 통계값을 나타내는 요소입니다.

diamonds %>%
  ggplot(aes(x = carat, y = price)) +
  geom_point(aes(color = cut)) +
  geom_smooth(method = 'lm')




geom_smooth() 함수를 통해 평활선을 추가해주며, 방법으로 lm(linear model)을 지정할 경우 선형회귀선을 그려주게 됩니다. 이 외에도 glm, gam, loess 등의 다양한 회귀선을 그려줄 수 있습니다.

diamonds %>%
  ggplot(aes(x = cut, y = carat)) +
  stat_summary_bin(fun.y = 'mean', geom = 'bar') 



stat_summary_*() 함수를 사용하여 통계값을 직접 표현할 수도 있습니다. cut에 따른 carat의 평균값을 구하고자 할 경우, fun.y에 mean을 입력하여 평균값을 구하고, geom에 bar를 입력하여 막대그래프 형태로 표현하였습니다.


4. Coordinates

Coordinates는 좌표를 의미합니다. ggplot2에서는 coord_*() 함수를 이용하여 x축 혹은 y축 정보를 변형할 수 있습니다.


diamonds %>%
  ggplot(aes(x = carat, y = price)) +
  geom_point(aes(color = cut)) +
  geom_smooth(aes(color = cut), method = 'lm') +
  coord_cartesian(xlim = c(0, 3), ylim = c(0, 20000))




coord_cartesian() 함수를 통해 x축과 y축 범위를 지정해 줄 수 있습니다. xlim과 ylim 내부에 범위의 최소 및 최댓값을 지정해주면, 해당 범위의 데이터만을 보여줍니다.


diamonds %>%
  ggplot(aes(x = carat, y = price)) +
  geom_boxplot(aes(group = cut)) +
  coord_flip()



coord_flip() 함수는 x축과 y축을 뒤집어 표현합니다. ggplot() 함수의 aes 내부에서 x축은 carat을, y축은 price를 지정해 주었지만, coord_flip() 함수를 통해 x축과 y축이 서로 바뀌었습니다.

5. Theme

Theme은 그림의 제목, 축 제목, 축 단위, 범례, 디자인 등 그림을 꾸며주는 역할을 담당합니다.


diamonds %>%
  ggplot(aes(x = carat, y = price)) +
  geom_point(aes(color = cut)) +
  theme_bw() +
  labs(title = 'Relation between Carat & Price',
       x = 'Carat', y = 'Price') +
  theme(
    legend.position = 'bottom'
  ) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank()
        ) +
  scale_y_continuous(
    labels = function(x) {
      paste0('$', 
             format(x, big.mark = ',', scientific = FALSE))
    }) 



  1. theme_bw() 함수를 통해 배경을 흰색으로 설정합니다.
  2. theme() 함수 내 legend.position을 통해 범례를 하단으로 이동합니다.
  3. theme() 함수 내 panel.grid를 통해 격자를 제거합니다.
  4. scale_y_continuous() 함수를 통해 y축에서 천원 단위로 콤마(,)를 붙여주며, 이를 달러($) 표시와 합쳐줍니다.


ggplot2 패키지의 다양한 예제와 함수는 아래 링크를 참조하시길 바랍니다.
  • http://r-statistics.co/ggplot2-Tutorial-With-R.html
  • https://ggplot2.tidyverse.org/reference/


댓글 1개: