okpy

Pythonエンジニア兼テックリーダーが、多くのプロジェクトとチーム運営から得た実践的な知識を共有するブログです。

Pythonで作った分析結果、まさかJupyter Notebookのスクショで共有してませんか?

Pythonで作った分析結果、まさかJupyter Notebookのスクショで共有してませんか?

📝 TL;DR (3行要約)

Streamlitは、あなたが書いたPythonスクリプトを、わずか数行のコードでインタラクティブなWebアプリケーションに変換してくれる魔法のようなライブラリです。データ分析の結果や機械学習モデルのデモを、技術者でない人にも分かりやすく共有したいときに真価を発揮します。最大の利点は、HTMLやCSSJavaScriptといったWebの専門知識がほとんど不要で、驚くほど迅速に動くアプリを構築できることです。


1. 🤔 一体Streamlitとは何?(核心的な役割と主な使用例)

Pythonでデータ分析や機械学習モデルの試作をしていると、必ず「この結果、どうやって他の人に見せよう?」という壁にぶつかります。Jupyter Notebookのスクリーンショットを撮ってSlackに貼ったり、頑張ってPowerPointにまとめたり…でも、それって少し味気ないし、何より「もしこのパラメータを変えたらどうなるの?」という相手の疑問に即座に答えられませんよね。

ここで登場するのがStreamlitです。

核心的な役割: あなたのPythonコードを「対話できるWebページ」に翻訳する魔法の杖 🪄

Streamlitの核心的な役割をたとえるなら、Pythonスクリプト専門の超優秀な同時翻訳家」です。

あなたが普段書いているデータ処理やグラフ描画のPythonコードがありますよね。Streamlitに「この部分をスライダーにして」「このデータフレームを表で見せて」「このグラフを描画して」と、簡単な命令(st.slider()st.dataframe()といった関数)を書き加えるだけで、その翻訳家が瞬時にすべてをWebページ上の対話可能な部品(ウィジェット)や表示に"翻訳"してくれるのです。

本来、Webアプリケーションを作るには、データを処理するバックエンド(Pythonなど)と、見た目や操作を担当するフロントエンド(HTML, CSS, JavaScript)の両方が必要で、これらを連携させるのは初心者には非常に高いハードルでした。Streamlitは、このフロントエンド開発の大部分を自動化してくれるため、あなたは使い慣れたPythonだけに集中していれば良いのです。データサイエンティストや研究者が、自分の分析やモデルの価値を最大限に伝えるための強力な武器、それがStreamlitです。

主な使用例

この「PythonコードをWebアプリに翻訳する」という役割が、具体的にどのような場面で輝くのか、代表的な例を3つ見てみましょう。

  1. 📊 インタラクティブなデータダッシュボードの構築 これが最もポピュラーな使い方です。例えば、売上データを分析したとします。ただ静的なグラフを見せるのではなく、Streamlitを使えば「期間」を指定する日付選択カレンダーや、「製品カテゴリ」を選ぶドロップダウンリストをWebページ上に設置できます。チームメンバーや上司がブラウザ上でこれらの条件をポチポチと変えるだけで、グラフや集計表がリアルタイムに更新される…そんな動的なレポートを驚くほど簡単に作れます。これにより、会議での議論が深まったり、新たなインサイトが生まれたりするきっかけになります。

  2. 🤖 機械学習モデルのデモ(プロトタイピング) あなたが苦労して開発した画像認識モデルや自然言語処理モデル。その性能を他の人に見せるのは一苦労です。Streamlitがあれば、ユーザーが画像をアップロードしたり、テキストを入力したりするインターフェースを数行のコードで作成できます。ユーザーがアクションを起こすと、裏側であなたのPythonスクリプトがモデルを動かし、予測結果をブラウザに表示する、といったデモアプリがすぐに完成します。これにより、モデルの具体的な動作を直感的に理解してもらうことができ、フィードバックも集めやすくなります。

  3. 🛠️ ちょっとした社内ツールの作成 本格的なWebアプリを作るほどではないけれど、定型的なデータ処理を誰でも簡単に実行できるようにしたい、というニーズはよくあります。例えば、「CSVファイルをアップロードしたら、特定の処理をかけて結果をグラフ化し、ダウンロードできるようにするツール」などです。Streamlitを使えば、このような便利な内製ツールを、Web開発専門のエンジニアに頼むことなく、分析担当者自身が迅速に開発できます。

