1.7 통계적 변환
막대그래프 (Bar plot)
막대그래프는 플롯에 대해 미묘한 것을 드러내기 때문에 흥미로운 차트이다. 막대그래프는 geom_bar() 로 그릴 수 있다.
다음은 diamond 데이터셋에서 cut으로 그룹한 다이아몬드의 총 개수를 나타낸다. diamonds 데이터 셋은 54000여개의 다이몬드를 대상으로 크기(carat), 컷팅레벨(cut), 색(color), 투명도(clarity) 등이 조사되어 있다.
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))
위의 코드에서도 알 수 있듯이 y축에 count는 diamonds의 변수가 아니다. count는 데이터셋의 원 값으로 플롯을 그린다. 막대그래프와 같은 다른 그래프는 플롯으로 그릴 새로운 값을 계산한다.
- 막대그래프, 히스토그램, 빈도 다각형은 데이터를 빈(bin)계급으로 만든 후, 각 빈에 떨어지는 점들의 개수인 도수를 플롯한다.
- 평활 차트들은 데이터에 모델을 적합한 후 모델을 이용한 예측값을 플롯한다.
- 박스플롯은 분포의 robust한 요약값을 계산한 후 특수한 형태의 박스로 표시한다.
stat 인수의 기본값을 조사하면 한 지옴이 어떤 스탯을 사용하는지 알 수 있다. 예를 들어 ?geom_bar 를 하면 stat 이 "count"임을 보여준다. 이는 geom_bar() 가 stat_count() 를 사용한다는 의미이다.
또한 지옴과 스탯을 서로 바꿔서 사용할 수 있다. 예를 들어 이전 플롯을 geom_bar() 대신 stat_count() 를 사용하여 생성할 수 있다. 모든 지옴은 기본 스탯이 있고, 모든 스탯은기본 지옴이 있기때문에 가능하다.
ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut))
스탯을 사용하는 이유
- 기본 스탯을 덮어쓰고 싶을 수 있다.
다음의 코드에서 geom_bar() 의 스탯을 'count'에서 'identity'로 변경했다. 이렇게 하면 막대의 높이를 y변수의 원 값으로 매핑할 수 있다.
# library(dplyr)
demo <- tribble(
~cut, ~freq,
"Fair", 1610,
"Good", 4906,
"Very Good", 12082,
"Premium", 13791,
"Ideal", 21551)
ggplot(data = demo) +
geom_bar(mapping = aes(x = cut, y = freq), stat = "identity")
- 변환된 변수에서 심미성으로 기본 매핑을 덮어쓰고자 할 수 있다
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
- 코드에서 통계적 변환에 주의를 많이 집중시키고자 할 수 있다.
예를 들어 계산하는 요약값에 주의를 집중시키고자 고유한 x 값 각각에 대해 y 값을 요약하는 stat_summary() 를 사용할 수 있다.
ggplot(data = diamonds) +
stat_summary(
mapping = aes(x = cut, y = depth),
fun.ymin = min,
fun.ymax = max,
fun.y = median)
연습문제
1. stat_summary() 와 연관된 기본 지옴은 무엇인가? 스탯 함수 대신 이 지옴함수를 사용하여 어떻게 이전 플롯을 다시 생성하겠는가?
- geom_pointrange() 지옴으로, 스탯 함수와 같은 플롯을 그릴 수 있다.
ggplot(data = diamonds)+
geom_pointrange(
mapping = aes(x = cut, y = depth),
fun.min = min,
fun.max = max,
fun = median,
stat = "summary")
2. geom_col() 의 역할은 무엇인가? geom_bar() 와 어떻게 다른가?
- geom_bar()는 막대의 높이를 각 그룹의 케이스 수에 비례하도록 만든다.(또는 가중치의 합)
- geom_col()는 막대의 높이가 데이터의 값을 나타낸다.
# geom_bar
ggplot(data = diamonds)+
geom_bar(mapping = aes(x = cut))
#geom_col
ggplot(data = diamonds)+
geom_col(mapping = aes(x = cut, y = depth))
3. 대부분의 지옴과 스탯을 쌍을 이루어 거의 항상 함께 사용된다. 도움말을 읽고 모든 쌍의 목록을 만들어라. 공통점은 무엇인가?
geom | stat | geom | stat |
geom_bar() | stat_count() | geom_hex() | stat_hex() |
geom_bin2d() | stat_bin_2d() | geom_density_2d() | stat_density_2d() |
geom_sf() | stat_sf() | geom_density() | stat_density() |
geom_violin() | stat_violin() | geom_count() | stat_sum() |
geom_smooth() | stat_smooth() | geom_contour() | stat_contour() |
geom_quantile() | stat_quantile() | geom_boxplot() | stat_boxplot() |
geom_qq() | stat_qq() | geom_histogram() | stat_bin() |
geom_qq_line() | stat_qq_line() | geom_freqpoly() | stat_bin() |
default geom | stat | default geom | stat |
geom_step() | stat_ecdf() | geom_area() | stat_density() |
geom_path() | stat_ellipse() | geom_point() | stat_sum() |
geom_rect() | stat_sf() | geom_contour() | stat_countour() |
geom_violin() | stat_ydensity() | geom_boxplot() | stat_boxplot() |
geom_smooth() | stat_smooth() | geom_tile() | stat_bin_2d() |
geom_quantile() | stat_quantile() | geom_bar() | stat_count() |
geom_point() | stat_qq() | geom_point() | stat_unique() |
geom_path() | stat_qq_line() | geom_pointrange() | stat_summary() |
geom_bar() | stat_bin() | geom_pointrange() | stat_summary_bin() |
geom_hex() | stat_bin_hex() | geom_hex() | stat_summary_hex() |
geom_density_2d() | stat_density_2d() | geom_tile() | stat_summary_2d() |
geom_point() | stat_identity() | geom_path() | stat_function() |
4. stat_smooth() 는 어떤 변수를 계산하는가? 이 동작을 제어하는 파라미터들은 무엇인가?
- stat_smooth() 는 geom_smooth() 와 같은 그래프를 그려 과적합 여부를 판별하는데 도움을 준다. 이 두 함수는 동일한 기능을 하지만 비표준도형으로 결과를 출력할 경우stat_smooth() 를 사용한다.
5. 비율 막대 그래프에서 group = 1이라고 설정했어야 했다. 왜 그런가? (다음 두 그래프의 문제는 무엇인가?)
# plot 1
ggplot(data = diamonds)+
geom_bar(mapping = aes(x = cut, y = ..prop..))
# plot 2
ggplot(data = diamons)+
geom_bar(mapping = aes(x = cut, fill = color, y = ..prop..))
- 상대 빈도는 group 속성에 따라 계산을 하는데, 전체 데이터를 대상으로 상대 빈도를 구하기 위해 모든 데이터가 동일한 그룹이 되도록 group=1로 설정을 한다.
'Study > R' 카테고리의 다른 글
[R4DS] 1장 데이터 시각화 - 07 좌표계 (0) | 2022.01.10 |
---|---|
[R4DS] 1장 데이터 시각화 - 06 위치조정 (0) | 2022.01.10 |
[R4DS] 1장 데이터 시각화 - 04 기하객체 (0) | 2022.01.10 |
[R4DS] 1장 데이터 시각화 - 03 facet (0) | 2021.11.27 |
[R4DS] 1장 데이터 시각화 - 02 심미성 매핑 (0) | 2021.11.16 |