🐙

Pythonノートブックを簡単にWebアプリ化する方法を調べてみた!

に公開

はじめに

こんにちは!データサイエンティストをしているTakoです🐙
データ分析をして結果を見せる時どうしていますか?
Pythonノートブックで分析をすることが多いので、できるだけノートブックに手を加えず
かつアウトプットを作れたらなと考えている今日この頃です・・・。
そしてそれが分析実績として積み上げれればなおいいな・・・と考えています。
今回はノートブックにほとんど手を加えずに
いい感じにアウトプットを作成する方法を考えていきたいと思います!
(※あくまでも、手をできるだけ加えずにが目標なのでstreamlitやdashには触れません。)

どんな選択肢がある?

Gemini先生に色々聞いてみました。

Gemini教えて~。

普段Pythonノートブック(ipynb形式)でデータ分析をしているんだけど、

その分析結果をいい感じに出したいんだよね。。

streamlitやdashだと結果を出力するために色々コードを足さないといけないので大変。

できるだけノートブックに追加のコードを書かずにアウトプットを作る方法ってない?

おすすめは以下でした。

  1. Quarto (クォート)
  2. Mercury (マーキュリー)
  3. Voila (ヴォアラ)

他にも調べた感じだと、下記がありました。
4. Jupyter book ver2
5. Google ColabでGradioやフォーム機能を使う

中々幅広い選択肢がありますね。
この中で Voila は使って個人的にはイマイチだったのと、
Google colab はチームの方針で使用していませんので割愛します。
また、Jupyter Book は公式サイトのデモが非常に美しいのですが、
どちらかというと書籍作成に特化しているので、今回は割愛します。

公式ドキュメントを見て、Quarto と Mercury のそれぞれの特徴を見てみましょう!
結論、Quarto がプレゼン資料作成やナレッジためるのに一番向いていると感じました。
なので、Quartoについてが多めですが、Mercuryも少しだけ触れています。

Quarto

概要

公式ドキュメント

Markdown内で実行可能なPythonコードをサポートしており、
これにより完全に再現可能(どんな環境でも同じ)なドキュメントやレポートの作成が可能になります。Pythonコードはドキュメントの一部になり、レンダリングされるたびに再実行されます。
PythonとJupyterパッケージとの親和性が非常に高く、
ノートブックをそのまま読み込んで、HTML、PDF、DOCX、PPTXに変換することができます。