このようにStreamlitは、分析や開発の「最後のワンマイル」、つまり「作ったものを、いかに効果的に他者と共有するか」という課題をエレガントに解決してくれるライブラリなのです。


2. 💻 インストール方法

Streamlitのインストールは非常に簡単です。ターミナル(WindowsならコマンドプロンプトPowerShell)を開いて、以下のpipコマンドを一行実行するだけです。

pip install streamlit

これだけで、あなたの環境でStreamlitを使う準備が整います。PandasやNumPyといったデータ分析でよく使われるライブラリも一緒に使うことが多いので、まだインストールしていない場合は、同様にpip install pandas numpyも実行しておくと良いでしょう。


3. 🛠️ 実際に動作するサンプルコード

百聞は一見に如かず。Streamlitがいかにシンプルで強力か、実際に動くコードで体感してみましょう。

以下のコードを、my_first_app.pyのような名前でファイルに保存してください。そして、ターミナルでそのファイルがあるディレクトリに移動し、streamlit run my_first_app.pyと実行してみてください。自動的にブラウザが立ち上がり、インタラクティブなWebアプリが表示されるはずです!

import streamlit as st
import pandas as pd
import numpy as np

# --- アプリの基本設定 ---
# ページのタイトルとアイコンを設定(ブラウザのタブに表示される)
st.set_page_config(page_title="初めてのStreamlitアプリ", page_icon="📊")

# --- メイン画面のコンテンツ ---
# アプリのメインタイトル
st.title("📊 インタラクティブなデータ可視化アプリ")

# アプリの説明文
st.write(
    "これはStreamlitを使って作成したシンプルなデータ可視化アプリです。"
    "左のサイドバーから設定を変更すると、表示されるデータやグラフが動的に変わります。"
)


# --- サイドバーのコンテンツ ---
# サイドバーにヘッダーを表示
st.sidebar.header("⚙️ 設定")

# 1. 表示するデータ点の数を決めるスライダー
# st.sidebar.slider(ラベル, 最小値, 最大値, デフォルト値)
num_points = st.sidebar.slider(
    label="表示するデータ点の数",
    min_value=10,
    max_value=100,
    value=50  # 初期値
)

# 2. グラフの種類を選択するセレクトボックス
# st.sidebar.selectbox(ラベル, (選択肢のタプル))
chart_type = st.sidebar.selectbox(
    label="グラフの種類を選択",
    options=("折れ線グラフ", "棒グラフ", "エリアチャート")
)


# --- データの生成と表示 ---
# ヘッダー
st.header("📈 生成されたデータとグラフ")

# ユーザーの選択に基づいてダミーデータを生成
# NumPyを使ってランダムなデータを生成
# 3列のデータ(a, b, c)をnum_points行だけ作成
data = pd.DataFrame(
    np.random.randn(num_points, 3),
    columns=['a', 'b', 'c']
)

# 生成したデータをインタラクティブなテーブルで表示
st.write("生成されたデータ:")
st.dataframe(data)

# ユーザーが選択したグラフの種類に応じて、グラフを描画
st.write(f"表示中のグラフ: **{chart_type}**")

if chart_type == "折れ線グラフ":
    st.line_chart(data)
elif chart_type == "棒グラフ":
    st.bar_chart(data)
elif chart_type == "エリアチャート":
    st.area_chart(data)

# ちょっとしたおまけ機能
if st.checkbox("🎉 紙吹雪を表示"):
    st.balloons()

4. 🔍 コードの詳細説明

上記のサンプルコード、思ったよりシンプルだと思いませんでしたか?Pythonの基本的な知識があれば、何をしているか大体想像がつくはずです。ここでは、コードをいくつかの塊(チャンク)に分けて、それぞれの役割を詳しく見ていきましょう。

1. ライブラリのインポートと初期設定

import streamlit as st
import pandas as pd
import numpy as np

st.set_page_config(page_title="初めてのStreamlitアプリ", page_icon="📊")
  • 最初の3行は、おなじみのライブラリのインポートです。streamlitstという愛称(エイリアス)で呼ぶのがコミュニティの慣習です。
  • st.set_page_config()は、アプリ全体の基本的な設定を行う関数です。ここではブラウザのタブに表示されるタイトルとアイコンを指定しています。この関数は、スクリプトの中で最初に呼び出すStreamlitの関数である必要があります。

