20  데이터 분석 보고서

데이터 분석가는 동료 혹은 향후 참고를 위해 자신의 작업 결과를 문서화하는 데 상당한 시간을 할애한다. 이를 위해 분석 과정과 출력 결과를 기술하는 보고서를 작성한다.

처음 작업을 시작할 때는 온전히 본인 작업을 위해 R 스크립트를 작성한다. 그리고 나서, 다양한 그래프가 첨부된 분석 결과를 기술해서 동료에게 이메일로 발송한다. 분석 결과를 논의하는 과정에서 어느 그래프를 지칭하는지에 대한 혼란이 종종 발생한다.

워드나 \(\LaTeX\)으로 좀 더 정형화된 보고서를 작성해도 그림이 올바르게 보이도록 만드는 데 상당한 시간을 소비한다. 대부분 페이지 나누기가 문제가 된다.

웹페이지(HTML 파일)를 생성하면 모든 것이 훨씬 수월해진다. 이유는 하나의 긴 흐름이 되기 때문이다. 따라서 한 페이지에 맞지 않는 긴 그림도 사용할 수 있게 된다. 스크롤링이 딱 맞는 해결책이다.

20.1 문학적 프로그래밍

이상적으로는 그런 분석 보고서가 재현 가능한 문서가 되어야 한다. 만약 오류가 발견되거나 추가 분석 주제가 데이터에 추가되면, 다시 컴파일하여 새롭게 수정된 결과를 얻을 수 있어야 한다. (반대로 워드나 한글 등 오피스 프로그램으로 작업하면 그림을 다시 생성하고 문서에 붙여넣고 수작업으로 상세 결과를 편집해야 한다.)

R에서 문학적 프로그래밍을 구현하는 주된 도구가 knitr이다. knitr는 텍스트와 R 코드가 뒤섞인 문서를 생성할 수 있게 한다. 문서가 knitr로 처리되면 R 코드가 실행되어 그래프와 분석 결과가 문서에 자동으로 삽입된다.

이런 유형의 아이디어를 문학적 프로그래밍(literate programming)이라고 부른다.

knitr는 R 코드뿐만 아니라 다양한 프로그래밍 언어를 텍스트와 뒤섞을 수 있도록 하지만, 기본적으로 R 마크다운을 추천한다. R 마크다운은 마크다운과 R 코드를 함께 사용할 수 있도록 한다. 마크다운은 가벼운 마크업 언어로 웹페이지를 생성하는 데 사용된다.

20.2 R 마크다운 파일 생성

RStudio에서 File → New File → R Markdown을 클릭하면 다음과 같은 대화상자가 열린다.

그림 20.1: 쿼토 문서 생성 시작

기본 설정(HTML 출력)된 대로 사용할 수도 있고, 제목을 입력할 수도 있다.

20.3 R 마크다운 기본 요소

초기 설정된 텍스트 청크에는 R에 대한 지시 사항이 담겨 있다. 제목, 저자명, 날짜, HTML 출력 여부(다른 말로, 웹페이지 생성 여부)가 포함된다.

---
title: "Initial R Markdown document"
author: "Karl Broman"
date: "April 23, 2015"
output: html_document
---

원하지 않는 경우 상기 필드를 임의로 삭제할 수 있다. 엄밀히 말해서 인용 부호는 상기 경우에 필요한 것은 아니다. 제목에 콜론(:)이 포함되는 경우 대체로 인용 부호가 필요하다.

RStudio에는 시작을 돕기 위한 예제 문서가 포함되어 있다. 다음과 같은 R 코드 청크(chunk)가 포함되어 있는 점을 주목한다.

```{r}
summary(cars)
```

이것은 knitr로 실행되는 R 코드 청크로, R 코드 실행 결과로 치환된다. 뒤에서 더 자세히 다루겠다.

또한, 웹주소는 < >로 감싸고, **Knit**처럼 별표 두 개를 사용하기도 한다. 이것이 전형적인 Markdown 구문의 한 사례가 된다.

20.4 마크다운

HTML 코드를 직접 작성하는 대신 전자 우편에서 문서를 작성하는 것처럼 텍스트에 마크업을 적용해서 웹페이지를 저작하는 시스템이 마크다운이다. 마크업 텍스트는 적절한 HTML 코드로 치환되어 최종 HTML로 변환된다.

지금은 자동 생성된 모든 코드를 삭제하고, 마크다운으로 저작을 시작해 보자.

별표 두 개를 사용해서 굵게 표시할 수 있는데 **굵게**와 같이 타이핑하면 된다. 밑줄 혹은 별표 한 개를 사용해서 이탤릭도 구현할 수 있는데, _이탤릭_이나 *이탤릭*과 같이 타이핑하면 된다.

다음과 같이 하이픈이나 별표를 사용해서 블릿 기호가 붙은 항목을 생성할 수 있다.

- 별표 두 개로 굵게 표시
- 밑줄로 이탤릭 표시
- 백틱으로 코드 서체 표시  

