7  코드

엑셀은 워드, 파워포인트와 함께 마이크로소프트 오피스에서 중요한 역할을 담당한다. 엑셀은 데이터 관리와 분석을 위한 강력한 도구로, 복잡한 수치 데이터를 정리하고 분석하는 데 주로 사용되는데, 워드 문서와 통합되어 엑셀은 표, 차트, 그래프 형태로 데이터를 시각적으로 표현하여 문서 정보 전달력을 높인다. 하지만, 워드 문서에 엑셀에서 나온 산출물을 매번 사람이 직접 복사하여 붙여넣어야 하기 때문에 번거럽고 사람이 개입되기 때문에 오류의 가능성이 상존한다.

쿼토의 장점은 지난 10년간 R마크다운을 통해 입증되었다. 즉, 쿼토는 차세대 R마크다운이라는 별명이 붙어있는데 쿼토가 R마크다운의 장점을 계승하면서도 더 많은 기능을 추가했을 뿐만 아니라 R마크다운의 경험을 바탕으로 더 나은 사용자 경험을 제공한다. R마크다운이 R언어 지원에 방점을 뒀다면 쿼토는 R언어를 넘어서 파이썬, SQL, 줄리아, 자바스크립트 등 다양한 언어를 지원한다.

그림 7.1: 쿼토 프로그래밍 언어

다양한 프로그래밍 언어를 잘하는 사람도 있지만, 대부분은 한두 가지 언어를 주로 쓴다. 쿼토는 다른 언어 사용자들과 함께 문서 작업하고 공유하는 데 아주 좋다. 쿼토는 여러 프로그래밍 언어를 지원해서, 협업하는 사람들이 각자의 주력언어로 코딩하면서도 무리 없이 작업할 수 있는 환경을 제공한다.

R 언어는 데이터 분석과 통계, 시각화에 강점을 가지고 있고, 줄리아는 고성능 수치 계산에 특화된 언어로 복잡한 계산과 처리가 필요한 과학 기술 분야에 적합하다. SQL은 데이터베이스 관리에 중요한 역할을 하며, 파이썬은 ’두 번째로 좋은 프로그래밍 언어’라 불리며 기계학습과 인공지능 분야에서 특히 강점을 보인다. 자바스크립트, 특히 Observable JS는 웹 기반 인터랙티브 데이터 시각화에 특화되어 있어 다양한 웹 애플리케이션 개발에 유용하다.

7.1 파이썬

사인 곡선을 그리는 파이썬 코드를 작성해보자. 먼저 그래프 그리는 역할을 담당하는 matplotlib 패키지를 로드하고, 사인 함수를 구현하기 위해 numpy 패키지를 이용하여 x축 데이터, sin 함수를 이용하여 y축 데이터를 생성한다. 마지막으로 plot 함수를 이용하여 그래프를 그린다. 그래프 제목과 축 제목에 한글이 들어가 한글 글꼴 설정을 추가로 해준다.

파이썬 코드

```{python}
# 패키지
import matplotlib.pyplot as plt
import numpy as np

# 한글 폰트 설정
plt.rcParams['font.family'] = 'NanumGothic'
plt.rcParams['axes.unicode_minus'] = False

# 데이터
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 그래프
plt.plot(x, y)
plt.xlabel('x 축')
plt.ylabel('sin(x)')
plt.title('사인 그래프')
plt.show()
```

그래프

7.2 R 언어

쿼토는 ’차세대 R 마크다운’으로 불리며 R 언어를 기본적으로 지원한다. 다양한 통합개발환경(IDE)이 존재하지만, R 언어 작업에 있어서는 RStudio가 가장 효율적이라는 것이 저자의 경험이다. RStudio는 원래 R 언어를 위한 IDE로 개발되었으며, 이후 확장되어 쿼토 기능도 사용할 수 있다고 생각하는 분도 있을 정도다.

파이썬 대신 R 코드로 동일한 기능을 수행하는 것은 R이 데이터 분석과 시각화에 강력한 도구임을 보여준다. R을 설치하면 seq(), sin(), plot()과 같은 다양한 내장 함수들을 통해 별도의 패키지 설치 없이도 바로 그래프를 생성할 수 있다. 내장 함수들을 사용해 사인 곡선을 그릴 수 있다.

R 코드

```{r}
# 데이터 생성
x <- seq(0, 10, length.out = 100)
y <- sin(x)

# 그래프 그리기
plot(x, y, type = "l", xlab = "x 축", 
     ylab = "sin(x)", main = "사인 그래프")
```

