시각화/R

▶R의 데이터시각화 패키지 :: ggplot2 ①

비주얼라이즈 2015. 2. 14. 04:56


▶R의 데이터시각화 패키지 :: ggplot2 



ggplot2는 R의 그래픽패키지이다. 《R로 만드는 데이터시각화》의 저자인 전희원씨도 ggplot을 자주 활용하고 있고,  Oreilly에서 펴낸 R Graphics Cookbook》에는 ggplot2에 대한 내용이 따로 한 챕터를 구성하고 있을 만큼, R에서 시각화를 다룰때 있어서 보편적으로 많이 다루고 있는 패키지라고 할 수 있다.



ggplot패키지를 개발한 것은 해들리위캠(Hadley Wichkam)교수이다. 한 특강에서 듣기로, R은 해들리위캠의 ggplot이 만들어지기 '이전'과 '이후'로 나눠질정도라고한다. 




ggplot2이란?





이 ggplot2패키지의 문법은 데이터기반으로 기하학적 객체들(점, 선, 막대 등)에 미적 특성(색상, 모양,크기)를 매핑하여 적용 후 즉시 화면창으로 통해 결과를 확인할 수 있도록 해준다. 또한 ggplot2의 이러한 데이터기반 그래픽생성기능은 단순히 기본적인 그래프를그리는 것에 그치지않고 통계 변환을 포함할 수 있다.












ggplot2의 기본 :  qplot()


qplot()은 ggplot2패키지의 다양한 그래픽함수중에 '기본'이라고 할 수 있는 함수이다. qplot()의 방식은 앞서 살펴보았던 R의 기본 그래픽시스템의 plot()함수와 매우 비슷하다.



qplot()에서 플롯은 aesthetics(크기, 모양, 색상)과 geoms(점, 선 등)으로 구성된다.



***

ggplot2패키지를 사용하면서 한가지 숙지해야하는 점이 있다. 우리가 플로팅을 할때 ggplot패키지는 데이터프레임에서 데이터를 불러온다. 만약 데이터프레임을 구성하지 않았다면, plot또는qplot들의 기능들은 작업공간에서 필요한 데이털를 찾기 시작할 것이다. 따라서, 우리는 ggplot의 그래픽을 활용하기 전에 데이터형식을 데이터프레임 형태로 만들어 놓는 약간의 노력을 해볼 필요가 있다.



Factor의 중요성


Factor()는 매우 중요하다. 번역서에서 '요인'이라고 번역하고있는 바로 그것이다. 이것은 데이터프레임에서 '부분집합'을 의미한다. 개발자라면 factor나 요인이라는 말을 지겹게 들었겠지만, 비 개발자라면 용어부터가 매우 당혹스러울 것이다. 당혹스럽더라도 아래에 나온 요인에 대한 내용을 정독하고넘어가자. 완벽하게 이해하지않아도 된다. (아마 이해할 필요를 스스로 느끼게 된다.)



R에서의 '요인(factor)'에 대한 보다 자세한 이야기


R에는 두 종류의 요인이 있다. 


바로 순서가 있는 요인과 일반 요인이다. 두 가지 종류 모두 수준들을 어떤 순서로든 정렬은 된다. 단지 차이점은 순서가 있는 요인에서는 순서에 의미가 있지만, 일반 요인에서는 임의로 부여된다는 것이다. 일반 요인의 순서는 데이터가어떻게 저장되는지만 바영한다. 데이터를그래프로 그릴 경우, 순서가 있는요인과 일반 요인의 구분은 대개 무의미하며, 동일하게 취급된다.


요인 수준의 순서는 그래픽 출력에 영향을 미친다.


요인 변수를 ggplot2에서 에스테틱 속성에 대입하면, 이 에스테텍은 해당 요인의수준들 순서를 차용한다. 만약 어떤 요인을 x축에 대입했다면 축 위의 눈금 표시들은 요인 수준들의 순서에 맞게 나타나며, 색상에 대입하면 범례에 있는 항목들의 순서가 해당 요인의 수준 순서를 가져다 쓰게 된다.


