📋 このステップで学ぶこと
Plotly Dash完全ガイド(構成要素と使い方)
レイアウトコンポーネント(HTML、Dashコア)
コールバックの詳細(複数入力/出力、State)
Streamlit入門(シンプルで高速なフレームワーク)
リアルタイムダッシュボードの実装
デプロイ方法(Heroku、Streamlit Cloud)
🎯 1. Plotly Dash完全ガイド
なぜDashを学ぶのか
STEP 39で経営ダッシュボードの基礎を学びました。このステップでは、より高度なDashの機能 と、もう一つのフレームワークStreamlit を学びます。
DashとStreamlitを使いこなせば、データ分析の結果をWebアプリとして公開 し、社内外の人々と共有できるようになります。
【Dashの3つの構成要素】
Plotly Dashは、3つの主要コンポーネントから構成されます:
1. Layout(レイアウト)
→ アプリの見た目(UI)を定義
→ html.Div, dcc.Graph などを配置
2. Callback(コールバック)
→ ユーザー操作への反応を定義
→ @app.callback デコレータを使用
3. Server(サーバー)
→ アプリを実行・提供
→ app.run_server() で起動
🔧 Dash vs Streamlit 比較
項目
Plotly Dash
Streamlit
学習コスト
やや高い
低い(すぐ使える)
カスタマイズ性
高い(細かく制御可能)
中程度
コード量
多め
少ない
向いている用途
本格的な業務アプリ
プロトタイプ、データ分析
デプロイ
Heroku、AWS など
Streamlit Cloud(無料)
Dashアプリの基本構造
まず、Dashアプリの全体像を理解しましょう。
【Dashアプリの基本構造】
import dash
from dash import dcc, html
from dash.dependencies import Input, Output
# ========== 1. アプリの初期化 ==========
app = dash.Dash(__name__)
# __name__ を渡すことで、静的ファイル(CSS、画像)の
# パスを自動的に解決してくれます。
# ========== 2. レイアウト ==========
app.layout = html.Div([
# UIコンポーネントを配置
html.H1(‘タイトル’),
dcc.Dropdown(id=’dropdown’, …),
dcc.Graph(id=’graph’)
])
# レイアウトはhtml.Divを親として、
# 子要素をリストで渡します。
# ========== 3. コールバック ==========
@app.callback(
Output(‘graph’, ‘figure’), # 更新先
Input(‘dropdown’, ‘value’) # 入力元
)
def update_graph(selected_value):
# selected_valueに基づいてグラフを作成
fig = …
return fig
# ユーザーがdropdownを変更すると、
# この関数が自動的に呼ばれます。
# ========== 4. サーバー起動 ==========
if __name__ == ‘__main__’:
app.run_server(debug=True)
# debug=True にすると:
# ・コード変更時に自動リロード
# ・エラー時に詳細表示
📐 2. レイアウトコンポーネント
HTMLコンポーネント
dash.html モジュールには、HTMLタグに対応するコンポーネントが用意されています。
📐 主要なHTMLコンポーネント
コンポーネント
対応するHTML
用途
html.Div
<div>
コンテナ(他の要素をまとめる)
html.H1〜H6
<h1>〜<h6>
見出し
html.P
<p>
段落テキスト
html.Button
<button>
ボタン
html.A
<a>
リンク
html.Img
<img>
画像
html.Label
<label>
ラベル(入力欄の説明)
【HTMLコンポーネントの書き方】
from dash import html
layout = html.Div([
html.H1(‘ダッシュボード’), # 大見出し
html.H2(‘売上分析’), # 中見出し
html.P(‘データを可視化します’), # 段落テキスト
html.Button(‘更新’, id=’btn’), # ボタン
html.A(‘詳細’, href=’https://example.com’) # リンク
])
【スタイルの適用】
style引数で、CSSスタイルを辞書形式で渡します:
html.H1(
‘タイトル’,
style={
‘color’: ‘white’,
‘backgroundColor’: ‘#0068B7’,
‘padding’: ’20px’,
‘textAlign’: ‘center’
}
)
注意: CSSプロパティはキャメルケースで書きます
background-color → backgroundColor
text-align → textAlign
Dashコアコンポーネント
dash.dcc モジュールには、インタラクティブなUIコンポーネントが用意されています。
🔧 主要なDashコアコンポーネント
コンポーネント
用途
主なプロパティ
dcc.Graph
Plotlyグラフを表示
id, figure
dcc.Dropdown
ドロップダウン選択
id, options, value, multi
dcc.Slider
スライダー
id, min, max, step, value
dcc.Input
テキスト入力
id, type, value, placeholder
dcc.DatePickerRange
日付範囲選択
id, start_date, end_date
dcc.Checklist
チェックボックス(複数選択)
id, options, value
dcc.RadioItems
ラジオボタン(単一選択)
id, options, value
dcc.Interval
定期的な更新トリガー
id, interval, n_intervals
【Dashコアコンポーネントの書き方】
from dash import dcc
# ========== ドロップダウン ==========
dropdown = dcc.Dropdown(
id=’dropdown’, # 一意のID(コールバックで参照)
options=[ # 選択肢のリスト
{‘label’: ‘東京’, ‘value’: ‘tokyo’},
{‘label’: ‘大阪’, ‘value’: ‘osaka’},
{‘label’: ‘名古屋’, ‘value’: ‘nagoya’}
],
value=’tokyo’, # 初期値
multi=False # True で複数選択可能
)
# ========== スライダー ==========
slider = dcc.Slider(
id=’slider’,
min=0, # 最小値
max=100, # 最大値
step=10, # ステップ幅
value=50, # 初期値
marks={0: ‘0’, 50: ’50’, 100: ‘100’} # 目盛り
)
# ========== 日付選択 ==========
date_picker = dcc.DatePickerRange(
id=’date-picker’,
start_date=’2024-01-01′,
end_date=’2024-12-31′,
display_format=’YYYY-MM-DD’
)
# ========== チェックリスト ==========
checklist = dcc.Checklist(
id=’checklist’,
options=[
{‘label’: ‘商品A’, ‘value’: ‘A’},
{‘label’: ‘商品B’, ‘value’: ‘B’}
],
value=[‘A’] # 初期選択
)
レイアウト例: 完全なダッシュボード
実際のダッシュボードレイアウトを作成してみましょう。
▼ 入力するコード(ダッシュボードレイアウト)
import dash
from dash import dcc, html
app = dash.Dash(__name__)
app.layout = html.Div([
# ========== ヘッダー ==========
html.Div([
html.H1(‘売上ダッシュボード’,
style={‘color’: ‘white’, ‘margin’: ‘0’}),
], style={
‘backgroundColor’: ‘#0068B7’,
‘padding’: ’20px’,
‘textAlign’: ‘center’
}),
# ========== フィルターエリア ==========
html.Div([
# 地域選択
html.Div([
html.Label(‘地域:’, style={‘fontWeight’: ‘bold’}),
dcc.Dropdown(
id=’region’,
options=[
{‘label’: ‘全国’, ‘value’: ‘all’},
{‘label’: ‘関東’, ‘value’: ‘kanto’},
{‘label’: ‘関西’, ‘value’: ‘kansai’}
],
value=’all’,
style={‘width’: ‘200px’}
)
], style={‘display’: ‘inline-block’, ‘marginRight’: ’20px’}),
# 期間選択
html.Div([
html.Label(‘期間:’, style={‘fontWeight’: ‘bold’}),
dcc.DatePickerRange(
id=’date-range’,
start_date=’2024-01-01′,
end_date=’2024-12-31′
)
], style={‘display’: ‘inline-block’})
], style={‘padding’: ’20px’, ‘backgroundColor’: ‘#f8f9fa’}),
# ========== グラフエリア ==========
html.Div([
# 左側: 売上推移
html.Div([
dcc.Graph(id=’sales-graph’)
], style={‘width’: ‘60%’, ‘display’: ‘inline-block’}),
# 右側: カテゴリ別
html.Div([
dcc.Graph(id=’category-graph’)
], style={‘width’: ‘40%’, ‘display’: ‘inline-block’})
])
])
if __name__ == ‘__main__’:
app.run_server(debug=True)
🔄 3. コールバックの詳細
コールバックの仕組み
コールバックは、Dashの心臓部 です。ユーザーの操作(入力)に応じて、画面の一部(出力)を自動的に更新します。
【コールバックの基本構造】
@app.callback(
Output(‘出力先のID’, ‘更新するプロパティ’),
Input(‘入力元のID’, ‘監視するプロパティ’)
)
def 関数名(入力値):
# 処理
return 更新する値
【具体例】
@app.callback(
Output(‘graph’, ‘figure’), # graphのfigureを更新
Input(‘dropdown’, ‘value’) # dropdownのvalueを監視
)
def update_graph(selected_value):
# selected_valueに基づいてグラフを作成
fig = create_graph(selected_value)
return fig
【動作の流れ】
1. ユーザーがdropdownを「東京」から「大阪」に変更
2. dropdownのvalueプロパティが変化
3. update_graph関数が自動的に呼ばれる
4. 関数がfigを返す
5. graphのfigureプロパティが更新される
6. 画面上のグラフが再描画される
基本的なコールバック
▼ 入力するコード(基本的なコールバック)
from dash import Dash, dcc, html, Input, Output
import plotly.graph_objects as go
app = Dash(__name__)
app.layout = html.Div([
html.H1(‘商品別売上グラフ’, style={‘textAlign’: ‘center’}),
dcc.Dropdown(
id=’dropdown’,
options=[
{‘label’: ‘商品A’, ‘value’: ‘A’},
{‘label’: ‘商品B’, ‘value’: ‘B’},
{‘label’: ‘商品C’, ‘value’: ‘C’}
],
value=’A’,
style={‘width’: ‘200px’, ‘margin’: ’20px auto’}
),
dcc.Graph(id=’graph’)
])
@app.callback(
Output(‘graph’, ‘figure’),
Input(‘dropdown’, ‘value’)
)
def update_graph(selected):
# 商品ごとのデータ
data = {
‘A’: [10, 15, 13, 17, 20],
‘B’: [16, 12, 18, 14, 22],
‘C’: [8, 11, 14, 16, 19]
}
# グラフ作成
fig = go.Figure()
fig.add_trace(go.Bar(
x=[‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’],
y=data[selected],
marker_color=’#0068B7′
))
fig.update_layout(
title=f’商品{selected}の月別売上’,
xaxis_title=’月’,
yaxis_title=’売上(万円)’
)
return fig
if __name__ == ‘__main__’:
app.run_server(debug=True)
複数の入力と出力
コールバックは、複数の入力 を受け取り、複数の出力 を返すことができます。
【複数の入力と出力】
# 複数の入力
@app.callback(
Output(‘graph’, ‘figure’),
[Input(‘dropdown’, ‘value’), # 入力1
Input(‘slider’, ‘value’), # 入力2
Input(‘date-picker’, ‘start_date’)] # 入力3
)
def update_graph(product, target, start_date):
# 3つの入力を使ってグラフを作成
…
return fig
# 複数の出力
@app.callback(
[Output(‘graph1’, ‘figure’), # 出力1
Output(‘graph2’, ‘figure’), # 出力2
Output(‘text’, ‘children’)], # 出力3
Input(‘dropdown’, ‘value’)
)
def update_dashboard(selected):
fig1 = … # グラフ1
fig2 = … # グラフ2
text = … # テキスト
return fig1, fig2, text
# 返り値は出力と同じ順序でタプルで返す
▼ 入力するコード(複数入力・出力)
from dash import Dash, dcc, html, Input, Output
import plotly.graph_objects as go
app = Dash(__name__)
app.layout = html.Div([
html.H1(‘売上ダッシュボード’, style={‘textAlign’: ‘center’}),
# フィルター
html.Div([
html.Label(‘商品:’),
dcc.Dropdown(
id=’dropdown’,
options=[
{‘label’: ‘商品A’, ‘value’: ‘A’},
{‘label’: ‘商品B’, ‘value’: ‘B’}
],
value=’A’,
style={‘width’: ‘150px’, ‘display’: ‘inline-block’}
),
html.Label(‘目標:’, style={‘marginLeft’: ’20px’}),
dcc.Slider(
id=’slider’,
min=0, max=30, step=5, value=15,
marks={0: ‘0’, 15: ’15’, 30: ’30’}
)
], style={‘padding’: ’20px’}),
# グラフ
dcc.Graph(id=’graph’),
# テキスト
html.Div(id=’text’, style={‘padding’: ’20px’, ‘fontSize’: ’18px’})
])
@app.callback(
[Output(‘graph’, ‘figure’),
Output(‘text’, ‘children’)],
[Input(‘dropdown’, ‘value’),
Input(‘slider’, ‘value’)]
)
def update_dashboard(product, target):
# データ
data = {
‘A’: [10, 15, 13, 17],
‘B’: [16, 12, 18, 14]
}
values = data[product]
# グラフ作成
fig = go.Figure()
fig.add_trace(go.Bar(
x=[‘1月’, ‘2月’, ‘3月’, ‘4月’],
y=values,
marker_color=’#0068B7′
))
# 目標線を追加
fig.add_hline(y=target, line_dash=’dash’, line_color=’red’,
annotation_text=f’目標: {target}’)
fig.update_layout(title=f’商品{product}の売上’)
# テキスト作成
avg = sum(values) / len(values)
status = ‘達成’ if avg >= target else ‘未達’
text = f’商品{product}の平均売上: {avg:.1f}万円(目標{target}万円、{status})’
return fig, text
if __name__ == ‘__main__’:
app.run_server(debug=True)
State(状態管理)
State は、コールバックをトリガーしない が、値を参照したい場合に使います。例えば、ボタンをクリックしたときだけ、入力欄の値を使いたい場合です。
【InputとStateの違い】
Input: 値が変わるとコールバックが発火する
State: 値が変わってもコールバックは発火しない(参照のみ)
【例: 検索機能】
・入力欄に文字を入力中 → まだ検索しない
・「検索」ボタンをクリック → 検索を実行
@app.callback(
Output(‘result’, ‘children’),
Input(‘button’, ‘n_clicks’), # ボタンクリックで発火
State(‘input’, ‘value’) # 入力値を参照(発火しない)
)
def search(n_clicks, search_term):
if n_clicks is None or n_clicks == 0:
return ‘検索してください’
return f’検索結果: {search_term}’
▼ 入力するコード(State使用例)
from dash import Dash, dcc, html, Input, Output, State
app = Dash(__name__)
app.layout = html.Div([
html.H1(‘検索アプリ’, style={‘textAlign’: ‘center’}),
html.Div([
dcc.Input(
id=’search-input’,
type=’text’,
placeholder=’検索ワードを入力…’,
style={‘width’: ‘300px’, ‘padding’: ’10px’, ‘fontSize’: ’16px’}
),
html.Button(
‘検索’,
id=’search-button’,
style={
‘marginLeft’: ’10px’,
‘padding’: ’10px 20px’,
‘backgroundColor’: ‘#0068B7’,
‘color’: ‘white’,
‘border’: ‘none’,
‘cursor’: ‘pointer’
}
)
], style={‘textAlign’: ‘center’, ‘padding’: ’20px’}),
html.Div(
id=’search-result’,
style={‘textAlign’: ‘center’, ‘fontSize’: ’18px’, ‘padding’: ’20px’}
)
])
@app.callback(
Output(‘search-result’, ‘children’),
Input(‘search-button’, ‘n_clicks’),
State(‘search-input’, ‘value’)
)
def search(n_clicks, search_term):
# ボタンがクリックされていない場合
if n_clicks is None or n_clicks == 0:
return ‘検索ワードを入力して「検索」ボタンをクリックしてください’
# 検索ワードが空の場合
if not search_term:
return ‘検索ワードを入力してください’
# 検索結果を表示
return f’「{search_term}」の検索結果: {n_clicks}件見つかりました’
if __name__ == ‘__main__’:
app.run_server(debug=True)
⚡ 4. Streamlit入門
Streamlitとは
Streamlit は、数行のコードでWebアプリ を作れるフレームワークです。Dashよりもシンプルで、プロトタイプを素早く作りたい場合に最適です。
【Streamlitの特徴】
✓ シンプル: 数行でアプリ完成
✓ 高速: コード変更が即座に反映
✓ Pythonのみ: フロントエンド知識不要
✓ 無料デプロイ: Streamlit Cloudで公開
【インストール】
pip install streamlit
【実行方法】
streamlit run app.py
↑ ブラウザが自動的に開きます
【DashとStreamlitの違い】
Dash:
・レイアウトとコールバックを分離
・細かいカスタマイズが可能
・コード量は多め
Streamlit:
・上から下に順番に実行
・ユーザー操作で全体が再実行
・コード量が少ない
Streamlitの基本
▼ 入力するコード(Streamlit基本)
※ app.pyとして保存し、streamlit run app.py で実行
import streamlit as st
import pandas as pd
import plotly.graph_objects as go
# ========== タイトル ==========
st.title(‘🚀 売上ダッシュボード’)
st.write(‘Streamlitで作成したダッシュボードです’)
# ========== サイドバー ==========
st.sidebar.header(‘フィルター’)
region = st.sidebar.selectbox(
‘地域を選択’,
[‘全国’, ‘関東’, ‘関西’, ‘中部’]
)
threshold = st.sidebar.slider(
‘目標売上(万円)’,
min_value=0,
max_value=200,
value=100
)
# ========== データ ==========
df = pd.DataFrame({
‘月’: [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’],
‘売上’: [80, 95, 110, 105, 120, 130]
})
# ========== メトリクス ==========
st.subheader(‘📊 KPI’)
col1, col2, col3 = st.columns(3)
col1.metric(‘合計売上’, f'{df[“売上”].sum()}万円’, ‘+15%’)
col2.metric(‘平均売上’, f'{df[“売上”].mean():.0f}万円’, ‘+8%’)
col3.metric(‘最高売上’, f'{df[“売上”].max()}万円’)
# ========== グラフ ==========
st.subheader(‘📈 月別売上推移’)
fig = go.Figure()
fig.add_trace(go.Bar(x=df[‘月’], y=df[‘売上’], marker_color=’#0068B7′))
fig.add_hline(y=threshold, line_dash=’dash’, line_color=’red’,
annotation_text=f’目標: {threshold}万円’)
fig.update_layout(xaxis_title=’月’, yaxis_title=’売上(万円)’)
st.plotly_chart(fig, use_container_width=True)
# ========== データテーブル ==========
st.subheader(‘📋 データテーブル’)
st.dataframe(df, use_container_width=True)
# ========== フッター ==========
st.info(f’選択された地域: {region}’)
🔧 Streamlitの主要コンポーネント
コンポーネント
用途
使用例
st.title
大見出し
st.title(‘タイトル’)
st.write
テキスト/データ表示
st.write(‘テキスト’)
st.selectbox
ドロップダウン
st.selectbox(‘選択’, [‘A’, ‘B’])
st.slider
スライダー
st.slider(‘値’, 0, 100, 50)
st.columns
カラムレイアウト
col1, col2 = st.columns(2)
st.metric
KPI表示
st.metric(‘売上’, ‘100万円’, ‘+10%’)
st.plotly_chart
Plotlyグラフ表示
st.plotly_chart(fig)
st.dataframe
データフレーム表示
st.dataframe(df)
Streamlitの高度な機能
【Streamlitの高度な機能】
# ========== ファイルアップロード ==========
uploaded = st.file_uploader(‘CSVファイルを選択’, type=[‘csv’])
if uploaded:
df = pd.read_csv(uploaded)
st.dataframe(df)
# ========== タブ ==========
tab1, tab2, tab3 = st.tabs([‘概要’, ‘グラフ’, ‘データ’])
with tab1:
st.write(‘概要タブの内容’)
with tab2:
st.write(‘グラフタブの内容’)
with tab3:
st.write(‘データタブの内容’)
# ========== ダウンロードボタン ==========
csv = df.to_csv(index=False)
st.download_button(
label=’CSVダウンロード’,
data=csv,
file_name=’data.csv’,
mime=’text/csv’
)
# ========== セッション状態(状態保持) ==========
# Streamlitは再実行されるため、状態保持が必要
if ‘count’ not in st.session_state:
st.session_state.count = 0
if st.button(‘カウント’):
st.session_state.count += 1
st.write(f’カウント: {st.session_state.count}’)
🔴 5. リアルタイムダッシュボード
dcc.Intervalでの自動更新(Dash)
Dashでは、dcc.Intervalコンポーネントを使って、定期的に自動更新 するダッシュボードを作成できます。
【dcc.Intervalの仕組み】
dcc.Interval(
id=’interval’,
interval=1000, # 更新間隔(ミリ秒)
n_intervals=0 # 更新回数(自動でカウントアップ)
)
【動作の流れ】
1. アプリ起動時、n_intervals=0
2. 1000ミリ秒(1秒)後、n_intervals=1
3. さらに1秒後、n_intervals=2
4. …
n_intervalsが変化するたびに、
それを監視するコールバックが発火します。
▼ 入力するコード(リアルタイム更新)
from dash import Dash, dcc, html, Input, Output
import plotly.graph_objects as go
from datetime import datetime
import random
app = Dash(__name__)
app.layout = html.Div([
html.H1(‘リアルタイムダッシュボード’, style={‘textAlign’: ‘center’}),
# 自動更新トリガー(1秒ごと)
dcc.Interval(
id=’interval’,
interval=1000, # 1000ミリ秒 = 1秒
n_intervals=0
),
# 現在時刻
html.Div(id=’time’, style={
‘textAlign’: ‘center’,
‘fontSize’: ’24px’,
‘padding’: ’20px’
}),
# グラフ
dcc.Graph(id=’graph’)
])
# データを保持するリスト(実際のアプリではデータベースから取得)
values = []
@app.callback(
[Output(‘time’, ‘children’),
Output(‘graph’, ‘figure’)],
Input(‘interval’, ‘n_intervals’)
)
def update(n):
# 現在時刻
now = datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)
# 新しいデータを追加(実際はセンサーやAPIから取得)
values.append(random.randint(50, 100))
# 最新20件のみ保持
if len(values) > 20:
values.pop(0)
# グラフ作成
fig = go.Figure()
fig.add_trace(go.Scatter(
y=values,
mode=’lines+markers’,
line=dict(color=’#0068B7′, width=2),
marker=dict(size=8)
))
fig.update_layout(
title=’リアルタイムデータ’,
xaxis_title=’時間’,
yaxis_title=’値’,
yaxis=dict(range=[0, 120])
)
return f’現在時刻: {now}’, fig
if __name__ == ‘__main__’:
app.run_server(debug=True)
🚀 6. デプロイ方法
デプロイとは
デプロイ とは、作成したアプリをインターネット上に公開 することです。ローカルで動かしていたアプリを、誰でもアクセスできるようにします。
🚀 デプロイ先の比較
プラットフォーム
対応
料金
難易度
Streamlit Cloud
Streamlit
無料(制限あり)
簡単
Heroku
Dash / Streamlit
有料(月$5〜)
やや難しい
Render
Dash / Streamlit
無料枠あり
普通
AWS / GCP / Azure
すべて
従量課金
難しい
【Streamlit Cloudへのデプロイ(最も簡単)】
1. GitHubにリポジトリを作成し、app.pyをpush
2. requirements.txt を作成(必要なライブラリを記載)
streamlit
pandas
plotly
3. streamlit.io/cloud にアクセスしてログイン
4. 「New app」をクリック
5. GitHubリポジトリを選択
6. 「Deploy!」をクリック
→ 数分でアプリが公開されます!
【Herokuへのデプロイ(Dash)】
1. 必要なファイルを準備
# requirements.txt(必要なライブラリ)
dash==2.14.1
plotly==5.17.0
gunicorn==21.2.0
# Procfile(起動コマンド)
web: gunicorn app:server
# app.py に追記
server = app.server
2. Heroku CLIでデプロイ
git init
git add .
git commit -m “initial commit”
heroku create my-dashboard-app
git push heroku main
→ https://my-dashboard-app.herokuapp.com/ でアクセス可能
⚠️ デプロイ時の注意点
APIキーや機密情報: コードに直接書かない。環境変数を使う
大量データ: データベースを使用する
認証: 必要に応じて認証機能を追加(dash-auth、streamlit-authenticator)
📝 STEP 43 のまとめ
✅ このステップで学んだこと
トピック
重要ポイント
Plotly Dash
Layout + Callback + Server の3要素
レイアウト
html.Div, dcc.Graph, dcc.Dropdown など
コールバック
Input/Output/State で動的更新
Streamlit
シンプルで高速、プロトタイプ向き
リアルタイム
dcc.Interval で自動更新
デプロイ
Streamlit Cloud / Heroku で公開
💡 最重要ポイント
Plotly Dash とStreamlit で、本格的なWebアプリが作れます。
プロトタイプや個人分析 にはStreamlit、本格的な業務アプリ にはDashを選びましょう!
どちらもPythonだけ で完結するため、データサイエンティストにとって最強のツールです。
📝 実践演習
演習 1
基礎
Streamlitで簡単なダッシュボードを作成してください。
解答を見る
【解答】
import streamlit as st
st.title(‘🎉 初めてのStreamlitアプリ’)
name = st.text_input(‘お名前を入力してください’)
if st.button(‘送信’):
if name:
st.success(f’こんにちは、{name}さん!’)
else:
st.warning(‘名前を入力してください’)
# 実行: streamlit run app.py
演習 2
応用
Dashでドロップダウンとグラフを連動させてください。
解答を見る
【ヒント】
ポイント:
1. dcc.Dropdown を作成(id, options, value を設定)
2. dcc.Graph を作成(id を設定)
3. @app.callback で Input/Output を設定
– Output: グラフのfigure
– Input: ドロップダウンのvalue
4. 関数内でグラフを作成して return
本文のコード例を参考にしてください!
演習 3
発展
リアルタイム更新ダッシュボードを作成してください。
解答を見る
【ヒント】
ポイント:
1. dcc.Interval を追加(interval=1000 で1秒ごと)
2. コールバックで Input(‘interval’, ‘n_intervals’) を監視
3. 関数内で:
– 現在時刻を取得
– 新しいデータを生成/取得
– グラフを更新して return
本文のコード例を参考にしてください!
❓ よくある質問
Q1: DashとStreamlit、どちらを選べばいいですか?
用途によります。 プロトタイプや個人分析にはStreamlit (シンプルで速い)、本格的な業務アプリにはDash (カスタマイズ性が高い)がおすすめです。まずはStreamlitで始めて、必要に応じてDashに移行するのも良い方法です。
Q2: 大量データでも動作しますか?
工夫次第です。 ①サーバー側で事前集計、②キャッシュ機能の活用(@st.cache_data、flask-caching)、③必要なデータのみ表示(ページネーション)、④データベースを使用、などの最適化が必要です。
Q3: 認証機能は追加できますか?
はい、追加できます。 Dashならdash-auth、Streamlitならstreamlit-authenticatorを使用します。また、Streamlit Cloudの有料プランでは、Googleアカウントでの認証が可能です。
Q4: Google Colabでも動作しますか?
制限があります。 DashはColabで直接実行できませんが、jupyter-dashを使えば動作します。Streamlitはstreamlit runが必要なため、Colabでは動作しません。ローカル環境での実行をおすすめします。
×
artnasekai
#artnasekai #学習メモ