Streamlit徹底解説:Pythonだけでデータアプリを驚くほど簡単に作成!🐍✨

はじめに:Streamlitとは?

Streamlit(ストリームリット)は、PythonスクリプトをインタラクティブなWebアプリケーションに変換するためのオープンソースフレームワークです。データサイエンティストや機械学習エンジニアが、複雑なフロントエンド技術(HTML, CSS, JavaScript)を学ぶことなく、分析結果やモデルを素早く共有できるツールとして急速に人気を集めています。

Streamlitの核心的なコンセプトは「シンプルさ」と「速さ」です。わずか数行のPythonコードで、データを表示したり、インタラクティブなウィジェット(ボタン、スライダー、テキスト入力など)を追加したりできます。コードを保存するたびにアプリが自動的に更新されるため、開発サイクルが非常に高速になります。🔄

主な特徴は以下の通りです:

  • Pythonicな開発体験: Pythonの知識だけでWebアプリを構築できます。
  • インタラクティブ性: スライダー、ボタン、ドロップダウンなどのウィジェットを簡単に追加できます。
  • データ可視化の容易さ: Pandas DataFrameや各種グラフ(Matplotlib, Plotly, Altairなど)を簡単に表示できます。
  • 高速な開発サイクル: コードの変更が即座にアプリに反映されます。
  • 簡単なデプロイ: Streamlit Community Cloudを使えば、無料で簡単にアプリを公開できます。

💡 豆知識: Streamlitは、2022年3月にデータクラウド企業であるSnowflakeに買収されました。これにより、Snowflakeのプラットフォームとの連携が強化され、エンタープライズレベルでの利用も加速しています。

🚀 Getting Started:インストールと最初のアプリ

Streamlitを始めるのは非常に簡単です。まず、Python環境(バージョン3.7以上推奨)がセットアップされていることを確認してください。次に、pipを使ってStreamlitをインストールします。

pip install streamlit

インストールが完了したら、簡単な「Hello World」アプリを作成してみましょう。以下のコードを `hello_app.py` という名前で保存してください。

import streamlit as st

st.title("🎈 My First Streamlit App")
st.write("Hello, Streamlit!")

name = st.text_input("あなたの名前を入力してください:", "Streamlit User")
st.write(f"こんにちは, {name}さん!")

次に、ターミナル(コマンドプロンプト)を開き、以下のコマンドを実行します。

streamlit run hello_app.py

これにより、Webブラウザが自動的に開き、作成したアプリが表示されます。テキストボックスに名前を入力すると、挨拶メッセージがリアルタイムで更新されることを確認できます。これがStreamlitのインタラクティブな開発体験です!

⚙️ Streamlitのコアコンセプト

Streamlitの魔法を理解するためには、いくつかの基本的なコンセプトを知っておくことが重要です。

1. スクリプト実行モデル

Streamlitアプリは、ユーザーがウィジェットを操作するたびに、Pythonスクリプト全体が上から下へ再実行されます。これは一見非効率に思えるかもしれませんが、状態管理をシンプルにし、開発者が複雑なコールバック関数などを意識する必要をなくします。

このモデルのパフォーマンスを最適化するために、Streamlitには強力なキャッシュ機能(`st.cache_data` と `st.cache_resource`)が用意されています。

2. データフロー

Streamlitでは、`st.`で始まる関数(コマンド)を呼び出すことで、テキスト、データ、グラフなどをアプリに追加します。これらのコマンドは、呼び出された順にアプリ上に表示されます。

import streamlit as st
import pandas as pd

# テキストを表示
st.write("これはテキストです。")

# データフレームを表示
df = pd.DataFrame({
    'col1': [1, 2, 3],
    'col2': [10, 20, 30]
})
st.dataframe(df)

# グラフを表示
st.line_chart(df)

上記のコードは、テキスト、データフレーム、折れ線グラフを順番に表示します。

3. ウィジェットと状態

ウィジェット(`st.button`, `st.slider`, `st.text_input` など)は、ユーザーからの入力を受け付ける要素です。ウィジェットの現在の値は、スクリプトの再実行時に変数に代入されます。

import streamlit as st

# スライダーウィジェット
age = st.slider("年齢を選んでください", 0, 100, 25) # 最小値, 最大値, デフォルト値
st.write(f"あなたの年齢は {age} 歳です。")

# ボタンウィジェット
if st.button("クリックしてください"):
    st.write("ボタンがクリックされました! 🎉")

ボタンのような一時的な状態を持つウィジェットの場合、その状態は1回の再実行の間だけ保持されます。複数回のインタラクションにわたって状態を保持したい場合は、`st.session_state` を使用します(後述)。

📊 主要な機能とウィジェット詳解

Streamlitには、アプリを構築するための豊富なコンポーネントが用意されています。ここでは主要なものをいくつか紹介します。

テキスト表示

コマンド 説明
st.title("タイトル") 大きなタイトルを表示します。
st.header("ヘッダー") セクションヘッダーを表示します。
st.subheader("サブヘッダー") サブセクションヘッダーを表示します。
st.write("テキスト", variable) テキスト、数値、データフレーム、グラフなど、様々なオブジェクトを「賢く」表示します。最も汎用的な表示コマンドです。
st.markdown("マークダウン**形式**の*テキスト*") Markdown記法を使ってテキストを表示します。
st.code("print('Hello')", language="python") シンタックスハイライト付きのコードブロックを表示します。
st.latex(r"\int_a^b f(x) dx") LaTeX形式の数式を表示します。

データ表示

コマンド 説明
st.dataframe(df) インタラクティブなテーブルとしてPandas DataFrameを表示します。ソートや検索が可能です。
st.table(df) 静的なテーブルとしてDataFrameや辞書などを表示します。
st.metric("指標名", value=123, delta=4) 主要な指標(KPI)とその変化量を表示します。
st.json({"key": "value"}) JSONデータを整形して表示します。

グラフ表示 📈

Streamlitは、様々なグラフ描画ライブラリとシームレスに連携します。

  • ネイティブチャート: st.line_chart(), st.bar_chart(), st.area_chart(), st.scatter_chart() など、簡単なグラフを素早く表示できます。これらはAltairベースです。
  • Matplotlib: st.pyplot(fig) でMatplotlibのFigureオブジェクトを表示できます。
  • Plotly: st.plotly_chart(fig) でPlotlyのインタラクティブなグラフを表示できます。
  • Altair: st.altair_chart(chart) でAltairのグラフを表示できます。
  • Vega-Lite: st.vega_lite_chart(spec) でVega-Liteの仕様に基づいたグラフを表示できます。
  • Pydeck: st.pydeck_chart(deck) で3Dマップ可視化ライブラリPydeckのチャートを表示できます。
  • Graphviz: st.graphviz_chart(graph) でGraphvizのグラフを表示できます。
  • Bokeh: st.bokeh_chart(p) でBokehのプロットを表示できます。
  • Mapbox: st.map(df) で緯度経度データを持つDataFrameを地図上にプロットできます(Mapboxベース)。
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px

# サンプルデータ
data = pd.DataFrame(np.random.randn(20, 3), columns=['a', 'b', 'c'])

# Streamlit ネイティブチャート
st.subheader("Streamlit Native Chart")
st.line_chart(data)

# Matplotlib
st.subheader("Matplotlib Chart")
fig, ax = plt.subplots()
ax.scatter(data['a'], data['b'])
st.pyplot(fig)

# Plotly
st.subheader("Plotly Chart")
fig_plotly = px.scatter(data, x='a', y='c')
st.plotly_chart(fig_plotly)

入力ウィジェット 🖱️

ユーザーからの入力を受け取るためのウィジェットです。

