앞서 간단한 히스토그램을 통해서 데이터의 분포를 살펴봤습니다. 이렇게 데이터의 특성을 살펴보는 것을 탐색적 자료 분석(EDA. exploratory data analysis)라고 하는데, 깊이 들어가면 역시 어렵지만, 히스토그램이나 앞으로 소개할 그래프를 통해서 자료의 특징을 알아보는 것은 그다지 어렵지 않을 것입니다.
일단 데이터 분석을 위해서는 데이터의 분포화 특징을 알아내는 것이 중요합니다. 이전에 소개한 평균, 중앙값, 최소값, 최대값 등도 기본적인 정보를 주지만 더 상세한 분포를 알기 위해서 그래프를 그려보는 것이 도움이 될 수 있습니다. 히스토그램은 가장 기본적인 방식이긴 하지만, 이외에도 여러 가지 형태로 그래프를 나타낼 수 있습니다. 이번에는 density curve에 대해서 설명하려고 합니다.
그전에 앞서 설명을 하지 않았는데, 만약 R 스튜디오를 사용하지 않는 경우 R 콘솔 화면에서 원하는 크기의 그래픽 창을 띄우는 방법을 설명하겠습니다. 사실 R 스튜디오를 사용하는 경우에도 동일하게 사용이 가능합니다. 그래픽 창을 띄우는 기본 함수는 windows 입니다.
windows(width = 12, height = 10) 식으로 표시하면 되는데, 너비와 높이는 인치 단위라는 점을 참조하시기 바랍니다. 앞서 설명한 히스토그램을 표시해 보겠습니다. 데이터는 역시 diamonds 데이터입니다.
library("ggplot2")
windows(width = 12, height = 10)
hist(diamonds$carat, col="red", main="Distribution of diamonds (Carat)", xlab=expression(Carat), breaks=50)
위의 크기대로 하면 꽤 큰 그래프가 나올 것입니다. 그래프의 크기는 width와 height 옵션으로 다양하게 조절할 수 있으니 참조하시기 바랍니다. density는 연속함수의 분포를 볼 때 유용한 함수로 사실 히스토그램의 구간을 매우 작게 나누면 거의 비슷한 모양을 얻을 수 있습니다.
d=density(diamonds$carat,na.rm=TRUE)
plot(d)
rug(diamonds$carat)
여기서 문법을 간단히 설명하면 우선 d=density()를 통해서 그리고 싶은 변수를 지정했습니다. na.rm=TRUE는 결측치가 있는 경우 에러가 나기 때문에 넣은 것으로 결측치는 빼고 그래프를 그리라는 것을 의미합니다. 그런데 이렇게만 그림을 그리는 것이 아니라 그림을 그리라는 명령을 plot(d)로 한다는 점을 기억해야 합니다. 그리고 마지막으로 rug()안에 함수를 넣어주면 아래 부분에 관측값들의 분포에 대한 표시를 같이 해주게 됩니다. 이렇게 줄을 추가하는 방식으로 그래프를 더 상세하게 그려나가게 됩니다.
그런데 이렇게 그림을 그리니 상당히 심심합니다. 색칠도 해보고 크기도 바꿔봅시다. 그리고 그림에 제목도 붙여보겠습니다.
d=density(diamonds$carat,na.rm=TRUE)
plot(d,"Density Plot of Diamonds carat",col="red",lty=5)
rug(diamonds$carat)
여기서 제목은 ""에 표시하고 색상은col="" 에 표시합니다. lty는 점선의 종류를 지정하는 것입니다. 지정하지 않으면 기본 실선으로 나오게 됩니다. 앞으로 이렇게 점선을 표시하는 방법을 비롯해서 여러 가지 그래프 표시법에 대한 이야기를 하게 될 것입니다. 다만 옵션에 대한 설명은 여기서 다 하기는 어렵고 간단하게 몇 가지만 설명하고 넘어가겠습니다.
그런데 사실 이 두 그래프는 섞어서 그릴수도 있습니다. 새로운 줄을 추가하면 R이 알아서 덧붙여 그림을 그리게 됩니다. 이와 같은 문법은 다른 프로그래밍 언어에서도 쉽게 볼 수 있다고 하네요.
hist(diamonds$carat, col="red", main="Distribution of diamonds (Carat)", xlab=expression(Carat), breaks=100)
rug(diamonds$carat)
lines(density(diamonds$carat,na.rm=TRUE),col="blue",lwd=2)
이렇게 세줄의 명령어로 히스토그램, rug plot, density curve를 모두 그릴 수 있습니다. 그런데 그리고 보니 뭔가 이상합니다.
파란색으로 표시된 density curve가 바닥에 붙어있습니다. 이유는 기본적으로 확률밀도함수로써 그래프 아래 면적을 합치면 1이 되기 때문이죠. 따라서 이 곡선의 높이는 커봐야 1 을 조금 넘는 수준입니다. 당연히 빈도수는 수천개씩 되는 알아보기 어렵죠. 이 때는 freq=FALSE 명령어로 제대로 표시할 수 있습니다. 여기에 점선의 종류를 표시하는 내용을 포함해서 그려봅니다.
hist(diamonds$carat, col="red", freq=FALSE, main="Distribution of diamonds (Carat)", xlab=expression(Carat), breaks=100)
rug(diamonds$carat)
lines(density(diamonds$carat,na.rm=TRUE),col="blue",lwd=2,lty=10)
조금 더 그럴 듯한 그래프가 나왔습니다. 이렇게 데이터 분포를 보면 다이아몬드의 캐럿과 분포 숫자가 크게 봤을 때는 역비례 (작을 수록 숫자는 많음) 관계임을 알 수 있습니다. 하지만 그렇다고 해서 연속변수로 반비례 관계가 있는 것이 아니라 일부 특정 크기에 몰린 독특한 분포를 하고 있다는 것을 알 수 있습니다. 저는 다이아몬드 관련 일을 안해서 왜 그런지 모르겠지만, 이와 같은 분포는 데이터의 중요한 특성이 됩니다.
예를 들어 전체 인구에서 나이에 따른 키의 분포를 살펴보면 나이가 먹을수록 증가하지만, 모두 균등하게 증가하는 것이 아니라 특정 시기에 증가가 집중된다는 것을 알 수 있을 것입니다. 그리고 어느 시기가 오면 키의 성장이 멈추고 일정 수준을 유지하다 노년기에는 일부 감소한다는 점을 알 수 있을 것입니다. 이는 인간의 성장 패턴이라는 중요한 단서를 제공하는 것이죠.
다음에는 각 분류별 데이터를 분리해서 표시하는 것을 연습해 보겠습니다.
댓글
댓글 쓰기