iBetter Books
수정

R Markdown 보고서 작성

R 코드와 분석 결과, 그리고 설명 텍스트를 하나의 문서로 만들 수 있습니다. 데이터가 업데이트되면 보고서 전체를 다시 실행해 최신 결과를 자동으로 반영합니다. 이것이 재현 가능한 연구(Reproducible Research)의 핵심입니다.

R Markdown이란

.Rmd 파일은 세 가지 요소로 구성됩니다.

1. YAML 헤더    : 문서 메타데이터 (제목, 저자, 출력 형식 등)
2. 마크다운 텍스트 : 일반 설명 글
3. 코드 청크     : R 코드와 실행 결과

RStudio에서 File → New File → R Markdown으로 새 파일을 만들거나, 확장자를 .Rmd로 저장합니다.

YAML 헤더

파일 최상단에 ---로 감싸서 작성합니다.

---title: "mtcars 데이터 회귀분석 보고서"author: "홍길동"date: "`r Sys.Date()`"output:  html_document:    toc: true              # 목차 생성    toc_float: true        # 스크롤 따라오는 목차    toc_depth: 3           # 목차 깊이 (H1~H3)    number_sections: true  # 섹션 번호 자동    theme: flatly          # 부트스트랩 테마    highlight: tango       # 코드 하이라이팅    fig_width: 7    fig_height: 5    df_print: kable        # 데이터프레임 출력 형식---
# PDF 출력 (한글 지원 위해 xelatex 엔진 사용)output:  pdf_document:    latex_engine: xelatex    toc: true    number_sections: true    fig_caption: trueheader-includes:  - \usepackage{kotex}     # 한글 패키지  - \usepackage{booktabs}
# Word 출력output:  word_document:    toc: true    reference_docx: "my_template.docx"   # 사용자 정의 스타일 적용

코드 청크 옵션

```{r chunk-name, echo=TRUE, message=FALSE, warning=FALSE}
# R 코드
library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
```

자주 쓰는 청크 옵션입니다.

# echo    : TRUE/FALSE — 코드를 문서에 보여줄지 여부
# message : TRUE/FALSE — 패키지 로딩 메시지 표시 여부
# warning : TRUE/FALSE — 경고 메시지 표시 여부
# eval    : TRUE/FALSE — 코드를 실제로 실행할지 여부
# include : TRUE/FALSE — 코드와 결과를 모두 숨길지 여부
# results : "markup", "hide", "asis" — 출력 처리 방식
# fig.width  : 그래프 너비 (인치)
# fig.height : 그래프 높이 (인치)
# fig.cap    : 그래프 캡션
# fig.align  : "left", "center", "right"
# cache   : TRUE — 결과를 캐시하여 재실행 시 빠르게 처리

전체 문서에 공통 옵션 설정하기

# 문서 최상단 설정 청크 (보통 setup이라는 이름 사용)
```{r setup, include=FALSE}
knitr::opts_chunk$set(
  echo    = TRUE,
  message = FALSE,
  warning = FALSE,
  fig.width  = 7,
  fig.height = 5,
  fig.align  = "center",
  dpi        = 150
)

# 필요한 패키지 로딩
library(tidyverse)
library(broom)
library(gt)
```

인라인 R 코드

텍스트 안에 R 결과를 직접 삽입합니다. 숫자를 손으로 복사하지 않아도 됩니다.

데이터셋에는 총 `r nrow(mtcars)`개의 관측값이 포함되어 있습니다.
연비의 평균은 `r round(mean(mtcars$mpg), 2)` mpg이며,
표준편차는 `r round(sd(mtcars$mpg), 2)` mpg입니다.

회귀분석 결과, 차체 무게(wt)는 연비에 유의한 영향을 미쳤으며
(β = `r round(coef(model)["wt"], 3)`, p < .001),
무게가 1,000 lbs 증가할 때마다 연비가 평균
`r abs(round(coef(model)["wt"], 2))` mpg 감소하였다.

렌더링하면 이렇게 출력됩니다.

데이터셋에는 총 32개의 관측값이 포함되어 있습니다.
연비의 평균은 20.09 mpg이며, 표준편차는 6.03 mpg입니다.

회귀분석 결과, 차체 무게(wt)는 연비에 유의한 영향을 미쳤으며
(β = -5.344, p < .001), 무게가 1,000 lbs 증가할 때마다
연비가 평균 5.34 mpg 감소하였다.

실제 보고서 예시 구조

---
title: "자동차 연비 예측 회귀분석 보고서"
author: "홍길동"
date: "`r Sys.Date()`"
output:
  html_document:
    toc: true
    toc_float: true
    number_sections: true
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE)
library(tidyverse); library(broom); library(gt)
model <- lm(mpg ~ wt + hp, data = mtcars)
```

## 연구 목적

본 연구는 `r nrow(mtcars)`종의 자동차 데이터를 이용하여
차체 무게와 마력이 연비에 미치는 영향을 회귀분석으로 분석하였다.

## 기술통계

```{r descriptive}
mtcars %>%
  select(mpg, wt, hp) %>%
  summary()
```

## 분석 결과

### 회귀계수 테이블

```{r regression-table}
tidy(model, conf.int = TRUE) %>%
  mutate(across(where(is.numeric), ~round(.x, 3))) %>%
  gt() %>%
  tab_header(title = "Table 1. Regression Coefficients")
```

### 회귀 진단

```{r diagnostic-plots, fig.width=10, fig.height=8, fig.cap="Figure 1. Model Diagnostics"}
par(mfrow = c(2, 2))
plot(model)
```

## 결론

회귀분석 결과, 무게(`r round(coef(model)["wt"], 2)`)와
마력(`r round(coef(model)["hp"], 3)`)이
연비에 유의한 영향을 미쳤다 (R² = `r round(summary(model)$r.squared, 3)`).

Knit로 문서 생성하기

# RStudio에서: Knit 버튼 클릭 (Ctrl+Shift+K)

# 코드로 직접 실행
library(rmarkdown)
render("report.Rmd")                              # 기본 출력
render("report.Rmd", output_format = "pdf_document")
render("report.Rmd", output_format = "word_document")

# 파라미터 전달 (파라미터화된 보고서)
render("report.Rmd",
       params = list(dataset = "mtcars", group = "cyl"))

파라미터화된 보고서

데이터 그룹별로 동일한 보고서를 자동 생성할 때 유용합니다.

---params:  cyl_group: 4---
```{r}
# 파라미터로 필터링
data_filtered <- mtcars[mtcars$cyl == params$cyl_group, ]
cat("실린더 수:", params$cyl_group, "\n")
cat("평균 연비:", round(mean(data_filtered$mpg), 2), "mpg\n")

```r
# 실린더 그룹별로 보고서 자동 생성
for (cyl in c(4, 6, 8)) {
  render("report.Rmd",
         params       = list(cyl_group = cyl),
         output_file  = paste0("report_cyl", cyl, ".html"))
}

R Markdown은 논문 초안 작성, 과제 보고서, 정기 분석 보고서 등 어디에서나 쓸 수 있습니다. 다음 챕터에서는 R Markdown의 진화 버전인 Quarto를 소개합니다.

Ch 03. R Markdown 보고서 작성 — 실전 R 통계 분석 | iBetter Books