AIの業務活用

AIが表やグラフを説明した数値を再計算して検証する

AIが表やグラフを自然に説明していても、合計、割合、平均、増減率が間違っていることがあります。このガイドでは小さな合成売上データを使い、AIの各数値主張を再計算して確認します。

目次を表示

この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English

対象読者AIチャットアシスタントで表、グラフ、レポート、表計算データを要約し、そこに含まれる数値主張を検証したい人向けです。

準備するもの
  • Python 3.12
  • 合計、平均、増減率の基本的な理解

01AIの数値主張をなぜ再計算するのか

グラフの説明がもっともらしく見えても、一部の数値が間違っている場合があります。特に、合計、平均、全体に占める割合、絶対差、増減率、「最大の増加」といった複数の計算が一つの回答に含まれると確認が必要です。実用的な方法は、AIの回答に出てくる各数値を独立した主張として扱い、元データからもう一度計算することです。

最終的な結論だけを確認してはいけません。たとえば「Q4が最も高く、年間売上の32.6%を占め、Q1から50%増加した」という文には複数の独立した主張があります。順位、構成比、増加率をそれぞれ別々に確認する必要があります。

02小さな合成データから始める

この例は合成データです。四半期ごとの売上表に4つの値があるとします。例を小さくすることで、コードに頼る前にすべての結果を手計算で確認できます。

四半期売上
Q1100
Q2120
Q3120
Q4150

4つの値から、年間合計は100 + 120 + 120 + 150 = 490です。平均は490 / 4 = 122.5です。Q4の構成比は150 / 490 × 100 = 約30.61%です。Q1からQ4までの差は150 - 100 = 50で、増加率は50 / 100 × 100 = 50%です。

03検証できる形でAIに依頼する

曖昧な解釈だけを求めるのではなく、計算結果を明示するようAIに依頼します。たとえば「この四半期売上表を要約してください。合計、平均、年間合計に対するQ4の構成比、Q1からQ4までの増減率、最大の前四半期比増加を示し、それぞれの主張に使った数値も示してください」と依頼できます。

典型的なAI回答は次のようなものです。「年間売上は490で、四半期平均は120です。Q4は年間売上の32.6%を占めました。Q1からQ4まで売上は50%増加しました。最大の前四半期比増加はQ3からQ4で、30、または25%の増加です。」

この回答には、意図的に正しい主張と誤った主張を混ぜています。合計490は正しい値です。平均120は誤りで、正しくは122.5です。Q4の構成比32.6%も誤りで、実際は約30.61%です。Q1からQ4までの50%増加は正しく、Q3からQ4までの増加量30と増加率25%も正しい値です。

04Pythonで各主張を再計算する

次のスクリプトは同じ合成データを保存し、必要な指標を再計算して、例として示したAI回答の数値主張と比較します。Python標準ライブラリだけを使用します。結果はoutputsフォルダ内のレポートに保存し、同じファイルがすでに存在する場合は上書きせず停止します。

python
from pathlib import Path

sales = {
    "Q1": 100,
    "Q2": 120,
    "Q3": 120,
    "Q4": 150,
}

ai_claims = {
    "annual_total": 490,
    "quarterly_average": 120,
    "q4_share_percent": 32.6,
    "q1_to_q4_change_percent": 50.0,
    "largest_qoq_absolute_change": 30,
    "largest_qoq_percent_change": 25.0,
}

values = list(sales.values())
quarters = list(sales.keys())

total = sum(values)
average = total / len(values)
q4_share = sales["Q4"] / total * 100
q1_to_q4_change = (sales["Q4"] - sales["Q1"]) / sales["Q1"] * 100

qoq_changes = []
for previous, current in zip(quarters, quarters[1:]):
    old_value = sales[previous]
    new_value = sales[current]
    absolute_change = new_value - old_value
    percent_change = absolute_change / old_value * 100
    qoq_changes.append(
        (previous, current, absolute_change, percent_change)
    )

largest_qoq = max(qoq_changes, key=lambda item: item[2])

recomputed = {
    "annual_total": total,
    "quarterly_average": average,
    "q4_share_percent": q4_share,
    "q1_to_q4_change_percent": q1_to_q4_change,
    "largest_qoq_absolute_change": largest_qoq[2],
    "largest_qoq_percent_change": largest_qoq[3],
}

def close_enough(claim, actual, tolerance=0.05):
    return abs(claim - actual) <= tolerance

lines = []
for name, claim in ai_claims.items():
    actual = recomputed[name]
    status = "PASS" if close_enough(claim, actual) else "FAIL"
    lines.append(
        f"{status}: {name}: AI={claim}, recomputed={actual:.2f}"
    )

