박스 플롯 (boxplot) 은 히스토그램이나 밀도 곡선에 비해서 직관적이지는 않지만, 데이터 분포의 특징과 평균에서 벗어난 정도를 쉽게 알 수 있는 그래프를 제공합니다. 이를 확인하는 함수는 boxplot()입니다.
library("ggplot2")
boxplot(diamonds$carat)
그런데 이것만으로는 어떤 의미인지 알기 어렵습니다. 그 의미를 알 수 있도록 표시를 해보겠습니다.
boxplot(diamonds$carat,col="red")
text(0.7,median(diamonds$carat,na.rm=T),"median")
text(0.7,quantile(diamonds$carat,na.rm=T)[2],"Q1")
text(0.7,quantile(diamonds$carat,na.rm=T)[4],"Q3")
text(0.7,fivenum(diamonds$carat,na.rm=T)[2]-1.5*IQR(diamonds$carat,na.rm=T),"(1)Q1-1.5*IQR")
text(0.7,fivenum(diamonds$carat,na.rm=T)[4]+1.5*IQR(diamonds$carat,na.rm=T),"(2)Q3+1.5*IQR")
여기서 표시한 것은 중앙값 (median), 사분위값 가운데 각각 1/4, 3/4에 해당하는 Q1, Q3 값입니다. 여기에 더해서 사분범위 (IQR: Interquartile range)에서 크게 벗어난 값을 아래 위로 막대로 표시하는데 이것이 Q3+1.5xIQR과 Q1-1.5xIQR 값입니다. 이는 이상치(outlier)를 의미하는 것으로 볼 수 있습니다.
그런데 아래에 있어야 할 Q1-1.5xIQR 표시가 짤렸습니다. 이는 Y 축이 짧기 때문입니다. Y 축을 늘리는 방법은 ylim 함수를 사용하는 것입니다. (같은 이치로 x 축 범위를 조절하기 위해서는 xlim 함수를 사용합니다.)
boxplot(diamonds$carat,col="red",ylim=c(-1,6))
text(0.7,median(diamonds$carat,na.rm=T),"median")
text(0.7,quantile(diamonds$carat,na.rm=T)[2],"Q1")
text(0.7,quantile(diamonds$carat,na.rm=T)[4],"Q3")
text(0.7,fivenum(diamonds$carat,na.rm=T)[2]-1.5*IQR(diamonds$carat,na.rm=T),"(1)Q1-1.5*IQR")
text(0.7,fivenum(diamonds$carat,na.rm=T)[4]+1.5*IQR(diamonds$carat,na.rm=T),"(2)Q3+1.5*IQR")
박스 플롯의 진가는 사실 하나의 값을 비교하는 것보다 여러 개의 값을 비교할 때 나타납니다. 컷 등급에 따른 가격이 차이를 보기 위해서 다음과 같은 박스 플롯을 그려봅니다.
boxplot(price~cut, data=diamonds)
흥미로운 점은 가격이 컷 등급이 높아질수록 평균적으로 높아지지 않는다는 것입니다. 이것은 아마도 컷 등급이 높은 다이아몬드의 크기가 작기 때문으로 보입니다. 이제 이 박스플롯을 좀더 예쁘게 그려보겠습니다.
박스의 모양을 변형하기 위해 notch = T를 추가하고 색상을 붙여보겠습니다. 그리고 막대 밖에 존재하는 이상치를 없애기 위해 outline=FALSE를 선택합니다.
boxplot(price~cut, notch=T, col="yellow", outline=FALSE, data=diamonds)
아까보다 보기 좋은 그래프가 나왔습니다. 각 그룹별로 비교도 가능해졌습니다. 이런 박스 플롯은 논문 등에서 실제로 널리 사용되므로 나중에 더 상세하게 다룰 기회가 있을 것 같습니다.
다음에는 plot 함수를 이용해서 변수들의 상관관계를 알아보겠습니다.
댓글
댓글 쓰기