STEP 43:インタラクティブダッシュボードの実装

🚀 STEP 43: インタラクティブダッシュボードの実装

Plotly DashとStreamlitで本格的なWebアプリを作ろう!

📋 このステップで学ぶこと

  • 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 DashStreamlitで、本格的な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では動作しません。ローカル環境での実行をおすすめします。
📝

学習メモ

データ可視化マスター - Step 43

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE