農業・農業DX

農業AI活用事例|営農日誌とセンサー分析をClaude Codeで自動化

IoTセンサー・気象データCSV・JA出荷記録など農業現場のデータをClaude Codeとpandasで自動分析するパイプラインの設計・実装方法を5手順で解説。スマート農業補助金情報も収録。

農業AI活用事例|営農日誌とセンサー分析をClaude Codeで自動化


結論:農業現場の営農日誌・センサーデータ・JA出荷記録は、Claude Codeとpandasを組み合わせた5つの手順で分析パイプライン化できます。

  • 要点1:手書きや表計算でバラバラだった営農日誌をCSV正規化し、Claude Codeに自動処理させることで集計作業が大幅に削減できます(想定シナリオ)
  • 要点2:WAGRIや気象APIと接続したセンサーデータパイプラインで、圃場ごとの収量予測・病害虫リスクを自動アラート化できます
  • 要点3:農薬散布記録のGAP適合チェックをコードで自動化すると、農林水産省の国際水準GAP認証取得に向けた記録管理の精度が上がります

対象読者:農業法人・スマート農業に取り組む農家・農業系SIerのエンジニア・農業DX担当者

今日やること:営農日誌のCSVを1枚用意して、本記事の手順1(正規化スクリプト)を試してみてください。

「農業でもAIを使いたいけど、どこから手をつければいいかわからない」

農業法人向けのデジタル化支援で、こういった声をよく聞きます。製造業と違って農業は現場のデータが手書き・Excelバラバラで、しかも気象・土壌・農薬・出荷と情報源がまたがっているため、単純なRPA化では対応しきれないんです。

本記事では、エンジニア視点でClaude Codeを農業データ分析に適用する5手順を解説します。本記事の事例はすべて想定モデルケース(仮想シナリオ)であり、実在するクライアント事例ではありません。コードは実際に動作するサンプルとして記載しています。

スマート農業とClaude Codeの関係

農林水産省は2024年に「農業の生産性の向上のためのスマート農業技術の活用の促進に関する法律(スマート農業技術活用促進法)」を施行しました(令和6年10月1日施行、農林水産省公式)。この法律に基づく「生産方式革新実施計画」の認定を受けると、各種補助事業での優遇措置が受けられます。

スマート農業の実装には、ドローン・IoTセンサー・気象API・JA出荷システムなど複数のデータソースが登場します。Claude Codeはこうした異種データの統合・変換・分析パイプラインを対話しながら設計・実装できる点が強みです。

農業データ連携基盤WAGRIは農研機構が運用するAPIプラットフォームで、気象・土壌・農薬情報・圃場地図などを一元提供しています(WAGRI API一覧、2026年1月6日更新版)。Claude Codeと組み合わせることで、WAGRI APIの呼び出しコードを素早く生成できます。

手順1:営農日誌CSVの構造化と正規化

農業現場では「日付・圃場名・作業内容・使用資材・天候・担当者」などを手書きやExcelで記録しています。形式がバラバラで機械処理しにくいのが最大のボトルネックです。

Claude Codeに以下のプロンプトで正規化スクリプトを生成させます。

営農日誌のCSVがあります。列名が「日付」「作業場所」「内容」「資材名」
「使用量」「天気」「担当者」と不揃いです。
標準スキーマ(date, field_id, task_type, material, quantity_kg, weather, operator)
に変換するpandasスクリプトを書いてください。
- 日付フォーマット: YYYY-MM-DD に統一
- field_idは全角・半角を統一してください
- task_typeは「施肥」「防除」「収穫」「管理」に分類してください
仮定した点は必ず「仮定」と明記してください。

Claude Codeが生成するスクリプトの例は以下のとおりです(想定出力)。

import pandas as pd
import unicodedata
import re

