R 시계열 그래프 - R sigyeyeol geulaepeu

문자 변수를 날짜 변수로 변환하기

R에서 시계열 데이터를 다룰 때, 변수를 날짜 타입으로 변환한다면 플롯을 하는데 간편한 점이 많다. R의 날짜 데이터 타입으로는 "POSIXct" 가 있으며, as.POSIXct 함수를 통해 문자 변수를 POSIXct 타입으로 변환할 수 있다. 반대로 POSIXct 타입을 문자 타입으로 바꾸는 것은 format이나 as.character를 이용한다.  

# create POSIXct variables
as.POSIXct("080406 10:11", format = "%y%m%d %H:%M")
## [1] "2008-04-06 10:11:00 CDT"

as.POSIXct("2008-04-06 10:11:01 PM", format = "%Y-%m-%d %I:%M:%S %p")
## [1] "2008-04-06 22:11:01 CDT"

as.POSIXct("08/04/06 22:11:00", format = "%m/%d/%y %H:%M:%S")
## [1] "2006-08-04 22:11:00 CDT"
# convert POSIXct variables to character strings

format(as.POSIXct("080406 10:11", format = "%y%m%d %H:%M"), "%m/%d/%Y %I:%M %p")
## [1] "04/06/2008 10:11 AM"

as.character(as.POSIXct("080406 10:11", format = "%y%m%d %H:%M"), format = "%m-%d-%y %H:%M")
## [1] "04-06-08 10:11"

만약 어떤 dataframe의 column이 POSIXct 타입이라면, 내부적으로는 정수를 저장하고 있기 때문에 Plot을 할 때는 숫자 형태로 변환하여 데이터를 순차적으로 나타내준다. 

그래프 그리기

data <- read.csv("C:\\workspace\\r\\data\\data.csv")
plot(data$dateFormat, data$value)

R 시계열 그래프 - R sigyeyeol geulaepeu

이렇게 기본 내장함수인 plot을 사용해도 x축을 시간으로 하여 괜찮은 모양으로 그려주는 것을 확인할 수 있다. 만약 x축 값의 포맷을 지정하거나, 적절한 간격을 주고 싶다면 ggplot2 패키지를 이용하는 것도 좋다.

GGPLOT2 라이브러리를 통한 그래프 그리기

library(scales)

ggplot(data = data, aes(x = date, y = value)) + 
    geom_line(size=2) + ylim(0,1000) + xlab("Time") + ylab("㎍/㎥") + 
    scale_x_datetime(breaks = date_breaks("1 hour"), minor_breaks=date_breaks("1 hour"), labels=date_format("%H:%M"), limits=xlim) +
    ggtitle("title") + theme_bw() + theme(text = element_text(size = 25))

ggplot 명령어 설명 

aes : (x축, y축에 사용될 변수를 지정한다.)

geom_line : line plot. size 키워드를 통해 선의 굵기 지정

ylim : y축의 범위를 지정함

xlab : x축 label

ylab : y축 label

scale_x_datetime : x축의 간격, 포맷을 지정함. (library(scales) 이후에 사용할 수 있다.)

ggtitle : title 지정

theme_bw() : 해당 테마 지정 (black & white style)

theme : 그래프의 전반적인 속성을 지정한다. 위에서는 텍스트 사이즈를 25 조정함

특정 날짜 범위에 있는 데이터만 골라내기

아래 코드는 date가 2018/01/16 인 row만 골라서 subset으로 저장한다. 이처럼 format을 통해 POSIXct 데이터 타입을 character 타입으로 변환할 수 있다.

subset <- data[(format(data$date, "%m/%d/%Y") == "01/16/2018")]

참고

http://biostat.mc.vanderbilt.edu/wiki/pub/Main/ColeBeck/datestimes.pdf

R을 이용하여 플롯(그래프)를 그릴때 가장 마음대로 나오지 않는 플롯이 선 플롯이다. 보통 선 플롯은 일변량으로 그리는 경우보다는 다변량으로 그리는 경우가 많기 때문에 한 플롯내에서 여러 변량을 어떻게 다루는가가 매우 중요하다. 이 포스트에서는 ggplot2 패키지를 사용하여 다변량 선 플롯을 만드는 두가지 방법에 대해 살펴보고자 한다.

ggplot2 패키지를 사용하여 다변량 선 플롯을 그리는 방법은 긴(long) 형태의 데이터프레임을 사용하는 방법과 geom_line()을 여러번 사용하여 그리는 두가지 방법이 있다.

먼저 실습에 사용할 데이터를 로딩하겠다.

