ソニック発展編|社内で使えるデータアプリを公開する
「作ったダッシュボードを、PCにPythonが無い同僚にも使ってもらいたい」「データを選ぶだけで自動でグラフが切り替わる、対話的なツールを作りたい」「Excelファイルをメールでやりとりするのをやめたい」
そんな願いを叶えるのが、Pythonの「Streamlit」です。
以前の記事でStreamlitの基本を紹介しましたが、今回は発展編。ファイルアップロード・フィルター・複数グラフ連動など、「実際に社内で使える業務アプリ」の作り方を解説します。
Streamlitを使えば、Pythonのコードが「誰でもブラウザで使えるWebアプリ」に変わります。コードを書けない同僚も、あなたの作ったツールを使えます。
この記事では、Streamlitで業務アプリを作る方法を、コピペで動くコード付きで完全解説します。
こんな方におすすめ
- 作ったダッシュボードを、Pythonの無い同僚にも使わせたい方
- Excelファイルの配布・バージョン管理から解放されたい方
- 対話的に操作できる業務ツールを内製したい方
第1章|なぜStreamlitが業務を変えるのか
Streamlitとは
Streamlitは、Pythonコードだけで「Webアプリ」を作れるフレームワークです。HTML・CSS・JavaScriptの知識は一切不要。Pythonが書ければ、誰でもWebアプリをつくれます。
Excel配布の問題点
- 「最新版どれ?」というバージョン混乱
- 数式を壊される・上書きされる
- 重いファイルのメール添付
- 関数を理解していない人には使いこなせない
Streamlitアプリなら解決
| 観点 | Excel配布 | Streamlitアプリ |
|---|---|---|
| バージョン管理 | 混乱しがち | 常に最新 |
| 操作 | 関数の知識要 | クリックだけ |
| 共有 | ファイル添付 | URLを共有 |
| 壊れにくさ | 上書きリスク | ロジック保護 |
第2章|環境準備と基本構造
この記事は、uv環境でPythonを使う前提で進めます。まだの方は別記事「【完全版】uv入門」をご覧ください。
ライブラリのインストール
uv add streamlit pandas plotly最小のStreamlitアプリ
# app.py という名前で保存
import streamlit as st
# タイトル
st.title("はじめてのStreamlitアプリ")
# テキスト
st.write("これは業務アプリのサンプルです。")
# ボタン
if st.button("クリックしてね"):
st.success("ボタンが押されました!")アプリの起動
# ターミナルで実行
streamlit run app.py
# uv環境なら
uv run streamlit run app.py※Streamlitはコードを保存するたびに自動でアプリが更新されます。ブラウザの「Rerun」で即反映。開発がとても快適です。


第3章|入力ウィジェットで対話的に
よく使うウィジェット
import streamlit as st
# スライダー
age = st.slider("年齢", 0, 100, 30) # 最小, 最大, 初期値
# セレクトボックス(選択肢)
store = st.selectbox("店舗を選択", ["東京店", "大阪店", "名古屋店"])
# 複数選択
items = st.multiselect("商品を選択", ["A", "B", "C", "D"])
# テキスト入力
name = st.text_input("名前を入力")
# 日付入力
import datetime
date = st.date_input("日付", datetime.date.today())
# チェックボックス
show = st.checkbox("詳細を表示")
# 選んだ値を表示
st.write(f"選択した店舗:{store}")ウィジェットの値が変わると、アプリ全体が自動で再実行されます。「選ぶと結果が変わる」対話的なツールが、これだけで作れます。
サイドバーに配置する
import streamlit as st
# st.sidebar を使うと左側のサイドバーに配置される
store = st.sidebar.selectbox("店舗", ["東京店", "大阪店"])
period = st.sidebar.slider("期間(月)", 1, 12, 6)
st.title("売上ダッシュボード")
st.write(f"{store}の過去{period}ヶ月の売上")第4章|ファイルアップロードとデータ表示
CSV/Excelをアップロードして表示
import streamlit as st
import pandas as pd
st.title("データ分析アプリ")
# ファイルアップローダー
uploaded_file = st.file_uploader(
"CSVまたはExcelファイルをアップロード",
type=["csv", "xlsx"]
)
if uploaded_file is not None:
# 拡張子で読み込み方法を分岐
if uploaded_file.name.endswith(".csv"):
df = pd.read_csv(uploaded_file)
else:
df = pd.read_excel(uploaded_file)
# データを表示
st.subheader("データプレビュー")
st.dataframe(df)
# 基本統計
st.subheader("基本統計")
st.write(df.describe())
# 行数・列数
st.info(f"行数:{len(df)} 列数:{len(df.columns)}")これだけで、「ファイルをドラッグ&ドロップすると自動で分析される」アプリが完成します。