コマンド 説明 戻り値
st.button("ラベル") クリック可能なボタン。 クリックされたら True、そうでなければ False
st.checkbox("ラベル") チェックボックス。 チェックされていれば True、そうでなければ False
st.radio("ラベル", options) ラジオボタン(単一選択)。 選択されたオプションの値。
st.selectbox("ラベル", options) ドロップダウンリスト(単一選択)。 選択されたオプションの値。
st.multiselect("ラベル", options) 複数選択可能なドロップダウンリスト。 選択されたオプションのリスト。
st.slider("ラベル", min, max, value) 数値を選択するスライダー。 選択された数値。
st.select_slider("ラベル", options) リストから値を選択するスライダー。 選択された値。
st.text_input("ラベル") 一行のテキスト入力フィールド。 入力された文字列。
st.number_input("ラベル") 数値入力フィールド。 入力された数値。
st.text_area("ラベル") 複数行のテキスト入力エリア。 入力された文字列。
st.date_input("ラベル") 日付選択カレンダー。 選択された日付 (datetime.date)。
st.time_input("ラベル") 時刻選択。 選択された時刻 (datetime.time)。
st.file_uploader("ラベル", type=["csv", "png"]) ファイルアップロードウィジェット。 アップロードされたファイルオブジェクト (BytesIO)。
st.color_picker("ラベル") 色選択ウィジェット。 選択された色 (16進数文字列)。

レイアウトとコンテナ 📑

アプリのレイアウトを整理するための機能です。

  • st.sidebar: 画面左側に表示されるサイドバー領域を作成します。ウィジェットなどを配置するのに便利です。
    with st.sidebar:
        st.header("サイドバー")
        option = st.selectbox("オプション選択", ["A", "B", "C"])
  • st.columns(n) または st.columns([ratio1, ratio2, ...]): 画面を複数の列に分割します。
    col1, col2, col3 = st.columns(3)
    with col1:
        st.header("列1")
        st.write("これは列1の内容です。")
    with col2:
        st.header("列2")
        st.button("ボタン")
    # 比率を指定することも可能: col_a, col_b = st.columns([2, 1])
  • st.tabs(["Tab 1", "Tab 2"]): タブ切り替えのインターフェースを作成します。
    tab1, tab2 = st.tabs(["グラフ", "データ"])
    with tab1:
        st.line_chart(data)
    with tab2:
        st.dataframe(data)
  • st.expander("詳細を見る"): クリックすると展開・折りたたみ可能なセクションを作成します。
    with st.expander("詳細設定"):
        st.slider("詳細パラメータ", 0, 10)
  • st.container(): 要素をグループ化するための空のコンテナ。後から要素を追加したり、要素の表示順を制御したりするのに使えます。

ステータス表示と通知 ⏳

  • st.progress(value): 0から100(または0.0から1.0)の進捗バーを表示します。
  • st.spinner("処理中..."): 処理中にスピナー(くるくる回るアイコン)を表示します。with構文と組み合わせて使います。
    import time
    with st.spinner('お待ちください...'):
        time.sleep(3)
    st.success('完了しました!')
  • st.balloons() / st.snow(): ちょっとしたお祝いや季節感を出すためのアニメーション。🎈❄️
  • st.toast("メッセージ"): 画面右下に一時的に表示される短い通知。
  • st.error("エラーメッセージ") / st.warning("警告メッセージ") / st.info("情報メッセージ") / st.success("成功メッセージ"): 色付きのメッセージボックスを表示します。
  • st.exception(e): 例外オブジェクトを整形して表示します。デバッグに便利です。