그래프

7.3 줄리아

Julia 프로그래밍 언어는 과학 및 수치 연산 분야에서 높은 수준의 성능을 제공하면서도, 사용자 친화적인 문법을 가진 프로그래밍 언어의 필요성에서 2012년에 MIT에서 개발되었다. 깔끔하고 읽기 쉬운 언어 특성과 고성능 수치 계산 역량으로 인해 과학 및 공학 분야 연구자들과 개발자들에게 인기를 끌고 있다.

줄리아 홈페이지에서 다운로드하여 설치작업을 완료한다. 쿼토에서 yaml 헤더에 engine: julia-1.10을 추가하여 해당 .qmd 문서를 컴파일할 수도 있다. 쿼토 문서에서 R 코드 덩어리(code chunk)처럼 줄리아 코드 덩어리만 따로 실행하고자 하는 경우 JuliaCall 패키지를 설치하고 나서 다음과 같이 julia_setup() 함수를 사용하여 줄리아 엔진을 설정해야 쿼토 문서에 내장된 줄리아 코드 덩어리를 실행할 수 있다. julia_setup() 작업에 다소 시간이 소요된다. 작업이 마무리 되면 RStudio나 VS코드 IDE를 재시작하는 것을 추천한다.

library(JuliaCall)

julia_setup(JULIA_HOME="C:/Users/<사용자명>/AppData/Local/Programs/Julia-1.10.1/bin")

파이썬과 R로 제작한 사인 그래프를 줄리아로 나타나기 위해 Plots 패키지가 필요하다. 줄리아 콘솔에서 import Pkg; Pkg.add("Plots") 명령어로 패키지를 설치한 후 다음과 같이 사인 그래프를 출력하는 줄리아 코드 덩어리를 작성한다.

줄리아 코드

```{julia}
# 패키지 설치
# import Pkg; Pkg.add("Plots") 
using Plots

# 데이터
x = range(0, stop=10, length=100)
y = sin.(x) # 점(.)을 사용하여 요소별 연산 수행

# 그래프
plot(x, y, label="sin(x)", xlabel="x axis", ylabel="sin(x)", title="Sine Graph")

# 그래프 표시
display(plot)
```

그래프

#> 0.0:0.10101010101010101:10.0
#> 100-element Vector{Float64}:
#>   0.0
#>   0.1008384202581046
#>   0.2006488565226854
#>   0.2984138044476411
#>   0.3931366121483298
#>   0.48385164043793466
#>   0.5696341069089657
#>   0.6496095135057065
#>   0.7229625614794605
#>   0.7889454628442574
#>   ⋮
#>   0.23076007532505177
#>   0.13146698864295842
#>   0.03083367906114098
#>  -0.07011396040064677
#>  -0.1703468323280965
#>  -0.26884312591038406
#>  -0.3645987336558887
#>  -0.45663748763377376
#>  -0.5440211108893698

#> plot (generic function with 4 methods)

7.4 자바스크립트

쿼토는 D3 저자(Mike Bostock)가 개발한 Observable JS (OJS)를 지원하여 자바스크립트 코드를 문서에 삽입할 수 있다. OJS를 쿼토에 넣게 되면 OJS 인터랙티브 데이터 시각화 기능을 활용할 수 있게 된다.

앞서 작성한 사인 그래프를 그리는 코드를 OJS 로 다음과 같이 구현할 수 있다. 사인 그래프를 그리는데 필요한 x값, Math.sin() 함수를 이용해 y값을 계산하고, Plot.plot 함수를 이용해 그래프를 작성한다.

OJS의 강력한 기능은 인터랙티브 데이터 시각화에 있다. 본서는 PDF 출판도 염두에 두어야 하기 때문에 OJS의 인터랙티브 기능을 활용하지는 않겠지만, PDF를 비롯한 (종이)출판에서 자유로운 분들은 OJS를 활용하여 더욱 다양하고 풍부한 시각화를 구현하여 전자문서로 제작 및 배포하는 것을 추천한다.

자바스크립트 코드

```{ojs}
points = {
  const points = []
  for(let i=0; i<=10;i=i+.01){
    points.push({x:i,y:Math.sin(i)})
  }
  return points
}

Plot.plot({
  x:{domain:[0,10]},
  y:{domain:[-1,1]},
  marks:[
    Plot.ruleX([0]),
    Plot.ruleY([0]),
    Plot.line(points,{x:'x',y:'y'})
    ]
})
```

