Quartoで論文を書いて投稿するまで (1) -- データ解析からQuarto導入まで

この記事シリーズの詳細については、[こちらの記事]()をご覧ください。

# Step 0. データ解析

まずは、論文執筆の前提となるデータ解析の例からです。
Quarto で執筆する論文に埋め込むことを前提に、解析結果を出力します。
データ解析をして、結果を .ini, .csv, 画像ファイルへ出力します。

今回の例では、以下のようなコードでデータ解析をしたとします。
解析内容は例として適当にやっているだけです。

<details><summary>コード</summary><div>

```python
# %%
from sys import version
from pathlib import Path
from configparser import ConfigParser

import pandas as pd
import pingouin as pg
import seaborn as sns


# 出力先のファイルパスを指定
OUT_DIR = Path('result')
OUT_PATH_VAL_METHOD = OUT_DIR / 'method.ini'
OUT_PATH_TABLE_DESCRIPTIVE = OUT_DIR / 'table_descriptive.csv'
OUT_PATH_TABLE_CORRS = OUT_DIR / 'table_corrs.csv'
OUT_PATH_FIG = OUT_DIR / 'fig_scatter.png'

# Pingouinが提供するデータセットを読み込む
dataset = pg.read_dataset('pairwise_corr.csv').set_index('Subject')
dataset.columns = ['neuro', 'extra', 'open', 'agree', 'consc']  # 後の関数紹介のために、あえて変数名っぽい名前に変更
dataset.index.name = 'sub_id'

# %%

# 使用した統計ツールとバージョンを抽出（後で.iniファイルに保存する）
method_values = dict(misc=dict(), demographic=dict())
method_values['misc']['python_ver'] = '.'.join(version.split()[:1])
method_values['misc']['pingouin_ver'] = pg.__version__

# 被験者数を算出（後で.iniファイルに保存する）
method_values['demographic']['n_subjects'] = len(dataset)
print('Number of subjects:', method_values['demographic']['n_subjects'])

# %%

# 基礎統計量を表にまとめる（後で.csvファイルに保存する）
index = pd.MultiIndex.from_tuples([
    ('internal', 'neuro'),
    ('external', 'extra'),
    ('internal', 'open'),
    ('external', 'agree'),
    ('internal', 'consc')])
index.names = ['highlevel', 'lowlevel']
table_descriptive = (dataset.describe()
                     .T[['mean', 'std']]
                     .set_index(index)
                     .sort_index(level=0))

table_descriptive
# %%

# 相関係数を算出（後で.csvファイルに保存する）
table_corrs = (pg.pairwise_corr(dataset, columns=['neuro'], padjust='bonf')
               .set_index('Y')
               .loc[:, ['r', 'p-unc', 'p-corr']])

table_corrs

# %%

# Scatter plot (後で.pngファイルに保存する)
fig_corrs = sns.regplot(data=dataset, x='neuro', y='open')

# %%

# 結果等をファイルに出力
parser = ConfigParser()
parser.read_dict(method_values)
parser.write(OUT_PATH_VAL_METHOD.open('w'))

table_descriptive.to_csv(OUT_PATH_TABLE_DESCRIPTIVE)

table_corrs.to_csv(OUT_PATH_TABLE_CORRS)
fig_corrs.figure.savefig(OUT_PATH_FIG)

```

</div></details>

これにより、.ini, .csv, .png ファイルを生成しました。

## .ini ファイル

```method.ini
[misc]
python_ver = 3.11.11
pingouin_ver = 0.5.4

[demographic]
n_subjects = 500
```
まず、`method.ini`という .ini ファイルが出力されました。
Method に記載する情報をまとめているので `method.ini` です。
使用した Python と pingouin パッケージのバージョンを、自動で出力しています。
また、プログラムによって被験者の人数を数えたところちょうど500人でしたので、それも記載しています。

このように、**論文に埋め込むべき数値や文字列などのデータを .ini ファイル[^1]にまとめます。**
[^1]: .ini ファイルは本来、設定を記述するためのファイル形式です。そのため結果を出力するには不適切とも思われます。しかし、より便利なファイル形式が見つからず、.ini を使っています。

## .csv ファイル

論文で報告する表は、.csv ファイルとして出力します。
↓まず、こういった形のマルチインデックスな表を出力しました。

![ss-table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304493/ff951813-52e8-4c9d-ae8c-9a7a05d55b19.png)

↓もうひとつ、相関係数を示した表を出力しました。

![ss-table2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304493/5beb1465-ca68-4c26-a5c7-bf72cac57595.png)

体裁を整えたうえで、論文に埋め込みましょう。

## 画像ファイル

↓こんな画像を図として出力しました。