第5章|グラフを表示する
Streamlit標準グラフ
import streamlit as st
import pandas as pd
df = pd.DataFrame({
"月": ["1月", "2月", "3月", "4月", "5月"],
"売上": [120, 150, 140, 180, 200]
})
st.line_chart(df.set_index("月")) # 折れ線
st.bar_chart(df.set_index("月")) # 棒グラフ
st.area_chart(df.set_index("月")) # エリアplotlyグラフを埋め込む(高機能)
import streamlit as st
import plotly.express as px
import pandas as pd
df = pd.DataFrame({
"店舗": ["東京", "大阪", "名古屋"],
"売上": [1500, 1200, 900]
})
fig = px.bar(df, x="店舗", y="売上", color="売上",
color_continuous_scale="Blues", title="店舗別売上")
st.plotly_chart(fig, use_container_width=True)メトリクス(KPIカード)を表示
import streamlit as st
col1, col2, col3 = st.columns(3)
col1.metric("総売上", "¥3,600,000", "+12%")
col2.metric("客数", "1,250人", "+8%")
col3.metric("客単価", "¥2,880", "-3%")st.columns でレイアウトを分割すれば、本格的なダッシュボードのような見た目になります。
第6章|フィルター連動ダッシュボード
選択に応じてグラフが変わる仕組み
import streamlit as st
import pandas as pd
import plotly.express as px
st.title("売上ダッシュボード")
# データ読み込み
df = pd.read_csv("売上データ.csv") # 店舗, 商品, 月, 売上
# === サイドバーでフィルター ===
store = st.sidebar.selectbox(
"店舗を選択",
["すべて"] + list(df["店舗"].unique())
)
# === フィルター適用 ===
if store != "すべて":
filtered = df[df["店舗"] == store]
else:
filtered = df
# === KPI表示 ===
col1, col2 = st.columns(2)
col1.metric("総売上", f"¥{filtered['売上'].sum():,}")
col2.metric("平均売上", f"¥{filtered['売上'].mean():,.0f}")
# === グラフ(選択に連動) ===
monthly = filtered.groupby("月")["売上"].sum().reset_index()
fig = px.line(monthly, x="月", y="売上", title=f"{store}の売上推移", markers=True)
st.plotly_chart(fig, use_container_width=True)
# === データテーブル ===
st.subheader("詳細データ")
st.dataframe(filtered)サイドバーで店舗を選ぶと、KPI・グラフ・テーブルがすべて連動して切り替わります。これが「対話的ダッシュボード」の威力です。


