Streamlitとは
Streamlitはデータサイエンティストやエンジニアが簡単に対話的なWebアプリを作成できるPythonライブラリです。機械学習モデルやデータの可視化を共有するための最適なツールです。
Streamlitのコアコンセプト:「スクリプトからアプリへ」。Pythonスクリプトを書くだけで、自動的にインタラクティブなWebアプリに変換されます。
インストールと初期設定
1
Streamlitのインストール:
pip install streamlit
2
インストールの確認:
streamlit hello
3
最初のアプリの作成 (app.py):
import streamlit as st
st.title('My First Streamlit App')
st.write('Hello, World!')
4
アプリの実行:
streamlit run app.py
テキスト表示要素
基本テキスト表示
st.title('タイトル')
st.header('ヘッダー')
st.subheader('サブヘッダー')
st.text('プレーンテキスト')
リッチテキスト
st.markdown('**太字**')
st.code('コードブロック')
st.latex(r'\alpha + \beta')
st.write('万能表示関数')
st.write()
は多くのデータ型をサポートしているため、最も汎用的です。DataFrameやグラフも表示できます。
入力ウィジェット
基本入力
st.button('ボタン')
st.checkbox('チェックボックス')
st.radio('ラジオ', ['A', 'B'])
st.selectbox('選択', ['X', 'Y'])
数値・テキスト入力
st.text_input('テキスト入力')
st.number_input('数値', min_value=0)
st.slider('スライダー', 0, 100)
st.text_area('複数行入力')
日付・時間選択
st.date_input('日付')
st.time_input('時間')
ファイルアップロード
st.file_uploader('ファイルをアップロード')
すべての入力ウィジェットは変数に代入して値を取得できます。例:
age = st.slider('年齢', 0, 100)
データ表示
データフレーム
import pandas as pd
df = pd.DataFrame({
'名前': ['太郎', '花子'],
'年齢': [25, 28]
})
st.dataframe(df) # インタラクティブ表示
st.table(df) # 静的な表示
メトリクス
st.metric('売上', '¥12,345', '↑2.5%')
JSON表示
st.json({'a': 1, 'b': 2})
レイアウト
サイドバー
st.sidebar.title('サイドバーメニュー')
カラム
col1, col2 = st.columns(2)
with col1:
st.header('列1')
with col2:
st.header('列2')
タブ
tab1, tab2 = st.tabs(['タブ1', 'タブ2'])
with tab1:
st.write('タブ1の内容')
with tab2:
st.write('タブ2の内容')
エクスパンダー
with st.expander('詳細を表示'):
st.write('詳細情報...')
コンテナ
with st.container():
st.write('グループ化された要素')
データ可視化
基本的なグラフ
import numpy as np
import pandas as pd
# データ生成
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['A', 'B', 'C'])
# 折れ線グラフ
st.line_chart(chart_data)
# エリアチャート
st.area_chart(chart_data)
# 棒グラフ
st.bar_chart(chart_data)
高度な可視化 (Matplotlib)
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter([1, 2, 3], [1, 2, 3])
st.pyplot(fig)
インタラクティブな可視化 (Plotly)
import plotly.express as px
df = px.data.gapminder()
fig = px.scatter(
df, x="gdpPercap", y="lifeExp",
size="pop", color="continent"
)
st.plotly_chart(fig)
地図表示
import pandas as pd
df = pd.DataFrame({
'lat': [35.6812, 34.6937],
'lon': [139.7671, 135.5023],
'name': ['東京', '大阪']
})
st.map(df)
高度な機能
キャッシュ
@st.cache_data
def get_data():
# 時間のかかる処理
return data
セッション状態
if 'counter' not in st.session_state:
st.session_state.counter = 0
st.session_state.counter += 1
st.write(f"カウント: {st.session_state.counter}")
コールバック
def button_callback():
st.session_state.clicked = True
st.button('クリック', on_click=button_callback)
プログレスバー
import time
progress_bar = st.progress(0)
for i in range(100):
progress_bar.progress(i + 1)
time.sleep(0.1)
フォーム送信
with st.form('my_form'):
name = st.text_input('名前')
age = st.number_input('年齢', 0, 120)
submitted = st.form_submit_button('送信')
if submitted:
st.write(f'こんにちは {name} さん!')
便利なTips
ページ設定
st.set_page_config(
page_title="アプリ名",
page_icon="🧊",
layout="wide",
initial_sidebar_state="expanded"
)
※必ずスクリプトの先頭で実行してください。
カスタムCSS
st.markdown("""
""", unsafe_allow_html=True)
マルチページアプリ
pagesフォルダ内にページごとのPythonファイルを配置:
📁 my_app/
├── 📄 app.py # メインページ
└── 📁 pages/
├── 📄 page1.py # サブページ1
└── 📄 page2.py # サブページ2
デプロイ
Streamlitアプリをデプロイする主な方法:
- Streamlit Cloud 最も簡単
- Heroku カスタマイズ可能
- AWS/GCP 高度な設定が可能
アプリの動作が遅い場合は、
@st.cache_data
を使用して重い処理をキャッシュすることで高速化できます。