[R] ggplot2 활용 데이터 시각화 예시

반응형

 

1. Introduction

  • 이번 포스팅에서는 ggplot2 패키지를 사용하여 데이터를 시각화 하는 방법을 설명하겠습니다. ggplot2 패키지는 그래픽을 출력하는 R 패키지로 가장 우아하고 가장 다재다능하며일정 문법을 따르는 깊이 있는 그래픽 패키지 중 하나입니다.
  • ggplot2의 이론적 토대에 대해 더 자세히 알고 싶으시다면 “The Layered Grammar of Graphics”(http://vita.had.co.nz/papers/layered-grammar.pdf)를 한번 읽어보시는 것도 추천합니다.
  • R for Data Science를 참고하면서 포스팅하였으며 더 자세한 것은 해당 R for Data Science의 Data visualisation 파트를 읽으시길 권장합니다.
  • library(tidyverse)
    library(ggplot2)

1. 1. The mpg data frame

  • mpg 데이터 프레임은 ggplot2에 내장되어 있는 데이터로 38개의 자동차 모델에 대한 미국 환경 보호국(US Environmental Protection Agency)에서 수집한 데이터 입니다.
  • mpg 데이터를 중심으로 함수에 대해 설명하겠습니다.
    • displ : A car’s engine size, in litres.
    • hwy : A car’s fuel efficiency on the highway, in miles per gallon (mpg).
  • mpg

2. Creating a ggplot

  • ggplot(data = mpg) 코드를 입력하여 mpg 데이터를 가지고 그릴 수 있는 빈 그래프를 만듭니다. 쉽게 말해 껍데기를 먼저 만드는 역할이라고 생각하시면 됩니다.
  • 그 다음으로 ggplot() 객체에 하나 이상의 레이어(layer)를 추가하여 그래프를 완성시킵니다. 이 때 연결하는 함수는 + 기호를 이용합니다.
    • ggplot2에서는 각각 다른 유형의 레이어를 플롯에 추가하는 많은 기하학 함수가 존재합니다. 그리고 그 각 기하학 함수는 mapping argument를 취합니다.
    • mapping argument는 항상 aes() 인수와 쌍을 이루고 aes() 함수 안에응 x축 및 y축 등 매핑할 변수를 지정할 수 있습니다.
  • x축에는 displ 변수, y축에는 hwy 변수를 넣어, geom_point() 함수를 가지고 산점도를 출력한 결과는 다음과 같습니다.
    • 그림에서 보면 displhwy 사이의 관계는 대략적으로 음의 관계를 보입니다. 즉 사이즈가 더 큰 엔진은 더 많은 연료를 사용함을 보여줍니다.
  • ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy))

2. 1. A graphing template

ggplot(data = <DATA>) + <GEOM_FUNCTION>(mapping = aes(<MAPPING>))

2. 2. Aesthetic mappings

  • mpg 데이터프레임 안에 class 변수와 같이 x축, y축이 아닌 세 번째 변수를 aesthetic mapping하여 2차원 그래프에 추가할 수 있습니다.
    • 여기서 말하는 aesthetic mapping은 aes() argument에 포함되는 부분으로 크기(size), 모양(shape) 또는 색깔(color, colour) 등 이 포함됩니다.
    ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, colour = class))
    • colour = class를 추가함으로써 class 변수가 가지고 있는 수준에 따라 범례가 표시되고 산점도에 색깔이 부여됨을 확인할 수 있습니다.
  • colour argument를 aes() argument 안에 작성하지 않고 밖에 작성하면 산점도 자체의 색상이 변경됨을 보실 수 있습니다.
  • ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy), colour = "blue")
  • 여기서 조심해야할 부분은 aes() argument 안에는 항상 변수명이 할당 되어야 한다는 점입니다. colour = "blue"aes() 안에 작성할 경우 원하는 대로 실행되지 않고 colour 라는 범례가 생기게 됩니다.
  • ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, colour = "blue"))
  • 이 밖에 size, alpha, shape 등의 argument를 이용하실 수 있습니다.
    ## Warning: Using size for a discrete variable is not advised.
  • ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, shape = class))
  • ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, alpha = class))
  • ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, size = class))

