[R] ggplot2로 시각화 쉽게 시작하기

데이터를 수치로만 보는 것에는 한계가 있다. 숫자로 된 표는 정확하지만 전체적인 경향이나 패턴, 이상치, 그룹 간 차이를 직관적으로 파악하기는 어렵다. 그래서 데이터 분석에서는 시각화가 반드시 필요하다.

R에는 다양한 시각화 도구가 있지만 그중에서도 가장 강력하고 유연한 도구가 바로 ggplot2 패키지이다. ggplot2는 그래픽 문법(Grammar of Graphics)에 기반해 시각화 요소를 조합하는 방식으로 작동하며, 단순한 막대 그래프부터 복잡한 다중 그래프까지 폭넓게 표현할 수 있는 체계적인 구조를 가지고 있다.

ggplot2를 처음 접하는 사용자를 위해 기본 문법과 자주 사용하는 시각화 예제를 순서대로 소개한다.

데이터 준비

이번에도 dplyr과 함께 제공되는 starwars 데이터셋을 활용한다. 이 데이터는 스타워즈 영화에 등장하는 캐릭터의 키, 몸무게, 종족, 고향 행성 등 다양한 정보를 담고 있어 시각화 연습에 적합하다. 먼저 패키지를 설치하고 데이터를 확인해보자.

install.packages("ggplot2")
library(ggplot2)
library(dplyr)

# 데이터 확인
glimpse(starwars)
R

기본 문법 구조

ggplot2는 아래와 같은 구조로 구성된다.

ggplot(data = 데이터셋, aes(x = 가로축, y = 세로축)) +
  지오메트리함수() +
  테마  옵션()
R

이 구조에서 핵심은 aes() (aesthetic mappings)이며, 어떤 변수를 시각화할 것인지를 지정한다. + 기호는 시각화 요소를 누적적으로 덧붙인다는 의미이며, 파이프 %>%와는 다르다.

산점도: 키 vs 몸무게

먼저 키와 몸무게의 관계를 산점도로 나타내 보자.

starwars %>%
  filter(!is.na(height), !is.na(mass)) %>%
  ggplot(aes(x = height, y = mass)) +
  geom_point() +
  labs(title = "키와 몸무게의 관계", x = "Height (cm)", y = "Mass (kg)")
R
  • geom_point( )는 산점도(Scatter Plot)를 그리는 함수이다.
  • labs( )는 제목과 축 이름을 지정하는 함수이다.

막대 그래프: 종족별 인원 수

범주형 변수를 시각화할 때는 막대 그래프가 효과적이다.

starwars %>%
  filter(!is.na(species)) %>%
  count(species) %>%
  ggplot(aes(x = reorder(species, -n), y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "종족별 캐릭터 수", x = "종족", y = "인원 수") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
R
  • count(species)는 종족별 인원 수를 계산한다.
  • reorder( )는 막대를 인원 수 기준으로 정렬한다.
  • theme( )는 축 이름 글씨를 기울여 가독성을 높인다.

히스토그램: 키 분포

개별 변수의 분포를 확인할 때는 히스토그램이 유용하다.

starwars %>%
  filter(!is.na(height)) %>%
  ggplot(aes(x = height)) +
  geom_histogram(binwidth = 10, fill = "darkgreen", color = "white") +
  labs(title = "캐릭터 키의 분포", x = "Height (cm)", y = "빈도")
R
  • geom_histogram()은 연속형 변수의 분포를 구간(bin)별로 나눠 시각화한다.
  • binwidth = 10은 키를 10cm 단위로 구간 설정한다.

박스플롯: 종족별 키 분포

박스플롯은 그룹별로 데이터의 중앙값, 사분위수, 이상치를 한눈에 보여준다.

starwars %>%
  filter(!is.na(height), !is.na(species)) %>%
  ggplot(aes(x = species, y = height)) +
  geom_boxplot(fill = "tomato", alpha = 0.7) +
  labs(title = "종족별 키 분포", x = "종족", y = "Height (cm)") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
R
  • 각 종족의 키 분포를 비교할 수 있다.
  • 이상치(outlier)가 점으로 나타난다.

색상과 그룹 적용

색상으로 성별을 구분하면 비교가 더 직관적이 된다.

starwars %>%
  filter(!is.na(height), !is.na(mass), !is.na(sex)) %>%
  ggplot(aes(x = height, y = mass, color = sex)) +
  geom_point(size = 3, alpha = 0.8) +
  labs(title = "성별에 따른 키와 몸무게", x = "Height (cm)", y = "Mass (kg)")
R

요약 정리

함수설명
ggplot( )시각화의 시작, 데이터와 aes() 지정
geom_point( )산점도 (연속형 변수 간 관계)
geom_bar( )막대그래프 (범주형 변수 빈도)
geom_histogram( )히스토그램 (연속형 변수 분포)
geom_boxplot( )박스플롯 (그룹 간 분포 비교)
labs( )제목, 축 이름 등 설정
theme( )시각적 요소(글꼴, 각도 등) 조정

마무리하며

ggplot2는 단순히 그래프를 그리는 도구를 넘어서 데이터를 스토리텔링하는 시각적 언어이다. 패턴을 찾고 인사이트를 전달하는 데에 가장 직관적이고 강력한 도구이며, R의 대표적인 시각화 시스템으로 자리잡았다.

1. ggplot2는 항상 ggplot( )으로 시작하고, + 기호로 구성 요소를 차례로 덧붙이는 방식이다.

2. 데이터 전처리는 가능하면 dplyr을 통해 먼저 수행하고, ggplot2에서는 시각화에 집중하는 것이 좋다.

3. aes( ) 내부에는 변수명만 쓰고, 숫자나 문자 등의 값은 바깥에서 설정한다.

4. 히스토그램과 막대그래프는 헷갈리기 쉬운데, 히스토그램은 연속형 데이터, 막대그래프는 범주형 데이터를 다룬다.

scroll to the top of the site