Translate

2017년 4월 3일 월요일

연속형 변수를 범주형으로 바꾸기 (2)



 앞서 포스트에서 임의의 조건으로 그룹을 나누고 이를 원하는 순서대로 박스 플롯으로 그려보는 예제를 연습했습니다. 여기에서 조금 더 응용해서 균등하게 그룹을 나누는 방법을 이야기해 보겠습니다. 이를 위해서 임의의 연속 변수를 크기에 따라 K 개로 균등하게 나누는 함수 mygroup을 만들어 볼 것입니다. 


mygroup<-function k="4){</span" y="">
  count=length(y)
  z=rank(y,ties.method = "min")
  return(floor((z-1)/(count/k))+1)
}

 함수 이름은 원하는데로 적으면 됩니다. mygroup()을 이용해서 다이아몬드를 가격에 따라 4개의 그룹으로 나누겠습니다. 


 library("ggplot2")
 diamonds$price1<-mygroup diamonds="" price="" span="">
 table(diamonds$price1)

    1     2     3     4 
13490 13495 13470 13485 


 가격이 같은 관측치 때문에 일부 값이 겹치지만, 균등하게 네 그룹으로 나눠진 것을 볼 수 있습니다. 이를 이용해서 가격에 따른 크기(캐럿)의 차이를 박스 플롯으로 그려보겠습니다. 


boxplot(carat~price1, outline=FALSE, data=diamonds)



 참고로 그림에서 보듯이 그룹의 이름은 1,2,3,4로 정해집니다. 만약 이름을 바꾸고 순서대로 정렬하고 싶으면 각각의 이름을 지정해 줘야 합니다. 그리고 순서대로 정렬합니다. 


diamonds$price2[diamonds$price1==1]="low"
diamonds$price2[diamonds$price1==2]="middle"
diamonds$price2[diamonds$price1==3]="high"
diamonds$price2[diamonds$price1==4]="very high"
diamonds$price2=factor(diamonds$price2, levels=c("low","middle","high","very high"))
boxplot(carat~price2, outline=FALSE, data=diamonds)




 참고로 4그룹이 아니라 3그룹이나 5그룹으로 바꾸고 싶으면 mygroup(..., 5) 등으로 변경하면 됩니다. 


diamonds$price1<-mygroup diamonds="" price="" span="">
boxplot(carat~price1, outline=FALSE, data=diamonds)



 마지막으로 X 축과 Y 축에 각각 설명을 넣어보겠습니다. 


boxplot(carat~price2, outline=FALSE, data=diamonds)
axis(side=2,)
axis(side=1,at=c(1:4),labels=levels(diamonds$price2))
mtext("diamonds price group",side=1, line=2.2)
mtext("carat",side=2, line=2.2)




 참고로 오히려 주변에 장식이나 설명을 넣는 것은 차라리 파워포인트를 사용하는 것이 더 간편할수도 있습니다. R이 좋은 도구이긴 하지만 반드시 R만 고집할 이유가 없다는 점도 같이 생각해야 할 것 같습니다. 




댓글 없음:

댓글 쓰기