—
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라고 한다.
- 각각의 변수는 하나의 열로 구성된다.
- 각각의 관찰값은 하나의 행으로 구성된다.
- 하나의 값은 각각의 셀로 구성된다.
긴(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로 설정해야한다는 점이다. 이것은 각각의 선을 하나의 그룹으로 설정한다는 의미이다.
이 경우는 앞의 코드와 같이 각 선의 형태를 각각 설정하는게 상대적으로 쉽다는 점이지만 단점은 범례나 축제목 등을 수동으로 구성해주야 한다는 점이다.
'실전에서 바로 쓰는 시계열 데이터 처리와 분석 in R > 못다한 이야기' 카테고리의 다른 글
시계열 이상치 탐색 in R (8) | 2022.08.24 |
---|---|
시계열 변화점 탐지 (3) | 2021.07.17 |
ggplot2의 Y축 자르기 (0) | 2021.06.26 |
구조적 베이지안 시계열 방법 (0) | 2021.06.14 |
이중 Y축 그리기 in R (5) | 2021.06.08 |
댓글