def normalize_farm_log(input_path: str, output_path: str) -> pd.DataFrame:
    """
    営農日誌CSVを標準スキーマに変換する。
    仮定: 入力CSVはShift-JISまたはUTF-8エンコード。
    """
    # エンコード自動検出
    for enc in ["utf-8-sig", "shift-jis", "cp932"]:
        try:
            df = pd.read_csv(input_path, encoding=enc)
            break
        except UnicodeDecodeError:
            continue

    # 列名の揺れを吸収するマッピング
    col_map = {
        "日付": "date", "作業日": "date",
        "作業場所": "field_id", "圃場": "field_id", "ほ場": "field_id",
        "内容": "task_type", "作業内容": "task_type",
        "資材名": "material", "使用資材": "material",
        "使用量": "quantity_kg", "量": "quantity_kg",
        "天気": "weather", "天候": "weather",
        "担当者": "operator", "実施者": "operator",
    }
    df = df.rename(columns={c: col_map[c] for c in df.columns if c in col_map})

    # 日付の正規化
    df["date"] = pd.to_datetime(df["date"], errors="coerce").dt.strftime("%Y-%m-%d")

    # field_idの全角→半角変換
    df["field_id"] = df["field_id"].astype(str).apply(
        lambda x: unicodedata.normalize("NFKC", x)
    )

    # task_typeの分類(想定: キーワードベース)
    task_map = {
        "施肥": ["施肥", "追肥", "元肥", "肥料"],
        "防除": ["防除", "農薬", "散布", "消毒"],
        "収穫": ["収穫", "摘み取り", "刈取"],
        "管理": ["管理", "草刈", "剪定", "土寄せ", "潅水"],
    }
    def classify_task(val: str) -> str:
        for label, kws in task_map.items():
            if any(kw in str(val) for kw in kws):
                return label
        return "その他"

    df["task_type"] = df["task_type"].apply(classify_task)
    df.to_csv(output_path, index=False, encoding="utf-8-sig")
    return df

if __name__ == "__main__":
    result = normalize_farm_log("nosei_nikki_raw.csv", "nosei_nikki_normalized.csv")
    print(result.head())
    print(f"処理件数: {len(result)}行")

このスクリプトをClaude Codeに生成させ、実際の日誌CSVで動作確認しながらブラッシュアップしていきます。重要なのは列名の揺れを吸収するマッピング辞書を農場ごとに調整することです。Claude Codeが不明な列を「仮定」と明記するプロンプト設計が精度向上のカギです。

手順2:圃場センサー・気象データのパイプライン構築

IoTセンサー(温湿度・土壌水分・CO2濃度など)と気象APIのデータをCSVで受け取り、圃場ごとの日次サマリーを生成するパイプラインをClaude Codeで構築します。

WAGRIが提供するAPIには気象実況・予報・土壌情報などが含まれます(WAGRIが提供する主なAPI、2026年1月6日時点)。以下はWAGRI APIとセンサーCSVを統合する想定コードです。

import pandas as pd
import requests
from datetime import date, timedelta

# 想定: WAGRI APIトークンを環境変数から取得
import os
WAGRI_TOKEN = os.getenv("WAGRI_TOKEN", "YOUR_TOKEN")

def fetch_wagri_weather(field_lat: float, field_lon: float, target_date: str) -> dict:
    """
    WAGRIの気象実況APIから圃場位置の気象データを取得する(想定シグネチャ)。
    実際のエンドポイント・パラメータはWAGRI利用申請後に確認してください。
    """
    url = "https://api.wagri.net/v2/weather/daily"
    params = {
        "lat": field_lat,
        "lon": field_lon,
        "date": target_date,
    }
    headers = {"Authorization": f"Bearer {WAGRI_TOKEN}"}
    resp = requests.get(url, params=params, headers=headers, timeout=10)
    resp.raise_for_status()
    return resp.json()

def build_daily_summary(sensor_csv: str, field_lat: float, field_lon: float) -> pd.DataFrame:
    """
    センサーCSVとWAGRI気象データを結合し、日次サマリーを生成する。
    """
    df = pd.read_csv(sensor_csv, parse_dates=["timestamp"])
    df["date"] = df["timestamp"].dt.date

    # 日次集計
    summary = df.groupby("date").agg(
        temp_avg=("temperature_c", "mean"),
        temp_max=("temperature_c", "max"),
        temp_min=("temperature_c", "min"),
        humidity_avg=("humidity_pct", "mean"),
        soil_moisture_avg=("soil_moisture_pct", "mean"),
    ).reset_index()

    # 気象データを結合(想定: WAGRI APIから取得)
    weather_rows = []
    for d in summary["date"]:
        try:
            w = fetch_wagri_weather(field_lat, field_lon, str(d))
            weather_rows.append({
                "date": d,
                "precip_mm": w.get("precipitation_mm", 0),
                "wind_speed_ms": w.get("wind_speed_ms", 0),
            })
        except Exception as e:
            weather_rows.append({"date": d, "precip_mm": None, "wind_speed_ms": None})

    weather_df = pd.DataFrame(weather_rows)
    result = summary.merge(weather_df, on="date", how="left")
    return result

