こんにちは、七宮さん(@shichinomiya_s)です。
今回は、PythonでWebアプリを簡単に作れるフレームワーク「Streamlit」を使ってみたので、その使い方や魅力についてお話したいと思います。
Streamlitとは
StreamlitはPythonで書かれたオープンソースのフレームワークで、データサイエンティストや機械学習エンジニアが簡単にWebアプリを作成できるツールです。
通常、Webアプリケーションを作るにはHTML、CSS、JavaScriptといったフロントエンド技術の知識が必要になりますが、Streamlitを使えばPythonのコードだけでインタラクティブなWebアプリが作れるんですね。これは本当に便利だと思います。
Streamlitの主な特徴
- Pythonだけで完結:フロントエンドの知識が不要
- リアルタイム更新:コードを変更すると即座に反映される
- 豊富なウィジェット:ボタン、スライダー、チャートなど様々な部品が用意されている
- シンプルな記法:直感的でわかりやすいAPI設計
データ分析の結果を可視化したり、機械学習モデルのデモアプリを作ったりする際に、とても重宝するフレームワークだと思います。
Streamlitのインストール方法
Streamlitのインストールは非常に簡単です。pipを使って一発でインストールできます。
pip install streamlit
仮想環境を使っている場合は、その環境をアクティベートしてからインストールしてください。
# 仮想環境の作成例
python -m venv venv
# Windows
venv\Scripts\activate
# Mac/Linux
source venv/bin/activate
# Streamlitのインストール
pip install streamlit
インストールが完了したら、バージョンを確認してみましょう。
streamlit --version
これでStreamlitのバージョンが表示されれば、インストール成功です。
Streamlitの基本的な使い方
それでは、実際にStreamlitを使ってシンプルなWebアプリを作ってみましょう。
Hello Worldアプリ
まずは基本的な「Hello World」アプリから始めます。app.pyというファイルを作成して、以下のコードを書いてみてください。
import streamlit as st
st.title('Hello Streamlit!')
st.write('こんにちは、Streamlitの世界へようこそ!')
このアプリを起動するには、ターミナルで以下のコマンドを実行します。
streamlit run app.py
すると、ブラウザが自動的に開いて、作成したアプリが表示されるはずです。デフォルトではhttp://localhost:8501でアクセスできますね。
主要なコンポーネント
Streamlitには様々なコンポーネントが用意されています。よく使うものをいくつかご紹介します。
テキスト表示
import streamlit as st
# タイトル
st.title('タイトル')
# ヘッダー
st.header('ヘッダー')
# サブヘッダー
st.subheader('サブヘッダー')
# 通常のテキスト
st.write('通常のテキストです')
# マークダウン
st.markdown('**太字**や*斜体*も使えます')
入力ウィジェット
# テキスト入力
name = st.text_input('お名前を入力してください')
st.write(f'こんにちは、{name}さん!')
# スライダー
age = st.slider('年齢を選択してください', 0, 100, 25)
st.write(f'あなたは{age}歳ですね')
# ボタン
if st.button('クリックしてね'):
st.write('ボタンがクリックされました!')
# セレクトボックス
option = st.selectbox(
'お好きな言語は?',
['Python', 'JavaScript', 'Go', 'Rust']
)
st.write(f'{option}を選択しました')
データ表示とチャート
Streamlitはデータの可視化にも優れています。
import pandas as pd
import numpy as np
# データフレームの表示
df = pd.DataFrame({
'列1': [1, 2, 3, 4],
'列2': [10, 20, 30, 40]
})
st.dataframe(df)
# 折れ線グラフ
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)
これらの基本的なコンポーネントを組み合わせるだけで、かなり本格的なアプリが作れるというお話になります。
Streamlitの応用例
ここからは、もう少し実践的な応用例をご紹介します。
例1: データ分析ダッシュボード
CSVファイルをアップロードして分析できるダッシュボードを作ってみました。
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
st.title('データ分析ダッシュボード')
# ファイルアップロード
uploaded_file = st.file_uploader("CSVファイルを選択してください", type='csv')
if uploaded_file is not None:
# データ読み込み
df = pd.read_csv(uploaded_file)
# データの表示
st.subheader('データプレビュー')
st.dataframe(df.head())
# 基本統計量
st.subheader('基本統計量')
st.write(df.describe())
# カラム選択
columns = df.columns.tolist()
selected_column = st.selectbox('可視化するカラムを選択', columns)
# ヒストグラム
st.subheader(f'{selected_column}のヒストグラム')
fig, ax = plt.subplots()
ax.hist(df[selected_column].dropna(), bins=30)
st.pyplot(fig)
このコードを使えば、簡単にデータ分析用のダッシュボードが作れますね。実際のプロジェクトでも十分使えると思います。
例2: 画像処理アプリ
画像をアップロードしてフィルターをかけるアプリも作ってみました。
import streamlit as st
from PIL import Image, ImageFilter
st.title('画像処理アプリ')
# 画像アップロード
uploaded_image = st.file_uploader("画像を選択してください", type=['jpg', 'jpeg', 'png'])
if uploaded_image is not None:
# 画像読み込み
image = Image.open(uploaded_image)
# 元の画像を表示
st.subheader('元の画像')
st.image(image, use_column_width=True)
# フィルター選択
filter_type = st.selectbox(
'フィルターを選択',
['なし', 'ぼかし', '輪郭検出', 'シャープ']
)
# フィルター適用
if filter_type == 'ぼかし':
filtered_image = image.filter(ImageFilter.BLUR)
elif filter_type == '輪郭検出':
filtered_image = image.filter(ImageFilter.FIND_EDGES)
elif filter_type == 'シャープ':
filtered_image = image.filter(ImageFilter.SHARPEN)
else:
filtered_image = image
# 処理後の画像を表示
st.subheader('処理後の画像')
st.image(filtered_image, use_column_width=True)
こういった画像処理アプリも、数十行のコードで作れてしまうのは驚きですね。
例3: 機械学習モデルのデモ
実は、機械学習モデルのデモアプリを作るのもStreamlitの得意分野です。
import streamlit as st
import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
st.title('アイリス分類器')
# モデルの学習
@st.cache_resource
def train_model():
iris = load_iris()
clf = RandomForestClassifier()
clf.fit(iris.data, iris.target)
return clf, iris
clf, iris = train_model()
# 入力欄
st.subheader('花の特徴を入力してください')
col1, col2 = st.columns(2)
with col1:
sepal_length = st.slider('がく片の長さ', 4.0, 8.0, 5.0)
sepal_width = st.slider('がく片の幅', 2.0, 4.5, 3.0)
with col2:
petal_length = st.slider('花弁の長さ', 1.0, 7.0, 4.0)
petal_width = st.slider('花弁の幅', 0.1, 2.5, 1.0)
# 予測
if st.button('分類する'):
features = np.array([[sepal_length, sepal_width, petal_length, petal_width]])
prediction = clf.predict(features)[0]
species = iris.target_names[prediction]
st.success(f'予測結果: **{species}**')
# 確率表示
probabilities = clf.predict_proba(features)[0]
st.subheader('各クラスの確率')
for i, prob in enumerate(probabilities):
st.write(f'{iris.target_names[i]}: {prob:.2%}')
@st.cache_resourceデコレータを使うことで、モデルの学習結果をキャッシュできるのも便利なポイントですね。
Streamlitの便利な機能
その他にも、Streamlitには便利な機能がたくさんあります。
| 機能 | 説明 | 使用例 |
| サイドバー | 左側にサイドバーを配置 | st.sidebar.slider() |
| カラムレイアウト | 画面を複数列に分割 | st.columns(2) |
| エキスパンダー | 折りたたみ可能なセクション | st.expander() |
| プログレスバー | 処理の進行状況を表示 | st.progress() |
| キャッシュ | 関数の結果をキャッシュ | @st.cache_data |
これらを組み合わせることで、より高度なアプリケーションが作れるかと思います。
まとめ
今回は、Streamlitを使ったWebアプリ開発についてお話しました。
Streamlitの魅力をまとめると、以下のようになります。
- 学習コストが低い:Pythonの知識だけで始められる
- 開発スピードが速い:プロトタイプを素早く作れる
- コードがシンプル:少ないコード量で多機能なアプリが作れる
- デプロイも簡単:Streamlit Cloudを使えば無料で公開できる
実際に使ってみて、データ分析の結果を共有したり、機械学習モデルのデモを作ったりするのに最適なツールだと感じました。もちろん、大規模なアプリケーションには向いていないかもしれませんが、社内ツールやプロトタイプ作成には十分すぎるほどの機能があると思います。
ちなみに、Streamlitで作ったアプリは「Streamlit Cloud」という無料のホスティングサービスで簡単に公開できるので、GitHubと連携させて使ってみるのもおすすめです。
Pythonでデータ分析や機械学習をやっている皆さんは、ぜひStreamlitを試してみてはいかがでしょうか。きっと開発の効率が上がると思いますよ。
いかがだったでしょうか。この記事が皆さんのStreamlit活用の参考になれば幸いです。

