본문 바로가기
Data Science

범주형+연속형 변수, boxplot & violin 함수 활용

by Jacey312 2023. 12. 30.

geom_boxplot()geom_violin()은 둘 다 ggplot2 패키지에서 제공되는 함수로, 연속형 변수의 분포를 시각화하는 데 사용됩니다. 각각의 함수가 어떻게 동작하고 어떤 특징을 가지고 있는지 살펴보겠습니다.

 

geom_boxplot() 개요

geom_boxplot() 함수는 상자 수염 그림(Box-and-Whisker Plot)을 통해 연속형 변수 데이터의 중앙값, 사분위수(1사분위수, 3사분위수) 및 이상치(outlier)를 시각적으로 보여줍니다. 이런 특성을 통해 주로 데이터의 중심 경향과 데이터의 분포를 쉽게 파악할 수 있습니다.

 

예를 위해 ggplot2 패키지에 포함되어 있는 tips 데이터셋을 활용하도록 하겠습니다. tips 데이터셋 중 범주형 변수에 해당하는 day(요일)와 연속형 변수에 해당하는 tip(손님이 낸 팁의 금액)을 geom_boxplot()에 입력하여, 요일별 손님이 낸 팁의 금액이 어떻게 분포되어 있는지, 각 요일별 팁 금액의 중앙값 얼마나 다른지를 확인해보겠습니다.

 

아래 그림을 살펴보면, 각 요일마다 박스(Box)로 나타난 부분은 데이터의 중간 50%인 사분위수(1~3분위수)를 나타내고, 상자의 윗부분이 3사분위수(Q3), 아랫부분이 1사분위수(Q1)에 해당합니다. 박스 내부의 진한 수평 라인은 데이터의 중앙값(median)이며, 상자 위아래로 뻗어나가는 라인은 수염(whisker) 부분으로 데이터의 사분위수를 제외한 나머지 데이터인 이상치(outlier)의 범위를 나타냅니다.

 

ggplot(tips,aes(day,tip))+geom_boxplot()

요일별 손님이 낸 팁의 금액 box plot

 

대다수 손님들이 4 달러 이하의 팁을 낸 것을 확인할 수 있고, 튀는 값을 나타내는 데이터들이 토요일(Sat)에 집중되어 있는 것을 보았을 때 주말인 토요일에 거액의 팁을 내는 경향이 높은 것을 확인할 수 있습니다.

 

geom_violin() 개요

 

geom_violin() 함수는 바이올린 플롯(Violin Plot)을 생성하여, 데이터의 분포를 geom_boxplot() 함수보다 세부적으로 볼 수 있도록 그려줍니다. 이때 커널 밀도 추정을 사용하여 데이터의 밀도를 표현합니다. 즉, geom_violin() 함수가 geom_boxplot() 함수 보다 데이터가 어떻게 분포하는지를 더 자세히 나타내줍니다.

 

geom_boxplot() 에서 살펴보았던 tips 데이터셋 중 day(요일)와 tip(손님이 낸 팁의 금액)을 대상으로 violin plot을 그려보겠습니다. 아래 그림을 살펴보면, 각 요일마다 violin이 그려지고, 곡선 라인을 통해 데이터가 집중되어 있는 tip 부분은 폭이 넓게 나타나고, 데이터가 비교적 덜 집중되어 있는 tip 부분은 폭이 얇게 나타나는 것을 확인할 수 있습니다.

 

ggplot(tips,aes(day,tip))+geom_violin()

요일별 손님이 낸 팁의 금액 violin plot

 

목요일에는 비교적 적은 금액의 tip 부분에 데이터 분포가 높게 나타난 것을 확인할 수 있습니다. 이는 아마 주말에 속하는 금(Fri), 토(Sat), 일(Sun) 보다는 비즈니스 업무의 비중이 높아 그렇지 않을까 생각해봅니다. 

 

두 함수 동시에 적용하기

하지만 violin plot 만으로는 box plot에서 나타났던 중앙값이나 사분위수 데이터를 확인하기가 어려운 단점이 있고, box plot 만으로는 데이터의 비중을 확인하긱 어렵습니다. 이 두 가지 함수들의 특성을 모두 한 눈에 확인하기 위해서는 두 함수를 동시에 적용하는 것이 필요합니다.

 

일반적으로 두 함수를 동시에 적용하게 되면 두 그림의 폭이 비슷하기 때문에 violin plot 위에 box plot이 겹쳐져 그려져 밀도를 정확히 확인하기가 어렵거나 그 반대로 그려져 중앙값 등을 확인하기 어렵게 됩니다. 따라서 이 두 함수의 특성을 함께 살리면서 동시에 그려주기 위해서는 violin plot 위에 box plot을 겹쳐 그리되, box plot의 폭을 줄여주어 box plot이 violin plot을 완전히 덮지 않도록 해주어야 합니다.

 

아래 코드는 tips 데이터셋의 day와 tip 간 관계를 적절히 나타낼 수 있는 box plot 폭을 0.2로 설정한 것입니다. 이 box plot의 폭은 사용하시는 데이터의 성격마다 차이가 있을 수 있기 때문에 활용하시면서 조정하시는 것이 필요합니다.

 

ggplot(tips,aes(day,tip))+geom_violin()+geom_boxplot(width=0.2)

geom_violin() + geom_boxplot()