制御フローと最適化 ⚡

  • st.form("フォームキー"): フォームを作成します。フォーム内のウィジェットは、フォーム内の送信ボタン(st.form_submit_button)が押されるまで値の変更がトリガーされません。これにより、複数の入力を一度に処理し、不要な再実行を防ぐことができます。
    with st.form("my_form"):
        name = st.text_input("名前")
        age = st.number_input("年齢", min_value=0)
        submitted = st.form_submit_button("送信")
        if submitted:
            st.write(f"名前: {name}, 年齢: {age}")
  • @st.cache_data: データ計算関数をキャッシュするためのデコレータ。関数の入力引数が変わらない限り、計算結果を再利用します。データフレームのロードや変換など、シリアライズ可能な結果を返す関数に適しています。
  • @st.cache_resource: グローバルリソース(MLモデル、DB接続など)をキャッシュするためのデコレータ。関数の引数に関わらず、一度だけ実行され、リソースを保持します。

⚠️ キャッシュの重要性: Streamlitの再実行モデルでは、重い計算やデータロードを毎回行うとパフォーマンスが低下します。@st.cache_data@st.cache_resourceを適切に使用することが、快適なアプリ体験のために非常に重要です。

セッションステート (st.session_state) 💾

Streamlitのスクリプトはインタラクションごとに再実行されるため、変数に代入した値は通常保持されません。複数回のインタラクションや再実行をまたいで状態(ユーザーの入力、計算結果など)を保持したい場合は、st.session_stateを使用します。

st.session_stateは辞書のようなオブジェクトで、キーと値のペアを保存できます。

import streamlit as st

# session_stateにカウンターがなければ初期化
if 'count' not in st.session_state:
    st.session_state.count = 0

# ボタンが押されたらカウンターを増やす
increment = st.button('カウントアップ')
if increment:
    st.session_state.count += 1

st.write('カウント:', st.session_state.count)

# session_stateはドット記法でもアクセス可能
# st.session_state['count'] += 1 と同じ
# st.session_state.count += 1

この例では、ボタンをクリックするたびにカウンターの値が増加し、その値がページのリロード(再実行)後も保持されます。セッションステートは、ユーザーごとの状態管理に不可欠な機能です。

📚 高度なトピック

マルチページアプリ (Multipage Apps)

Streamlitでは、複数のページを持つアプリケーションを簡単に作成できます。プロジェクトのルートディレクトリに `pages` という名前のサブディレクトリを作成し、その中に各ページに対応する `.py` ファイルを置くだけです。Streamlitは自動的にこれらのファイルを検出し、サイドバーにナビゲーションメニューを生成します。

ファイル構造の例:

your_project/
├── main_app.py       # メイン(ホームページ)のスクリプト
└── pages/
    ├── 1_📈_Data_Visualization.py
    ├── 2_🤖_Model_Inference.py
    └── About.py

ファイル名の先頭にある数字と絵文字(例: `1_📈_`)は、サイドバーでの表示順とアイコンを制御します。

カスタムコンポーネント (Custom Components)

Streamlitに組み込まれていない機能が必要な場合、HTML/JavaScript/CSSを使用して独自のコンポーネントを作成し、Streamlitアプリに統合することができます。これにより、Reactなどのフロントエンドライブラリを利用した複雑なUI要素を追加することも可能です。コミュニティによって作成された多くのカスタムコンポーネントも利用できます。

テーマ設定 (Theming)

アプリの外観(色、フォントなど)をカスタマイズできます。設定メニューから直接調整するか、プロジェクトルートの `.streamlit/config.toml` ファイルに設定を記述することで、カスタムテーマを適用できます。

[theme]
primaryColor="#F63366"
backgroundColor="#FFFFFF"
secondaryBackgroundColor="#F0F2F6"
textColor="#262730"
font="sans serif"

☁️ アプリケーションのデプロイ

作成したStreamlitアプリを他の人と共有するには、デプロイが必要です。いくつかの方法があります。

1. Streamlit Community Cloud

Streamlit公式が提供する無料のホスティングプラットフォームです。GitHubリポジトリと連携し、数クリックで簡単にアプリを公開できます。

  1. Streamlitアプリのコードと、依存ライブラリを記載した `requirements.txt` ファイルをGitHubの公開リポジトリにプッシュします。
  2. Streamlit Community Cloud にアクセスし、GitHubアカウントでサインアップ(またはログイン)します。
  3. 「New app」または「Create app」ボタンをクリックし、リポジトリ、ブランチ、メインのPythonファイル名を指定します。
  4. 「Deploy!」ボタンをクリックすると、数分でアプリがデプロイされ、公開URLが生成されます。🎉