![fig_scatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304493/e3d63a52-ff0f-4ded-26c5-6c242ab78af9.png)

これも論文に埋め込みます。

# ディレクトリ構造

出力したファイルたちは、すべて一つのディレクトリに保存します。
今のところ、以下のようなディレクトリ構成になっています。

```
project
├─ (解析に)
├─ (必要な
├─ (ファイルたち)
└─ result
   ├─ method.ini
   ├─ table_descriptive.csv
   ├─ table_corrs.csv
   └─ fig_scatter.png
```

# Step 1. Quarto のインストール

この記事では Visual Studio Code（VSCode）を介して Quarto を用います。
お好みに応じて RStudio などお使いください。
インストール方法については[別の記事](https://qiita.com/Sangen_u/items/ff7ee6ec1ef2c13f8f99)にお譲りします。

# Step 2. 執筆環境の準備

## ディレクトリの準備

論文の本文を書いていきます。
まずはディレクトリを用意しましょう。
`publish/paper`というディレクトリを作りましょう。

```
project
├─ (解析に必要なファイルたち)
├─ result
└─ publish  ←新規作成
   └─ paper  ←新規作成
```

Terminal（やコマンドプロンプトなど）で、`publish/paper` に移動します。

![ss-vscode-cd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304493/e3d08228-4c24-4fae-9141-e25e39eaa642.png)

## ジャーナルテンプレートの準備

Quarto は、メジャーなジャーナル用のテンプレートをいくつか用意してくれています。
[こちら](https://github.com/quarto-journals/)に一覧があります。
ググってみると、Quarto 公式以外が作成・共有してくれたテンプレートもあるようです。

ここでは、elsevier のテンプレートを使うこととしてみましょう。
ちゃんと Terminal で、`publish/paper` に移動しましたか？
そのまま Terminal にて、以下のコマンドです。

```
quarto use template quarto-journals/elsevier
```

> Do you trust the authors of this template

と尋ねられるので、`y` → `Enter` です。

> Create a subdirectory for template?

と尋ねられますが、もうディレクトリは準備したので、`n` → `Enter` です。

`paper` 以下に、いろいろなファイルやディレクトリが生成されます。
以下のファイル・ディレクトリは削除してしまって大丈夫です。
- placeholder.png
- style-guide/
- paper_files/

```
project
├─ (解析に必要なファイル)
├── result
└── publish
    └── paper
        ├── _extensions  ←Quartoが自動生成した
        │   └── quarto-journals
        │       └── elsevier
        ├── bibliography.bib  ←Quartoが自動生成した
        ├── paper.qmd  ←Quartoが自動生成した
        ├── paper_files  ←Quartoが自動生成したけど消してOK
        ├── placeholder.png  ←Quartoが自動生成したけど消してOK
        └── style-guide  ←Quartoが自動生成したけど消してOK
```

## R パッケージのインストール

Quarto 内で使用する R に、パッケージを３つインストールします。
R を開いて、R コンソールに以下をペーストします。

```
install.packages(c("ini", "kableExtra", "english"))
```

コンソールの表示に従ってインストールを進めてください。

## そのほかのツールを準備

Quarto を使うにあたって、いくつかのツールを作ってみました。
せっかくなのでこれらの使い方もこの記事でご紹介します。
[こちらのリポジトリ](https://github.com/issakuss/issych-quarto-tools)をまるっとダウンロードしてください。

中身を以下のように配置してください。
- `tools` を `paper/` 下に移動
- `_extensions/jcletter` を `paper/_extensions/` 下に移動
- `quarto-journal-cl.qmd` を `paper/`　下に移動

:::note warn
これらの自作コードは、R や Lua 等に不慣れな筆者が頑張って作ったものです。
計算機等に不具合を与えるような要素はないとは思いますが、自己責任でご利用ください。
:::

`post-render.py` というツールを動かすために、`_quarto.yaml` というファイルを作成してください。
場所は `paper.qmd` と同じ場所です。

```
project
├─ (解析に必要なファイル)
├── result
└── publish
    └── paper
        ├── _extensions
        │   ├── jcletter  ←DLして持ってくる
        │   └── quarto-journals
        ├── bibliography.bib
        ├── paper.qmd
        ├── quarto-journal-cl.qmd  ←DLして持ってくる
        ├── _quarto.yaml  ←新規作成
        └── tools  ←DLして持ってくる
            ├── helper.R  
            ├── insert_roles.lua
            └── post-render.py

```

`_quarto.yaml` には、以下のように記載します。

``` _quarto.yaml
project:
  post-render: tools/post-render.py
```

長くなりましたのでいったんここまでにします。
次回は[メタデータ記入からデータ埋め込みまで](https://qiita.com/issakuss/items/43f718a46f3834ed84f4)です。