12.2 모자이크 그림
모자이크 그림(Mosaic Chart)은 Marimekko chart, Eikosogram 이라고도 하는데요, 특히 2개 이상의 다변량 변수를 한꺼번에 그림으로 나타내어 탐색적 분석을 할 때 아주 유용합니다.
모자이크 그림은 다변량 범주형 데이터 간의 관계를 파악할 수 있게 해 줍니다.
모자이크 그림은 vcd
패키지의 mosaic()
함수를 이용하겠으며, 데이터는 MASS
패키지의 cars93
데이터 프레임 내에 있는 차종(Type
), 구동방식(DriveTrain
) 그리고 제조국(Origin
) 등의 3개 변수를 모자이크 그림으로 시각화해 보겠습니다.
vcd
패키지의 mosaic()
함수를 이용하겠습니다.
12.2.1 데이터 세트와 패키지
# vcd 패키지 설치 및 불러오기
# install.packages("vcd")
library(vcd)
# 데이터 세트
library(MASS)
str(Cars93)
12.2.2 기본 모자이크 그림 그리기
12.2.2.1 일변량 범주형 데이터
먼저 범주형 변수인 자동차의 종류(Type
) 만을 기본 모자이크 그림으로 그려 보겠습니다.
mosaic( ~ Type, data = Cars93,
main = "자동차 종류의 모자이크 그림")
Cars93
데이터 세트가 자동차의 종류(Type
) 별로 수평(horizontal)으로 분할되어 표시가 됩니다.
12.2.2.2 2변량 범주형 데이터
이제 자동차의 종류(Type
)와 구동 방식(DriveTrain
) 2개의 범주형 변수를 모자이크 그람으로 시각화 해 보겠습니다.
mosaic(DriveTrain ~ Type, data = Cars93,
main = "차종별 구동 방식 모자이크 그림")
Cars93
데이터 세트가 1차적으로 자동차의 종류(Type
) 별로 수평(horizontal)으로 분할되고, 2차적으로 각 자종차의 종류별로 구동 방식(DriveTrain
)이 수직(vertical)으로 분할되어 표시되고 있음을 알 수 있습니다.
12.2.2.3 3변량 범주형 모자이크 그림
이번에는 자동차의 종류(Type
)와 구동 방식(DriveTrain
) 그리고 제조국(Origin
) 등 3개의 범주형 변수를 모자이크 그람으로 시각화 해 보겠습니다.
mosaic( Origin ~ Type + DriveTrain, data = Cars93,
main = "3변량 범주형 모자이크 그림")
Cars93
데이터 세트가 1차적으로 자동차의 종류(Type
) 별로 수평(horizontal)으로 분할되고, 2차적으로 각 자종차의 종류별로 구동 방식(DriveTrain
)이 수직(vertical)으로 분할되어 표시되고 그리고 3차적으로 제조국(Origin
) 별로 수평(horizontal)으로 분할되어 표시되고 있음을 알 수 있습니다.
12.2.3 분할 방향
앞에서 살펴본 바와 같이 3 개의 범주형 변수에 대한 분할 방향은 다음과 같습니다.
Type
: 수평DriveTrain
: 수직Origin
: 수평
수평 분할(horizontal splits)로 시작하여 방향을 바꾸어 가는 것이 기본적인 분할 방향 패턴입니다.
따라서 앞에서 살펴본 3변량 모자이크 그림은 다음과 같이 direction =
모수를 이용하여 동일한 그림을 그릴 수 있습니다.
mosaic( Origin ~ Type + DriveTrain, data = Cars93,
direction = c("h", "v", "h"),
main = "3변량 범주형 모자이크 그림")
12.2.3.1 분할 방향의 변경
이러한 분할 방향은 우리가 원하는대로 변경할 수 있습니다. 예를 들어, 모든 변수들은 수직으로 분할하고, 마지막 변수만 수평으로 분할하는 더블데커 플롯을 그릴 수 있습니다.
mosaic( Origin ~ Type + DriveTrain, data = Cars93,
direction = c("v", "v", "h"),
main = "3변량 범주형 모자이크 그림 : 분할 방향의 변경")
여기서 분할 방향 벡터 direction = c("v", "v", "h")
는 Origin ~ Type + DriveTrain
공식에 있는 변수 (Type
, DriveTrain
, Origin
)의 순서로 적용이 됩니다. 즉, ~ 기호 앞에 있는 변수가 제일 마지막 변수(주로 분석에서는 이 변수를 종속변수라고 합니다.)가 됩니다.
12.2.4 모자이크 그림의 채우기 색
채우기 색을 적용할 수 있으며, 마지막 컷 차원(마지막 변수)에 따라서 자동 반복(recyling)됩니다.
다음과 같이 highlighting_fill =
모수로 채우기 색을 설정할 수 있습니다.
mosaic( Origin ~ Type + DriveTrain, data = Cars93,
highlighting_fill = c("grey90", "cornflowerblue"),
main = "모자이크 그림 : 채우기 색")
12.2.5 모자이크 그림에 라벨 추가하기
12.2.5.1 축 레이블 회전 시키기
rot_labels =
벡터는 변수의 분할 순서가 아닌 위, 오른쪽, 아래, 왼쪽 순으로 네 측면의 회전율을 설정해 줍니다.
mosaic( Origin ~ Type + DriveTrain, data = Cars93,
highlighting_fill = c("grey90", "cornflowerblue"),
labeling = labeling_border(rot_labels = c(45, -45, 0, 45)),
main = "모자이크 그림 : 채우기 색")
12.2.5.2 레이블 축약
레이블은 (direction =
에서와 같이) 분할 순서대로 축약할 수 있습니다. 레이블 축약 알고리즘은 모음을 제거한 지정한 수의 문자를 반환합니다.
자세한 사항은 ? label_border
를 참고하기 바랍니다.
mosaic( Origin ~ Type + DriveTrain, data = Cars93,
highlighting_fill = c("grey90", "cornflowerblue"),
labeling = labeling_border(rot_labels = c(45, -45, 0, 45),
abbreviate_labs = c(3, 2, 4)),
main = "모자이크 그림 : 레이블 축약")
abbreviate_labs = c(3, 2, 4)
은 공식에 있는 3개의 범주형 변수에 대해 (Type
, DriveTrain
, Origin
) 순으로 각각 3글자, 2글자, 4글자 등으로 축약해 줍니다.
12.2.5.3 비율 레이블 추가하기
마지막으로, 모자이크 그림에 비율 레이블(Mosaic Chart with Percentage Label)을 추가해 보겠습니다.
# 비율 라벨 추가 (Mosaic Chart with Percentage Labels)
<- with(Cars93, table(Type, Origin))
table_1 <- round(prop.table(table_1) * 100, 1) # 백분율, 소수점 첫째자리 반올림
proportions proportions
## Origin
## Type USA non-USA
## Compact 7.5 9.7
## Large 11.8 0.0
## Midsize 10.8 12.9
## Small 7.5 15.1
## Sporty 8.6 6.5
## Van 5.4 4.3
<- c(table_1)
values <- c("USA","non_USA")
rowvarcat <- c("Compact","Large", "Midsize", "Small", "Sporty", "Van")
columnvarcat =c("Origin", "Type")
names<- c(2,6)
dims
<- structure( c(values),
TABS .Dim = as.integer(dims),
.Dimnames = structure( list(rowvarcat, columnvarcat ),
.Names = c(names) ) , class = "table")
<- structure( c(proportions),
PROPORTIONS .Dim = as.integer(dims),
.Dimnames = structure( list(rowvarcat,columnvarcat ),
.Names = c(names) ) , class = "table")
<- structure( c(paste(proportions,"%","\n", "(",values,")",sep="")),
TABSPROPORTIONS .Dim = as.integer(dims),
.Dimnames = structure( list(rowvarcat,columnvarcat ),
.Names = c(names) ) , class = "table")
mosaic(TABS,
pop = FALSE,
main = "자동차 종류별 제조국의 비율 레이블")
labeling_cells(text=TABSPROPORTIONS, clip_cells=FALSE)(TABS)
- Michael Friendly’s book “Visualizing Categorical Data” 예제 참고