
探索的データ分析 (EDA) Copilot
概要
この「EDA Copilot」アプリは、ユーザーがデータセット(CSV/Excel)をアップロードすると、自然言語での問いかけに応じて探索的データ分析(EDA)レポートを生成・表示するインタラクティブな仕組みを提供します。バックエンドではOpenAIのLLMと、Business Scienceチームの EDAToolsAgent を組み合わせ、各種可視化や要約、分析結果などを動的に作成します。
オリジナルのプロジェクトは、Business Scienceが公開している"Exploratory Data Analysis Copilot App " で、Squadbase向けにカスタマイズしています。
カスタマイズ
以下では、特に「データ取り込み/前処理の汎用化」「AIエージェント/モデルロジックの拡張」「レポート/エクスポート機能の強化」の3点にフォーカスし、実際にどのコード箇所を手を入れればよいかを解説します。
1. データ取り込み/前処理の汎用化
CSV や Excel に限らず、データベースやクラウドストレージ、API 経由のストリーミングデータも扱えるようにすることで、さまざまな現場のニーズに対応できます。読み込み時に欠損値補完や型変換のオプションを入れ、データを一貫した形に正規化することで、分析エージェントの応答精度を高められます。
対象コード箇所
uploaded_file = st.sidebar.file_uploader(
"Upload CSV or Excel file", type=["csv", "xlsx"]
)
…
st.session_state["DATA_RAW"] = df.copy()
カスタマイズ例
-
多様な入力形式の追加
st.sidebar.file_uploader
のtype
引数に["csv","xlsx","json","parquet"]
を拡張。- たとえば JSON や Parquet なら
pd.read_json
/pd.read_parquet
を呼び出す分岐を追加。
-
前処理パイプラインの挿入
-
df.copy()
の直後に共通関数def preprocess(df): …
を呼び出し、欠損値補完や日付列のパース、型キャストを行う。 -
例:
df = preprocess(df) st.session_state["DATA_RAW"] = df.copy()
-
2. AIエージェント/モデルロジックの拡張
利用する LLM やエージェント(LangChain、RAG、ファインチューニングモデルなど)をプラグイン形式で切り替えられるようにします。たとえば記述統計に特化した軽量エージェントや、可視化専門のモジュールを並列で起動し、質問内容に応じて最適なエージェントを自動ルーティングする仕組みを作ると、より精緻な応答が可能になります。
対象コード箇所
def process_exploratory(question: str, llm, data: pd.DataFrame) -> dict:
eda_agent = EDAToolsAgent(
llm,
invoke_react_agent_kwargs={"recursion_limit": 10},
)
…
eda_agent.invoke_agent(...)
カスタマイズ例
-
エージェント切り替え機構
-
サイドバーに「軽量統計エージェント」「可視化専用エージェント」の選択肢を追加し、
process_exploratory
呼び出し前に分岐。agent_type = st.sidebar.selectbox("Agent Type", ["EDA","Stats","Viz"]) if agent_type == "Stats": from ai_data_science_team.ds_agents import StatsAgent agent = StatsAgent(llm) elif agent_type == "Viz": from ai_data_science_team.ds_agents import VizAgent agent = VizAgent(llm) else: agent = EDAToolsAgent(llm, ...)
-
-
LLMモデルのプラグイン対応
ChatOpenAI(model=model_option,…)
部分をラップして、社内ファインチューニングモデルや RAG 用 RetrievalLLM を選択できるようにする。
3. レポート/エクスポート機能の強化
生成したグラフやテーブル、HTMLレポートをその場で PDF・PowerPoint・Excel にまとめてダウンロードできるようにし、社内配布やプレゼン資料への二次利用を容易にします。さらにレポートテンプレートを用意し、あらかじめレイアウトやセクションを固定しておくことで、品質を担保しつつ定型業務を自動化できます。
対象コード箇所
# 最終的なアーティファクト表示直後
if artifact_list:
st.session_state["chat_artifacts"][msg_index] = artifact_list
display_chat_history()
カスタマイズ例
-
PDF/PowerPoint出力の挿入
-
display_chat_history()
を呼ぶ前、または各アーティファクトの下にボタンを設置。if st.button("Download PDF Report"): pdf_bytes = generate_pdf(msgs.messages, st.session_state["chat_artifacts"]) st.download_button("Here is your report", data=pdf_bytes, file_name="EDA_report.pdf")
-
generate_pdf
はreportlab
やpython-pptx
を使った汎用関数を別ファイルに定義しておきます。
-
-
テンプレート化
- HTML レポート用テンプレート(Jinja2)を用意し、
render_report_iframe
を呼ぶ前にレンダリング。PowerPoint 版も同様にスライド用テンプレートを読み込んで図表とテキストを流し込みます。
- HTML レポート用テンプレート(Jinja2)を用意し、
以上のように、データ入力→エージェント選択→レポート出力という3つのフェーズを起点に、それぞれ対応するコード箇所にフックポイントを設けることで、社内データフローやユースケースに応じた高度なカスタマイズが実現できます。まずは一箇所ずつ小さく手を入れて、動作を確認しながら段階的に機能を拡張してみてください。