AI/기초통계

[기초통계] 상자그림이란? R에서 boxplot 그리기 What is boxplot?

슈퍼짱짱 2019. 9. 28. 08:00
반응형

앞서 리뷰했던 중심의 위치, 퍼진 정도 등의 수치들은 자료의 여러 성질을 나타내지만, 자료 전체의 대략적인 모양을 보여 주지는 못하는 단점이 있다.


>> 평균 vs 중앙값 vs 최빈값 바로가기

>> 분산 & 표준편차란? 바로가기

>> 백분위수 & 사분위수란? 바로가기


이에 이번 포스팅에서는 상자그림에 대해 알아보고 R에서 직접 구현하는 방법도 알아보겠다.




상자그림이란?


상자그림(boxplot)이란? 자료로부터 얻는 다섯 가지 요약수치인 최소값, Q1, Q2, Q3, 최대값을 가지고 그림을 그린것이다.


box plot을 그리는 자세한 과정은 다음과 같다.


1. 사분위수(Q1, Q2, Q3)를 결정한다.

2. Q1과 Q3을 네모난 상자로 연결하고, 중앙값(Q2)의 위치에 수직선을 긋는다.

3. IQR = Q3 - Q1을 계산한다.

4. 상자 양끝에서 1.5 x IQR 크기의 범위를 경계로 하여, 이 범위에 포함되는 최소값과 최대값을 Q1과 Q3으로부터 각각 선으로 연결한다.

5. 양 경계를 벗어나는 자료값들을 * 로 표시하고, 이 점들을 이상점이라고 한다.




 boxplot in R


상자그림을 R에서는 다음과 같이 그린다.


1. R에 기본으로 내장되어있는 함수는 다음과 같이 쓸 수 있다.


boxplot(x, ...)


예를 들어 iris 데이터에서 Sepal.Length col로 boxplot을 그리면 다음과 같다.


1
2
data(iris)
boxplot(iris$Sepal.Length)
cs



2. ggplot으로는 boxplot을 다음과 같이 구현한다.


1
2
3
library(ggplot2)
ggplot(data = iris) +
  geom_boxplot(aes(y=Sepal.Length))
cs




3. 두 boxplot 한 그래프로 그리기


iris 데이터에서 Sepal.Length와 Sepal.Width 각각의 상자그림을 한 그래프로 그리려면 melt() 로 두 컬럼을 한 컬럼으로 합친 후 ggpplot으로 그려주면 된다.


1
2
3
4
5
dat = iris[,c("Sepal.Length","Sepal.Width")]
dat = reshape2::melt(dat)
ggplot(data = dat) +
  geom_boxplot(aes(x = variable, y=value))
 
cs


> dat[140:160,]


        variable value

140 Sepal.Length   6.9

141 Sepal.Length   6.7

142 Sepal.Length   6.9

143 Sepal.Length   5.8

144 Sepal.Length   6.8

145 Sepal.Length   6.7

146 Sepal.Length   6.7

147 Sepal.Length   6.3

148 Sepal.Length   6.5

149 Sepal.Length   6.2

150 Sepal.Length   5.9

151  Sepal.Width   3.5

152  Sepal.Width   3.0

153  Sepal.Width   3.2

154  Sepal.Width   3.1

155  Sepal.Width   3.6

156  Sepal.Width   3.9

157  Sepal.Width   3.4

158  Sepal.Width   3.4

159  Sepal.Width   2.9

160  Sepal.Width   3.1



같은 방법으로 두 개 뿐 아니라, 세개, 네개 ... 도 가능하다.



이것을 좀 더 예쁘게 그리면 다음과 같다.


각 boxplot의 경계선 색을 다르게 하고, 각 색깔이 무엇을 뜻하는지 legend의 위치를 아래쪽으로 바꾸고,

x축과 y축의 label을 바꾸었으며, <ggplot으로 boxplot 그리기>라는 title을 달아 주었다.


1
2
3
4
ggplot(data = dat) +
  geom_boxplot(aes(x = variable, y=value, col = variable)) +
  theme_bw() + theme(legend.position = "bottom") +
  labs(x = "col.name", y = "") + ggtitle("ggplot으로 boxplot그리기")
cs



외에도 그냥 col = variable이 아니라, fill = variable로 하면 boxplot 속을 다른 색으로 채울 수도 있다.




반응형