R을 사용한 막대 그래프 그리기 – ggplot2 초급

R의 다양한 장점 중 하나가 Visualization인데요, 다양한 R 패키지를 사용하면 데이터를 원하는 방식으로 쉽게 시각화 할 수 있습니다.

하지만 엑셀이나 파워포인트에서는 GUI 베이스로 쉽게 그래프를 그릴수 있는 반면에, R에서는 기본적인 시각화 (축 설정, 범례, 단위 조정 등)도 코드를 통해 변경 해야 하기 때문에 초급자 분들이 어려움을 느끼시는 것 같습니다.

그래서 오늘은 가장 대중적으로 사용되는 ggplot2패키지의 기초 문법과, 기본적인 막대 그래프를 작성하는 방법을 정리해 보도록 하겠습니다.

ggplot2의 기초 문법

ggplot2의 장점은 그래프를 구성하는 요소를 “문법”처럼 체계화 했다는 점입니다. 이 것이 왜 장점이냐면 기본적인 문법만 알면 내가 원하는 문장을 말할 수 있듯이, ggplot2의 문법을 이해한다면 쉽게 원하는 그래프를 그릴 수 있기 때문입니다.

ggplot2의 문법을 구성하는 기본 요소는 아래와 같습니다.

♦ 데이터 프레임(data frame)
♦ 색상, 크기 같은 외적 요소(aes)
♦ 점, 선, 모양 같은 기하학적 요소(geoms)
♦ 통계적 처리 방법(stats)
♦ aes에서 사용할 스케일(scale)

어려워 보이시나요? 겁먹지 마시고 본 포스트를 차근히 읽으시기를 추천드립니다. 기본 원리를 이해하시면 생각보다 훨씬 쉽게 ggplot2를 사용하실 수 있을 테니까요.

위 기본 요소들을 사용해서 ggplot2에서 그래프를 그리기 위한 기본 원리를 알아볼까요?

1. 어떤 데이터를 사용할 것인지를 지정하고,

2. 그 데이터를 어떤 모양으로 나타낼 것인지(geom 요소)를 선택하면 됩니다.  (참 쉽죠?)

예를 들어 아래의 코드를 통해 iris데이터의 Sepal.Length와 Sepal.Width 변수를 그래프에 사용하라는 명령을 내려봅시다.

위 상태는 ggplot2에서 위 1번 단계, 그러니까 어떤 데이터를 사용할 것인지만 지정된 상태입니다. 어떤 모양의 그래프를 원하는지 입력하지 않았기 때문에 위 상태에서는 그래프가 출력되지 않는 것이지요.

여기에 geom 요소를 추가해 볼까요?

geom 요소를 추가하려면 “+geom_원하는 형태의 그래프()”의 형식으로 추가하면 됩니다. 아래는 point (점) 형식으로 그래프를 출력하라는 명령입니다.

ggplot2 기초
가장 기본적인 plot

여기에 미적 요소(aes)를 더하면 색상이나 크기 등이 변하게 되는 것이죠.  aes 요소를 추가하려면 변경하고 싶은 geom 요소(도형이나 점, 선 등)의 괄호 안에 “aes(색상, 크기 등의 원하는 디자인)” 요소를 추가하면 됩니다.

ggplot2 초급
기본 그래프의 색상, 모양, 크기를 변경한 모습

기본 막대 그래프 그리기

예전 포스팅을 통해 롤인벤에서 다운로드 받은 롤챔스에서 프로게이머들의 전적을 클린징 했었죠? 오늘은 이 데이터를 사용해서 기본 막대 그래프를 그려보겠습니다. (데이터:  롤챔스 전적(소스: 롤인벤))

ggplot2에서 막대 그래프를 그리기 위해서는 geom_bar() 형식으로 기하학적 layer를 더해주어야 합니다. 그런데 geom_bar에서 디폴트로 지정되어 있는 “stat” 요소는 stat_bin()이어서 문제가 됩니다. 이 녀석은 그래프를 히스토그램화 하거든요. 즉 어떤 요소의 갯수를 세어서 얼마나 자주 나오는지를 보여준다는 이야기 입니다. 한번 보실까요?

