[R] 도수 분포표 및 막대 그래프 그리기 (feat. 혈액형 데이터)

해당 포스트에서는 R에서 혈액형 데이터로 도수분포표와 막대그래프를 출력하는 방법을 소개합니다.

INTRO

R 분석을 시작하면서 데이터의 분포를 파악하는 첫번째 방법은 빈도를 살펴보는 것입니다. 변수별 빈도를 표형태로 확인하는 경우에는 도수분포표(table)를 사용하고, 해당 결과를 그래프로 표현할 때에는 보통 막대그래프(barchart)를 사용합니다.

아래에서는 가상의 혈액형 데이터를 생성하여 도수분포표와 막대그래프를 출력하는 방법을 설명하겠습니다.

1. 데이터 생성

먼저 30개 혈액형 데이터(A,B,O,AB)를 담고있는 mydata 객체를 생성해 보겠습니다.

mydata <- c("A","B","B","B","A",
            "A","O","A","B","AB",
            "B","A","B","B","O",
            "O","AB","O","AB","A",
            "O","O","B","A","AB",
            "B","O","A","A","B")
mydata
 [1] "A"  "B"  "B"  "B"  "A"  "A"  "O"  "A"  "B"  "AB" "B"  "A"  "B"  "B"  "O" 
[16] "O"  "AB" "O"  "AB" "A"  "O"  "O"  "B"  "A"  "AB" "B"  "O"  "A"  "A"  "B"

출력 결과 정상적으로 mydata에 30개 혈액형 데이터가 생성된 것을 볼 수 있습니다.

2. 도수분포표 생성

도수분포표는 table()이라는 R 내장 함수를 이용해 생성할 수 있습니다.

mydata_table <- table(mydata)
mydata_table
mydata
 A AB  B  O 
 9  4 10  7 

table() 함수를 통해 각 혈액형별 빈도수를 얻었습니다. 해당 결과를 통해 가시적인 결과를 얻긴 했으나 일반적인 데이터 형태(행과 열)로 변환하여 다시 보면 아래와 같습니다. 이 때는 data.frame() 함수를 이용합니다.

mydata_df <- data.frame(mydata_table)
mydata_df
  mydata Freq
1      A    9
2     AB    4
3      B   10
4      O    7

data.frame() 구조로 변경하여 좀 더 데이터스럽게 변경되었으나, 혈액형을 나타내는 컬럼명이 mydata라 맞지 않는 것 같습니다. 해당 컬럼명을 데이터에 맞게 bloot_type으로 수정해 보겠습니다.

컬럼명은 colnames() 함수를 이용해 확인할 수 있으며, 아래 코드는 mydata_df 객체의 컬럼명 중에서 1번째에 'blood_type'을 입력해라라고 이해하시면 됩니다.

colnames(mydata_df)[1] <- 'Blood_type'
mydata_df
  Blood_type Freq
1          A    9
2         AB    4
3          B   10
4          O    7

이제 데이터 및 컬럼명이 의도에 맞게 정리된 것으로 보입니다. 이제 데이터 시각화를 통해 결과를 확인해 보겠습니다.

3. 데이터 시각화

일반적으로 도수분포표의 시각화는 막대 그래프(barchart)를 이용해 표현하며, R에서는 barplot() 함수를 이용해 막대그래프를 그릴 수 있습니다.

해당 함수에서는 각 빈도값이 입력값으로 사용되며 출력 결과는 아래와 같습니다.

barplot(mydata_df$Freq)

R 혈액형 막대그래프1
▲ R 혈액형 막대그래프1

위 plot에서는 각 막대가 어떤 혈액형의 빈도인지 표현되지 않아 이해에 혼란을 줄 수 있습니다. 이런 경우, 각 빈도값에 해당하는 데이터값을 x축에 추가하여 출력해 주는 것이 좋으며, 이번 문제의 경우 barplot()함수에서 제공되는 names.arg 옵션에 해당하는 mydata_df$Blood_type 값을 입력해주면 됩니다.

barplot(mydata_df$Freq,
        names.arg = mydata_df$Blood_type)

R 혈액형 막대그래프2
▲ R 혈액형 막대그래프2

그리고 여기에 막대별 컬러를 추가하고 싶다면 아래와 같이 col 옵션을 입력해 주면 됩니다.

barplot(mydata_df$Freq,
        names.arg = mydata_df$Blood_type,
        col = c('red','blue','green','orange'))

R 혈액형 막대그래프3
▲ R 혈액형 막대그래프3

ggplot2 패키지 사용

R은 오픈소스 소프트웨어로, 다양한 커뮤니티 및 유저들이 좀 더 유용하게 사용할 수 있는 외부 패키지들을 매순간 만들어내고 있습니다. ggplot2tidyverse 재단에서 만든 시각화 패키지로 다양한 plot 함수들을 통합 제공하고 있으며, R 사용자라면 꼭 배워야하는 필수 패키지에 속합니다.

위에서 출력한 막대 그래프를 ggplot2 패키지를 이용해 재구현한다면 아래와 같이 시각화할 수 있습니다.

library(ggplot2)

ggplot(mydata_df, aes(Blood_type, Freq, fill=Blood_type)) + 
  geom_bar(stat='identity')

R 혈액형 막대그래프(ggplot)
▲ R 혈액형 막대그래프(ggplot)

마치며

이번 포스트에서는 R을 이용해 도수분포표, 막대그래프를 출력하는 방법을 설명하였습니다. R은 내장 함수만으로도 다양한 결과를 얻어낼 수 있지만 좀 더 효과적이고 유용한 결과를 얻고 싶다면 외부 패키지들을 많이 알아보고 사용하시는 것이 좋습니다.

관련링크

[1] Wikipedia - 도수분포표(table)
[2] Wikipedia - 막대그래프(barchart)
[3] tidyverse 페이지
[4] ggplot2 페이지