앞서 데이터의 분포에 대해서 잠시 알아봤습니다. 데이터의 분포는 매우 중요한 특징을 보여줍니다. 예를 들어 제가 주로 다루는 의료 관련 데이터에서는 체중, 키, 체질량지수(BMI) 등 여러 기본 데이터가 있고 이것만으로도 비만이나 저체중 같은 여러 가지 정보를 알아낼 수 있습니다.
하지만 동시에 이것만으로는 데이터의 정확한 특징을 파악하고 있습니다. 예를 들어 남자인지 여자인지, 성인인지 소아인지, 아시아인인지 백인인지 등에 대한 정보가 추가로 포함되어야 체중, 키, 체질량 지수 등의 데이터가 정상 범위에 속하는지 아니면 비만이 많은 인구 집단인지 파악할 수 있을 것입니다.
다루고자하는 데이터의 종류에 따라 다르겠지만, 요즘 등장하는 데이터들은 데이터 수집 기술의 발전과 IT 기술의 발전으로 인해서 점차 그 종류가 자세해지고 관측치의 크기도 커지고 있습니다. 하지만 처음부터 복잡하고 큰 데이터를 다루는 것보다는 단순한 데이터로 설명을 하는 것이 좋을 것 같습니다.
지금까지 ggplot2 패키지의 다이아몬드 데이터에서 캐럿에 대한 정보만 봤지만, 이것만이 다이아몬드의 가격을 결정하는 요소는 아닐 것입니다. 여기서 이 데이터를 통해서 우리가 알고 싶은 것이 다이아몬드의 가격이라고 가정하고 여기에서 다이아몬드 컷 (cut) 에 대한 정보를 추가로 확인해 보겠습니다.
앞서 다이아몬드 컷은 다섯 등급으로 나뉘어진다는 점을 확인했습니다.
> table(cut)
cut
Fair Good Very Good Premium Ideal
1610 4906 12082 13791 21551
이제 각 등급별 다이아몬드 캐럿 분포를 알아보겠습니다. 우선 다시 ggplot2 패키지를 불러들이고 Fair 등급의 다이아몬드의 캐럿의 분포를 확인하겠습니다. 이 경우 히스토그램보다는 밀도 곡선(density curve)가 더 좋은 선택입니다. 여러 개가 겹쳐도 확인이 쉽기 때문입니다.
> d=density(diamonds$carat[diamonds$cut=="Fair"],na.rm=TRUE)
> plot(d,"Density Plot of Diamonds carat",col="red",lty=1)
> rug(diamonds$carat)
여기서 Fair 등급의 다이아몬드만 확인하기 위해서 추가한 부분은 사실 하나 뿐입니다. diamonds$carat[diamonds$cut=="Fair"] 이죠. R에서는 다른 설명 없이도 [] 안에 들어간 조건을 선택해 줍니다. 주의할 점은 carat 뒤에 점을 찍지 않아야 한다는 점과 Fair 처럼 숫자형이 아닌 문자형/범주형 분류는 ""안에 넣어야 한다는 점입니다.
이제 여기에 Good 등급도 같이 추가해 보겠습니다. 사실 한줄만 추가해주면 알아서 겹친 그림을 보여주지만 색상과 실선을 달리해야 알아보기 쉽겠죠. 여기서 약간 복잡해집니다.
d1=density(diamonds$carat[diamonds$cut=="Fair"],na.rm=TRUE)
d2=density(diamonds$carat[diamonds$cut=="Good"],na.rm=TRUE)
plot(d1,"Density Plot of Diamonds carat (Fair and Good)",col="red",lty=1)
lines(d2,col="blue",lty=2)
일단 두 개의 밀도 곡선을 그려야 하니 d1, d2 두 가지를 표시해 줍니다. 여기까지는 별 어려움이 없습니다. 그 다음 plot 함수를 이용해서 실제 곡선을 그려야 하는데, 동시에 두 개를 그릴 수 없으므로 일단 d1 하나만 그리고 제목, 색상, 실선 종류를 정했습니다. 이후 lines 함수를 이용해서 d2 곡선의 색상과 실선 종류를 선택한 것입니다. 플롯 함수를 두 번 사용하지 않는 것은 하나의 창에 두 개의 곡선을 그리기 위한 것이죠.
흥미롭게도 다이아몬드 등급에 따른 캐럿의 분포는 약간 차이가 있는 것 같습니다. 이런 차이가 어디에서 비롯되는 것인지는 모르겠지만, 등급이 높은 다이아몬드는 작은 캐럿이라도 버리지 않고 활용하는 것이 아닐까 하는 생각도 드네요. 계속해서 데이터를 살펴보겠습니다. 그런데 그 전에 각 곡선에 대한 설명이 없는 만큼 범례(legend)를 추가하겠습니다. legend 함수를 사용해서 범례를 표시합니다.
d1=density(diamonds$carat[diamonds$cut=="Fair"],na.rm=TRUE)
d2=density(diamonds$carat[diamonds$cut=="Good"],na.rm=TRUE)
plot(d1,"Density Plot of Diamonds carat (Fair and Good)",col="red",lty=1)
lines(d2,col="blue",lty=2)
legend("topright",legend=c("Fair","Good"),col=c("red","blue"),lty=1:2)
legend 함수 뒤에 위치(topright), 범례의 내용 (legend=c("Fair","Good")), 그리고 색상과 선의 종류 (col=c("red","blue"),lty=1:2) 표시하면 됩니다. 이제 줄의 숫자를 늘려서 Very Good 도 같이 표시해 봅시다.
d1=density(diamonds$carat[diamonds$cut=="Fair"],na.rm=TRUE)
d2=density(diamonds$carat[diamonds$cut=="Good"],na.rm=TRUE)
d3=density(diamonds$carat[diamonds$cut=="Very Good"],na.rm=TRUE)
plot(d1,"Density Plot of Diamonds carat (Fair and Good)",col="red",lty=1)
lines(d2,col="blue",lty=2)
lines(d3,col="salmon",lty=3)
legend("topright",legend=c("Fair","Good","Very Good"),col=c("red","blue","salmon"),lty=1:3)
약간 모양이 비슷하네요. (참고로 모든 사진은 클릭하면 원본을 볼 수 있습니다. 네이버에서는 작게 나오네요) 그러면 다 표시해 보겠습니다.
d1=density(diamonds$carat[diamonds$cut=="Fair"],na.rm=TRUE)
d2=density(diamonds$carat[diamonds$cut=="Good"],na.rm=TRUE)
d3=density(diamonds$carat[diamonds$cut=="Very Good"],na.rm=TRUE)
d4=density(diamonds$carat[diamonds$cut=="Premium"],na.rm=TRUE)
d4=density(diamonds$carat[diamonds$cut=="Ideal"],na.rm=TRUE)
plot(d1,"Density Plot of Diamonds carat",col="red",lty=1)
lines(d2,col="blue",lty=2)
lines(d3,col="salmon",lty=3)
lines(d4,col="black",lty=4)
lines(d4,col="green",lty=5)
legend("topright",legend=c("Fair","Good","Very Good","Premium","Ideal"),col=c("red","blue","salmon","black","green"),lty=1:5)
이걸 보면 캐럿이 작더라도 컷이 좋으면 가치가 있는지 작은 캐럿에서 컷 등급이 높은 다이아몬드가 점점 높아지는 경향이 있습니다. (잘 안보이시면 클릭해서 확대하시면 됩니다) 맞는지는 모르겠지만, 이렇게 데이터 탐색은 가격을 높이는 인과 관계를 추론할 수 있는 정보를 제공합니다. 위의 코드는 길어 보이지만, 사실 내용은 단순합니다.
다음에는 박스 플롯에 대해서 알아보겠습니다.
댓글
댓글 쓰기