혹은 다음과 같이도 가능하다:

* 별표 두 개로 굵게 표시
* 밑줄로 이탤릭 표시  
* 백틱으로 코드 서체 표시

다음과 같이 웹페이지로 출력된다.

  • 별표 두 개로 굵게 표시
  • 밑줄로 이탤릭 표시
  • 백틱으로 코드 서체 표시

숫자를 사용하면 번호가 매겨진 항목도 생성할 수 있다. 원하는 만큼 동일한 숫자를 반복해서 사용하면 된다.

1. 별표 두 개로 굵게 표시
1. 밑줄로 이탤릭 표시
1. 백틱으로 코드 서체 표시

다음과 같이 출력된다.

  1. 별표 두 개로 굵게 표시
  2. 밑줄로 이탤릭 표시
  3. 백틱으로 코드 서체 표시

# 기호를 각 줄 첫 번째에 사용하면 섹션 제목을 만들 수 있으며, #의 개수에 따라 제목의 크기가 달라진다.

# 아주 큰 제목
## 큰 제목 
### 작은 제목
#### 아주 작은 제목

좌측 상단에 있는 “Knit” 버튼을 클릭하면 R 마크다운 문서가 HTML 웹페이지로 컴파일된다. 바로 옆에 작은 아래쪽 화살표 버튼이 있음에 주목한다. 클릭하면 “Markdown Quick Reference”(마크다운 구문 안내)와 RStudio IDE에서의 R 마크다운 문서 작성법을 참고할 수 있다.

도전 과제

R 마크다운 문서를 새로 생성한다. 모든 R 코드 청크를 삭제하고 마크다운 문법을 사용하여 문서를 작성한다. (제목, 이탤릭 텍스트, 블릿 기호가 붙은 항목 등)

작성한 문서를 웹페이지로 변환한다.

RStudio에서 File > New file > R Markdown…을 선택한다. 기본으로 입력된 텍스트를 삭제하고 다음 내용을 추가한다:

# 서론

## 데이터 배경

이 보고서는 *gapminder* 데이터셋을 사용하며, 포함된 열은 다음과 같다:

* country (국가)
* continent (대륙)
* year (연도)
* lifeExp (기대수명)
* pop (인구)
* gdpPercap (1인당 GDP)

## 분석 방법 배경

20.5 마크다운 심화