if __name__ == "__main__":
    df = build_daily_summary(
        sensor_csv="field_01_sensor_data.csv",
        field_lat=39.7,
        field_lon=141.1,
    )
    df.to_csv("field_01_daily_summary.csv", index=False)
    print(df.tail())

実際のWAGRI APIのエンドポイント・認証方式はWAGRI利用申請ページで確認してください。本コードはClaude Codeで生成した想定シナリオのサンプルです。

手順3:農薬散布記録のGAP適合点検

国際水準GAPでは農薬使用記録の正確な保管が必須です。農林水産省はGAPのデジタル化を推進しています(農林水産省 国際水準GAPのデジタル化)。

農薬散布記録CSVをClaude Codeに読み込ませ、以下を自動チェックするスクリプトを生成します。

  • 収穫前日数(PHI: Pre-Harvest Interval)の遵守確認
  • 同一農薬の使用回数制限チェック
  • ロット番号の記録漏れ検出
import pandas as pd
from datetime import datetime, timedelta

def check_pesticide_gap(records_csv: str, harvest_plan_csv: str) -> pd.DataFrame:
    """
    農薬散布記録とGAP要件を照合してアラートを生成する。
    仮定: 農薬のPHI(収穫前日数)はレコード内の pesticide_phi_days 列に記載済み。
    実際のPHI値はラベル・農林水産省農薬登録情報で確認してください。
    """
    records = pd.read_csv(records_csv, parse_dates=["spray_date"])
    harvest = pd.read_csv(harvest_plan_csv, parse_dates=["planned_harvest_date"])

    alerts = []
    for _, rec in records.iterrows():
        # 収穫計画日を取得
        field_harvest = harvest[harvest["field_id"] == rec["field_id"]]
        if field_harvest.empty:
            continue
        harvest_date = field_harvest["planned_harvest_date"].values[0]
        harvest_date = pd.Timestamp(harvest_date)

        days_before_harvest = (harvest_date - rec["spray_date"]).days
        phi = rec.get("pesticide_phi_days", 0)

        # PHI違反チェック
        if days_before_harvest < phi:
            alerts.append({
                "field_id": rec["field_id"],
                "spray_date": rec["spray_date"].strftime("%Y-%m-%d"),
                "pesticide": rec["pesticide_name"],
                "alert": f"PHI違反: 散布日から収穫予定まで{days_before_harvest}日(最低{phi}日必要)",
                "severity": "HIGH",
            })

        # ロット番号の空欄チェック
        if pd.isna(rec.get("lot_number")) or str(rec.get("lot_number")).strip() == "":
            alerts.append({
                "field_id": rec["field_id"],
                "spray_date": rec["spray_date"].strftime("%Y-%m-%d"),
                "pesticide": rec["pesticide_name"],
                "alert": "ロット番号の記録なし(GAP記録要件)",
                "severity": "MEDIUM",
            })

    alert_df = pd.DataFrame(alerts)
    if not alert_df.empty:
        alert_df.to_csv("gap_alerts.csv", index=False)
        print(f"アラート件数: {len(alert_df)}")
    else:
        print("GAP点検: 問題なし")
    return alert_df

if __name__ == "__main__":
    check_pesticide_gap("pesticide_records.csv", "harvest_plan.csv")

実際の農薬PHIはラベル表示や農林水産省の農薬登録情報で確認してください。本スクリプトはClaude Codeで生成した想定シナリオです。農薬使用に関する最終判断は必ず農業改良普及員や専門家に相談してください。

手順4:JA出荷データの自動集計レポート

JAへの出荷記録(品目・等級・重量・単価・金額)は月次・年次で集計してコスト管理に使います。Claude Codeで出荷CSVから自動レポートを生成します。

import pandas as pd

