x <- c(58, 78, 77, 65, 87, 66, 45, 66, 100)
var_x <- sum((x - mean(x))^2) / (length(x) - 1)
# 간단히 var(x)로도 계산 가능하다.
var_x
[1] 264
이 자료는 R 언어를 사용한 임상 데이터 과학(Clinical Data Science) 교육 자료를 정리하여 공유하기 위해 만들었습니다.
무엇보다 R 언어는 통계학의 세계 공용어로 자리잡았으며, 자신의 연구 결과를 발표하기 위해 또는 새로운 정보를 얻기 위해 논문을 읽어야 하는 의료인에게는 통계는 늘 따라다니는 존재입니다.
R 언어 세계는 넓어, 넓은 세계에서 처음 시작하는 사람들은 한참을 헤매고 나서야 길을 찾는 경우가 많습니다. 물론 그런 행위도 가치가 없는 것은 아니지만, 바쁜 의료인에게는 지레 포기하게 만드는 원인이 될 수 있습니다. 따라서 바로 사용할 수 있고, 늘 찾아볼 수 있도록 정리하는 것이 이 사이트의 목적입니다.
요즘에는 AI coding assistant가 발전하여 이런 작업을 하기에도 편리해졌습니다. 어떤 기초 개념을 소개하는 예시 등을 만들 때는 이런 도구들이 큰 도움이 되었으며, 이 사이트의 콘텐츠 역시 그런 결과물을 다수 포함시켰습니다.
임상 데이터 과학 교육 자료는 다음과 같은 내용을 포함시켰거나 앞으로 그럴 계획입니다. 데이터 과학에서 핵심적 역할을 하는 R, Python, SQL(DuckDB) 등 3개의 언어를 중심으로 내용을 채우려고 하는데, 하나의 사이트에서 다루는 것은 너무 많은 내용이 될 것 같아 분리하여 준비하려고 합니다.
이제 본격적으로 R 프로그래밍 언어를 학습할 것이다. 처음 시작하는 사용자들을 위해 다음과 같은 조언을 하고 싶다.
코드는 읽기만 해서는 내 것이 되지 않는다.
프로그래밍 언어도 일종의 언어라서 읽기만 해서는 자기 것으로 만들 수 없다. “항상 손으로 써보고, 실제로 입력해서 결과를 확인”하는 습관을 들이는 것이 좋다. 나는 컴퓨터 코드는 그림과 텍스트 중간에 있다는 생각을 많이 한다. 텍스트처럼 읽히기는 하지만 실제로 그런 문장을 써 보면 잘 안된다. 이런 것은 누구가 그러하다. 극복하는 방법은 끊임없는 연습이다.
코드는 할당 연산자를 기준으로 오른쪽을 먼저 읽고, 안에서 밖으로 읽는다.
다음을 간단한 R 함수를 사용하여 분산을 계산한 예이다. 분산의 공식은 다음과 같은데, 이걸 R 코드로 작성해 보면 다음과 같다. \[ \frac{\sum{(x- \bar{x})^2}}{n - 1} \]
x <- c(58, 78, 77, 65, 87, 66, 45, 66, 100)
var_x <- sum((x - mean(x))^2) / (length(x) - 1)
# 간단히 var(x)로도 계산 가능하다.
var_x
[1] 264
이 경우 할당 연산자 <-
오른쪽을 먼저 읽는데, 이처럼(이렇게 중첩시키는 코드는 좋은 코드가 아니다) 중첩된 코드는 안쪽에서 밖으로 읽는다. 이 경우에는 x - mean(x)
를 마음 속으로 읽고, 그 다음 이것을 제곱하고, 제곱한 것들은 sum()
하고, 이것은 length(x) - 1
값으로 나눈다고 읽는다. 그렇게 계산된 값을 var_x
변수에 할당한다.
때론 중간 과정을 풀어서 차례로 확인할 필요가 있다.
R 언어에서 계산은 하나의 값이 아니라 값들을 모은 벡터(vector)를 대상으로 하는 경우가 많아 처음 읽을 때 직관적으로 파악되지 않을 수 있다. 이런 경우에는 중간 과정을 풀어서 읽어 보자. 앞에 본 코드를 풀어서 실행해 보면 이해가 더 잘 될 수도 있다.
코드가 눈에 들어오기 시작하면 도움말(help page)을 자주 볼 필요가 있다. 하지만 또 너무 자세히 매달릴 필요가 없다.
R 도움말 페이지는 간결하고 정리가 잘 되어 있지만, 초보자들은 처음에 읽기 어려울 수 있다. 하지만 어느 정도 공부하고 나면 자주 찾아보는 습관을 들이는 것이 좋다.
마스터하기 보다 끊임없는 학습이 필요하다.
R 언어의 세계는 방대해서 실제로 이것을 마스터하기는 불가능하다. 그래서 지엽적인 문제에 너무 집착하면 앞으로 나갈 수가 없다. 어느 정도 이해하고 앞으로 나가고, 어떤 문제를 만나거나 잘 이해가 안 되는 부분이 있으면 좀 더 깊게 들어 가는 방법을 취한다.
니즈(needs)을 찾아라.
니즈는 우리에게 앞으로 나갈 동기를 부여한다. 나는 이전에 오피스 프로그램 없이 살아가기가 컴퓨터 공부의 중요한 니즈였다.
난 주변 의료인들에게 페이지 아래에서 소개하는 Quarto를 사용해 볼 것을 권고한다. 논문, 저술, 프레젠테이션, 블로그, 책 등 생각하는 모든 것을 같은 원리로 만들 수 있다. R이든 Python이든 이것만 있어도 오피스 프로그램 없이도 살아가는 것이 가능하고, 그래서 늘 사용하고 배우는 기회를 가질 수 있다.
프로그래밍 언어는 단순한 도구가 아니다. 언어를 사랑하자.
우린 항상 뭔가를 해결해야 하고 항상 바쁘다. 인공지능 시대에 프로그래밍 언어를 배워야 살아남을 것 같고 그렇지 않으면 뒷처지는 느낌을 가지게 된다. 그래서 프로그래밍 언어를 배울 때도 숙제를 하듯 할 수 있다. 그럴 필요가 없다고 생각한다. 마음을 열고 이 사랑스런 존재를 대하면 좋을 것 같다. 새로운 세상을 만들어 내는 이 위대한 존재를 어떻게 사랑하지 않을 수 있을까?
프로그래밍 언어 학습은 어떤 앱 사용법을 배우는 것과 완전히 다르다. 언어는 쓰고 버리는 것이 아니라 우리 뇌 안에서 영원히 존재할 것이기 때문이다.
언어마다 그 언어가 추상화하여 세상을 표현하는 방법과 세상의 문제를 해결하는 방법이 있다. 그리고 그 세상을 확장해 나가가는 사람들이 있다는 것을 알 필요가 있다. 그런 사람들을 존중하고 그 열정을 배우는 것이 프로그래밍 언어 학습의 중요한 부분이라 생각한다.
통계학
R 언어
이 사이트는 오픈 소스 과학기술 출판 시스템 Quarto를 사용하여 만들었습니다. 재현가능한 방식(computational reproducibility)으로, 논문쓰기와 같은 데이터 작업을 하는 데 최적의 환경을 제공합니다. 마크다운 텍스트와 코드를 적절히 혼합하여 article, book, website, presentation 등을 만들 수 있습니다.
또 웹브라우저에서 바로 코드를 연습할 수 있게 Quarto Live라는 WebAssembly 기능을 사용하여 코드 연습이 많이 필요한 곳에 사용하였습니다.
사용된 R 버전: 4.5.0
Quarto 버전: 1.7.31