13.6 누적 영역 그래프

시간의 흐름에 따른 그룹/집단 별 관측값 혹은 비율의 변화를 누적해서 볼 수 있는 그래프가 누적 영역 그래프 (Stacked Area Plot) 입니다. 엑셀에서 많이 볼 수 있는 그래프입니다.

영역 그래프는 정량적 데이터를 보여주는 그림입니다. R은 ggplot2 패키지를 사용하여 영역 차트를 표시하는 표준 함수로 geom_area() 함수를 제공하고 있으며, 데이터 점 위에 선을 그리는 geom_line() 함수를 제공합니다.

영역 그림은 정량적 데이터의 분포를 나타내는 선 그래프의 한 종류입니다. 이 차트에는 데이터 점이 표시되고, 여러 기간에 걸친 데이터 점 또는 값의 양을 표시하기 위해 이 데이터 점들을 선으로 결합합니다.

이 절에서는 ggplot2 라이브러리를 사용하여 영역 차트를 만듭니다. geom_area() 함수를 사용하는 것을 알고 있다면 R에서 아름다운 영역 차트를 만드는 데 몇 단계밖에 걸리지 않습니다.

13.6.1 패키지 불러오기와 데이터 생성

13.6.1.1 패키지 불러오기

#imports the ggplot2 library
library(tidyverse)

13.6.1.2 데이터 출처

이 절에서 사용할 데이터는 2007년부터 2014년까지의 한국 수/출입 무역량 (단위: 1 B$) 데이터를 가지고 수출수입으로 구분하여서 ggplot2geom_area() 함수를 사용하여 누적 영역 그래프(Stacked Area Plot) 를 그려보도록 하겠습니다.

아래는 2007년부터 2014년까지의 한국 수/출입 무역량 (단위: 1 B$) 데이터를 링크해두었습니다.

(☞ 한국 수/출입 무역량 데이터 다운로드 img trade_stat_07_14.csv)

* 출처 : 국가무역통계 KOSIS, http://kosis.kr/statisticsList/statisticsList_01List.jsp?vwcd=MT_ZTITLE&parmTabId=M_01_01#SubCont)

Go Top

13.6.1.3 데이터 세트 생성하기

누적 영역 그래프로 시각화할 데이터를 불러와 다음과 같이 데이터 전처리를 하여 trade 라는 데이터 세트를 생성해 줍니다.

  • csv 데이터 파일을 불러옵니다.
  • Time 컬럼에서 앞의 4자리만 취해서 Year 변수를 생성합니다.
  • Year 단위로 수출입 금액을 합계를 해 줍니다. 수출 합계액은 Export, 수입 합계약은 Import로 변수 이름을 지정해 줍니다.
  • Year 단위로 수출입 금액의 합계 비율(Export.ratio, Import.ratio)을 구합니다.
  • 수출입 금액의 단위가 1,000\(로 되어 있는데 이를 1 B\)로 바꾸기 위해 1,000,000으로 나누어 줍니다.
  • 그리고 마지막으로 Wide 형태의 데이터 프레임을 Year, Category, Amount 등의 세 개의 컬럼으로 구성되는 Long 형태로 변환해 줍니다.
  • 마지막으로 문자형인 Year 컬럼을 정수형으로 변환해 줍니다.
# CSV 파일 불러오기
trade_stat <- read.csv("data/trade_stat_07_14.csv", header = TRUE)

# Time 컬럼에서 앞의 4자리 연도만 추출하여 Year 컬럼 생성
trade_stat <- transform(trade_stat, Year = substr(Time, 1, 4))

# Year 단위로 수출입 금액의 합계(Export, Import)를 구합니다.
trade_stat_year <- trade_stat %>% 
      group_by(Year) %>% 
      summarise(Export.amount = round(sum(export_amt) / 1000000, 0),
                Import.amount = round(sum(import_amt) / 1000000, 0))
