본문 바로가기
프로그래밍 언어/R

R 7. 그래프 만들기

by Jinger 2024. 1. 31.

서론

    데이터를 쉽게 그림으로 표현한 것을 '그래프(Graph)'라고 한다. 데이터 원자료나 통계표는 수많은 숫자와 문자로 구성되어 있어서 의미를 파악하기 어렵다. 데이터를 그래프로 표현하면 추세와 경향성이 드러나기 때문에 특징을 쉽게 이해할 수 있다. 이번에는 앞서 데이터를 파악하고, 가공하고, 정제한 데이터를 가지고 그래프를 만들어보자.


산점도

    데이터를 x축과 y축에 점으로 표현한 그래프를 '산점도(Scatter Plot)'라고 한다. 산점도는 나이와 소득처럼 연속 값으로 된 두 변수의 관계를 표현할 때 사용한다. ggplot2 문법은 레이어(layer) 구조로 되어 있다. 을 만들고(1 layer), 그 위에 그래프 형태를 그리고(2 layer), 마지막으로 축 범위, 색, 표식 등 설정을 추가하는(3 layer) 순서로 그래프를 만든다. 즉, 산점도 함수의 형태는 '데이터 축 + 그래프 종류 + 세부 설정'으로 표현한다.

   우선 mpg 데이터의 displ(배기량) 변수를 x축에, hwy(고속도로 연비) 변수에 y축에 놓고 배경을 만든다.

library(ggplot2)

# x 축은 displ, y축은 hwy로 지정해 배경  생성
ggplot(data = mpg, aes(x = displ, y = hwy))

    배경을 만들고 그 위에 그래프를 그릴 예정이다. '+' 기호를 이용해 그래프 유형을 지정하는 함수를 추가하면 된다. 여기서는 산점도를 그리는 함수 'geom_point()'를 추가한다. 만약 'dplyr' 패키지 함수들은 '%>%'기호로 연결하는 반면 'ggplot2' 패키지 함수들은 '+' 기호로 연결한다.

# 배경 산점도 추가
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point()

    축은 기본적으로 최솟값에서 최댓값까지 모든 범위의 데이터가 표현되도록 설정되어 있다. 데이터 전체가 아니라 일부만 표현하고 싶을 때 축 범위를 설정하면 된다. 축 범위는 'xlim()'과  'ylim()'을 이용해 지정할 수 있다.

# x축 범위 3~6으로 지정
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6)

# x축 범위 3~6으로 지정, y 축 범위 10~30 지정
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6) + ylim(10, 30)


막대그래프

   '막대그래프(Bar Chart)'는 데이터의 크기를 막대의 길이로 표현한 그래프이다. 성별 소득 차이처럼 집단 간 차이를 표현할 때 주로 사용된다. 막대그래프에 사용할 예시를 가져와보자.

 libraary(dplyr)
 
 df_mpg <- mpg %>% group_by(drv) %>% summarise(mean_hwy = mean(hwy))
 
## # A tibble: 3 × 2
##   drv   mean_hwy
##   <chr>    <dbl>
## 1 4         19.2
## 2 f         28.2
## 3 r         21

    앞에서 만든 데이터 프레임을 이용해 막대 그래프를 만들었다. 'aes'의 x축에 범주를 나타내는 변수를 지정하고, y축에 평균값을 나타내는 변수를 지정한다. '+'기호로 연결해 막대 그래프를 만드는 함수 'geom_col()'을 추가한다.

# 그래프 생성하기
ggplot(data = df_mpg, aes(x = drv, y = mean_hwy)) + geom_col()

   막대는 기본적으로 범주의 알파벳 순서로 정렬된다. 앞에서 출력한 'drv' 막대가 '4, f, r' 순으로 정렬되어 있다. 'reorder()'를 사용하면 막대를 값의 크기 순으로 정렬할 수 있다. 'reorder()'에 x축 변수와 정렬 기준으로 삼을 변수를 지정하면 되다. 정렬 기준 변수 앞에 '-' 기호를 붙이면 내림차순으로 정렬한다.

# 크기 순으로 정렬하기
ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col()

빈도 그래프

    빈도 막대 그래프는 값의 개수(빈도)로 막대의 길이를 표현한 그래프이다. 빈도 막대 그래프를 만들려면 y축 없이 x축만 지정하고, 'geom_col()' 대신 'geom_bar()'를 사용하면 된다.

ggplot(data = mpg, aes(x = hwy)) + geom_bar()