def generate_shipping_report(csv_path: str, output_path: str) -> None:
    """
    JA出荷データCSVから月次集計レポートを生成する(想定シナリオ)。
    """
    df = pd.read_csv(csv_path, parse_dates=["shipping_date"])
    df["year_month"] = df["shipping_date"].dt.to_period("M")

    # 月次×品目別集計
    summary = df.groupby(["year_month", "crop_name", "grade"]).agg(
        total_weight_kg=("weight_kg", "sum"),
        total_amount_yen=("amount_yen", "sum"),
        shipment_count=("shipping_date", "count"),
    ).reset_index()

    summary["avg_unit_price"] = (
        summary["total_amount_yen"] / summary["total_weight_kg"]
    ).round(1)

    # HTML形式でレポート出力
    html = summary.to_html(
        index=False,
        classes="shipping-table",
        border=1,
        float_format=lambda x: f"{x:,.1f}",
    )
    with open(output_path, "w", encoding="utf-8") as f:
        f.write(f"

出荷集計レポート(想定出力サンプル)

\n{html}") print(f"レポート生成: {output_path}") if __name__ == "__main__": generate_shipping_report("ja_shipping_2026.csv", "ja_report_2026.html")

Claude Codeにこのスクリプトを生成させる際のポイントは、集計軸(月次/年次/圃場別)と出力形式(HTML/Excel/PDF)を最初に明示することです。あとから「圃場別でも見たい」と追加すると混乱しがちなので、要件を最初に整理してから実装させましょう。

手順5:パイプライン統合と定期実行設定

手順1〜4をシェルスクリプトで結合し、cronで定期実行する構成が実用的です。Claude Codeに「各スクリプトを順次呼び出して失敗時にSlack通知する実行スクリプトを書いて」と指示すると、以下のような統合スクリプトを生成します。

#!/bin/bash
# run_farm_pipeline.sh — 農業データ分析パイプライン統合実行スクリプト
# 想定: python3 と各スクリプトが同一ディレクトリに存在すること

set -euo pipefail
LOG_FILE="pipeline_$(date +%Y%m%d).log"
SLACK_WEBHOOK="${SLACK_WEBHOOK_URL:-}"

notify_slack() {
  local msg="$1"
  if [ -n "$SLACK_WEBHOOK" ]; then
    curl -s -X POST -H 'Content-type: application/json' \
      --data "{\"text\": \"[農業パイプライン] ${msg}\"}" \
      "$SLACK_WEBHOOK" > /dev/null
  fi
}

echo "=== パイプライン開始: $(date) ===" | tee -a "$LOG_FILE"

# 手順1: 営農日誌の正規化
python3 normalize_farm_log.py 2>&1 | tee -a "$LOG_FILE"
[ ${PIPESTATUS[0]} -ne 0 ] && { notify_slack "STEP1失敗"; exit 1; }

# 手順2: センサーデータ日次サマリー生成
python3 build_daily_summary.py 2>&1 | tee -a "$LOG_FILE"
[ ${PIPESTATUS[0]} -ne 0 ] && { notify_slack "STEP2失敗"; exit 1; }

# 手順3: GAP点検
python3 check_pesticide_gap.py 2>&1 | tee -a "$LOG_FILE"
# GAP点検は警告があっても処理を続行

# 手順4: JA出荷レポート生成
python3 generate_shipping_report.py 2>&1 | tee -a "$LOG_FILE"
[ ${PIPESTATUS[0]} -ne 0 ] && { notify_slack "STEP4失敗"; exit 1; }

echo "=== パイプライン完了: $(date) ===" | tee -a "$LOG_FILE"
notify_slack "完了 (ログ: ${LOG_FILE})"

cronへの登録例:

# 毎朝6時に実行(農作業開始前にレポートを確認できるようにする)
0 6 * * * /usr/bin/bash /home/farmer/scripts/run_farm_pipeline.sh >> /var/log/farm_pipeline.log 2>&1

スマート農業補助金:Claude Code導入に使える制度

農林水産省は令和7年度補正予算で「スマート農業・農業支援サービス事業加速化総合対策事業」を公募しました(農林水産省公募ページ、令和7年度補正予算)。スマート農業技術活用促進法の認定計画に基づいて導入する場合、各種補助事業での優遇措置が受けられる場合があります(農林水産省 スマート農業技術活用促進法)。

補助金の詳細・要件・申請期限は年度ごとに変わります。最新情報は農林水産省公式サイトおよび農業改良普及センターで確認してください。AI導入費用・ソフトウェア開発費が補助対象になるかは事業ごとに異なるため、専門家(農業改良普及員・中小企業診断士)に相談することを推奨します。

よくある実装上の失敗パターン

農業データ×Claude Codeの組み合わせでよくある落とし穴を3つ紹介します。

失敗1:列名の揺れを甘く見る

営農日誌は記入者・年度・担当者交代で列名が毎年変わることがあります。

❌「そのままread_csvで読む」→ KeyError地獄

⭕ 列名マッピング辞書を最初に作り、Claude Codeに補完させる。「この辞書に無い列名があった場合は警告を出して停止してください」と指示する。

失敗2:農薬のPHI値をコードにハードコードする

農薬のPHI(収穫前日数)はラベル改訂・品種・適用作物で変わります。

❌ PHI値を直接コードに書く

⭕ PHI値はCSVマスターファイルで管理し、コードから参照する。農林水産省の農薬登録情報(農薬登録データ)で定期的に確認する。

失敗3:センサーデータの欠損を無視する

IoTセンサーは通信障害・電池切れで欠損が発生します。

❌ 欠損を0や平均値で埋めて気温・湿度を誤算

⭕ 欠損フラグを別列で管理し、異常値検知アラートを設ける。製造IoT異常検知のアプローチが参考になります(製造IoT異常検知のClaude Code活用事例)。

内部リンク:関連事例・参考記事

まとめ:農業データ分析パイプラインの実装ロードマップ

フェーズ 期間(想定) 実施内容 想定効果(試算値)
Phase 1 1〜2ヶ月 営農日誌の正規化・JA出荷集計の自動化 月次集計作業の時間削減(試算)
Phase 2 3〜4ヶ月 センサーデータパイプライン・GAP点検自動化 GAP記録作業の精度向上(試算)
Phase 3 5〜8ヶ月 WAGRI API統合・異常検知・予測分析 病害虫リスクの早期発見(試算)

農業DXは「データを取る」から「データで判断する」への転換が本質です。Claude Codeはそのパイプライン構築を大幅にスピードアップしてくれるツールです。ただし、AIは補助ツールです。農薬・肥料・収穫に関する最終判断は必ず農業専門家・農業改良普及員に相談してください。

今日から始めるなら、まず手持ちの営農日誌CSVを1枚用意して、手順1の正規化スクリプトをClaude Codeに生成させてみてください。

FAQ

Q: Claude Codeは農業データ分析に使えますか?
はい、Claude Codeはpythonスクリプトの生成・修正を対話的に行えるため、営農日誌のCSV正規化やセンサーデータ集計パイプラインの構築に活用できます。ただし、生成されたコードは必ず動作確認してから本番環境に適用してください。
Q: WAGRIとは何ですか?農業DXに使えますか?
WAGRIは農研機構が運用する農業データ連携基盤で、気象・土壌・農薬・圃場地図などのAPIを提供しています(2026年1月更新)。利用申請をすることで、気象データや圃場情報をシステムに組み込めます。詳細はwagri.naro.go.jpを参照してください。
Q: 農業AI導入に使える補助金はありますか?
農林水産省のスマート農業技術活用促進法に基づく補助事業で優遇措置が受けられる場合があります。要件・申請期限は年度ごとに変わるため、最新情報は農林水産省公式サイトまたは農業改良普及センターで確認してください。
Q: 農薬散布記録のGAP点検をClaude Codeで自動化できますか?
PHI(収穫前日数)チェック・ロット番号の記録漏れ確認などは、Pythonスクリプトで自動化できます。最終判断は必ず農業改良普及員や専門家に相談してください。AIは補助ツールです。
Q: 本記事の事例は実在するものですか?
本記事の事例・数値・コードはすべて想定シナリオ(モデルケース)です。実在するクライアント・農場の事例ではありません。

著者プロフィール

佐藤傑(さとう・すぐる)。株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(@SuguruKun_ai)で活用法を発信(フォロワー約10万人以上)。100社以上の企業向けAI研修・導入支援を展開。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆。

Claude Code 個別指導・農業DX導入支援

農業データ分析パイプラインの設計から実装まで、Uravationが伴走します。まずはお気軽にご相談ください。

▶ 無料相談・お問い合わせはこちら

Next Step

この事例を、自社の業務に置き換える。

対象業務、利用データ、評価基準、社内展開の順番まで整理すると、AI開発ツール導入の失敗を減らせます。

導入を相談する