ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-04-23中級

Antigravity で CSV 分析 AI エージェントを自作する — pandas と Matplotlib で集計から可視化まで

Antigravity のエージェント機能で CSV データを自然言語から分析・可視化するエージェントを実装する手順を解説します。pandas と Matplotlib を道具として使わせる設計パターン、ハマりどころ、そして本番利用時の安全策まで扱います。

antigravity435agents90csvpandasdata-analysis

「CSV を渡して、欲しい集計とグラフを日本語で指示するだけで返ってくる」— そんなエージェントを社内で使い始めたとき、Excel で30分かけていた月次レポートが3分で終わるようになりました。Antigravity のエージェント機能と pandas を組み合わせると、この体験は驚くほど少ないコードで実現できます。ただし素朴に組むと、空のデータフレームで例外を吐いたり、数値と文字列が混在した列で黙って誤集計したりと、現場で痛い目に遭います。ここでは私が実際に使っている CSV 分析エージェントの構成と、最初の数週間で気づいた落とし穴をまとめてお伝えします。

なぜ Antigravity エージェントが CSV 分析に向いているのか

CSV 分析は「指示の曖昧さを、その場で解消しながら進める」作業です。たとえば「売上の推移を出して」と言われたとき、日次なのか週次なのか、店舗別で分けるのか、欠損値はどう扱うのか — 人間なら手を動かす前に何回か確認します。Antigravity のエージェントは、この「対話しながらコードを書き、実行して結果を見せ、必要ならやり直す」ループがエディタ内で完結する点で、Jupyter やスクリプトを単体で使うより明らかに速いです。

私はもともと pandas を直接叩く派でしたが、社内の非エンジニアにも使ってもらうには敷居が高すぎました。エージェントに任せると、コードを書けない人でも自然言語で同じ出力を得られます。

最小構成のエージェントスケルトン

まずは土台です。プロジェクト直下に agents/csv_analyst/ を作り、依存ライブラリを固定します。

# 依存インストール(requirements.txt に保存しておく)
pip install pandas==2.2.2 matplotlib==3.9.0 japanize-matplotlib==1.1.3

次に、エージェントに渡す実行関数(tool)を定義します。Antigravity の Agent Manager からこの Python 関数を呼び出してもらう構成です。

# agents/csv_analyst/tools.py
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib  # 日本語フォント対応(import するだけで有効)
from pathlib import Path
 
OUTPUT_DIR = Path("output")
OUTPUT_DIR.mkdir(exist_ok=True)
 
def load_csv(path: str) -> dict:
    """CSV を読み込み、基本情報を返す。エージェントが構造を理解するための最初のステップ。"""
    df = pd.read_csv(path)
    return {
        "columns": list(df.columns),
        "dtypes": {c: str(df[c].dtype) for c in df.columns},
        "rows": len(df),
        "head": df.head(5).to_dict(orient="records"),
    }
 
def aggregate_and_plot(path: str, group_by: str, value: str, output_name: str) -> str:
    """group_by 列で集計し、棒グラフを PNG で保存する。戻り値は保存先パス。"""
    df = pd.read_csv(path)
    # 数値変換できない行は落とす(エージェントに警告を返すため件数を保持)
    df[value] = pd.to_numeric(df[value], errors="coerce")
    dropped = df[value].isna().sum()
    df = df.dropna(subset=[value])
 
    agg = df.groupby(group_by)[value].sum().sort_values(ascending=False)
 
    fig, ax = plt.subplots(figsize=(10, 6))
    agg.plot(kind="bar", ax=ax)
    ax.set_title(f"{group_by} 別の {value} 合計")
    ax.set_ylabel(value)
    plt.tight_layout()
 
    out = OUTPUT_DIR / f"{output_name}.png"
    fig.savefig(out, dpi=150)
    plt.close(fig)
    return f"saved={out} dropped_rows={dropped}"

ポイントは dropped_rows を戻り値に含めていることです。数値列に文字が混ざっていた場合に何件落としたかをエージェントに返すと、次のターンで「30件落ちていますが確認しますか?」のように人間側に戻してくれます。無言で削られるのが一番怖いパターンなので、ここは必ず明示します。

エージェントへの指示ファイル(system prompt)

Antigravity では AGENTS.md をプロジェクト直下に置くと、エージェント全体の振る舞いを規定できます。CSV 分析用には以下のような骨子を置いています。

# CSV Analyst Agent
 
## あなたの役割
ユーザーから受け取った CSV ファイルを pandas で読み込み、指示に従って
集計・可視化を行います。結果は必ず以下の順序で提示してください。
 