2. メイン画面のタイトルと説明文

st.title("📊 インタラクティブなデータ可視化アプリ")
st.write(
    "これはStreamlitを使って作成したシンプルなデータ可視化アプリです。"
    "左のサイドバーから設定を変更すると、表示されるデータやグラフが動的に変わります。"
)
  • st.title()は、Webページ上に大きな見出し(HTMLの<h1>タグに相当)を表示します。
  • st.write()は、万能な表示関数です。テキスト、データフレーム、辞書など、様々なものをいい感じに表示してくれます。Markdown記法も使えるので、**太字***イタリック*なども表現できます。

3. サイドバーでのユーザー入力受付

st.sidebar.header("⚙️ 設定")

num_points = st.sidebar.slider(...)
chart_type = st.sidebar.selectbox(...)
  • ここがStreamlitの魔法の核心部分です! st.sidebarを先頭につけるだけで、そのウィジェット(操作部品)が画面左側のサイドバーに配置されます。
  • st.slider()は、ドラッグできるスライダーを生成します。ユーザーがスライダーを動かすと、その現在の値が戻り値として変数num_pointsに格納されます。
  • st.selectbox()は、ドロップダウン形式の選択リストを生成します。ユーザーがリストから項目を選ぶと、その選ばれた文字列が変数chart_typeに格納されます。
  • このように、Streamlitではウィジェット関数を呼び出すだけで、ユーザーからの入力をPythonの変数として直接受け取れる」のです。これが、Web開発の知識がなくてもインタラクティブなアプリを作れる秘密です。

4. データの生成と表示

st.header("📈 生成されたデータとグラフ")

data = pd.DataFrame(
    np.random.randn(num_points, 3),
    columns=['a', 'b', 'c']
)

st.dataframe(data)
  • ここでは、サイドバーのスライダーでユーザーが指定したnum_pointsの数だけ、ランダムなデータを行として持つPandasのDataFrameを作成しています。
  • st.dataframe()は、PandasのDataFrameを、ソートやスクロールが可能なリッチなテーブルとしてWebページに表示してくれます。

5. ユーザーの選択に応じたグラフの描画

if chart_type == "折れ線グラフ":
    st.line_chart(data)
elif chart_type == "棒グラフ":
    st.bar_chart(data)
elif chart_type == "エリアチャート":
    st.area_chart(data)
  • ここは通常のPythonif/elif文です。サイドバーのセレクトボックスでユーザーが選択したchart_type変数の値に応じて、表示するグラフを切り替えています。
  • st.line_chart(), st.bar_chart(), st.area_chart()は、DataFrameを渡すだけで簡単に見栄えの良いグラフを描画してくれる便利な関数です。

サイドバーのスライダーやセレクトボックスを操作してみてください。操作するたびに、データフレームの行数や表示されるグラフの種類が瞬時に切り替わるのがわかるはずです。これがStreamlitが提供する「インタラクティブな体験」です。


5. ⚠️ 注意点またはヒント

Streamlitは非常に直感的ですが、その裏側の仕組みを知らないと初心者がハマってしまう可能性のある、一つだけ重要な「お作法」があります。

罠: すべての操作は「スクリプトの再実行」を引き起こす!

サンプルアプリのサイドバーでスライダーを少し動かしたときのことを思い出してください。グラフが更新されましたよね。このとき、Streamlitの裏側では何が起きているのでしょうか?

正解はmy_first_app.pyスクリプトが、1行目から最後まで丸ごと再実行されている」です。

Streamlitは、ユーザーがウィジェットを操作するたびに、Pythonスクリプト全体を上から実行し直し、その結果として得られたWebページの構成を再描画するという、非常にシンプルな仕組みで動いています。

この仕組みはアプリの開発を簡単にする一方で、注意しないとパフォーマンスの低下を招きます。例えば、スクリプトの冒頭で巨大なCSVファイル(数GBなど)を読み込んだり、時間のかかる機械学習モデルをロードしたりする処理を書いていたとしましょう。すると、ユーザーがスライダーをちょっと動かしただけなのに、そのたびに数秒〜数分かかる重い処理が毎回実行されてしまい、アプリが使い物にならなくなってしまいます。

ヒント: @st.cache_data@st.cache_resource で賢く高速化しよう!