선 그래프

    데이터를 선으로 표현한 그래프를 '선 그래프(Line Chart)'라고 한다. 시간에 따라 달라지는 데이터를 표현할 때 주로 선 그래프를 이용한다. 일정 시간 간격을 두고 나열된 데이터를 '시계열 데이터(Time Series Data)'라고 하고, 시계열 데이터를 선으로 표현한 그래프를 '시계열 그래프(Time Series Chart)'라고 한다.

    시계열 데이터에 적합한 'ggplot2'의 'economics'를 이용해 x축에는 시간을 의미하는 'date', y축에는 실업자 수를 의미하는 'unempoly'를 지정하고, 선 그래프로 표현하기 위해 'geom_line()'을 추가한다.

ggplot(data = economics, aes(x = date, y = unemploy)) + geom_line()


상자 그림(Box Plot, 박스 플롯)

    이전 블로그에서 사용한 '상자 그림'(Box Plot, 박스 플롯)은 데이터의 분포를 직사각형 상자 모양으로 표현한 그래프이다. 상자 그림을 보면 분표를 알 수 있기 때문에 평균만 볼 때보다 데이터의 특징을 더 자세히 이해할 수 있다.

ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot()

   상자 그림은 값을 크기 순으로 나열해 4 등분했을 대 위치하는 값인 '사분위수'를 이용해 그려진다.

상자 그림 설명
상자 아래 세로선 아랫수염 하위 0~25% 내에 해당하는 값
상자 밑면 1분위수(Q1) 하위 25% 위치 값
상자 내 굵은 선 2분위수(Q2) 하위 50% 위치 값(중앙값)
상자 윗면 3분위수(Q3) 하위 75% 위치 값
상자 위 세로선 윗수염 하위 75~100% 내에 해당하는 값
상자 밖 점 표식 극단치 Q1, Q3 밖 1.5 IQR을 벗어난 값

주섬주섬

  • 그래프를 이미지 파일로 저장하기 위해 플롯 창 메뉴에 있는 "Export" 버튼을 눌러 저장하면 된다.

  • 아래는 연습 예제이다.
더보기

1.'mpg' 데이터의 'cty'(도시 연비)와 'hwy'(고속도로 연비) 간에 어떤 관계가 있는지 알아보려고 한다. x축은 'cty', y축은 'hwy'로 된 산점도를 만들어보자.

2.미국 지역별 인구통계 정보를 담은 'ggplot2' 패키지의 'midwest' 데이터를 이용해 전체 인구와 아시아인 인구 간에 어떤 관계가 있는지 알아보자. x축은 'poptotal'(전체 인구), y축은 'popasian'(아시아인 인구)으로 된 산점도를 만들어 보자. 전체 인구는 50만 명 이하, 아시아인 인구는 1만 명 이하인 지역만 산점도에 표시되게 설정하라.

3.어떤 회사에서 생산한 'suv'차종의 도시 연비가 높은지 알아보려고 한다. 'suv'차종을 대상으로 평균 'cty'(도시 연비)가 가장 높은 회사 다섯 곳을 막대그래프로 표현해 보자. 막대는 연비가 높은 순으로 정렬하자.

4.자동차 중에서 어떤 'class'(자동차 종류)가 가장 많은지 알아보려고 한다. 자동차 종류별 빈도를 표현한 막대그래프를 만들어보자.

5.'ecomomics'데이터를 이용해 'psacert'(개인 저축률)가 시간에 따라 어떻게 변해 왔는지 알아보려고 한다. 시간에 따른 개인 저축률의 변화를 시계열 그래프를 만들어보자.

6.'class'(자동차 종류)가 'compact', 'subcompact', 'suv'인 자동차의 'cty'(도시 연비)가 어떻게 다른지 비교해 보자. 세 차종의 'cty'를 나타낸 상자 그림을 만들어 보자.

  • 아래는 정리이다.
더보기
내용
geom_point() 산점도
geom_col() 막대 그래프 - 요약표
geom_bar() 막대 그래프 - 원자료
geom_line() 선 그래프
geom_boxplot() 상자 그림
## 1.산점도
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point()

# 축 설정 추가
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6) + ylim(10, 30)

## 2.평균 막대 그래프
# 1단계. 평균표 만들기
df_mpg <- mpg %>% group_by(drv) %>% summarise(mean_hwy = mean(hwy))

# 2단계. 그래프 생성하기, 크기 순 정렬하기
ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col()

## 3.빈도 막대 그래프
ggplot(data = mpg, aes(x = drv)) + geom_bar()

## 4.선 그래프
ggplot(data = economics, aes(x = date, y = unemploy)) + geom_line()

## 5.상자 그림
ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot()
반응형

'프로그래밍 언어 > R' 카테고리의 다른 글

R 9. 텍스트 마이닝  (0) 2024.02.02
R 8. 데이터 분석하기  (0) 2024.02.01
R 6. 데이터 정제하기  (0) 2024.01.30
R 5. 데이터 가공하기  (0) 2024.01.29
R 4. 데이터 파악하기  (2) 2024.01.27

댓글