앞서 리뷰했던 중심의 위치, 퍼진 정도 등의 수치들은 자료의 여러 성질을 나타내지만, 자료 전체의 대략적인 모양을 보여 주지는 못하는 단점이 있다.
이에 이번 포스팅에서는 상자그림에 대해 알아보고 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 속을 다른 색으로 채울 수도 있다.
'AI > 기초통계' 카테고리의 다른 글
[기초통계] 산점도란? What is scatter plot? (0) | 2019.10.04 |
---|---|
[기초통계] 분할표란? What is contingency table? (2) | 2019.10.03 |
[기초통계] 백분위수와 사분위수범위, quantile() in R (What is Percentile and Interquartile Range?) (2) | 2019.09.22 |
[기초통계] 분산이란? 표준편차란? (What is Variance and Standard Deviation?) (0) | 2019.09.19 |
[기초통계] 평균 중앙값 최빈값 비교 (Mean VS Median VS Mode) (0) | 2019.09.02 |