요즘 재현성 있는 리서치를 하기 위한 R에서의 툴들이 많이 나오고 있다. 금번 UseR! 2012에서도 이 주제가 가장 큰 주제중에 하나였다.
우리가 실험, 데이터 분석, 논문작성과 같은 리서치 업무를 수행하면서 코드와 데이터, 그리고 문서화를 분리함으로써 나오는 오류를 줄이고, 이를 하나로 통합하여 관리하고자 하는게 핵심이다. 이는 단순한 리서치에서만 통용되는 문제가 아니라, 데이터 분석 업무 전반에 걸친 문제와도 같다.
문서와 코드를 분리해서 작성하게 되면, 알고리즘과 문서 그리고 코드의 불일치가 발생할 수 있다. 따라서 따로 이 세가지를 작성하여 관리한다는 건 굉장한 정력이 낭비되는 일이 되고 만일 다른 사람이 분석 업무를 받게 된다고 해도 이를 인계하는 작업 자체에 큰 짐으로 작용하게 된다.
이를 위해 기존의 Sweave와 knitr이 나오게 되었고, 얼마전 RStudio에서는 knitr을 기반으로 하는 R Markdown이라는 기능을 제공하게 되었다.
개인적인 생각으로는 이제 데이터 분석을 기반으로 하는 논문에서 R을 사용하는게 논문 재현성을 높이는 가장 좋은 방법이 될 날도 머지 않을 거라 생각한다. R 사용 유무와 이런 knitr이나 Sweave 사용 유무가 논문의 재현성을 담보하는 그런 중요한 지표중에 하나가 될 거란 말이다.
RStudio에서 제공하는 R Markdown 기능은 코드와 문서를 Rmd파일로 작성하고 이것을 HTML파일로 컴파일 하여 웹에 공유하거나 다른 곳에 저장함으로써 분석 작업 문서를 공유하기 위한 기능이다. 이 기능을 사용하면 흡사 위키 문법과 같은 문서 작성법으로 문서작업을 하고 R코드를 태그로 임베딩하여 실행 및 디스플레이를 하고, 플로팅한 결과를 HTML 파일에 임베딩해서 보여주는 문서화 작업의 일련과정을 하나의 파일로 관리하게끔 지원한다.
예전에 올린 타이타닉 데이터 분석 코드를 R Markdown으로 아래와 같이 작성해서 컴파일을 해보자!
Titanic data analysis ======================================================== 이 문서는 타이타닉 데이터 분석을 위한 **R Markdown** 문서이다. 한글을 테스트 하기 위한 목적과 더불에 Markdown의 적용 가능성을 확인해 보고자 한다. ```{r codes,echo=TRUE, results='hide', message=FALSE} library(data.table) library(ggplot2) library(scales) library(party) titanic <- read.csv("titanic.csv") titanic.dt <- as.data.table(titanic) titanic.dt$survived <- as.factor(titanic.dt$survived) titanic.dt[,isminor:="adult"] titanic.dt[age < 15,isminor:="child"] titanic.dt$isminor <- as.factor(titanic.dt$isminor) titanic.dt[, list(prob_as_class=length(which(survived == 1))/nrow(.SD)), by=pclass] titanic.dt[, list(prob_as_sex=length(which(survived == 1))/nrow(.SD)), by=sex] titanic.dt[, list(prob_as_sex=length(which(survived == 1))/nrow(.SD)), by=isminor] survived_pclass_sex <- titanic.dt[, list(cntsurv=length(which(survived == 1)), cntdie=length(which(survived == 0))), by=list(pclass, sex)][,list(psurvived=cntsurv/(cntsurv + cntdie)),by=list(pclass, sex)] survived_pclass_sex_isminor<- titanic.dt[,list(cntsurv=length(which(survived == 1)), cntdie=length(which(survived == 0))),by=list(pclass, sex, isminor)][,list(psurvived=cntsurv/(cntsurv + cntdie)),by=list(pclass, sex, isminor)] survived_pclass_sex_isminor$sex_age <- apply(survived_pclass_sex_isminor[,list(sex,isminor)], 1, paste, collapse="_") ``` 아래는 성별나이, 승객등급에 따른 생존율을 보여주는 그래프이다. ------------------------ ```{r ggplot2,fig.width=7, fig.height=6,echo=TRUE, results='hide', message=FALSE} ggplot(survived_pclass_sex_isminor, aes(pclass, sex_age)) + geom_tile(aes(fill=psurvived)) + scale_fill_gradient2("probability of survival", low=muted("white"), high=muted("blue")) + xlab("grade of class") + ylab("sex and age") ``` 아래는 conditional inference tree 그래프이다. ------------------------ ```{r code2, echo=TRUE, results='hide'} formu <- as.formula("survived ~ sex + isminor + pclass ") mdl <- ctree(formu, titanic.dt) ``` ```{r ggplot2_2, fig.width=8, fig.height=7, message=FALSE,echo=TRUE, results='hide'} plot(mdl) ```
이렇게 컴파일된 결과 파일을 자동으로 RPubs라는 사이트에 올려서 공개할 수 있다.
컴파일된 HTML 파일은 아래와 같다.
http://www.rpubs.com/gogamza/titanic
앞으로 분석과 문서 작업을 동시해 진행을 하는 습관을 R Markdown 기능을 활용해 길러볼 생각이다.
Reproducible Research with R Markdown by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.