본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
ggplot2

데이터 밀집 구간 표현 - geom_rug(), ggMarginal()

by 아참형인간 2022. 7. 28.
rug.knit

사용데이터 : https://2stndard.tistory.com/68

geom_rug()


사실 산점도는 아무리 오버플로팅을 제거하려고 노력해도 산점도 자체가 가진 한계로 인해 완전히 제거하기란 매우 힘들다. 그래서 앞서 언급한 바와 같이 샘플수를 조절한다던지 투명도를 조절한다던지 하는 방법이 사용되지만 이로 충분치는 않다. 결국 중첩되어 표현된 부분에 얼마나 많은 데이터가 중첩되는지를 알아내는 방법이 필요한데 이를 위해 몇 가지 방법이 제시되고 있다.

이 중 하나가 러그 산점도이다.

러그(rug)는 ’바닥에 까는 발판’으로 X축과 Y축의 바닥에 막대를 표현함으로써 데이터의 밀도를 표현하는 방법이다. 안타깝게도 plotly에서는 러그를 사용해 데이터의 밀도를 표시하는 방법을 제공하지 않는다. 따라서 ggplot2geom_rug()를 사용하여 러그 산점도를 만들고 변환하는 방법을 사용할 수 있다.

일단 ‘df_취업률_2000’ 데이터프레임에서 산점도를 다음과 같이 그려보겠다.

df_취업률_2000 |>
  ggplot() +
  ## X축을 졸업자_계, Y축을 취업자_합계_계, color를 대계열로 매핑한 geom_point로 산점도 레이어 생성
  geom_point(aes(x = 졸업자수, y = 취업자수)) 

위의 산점도를 보면 좌측 하단에 데이터들이 모여있다보니 이 부분에 데이터들이 얼마나 분포되어 있는지 인지하기가 어렵다. 이를 해결하는 방법으로 앞서 설명한 러그 산점도를 사용하면 데이터 밀집 지역의 데이터 분포를 간접적으로 확인해 볼 수 있다.

러그 산점도는 X, Y축에 보조 플롯을 생성함으로써 X, Y축의 2차원 데카르트 좌표에 표현된 데이터를 보완하도록 설계된 보조 시각화 도구이다. 러그 산점도는 개별 사례를 표시하기 떄문에 비교적 적은 데이터 셋에 효과적으로 사용된다.

러그 산점도는 ggplot2geom_rug()를 통해 X, Y 축상에 러그 레이어를 추가하여 만든다. 다음은 X축에 러그 레이어를 추가하는 방법이다.

df_취업률_2000 |>
  ggplot() +
  ## X축을 졸업자_계, Y축을 취업자_합계_계, color를 대계열로 매핑한 geom_point로 산점도 레이어 생성
  geom_point(aes(x = 졸업자수, y = 취업자수)) + 
  ## X축을 졸업자_계, Y축을 취업자_합계_계, color를 대계열로 매핑한 geom_reg 레이처 추가
  geom_rug(aes(x = 졸업자수), col= "steelblue") +
  labs(title = '러그가 포함된 산점도')

위의 산점도를 보면 산점도로 표시되는 모든 데이터에 대해 X축에 매핑되는 졸업자수의 위치에 세로 막대를 포현함으로써 어느 부분에 데이터가 밀집하는 지를 알 수 있다.

이번에는 Y축에 대한 러그 레이어를 다음과 같이 그려볼 수 있다.

df_취업률_2000 |>
  ggplot() +
  ## X축을 졸업자_계, Y축을 취업자_합계_계, color를 대계열로 매핑한 geom_point로 산점도 레이어 생성
  geom_point(aes(x = 졸업자수, y = 취업자수)) + 
  ## X축을 졸업자_계, Y축을 취업자_합계_계, color를 대계열로 매핑한 geom_reg 레이처 추가
  geom_rug(aes(y = 취업자수), col= "steelblue") +
  labs(title = '러그가 포함된 산점도')

X, Y 축에 모두 러그 레이어가 포함된 산점도는 다음과 같다.

df_취업률_2000 |>
  ggplot() +
  ## X축을 졸업자_계, Y축을 취업자_합계_계, color를 대계열로 매핑한 geom_point로 산점도 레이어 생성
  geom_point(aes(x = 졸업자수, y = 취업자수)) + 
  ## X축을 졸업자_계, Y축을 취업자_합계_계, color를 대계열로 매핑한 geom_reg 레이처 추가
  geom_rug(aes(x = 졸업자수, y = 취업자수), col= "steelblue") +
  labs(title = '러그가 포함된 산점도')

geom_marginal()

위에서 언급한 바와 같이 geom_rug()는 비교적 사례 수가 적은 경우 효과적으로 활용된다. 하지만 앞서와 같이 데이터가 많은 경우는 그 효과성이 매우 떨어진다. 이러한 경우 많이 밀도함수 그래프나 박스 플롯으로 표현하면 geom_rug()보다 효율적으로 데이터의 밀집도를 표현할 수 있다.

이렇게 데이터가 밀집된 구간을 밀도함수 그래프라 박스 플롯을 사용하여 확인할 수 있는 또 하나의 방법이 가장자리(Marginal) 플롯이다. 가장자리 플롯은 X축과 Y축의 가장자리에 히스토그램, 밀도 분포 플롯, 다음 절에서 설명할 박스플롯 등을 표현함으로서 전체 분포를 상관과 같이 보여준다.

이 가장자리 플롯은 ggplot2에서 직접적으로 사용하지는 못하고 ggExtra 패키지를 통해 사용할 수 있다. ggExtra 패키지는 ggplot2의 기능적 향상을 위해 개발된 패키지로 이 패키지의 가장 주된 기능은 ggMarginal이다. ggMarginalggplot2 산점도의 X축과 Y축의 가장자리에 히스토그램, 박스플롯, 밀도 플롯을 추가시키는 함수이다.

다음은 ggExtra 패키지의 ggMarginal()을 사용할 떄 조심해야 하는 것이 ggMarginal()geom_*()과 같이 + 기호를 사용하여 레이어를 추가하는 방식이 아닌 독립적 함수로 사용된다. 따라서 ggMarginal()를 사용하기 위해서는 먼저 가장자리 플롯을 만들어야 할 ggplot2 객체를 특정 변수에 저장해야한다. 이 ggplot2 객체를 매개변수로 사용하여 ggMarginal()의 첫 번째 매개변수로 주고 x, y 축에 매핑할 변수를 지정하고, type으로 해당 변수의 밀도를 표현할 방식을 지정하면 가장자리 플롯이 생성된다.

### ggExtra 패키지 설치
if(!require('ggExtra')) {
  install.packages('ggExtra')
  library(ggExtra)
}

## 산점도 생성
p_marginal <- df_취업률_2000 |>
  ggplot() +
  geom_point(aes(x = 졸업자수, y = 취업자수)) + 
  labs(x = '졸업자', y = '취업자')

##  가장자리 플롯으로 히스토그램을 추가
ggMarginal(p_marginal, x = 졸업자수, y = 취업자수, type = 'histogram')

##  가장자리 플롯으로 밀도함수 플롯을 추가
ggMarginal(p_marginal, x = 졸업자수, y = 취업자수, type = 'density')

##  가장자리 플롯으로 박스 플롯을 추가
ggMarginal(p_marginal, x = 졸업자수, y = 취업자수, type = 'boxplot')

댓글