Claudeで機械警備の誤報を施設別に集計する — 受信ログと駆けつけ記録から原因候補を絞る
機械警備の受信ログと駆けつけ記録を1枚のCSVにそろえ、施設・時間帯・ゾーン別に誤報を集計して原因候補を出す手順を、架空データの実行結果つきで説明します。
機械警備の誤報は、受信ログと駆けつけ記録を1行にそろえ、施設・時間帯・ゾーン・現場メモの4つで数えると、原因候補が絞れます。数える作業そのものはClaudeのコード実行に任せられます。人が決めるのは、何を誤報と数えるかの定義と、出てきた候補を現場で確かめる順番です。
この記事では、受信ログCSVを施設別に集計する流れを、140行の架空データで実際に走らせた結果つきで説明します。集計コードは手元のPythonでも動くので、Claudeの出力を検算する材料にもなります。
誤報の集計は4つの切り口で足りる
誤報の原因を探るとき、見る軸は多くありません。次の4つがあれば、現場に行く前に疑う場所が絞れます。
誤報を割る4つの切り口
施設別の件数と率
どの施設で多いかを見ます。件数と率は別物なので、両方を並べます。
時間帯別
深夜と退出時間帯で山が分かれます。山の位置で、環境要因か運用要因かの当たりがつきます。
ゾーン(センサー)別
同じゾーンに集中していれば、機器や設置位置が候補です。
現場メモの分類
駆けつけ員のメモを原因ごとに数えます。空欄の数も、そのまま報告します。
Claudeに頼む価値が大きいのは、最後の現場メモです。自由記述のメモは「退出時に操作が遅れた」「ドアの閉まりが甘かった」のように表現がばらつきます。集計の前に原因ごとの分類へ寄せる作業は、Claudeが得意な部分です。
件数の集計と分類は、同じCSV集計でも性格が違います。前者は計算なので、Claudeに任せても検算できます。後者は判断が入るので、分類表を人が先に決めておくと結果がぶれません。
受信ログと駆けつけ記録を1枚にそろえる
集計の精度は、CSVの作りで決まります。受信ログと駆けつけ記録が別のファイルなら、受信IDで結合して1行1受信にしておきます。この記事の例で使う列は次の9つです。
| 列 | 中身 | 注意 |
|---|---|---|
| 受信ID | 中身受信ごとの通し番号 | 注意結合のキー |
| 受信日時 | 中身2026-09-05 13:28の形式 | 注意形式を1種類にそろえる |
| 施設コード | 中身F01など | 注意施設名は載せない |
| 施設区分 | 中身事務所・店舗・倉庫 | 注意区分別の比較に使う |
| ゾーン | 中身Z1など | 注意センサー単位でも可 |
| 警報種別 | 中身侵入・火災・設備異常・非常 | 注意社内の区分に合わせる |
| 警戒セット後経過分 | 中身警戒開始からの分数 | 注意空欄は警戒中の受信 |
| 現場結果 | 中身異常なし・誤作動・実害あり | 注意誤報の定義に使う |
| 現場メモ | 中身駆けつけ員の自由記述 | 注意空欄をそのまま残す |
施設名と住所は、コードに置き換えてから渡します。受信ログは、いつ誰がいない施設かを示す記録でもあります。後述するとおり、コード実行はゼロデータ保持(ZDR)の対象外なので、施設を特定できない形にしておくのが無難です。コードと施設名の対応表は、手元だけに置きます。
「誤報」の定義は、集計の前に一行で決めます。この記事の例では、現場結果が「異常なし」か「誤作動」の受信を誤報として数え、「実害あり」は含めません。社内で別の定義があれば、それに合わせてください。定義が違うと、同じログから別の率が出ます。
Claudeに渡す依頼文
CSVを添付し、集計の定義まで書いて頼みます。数え方を文章で固定しておくと、実行のたびに結果がぶれません。
添付の alarm.csv は、機械警備の受信ログと駆けつけ記録を
受信IDで結合したものです。次の定義で集計してください。
- 誤報 = 現場結果が「異常なし」または「誤作動」の受信
- 施設別に、受信件数・誤報件数・誤報率を出す
(受信が20件未満の施設は、率の横に「母数少」と書く)
- 誤報だけを、時間帯(0-5時 / 6-11時 / 12-17時 / 18-23時)別に数える
- 施設コードとゾーンの組み合わせで、誤報が多い上位5件を出す
- 現場メモを原因ごとに数える。空欄は「原因未記入」として別に数える
- 原因は断定せず、「候補」と書く
- 集計に使ったPythonコードも、最後に載せる最後の「コードも載せる」が検算の入り口です。コードが読めれば、定義どおりに数えているかを人が確かめられます。載せなければ、数字が合っているかはCSVを開いて数え直すしかありません。
落とし穴
「実害あり」を誤報に混ぜると、率が下がって見える
分母の受信件数には実害のあった警報も入ります。誤報の定義を変えると、率の水準が動きます。前月と比べるときは、定義を同じにしたCSVで比べてください。
架空データで走らせた集計コードと出力
Claudeが書くコードの中身を想像しやすいよう、同じ定義を手元のPython(pandas 3.0.6)で書くと次のようになります。データは乱数で作った架空の140行で、実在の施設とは無関係です。
import pandas as pd
df = pd.read_csv("alarm.csv", parse_dates=["受信日時"])
df["誤報"] = df["現場結果"].isin(["異常なし", "誤作動"])
g = df.groupby("施設コード")["誤報"].agg(受信="size", 誤報="sum")
g["誤報率"] = (g["誤報"] / g["受信"]).round(2)
print(g.sort_values("誤報", ascending=False))
h = df[df["誤報"]].copy()
h["時間帯"] = pd.cut(h["受信日時"].dt.hour, [-1, 5, 11, 17, 23],
labels=["0-5時", "6-11時", "12-17時", "18-23時"])
print(h["時間帯"].value_counts().sort_index())
print(h.groupby(["施設コード", "ゾーン"]).size()
.sort_values(ascending=False).head(5))
print(h["現場メモ"].value_counts(dropna=False))実行すると、140受信のうち誤報は73件でした。施設別の結果は次のとおりです。
受信 誤報 誤報率
施設コード
F02 38 23 0.61
F03 39 17 0.44
F01 29 14 0.48
F04 15 11 0.73
F05 19 8 0.42時間帯別、ゾーン別、現場メモ別の結果は次のとおりです。
0-5時 29 F02 Z2 12 退出時の操作遅れ 25
6-11時 8 F03 Z3 12 NaN 18
12-17時 6 F02 Z1 11 センサー反応 17
18-23時 30 F01 Z1 7 風雨 9
F04 Z1 7 小動物 4上の出力は3つの表を横に並べて示しています。左から時間帯別の誤報件数、施設とゾーンの組み合わせの上位5件、現場メモの分類です。
数字の読み方 — 率より先に母数を見る
上の施設別の表で、率がいちばん高いのはF04の0.73です。ただし受信は15件しかありません。F02は38件で率0.61、誤報23件です。現場に人を出す順番は、率だけでなく件数も見て決めます。依頼文に「母数少」の注記を入れたのは、この読み違いを防ぐためです。
時間帯は、0-5時と18-23時に誤報が集まっています。2つの山の意味は違います。夜間の山は無人時間帯の環境要因(風雨、小動物)が候補で、夕方から夜の山は退出直後の操作が候補です。警戒セット後の経過分が10分以内の誤報は、この例で23件ありました。経過分の列があると、退出直後かどうかを機械的に分けられます。
ゾーンの上位には、F02のZ2とZ1、F03のZ3が並びます。F03のZ3は12件で、この例ではセンサー反応と書かれた誤報を7件仕込んであります。実データでもこの形が出れば、機器の点検か感度の見直しを疑う根拠になります。
現場メモ別の集計で見落としやすいのは、空欄です。誤報73件のうち18件は原因が未記入でした。分類の上位だけを見ると、原因が分かった誤報のなかでの割合に見えます。空欄を別枠で数えておくと、「記録の取り方を直す」という対策の優先度も数字で言えます。
この架空データの偏りは、仕込んだものと乱数の結果が混ざっています。出力は集計の読み方を示す例で、機械警備全般の誤報の傾向を示すものではありません。自社のログで同じ表を出し、水準は自社の過去と比べてください。
原因候補から現場確認へつなぐ
集計が出たら、候補ごとに現場で確かめることを決めます。Claudeには、次の表のように候補と確認事項を対にして出させると使いやすくなります。
| 集計に出た形 | 原因候補 | 現場で確かめること |
|---|---|---|
| 夜間に特定ゾーンで反復 | 原因候補センサーの感度・設置位置 | 現場で確かめること感知範囲内の物、カーテン、空調の風向き |
| 夜間に風雨の日だけ増える | 原因候補外気・振動の影響 | 現場で確かめること当日の天候記録と受信日時の突合 |
| 退出から10分以内に多い | 原因候補退出時の操作遅れ | 現場で確かめること警戒セット手順、退出動線、最終施錠者 |
| 特定施設だけ率が高い | 原因候補施設側の運用 | 現場で確かめること鍵の保管者、開閉店の人数、セット手順書 |
| 原因未記入が多い | 原因候補記録の取り方 | 現場で確かめることメモの書式、必須項目化 |
候補は原因の断定ではありません。確かめた結果は、次の月の依頼文にも反映します。たとえば「退出時の操作遅れ」が減ったかを、翌月の同じ表で比べます。
施設の誤報が多いとき、最初に確かめる順番
- Q受信が20件未満で、率だけが高いか?答えが件数の多い施設へ進む答えがはい
母数が少ないので、翌月の追加データを待って判断します。
- Q誤報が特定のゾーンに集中しているか?答えが時間帯へ進む答えがはい
機器か設置位置が候補です。感知範囲と設置の向きを確かめます。
- Q警戒セット後10分以内の受信が多いか?答えが現場メモの未記入を確かめる答えがはい
退出時の操作が候補です。手順書と動線を見直します。
記録の取り方を直す
原因未記入が多いと、ここまでの切り分けができません。メモの書式を先に決めます。
同じ「ログを分類して原因を絞る」流れは、倉庫の誤出荷でも使えます。検品ログから原因を分けて是正報告にする手順はClaudeで誤出荷の原因分析にあります。時間帯と拠点の2軸で集計する形は、荷待ち時間の集計とも近い構成です。苦情を分類して管理簿に落とす型は、保険の苦情の分類と管理簿が参考になります。
使う面の選び方と、データの扱い
Claudeにコードを実行させる経路は、大きく2つあります。
claude.aiでは、Free、Pro、Max、Team、Enterpriseの各プランで、Web、Claude Desktop、Claude Mobileからコード実行を使えます。Free、Pro、Maxでは「Settings > Capabilities」の「Code execution and file creation」をオンにします。TeamとEnterpriseは既定で有効で、組織のオーナーが組織設定で無効にできます。CSVやTSVをアップロードして、データ分析や可視化ができます。
API経由では、コード実行ツールにCSVを渡します。Files APIで先にアップロードし、メッセージに container_upload ブロックでファイルIDを指定する流れです。定期バッチや社内ツールに組み込むときはこちらを使います。公式の例に沿った形は次のとおりです。
curl --fail-with-body -sS https://api.anthropic.com/v1/files \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-F "file=@alarm.csv"返ってきたファイルIDを使って、メッセージのリクエストを送ります。ツール定義の type は code_execution_20250825 です。code_execution_20260120 以降の版は、REPLの状態保持などを追加します。1つの集計だけなら、どの版でも書ける内容です。
データを渡す前に決めておくこと
施設を特定できない形にする
施設コードに置き換えます。対応表は手元だけに置きます。
コンテナの保持期間を知る
コード実行のコンテナのデータは、最大30日保持されます。Files APIで作られたファイルは、削除するまで残ります。
ZDRの対象外であることを知る
コード実行とFiles APIは、どちらもZDRの対象外と記載されています。契約でZDRを前提にしている場合は、使えるかを先に確かめます。
課金を知る
ファイルを含むリクエストは、ツールが呼ばれなくても実行時間が課金されます。組織あたり月1,550時間の無料枠があります。
コンテナは、インターネットに接続できず、プリインストールされたライブラリ(pandas、numpy、matplotlibなど)だけが使えます。メモリは5GiB、CPUは1つです。行数が増えたときは、列を絞ってから渡すと扱いやすくなります。
ファイルサイズの上限は、ヘルプの記載が2つあります。ファイル作成のヘルプでは、アップロードもダウンロードも1ファイル30MBです。ファイルアップロードのヘルプでは、チャットへのアップロードが1ファイル500MBで、1チャット20ファイルまでです。Files APIは1ファイル500MBです。数年分のログを一度に渡す前に、Claudeのファイルアップロード上限で自分の経路の上限を確かめてください。
CSV集計の基本はClaudeのCSV分析に、APIで同じ集計をする場合の比較はFiles APIとcode executionでCSVを集計するにまとめてあります。
毎月回すときの運用
毎月の誤報を集計するなら、依頼文を保存して、CSVの列と定義を固定します。月ごとに変えるのはCSVだけにすると、前月との比較が成り立ちます。
比較用のシートは、施設別の誤報件数と率に「前月」「今月」「差」の3列を並べると見やすくなります。差が大きい施設だけを、次の確認対象にします。
Claudeの出力は、次の順で検算します。
検算の手順
- 1
件数の合計を合わせる
施設別の受信件数の合計が、CSVの行数と一致するか確かめます。この例では140件です。
- 2
誤報の定義を確かめる
載せてもらったコードの
isinの中身が、決めた定義と同じか見ます。 - 3
上位の1件を元データで数える
ゾーン別の上位1件を、CSVのフィルタで数え直します。
- 4
候補を現場に出す
候補は確定ではないので、確認の依頼として現場に渡します。
まとめ
誤報の集計は、定義を決めてコードに数えさせ、母数と空欄を見てから候補を出す順で進めると、現場確認の優先順位まで言えます。率だけで施設を並べず、件数と原因未記入の数を添えるのが読み違いを避けるコツです。
施設名を伏せたCSVと、コードを載せさせる依頼文の2点があれば、翌月も同じ手順で比べられます。次の一歩は、自社の直近1か月分のログで、施設別の表だけを出してみることです。