Freeプランでは、公開アプリは無制限に、プライベートアプリは1つまでデプロイでき、メモリは1GBまで利用可能です。

2. Snowflake (Streamlit in Snowflake)

Snowflakeアカウントを持っている場合、StreamlitアプリをSnowflakeネイティブオブジェクトとしてデプロイできます。データがSnowflake内にある場合、データを外部に移動させることなく、Snowflakeのセキュリティとガバナンスの下でアプリを実行できます。SnowflakeのRBAC(ロールベースアクセス制御)を使用してアプリへのアクセスを管理できます。

3. その他のクラウドプラットフォーム

Heroku, AWS (EC2, Fargate, App Runnerなど), Google Cloud Platform (Cloud Run, App Engineなど), Microsoft Azure (App Serviceなど) といった主要なクラウドプロバイダーにもデプロイ可能です。多くの場合、Dockerコンテナを利用してデプロイします。これらのプラットフォームでは、より柔軟なスケーリングや構成が可能ですが、設定はStreamlit Community Cloudよりも複雑になります。

4. オンプレミス/自社サーバー

もちろん、自社のサーバーやプライベートクラウド環境にStreamlitアプリをデプロイすることも可能です。この場合、サーバーの設定、セキュリティ、スケーリングなどを自前で管理する必要があります。

🎯 Streamlitのユースケース

Streamlitはその手軽さから、様々な用途で活用されています。

  • データ探索ダッシュボード: データをインタラクティブに探索し、可視化するためのダッシュボードを素早く作成できます。
  • 機械学習モデルのデモ/インターフェース: 学習済みモデルの予測結果を試したり、ハイパーパラメータを調整したりするためのUIを簡単に構築できます。画像分類、テキスト生成などのデモに最適です。
  • 社内ツール: 特定の業務プロセスを支援するための簡単なツール(データ入力フォーム、レポート生成など)を迅速に開発できます。
  • プロトタイピング: アイデアを素早く形にし、フィードバックを得るためのプロトタイプ作成に適しています。
  • 教育・プレゼンテーション: データ分析の手順やアルゴリズムの動作をインタラクティブに説明するための教材として利用できます。
  • データ収集・アノテーション: 簡単なデータ入力インターフェースを作成し、データ収集やアノテーション作業に活用できます。

💡 まとめと今後の展望

Streamlitは、Pythonだけで驚くほど簡単に、そして迅速にインタラクティブなWebアプリケーションを作成できる強力なフレームワークです。データサイエンティストやエンジニアが、分析結果やモデルを手軽に共有し、活用するためのハードルを大幅に下げてくれます。

主な利点:

  • 学習コストが低い(Pythonの知識があればOK)
  • 開発スピードが速い
  • 豊富なウィジェットとグラフ表示機能
  • 簡単なデプロイオプション(特にStreamlit Community Cloud)
  • 活発なコミュニティと豊富なドキュメント

Snowflakeによる買収後、エンタープライズ向けの機能強化やSnowflakeプラットフォームとの統合が進んでおり、ビジネスシーンでの活用もますます広がっていくことが予想されます。また、コミュニティによるカスタムコンポーネント開発も活発で、機能拡張の可能性は無限大です。

まだStreamlitを試したことがない方は、ぜひこの機会にインストールして、簡単なアプリから作り始めてみてください。きっとその手軽さとパワフルさに驚くはずです!🚀

公式ドキュメントやギャラリーには、さらに多くの情報やインスピレーションを与えるサンプルが満載ですので、ぜひ訪れてみてください。
Streamlit公式サイト 公式ドキュメント アプリギャラリー