데이터과학 기초/R배우기

ggplot 쉽게 배우기 (3) - 밀도(density) 시각화와 수직선/수평선

eigenvector 2022. 7. 4. 21:53
반응형

밀도(Density) 시각화

이전 포스팅에서 히스토그램을 통해 연속된 데이터를 시각화 하는 방법과 제한을 설명했습니다.

 

히스토그램 대신 연속된 데이터의 분포를 확인하는 또 다른 방법은 밀도 시각화가 있습니다.

 

간단히 말하면, 울퉁불통한 히스토그램(빈도)을 부드러운 곡선(밀도)으로 변환하여 시각화 하는 것이 밀도 시각화 입니다.

(Density Plot을 정확히 번역하기 애매하군요)

 

이 과정에서 히스토그램 시각화의 빈도를 연속된 밀도로 바꿔주는 수학적 기법이 동원되는데요.

 

이를 커널 함수(kernel function)이라고 부르며, 가우시안(gaussian)을 기본값으로 설정합니다.

 

(데이터 과학에 관심이 있거나 관련 분야를 공부하신 분이라면 가우시안이라는 말이 익숙하실 겁니다. 혹은 전공에 따라 정규 분포라는 말이 더 익숙할 수 있겠군요)

 

어쨌튼, 오늘 공부할 내용은 시각화이기 때문에 다음과 같이 세팅하고 시작하겠습니다.

 

library(tidyverse)

 

 


밀도 함수의 기본 설정

밀도 함수의 경우 히스토그램과 달리 추가적으로 bins을 설정할 필요가 없습니다.

 

커널 함수로 가우시안이 기본값이 설정되어 있기 때문에, [데이터+배치] 이후 밀도 함수만 설정해도 자동으로 시각화가 됩니다.

 

기본적인 mpg 데이터셋으로 밀도 함수를  그려봅시다.

 

데이터 : mpg

배치 : displ (변수가 하나로 자동배치됩니다)

표현 : density

 

# 모든 설정값을 세부 지정할 경우
ggplot(data=mpg, mapping = aes(displ)) + geom_density(kernel = "gaussian")

# 가우시안이 기본값이기 때문에 아래처럼 적어도 됩니다
ggplot(data=mpg, mapping = aes(displ)) + geom_density()

# 이전에 배운 간략화 버전을 응용해 봅시다
ggplot(mpg, aes(displ)) + geom_density()

 

생각보다 쉽지요?

 

이제 디테일을 수정해 보겠습니다.


세부 디테일 지정하기 - 색과 선 스타일

밀도 시각화의 경우, ggplot 체계 안에 있기 때문에 앞서 배운 히스토그램의 세부 옵션을 공유합니다.

 

즉, 

 

색 - color

채우기 - fill

투명도 - alpha (0.7과 같이 전체 수를 입력하거나 .7만 써도 됩니다)

 

를 그대로 사용할 수 있습니다(더 많은 옵션은 ?geom_density 를 입력하면 확인 가능합니다)

 

ggplot(mpg, aes(displ)) + geom_density(color="black", fill="#7e42f5", alpha=.7)

# 간략화 버전
den <- ggplot(mpg, aes(displ))
den + geom_density(color="black", fill="#7e42f5", alpha=.7)

결과를 확인해 볼까요?

다만, 히스토그램의 경우 선 스타일을 사용하는 경우가 많으니 변수를 하나 더 추가해 봅시다.

 

색 - color

채우기 - fill

투명도 - alpha

선 스타일 - dashed(혹은 숫자로 2를 쓰기도 합니다)

 

ggplot(mpg, aes(displ)) + geom_density(color="black", fill="#7e42f5", alpha=.7, linetype="dashed")
  
# 더 간략화 + 번호 사용
den <- ggplot(mpg, aes(displ))
den + geom_density(color="black", fill="#7e42f5", alpha=.7, linetype=2)

 

선 스타일의 경우, 많이 사용하는 스타일로

 

0 - 없음(blank)

1 - 실선(solid)

2 - 대쉬선(dashed)

3 - 점선(dotted)

 

를 사용할 수 있으며, 더 많은 선은 ggplot 공식 문서를 확인하시면 될 것 같습니다.

 


ggplot에서 수직선/수평선 그리기

밀도 시각화의 경우, 통계에서 유의한 범위를 보여주는 방식으로 사용하는 경우가 많습니다.

 

흔히 p값으로 불리는 0.05 지점이나 특정 지점을 기준으로 차이를 보여주는 방식이죠.

 

ggplot에서는 이를 어떻게 표현할까요? 간단하게 기존 시각화에 +로 붙여주면 됩니다.

 

구체적으로 확인해 볼까요?

 

기존 시각화

데이터 : mpg

배치 : displ (변수가 하나로 자동배치됩니다)

표현 : density

 

추가 시각화

데이터 : mpg

배치 : 임의의 값(여기서는 5로 지정)

표현 : vline(vertical의 약자입니다)

 

ggplot(mpg, aes(displ)) + geom_density(color="black", fill="#7e42f5", alpha=.7, linetype='dotted') +
  geom_vline(aes(xintercept=5))
  
# 간략화
base<- ggplot(mpg, aes(displ))
base + geom_density(color="black", fill="#7e42f5", alpha=.7, linetype='dotted') +
  geom_vline(aes(xintercept=5))
 
# 더욱 간략화
base <- ggplot(mpg, aes(displ)) + geom_density(color="black", fill="#7e42f5", alpha=.7, linetype='dotted')
base + geom_vline(aes(xintercept=5))

 

geom_vline의 경우 ggplot의 객체이므로, 세부 속성을 공유합니다.

 

여기서는 수직선에 많이 사용되는 선 굵기(size)를 같이 넣어보도록 하겠습니다.

 

base <- ggplot(mpg, aes(displ)) + geom_density(color="black", fill="#7e42f5", alpha=.7, linetype='dotted')
base + geom_vline(aes(xintercept=5), color="red", linetype="dashed", size=1)

 

 

수평선은 비슷한 맥락에서 h(horizon)을 사용합니다.

 

base <- ggplot(mpg, aes(displ)) + geom_density(color="black", fill="#7e42f5", alpha=.7, linetype='dotted')
base + geom_hline(aes(yintercept=0.1), color="red", linetype="dashed", size=1)

 

 


정리

밀도 시각화는 히스토그램과 유사하게 분포를 확인하는 방식입니다.

 

커널 함수(보통은 가우시안)를 사용해서, 부드러운 곡선을 만드는 방식을 사용합니다.

 

추가로 붙여지는 세로선/가로선은 geom_vline, geom_hline 을 사용하며 기존 시각화에 +로 이어붙이면 됩니다.

 

이제 기초적인 접근 방식을 이해했으므로, 다음 시간에는 구체적인 디테일을 파고들겠습니다.

반응형