ggplot2- 그래프 겹치기
본 포스팅에서는 ggplot2를 이용해 2개의 plot을 겹쳐 그리려 합니다.
아래와 같이 데이터 생성 및 변환을 위해 library를 추가해 줍니다.
설명을 덧붙이자면 dplyr 은 %>% chaining operation을 위해 추가했습니다.
reshape 는 melt, cast 함수로 데이터 변환을 편하게 하기 위해 추가했습니다.
changepoint 는 cpt.mean cpt.var 등의 함수로 통계적인 change point 를 선별해 냅니다. 단 한개만 찾을 수도 있고 최대 개수를 지정할 수 있습니다.
TTR은 Moving Standard Deviation 을 간단히 계산해줄 수 있는 runSD 함수를 포함하고 있습니다.
ggplot2는 그래프 시각화 패키지입니다.
# 0. set-----------------------------------------------
library(dplyr)
library(reshape)
# install.packages("changepoint")
library(changepoint)
library(TTR)
library(ggplot2)
다음은 100점 점수 변환, 가상 sample 데이터를 생성하는 과정입니다. scale을 써서 더 간단히 변환할 수 있고 sample 을 써서 더 다양하게 생성해 낼 수 있지만 그냥 만들어 봤습니다.
# 1. virtual input--------------------------------------------------------------
values<-rnorm(40, mean=0, sd = 1) %>%{. - min(.)} %>% { c(.)/max(.)} *100
inputs<-data.frame(tgt_id=rep("4SD",40), parameter=c(rep("var1",20),rep("var2",20)), value=values, step_id=c(1:20, 1:20), stringsAsFactors = F)
다음은 runSD를 돌려 Moving SD를 생성하는 과정입니다.
runSD(x=, n=) 함수의 parameter중 n 은 붙어있는 몇개의 input의 개수로 편차를 계산하는지 설정하는 값입니다.
여기서 runSD의 n 을 4로 뒀기 때문에 inputs$runSD[1:3] 값은 NA 가 됩니다.
이를 버릴 수는 없어서 표준편차로 na 값을 교체해줍니다. (na.replace 라는 메소드도 있긴한데 사용하지 않았습니다.)
inputs$value<-scale(inputs$value)
inputs[["runSD"]]<-inputs %>%
group_by(tgt_id, parameter, step_id) %>%
{runSD(x={.$value}, n=4)}
inputs$runSD[is.na(inputs$runSD)]<-sd(inputs$value)
다음은 plot 을 겹치는 과정 입니다.
보시다시피 ggplot() 을 시작으로 연이어 그릴 때는 ggplot()을 다시 사용할 수 없습니다.
inputs 에 value , runSD 라는 컬럼이 존재하여 처음엔 파란색의 value 값을 그려주고
geom_line 으로 마지막에 runSD 를 빨간색으로 그려줍니다.
gg<-ggplot(inputs, aes(x=1:nrow(inputs), y=value) )
gg+geom_line(color="blue")+geom_line(aes(x=1:nrow(inputs),y=runSD), color="red")
이 다음 작업은 changepoint 를 찾아내는 겁니다.
cpt.var 사용법은 단순 합니다. Q 는 최대 change point 개수를 의미 합니다. 그리고 data 로 change point 를 찾아냅니다.
상세한 사용방법은 help(cpt.var) 로 볼 수 있습니다. 기대한 만큼의 정화도는 나오지 않고 있습니다.
cpcp<-cpt.var(inputs$runSD, Q=1) ## 맥시멈 1
gg<-ggplot(inputs, aes(x=1:nrow(inputs), y=value) )
gg+geom_line(color="blue")+
geom_line(aes(x=1:nrow(inputs),y=runSD),color="red")+geom_vline(xintercept =cpcp@cpts , color="green", cex=1)
'정리 > 데이터 분석' 카테고리의 다른 글
[R] R 초보도 할 수 있는 Selenium을 이용한 크롤링 (0) | 2018.10.25 |
---|---|
[R] 극값 Local Maximum(Minimum) Point With R (0) | 2018.10.24 |
[R] Bitcoin 데이터로 Envelope 와 Bollinger Band 그리기 (ggplot2) (0) | 2018.10.22 |
[R] dplyr 사용하여 초보에서 중급되기 (0) | 2018.10.18 |
jupyter notebook server 에 이상한 접속 시도! (0) | 2018.08.29 |