Text-to-Pythonでオンデマンドなデータ分析ダッシュボードを実現する
Text-to-Python技術を活用してオンデマンドなデータ分析を実現する方法を学習する
前章では、Text-to-SQL を用いたデータベースクエリの自動生成について学びました。これにより、ユーザーは自然言語での質問を通じて、データベースから必要な情報を迅速に取得できるようになりました。
本章では、Text-to-Python によって、自然言語での質問に対してリアルタイムで Python コードを生成し、動的なデータ分析を行うダッシュボードの構築方法を学びます。これにより、ユーザーはその場で生まれる具体的な疑問に対して即座にフィードバックを受けることが可能になります。
Text-to-Python の価値と可能性
従来の分析手法の限界
従来のデータ分析には大きく 2 つのアプローチがありました
-
ノーコード・ローコードツール
専門知識がなくても直感的に操作できるが、既定のテンプレートや機能に制限され、柔軟な分析や独自の可視化が困難
-
プログラミングベースのアプローチ(Python、R など)
高い柔軟性や自由度を持つが、習得に時間がかかり、日常業務で活用するハードルが高い
この結果、多くのビジネスパーソンが「もう少し詳しく分析したい」「この角度で数字を見たい」と思っても、その場で自分自身が必要な分析を実行することが困難でした。
Text-to-Python がもたらす変革
Text-to-Python は、この課題を根本的に解決します。「売上が前年同月比で最も増加している商品カテゴリを教えて」といった自然言語の質問を入力すると、AI が Python コードを生成し、データベースから必要な情報を抽出・分析して結果を表示します。
静的な Dashboard と Text-to-Python の使い分け
Text-to-Python の特徴は、デプロイが必要なく、その場で分析のフィードバックループを回せることです。Streamlit で BI ダッシュボードを作る場合、以下のように使い分けるといいでしょう。
-
探索的な分析: Text-to-Python
- 「なぜ売上が下がったのか?」といった原因究明
- 会議中に生まれた疑問への即座の回答
- 仮説 → 検証 → 新たな仮説のサイクルを高速で回す
-
定期監視: 静的ダッシュボード
- 日次売上、KPI などの定型的な指標監視
- ステークホルダーとの定期的な情報共有
- 異常値の監視と早期発見
この使い分けにより、探索的分析で得たインサイトを静的ダッシュボードに反映し、発見から継続監視への流れを構築できます。
Text-to-Python の構成要素
Text-to-Python システムは、コード生成とコード実行の 2 つのステップから構成されます:
1. コードの生成: LLM が自然言語から Python コードを生成
ユーザーが自然言語で入力した分析要求を、LLM が解釈し、対応する Python コードを自動生成します。
この段階では、LLM はデータの構造、利用可能なライブラリ、分析の目的を考慮して、最適なコードを生成します。プロンプトエンジニアリングにより、より精度の高いコード生成が可能になります。
2. コードの実行: 生成されたコードを安全な環境で実行
生成された Python コードを、セキュリティが保証された隔離環境(サンドボックス)で実行し、結果をユーザーに返します。
Python コードの生成
効果的なプロンプト設計
第五章では、AI Coding Tool を利用するための効果的なプロンプトについて紹介しました。
Text-to-Python でも同様に、 AI に対する指示(プロンプト)が重要です。意図したコードを生成するためには、「コードを書いて」と曖昧に依頼するのではなく、AI が理解しやすい構造化された指示を提供しましょう。
AI がコードを生成するために必要な背景情報として、以下の要素を含めましょう。
- データベーススキーマの提供: テーブル名、カラム名、データ型、データの性質などを明示
- 利用可能なライブラリの指定: (例: 「pandas, plotly が利用してください。」)
- データの特性: サイズ、形式、特殊な制約の説明
- 分析の目的: 何を達成したいのかを具体的に記述
- 出力形式の指定: 結果をどのように出力、保存するか(例: 「plotly でグラフを生成して、png で保存してください」)
サンドボックス環境の必要性
Python には、exec()
やeval()
といったコード動的に評価、実行する組み込み関数が用意されています。しかし、これらの関数は信頼できないコードの実行に向けて作られたものではなく、LLM 生成のコードを実行する場合には以下のような危険性があります
- ファイルシステムへの不正アクセス
- システムコマンドの実行
- 機密情報の漏洩
- システムリソースの過度な消費
これらのリスクを回避するため、生成されたコードは隔離された安全な環境(サンドボックス)で実行するべきです。サンドボックス環境では、コードの実行範囲を制限し、システムへの影響を最小限に抑えることができます。
主要なサンドボックスサービス比較
現在、以下のようなマネージドサンドボックスサービスが利用できます。
- E2B: AI アプリケーション向けに特化したクラウドランタイム
- Daytona: 開発環境管理に特化したプラットフォーム
- Modal: 汎用的なクラウドコンピューティング基盤
本章では、特に AI アプリケーションでの実績が豊富で、高速起動を実現する E2B を使用します。
E2B を使用した Streamlit アプリケーションの構築
ここまでで、Text-to-Python を実現するための基本的な概念について学びました。
実際に、Streamlit と E2B, OpenAI API を組み合わせて、csv ファイルを分析する簡単な Text-to-Python アプリケーションを構築してみましょう。
事前準備: E2B のセットアップとデータセットの準備
E2B API Keyを参考に、API キーを発行し、その値を環境変数 E2B_API_KEY
に設定してください。また、Open AI の API キーも必要です。
E2B_API_KEY=e2b_xxx
OPENAI_API_KEY="sk-xxx"
アプリケーションの実行
以下のコードをapp.py
というファイル名で保存し、streamlit run app.py
で実行します。
from dotenv import load_dotenv
from e2b_code_interpreter import Sandbox, Execution
import streamlit as st
import openai
from pydantic import BaseModel
import base64
load_dotenv()
# Create sandbox
sbx = Sandbox()
# Upload the dataset to the sandbox
dataset_path_in_sandbox = ""
with open("dataset.csv", "rb") as f:
dataset_path_in_sandbox = sbx.files.write("dataset.csv", f)
def run_code_in_sandbox(python_code: str) -> Execution:
execution = sbx.run_code(python_code)
return execution
class PythonGeneratedResult(BaseModel):
code: str
description: str
def generate_code(user_input: str) -> PythonGeneratedResult | None:
prompt = f"""
Generate Python code and description for it.
I have a CSV file about movies. It has about 10k rows. It's saved in the sandbox at {dataset_path_in_sandbox}.
These are the columns:
- 'id': number, id of the movie
- 'original_language': string like "eng", "es", "ko", etc
- 'original_title': string that's name of the movie in the original language
- 'overview': string about the movie
- 'popularity': float, from 0 to 9137.939. It's not normalized at all and there are outliers
- 'release_date': date in the format yyyy-mm-dd
- 'title': string that's the name of the movie in english
- 'vote_average': float number between 0 and 10 that's representing viewers voting average
- 'vote_count': int for how many viewers voted
Write Python code that analyzes the dataset based on my request and produces right chart accordingly
- Output should be png image.
- Write code comments and description in English.
user input: {user_input}
"""
response = openai.responses.parse(
model="o4-mini",
input=[{"role": "user", "content": prompt}],
text_format=PythonGeneratedResult,
)
return response.output_parsed
st.title("Simple Text-to-Python")
with st.form("analyse_csv"):
user_input = st.text_area(label="Input", height=200)
submitted = st.form_submit_button("Submit")
if submitted:
generated = generate_code(user_input)
if generated is None:
st.write("Failed to generate python code")
st.stop()
st.write("Python Code Generated")
st.code(generated.code, height=600)
st.write(generated.description)
execution = run_code_in_sandbox(generated.code)
if execution.error:
st.error(execution.error.value)
if len(execution.results) == 0:
st.write("Empty Output")
for result in execution.results:
if result.png:
st.image(base64.b64decode(result.png))
データセットについて質問すると、AI が Python コードを生成し、E2B のサンドボックス環境で実行されます。結果は Streamlit アプリケーション上に表示されます。
発展的な Text-to-Python
基本的な Text-to-Python システムをさらに発展させることで、より実用的で柔軟なデータ分析環境を構築できます。
チャットインターフェースによる対話的分析 単発の質問ではなく、会話形式で連続した分析を実行できます。「先ほどの結果を詳しく見たい」「今度は別の角度で分析して」といった対話的な分析が可能になります。また、Text-to-Python 以外にも、Text-to-SQL や検索、外部 API など、他のツールを組み合わせて、より複雑な分析を行うことができます。
動的なデータソース選択 CSV ファイルのアップロードだけでなく、データベース接続や外部 API からのデータ取得にも対応します。ユーザーが分析したいデータソースを柔軟に選択できます。
パッケージの動的インストール 分析に必要な Python ライブラリにコード生成時に判断し、コードの実行前に動的にインストールします。特殊な分析手法や可視化に必要なパッケージも即座に利用可能になります。
コードの自動修正 エラーが発生した場合にコードを自動で修正して再実行します。
これらの発展機能を統合したサンプルアプリケーションを公開しています:
TODO: リンク GitHub Live demo hosted on Squadbase
サンプルアプリでは、実際のビジネス環境で使用できるレベルの Text-to-Python システムを体験できます。
まとめ
本章では、自然言語から Python コードを生成し、動的なデータ分析を実現する Text-to-Python システムについて学びました。
Text-to-Python は、従来のノーコード・ローコードツールの制約とプログラミングベースアプローチの習得困難さという課題を解決します。自然言語での質問に対してリアルタイムでコードを生成・実行することで、「もう少し詳しく分析したい」という場面で即座に対応できるようになります。
実装においては、LLM によるコード生成と E2B などのサンドボックス環境での安全な実行という 2 つのステップが重要です。十分な情報を LLM に与えることにより精度の高いコード生成を実現し、サンドボックス環境によりセキュリティリスクを回避できます。