trade_stat_year
## # A tibble: 8 x 3
##   Year  Export.amount Import.amount
##   <chr>         <dbl>         <dbl>
## 1 2007            371           357
## 2 2008            422           435
## 3 2009            364           323
## 4 2010            466           425
## 5 2011            555           524
## 6 2012            548           520
## 7 2013            560           516
## 8 2014            573           526
# Year 단위로 수출입금액 합계(Export, Import)의 비율을 구합니다.
trade_stat_year$Export.ratio <- round((trade_stat_year$Export.amount / (trade_stat_year$Export.amount + trade_stat_year$Import.amount))*100, 1)
trade_stat_year$Import.ratio <- round((trade_stat_year$Import.amount / (trade_stat_year$Export.amount + trade_stat_year$Import.amount))*100, 1)

trade_stat_year
## # A tibble: 8 x 5
##   Year  Export.amount Import.amount Export.ratio Import.ratio
##   <chr>         <dbl>         <dbl>        <dbl>        <dbl>
## 1 2007            371           357         51           49  
## 2 2008            422           435         49.2         50.8
## 3 2009            364           323         53           47  
## 4 2010            466           425         52.3         47.7
## 5 2011            555           524         51.4         48.6
## 6 2012            548           520         51.3         48.7
## 7 2013            560           516         52           48  
## 8 2014            573           526         52.1         47.9
longer<-pivot_longer(trade_stat_year, 
                     cols = -1, 
                     names_pattern = "(......).(.....)", 
                     names_to = c("Type", "Category")) %>% 
     mutate(Category = ifelse(Category == "ratio", "Ratio", "Amount"))
longer
## # A tibble: 32 x 4
##    Year  Type   Category value
##    <chr> <chr>  <chr>    <dbl>
##  1 2007  Export Amount   371  
##  2 2007  Import Amount   357  
##  3 2007  Export Ratio     51  
##  4 2007  Import Ratio     49  
##  5 2008  Export Amount   422  
##  6 2008  Import Amount   435  
##  7 2008  Export Ratio     49.2
##  8 2008  Import Ratio     50.8
##  9 2009  Export Amount   364  
## 10 2009  Import Amount   323  
## # ... with 22 more rows
trade <-pivot_wider(longer, 
                     id_cols = c(Year, Type), 
                     names_from = Category, 
                     values_from = value, 
                     names_repair = "check_unique")
trade
## # A tibble: 16 x 4
##    Year  Type   Amount Ratio
##    <chr> <chr>   <dbl> <dbl>
##  1 2007  Export    371  51  
##  2 2007  Import    357  49  
##  3 2008  Export    422  49.2
##  4 2008  Import    435  50.8
##  5 2009  Export    364  53  
##  6 2009  Import    323  47  
##  7 2010  Export    466  52.3
##  8 2010  Import    425  47.7
##  9 2011  Export    555  51.4
## 10 2011  Import    524  48.6
## 11 2012  Export    548  51.3
## 12 2012  Import    520  48.7
## 13 2013  Export    560  52  
## 14 2013  Import    516  48  
## 15 2014  Export    573  52.1
## 16 2014  Import    526  47.9
# 마지막으로 Year 컬럼을 정수형으로 변환해 줍니다.
trade$Year <- as.integer(trade$Year)
trade
## # A tibble: 16 x 4
##     Year Type   Amount Ratio
##    <int> <chr>   <dbl> <dbl>
##  1  2007 Export    371  51  
##  2  2007 Import    357  49  
##  3  2008 Export    422  49.2
##  4  2008 Import    435  50.8
##  5  2009 Export    364  53  
##  6  2009 Import    323  47  
##  7  2010 Export    466  52.3
##  8  2010 Import    425  47.7
##  9  2011 Export    555  51.4
## 10  2011 Import    524  48.6
## 11  2012 Export    548  51.3
## 12  2012 Import    520  48.7
## 13  2013 Export    560  52  
## 14  2013 Import    516  48  
## 15  2014 Export    573  52.1
## 16  2014 Import    526  47.9

Go Top

13.6.2 기본 단순 영역 그래프 그리기

누적 영역 그래프를 그리기에 앞서 단순 영역 그래프를 그려 보겠습니다.

단순 영역 그래프를 그리기 위해 연도별 수입(Import) 금액만을 선택해서 trade1 데이터 세트를 생성하겠습니다.

trade1 <- trade[trade$Type=="Import", ]
trade1
## # A tibble: 8 x 4
##    Year Type   Amount Ratio
##   <int> <chr>   <dbl> <dbl>
## 1  2007 Import    357  49  
## 2  2008 Import    435  50.8
## 3  2009 Import    323  47  
## 4  2010 Import    425  47.7
## 5  2011 Import    524  48.6
## 6  2012 Import    520  48.7
## 7  2013 Import    516  48  
## 8  2014 Import    526  47.9

