[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()
함수를 가지고 산점도를 출력한 결과는 다음과 같습니다.- 그림에서 보면
displ
과hwy
사이의 관계는 대략적으로 음의 관계를 보입니다. 즉 사이즈가 더 큰 엔진은 더 많은 연료를 사용함을 보여줍니다.
- 그림에서 보면
-
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
변수가 가지고 있는 수준에 따라 범례가 표시되고 산점도에 색깔이 부여됨을 확인할 수 있습니다.
- 여기서 말하는 aesthetic mapping은
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.