R을 이용한 인과 추론

저자

Malcolm Barrett

Lucy D’Agostino McGowan

Travis Gerke

공개

2026년 3월 28일

머리말

R을 이용한 인과 추론(Causal Inference in R)에 오신 것을 환영합니다. 인과 관계 질문에 답하는 것은 과학 및 비즈니스 목적 모두에 중요하지만, 무작위 임상 시험(RCT)이나 A/B 테스트와 같은 기술이 항상 실용적이거나 성공적인 것은 아닙니다. 이 책의 도구는 독자가 R 프로그래밍 언어를 활용해 관측 데이터(observational data)로 더 나은 인과 추론을 하도록 돕습니다. 이 책을 마칠 때쯤이면 다음 내용을 익힐 수 있습니다.

  1. 더 나은 인과 관계 질문 던지기.
  2. 인과 추론에 필요한 가정 이해하기.
  3. 추론하고자 하는 대상 인구(target population) 식별하기.
  4. 인과 모델 적합 및 문제점 확인.
  5. 사용된 기술이 불완전한 상황에서의 민감도 분석(sensitivity analysis) 수행.

이 책은 학술 연구자와 데이터 과학자 모두를 위한 것입니다. 환경에 따라 질문은 다를 수 있지만 많은 기술은 동일합니다. 인과 추론은 암에 관한 질문만큼이나 클릭 수 질문을 던지는 데에도 유용합니다. 의학, 경제학, 기술 등 다양한 분야의 사례를 혼합해 명확한 인과 관계 질문과 가정을 투명하게 공개하려는 의지가 필요함을 보여줍니다.

이 책에서 많은 것을 배우겠지만, 아이러니하게도 인과 추론의 가장 좋은 도구 중 하나인 무작위 시험 수행 방법은 깊게 다루지 않습니다. 무작위 시험과 그 사촌 격인 A/B 테스트(기술 분야의 표준)는 유효한 추론에 필요한 많은 가정을 완화해주므로 매우 강력합니다. 또한 설계가 충분히 복잡해 별도의 학습 리소스가 필요할 정도입니다. 대신 우리는 일반적으로 무작위 배정의 이점을 누릴 수 없는 관측 데이터에 집중할 것입니다. 무작위 배정 기술에 관심 있더라도 이 책을 바로 덮지 마세요. 관측 데이터용으로 설계된 여러 인과 추론 기술은 무작위 분석도 개선할 수 있습니다.

독자에 관해 몇 가지 가정을 하고 있습니다.

  1. R 패키지의 tidyverse 생태계와 그 일반적인 철학에 익숙합니다. 예를 들어, 이 책에서는 dplyr와 ggplot2를 많이 사용하지만 기초 문법을 설명하지는 않습니다. tidyverse 시작에 대해 더 자세히 알고 싶다면 R for Data Science를 추천합니다.
  2. R의 기본적인 통계 모델링에 익숙합니다. 예를 들어, lm()glm()을 사용하여 많은 모델을 적합시키겠지만, 그것들이 어떻게 작동하는지는 논의하지 않을 것입니다. R의 강력한 모델링 함수에 대해 더 배우고 싶다면 Tidy Modeling with R“A Review of R Modeling Fundamentals”를 읽어보시길 권장합니다.
  3. 또한 함수 작성과 같은 다른 R 기초에 익숙하다고 가정합니다. R for Data Science 역시 이러한 주제에 좋은 리소스입니다. (R 프로그래밍 언어에 대해 더 깊이 파고들고 싶다면 Advanced R을 추천하지만, 이 책을 위해 그 내용을 완전히 마스터했다고 가정하지는 않습니다.)

또한 tidyverse와 관련된 모델링용 R 패키지 세트인 tidymodels 생태계의 도구도 사용할 것입니다. 이전에 사용해 본 적이 없다고 가정합니다. tidymodels는 예측 모델링에도 중점을 두기 때문에 많은 도구가 이 책에 적합하지 않을 수 있습니다. 그럼에도 불구하고 이 주제에 관심이 있다면 Tidy Modeling with R을 추천합니다.

인과 추론에 관한 다른 훌륭한 책들도 많이 있습니다. 이 책은 R에 집중한다는 점에서 차별화되지만, 다른 관점에서 이 분야를 바라보는 것도 도움이 됩니다. 좋아할 만한 몇 권의 책들:

첫 번째 책은 역학(epidemiology)에 중점을 둡니다. 나머지 두 권은 계량경제학(econometrics)에 중점을 둡니다. 인과 다이어그램에 대해 더 자세히 알고 싶다면 The Book of Why (pearl2018why도?) 추천합니다.

설치

이 책은 현재 활발히 개발 중인 여러 패키지를 사용합니다. 필요한 개발 버전을 설치하려면 다음을 사용하세요:

# install.packages("pak")
pak::pak(c(
  "r-causal/causalworkshop",
  "r-causal/ggdag",
  "r-causal/halfmoon",
  "r-causal/propensity",
  "r-causal/tipr",
  "LucyMcGowan/touringplans"
))

이러한 개발 버전에는 책 전체에서 사용되는 최신 기능과 버그 수정이 포함되어 있습니다.

관례 (Conventions)

현대적인 R 기능

이 책에서는 R 4.1.0 이상 버전의 두 가지 현대적인 R 기능을 사용합니다. 첫 번째는 네이티브 파이프, |>입니다. 이 R 기능은 여러분에게 더 익숙할 수 있는 tidyverse의 %>%와 유사합니다. 일반적인 경우, 두 기능은 서로 바꿔서 사용할 수 있습니다. 한 가지 눈에 띄는 차이점은 |>가 파이프의 결과를 전달하기 위해 _ 기호를 사용한다는 점입니다(예: .df |> lm(y ~ x, data = _)). 이 주제에 대한 상세 내용은 이 Tidyverse 블로그 포스트를 참조하세요.

우리가 사용하는 또 다른 현대적인 R 기능은 네이티브 람다(native lambda)로, \(.x) do_something(.x)와 같이 짧은 함수를 작성하는 방식입니다. 이는 purrr’s ~ 람다 표기법과 유사합니다. 또한 네이티브 람다가 function(.x) do_something(.x)와 동일하며, 여기서 \function의 약어임을 인식하는 것이 도움이 됩니다. 이 주제에 대한 상세 내용은 R for Data Science의 반복(iteration)장을 참조하세요.

테마 설정 (Theming)

이 책의 그래프들은 모든 코드 청크에 포함하지 않는 일관된 테마를 사용합니다. 즉, 시각화 코드를 직접 실행하면 약간 다르게 보일 수 있습니다. 우리는 ggplot2와 관련된 다음과 같은 기본값을 설정했습니다:

options(
  # ggplot2의 기본 색상을 색맹 친화적인 Okabe-Ito 및 Viridis 팔레트로 설정
  ggplot2.discrete.colour = ggokabeito::palette_okabe_ito(),
  ggplot2.discrete.fill = ggokabeito::palette_okabe_ito(),
  ggplot2.continuous.colour = "viridis",
  ggplot2.continuous.fill = "viridis",
  # 테마 글꼴 및 크기 설정
  book.base_family = "sans",
  book.base_size = 14
)

library(ggplot2)

# 기본 테마 설정
theme_set(
  theme_minimal(
    base_size = getOption("book.base_size"),
    base_family = getOption("book.base_family")
  ) %+replace%
    theme(
      panel.grid.minor = element_blank(),
      legend.position = "bottom"
    )
)

또한 우리가 커스터마이징하고 싶은 ggdag의 몇 가지 함수를 마스킹합니다:

theme_dag <- function() {
  ggdag::theme_dag(base_family = getOption("book.base_family"))
}

geom_dag_label_repel <- function(..., seed = 10) {
  ggdag::geom_dag_label_repel(
    aes(x, y, label = label),
    box.padding = 3.5,
    inherit.aes = FALSE,
    max.overlaps = Inf,
    family = getOption("book.base_family"),
    seed = seed,
    label.size = NA,
    label.padding = 0.1,
    size = getOption("book.base_size") / 3,
    ...
  )
}

감사의 말 (Acknowledgements)

이 책은 단순히 Malcolm, Lucy, Travis만의 결과물이 아닙니다. 이 책에 기여해주신 R 커뮤니티의 모든 분들께 진심으로 감사드립니다!

이 책은 현재 공개적으로 작성되고 있으며 지금까지 13명의 사람들이 풀 리퀘스트를 통해 기여했습니다! GitHub 풀 리퀘스트를 통해 개선에 도움을 주신 모든 분들께 큰 감사를 드립니다(사용자 이름순): Caitlin Eger (@cgeger), Hernando Cortina (@cortinah), @cshancock, David Kane (@davidkane9), @drakileshr, Jakob Schumacher (@jakobschumacher), Ken Taylor (@KennethATaylor), @LaurenCCH, @lindbrook, Matthew Kimber (@matthewkimber), @michaelmoerk, @MMJansen, Simon P. Couch (@simonpcouch).

라이선스 (License)

이 저작물은 CC BY-NC 4.0 라이선스에 따라 이용할 수 있습니다: “이 라이선스는 재사용자가 원저작자를 표시할 것을 요구합니다. 비영리 목적으로만 저작물을 재배포, 리믹스, 변형 및 기반 저작물 작성이 가능합니다.”

이 책의 코드 또한 MIT 라이선스에 따라 사용할 수 있습니다. MIT 라이선스에 따라, 출처를 인용하는 한 여러분의 작업에 자유롭게 코드를 사용할 수 있습니다.