이제 trade1 데이터 세트를 기반으로 년도별 수입액(Import)의 단순 영역 차트는 geom_area() 함수를 이용하여 다음과 같이 작성할 수 있습니다.

#plots the area chart
ggplot(trade1, aes(x = Year, 
                   y = Amount)) +
      geom_area(fill='#142F86', alpha = 0.8)  +
     ggtitle("기본 단순 영역 그래프 그리기")
기본 단순 영역 그래프 그리기

Figure 13.57: 기본 단순 영역 그래프 그리기

Go Top

13.6.3 기본 누적 영역 그래프 그리기

앞에서 년도별로 한 항목에 해당하는 수입 합계액(Import)을 단순 영역 그래프로 표시해 보았습니다. 이번 절에서는 수입 합계액(Import)과 수출 합계액(Export)을 년도별로 누적 영역 그래프에 시각화 해 보겠습니다.

ggplot() 함수 내에 있는 aes() 함수 내의 fill = 모수에 수출과 수입을 구분해 주는 Category를 기입해 주면 년도별 수출 합계액과 수입 합계액이 누적 영영 그래프에 표시되게 됩니다.

# 기본 누적 영역 그래프
ggplot(trade,
       aes(x = Year, 
           y = Amount,
           fill = Type)) +
     geom_area()   +
     ggtitle("기본 누적 영역 그래프 그리기")
기본 누적 영역 그래프 그리기

Figure 13.58: 기본 누적 영역 그래프 그리기

Go Top

13.6.4 비율 기준의 누적 영역 그래프

이번에는 비율 기준으로 해서 누적 영역 그래프를 그려보겠습니다. 이를 위해서 trade 데이터 세트를 생성할 때 년도별 수출액 비율(Export.ratio)과 수입액 비율(Import.ration)을 계산한 바 있습니다.

ggplot(trade,
       aes(x = Year, 
           y = Ratio,
           fill = Type)) +
     geom_area() +
     ggtitle("비율 기준의 누적 영역 그래프")
비율 기준의 누적 영역 그래프

Figure 13.59: 비율 기준의 누적 영역 그래프

Go Top

13.6.5 테마 사용

위의 절에서 단순 영역 차트를 누적 영역 차트로 향상시켜 보았습니다.이번에는 글꼴, 색상 그리고 스타일 등을 누적 영역 차트에 추가해 보겠습니다. 이번에는 viridis 패키지를 사용하겠습니다.

viridis 패키지는 그래프에 색상과 다른 스타일을 추가하는 데 도움이 되는 시각화 라이브러리입니다. Viridis 패키지를 설치하려면 R Studio의 Console 창에서 아래의 코드를 실행하십시오.

그리고 hrbrthemes 라이브러리도 활용하겠습니다. hrbrthemes 패키지는 다양한 그래프 테마를 제공하는 패키지입니다.

install.packages(c('virdis', 'hrbrthemes'))

13.6.5.1 패키지 불러오기

viridis 패키지와 hrbrthemes 패키지를 불러옵니다.

#impots the required libraries 
library(viridis)
## Loading required package: viridisLite
library(hrbrthemes)
## Warning: package 'hrbrthemes' was built under R version 4.0.5
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
##       Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
##       if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow

여기서는 theme_ipsum() 테마를 사용하여 그래프의 제목, 축 제목, 영역의 색상, 그리고 차트 내의 그리드 표현 등을 다양하게 설정해 보겠습니다.

hrbrthemes 패키지에 대한 자세한 사항은 ? hrbrthemes으로 확인하기 바랍니다.

# 제목, 색 그리고 스타일 지정하기
ggplot(trade,
       aes(x = Year, 
           y = Amount,
           fill = Type)) +
     geom_area(size = 0.5, alpha = 0.8, color = 'yellow') +
     scale_fill_viridis(discrete = TRUE) +
     theme_ipsum() +
     ggtitle("viridis 패키지를 이용한 사용자 설정")
viridis 패키지를 이용한 사용자 설정

Figure 13.60: viridis 패키지를 이용한 사용자 설정

Go Top