
探索的データ分析 (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つのフェーズを起点に、それぞれ対応するコード箇所にフックポイントを設けることで、社内データフローやユースケースに応じた高度なカスタマイズが実現できます。まずは一箇所ずつ小さく手を入れて、動作を確認しながら段階的に機能を拡張してみてください。