メリット:

  • Pythonコードの追加ゼロでノートブックのMarkdownセルと出力結果(グラフや表)を綺麗に整形するだけです
    • ノートブック内にYAMLを書くことで、オプションを追加することができる
      • e.g. コマンド一つでコードセルを隠して結果だけ見せることができます
  • HTML出力なら、Plotlyなどのインタラクティブなグラフも動きます
  • `ノートブックのアウトプットが更新されたときに、HTMLも更新されます
  • Markdown, R, ipynbなど多種のファイルをHTML化できる

デモ

基本的な使い方

  1. Quarto CLIをインストールします
  2. VScodeの拡張機能(quarto.quarto)をインストールして
    ノートブック上で Ctrl + Shift + k もしくは三点(・・・)を押下するとpreview画面が出てきます
  3. quarto render document.ipynb とコマンドを実行することで、レンダリングされます
    (今回はPreviewで見ていきます)

Preview画面
何も手を加えることなくドキュメントになっています!めちゃくちゃ簡単ですね!
一点注意点ですが、Plotlyのようなインタラクティブなグラフを反映させるには
fig.show() -> fig.show(renderer="notebook") に変更する必要があります。

表示の設定を変えたい場合はYAML記法で書いて、ノートブック内のMarkdownセルに追加します。

追加の設定
---
title: "Understanding the Basic of SARIMA Model"
author: "Tako"
date: "2025-12-14"
categories: ["Basic", "SARIMA"]
format:
    html:
        toc: true
        toc-depth: 2
        code-fold: true
jupyter: python3
---

設定を追加することで作成日、目次、コードの非表示とカスタムすることができます。

キャッシュ機能を使ってみる

jupyter-cache を使うことでアウトプットの更新が随時反映できます。
必要なパッケージを pip インストールして、

pip install jupyter-cache

以下のようにYAMLを書くだけです。

追加の設定
---
title: "Understanding the Basic of SARIMA Model"
author: "Tako"
date: "2025-12-14"
categories: ["Basic", "SARIMA"]
format:
    html:
        toc: true
        toc-depth: 2
        code-fold: true
execute: # ここを追加  
    cache: true # ここを追加
jupyter: python3
---

これでコードを編集してアウトプットが変わったときにHTML側のアウトプットも変更されます。

これも追加するといい?
execute:
freeze: auto  # re-render only when source changes

freezeオプションを入れることで、レンダリングは内容が変わったときだけと設定ができます。
(これはipynbファイルだと不要?かもしれません)

Website機能を使ってみる

一つのノートブックしか処理できないの?と不安になっていた、そこのあなた!安心してください。
ディレクトリ単位でのHTML化が可能となっています。
少し設定ファイル必要にはなりますが、ノートブックはいじらずにいい感じのページを作成できます。

これから個人的には使っていこうってことで、ポートフォリオサイトを作成してみました。


めちゃくちゃいい感じのサイトが簡単に作られちゃいました・・・😎
Github Actionsを使えば、プッシュするたびにサイトの更新もできちゃいます。

やり方は簡単です。まずは _quarto.yml を作業フォルダ直下に作成して
Webサイトの設定と構成を作成します。

設定ファイル
project:
  type: website  # ここを website にする

# ここでWebサイト上に表示されるタイトルとナビゲーションバー(コンテンツ)を設定
website:
  title: "Tako Data Science Lab"
  navbar:
    left:
      - href: index.qmd
        text: Home
      - href: analysis.qmd  # ここに分析ページへのリンクを追加
        text: Analysis
      - href: demo.qmd  # ここに学習用分析ページへのリンクを追加
        text: Deno Analyses
      - href: about.qmd
        text: About

format:
  html:
    theme: cosmo
    toc: true
execute:
  cache: true
  freeze: auto  # re-render only when source changes

細かい設定部分の話は割愛しますが、navbar 内の href で指定しているファイルが肝になってきます。例えば demo.qmd だと、下記のように書かれています。

demo
---
title: "学習したものをまとめる場所"
listing:
    contents: demo/**/*.ipynb # notebooksフォルダの中身を全部リスト化
    type: grid                # default, table, grid など選べる
    sort: "date desc"
---

ipynb のファイルのパスを正規表現等で指定してあげるだけで、下記のようなページが作成されます。

ちなみにHomeはMarkdownだけで書いています。

Home
---
title: "データ分析プロジェクト ホーム"
---
# 📊 医療費分析ハブへようこそ

このウェブサイトは、時系列予測のための状態空間モデル解析を中心に、様々なPython/Rノートブックを集約したデータ分析のポートフォリオサイトです。

## プロジェクトの目的

* **透明性**: 各分析におけるデータ処理とモデル構築のプロセスを完全に公開します。
* **再現性**: Quartoの機能により、すべてのコードが再現可能な形で文書化されています。
* **一元管理**: 異なる言語(Python, R)で作成されたノートブックを、一つの洗練されたウェブサイトにまとめています。

---

## 🧐 分析レポートを見る

ナビゲーションバーの「[Analysis]」または「[Python分析]」から、各分析レポートのカード形式のリストにアクセスできます。各レポートは独立したノートブックとして作成されており、クリックすることで中身を詳細に確認できます。

### 📁 主なトピック

* SARIMAモデルによる医療費トレンド予測
* 地域別人口動態データを用いた要因分析
* 保険診療費と自由診療費の比較分析

ディレクトリ指定の場合は Markdown, R, Python, Pythonノートブック と
色々なファイルを同時に使うことができます。すっごい便利ですね!

フォルダ構成はこんな感じになっていれば動きます。

他にも読み物として作成したい場合は Bookとういう機能や、
もっとおしゃれにしたい場合はDashboard機能があります。

まとめ

Quarto はパット資料化したいときにも便利ですし、
今までの成果のポートフォリオ作成だとかができて、非常に便利だなと印象を受けました。
まず、ノートブックに手を加えないのが美しいですね。
頑張ればダッシュボード機能を使って拡張できそうですし
ipywidgetsも使えるので、より洗練されたものは作成できそうですね。
個人的には今後ポートフォリオ作りまくりたいので、作成したサイトを更新していきます!

Mercury

概要

公式ドキュメント
Githubリポジトリ

ノートブックに手を加えることなく、簡単なコマンドの実行でWebアプリ化をすることができます。ノートブック内の変数をウィジェット(スライダーやドロップダウン)として操作できる動的Webアプリになります。

メリット:

  • Quartoと同じく、Pythonコードの追加ゼロでノートブックのMarkdownセルと出力結果(グラフや表)を綺麗に整形するだけ
  • 変数を変更したりとインタラクティブなサイトを作成できます
  • 変数も自動的に見やすい位置に配置してくれます

デメリット:

  • 変数を動的に動かしたい場合はmercury独自の書き方をする必要があります
    • ipywidgetを使っているくらいの感覚であれば、そんなに負荷が増えるわけではなさそうです
  • 動的ゆえに、ユーザーが変数を変更するたびにPythonが実行されるので、動作が遅くなる可能性がある
    • 個人的にはかなりネックな部分でした
  • Pythonノートブックのみに使えて、Rは対応していません
    • ノートブック内のMarkdownは対応しています

デモ

基本的な使い方

インストールしたらすぐdemoを動かすことができます。

pip install mercury
mercury run demo

こんな感じでノートブックごとにボードが作られます。


DataFrame and Plots を開いてみると
streamlit ぽく、左端に変数の操作をするウィジェットが作られます。
ただ、重すぎる・・・。(少しのコードなのにぶっちゃけ鈍いなと感じました。)

個人的にドキュメントもあまり整理されていない気がしました。
ドキュメント曰く、下記のコードを動かすだけでアプリは作成されるはずなのですが、、

# ノートブックと同じディレクトリ直下で
mercury run

確かに作成はされますが、demoが一緒についてきたり、
表示されているアウトプットが欠けていたりしました。
安定性はないのかなと感じました。(対処法知っている方いれば教えてください。。)

この直下でしているのに

デモファイルがいっぱい

まとめ

動的に動かせるウィジェットがあるのはすごく魅力的で、
デモンストレーションをにはすごくいいなと感じました。
ただ、どちらかというと、がっちり作ったデモアプリの共有に使う用な気がしていて、
ナレッジを蓄積するのには向いていないのかなと感じました。
あとは動的が故に処理が重くなるのが気になりますね。

最後に

結果としてはQuarto が一番欲しいものに近い気がしました。
これが導入できるか検討していって、ナレッジをためていければと思います。
HTML, PDF, PPTXなど様々なファイルに置換もできるので、
社内外でのプレゼン資料としても活用できそうでいいですね!
チームで使えなくても個人的に使っていこうと思います(笑)

Discussion