ggplot2 - .히스토그램
geom_bar()에서 아무 것도 설정해 주지 않으면 histogram/도수분포표가 됩니다.

geom_bar()에서는 디폴트로 갯수를 세어주기때문에, 막대 그래프에서 주로 사용하는 합계, 평균 그래프를 그리기 위해서는 데이터를 한번 더 계산해 주어야 합니다.

기본 세로 막대형 그래프 그리기

팀 별 평균 kda를 막대그래프로 그려보겠습니다. 그러기 위해서는 우선 팀별 평균 kda를 계산해 주어야 합니다.

tapply 함수를 사용해서 팀 별 평균을 계산해 준 결과를 mean.df라는 데이터 프레임으로 변환했습니다.

이제 막대 그래프를 그려볼까요? 여기서 주의할 점은 “stat” 요소를 “identity” (데이터 프레임의 값을 그대로 사용해서 그래프를 그리라는 뜻)으로 설정해 주는 것입니다.

ggplot2 막대그래프

Jin Air가 압도적으로 1위이고, KT와 SKT가 2위 경쟁을 하고 있는 모습이네요.

누적 막대형 그래프 그리기

막대 그래프에도 여러 모양이 있는데요, MS Office에서 “누적 막대형 그래프”라고 부르는 그래프를 그려보겠습니다. 아까 데이터에서 팀 별 k, d, a를 기준으로 막대를 색칠해 보겠습니다.  우선 reshape 패키지의 melt 함수를 사용해서 팀 별 k d a 를 계산해 줍니다.

팀 기준으로 k, d, a가 구분되었는데요, 아까와 동일한 방법으로 ggplot2그래프를 만들어 보겠습니다. 팀 별 k, d, a 를 아래 데이터 프레임의 variable 컬럼에 지정한 것이 보이시나요? 이제 그래프를 만들 준비가 다 되었습니다.

누적 막대 그래프를 만들기 위해서는  ggplot 요소에 “fill”을 추가하고, 구분하고 싶은 요소 (여기서는 variable 컬럼에 지정한 k, d, a 가 되겠죠?)를 지정해 주면 됩니다. 아래 코드와 결과 그래프를 확인해 보죠.

barplot2

원하는 대로 팀 별/KDA가 여러 개의 막대 그래프로 표현되었죠?

묶은 세로 막대형 그래프 그리기

그런데…위의 그래프 형태로는 팀별 KDA를 비교하기에는 적합하지 않은 것 같은 느낌이 드네요. 이럴 때 사용하는 그래프가 MS Office에서 소위 “묶은 세로 막대형 그래프”라고 부른 그래프 입니다. (이름이 썩 와닿지는 않네요.)

묶은 세로 막대형 그래프는 구분 기준이 되는 요소 k, d, a를 각각의 막대 그래프로 표시해 주는 것인데요, 막대 모양을 바꿔주려면 아까와 똑같은 ggplot 요소에,  geom_bar에서 position 요소를 “dodge”로 설정하면 됩니다.

Rplot13

100% 기준 누적 세로 막대형 그래프 그리기

백분율 그래프로 바꾸어 볼까요? 아까와 동일한 ggplot 요소에 geom_bar에서 position 요소를 “fill”로 지정해 주면 됩니다.

Rplot15

가로형 막대 그래프 그리기

혹시 가로형 막대 그래프를 보고 싶은 경우도 생기죠? 그럴 때는  coord_flip() 요소를 더하면 됩니다.

Rplot14

 

지금까지 MS Office에서 가장 많이 사용하는 그래프 중 하나인 막대 그래프를 R로 표현하는 방법에 대해 알아보았습니다. 다음 포스팅에서는 MS Office의 다른 기본 그래프들 (꺽은선형, 원형, 영역형, 분산형 등)을 ggplot2로 작성하는 방법을 정리해 보도록 하겠습니다.

 

참고 자료

1) R Studio, Data visualization with ggplot2 cheat sheet

2) Coolbook for R, Bar and line graphs (ggplot2)

3) Statistical Tools for High-throughput Data Analysis, ggplot2 barplots