1. load_csv ツールで列と型を確認する
2. 曖昧な指示があれば、コード実行前に1度だけ確認する
3. aggregate_and_plot を呼び出し、PNG を保存する
4. 保存先パスと、落とした行数を報告する
 
## 禁止事項
- 元の CSV ファイルを書き換えない(常に読み取り専用で扱う)
- 列名を勝手に変更しない
- 欠損値の扱いを変えたら必ずユーザーに報告する

「曖昧な指示があれば1度だけ確認する」のバランスが肝心です。毎回聞き返すと UX が悪化し、黙って進めると誤集計のリスクが上がります。私は「閾値:3つ以上の解釈候補がある場合のみ確認」をルールにしたら、体感で最もストレスが少なくなりました。

ありがちな落とし穴と対処

運用を始めて2週間ほどで、いくつか定番のトラブルに遭遇しました。

文字コードが Shift_JIS の CSV を読めない — Excel からエクスポートした CSV は今でも Shift_JIS が多く、pd.read_csv(path) のデフォルトだと UnicodeDecodeError が出ます。load_csv 関数の先頭で chardetcharset-normalizer を使って自動判定させるか、最悪 encoding="cp932" を明示的に試すフォールバックを入れておくと安心です。

日付列が文字列として解釈される — ISO 8601 形式なら parse_dates=["日付"] で済みますが、「2026/4/23」のようなスラッシュ区切りだと失敗することがあります。エージェントに「集計前に dtype を確認する」ステップを必ず踏ませるのは、これが理由です。

グラフの日本語が豆腐になるjapanize-matplotlib を import するだけで解決しますが、import 位置が重要です。matplotlib.pyplot より後にimportするとフォント設定が上書きされないケースがあります。私は tools.py の先頭で読み込むようにしています。

「月別に出して」で年を無視されるdf["日付"].dt.month だけでグルーピングすると、2025年4月と2026年4月が合算されます。指示文に年が含まれていない場合、エージェントに「年月で集計しますか?月のみで集計しますか?」と確認させるルールを AGENTS.md に加えました。

セキュリティとデータ境界

社内データを扱う場合、CSV にそのまま個人情報が含まれていることがあります。私は以下を守っています。

  • CSV は /tmp/csv_analyst/ などの作業ディレクトリにコピーしてから処理し、処理後に削除する
  • エージェントのログには列の中身を含めない(head の戻り値もマスクする関数を挟む)
  • Gemini にデータを送信する必要があるときは、サンプルの数行のみに限定する

Antigravity の Python 連携を本格運用する前段階として、Antigravity の Python API を本番投入するためのセーフガード で扱っている鍵管理・タイムアウト・リトライの設計も合わせて整えておくと、夜間の自動実行まで安心して任せられます。

次の一歩

まずは手元の月次売上 CSV で load_csvaggregate_and_plot の往復を1回試してみてください。うまく動いたら、次は複数 CSV を結合する merge_csv ツール、さらに時系列予測を足した forecast ツールへと拡張できます。同じ土台の上に、ウェブスクレイピングで収集したデータをそのまま分析に回すエージェント を組み合わせると、収集から可視化までを一本のチャットで回せるようになります。

Antigravity のエージェント機能は、pandas のような「道具」を渡された瞬間から本領を発揮します。コードを書ける人にとっては時短、コードが書けない人にとっては新しい入口 — 両方を同時に提供できるのがこの組み合わせの面白いところだと感じています。

シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

Agents & Manager2026-07-15
ls には見えるのに、エージェントが開けない — 日本語ファイル名が macOS と Linux で別物になるとき
エージェントが「そのファイルは存在しません」と言い、ターミナルの ls には確かに写っている。三日かけて同期を疑った末に辿り着いたのは、濁点が一文字ではなかったという事実でした。検出スクリプトと三層ゲートまで残します。
Agents & Manager2026-07-08
エージェントに任せた仕事の「やり直し率」を測る — 委譲境界を勘ではなく数字で引く
どこまでをエージェントに任せるか。この線引きを私は長らく勘で引いていました。タスク種別ごとの「やり直し率」を git 履歴から算出し、委譲境界を数字で引き直す実践を、動くコードとともに整理します。
Agents & Manager2026-07-05
エージェント開発スタックの『既知の正常』を1枚のロックファイルで守る — 可動部が同時に動く時代の変更予算設計
IDEビルド・CLI・モデル・依存が同時に動くと、回帰の原因が特定できなくなります。既知の正常を1枚のロックファイルに固定し、一度に動かす軸を絞る変更予算の設計を、実装コードと運用ログで整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →