forcats를 활용한 막대 그래프 및 박스 플롯 정렬

Giyu·2021년 11월 12일
0

Data Visualization with R

목록 보기
5/10
post-thumbnail

예시 데이터 : https://www.kaggle.com/prathamtripathi/drug-classification


R에서는 factor형 변수의 level을 조작할 수 있는 패키지인 forcats를 제공하고 있습니다. (tidyverse 패키지에 포함되어 있음)

이번 시간에는 forcats 패키지의 함수 중 fct_infreq()와 fct_reorder() 함수를 ggplot2에서의 막대 그래프 및 박스 플롯의 정렬에 응용해보도록 하겠습니다.

그 전에 먼저 예시 데이터를 불러온 다음, 이번 연습에서 사용할 Drug 변수를 factor형으로 변환하겠습니다.

drug <- read.csv("drug200.csv")

drug$Drug <- factor(drug$Drug)

str(drug)

'data.frame': 200 obs. of 6 variables:
$ Age : int 23 47 47 28 61 22 49 41 60 43 ...
$ Sex : chr "F" "M" "M" "F" ...
$ BP : chr "HIGH" "LOW" "LOW" "NORMAL" ...
$ Cholesterol: chr "HIGH" "HIGH" "HIGH" "HIGH" ...
$ Na_to_K : num 25.4 13.1 10.1 7.8 18 ...
$ Drug : Factor w/ 5 levels "drugA","drugB",..: 5 3 3 4 5 4 5 3 5 5 ...


1. fct_infreq() 함수와 막대 그래프 정렬

fct_infreq() 함수를 ggplot2의 x 인자에 들어갈 factor형 변수에 적용하게 되면, level의 빈도 수를 기준으로 내림차순 정렬됩니다.

예시 데이터의 Drug 변수는 5개의 level로 구성된 factor형 변수이기 때문에, 먼저 Drug 변수를 인자로 넣은 빈도 수 막대 그래프를 그려보겠습니다.

drug %>% ggplot(aes(x=Drug, fill = Drug)) + geom_bar()

Drug(약물) 종류 별 빈도 수를 막대 그래프로 표현했습니다.

이 상태에서 x 인자의 Drug 변수를 fct_infreq() 함수로 감싸주게 되면 빈도 수를 기준으로 내림차순 정렬을 하게 됩니다.

한 번 fct_infreq() 함수를 적용하여 막대 그래프를 그려보겠습니다.

drug %>% ggplot(aes(x=fct_infreq(Drug), fill = Drug)) + geom_bar()

fct_infreq() 함수를 적용한 결과 빈도 수를 기준으로 내림차순 정렬이 된 것을 보실 수 있습니다.

그렇다면 만약 오름차순 정렬을 하고 싶다면 어떻게 해야 될까요?

그럴 경우에는 fct_rev() 함수를 fct_infreq() 함수에 한 번 더 감싸주면 됩니다. fct_rev() 함수를 적용하게 되면 내림차순 정렬에서 오름차순 정렬로 바뀌게 됩니다.

이번에는 fct_rev() 함수를 사용해 막대 그래프를 그려보겠습니다.

drug %>% ggplot(aes(x=fct_rev(fct_infreq(Drug)), fill = Drug)) + geom_bar()

fct_rev() 함수를 사용한 결과 빈도 수를 기준으로 오름차순 정렬이 된 것을 보실 수 있습니다.


2. fct_reorder() 함수와 박스 플롯 정렬

fct_reorder() 함수를 ggplot2의 x 인자에 적용하되, fct_reorder(factor형 변수, 종속변수) 형태로 사용해야 합니다.

fct_reorder() 함수를 사용하게 되면 factor형 변수의 level 별 종속변수의 median을 기준으로 오름차순 정렬됩니다.

먼저 fct_reorder() 함수를 사용하지 않고 Drug 변수와 Age 변수를 인자로 설정한 박스 플롯을 그려보겠습니다.

drug %>% ggplot(aes(x=Drug, y=Age, fill = Drug)) + geom_boxplot()

박스 플롯 결과 Drug 종류 별 Age 변수에 대한 boxplot이 그려진 것을 보실 수 있습니다.

이 상태에서 x 인자에 fct_reorder(Drug, Age) 형태를 사용하게 되면 Drug 종류 별 Age 변수의 median을 기준으로 오름차순 정렬됩니다.

한 번 fct_reorder() 함수를 적용한 박스 플롯을 그려보겠습니다.

drug %>% ggplot(aes(x=fct_reorder(Drug, Age), y=Age, fill = Drug)) + geom_boxplot()

박스 플롯 결과를 보니 Drug 종류 별 Age 변수의 median을 기준으로 오름차순 정렬된 것을 확인할 수 있습니다.

만약 내림차순 정렬을 하고 싶다면 fct_reorder() 함수에 .desc = T로 설정해주시면 됩니다.

이 .desc = T의 역할은 fct_infreq() 함수에서 fct_rev() 함수를 적용한 것과 같은 역할을 하게 됩니다.

drug %>% ggplot(aes(x=fct_reorder(Drug, Age, .desc = T), y=Age, fill = Drug)) + geom_boxplot()

.desc = T를 적용했기 때문에 Drug 종류 별 Age 변수의 median을 기준으로 내림차순 정렬된 것을 확인할 수 있습니다.

추가로 fct_reorder() 함수에서 .fun 인자를 통해 기준값을 median이 아닌 mean으로 설정할 수도 있습니다.


이상으로 ggplot2의 막대 그래프 및 박스 플롯 정렬에 있어서 forcats 패키지의 함수들을 활용하는 방법에 대해서 알아보았습니다. 감사합니다.

profile
Data Analysis Log

0개의 댓글