lines.append(
    "Largest QoQ interval: "
    f"{largest_qoq[0]} to {largest_qoq[1]}"
)

output_dir = Path("outputs")
output_dir.mkdir(exist_ok=True)
output_file = output_dir / "claims_check.txt"

if output_file.exists():
    raise SystemExit(f"Stop: {output_file} already exists.")

output_file.write_text("\n".join(lines) + "\n", encoding="utf-8")
print(f"Wrote {output_file}")

05PASSとFAILを正しく解釈する

この例では、合計、Q1からQ4までの増減率、最大の前四半期比絶対増加量、最大の前四半期比増加率はPASSになるはずです。平均とQ4の構成比はFAILになるはずです。表示された割合が丸められている場合に備えて許容誤差を使えますが、明らかな差を単なる丸め誤差として扱ってはいけません。

主張AIの値再計算した値結果
年間合計490490PASS
四半期平均120122.5FAIL
Q4の構成比32.6%30.61%FAIL
Q1からQ4の変化50%50%PASS
最大の前四半期比絶対増加3030PASS
最大の前四半期比増加率25%25%PASS

数値だけでなく、その数値を説明する表現も確認します。「25%増加した」と「25%になった」は意味が異なり、増減率とパーセントポイントの変化も別の概念です。計算結果が正しくても、分母、比較期間、単位が間違っていれば文章全体は誤りになります。

06AIの要約を再利用する前の確認項目

  • 主張された各数値を、計算に使われた元データの行やグラフの値と対応させます。
  • 合計と平均が整合しているように見えても、それぞれ再計算します。
  • 構成比では、分子と全体合計である分母の両方を確認します。
  • 増減率では、前の値が分母になっているか確認します: (新しい値 - 前の値) / 前の値 × 100。
  • 「最大」が絶対変化量、増減率、最終値のどれを意味しているのか確認します。
  • 件数、通貨、割合、千単位、百万単位など、異なる単位を混在させないよう確認します。
  • 丸め処理は元の値で計算を終えたあとに行います。
  • 「急成長」「安定した推移」などの定性的な主張は、数値計算とは別に検証します。

07よくあるミスと限界

よくあるミスは、AIの回答がもっともらしいかだけを確認し、実際の計算を再現しないことです。また、代表的な数値だけを確認し、その周囲にある割合や増減率を検証しないこともあります。派生指標は、加重平均かどうか、欠損期間を除外するか、直前の期間と比較するか最初の期間と比較するかといった暗黙の条件でも変わります。

このPythonスクリプトは明示的に定義した計算だけを検証し、元の業務データそのものの意味や正しさを検証するものではありません。元の表が正確か、グラフからデータが欠落していないか、選択した指標が適切かは判断できません。これらは元資料と分析の文脈を別途確認する必要があります。

より大きな表でも原則は同じです。AIの各文章を検証可能な計算に変換し、元データから再計算し、適切な丸め許容範囲で結果を比較し、不一致があれば公開や共有の前に原因を確認します。

実行・検証の記録

2026-09-21 · hand-checked example · Python 3.12

  • 合成データの100、120、120、150を手計算で確認しました。
  • 年間合計を確認しました: 100 + 120 + 120 + 150 = 490。
  • 四半期平均を確認しました: 490 / 4 = 122.5。
  • Q4の構成比を確認しました: 150 / 490 × 100 = 30.612244...%で、約30.61%です。
  • Q1からQ4までの増減率を確認しました: (150 - 100) / 100 × 100 = 50%。
  • 前四半期比の変化を確認しました: Q1→Q2 = +20または20%、Q2→Q3 = 0または0%、Q3→Q4 = +30または25%。
  • この例ではQ3→Q4が、絶対増加量と増加率の両方で最大の正の前四半期比変化であることを確認しました。
  • 例として示したAI回答の平均120とQ4構成比32.6%が、再計算した値と意図的に一致しないことを確認しました。
検証範囲の限界
  • Pythonコードは実行していません。小さな合成例と期待される結果は手計算で確認しました。
  • スクリプトはai_claimsに入力された主張だけを確認し、任意のAI文章から数値主張を自動抽出するものではありません。
  • 0.05の比較許容誤差は例示用であり、実際のデータの精度や丸め規則に合わせて調整する必要があります。
  • 再計算結果が正しくても、元の表やグラフ自体が正確であることを証明するものではありません。

サイト全体の執筆・検証方針

参考資料

説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。