2. 3. Facets

  • aes() argument를 이용하여 2차원 외에 추가 변수를 고려하는 방법도 있지만, 범주형 변수에 유용한 또 다른 방법이 존재합니다.
  • 즉, 범주형 변수의 수준에 따라 그래프를 분할하여 표시하는 방법입니다. 이 때 이용하는 대표적인 함수로는 facet_wrap()facet_grid() 가 있습니다.
    • facet_wrap(~ variable) 함수는 이산형(범주형) 변수일 때 쓰입니다.
    • facet_grid(variable ~ variable) 함수는 두 변수까지 고려할 수 있습니다.
    ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy)) + 
      facet_wrap(~ class, nrow = 2)
    • class 변수의 수준에 따라 산점도가 출력됨을 볼 수 있으며 nrow = 2 argument에 따라 두 줄로 출력됩니다.
    ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy)) + 
      facet_grid(drv ~ cyl)

2. 4. Geometric objects

  • ggplot2에서는 ggplot() 이라는 객체에 기하학적 객체인 레이어를 씌우는 형태로 함수를 설명할 수 있습니다.
    ## `geom_smooth()` using method = 'loess'
    ## `geom_smooth()` using method = 'loess'
    • aes() 내부에 linetype = drv argument를 사용하여 변수 drv 수준에 따라 smooth line을 다르게 하여 출력할 수도 있습니다.
    ggplot(data = mpg) + geom_smooth(mapping = aes(x = displ, y = hwy, colour = drv),
                                     show.legend = FALSE)
    ## `geom_smooth()` using method = 'loess'
    • 또한 show.legend = FALSE argument를 이용하여 범례 없이 출력할 수도 있습니다.
    ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy)) + 
      geom_smooth(mapping = aes(x = displ, y = hwy))
    ## `geom_smooth()` using method = 'loess'
    • 여러 기하학 객체 함수를 동시에 적용하여 위 그래프와 같이 산점도와 smooth line을 동시에 출력할 수도 있습니다.
    ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + geom_point(mapping = aes(colour = class)) + geom_smooth()
    ## `geom_smooth()` using method = 'loess'
    • ggplot() 객체 안에 aes() 함수를 이용하여 직접 축을 매핑할 수도 있습니다.
    ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
      geom_point(mapping = aes(colour = class)) + 
      geom_smooth(data = filter(mpg, class == "subcompact"), se = FALSE)
    ## `geom_smooth()` using method = 'loess'
    • 각 기하학적 객체에도 직접 데이터를 설정할 수 있습니다. 위 그래프는 geom_smooth() 객체 안에 직접 데이터프레임을 설정하되 dplyr 패키지 안에 있는 filter() 함수를 이용하여 mpg 데이터프레임에서 class 변수가 subcompact인 것들만을 가지고 smooth line을 그린 것 입니다.
    • geom_smooth() 안에 있는 se = FALSE 옵션은 추정된 smooth line의 표준오차를 출력하지 않음을 의미합니다.
  • ggplot(data = mpg) + geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))
  • ggplot(data = mpg) + geom_smooth(mapping = aes(x = displ, y = hwy))
  • ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy))
  • 이 밖에 다양한 기하학적 객체 함수 geom_은 R studio의 help 창을 참고하세요..!