第7章|実務アプリ|売上分析ツールを公開する
完成アプリ:CSVアップロード型 売上分析ツール
"""
売上分析ツール(Streamlitアプリ)
- CSVをアップロード
- 店舗・期間でフィルター
- KPI・グラフ・ランキングを表示
保存名:sales_app.py 起動:streamlit run sales_app.py
"""
import streamlit as st
import pandas as pd
import plotly.express as px
# === ページ設定 ===
st.set_page_config(page_title="売上分析ツール", layout="wide")
st.title("📊 売上分析ツール")
# === ファイルアップロード ===
uploaded = st.file_uploader("売上CSVをアップロード", type=["csv"])
if uploaded is None:
st.info("CSVファイルをアップロードしてください(列:店舗, 商品, 月, 売上)")
st.stop() # ファイルが無ければここで停止
df = pd.read_csv(uploaded)
# === サイドバー:フィルター ===
st.sidebar.header("フィルター")
stores = st.sidebar.multiselect(
"店舗", df["店舗"].unique(), default=list(df["店舗"].unique())
)
filtered = df[df["店舗"].isin(stores)]
# === KPI行 ===
c1, c2, c3 = st.columns(3)
c1.metric("総売上", f"¥{filtered['売上'].sum():,}")
c2.metric("取引件数", f"{len(filtered):,}件")
c3.metric("平均単価", f"¥{filtered['売上'].mean():,.0f}")
# === 2カラムでグラフ ===
left, right = st.columns(2)
with left:
st.subheader("店舗別売上")
by_store = filtered.groupby("店舗")["売上"].sum().reset_index()
fig1 = px.bar(by_store, x="店舗", y="売上",
color="売上", color_continuous_scale="Blues")
st.plotly_chart(fig1, use_container_width=True)
with right:
st.subheader("月別推移")
by_month = filtered.groupby("月")["売上"].sum().reset_index()
fig2 = px.line(by_month, x="月", y="売上", markers=True)
st.plotly_chart(fig2, use_container_width=True)
# === ランキング ===
st.subheader("商品別売上ランキング")
ranking = filtered.groupby("商品")["売上"].sum().sort_values(ascending=False).reset_index()
st.dataframe(ranking, use_container_width=True)社内公開の方法
- **ローカル共有**:同じネットワーク内なら network URLで共有可能
- **Streamlit Community Cloud**:GitHubと連携して無料で公開(社外向け)
- **社内サーバー**:自社サーバーにデプロイして社内限定公開
URLを共有するだけで、Pythonが無い同僚も、ブラウザでツールを使えます。Excelファイルの配布は、もう不要です。


第8章|つまずき対処&まとめ
よくあるトラブル
トラブル1:streamlit run が動かない
対処:
uv環境内で実行しているか確認。`uv run streamlit run app.py` のように uv run を付けると確実です。
トラブル2:日本語のグラフが文字化け
対処:
plotlyを使えば日本語も問題なく表示されます。matplotlibを使う場合はMeiryoフォント設定が必要です。
トラブル3:アプリが遅い
対処:
重い処理には @st.cache_data デコレータでキャッシュを効かせます。
@st.cache_data
def load_data(file):
return pd.read_csv(file)
# 同じデータの再読み込みをスキップして高速化トラブル4:変更が反映されない
対処:
ブラウザ右上の「Rerun」をクリック、または「Always rerun」を有効にすると、保存ごとに自動更新されます。
この記事のまとめ
- StreamlitはPythonだけでWebアプリを作れるフレームワーク
- ウィジェットで対話的な操作を実現
- ファイルアップロード・グラフ・KPIカードが簡単
- フィルター連動で本格的なダッシュボードに
- URLを共有すれば、Pythonの無い同僚も使える
FAQ
次にやるべき3つの行動
- **今すぐ**:社内で「Excelで配っているツール」をリストアップ
- **今日中**:第2章の最小アプリを起動してみる
- **今週中**:第7章の売上分析ツールを自分のデータで動かす
Excelファイルの配布から、Webアプリの共有へ。Streamlitは、あなたのPythonスキルを「みんなが使えるツール」に変えます。
Streamlitで、ツールを「みんなのもの」に
自分だけが使えるPythonスクリプトを、誰でも使えるWebアプリに。Streamlitは、業務効率化を「個人」から「チーム」へ広げる強力な武器です。
これでダッシュボードカテゴリも一区切り。Excel→Python→可視化→Webアプリと、事務職の業務効率化に必要なスキルが揃いました。
最新の解説記事は、新着記事から順次公開しています。X(旧Twitter)でも更新情報を発信していますので、ぜひフォローしてください。
この記事を書いた人
ソニック|バックオフィス出身の業務効率化ブロガー。事務職時代に作ったExcelツールの配布に苦労した経験から、Streamlitでの内製アプリ化に取り組んだ実体験あり。現在のデータサイエンス業務でも、分析ツールをStreamlitで社内共有している。リアルな実体験をもとにしたノウハウを発信中。


コメント