변수 개수 | 변수 형태 | 그래프 |
일변량 | 연속형 데이터 | 히스토그램 (hist) |
상자그림 (boxplot) | ||
범주형 데이터 (명목형, 수치형) |
막대 그래프 (barplot) 파이 차트 (pie) 점 차트 (dotchart) |
|
다변량 | 연속형 데이터 | 산점도(행렬) (plot, pairs) |
범주형 데이터 | 모자이크 플롯 (mosaicplot) |
◎ 상자그림
boxplot(x, ..., range = 1.5, width = NULL, notch = FALSE, outline = TRUE, names, plot = TRUE, border = par("fg"), col = "lightgray", pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5), horizontal = FALSE, add = FALSE, at = NULL) |
<인수설명>
range | whisker(수염) 길이를 range(양수) x IQR(inter quartile range) |
width | 각 상자 폭의 크기를 다르게 지정 |
notch | TRUE이면 상자의 각면에 노치가 그려짐 |
outline | outliers, extreme value를 점으로 출력 |
names | 각 상자그림의 이름 |
plot | FALSE이면 stats, n, conf, out, group, names 반환 |
border | 상자그림의 테두리 색상 |
col | 상자그림의 상자 색상 |
boxwex | 모든 상자에 대한 확장 폭 |
outpch | outlier 점의 모양 |
horizontal | 기본값 FALSE는 가로 상자그림, TRUE는 세로 상자그림을 출력 |
add | TRUE이면 현재 상자그림에 새로운 상자그림을 추가해서 출력 |
at | add=TRUE일때 상자그림을 그릴 위치 지정 |
상자그림은 자료의 다섯수치요약을 시각화한 그래프로 데이터의 분포를 알아보는데 용이하다. 다섯수치요약이란 최소값(min), 제1사분위수(Q1), 중앙값(median, Q2), 제3사분위수(Q3), 최대값(max)을 말한다.
상자에서 좌우로 뻗어나간 선은 수염(whisker)이라고 부르며 양쪽 안울타리(inner fence)의 안쪽에 있으면서 경계에 가장 가까운 값, 즉, 특이점(이상치, outlier)을 제외한 최소값과 최대값까지 수염이 그려진다.
안울타리(inner fence)는 각각 Q1 - 1.5 * IQR, Q3 + 1.5 * IQR까지이다.(IQR : 사분위수 범위 = Q3 - Q1) 안울타리 바깥에 있는 자료를 특이점(이상치, outlier)으로 간주하고 'o'으로 표시한다.
> str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
iris 데이터셋은 R 프로그램에 저장되어 있는 내장 데이터셋이다. iris 데이터셋은 3 종의 붓꽃에서 각각 50 개의 꽃에 대해 꽃받침 길이와 너비, 꽃잎 길이와 너비 변수를 센티미터(cm) 단위로 측정한 데이터를 저장하고 있는 데이터프레임 구조이다. 붓꽃의 종은 setosa, versicolor, virginica가 있다.
이 데이터를 사용해서 boxplot() 함수의 인수(옵션)들을 설명하려고 한다.
> boxplot(iris[-5])
iris 데이터셋의 5번째 변수를 제외한 데이터로 상자그림을 그렸다. 한 화면에 4개의 상자그림이 그려지고, 데이터가 퍼져있는 분포도 한눈에 알아볼 수 있다.
상자의 이름은 따로 지정하지 않아도 변수의 이름이 기본으로 출력된다.
> boxplot(Sepal.Length ~ Species, data=iris)
상자그림은 formula(포뮬라)형식으로도 그릴 수 있다. 붓꽃의 3가지 종에 따라서 꽃받침의 길이에 대한 상자그림을 그린 것이다.
- range
> boxplot(iris[,2])
> quantile(iris[,2])
0% 25% 50% 75% 100%
2.0 2.8 3.0 3.3 4.4
> IQR(iris[,2])
[1] 0.5
range 인수는 상자그림의 수염(whisker)이 상자에서 얼마나 멀리 확장되는지를 결정한다. 즉, 안울타리(inner fence)의 범위를 지정하는 인수이고, 기본값은 1.5이다. 위에서도 설명했듯이 안울타리(inner fence)는 각각 Q1 - 1.5 * IQR, Q3 + 1.5 * IQR까지이고, IQR에 곱할 수치를 range 인수에 지정하면 된다. (IQR : 사분위수 범위 = Q3 - Q1)
range 인수의 값이 0이면 수염이 데이터 극단까지 확장된다.
quantile() 함수로 다섯수치요약 값인 최소값(min), 제1사분위수(Q1), 중앙값(median, Q2), 제3사분위수(Q3), 최대값(max)을 알 수 있고, IQR() 함수로 사분위수 범위가 0.5임을 알 수 있다.
> par(mfrow=c(1,2))
> boxplot(iris[,2], range=1)
> boxplot(iris[,2], range=2)
> par(mfrow=c(1,1))
사분위수 범위가 0.5임으로 range=1이면 0.5에 1을 곱한 0.5를 안울타리 범위로 정하고 수염을 그린다.
또, range=2이면 0.5에 2를 곱한 1을 안울타리 범위로 정하고 수염을 그린다.
- width
> boxplot(iris[-5], width=1:4)
width 인수는 그래프를 구성하는 상자들의 상대적 너비를 지정할 수 있다. 상자그림을 하나만 그릴 때에는 width 인수를 지정해도 상자의 너비가 변하지 않는다. 아래에 설명할 boxwex 인수를 지정하면 상자그림을 하나만 그려도 상자의 너비를 변경할 수 있다.
- notch / outline
> par(mfrow=c(1,2))
> boxplot(iris[,2], notch=T)
> boxplot(iris[,2], outline=F)
> par(mfrow=c(1,1))
notch 인수는 TRUE이면 상자의 각면에 노치가 그려진다. TRUE이면 중앙값에 대한 일종의 신뢰구간을 표시하는 움푹 들어간 구간이 그려지는데 만약 두개의 상자그림의 notch 인수를 TRUE로 지정해 그렸을 때 두 그래프의 움푹 들어간 구간이 서로 겹치지 않으면 이는 두 데이터의 중앙값이 서로 다르다는 강한 증거가 된다고 할 수 있다.
outline 인수는 TRUE가 아닌 경우 특이점(이상치, outlier)이 그려지지 않는다.
- names
> boxplot(iris[-5], names=1:4)
names 인수는 각 상자그림 아래에 출력될 label을 문자형 벡터 또는 표현식으로 지정한다. 상자그림의 이름은 따로 지정하지 않아도 변수의 이름이 기본으로 출력된다.
- plot
> boxplot(iris[,2], plot=F)
$stats
[,1]
[1,] 2.2
[2,] 2.8
[3,] 3.0
[4,] 3.3
[5,] 4.0
$n
[1] 150
$conf
[,1]
[1,] 2.935497
[2,] 3.064503
$out
[1] 4.4 4.1 4.2 2.0
$group
[1] 1 1 1 1
$names
[1] "1"
plot 인수는 TRUE(기본값)이면 상자그림이 생성되고, 그렇지 않으면 상자그림의 기반이 되는 요약이 반환된다.
stats는 특이점을 제외한 최소값(min), 제1사분위수(Q1), 중앙값(median, Q2), 제3사분위수(Q3), 특이점을 제외한 최대값(max)을 저장한 행렬이고,
n은 각 그룹마다의 관측값 수를 저장한 벡터이고,
conf는 notch 구간의 하한과 상한을 저장한 행렬이고,
out은 특이점(이상치, outlier)을 저장하고 있고,
group은 특이점(이상치, outlier)이 속한 그룹을 저장한 out과 길이가 같은 벡터,
names은 각 그룹의 이름을 저장한 벡터이다.
- border
> par(mfrow=c(1,2))
> boxplot(iris[,2], border=NA)
> boxplot(iris[,2], border=F)
> par(mfrow=c(1,1))
border 인수는 상자그림의 윤곽선 테두리에 대한 색상 벡터이다. border 인수를 FASLE 또는 NA로 지정하면 차이는 있지만 상자그림의 테두리와 수염, 특이점(이상치, outlier)까지 생략되는 것을 알 수 있다.
> boxplot(iris[-5], border=rainbow(4))
기본적으로 상자그림의 테두리는 검은색이다. 단일값을 지정하면 모든 상자그림의 테두리 색상이 똑같이 변경되고, 벡터값을 지정하면 왼쪽 상자그림부터 각각의 테두리 색상을 변경할 수 있다.
border 인수는 색상 이름(ex "red") or RGB 색상(ex #FF0000) 등으로 지정할 수 있다. RGB를 사용해 색상을 변경하려면 "#RRGGBB"의 형식으로 값을 지정한다.
- col
> boxplot(iris[,2], col=F) # NA, NULL 과 같은 결과
col 인수는 상자그림의 본체(상자)에 색상을 지정하는데 사용할 색상을 지정한다. 기본값은 "lightgray" 색상이다. FALSE, NA, NULL을 지정하면 상자의 색상은 흰색이 된다.
> boxplot(iris[-5], col=rainbow(4))
border 인수와 마찬가지로 단일값을 지정하면 모든 상자의 색상이 똑같이 변경되고, 벡터값을 지정하면 왼쪽 상자그림부터 각각의 상자 색상을 변경할 수 있다.
또한 색상 이름(ex "red") or RGB 색상(ex #FF0000) 등으로 지정할 수 있고, RGB를 사용해 색상을 변경하려면 "#RRGGBB"의 형식으로 값을 지정한다.
- boxwex / outpch
> par(mfrow=c(1,2))
> boxplot(iris[,2], boxwex=.5)
> boxplot(iris[,2], outpch=4)
> par(mfrow=c(1,1))
boxwex 인수는 모든 상자에 적용할 확장 폭의 비율을 지정한다. 그룹이 적은 경우 상자를 더 좁게 만들어 상자그림의 모양을 개선할 수 있다. width 인수는 상자그림을 하나만 그릴 때에는 상자의 너비가 변하지 않지만 boxwex 인수는 상자그림을 하나만 그려도 상자의 너비(폭)을 조절할 수 있다.
outpch 인수는 특이점(이상치, outlier)의 모양을 지정한다.
- horizontal
> boxplot(iris[,2], horizontal=T)
horizontal 인수는 상자그림을 수평으로 그릴지 수직으로 그릴지 여부를 지정하는 논리값이다. 기본값 FALSE는 수직 상자그림을 그리며, TRUE는 수평 상자그림을 그린다.
- add
> boxplot(iris[,1], ylim=c(2,8))
> boxplot(iris[,2], add=T)
add 인수는 TRUE이면 현재 상자그림에 새로운 상자그림을 추가해서 출력할 수 있다. 이때는 ylim 인수를 지정해서 y축의 범위를 조절해줘야 상자그림이 짤리지 않고 출력된다.
새로 추가할 상자그림의 출력 위치를 지정해줄 수 있는데 바로 아래 설명할 at 인수를 지정해주면 된다.
- at
> boxplot(iris[,1], ylim=c(2,8), xlim=c(0,3))
> boxplot(iris[,2], add=T, at=2)
at 인수는 add=TRUE인 경우 새로운 상자그림을 그려야하는 위치를 숫자형 벡터로 지정한다. 기본값은 1 : n이며 여기서 n은 상자의 수이다.
at 인수를 지정할 때에도 add 인수처럼 ylim 인수와 xlim 인수를 지정해서 축의 범위를 조절해줘야 상자그림이 짤리지 않고 출력된다.
◎ 상자그림 응용
> str(ToothGrowth)
'data.frame': 60 obs. of 3 variables:
$ len : num 4.2 11.5 7.3 5.8 6.4 10 11.2 11.2 5.2 7 ...
$ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ...
$ dose: num 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
ToothGrowth 데이터셋은 R 프로그램에 저장되어 있는 내장 데이터셋이다. ToothGrowth 데이터셋은 기니피그 60마리의 치아 모세포(치아 성장을 담당하는 세포)의 길이, 비타민 C의 종류, 비타민 C의 용량 데이터를 저장하고 있다.
각 기니피그는 Orange Juice(OJ) 또는 Ascorbic Acid(VC)의 2가지 비타민 C 전달방법 중 하나를 통해 3가지 용량 수준의 비타민 C(0.5, 1, 2 mg / 일) 중 하나를 받았다.
> boxplot(len ~ dose, data=ToothGrowth, boxwex=0.25, at=1:3-0.2,
+ subset=supp=="OJ", col="orange", xlab="Vitamin C dose mg",
+ ylab="tooth length", main="Guinea Pigs' Tooth Growth",
+ xlim=c(0.5,3.5), ylim=c(0, 35))
>
> boxplot(len ~ dose, data=ToothGrowth, boxwex=0.25, at=1:3+0.2,
+ subset=supp=="VC", col="yellow", add=T)
>
> legend(2.4, 9, c("Ascorbic acid","Orange juice"), fill=c("yellow","orange"))
formula(포뮬라)형식으로 상자그림을 그려보았다. subset 인수를 통해 조건식을 전달해서 비타민 C의 종류 2가지 별로 상자그림을 그렸고, at 인수로 상자그림의 위치를 조절하였다.
main 인수는 상자그림의 제목을 지정한다.
xlab 와 ylab 인수는 각각 x축 이름, y축 이름을 지정한다.
xlim 과 ylim 인수는 각각 x축의 범위, y축의 범위를 지정한다.
legend() 함수는 그래프의 범례를 추가해줄 수 있다.
> boxplot(len ~ dose:supp, data=ToothGrowth)
subset 인수를 지정하지 않고, formula(포뮬라)형식에 콜론(:)연산자를 사용해서 비타민 C의 용량 3가지 별로 상자그림을 그릴 수 있다. dose 변수와 supp 변수의 순서를 바꿔서 supp:dose로 지정하면 위에서 처럼 비타민 C의 종류 2가지 별로 상자그림을 그릴 수 있다.
> boxplot(len ~ dose:supp, data=ToothGrowth, boxwex=0.5, lex.order=T,
+ col=c("orange","yellow"), main="Guinea Pigs' Tooth Growth",
+ xlab="Vitamin C dose mg", ylab="tooth length", sep=":")
>
> legend(4.3, 12, c("Ascorbic acid","Orange juice"), fill=c("yellow","orange"))
lex.order 인수를 TRUE로 지정하면 dose 변수와 supp 변수의 순서를 바꾸지 않아도 비타민 C의 종류 2가지 별로 상자그림을 그릴 수 있다. 사전식 순서(lexicographical order)로 사전에 쓰이는 가나다순이나 알파벳순의 정렬 방법을 사용해 정렬한다고 한다.
sep 인수는 dose 변수와 supp 변수 사이의 구분연산자를 지정한다.
<R 연속변수 시각화 - 상자그림 boxplot>
'R > Graph' 카테고리의 다른 글
R 연속변수 시각화 - 히스토그램 hist (0) | 2021.03.24 |
---|---|
R 이산변수 시각화 - 모자이크 플롯 mosaicplot (0) | 2021.03.21 |
R 이산변수 시각화 - 파이차트 pie (0) | 2021.03.20 |
R 이산변수 시각화 - 점차트 dotchart (0) | 2021.03.18 |
R 이산변수 시각화 - 막대그래프 barplot (0) | 2021.03.17 |
댓글