students.all <- read_excel("./students.xlsx", skip = 16, na = '-', sheet = 1, col_types = c('text', 'text', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric','numeric', 'numeric', 'numeric'))

students <- students.all %>%
  filter(지역규모 == '계') %>% select(-지역규모)

students$연도 <- as.factor(students$연도)

1. 긴(long) 데이터 프레임

R에서 가장 권장하는 데이터 구성방법은 간결한(tidy) 데이터 형태로 데이터를 표현하는 것이다. 이렇게 표현된 데이터를 tidy data라고 표현하는데 다음과 같이 구성될때 tidy data라고 한다.

  1. 각각의 변수는 하나의 열로 구성된다.
  2. 각각의 관찰값은 하나의 행으로 구성된다.
  3. 하나의 값은 각각의 셀로 구성된다.

긴(long) 형태의 데이터프레임은 tidy한 데이터프레임의 여러개의 변수열을 하나의 열로 병합하여 행이 많아져서 전체적인 구조가 아래로 길어지는 형태를 말한다.

tidy한 데이터프레임을 긴 형태의 데이터프레임으로 변환할 때 사용하는 함수가 gather()이다.

앞에서 로딩한 students 데이터프레임은 tidy한 형태이다.

students %>% 
  select(c('연도', '유치원', '초등학교', '중학교', '고등학교계')) %>%
  print
## # A tibble: 22 x 5
##    연도  유치원 초등학교  중학교 고등학교계
##    <fct>  <dbl>    <dbl>   <dbl>      <dbl>
##  1 1999  534166  3935537 1896956    2251140
##  2 2000  545263  4019991 1860539    2071468
##  3 2001  545142  4089429 1831152    1911173
##  4 2002  550256  4138366 1841030    1795509
##  5 2003  546531  4175626 1854641    1766529
##  6 2004  541713  4116195 1933543    1746560
##  7 2005  541603  4022801 2010704    1762896
##  8 2006  545812  3925043 2075311    1775857
##  9 2007  541550  3829998 2063159    1841374
## 10 2008  537822  3672207 2038611    1906978
## # ... with 12 more rows

이 데이터에서 유치원, 초등학교, 중학교, 고등학교계 열만을 사용하여 프레임을 다음과 같이 길게 만들수 있다.

students.long <- students %>% 
  gather(category, values, -연도) %>%
  filter(category %in% c('연도', '유치원', '초등학교', '중학교', '고등학교계')) %>%
  print
## # A tibble: 88 x 3
##    연도  category values
##    <fct> <chr>     <dbl>
##  1 1999  유치원   534166
##  2 2000  유치원   545263
##  3 2001  유치원   545142
##  4 2002  유치원   550256
##  5 2003  유치원   546531
##  6 2004  유치원   541713
##  7 2005  유치원   541603
##  8 2006  유치원   545812
##  9 2007  유치원   541550
## 10 2008  유치원   537822
## # ... with 78 more rows

길게 만든 students.long 데이터프레임을 ggplot2를 사용하여 유치원, 초등학교, 중학교, 고등학교계가 같이 표현되는 다변량 선 틀롯을 다음과 같이 그릴 수 있다.

students.long %>% 
  ggplot(aes(x = 연도, y = values)) +
  geom_line(aes(group = category))

위의 코드에서 주의깊게 살펴야하는 부분이 geom_line()gruop 매개변수이다. 앞에서 긴 형태로 만들때 여러 열을 병합하여 만든 열을 group 매개변수로 설정한 다는 점이다.

이 플롯에는 모두 같은 색깔의 선이 그려지기 때문에 각 변량을 구분할 수 없다. 따라서 색이나 라인 형태로 각 변량을 구분해줄 필요가 있다.

students.long %>% 
  ggplot(aes(x = 연도, y = values)) +
  geom_line(aes(group = category, color = category, linetype = category))

이 경우 장점은 사용하기가 쉽고 자동적으로 범례가 만들어진 다는 점이지만 단점은 grouping되는 열의 일부를 사용한다거나 색깔 설정, 라인타입 설정시에 다소 복잡한 과정을 거쳐야 한다는 점이다.

2. geom_line() 여러번 사용하기

geom_line()을 여러번 사용하여 다변량 선플롯을 그리는 경우는 tidy한 형태의 데이터가 아닐때 사용한다. 결국 geom_line()으로 그리고 싶은 데이터 열을 하나하나 설정하는 방법이다.

students %>%
  ggplot(aes(연도)) +
##  geom_line(aes(y = 학생수계, group = 1)) +
  geom_line(aes(y = 유치원, group = 1), color = 'dark grey', linetype = 1) +
  geom_line(aes(y = 초등학교, group = 1), color = 'dark grey', linetype = 1) +
  geom_line(aes(y = 중학교, group = 1), color = 'dark grey', linetype = 1) +
  geom_line(aes(y = 고등학교계, group = 1), color = 'red', linetype = 2)

위의 코드와 같이 geom_line()을 사용하여 유치원, 초등학교, 중학교, 고등학교계 열을 각각 그려주는 방식이다. 하나 주의해야할 것은 group 매개변수를 1로 설정해야한다는 점이다. 이것은 각각의 선을 하나의 그룹으로 설정한다는 의미이다.

이 경우는 앞의 코드와 같이 각 선의 형태를 각각 설정하는게 상대적으로 쉽다는 점이지만 단점은 범례나 축제목 등을 수동으로 구성해주야 한다는 점이다.