AIが出した集計結果を検算する方法:小さな架空データと手計算で突き合わせる
AIを使いこなすClaudeで執筆し、GPTで自動校閲・修正しています。

AIの集計を確かめるには、元データを全部読む必要はありません。次の3点を確認すれば、よくある取りこぼしの大半は見つかります。 1. 件数一致:グループ別の件数を足すと、元データの行数になるか 2. 合計一致:グループ別の合計を足すと、元データの列合計になるか 3. 抜き取り検算:1グループだけ元データから絞り込み、手で足して一致するか この3点は、元データを開いて表計算ソフトの行数表示とSUMを見るだけでできます。この記事では、12行の説明用データで3点確認を手計算し、そのまま実データに使える依頼文も用意しました。 なお、記事内のデータと数字は説明のために作った架空の例です。AIツールで実行した結果ではなく、手計算した値です。
この記事の目次
先に知っておきたい:AIの集計が静かにずれる典型例
pandasで集計する場合、欠損値の既定動作によって行が集計から除外されたり、合計に加算されなかったりすることがあります。たとえば、次の既定動作があります。
- groupby は、グループの分け方に使う列が空欄(NA)だと、その行を既定で落とします(pandas公式:DataFrame.groupby)。dropna=False にすると、空欄が独立したグループになります。
- sum は、空欄を無視して足すのが既定です。有効な値が1つもなくても結果は0になります(pandas公式:DataFrame.sum)。
つまり、pandasでこのように集計した場合、地域が空欄の行は地域別集計から消え、金額が空欄の行は合計に加算されません。AIがどの方法で集計したかは画面から分からないこともあるため、結果が正しそうに見えても3点確認が必要です。AIが別の方法を使っていても、確認の考え方は同じです。
説明用データ:12行の注文表
次の表は、検算の練習用に作った架空の例です。わざと「地域が空欄」「金額が空欄」の行を1つずつ入れてあります。
- A001、地域:東、商品:りんご、金額:1,200
- A002、地域:東、商品:みかん、金額:800
- A003、地域:西、商品:りんご、金額:1,500
- A004、地域:西、商品:みかん、金額:600
- A005、地域:東、商品:りんご、金額:1,000
- A006、地域:北、商品:みかん、金額:900
- A007、地域:西、商品:りんご、金額:1,300
- A008、地域:(空欄)、商品:みかん、金額:700
- A009、地域:北、商品:りんご、金額:1,100
- A010、地域:東、商品:みかん、金額:500
- A011、地域:西、商品:みかん、金額:(空欄)
- A012、地域:北、商品:りんご、金額:400
AIに「地域別の金額合計を出して」とだけ頼み、次の結果が返ってきたとします(これも説明用の仮の出力です)。
- 東、件数:4、金額合計:3,500
- 西、件数:4、金額合計:3,400
- 北、件数:3、金額合計:2,400
- 合計、件数:11、金額合計:9,300
一見もっともらしい表です。ここから3点確認をします。
手順:3点確認と手計算ワークシート
手順1:元データ側の基準値を先に決める
AIの出力を見る前に、元データから次の3つを自分で取ります。表計算ソフトのステータスバーや COUNTA、SUM、COUNTBLANK で足ります。
- 元データの行数(見出しを除く)
- 金額列の合計
- 分類に使う列(地域)と金額列の空欄の数
12行の例では、行数は12、金額列の合計は10,000、地域の空欄は1、金額の空欄は1です。
手順2:ワークシートで突き合わせる
次の形の表を、紙でも表計算ソフトでも作ります。
- 件数一致(行数)、元データの基準値:12、AIの結果:4+4+3=11、差:1、判定:不一致
- 合計一致(金額)、元データの基準値:10,000、AIの結果:3,500+3,400+2,400=9,300、差:700、判定:不一致
- 抜き取り検算(東)、元データの基準値:手計算 3,500、AIの結果:3,500、差:0、判定:一致
見るのは「差」の列です。差が0でなければ、原因探しに進みます。
手順3:差の原因を行単位で絞る
差は「件数1」「金額700」でした。元データで金額が700の行を探すと、A008(地域が空欄)が見つかります。地域が空欄のため、地域別集計に入らなかったと考えられます。
一方、A011は金額が空欄です。件数には数えられていますが、金額には何も足されていません。そのため西の件数は4、西の金額は3つ分の3,400になっています。この行は合計の差には出ません。件数と金額の「有効な数」を別々に確かめないと見逃します。
手順4:抜き取り検算のやり方
抜き取りは、どのグループを選ぶかで効果が変わります。次の選び方が現実的です。
- 件数が多いグループを1つ(影響が大きい)
- 件数が少ないグループを1つ(端の扱いが出やすい)
- 欠損や例外がありそうなグループを1つ
選んだグループを元データでフィルタし、金額を電卓や暗算で足します。西を例にすると、1,500+600+1,300=3,400、空欄の1件は足さない、と手で確認できます。
AIへの依頼文:検算しやすい形で出させる
最初の依頼から、除外した行を表示させておくと確認が楽になります。次の依頼文は、そのまま使えるよう書いた例です(本記事では実行していません)。
添付の注文データを地域別に集計してください。次の条件を守ってください。
1. 集計前の全行数を最初に書く。
2. 地域が空欄の行は除外せず「未分類」の行にまとめる。
3. 金額が空欄の行は、その件数と注文IDを別に一覧する。
4. 結果表には「件数」「金額が入っている件数」「金額合計」を出す。
5. 最後に、地域別の件数の合計が全行数と一致するか、
地域別の金額合計の和が全体の金額合計と一致するかを自分で確認し、
一致しない場合はその差と原因を書く。この依頼で返ってくる表は、12行の例ならおおむね次の形になるはずです。
- 東、件数:4、金額が入っている件数:4、金額合計:3,500
- 西、件数:4、金額が入っている件数:3、金額合計:3,400
- 北、件数:3、金額が入っている件数:3、金額合計:2,400
- 未分類、件数:1、金額が入っている件数:1、金額合計:700
- 合計、件数:12、金額が入っている件数:11、金額合計:10,000
ただし、AI自身の「一致しました」という報告は確認の代わりになりません。手順2の基準値と、自分で突き合わせてください。
実データの前に、小さな架空データで試す
実データを渡す前に、上のような12行前後の説明用データで同じ依頼を試す方法があります。
- 実データと同じ列構成で、10〜15行の架空データを作る。実際の氏名や顧客情報は使わない。
- 欠損、重複ID、全角数字、「1,200円」のような単位付きの値など、実データで起きそうな癖を1行ずつ混ぜる。
- 答えを先に手計算しておく。
- 同じ依頼文をAIに出し、手計算と違う場所を確認する。
この方法が教えてくれるのは、依頼文の書き方がAIの扱い方とかみ合っているかどうかです。小さなデータで合っても、実データで合う保証にはなりません。そのため、実データでも手順2の3点確認は省略しないでください。
機密のデータをそのまま入れず、架空データに置き換えるのが基本です。学習への利用を止める設定があっても、それは情報の秘密が守られることとは別の話です。
判断表:差が出たときの見方
- 件数の和が行数より少ない、疑うこと:分類列の空欄や表記ゆれで行が落ちた、次の一手:空欄の行数を数え、差と比べる
- 件数は合うが金額の和が少ない、疑うこと:金額が空欄、または文字列として読まれた、次の一手:金額の空欄数と、「円」や全角を含む値を探す
- 件数の和が行数より多い、疑うこと:重複行や、複数グループに入る分類、次の一手:注文IDの重複を数える
- 全体の合計も元データとずれる、疑うこと:読み込み時の行の欠落、別シートの混在、次の一手:読み込んだ行数をAIに表示させる
- 3点とも一致するが違和感がある、疑うこと:集計の定義(期間、返品の扱い)の違い、次の一手:集計条件を文章で確認する
3点が一致しても、「何を集計に含めるか」の定義が自分の意図とずれていることはあります。その場合は計算ではなく、依頼文の条件を直します。