2. 5. Statistical transformations

  • 다음으로는 막대형 차트(bar chart)를 살펴보겠습니다. 막대 그래프는 단순하면서 데이터의 미묘한 것을 드러냅니다.
  • 막대 그래프를 출력하는 기하학 함수는 geom_bar() 입니다.
  • 여기서 이용할 데이터는 diamonds 데이터 입니다.
    • diamonds 데이터프레임은 ggplot2 패키지 안에 내장되어 있는 데이터로 가격(price), 캐럿(carat), 색상(color), 선명도(clarity) 등 다양한 변수들이 포함되어 있습니다.
    ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut))
    • 여기서 x축만을 지정하였기 때문에 자동적으로 y축에는 x변수의 빈도(count)가 집계된 상태로 그래프가 출력됩니다.
  • 이와 비슷하게 stat_count() 함수를 이용하여 그래프를 출력해보면 다음과 같습니다.
  • ggplot(data = diamonds) + stat_count(mapping = aes(x = cut))
  • 별개로 y축을 지정할 때 ..prop..로 지정한다면 빈도가 아닌 비율로 출력됩니다.
  • ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
  • stat_summary() 함수를 이용하면 R에 기본적으로 내장되어 있는 summary() 함수와 같이 최소, 최대, 중앙값 등을 시각화할 수 있습니다.
  • ggplot(data = diamonds) + 
      stat_summary(mapping = aes(x = cut, y = depth),
                   fun.ymin = min,
                   fun.ymax = max,
                   fun.y = median)

2. 6. Position adjustments

  • 막대 그래프와 관련된 또 다른 함수가 있습니다.
  • colour 또는 fill argument를 aes() argument 안에 사용함으로써 차트에 색상을 집어넣고 변수의 수준에 따라 구분된 형태의 그래프를 출력할 수 있습니다.
  • ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut, fill = cut))
  • ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut, colour = cut))
  • 또한 fill argument에 제 2의 변수를 넣어 막대그래프에 2차원의 정보를 담을 수 있습니다.
    • 그래프에서 보이다시피 clarity 수준에 따라 각 빈도 값들이 차곡차곡 쌓아져 있는 형태를 볼 수가 있습니다.
    • 이러한 그래프 형태도 position argument를 이용하여 수정할 수 있습니다.
    • position = "identity(default), position = "dodge", position = "fill"
    ggplot(data = diamonds) + 
      geom_bar(mapping = aes(x = cut, fill = clarity), alpha = 0.2, position = "identity")
    • position = "fill" argument를 사용하면 비율로 보다 더 쉽게 파악할 수 있습니다.
    ggplot(data = diamonds) + 
      geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")
    • position = "dodge" argument를 사용하면 기본 디폴트 그래프보다 더 쉽게 비교할 수 있습니다.
  • ggplot(data = diamonds) + 
      geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")
  • ggplot(data = diamonds) + 
      geom_bar(mapping = aes(x = cut, colour = clarity), fill = NA, alpha = 0.2, position = "identity")
  • ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut, fill = clarity))

2. 7. Coordinate systems

  • coord_flip() 함수를 이용하여 좌표 축을 반전시킬 수 있습니다. 예시를 통해 살펴보겠습니다.
  • ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + geom_boxplot() + coord_flip()
  • ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + geom_boxplot()
  • coord_polar() 함수는 극좌표를 사용합니다. 극좌표는 막대 그래프와 Coxcomb chart(원형 그래프로 생각) 사이에 흥미로운 연결구조를 갖게 합니다.
  • ggplot(data = diamonds, mapping = aes(x = cut, fill = cut)) + 
      geom_bar(width = 1, show.legend = FALSE) + 
      theme(aspect.ratio = 1) + labs(x = NULL, y = NULL) +
      coord_polar()
  • ggplot(data = diamonds, mapping = aes(x = cut, fill = cut)) + 
      geom_bar(width = 1, show.legend = FALSE) + 
      theme(aspect.ratio = 1) + labs(x = NULL, y = NULL)

반응형

'Basic' 카테고리의 다른 글

[R] DescTools  (0) 2017.11.01
[R] apply 계열 함수  (0) 2017.10.06
[R] 문자열 처리  (0) 2017.07.12
[R] 추정 및 검정  (0) 2017.07.12
[R] 상관 분석  (0) 2017.07.07
TAGS.

Comments