分析単位でフォルダーを分ける
データ、コード、作成物を役割ごとに分けます。元データは読み取り専用と考え、加工後データを別の場所へ出します。
構成例TEXT
sales-analysis/
├── data/
│ ├── raw/
│ └── processed/
├── R/
├── output/
├── tests/
├── README.md
└── sales-analysis.Rproj相対パスを使う
自分のPCだけで動く絶対パスを避け、プロジェクトのルートを基準にします。スクリプト内でsetwd()を繰り返すと実行順に依存するため避けます。
パスを組み立てるR
input_path <- file.path("data", "raw", "sales.csv")
output_path <- file.path("output", "summary.csv")
dir.create("output", showWarnings = FALSE)
print(input_path)実行結果OUTPUT
[1] "data/raw/sales.csv"実行順をスクリプトに残す
新しいRセッションから上から順に実行して同じ結果になる状態を目指します。対話操作で作った変数に頼りません。
分析スクリプトの流れR
# 1. 必要な関数を読み込む
source(file.path("R", "summarize_sales.R"))
# 2. 元データを読む
sales <- read.csv(file.path("data", "raw", "sales.csv"))
# 3. 検証・変換・集計
summary <- summarize_sales(sales)
# 4. 結果を保存
write.csv(summary, file.path("output", "summary.csv"), row.names = FALSE)パッケージを導入する
CRANのパッケージはinstall.packages()で導入し、library()で読み込みます。関数の出所を明示したい場合はpackage::function()形式を使えます。
バージョンとヘルプR
packageVersion("ggplot2")
help(package = "ggplot2")
ggplot2::ggplotスクリプトと導入を分ける 分析スクリプトを実行するたびにインターネット接続や更新が発生しないよう、導入処理は分けます。
renvで依存関係を記録する
renvはプロジェクトごとのパッケージ環境とロックファイルを管理します。
基本の流れR
install.packages("renv") # 最初の一度
renv::init() # プロジェクトを初期化
renv::snapshot() # 使用版をrenv.lockへ記録
renv::status() # 状態を確認
# 別環境では renv::restore()renv.lockはGitへ含めますが、パッケージ本体を保存するrenv/library/は通常含めません。
環境とデータの出所を記録する
sessionInfo()でR、OS、読み込んだパッケージの情報を確認できます。READMEには取得元、取得日、加工内容、実行方法を記載します。
環境情報を保存R
writeLines(capture.output(sessionInfo()), file.path("output", "session-info.txt"))READMEへ書くこと
- 分析の目的と前提
- データの出所、取得日、利用条件
- 実行するスクリプトの順序
- 必要なRとパッケージ環境
- 作成物と既知の制限
安全に管理する
公開前の確認
- 個人情報、認証情報、非公開データをGitへ含めない
.RenvironやAPIキーを公開しない- データとパッケージの利用条件を確認する
- 出所不明のコードをそのまま実行しない
- 元データを加工結果で上書きしない
.Rhistoryや.RDataへ偶然保存された値にも注意します。起動時に以前の作業空間を自動復元せず、スクリプトから再作成できる状態が安全です。
ミニ課題:再現できる分析フォルダー
小さなCSVを元データとして置き、読み込み、検証、集計、グラフ保存までを新しいRセッションから一度で実行できる構成を作ってください。
完成条件
- 元データと出力が別フォルダー
- 絶対パスと手作業に依存しない
- READMEに実行方法がある
- パッケージの版を記録できる
- 出力を削除しても再生成できる
