【完全ガイド】Streamlitで業務アプリを作る

ソニック

発展編|社内で使えるデータアプリを公開する

「作ったダッシュボードを、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)

社内公開の方法

  1. **ローカル共有**:同じネットワーク内なら network URLで共有可能
  2. **Streamlit Community Cloud**:GitHubと連携して無料で公開(社外向け)
  3. **社内サーバー**:自社サーバーにデプロイして社内限定公開

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

Q1. Streamlitは無料ですか?

Streamlit本体は完全無料のオープンソースです。Streamlit Community Cloudでの公開も無料枠があります(商用は有料プランも)。

Q2. 社内だけで使いたい(社外に公開したくない)

ローカル実行なら同じネットワーク内だけで使えます。本格的には社内サーバーへのデプロイや、アクセス制限付きのホスティングを検討しましょう。

Q3. HTMLやCSSの知識は必要?

基本的に不要です。Pythonだけでアプリが作れます。デザインを細かく調整したい場合のみ、一部CSSを使うこともできます。

Q4. ログイン認証を付けられますか?

可能です。streamlit-authenticatorなどのライブラリや、ホスティングサービスのアクセス制限機能で実現できます。

Q5. もっと本格的なWebアプリを作りたい

Streamlitで物足りなくなったら、Dash(より柔軟)やFlask/FastAPI(フルスタック)へステップアップできます。ただし多くの業務ツールはStreamlitで十分です。

次にやるべき3つの行動

  • **今すぐ**:社内で「Excelで配っているツール」をリストアップ
  • **今日中**:第2章の最小アプリを起動してみる
  • **今週中**:第7章の売上分析ツールを自分のデータで動かす

Excelファイルの配布から、Webアプリの共有へ。Streamlitは、あなたのPythonスキルを「みんなが使えるツール」に変えます。

Streamlitで、ツールを「みんなのもの」に

自分だけが使えるPythonスクリプトを、誰でも使えるWebアプリに。Streamlitは、業務効率化を「個人」から「チーム」へ広げる強力な武器です。

これでダッシュボードカテゴリも一区切り。Excel→Python→可視化→Webアプリと、事務職の業務効率化に必要なスキルが揃いました。

最新の解説記事は、新着記事から順次公開しています。X(旧Twitter)でも更新情報を発信していますので、ぜひフォローしてください。

この記事を書いた人

ソニック|バックオフィス出身の業務効率化ブロガー。事務職時代に作ったExcelツールの配布に苦労した経験から、Streamlitでの内製アプリ化に取り組んだ実体験あり。現在のデータサイエンス業務でも、分析ツールをStreamlitで社内共有している。リアルな実体験をもとにしたノウハウを発信中。

→ 詳しいプロフィールはこちら→ はじめての方へ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次