この問題を解決するために、Streamlitは強力なキャッシュ機能を提供しています。それが@st.cache_data@st.cache_resourceというデコレータです。

  • @st.cache_data: データフレームの読み込みや、時間のかかる計算など、「結果をデータとして返却する関数」に使います。
  • @st.cache_resource: 機械学習モデルのロードや、データベース接続の確立など、「グローバルなリソース(オブジェクト)を返却する関数」に使います。

使い方は簡単で、時間のかかる処理を関数として定義し、その関数の直前に@st.cache_dataまたは@st.cache_resourceと一行書き加えるだけです。

# 例:重いデータ読み込み処理をキャッシュする
@st.cache_data
def load_heavy_data(file_path):
    # この中の処理は、file_pathが同じである限り、
    # 2回目以降は実行されずにキャッシュされた結果が即座に返される
    df = pd.read_csv(file_path)
    # ... 時間のかかる前処理 ...
    return df

# アプリのメイン処理
my_dataframe = load_heavy_data("my_very_large_data.csv")
st.dataframe(my_dataframe)

こうすることで、Streamlitは関数の初回実行時に結果をメモリ(キャッシュ)に保存します。そして2回目以降、同じ引数でこの関数が呼び出された際には、実際の処理をスキップして、保存しておいた結果を瞬時に返してくれるのです。

「Streamlitでは、ウィジェットを操作するとスクリプトが再実行される。だから、時間のかかる処理は関数にまとめてキャッシュデコレータを付けよう」——これだけは、ぜひ覚えておいてください。


6. 🔗 一緒に見ておくと良いライブラリ

Streamlitは単体でも強力ですが、他のライブラリと組み合わせることで、その表現力はさらに向上します。次に学ぶべきライブラリとして、特におすすめしたいのが一つあります。

Plotly (プロットリー)

Streamlitに標準で備わっているst.line_chartなども手軽で便利ですが、より複雑で、美しく、そしてインタラクティブなグラフを作成したい場合にPlotlyは最高の相棒になります。

  • なぜPlotlyなのか?: Plotlyで作成したグラフは、マウスオーバーで詳細な数値を表示したり、特定の凡例をクリックして表示/非表示を切り替えたり、グラフの一部をズームしたりといった、リッチな操作が可能です。
  • Streamlitとの連携: StreamlitはPlotlyを公式にサポートしており、st.plotly_chart()という専用の関数が用意されています。Plotlyで作成したグラフオブジェクトをこの関数に渡すだけで、あなたのStreamlitアプリ内にインタラクティブなグラフを埋め込むことができます。

データ可視化の表現力を一段階引き上げたいと思ったら、ぜひPlotlyの学習にも挑戦してみてください。Streamlitアプリの魅力が格段にアップします。


7. 🎉 まとめ

今日は、Pythonスクリプトを驚くほど簡単にインタラクティブなWebアプリに変身させるライブラリ、Streamlitについて学びました。

  • Streamlitの核心: Pythonだけで、データ分析の結果や機械学習モデルを共有するための動的なWebアプリが作れる。
  • 基本的な使い方: st.title, st.slider, st.dataframe のように st. から始まるシンプルな関数をコードに加えるだけ。
  • 重要な注意点: ウィジェットを操作するたびにスクリプト全体が再実行される。重い処理には @st.cache_data を使ってパフォーマンスを維持しよう。

もうJupyter Notebookのスクリーンショットを共有する必要はありません。これからは、あなたの分析やアイデアを、誰もが触って試せる「生きた形」で共有しましょう。

最後に、今日学んだことを定着させるための挑戦課題です。ぜひ取り組んでみてください!

  1. 新しいグラフの追加: サンプルコードのst.selectboxに、選択肢として"エリアチャート"を追加し、それが選ばれたときにはst.area_chart(data)を使ってエリアチャートが表示されるように改造してみましょう。(※サンプルコードには既に追加済みでしたね!では、st.checkboxを追加して、「データを表示する/しない」を切り替えられるようにしてみましょう!)
  2. あなたのデータで試す: あなたが持っているCSVファイルや、Pandasで扱えるデータを読み込んで、それを表示する自分だけのStreamlitアプリを作ってみましょう。特定の列をst.selectboxで選べるようにして、選んだ列のヒストグラムst.bar_chartで表示するなど、工夫次第で可能性は無限大です。

Happy Streamlit-ing! 🚀