分析環境比較:Jupyter vs Marimo vs Observable でデータ分析環境を構築する
オープンソースラボ編集部 ・ 2026年6月14日
分析環境比較:Jupyter vs Marimo vs Observable でデータ分析環境を構築する
データサイエンティスト・AI研究者がPython/SQL/JavaScriptでインタラクティブなデータ分析・可視化・レポートを行うためのコンピュテーショナルノートブック環境のOSSが進化しています。Jupyter(業界標準・最大シェア)・Marimo(リアクティブ・再現性重視)・Observable(JavaScript特化・リアルタイム可視化)の3つが2026年の注目OSS分析環境です。
ノートブック環境を使う理由
- インタラクティブ分析: データの探索・可視化・モデル学習を同一環境で実行してすぐに結果確認
- 再現性: 分析手順をノートブックとして保存・共有してチームが同じ結果を再現
- プレゼンテーション: コード・数式・グラフ・テキストを1つのドキュメントとして出力
- コラボレーション: クラウド上でリアルタイム共同編集・コメント・バージョン管理
主要ツールの概要
Jupyter
2014年公開、Python製のOSSです。GitHubスター15k+(JupyterHub)。業界標準のインタラクティブノートブックで、Python・R・Julia・SQLなど100以上のカーネルに対応し、最大のエコシステムを持ちます。JupyterLabとJupyterHubで個人〜大規模チームまで対応します。
# docker-compose.yml: JupyterHub + GPU対応
version: "3.8"
services:
jupyterhub:
image: jupyterhub/jupyterhub:5.0
restart: unless-stopped
ports:
- "8000:8000"
volumes:
- ./jupyterhub_config.py:/srv/jupyterhub/jupyterhub_config.py
- jupyterhub_data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
DOCKER_JUPYTER_IMAGE: jupyter/datascience-notebook:latest
DOCKER_NETWORK_NAME: jupyterhub_network
HUB_IP: jupyterhub
jupyter-lab:
image: jupyter/datascience-notebook:latest
restart: unless-stopped
ports:
- "8888:8888"
volumes:
- ./notebooks:/home/jovyan/work
environment:
JUPYTER_ENABLE_LAB: "yes"
JUPYTER_TOKEN: ${JUPYTER_TOKEN}
command: start-notebook.sh --NotebookApp.base_url=/lab
volumes:
jupyterhub_data:
networks:
jupyterhub_network:
external: true
# Python: JupyterHub REST APIでユーザー・サーバー管理を自動化
import requests
HUB_URL = 'http://localhost:8000'
API_TOKEN = 'admin-api-token'
headers = {'Authorization': f'token {API_TOKEN}'}
def create_user(username: str):
resp = requests.post(f'{HUB_URL}/hub/api/users/{username}', headers=headers)
return resp.json()
def start_user_server(username: str, profile: str = ''):
data = {'profile': profile} if profile else {}
resp = requests.post(f'{HUB_URL}/hub/api/users/{username}/server', headers=headers, json=data)
return resp.status_code
def get_server_status(username: str) -> dict:
resp = requests.get(f'{HUB_URL}/hub/api/users/{username}', headers=headers)
return resp.json().get('servers', {})
def execute_notebook_via_api(nb_path: str, parameters: dict) -> str:
'''Papermill経由でノートブックをパラメーター付きで実行'''
import papermill as pm
output_path = nb_path.replace('.ipynb', '_output.ipynb')
pm.execute_notebook(nb_path, output_path, parameters=parameters)
return output_path
# 使用例: 毎日の売上分析ノートブックを自動実行
result = execute_notebook_via_api(
'notebooks/daily_sales_analysis.ipynb',
parameters={'date': '2026-06-14', 'region': 'JP'},
)
print(f'ノートブック実行完了: {result}')
Marimo
2023年公開、Python製のOSSです。GitHubスター9k+。リアクティブなPythonノートブックで、セルの実行順序を自動決定(DAGベース)・セルを変更すると依存セルが自動再実行・.pyファイルとして保存(.ipynb非依存)・Gitフレンドリー・スライダー/ドロップダウンがデフォルトでインタラクティブというモダンな設計が特徴です。
# Marimo インストールと起動
pip install marimo
marimo edit notebook.py # エディタ起動
marimo run notebook.py # アプリとして公開(ユーザーが操作可能なWebアプリ)
# Docker での起動
docker run -p 2718:2718 -v $(pwd):/app marimo-python marimo edit --host 0.0.0.0 --port 2718 /app/notebook.py
# Marimo ノートブック例(.py ファイルとして保存)
import marimo
app = marimo.App()
@app.cell
def load_data():
import pandas as pd
df = pd.read_csv('sales.csv', parse_dates=['date'])
return df,
@app.cell
def select_month(df):
month = marimo.ui.slider(1, 12, value=6, label='Month')
filtered = df[df['date'].dt.month == month.value]
return month, filtered
@app.cell
def plot_revenue(filtered, month):
import altair as alt
chart = (
alt.Chart(filtered)
.mark_bar()
.encode(x='date:T', y='revenue:Q', color='product:N')
.properties(title=f'Month {month.value} Revenue')
)
return chart,
if __name__ == '__main__':
app.run()
Observable
2017年公開、JavaScript製のOSSです。GitHubスター8k+(Observable Framework)。JavaScriptネイティブのリアルタイムリアクティブノートブックで、D3.js・Vega-Lite・Plot.jsなどの可視化ライブラリと深く統合し、Webブラウザでリアルタイムにデータダッシュボードをノートブックとして作成します。Observable Frameworkはデータサイトのビルドツールとして使えます。
// Observable Framework: データダッシュボード(JavaScript)
// sales-dashboard.md に埋め込むコードセル
// データ読み込み(CSVまたはAPIから)
const sales = FileAttachment("sales.csv").csv({typed: true})
// インタラクティブなフィルター
const month = Inputs.range([1, 12], {value: 6, step: 1, label: "Month"})
const region = Inputs.select(["JP", "US", "EU"], {label: "Region"})
// リアクティブな集計(月・地域が変わると自動再計算)
const filtered = sales.filter(d => d.month === month && d.region === region)
const totalRevenue = d3.sum(filtered, d => d.revenue)
// 可視化
Plot.plot({
title: `Revenue: ${region} - Month ${month}`,
marks: [
Plot.barY(filtered, {x: "date", y: "revenue", fill: "product"}),
Plot.ruleY([0]),
],
color: {legend: true},
})
機能比較表
| 比較項目 | Jupyter | Marimo | Observable |
|---|---|---|---|
| 言語 | Python・R・100+ | Python | JavaScript |
| リアクティブ実行 | △ | ✅ 自動DAG | ✅ |
| Git親和性 | △(.ipynb JSON) | ✅(.py) | ✅ |
| 可視化エコシステム | Matplotlib・Plotly | Altair・Plotly | D3・Vega-Lite |
| GitHub Stars | 15k+ (Hub) | 9k+ | 8k+ |
ノートブック分析環境はLLM Toolsカテゴリ/categories/llm-toolsのLlamaIndex・LangChainのRAGパイプライン開発・プロトタイピングとして使用するのが定番で、JupyterLabでClaude API・OpenAI APIを直接呼び出して結果を確認する開発ワークフローが広く採用されています。DevOpsカテゴリ/categories/devopsのPostgreSQL・DuckDB・ClickHouseにJupyterのSQLマジック(%sql)やsqlalchemyで接続してBIレポートを自動生成するパターンも一般的です。
FAQ
Q. JupyterHubをチームで安全に運用するポイントは?
A. Dockerスポーナー・ユーザー別ストレージ・JupyterHub SSO・リソース制限の設定が重要です。①Dockerスポーナー: c.DockerSpawner.imageでユーザーごとにDockerコンテナを隔離→ユーザーA・Bが同じサーバーを共有しない②リソース制限: c.DockerSpawner.mem_limit = '4G'・c.DockerSpawner.cpu_limit = 2.0でGPU・CPU・メモリを制限③SSO統合: oauthenticatorでGitHub・Google・KeycloakでSSO認証→チームのGoogleアカウントでログイン④データ永続化: c.DockerSpawner.volumes = {'jupyterhub-user-{username}': '/home/jovyan'}でユーザーデータを永続化。
Q. MarimoノートブックをインタラクティブなWebアプリとして公開するには?
A. marimo run notebook.pyでノートブックをWebアプリとして起動します。marimo runモードではコードセルが非表示になりUIウィジェット(スライダー・ドロップダウン・ボタン)のみが表示されます→非エンジニアがブラウザでパラメーターを操作できるデータダッシュボードになります。Docker公開: FROM ghcr.io/marimo-team/marimo:latest→COPY notebook.py .→CMD ["marimo", "run", "--host", "0.0.0.0", "--port", "2718", "notebook.py"]→Nginxリバースプロキシでhttps://dashboard.example.comとして公開。WebSocket対応: marimoはWebSocketを使ってリアルタイム更新するのでNginxでWebSocket対応(proxy_set_header Upgrade $http_upgrade)が必要。
Q. JupyterのノートブックをCI/CDパイプラインで自動実行するには?
A. Papermillを使ってパラメーター付きでノートブックを自動実行してレポートを生成します。①pip install papermill nbconvert②コマンド: papermill input.ipynb output.ipynb -p date 2026-06-14 -p region JP(-pでパラメーターを渡す)③HTML変換: jupyter nbconvert --to html output.ipynb→レポートHTMLをS3にアップロード→Slackに共有URL通知④GitHub Actions: schedule: cron: '0 9 * * 1'(毎週月曜9時)でPapermillを実行→aws s3 cp report.html s3://reports/でS3にアップロード→curl -X POST $SLACK_WEBHOOK -d '{"text":"週次レポート生成完了: https://..."}'でSlack通知。
Q. MarimoとJupyterのどちらを新規プロジェクトで選ぶべきですか?
A. 既存エコシステム・チームのJupyter経験・外部ツール連携が重要ならJupyter、再現性・Git管理・モダンなDX・Webアプリ公開が重要ならMarimoが向いています。Marimo優位: ①.pyファイルとして保存→gitでdiff・PRレビューが自然②リアクティブ実行(セルを変更すると依存セルが自動再実行)→「実行順序を気にする」問題がない③marimo runでノートブックをWebアプリとして即公開④marimo export htmlでHTMLレポートを生成。Jupyter優位: ①R・Julia・SQL・Scala等100+カーネルのエコシステム②IPyWidgets・Voila・Panel等の成熟した拡張機能③JupyterHubによる大規模マルチユーザー対応④既存のJupyterノートブック資産をそのまま活用。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| 業界標準・多言語・大規模チーム | Jupyter(Lab+Hub) |
| 再現性・Git管理・WebアプリUI | Marimo |
| JavaScript・D3可視化・リアルタイム | Observable Framework |