본문 바로가기

R_statistics/Rs_graphics

[R프로그래밍] 데이터시각화 with ggplot2:: 그룹별로 데이터 분포 및 평균과 범위 나타내기, data distribution and errorbar with average by groups

데이터 시각화는 중요한 내용입니다.

오늘의 포스팅 내용은 복잡한 데이터 프레임에서 

그룹별로 각각의 변수에 대한 평균과 범위를 구하고 싶을 때 사용하는 방법입니다.


결과물은 다음과 같습니다.



전체 데이터의 분포와 함께 그룹별 상이한 데이터 분포가 한눈에 들어오죠?

그리고 가운데 error-bar 와 interquartile range 로 데이터 분포 범위를 추가로 표기해두었습니다.

물론 이 부분은 boxplot 으로도 대체가 가능하지만 저는 개인적으로 이런 형식이 더 보기가 좋더라구요.


그럼 위의 그래프를 그리기 위한 코드를 알아볼까요?

즉, 목표는 Species 별로 Sepal Length & Width, Petal Length & Width의 분포와 평균을 구하는 것입니다.


library(dplyr)
library(reshape2)
library(ggplot2)
library(ggbeeswarm)

data(iris)
subject_no <- c(seq(1, nrow(iris)))
iris <- cbind(subject_no, iris) 


우선은 사용할 패키지와 iris 데이터를 불러옵니다. 

iris 데이터에는 각각의 객체들을 구분할 수 있는 식별자가 없으므로, 식별자를 붙여줍니다.



irismelt <- melt(iris, id=c("subject_no","Species"))
irismelt<-irismelt %>% group_by(Species,variable) %>% mutate(upper =  quantile(value, 0.75), 
                                                            lower = quantile(value, 0.25),
                                                            mean = mean(value)) 


그리고 위의 코드가 핵심이죠.

이 부분이 이해가 잘 안되실수도 있지만, R 을 다루신다면 무조건 이해하시고 사용하실 수 있어야 하는 부분입니다.

( appaly 함수와 함께 말이죠, https://bpapa.tistory.com/28 참고 )


data를 식별자(subject_no) 와 원하는 그룹(Species) 를 기준으로 melting 시켜줍니다.

그리고 Species 와 variable (Sepal Length & Width, Petal Length & Width) 로 서브그룹을 나누고,

상한값 (interquartile range의 큰값), 하한값 (interquartile range 의 작은값), 그리고 평균을 구해줍니다.


그렇게 준비하면 그래프를 그리기 위한 준비가 끝입니다.

그리고 다음의 코드를 사용하시면 위의 그래프가 나옵니다.


 ggplot(irismelt, aes(variable, value, color=Species, group=Species))+
  geom_beeswarm(priority="descending",dodge.width=0.8, alpha=0.3,groupOnX = TRUE)+
  geom_errorbar(aes(ymax=upper, ymin=lower),width=0.3, position=position_dodge(0.8), size=1.3, col="black")+
  geom_point(aes(x = variable, y = mean), size = 4, col = "black", pch=18,position=position_dodge(0.8))+
  ylab("Length & Width")+
  xlab("")+
  theme_bw()+
  scale_color_discrete(name = "Species") 


그래프 세부 파라미터의 조정은 그래프를 직접 그리시면서 고민을 해보셔야 실력이 늡니다.

자유자재로 변형하시면서 공부해보세요.

R graphics 의 세계는 무궁무진합니다^^


도움이 되셨다면, '공감' 버튼 부탁드립니다^^