[text to show](http://the-web-page.com)와 같이 하이퍼링크를 추가할 수 있다. ![caption](http://url/for/file)과 같이 이미지를 삽입할 수 있다. 아래 첨자는 F~2~와 같이, 윗첨자는 F^2^와 같이 작성한다.

수식은 \(\LaTeX\) 문법을 사용하여 $E = mc^2$처럼 $ $ 사이에 작성한다. 별도 줄로 수식을 쓰려면 $$ $$를 사용한다.

$$y = \mu + \sum_{i=1}^p \beta_i x_i + \epsilon$$

20.6 R 코드 청크

마크다운은 흥미롭고 유용하지만, 실제 진정한 힘은 마크다운을 R 코드 청크와 함께 사용할 때 발휘된다. 이를 R 마크다운이라고 한다. R 마크다운이 처리되면 R 코드가 실행되고, 생성된 그림이 최종 문서에 자동으로 삽입된다.

데이터를 불러오는 R 코드는 다음과 같이 생겼다:

```{r load_data}
gapminder <- read.csv("~/Desktop/gapminder.csv")
```

즉, ```{r chunk_name}``` 사이에 R 코드 청크를 위치시킨다. 각 청크에는 고유한 이름을 부여해야 하는데, 이는 오류를 수정하는 데 도움이 되고 그래프가 생성되는 경우 파일명이 해당 그래프를 생성한 코드 청크의 이름을 기반으로 하기 때문이다. RStudio에서는 단축키를 사용하여 빠르게 코드 청크를 생성할 수 있다. Windows와 Linux에서는 Ctrl+Alt+I를, Mac에서는 Cmd+Option+I를 사용한다.

도전 과제

다음 R 코드를 문서에 추가한다.

  • ggplot2 패키지를 불러오는 코드
  • gapminder 데이터를 불러오는 코드
  • 그래프를 생성하는 코드
``` {{r}}
library("ggplot2")
```
``` {{r}}
gapminder
```
``` {{r}}
plot(lifeExp ~ year, data = gapminder)
```

20.7 컴파일 과정

“Knit” 버튼을 클릭하면 knitr 프로그램이 R 마크다운 문서를 처리하여 일반 마크다운 문서(그림 포함)를 생성한다. R 코드가 실행되면서 입력과 출력이 모두 치환되고, 생성된 그림에 대한 링크도 포함된다.

마크다운 문서와 그림은 pandoc 도구에 의해 처리되어 그림이 내장된 HTML 파일로 변환된다.

그림 20.2: R 마크다운 문서를 HTML로 변환하는 과정

20.8 청크 옵션

코드 청크가 처리되는 방식을 제어하는 다양한 옵션이 있다.

  • echo=FALSE: R 코드 출력을 숨긴다.
  • results="hide": 출력 결과물이 문서에 포함되지 않도록 한다.
  • eval=FALSE: 코드는 출력되지만 실행되지는 않는다.
  • warning=FALSE, message=FALSE: 경고와 메시지 출력을 숨긴다.
  • fig.height, fig.width: 인치 단위로 그림의 높이와 폭을 지정한다.

다음과 같이 작성할 수 있다.

```{r load_libraries, echo=FALSE, message=FALSE}
library("dplyr")
library("ggplot2")
```

전역 청크 옵션을 사용해 반복적으로 사용되는 R 마크다운 옵션을 다음과 같이 지정할 수도 있다.

```{r global_options, echo=FALSE}
knitr::opts_chunk$set(fig.path="Figs/", message=FALSE, warning=FALSE,
                      echo=FALSE, results="hide", fig.width=11)
```

fig.path 옵션은 그림이 저장되는 경로를 지정한다. /를 사용하지 않으면 Figs로 시작하는 파일명으로 기본 저장소에 그림이 저장된다.

작업 디렉터리에 R 마크다운 파일이 여러 개 있는 경우 fig.path="Figs/cleaning-", fig.path="Figs/analysis-"와 같이 그림 파일명 접두사를 다르게 지정할 수 있다.

도전 과제

그림 크기를 변경하고 코드 출력을 감추도록 R 코드 청크 옵션을 설정한다.

```{r}
#| echo: false
plot(faithful)
```

20.9 인라인 R 코드

보고서의 모든 숫자를 재현 가능하게 만들 수 있다. 인라인 코드를 작성할 때는 `r ``를 사용한다. 예를 들어 `{r} round(some_value, 2)`와 같이 한다. 이 R 코드가 실행되어 결과값으로 치환된다.

두 줄 이상에 걸쳐 인라인 코드 청크를 나누어 작성하지 않도록 주의한다.

약간 긴 코드의 경우 include=FALSE(echo=FALSEresults="hide"를 합친 것)를 사용하여 계산과 할당을 처리하는 것이 좋다.

이런 경우 소수점 자리수를 원하는 대로 조정할 수 있다. 예를 들어 2.0을 원한다면 round(2.03, 1) 대신 적절한 포맷팅 함수를 사용해야 한다.

R/broman 패키지의 myround 함수가 도움이 될 수 있다.

도전 과제

인라인 R 코드를 사용해 본다.

다음은 2 + 2 = {r} 2+2임을 보여주는 인라인 코드다.

20.10 기타 출력 옵션

R 마크다운 문서를 PDF나 워드 문서로 변환할 수도 있다. “Knit” 버튼 옆의 작은 아래쪽 화살표를 클릭하면 드롭다운 메뉴가 나타난다. 혹은 R 마크다운 .Rmd 파일의 헤더 부분에서 output 옵션을 pdf_documentword_document로 설정하면 된다.

PDF 문서 생성하기

PDF 문서를 생성하려면 추가 소프트웨어를 설치해야 한다. 필요한 소프트웨어가 설치되어 있지 않은 상태에서 PDF 문서 생성을 시도하면 상세한 오류 메시지가 출력된다.

20.11 요약

차세대 R 마크다운 쿼토(Quarto)는 데이터 분석 보고서 작성에 있어 강력한 도구로 활용될 수 있다. 마크다운 문법을 사용하여 텍스트를 작성하고, R/파이썬 코드 청크를 통해 분석 결과와 그래프를 동적으로 생성할 수 있기 때문에 분석 결과를 재현 가능한 형태로 문서화할 수 있으며, 오류 수정이나 추가 분석 시 문서 전체를 다시 컴파일하여 업데이트된 결과를 바로 얻을 수 있다.

R 마크다운/쿼토 문서 작성 시에는 YAML 헤더를 통해 문서의 메타데이터를 설정하고, 마크다운 문법을 사용하여 제목, 강조, 리스트, 수식, 하이퍼링크, 이미지 등을 추가할 수 있다. R/파이썬 코드 청크를 사용하여 데이터 불러오기, 전처리, 분석, 시각화 등의 작업을 수행하고 그 결과를 문서에 직접 삽입할 수 있다. 코드 청크에는 다양한 옵션을 설정하여 코드 실행 방식을 제어할 수 있으며, 전역 옵션을 통해 일괄적으로 반영할 수도 있다.

R 마크다운/쿼토 문서는 “Knit” 버튼을 클릭하여 HTML, PDF, 워드 문서 등 다양한 형식으로 변환할 수 있다. knitr 패키지가 R 코드를 실행하고 결과를 문서에 삽입하며, pandoc이 최종 문서 형식으로 변환하는 역할을 한다. 따라서 R 마크다운을 사용하면 분석 보고서 작성에 드는 시간과 노력을 크게 줄일 수 있다.