그래프

7.5 SQL

과학기술 분야에서 SQL(Structured Query Language)은 끊임없이 성장하는 데이터의 양과 복잡성을 다루는 데 필수적인 언어로 데이터 중심 연구가 증가함에 따라, SQL은 이 분야에서 중추적인 역할을 계속 이어날 것으로 예측된다.

SQL은 데이터베이스 관리의 표준으로, 연구 데이터를 체계적으로 조직하고 관리하는 데 필수적이고, 복잡한 데이터 쿼리와 분석을 가능하게 하여, 연구자들이 다양한 데이터 소스에서 필요한 정보를 추출하고, 데이터 간의 관계를 분석하며, 통계질문에 답할 수 있게 된다. 과학기술 분야에서 종종 거대한 양의 데이터를 처리를 가능하게 하며, SQL 표준을 준수하는 데이터는 공유와 협업도 촉진한다.

한국 R 사용자회에서 출판한 “챗GPT SQL”(이광춘 2024)에 등장하는 소프트웨어 카펜트리 SQLite3 조사 데이터베이스(survey.db)를 쿼토 문서에 연결하여 데이터베이스의 테이블을 조회하는 사례를 살펴보자. 데이터베이스를 문서에 연결시키는 연결(conn) 작업을 DBI 패키지 dbConnect() 함수로 수행하고 제대로 연결이 되었는지 dbListTables() 함수로 확인하고, 쿼리할 수 있는 테이블을 살펴본다. 참고로 SQLite3 데이터베이스는 파일 데이터베이스로 파일에 관계형 데이터베이스가 내장되어 있어 별도의 데이터베이스 서버가 필요하지 않다.

library(DBI)
library(tidyverse)

conn <- DBI::dbConnect(RSQLite::SQLite(), 
                      dbname = "data/survey.db")

dbListTables(conn)
#> [1] "Person"  "Site"    "Survey"  "Visited"

이제 연결된 데이터베이스에서 Person 테이블을 조회하는 쿼리를 작성해보자. 쿼토 문서에 R, 파이썬 코드를 바로 작성했던 것처럼 SQL 쿼리를 작성하면 쿼리 결과를 문서에 바로 반영할 수 있다. 유의할 점은 쿼토 sql 코드 덩어리에 데이터베이스 연결작업으로 #| connection: conn을 선언해야 된다는 점이 다른 프로그래밍 언어와 다르다.

SQL 코드

```{sql}
#| connection: conn

SELECT *
FROM Person
```

쿼리 실행결과

5 records
id personal family
dyer William Dyer
pb Frank Pabodie
lake Anderson Lake
roe Valentina Roerich
danforth Frank Danforth

연습문제

객관식

  1. 쿼토(Quarto)에서 지원하는 프로그래밍 언어와 특정 언어가 문서 생성에 기여하는 방식은 무엇인가요?
    1. R은 데이터 분석, 파이썬은 시각화, 줄리아는 고성능 연산, SQL은 데이터베이스 쿼리, 자바스크립트는 인터랙티브 기능에 기여
    2. R, 파이썬, 줄리아, SQL, 자바스크립트 모두 같은 방식으로 문서 생성에 기여
    3. R과 파이썬만 문서 생성에 기여, 나머지 언어는 보조적인 역할만 수행
    4. 모든 언어가 시각화와 데이터 처리에 고르게 기여
  1. 쿼토 문서에서 파이썬 코드 블록을 실행하는 방법은 무엇인가요?
    1. {python} 코드 블록 사용
    2. {r} 코드 블록 사용
    3. {sql} 코드 블록 사용
    4. {julia} 코드 블록 사용
  1. 쿼토에서 SQL 쿼리를 실행할 때 필요한 주의사항은 무엇인가요?
    1. 모든 쿼리는 SELECT로 시작해야 함
    2. 쿼리에는 항상 데이터베이스 연결을 선언해야 함
    3. SQL 쿼리는 오직 조회만 가능함
    4. 모든 SQL 쿼리는 ;로 끝나야 함

서술형

  1. 쿼토를 사용하여 데이터 시각화를 위한 코드 블록을 작성하는 방법에 대해 설명해보세요.
  1. 쿼토 문서에서 다양한 프로그래밍 언어를 사용하여 협업하는 방법에 대해 설명해보세요.