데이터 시각화는 중요한 내용입니다.
오늘의 포스팅 내용은 복잡한 데이터 프레임에서
그룹별로 각각의 변수에 대한 평균과 범위를 구하고 싶을 때 사용하는 방법입니다.
결과물은 다음과 같습니다.
전체 데이터의 분포와 함께 그룹별 상이한 데이터 분포가 한눈에 들어오죠?
그리고 가운데 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 의 세계는 무궁무진합니다^^
도움이 되셨다면, '공감' 버튼 부탁드립니다^^