[자료 : 윈스터챙 지음, 이제원 옮김, "R Graphics Cookbook", 인사이트, 2013.9, p.329]




실제 R에서 요인(Factor)는 어떻게 나타나는지 살펴보자. 먼저 ggplot라이브러리를 로드하고, str()함수로 mpg데이터의 속성을 들여다보면 볼 수 있다.





ggplot2::qplot()




library(ggplot2)
str(mpg)
## 'data.frame':    234 obs. of  11 variables:
##  $ manufacturer: Factor w/ 15 levels "audi","chevrolet",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ model       : Factor w/ 38 levels "4runner 4wd",..: 2 2 2 2 2 2 2 3 3 3 ...
##  $ displ       : num  1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int  1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int  4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : Factor w/ 10 levels "auto(av)","auto(l3)",..: 4 9 10 1 4 9 1 9 4 10 ...
##  $ drv         : Factor w/ 3 levels "4","f","r": 2 2 2 2 2 2 2 1 1 1 ...
##  $ cty         : int  18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int  29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : Factor w/ 5 levels "c","d","e","p",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ class       : Factor w/ 7 levels "2seater","compact",..: 2 2 2 2 2 2 2 2 2 2 ...

ggplot2패키지를 로드한 후, str()함수로 mpg데이터의 속성을 확인한다. #ggplot2패키지가없다면 install.packages(“ggplot2”)를 입력해 설치해준다.



qplot(displ, hwy, data = mpg)

plot of chunk unnamed-chunk-2

mpg의 데이터를 사용했고, 앞서 str()함수로 살펴보았겠지만, 'displ'은 엔진의 사이즈를 의미하고, 'hwy'는 highway mileage의 약어로 '고속도로 주행'이라는 뜻이다.



ggplot2::qplot() 색상차원 추가하기






library(ggplot2)
qplot(displ, hwy, data = mpg, color = drv)

plot of chunk unnamed-chunk-1

앞서서는 x축과 y축에 변수 2개를 입력하여 점으로 표시하는데 그쳤지만, 여기서는 색상이라는 새로운 차원에 'DRV'변수를 입력했다.


front-wheel drive cars : 전륜구동차량(green)

rear-wheel drive cars : 후륜구동차량(blue)

four-wheel drive cars : 사륜구동차량(red)






ggplot2::qplot():: 히스토그램(histogram)


여기서에는 mpg 데이터에서 'hwy'라는 하나의 변수만을 가지고 히스토그램을 그리되, 색상설정을 'drv'라는 변수를 입력함으로써 각그룹별 히스토그램의 분포를 하나의 그래프에서 확인할 수 있는 그래프를 만들어본다.




library(ggplot2)
qplot(hwy, data = mpg, fill = drv)

plot of chunk unnamed-chunk-1

된다.



ggplot2::qplot() Facets 활용하기


Facets은 래티스(Lattice)패키지의 panels와 비슷하다.



library(ggplot2)
qplot(displ, hwy, data = mpg, facets = . ~ drv)

plot of chunk unnamed-chunk-1







qplot(hwy, data = mpg, facets = . ~ drv, binwidth = 2)

plot of chunk unnamed-chunk-1











qplot(hwy, data = mpg, facets = drv ~ ., binwidth = 2)

plot of chunk unnamed-chunk-1



Facet을 이용해 데이터셋에서 특정 부분집합만 취합해서 나타낼 수 있다. 이것은 Factor변수에 의해서 그려지는것이다.

물론 앞선 예제코드에서 색상을 활용하여 3가지 그룹(front, rear, four)에 대한 데이터를 볼 수 있었지만, 이 경우 그래프에 점이 겹치는 경우에 대해서는 고려하기 힘들다. 물론 알파값을 적용해볼 수 있지만, 이경우에도 데이터가 많아지는 경우에는 여러가지 어려움이있다. 이러한 경우에 사용할 수 있는 것이 facet이다. 그룹별로 그래프를 한화면에서 비교해볼 수 있으며, 이 경우에도 그래프의 형태변경이 가능하다.