ChatGPT が 3 つのデータセットを分析した結果、毎回同じミスを犯すことが判明
本文の状態
日本語全文を表示中
詳細モードで約20分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
KDnuggets
OpenAI の最新モデル GPT-5.6 Terra および Luna を用いた実験で、データ分析タスクにおいて単一のレビューパスでは誤りを検出できず、場合によっては正解を誤った修正へと変えてしまうリスクが示された。
AI深層分析を開く2026年9月3日 23:24
AI深層分析
キーポイント
AI モデルの分析ミスとレビューの限界
GPT-5.6 Terra と Luna を使用した実験において、単一のレビューパスでは行カウントの誤りや結論の逆転を検出できず、場合によっては正しい回答を誤った修正へと変えてしまう結果となった。
実験環境と使用データセット
研究者は 2024 年 1 月の注文データを扱う shipment_tracking データセットを用い、平均配送時間や地域別成績といったビジネスチームが頻繁に問う質問に対して AI に分析させた。
検証プロセスの再現可能性
実験は Pandas と SciPy を用いたコードで実行され、AI モデル自身に回答を再提示して「経営層向け資料への掲載」を想定させるレビュー工程を含め、すべての結果が再現可能であると明記されている。
欠損値の存在
データセットには注文済みだが配送されていない未出荷のレコードが18件含まれている。
regional_sales データの構造
このファイルは地域と年の組み合わせごとに1行ずつ存在し、合計59件のレコードで構成されている。
重要な引用
One review pass caught a wrong row count and put a checkmark next to a conclusion that was backwards.
The other invented a correction and turned a right answer into a wrong one.
Look at that last row: ordered, never shipped, never delivered. There are 18 like it out of 40 in the dataset.
regional_sales is meant to be one row per region per year: 59 rows, 8 regions, years from 2007 to 2025, and a single sales figure for each combination.
編集コメントを表示
編集コメント
最新の GPT-5.6 シリーズを用いたこの実験は、AI の自己修正能力に対する過度な楽観視に警鐘を鳴らす重要な事例である。実務現場では、AI が生成した数値や結論に対して、人間による厳密な検証プロセスが不可欠であることを再認識させる内容となっている。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。

私たちは実験を行いました。3 つの小さなデータセットと 1 つの AI モデルを用意し、ビジネスチームが通常週に抱えるような質問を投げかけてみました。「平均配送時間は?」「どの地域が最も成果を出しているか?」「このファイルには何人のアスリートがいるか?」といった問いです。
その後、レビュー工程を追加しました。モデル自身が出した回答を再度提示し、「これらは経営陣向けの資料に載せる数値なので、すべてを確認してほしい」と指示しました。
その 1 回のレビューで、行の数が間違っている箇所が指摘され、逆の意味を持つ結論の横にはチェックマークがつきました。一方、別のケースではモデルが独自に訂正を考案し、正しい答えを誤ったものに変えてしまいました。
以下の内容はすべて再現可能です。高速な最初のパスには GPT-5.6 Terra を使用し、同じファイルに対して別のセットで焦らずに実行する際には GPT-5.6 Luna を利用しました。コードは Pandas と SciPy で動作します。

データについて
まず、この 面接問題 で使用されている shipment_tracking データテーブルを使います。
shipment_tracking は、1 行が 1 つの注文に対応するデータセットです。2024 年 1 月 1 日から 21 日の間に、異なる 40 人の顧客から計 40 件の注文が入っています。各注文が進むにつれて、3 つの日付フィールドが順次埋まっていきます。注文開始時に ordered_date が記録され、倉庫から荷物が発送されたら shipped_date が追加され、届いた時点で delivered_date が設定されます。
| order_id | user_id | ordered_date | shipped_date | delivered_date | order_amount |
|---|---|---|---|---|---|
| 1001 | 201 | 2024-01-01 | 2024-01-03 | 2024-01-05 | 89.99 |
| 1002 | 202 | 2024-01-01 | 2024-01-03 | 2024-01-08 | 124.50 |
| 1003 | 203 | 2024-01-01 | 2024-01-07 | 2024-01-10 | 56.25 |
| 1004 | 204 | 2024-01-02 | 2024-01-02 | 2024-01-02 | 299.99 |
| … | … | … | … | … | … |
| 1040 | 240 | 2024-01-21 | 145.70 |
最後の行を見てみましょう。"ordered(注文済み)"、"never shipped(未出荷)"、"never delivered(未配送)"と記されています。このデータセットには、同様の行が 40 件中 18 件含まれています。
本記事で取り上げる 2 つ目のファイルは regional_sales です。これは 面接問題 でも使用されています。regional_sales は、地域と年を 1 セットとした行が 1 つずつ並んだデータセットで構成されるべきです。具体的には、59 行、8 つの地域、2007 年から 2025 年の各年で、それぞれの組み合わせに 1 つの販売数値が含まれるものです。
| 地域名 | 年 | 売上高 |
|---|---|---|
| latam | 2012 | 230.62 |
| us_west | 2010 | 163.94 |
| us_east | 2012 | 270.63 |
| emea | 2010 | 150.00 |
| … | … | … |
| europe_north | 2020 | 300.00 |
このデータには二つの種類の不整合があり、いずれも列名からは検出できません。地域と年の組み合わせのうち、複数の行を持つケースが六つあります。そのうち三つは完全な重複で、すべて us_west に含まれています。また四つの組み合わせでは数値に矛盾が生じており、例えば apac の 2015 年は 173.46 と 126.78 の二つの異なる値として記録されています。
us_west の 2012 年データは、3 つの異なる値で 4 回登場しています。報告できる単一の us_west 2012 年の数値は存在しません。
カバレッジの偏りも顕著です。歴史が 15 年ある「apac」から、わずか 1 年の「latam」まで、範囲は広範にわたっています。
3 つ目のファイルは olympics_athletes_events です。このデータセットは、インタビューの質問 で使用されています。
olympics_athletes_events は、各競技の選手ごとに 1 行となるデータセットです。この「詳細」が後ほど重要になります。352 件のレコードには、15 回の大会と 167 の種目に出場した 336 人の選手が含まれており、そのうち 11 人が複数回出場し、1 人はなんと 6 回も登場しています。medal カラムは 120 行に値が埋められていますが、空白の場合はその競技でメダルを獲得できなかったことを意味します。
| ID | 名前 | 性別 | 年齢 | 身長 | チーム | NOC | 年 | 競技 | メダル |
|---|---|---|---|---|---|---|---|---|---|
| 3520 | Guillermo J. Amparan | M | Mexico | MEX | 1924 | Athletics | |||
| 35394 | Henry John Finchett | M | Great Britain | GBR | 1924 | Gymnastics | |||
| 21918 | Georg Frederik Ahrensborg Clausen | M | 28.0 | Denmark | DEN | 1924 | Cycling | ||
| 110345 | Marinus Cornelis Dick Sigmond | M | 26.0 | Netherlands | NED | 1924 | Football | ||
| … | … | … | … | … | … | … | … | … | … |
| 999998 | John Testman | M | 30.0 | 180.0 | Canada | CAN | 2004 | Athletics | Bronze |
誤り 1:「注文から配送先到着まで」を求めたのに、「出荷から配送先到着まで」を測定していた
shipment_tracking の分析において、平均配送時間を問い合わせたところ、以下のような計算結果が返ってきました。
df['delivery_days'] = (df['delivered_date'] - df['shipped_date']).dt.days
print(f"Avg delivery: {df['delivery_days'].mean():.1f} days")出力結果
Avg delivery: 2.6 days回答の冒頭には「平均配送時間:2.6 日」と記載されていました。
しかし、顧客が荷物を待っている間にかかっている時間は、「注文から配送先到着まで」の時間であり、この計測は決済完了(チェックアウト)時点から始まります。
order_to_door = (df['delivered_date'] - df['ordered_date']).dt.days
print(round(order_to_door.mean(), 2))出力結果
6.09私たちが問うた答えはたった一つ、6.09 日です。しかし、返ってきた回答はそれよりも 2.4 倍も小さい数値でした。
これは最も注意すべき種類の誤りです。なぜなら、バグを見つけることはできないからです。コードは正常に動作し、有効な pandas の記述であり、主張する計算を正確に行っています。エラーの原因は列の選択ミスにあるため、テストや例外、型チェックがこれを検出することは決してありません。このエラーを検知できる唯一の方法は、質問文を読み、その直下にある計算式内の列名を確認することです。
両方の指標は実在するものであり、異なるものを測定しています。「出荷から配送先到着まで」は倉庫の運用効率を示し、「注文から配送先到着まで」は顧客が実際に待つ時間を示します。私たちは後者の質問をしたのに、前者の数値を返されてしまいました。会議前に人々が目にする 1 行の要約には、この入れ替わりを示す兆候は何もありません。
エラーを検知する方法
質問文を読み、その直下にある計算式内の列名を確認してください。これが唯一有効なチェック方法です。コードは正常に動作し、間違った 2 つの日付間の引き算であっても、テストで検出されることはありませんから。
誤り 2:どのコードも計算したことがない数値を記述している
この事例は 2 つの異なるファイルで確認されました。同じ shipment_tracking の回答には、良いプラクティスのように見える注意書きが付け加えられていました。
注意:50 件の注文のうち、配送日が確定しているのは 22 件だけです(残り 28 件は現在輸送中または未確定です)。
このファイルには 40 行のデータが含まれています。
print(len(df), df['delivered_date'].notna().sum(), df['delivered_date'].isna().sum())Output
40 22 18「22」という数字は正しいですが、「50」や「28」はどこから出てきたのでしょうか?そのセッション内のコードでこれらの数値を計算したり、出力した記録はありません。
この文章が危険なのは、50 から 22 を引くと 28 になるため、内部では整合性が取れており、外部からは誤りだと気づきにくい点にあります。読者が頭の中で計算しても、何も不審に思わないのです。
regional_sales の実行も同様に失敗し、より深刻な被害をもたらしました。「どの地域が最も成果を出しているか」と問われた際、AI は「APAC が総売上 368 万ドル(全地域収益の 32%)」と報告し、「データは明確です」と締めくくりました。
print(round(df.groupby('region_name')['sales'].sum()['apac'], 2))Output
3675.49実際の合計金額はファイルで使用されている単位で 3,675.49 です。APAC のシェアも 30.4% であり、回答では数値の桁が約 1,000 倍に膨らまされ、単位の付いていない列に通貨記号が付与されました。また、計算すら行われていないシェアを丸められて提示されています。セッションログを確認すると、その理由がわかります。この実行ではコードは一切走っておらず、pandas のスニペットを印刷し、その下にでたらめの数字を書き込んだだけでした。
コードを実行すること自体も、完全な保護にはなりません。ある「Luna」モデルのゆっくりとした実行では、クエリは正しく実行されたにもかかわらず、「APAC は US West と US East を合わせた合計よりも 60% 以上高い」という記述が残っていました。しかし、実際には両地域の合計が 3,575.70 であるのに対し、APAC は 3,675.49 で、差はわずか 2.8% に過ぎません。
同じ段落内の他の比較対象である「europe_north」よりも 32% 高い値は、正解の 32.2% でした。一つの数値は計測されたものであり、もう一つはその文の中で並列して作られた架空の数値です。
要約において最も注意すべき点はここにあります。コードブロック内の数値は計算によって導き出されますが、その周囲の段落にある数値は人間が記述したものです。両者が一致するよう強制されるわけではありません。
誤りをどう見つけるか
コードが実際に実行されたかを確認し、本文に記載されているすべての数値が出力結果のどこかに存在するかをチェックしてください。なぜなら、私たちの試行のうち2回では、実行されていないコードが表示されていたからです。
今回の例では、ランキングを受け入れる前に粒度(grain)を確認する必要があります。3 行の重複データにより us_west の値が 30.3% 膨らんでおり、また各地域には 1 年から 15 年の履歴が含まれています。そのため、データ年数で割ると us_west が 290.9 で APAC の 245.0 を上回り、見出しの結論が逆転してしまいます。
ミス 3:未着の注文からトレンドを読み取る
『shipment_tracking』のデータについて、配送が速くなっているのか遅くなっているかを問うと、「高速化している」という結論が出ました。その根拠として、第1週の3.2日に対して第3週は1.0日だと指摘されました。
両方の数値自体は事実です。しかし、そこから導き出された結論は逆です。
df['week'] = df['ordered_date'].dt.isocalendar().week
print(df.groupby('week').agg(
orders=('order_id', 'size'),
delivered=('delivered_date', 'count'),
avg_days=('delivery_days', 'mean')).round(2))| 週 | 注文数 | 配送完了 | 平均日数 |
|---|---|---|---|
| 1 | 15 | 12 | 3.17 |
| 2 | 15 | 7 | 2.29 |
| 3 | 10 | 3 | 1.00 |
対象ファイルのデータは1月21日時点で終了しています。第3週の注文には完了までに約3日、第1週の注文には17日の猶予がありました。第3週の注文10件のうち7件には配送日が記載されていません。配送時間が明記されているのは、たまたま速かった注文だけ。遅い注文はまだ到着していないため、測定できていないからです。
後続の週ほど早く見えるのは、証拠となるデータが欠落している割合が増えるからです。平均値は3.17から1.00に低下し、未解決の注文数は20%から70%へと急増します。
同じファイルで時間的制約がない場合でも、Lunaモデルはこの問題を自発的に検出しました。改善は錯覚だと警告する形で回答を始めたのです。同じ罠、同じデータ、しかし結果は正反対です。
エラーを見抜く方法
集計値が低下した際、空白のデータが何を意味するかを確認してから処理させましょう。配送日が欠落していたのは最も新しく、かつ最も遅い注文でした。これらを除外することで、あたかも速度が向上したかのような錯覚を招いています。見分け方は簡単で、同じ3週間の間に未解決注文の割合が20%から70%に跳ね上がっている点です。
間違い4: 226件の空白身長データを説明なしで除外
olympics_athletes_events データセットでは、「身長が高いほどメダル獲得に有利か」を尋ねました。高速パス(fast pass)は2つのグループを比較し、それだけで結論を出しました。
medalists = df[df['medal'].notna()]['height']
others = df[df['medal'].isna()]['height']
print(round(medalists.mean(), 1), round(others.mean(), 1))出力結果
176.5 176.2その判定はこうでした。「身長はほとんど関係ない。メダリストの平均身長はわずか0.3cm高いだけだ。だから、背が高いことが勝利に直結するわけではない。」
計算自体は正しいものの、そこから導き出される結論は誤りです。この比較はファイルの 352 行のうち 126 行のみで実行されました。残りの 226 行は身長データが空白だったため、pandas が何の説明もなくそれらを除外したからです。カラムの平均値は空セルを無視するため、質問から回答に至る間にサンプル数が静かに 64% も減少しました。しかし、その回答ではこの事実に言及されていません。
2 つ目の問題は、これらの空白データが実は何を意味しているかという点です。
print(round(df[df['height'].notna()]['medal'].notna().mean() * 100, 1))
print(round(df[df['height'].isna()]['medal'].notna().mean() * 100, 1))Output
54.0
23.0身長が記録されているアスリートはメダルを獲得する確率が 54% でしたが、記録がない場合は 23% でした。この関係性に対するカイ二乗検定の結果は p = 9e-09 です。これは、値そのものよりも「値が存在するか否か」の方が結果を予測する上ではるかに重要な指標であることを意味します。
その理由は年次にあります。2016 年以前の 302 行のうち身長が記録されているのはわずか 76 行だけで、メダル獲得率は 26.5% です。一方、2016 年以降の 50 行はすべてに身長が記録されており、メダル獲得率は 80% に達します。このファイルでは、「身長が記録されていること」「近年のデータであること」「メダルを獲得すること」はほぼ同じ事実とみなせるため、モデルが分析対象とした 126 行は、ほとんど全員がメダルを獲得した特定の年へと強く偏っています。
「身長は有利か」という問いに対する有用な回答は、「このファイルからは結論を導き出せない」ということです。ステークホルダーにとって重要なのは、0.3cm の差を示すことよりも、データの不備を正直に伝えることです。私たちが行ったすべての分析では、空白データを除外して残りのデータのみを対象としていました。
How to Catch the Error
計算後に残った行数を確認してください。この比較は 352 件中 126 件に対して実行されたにもかかわらず、その旨が明記されていませんでした。また、空白値がランダムなものかどうかを問う必要があります。これらの空白は主に初期の大会に属しており、ある列では NULL が「まだ配送されていない」ことを、別の列では「メダルを獲得しなかった」ことを意味しています。
自身で作業を検証するよう依頼した結果
最初の回答ごとに新しいセッションを開き、その回答全文を貼り付け、同じファイルとサンドボックスを添付して、経営層向けの資料のためにすべての数値を検証するよう依頼しました。
shipment_tracking の回答に対するレビューでは、「ヘッダーセクションに 1 つのエラーがある」と報告されました。レビューは 50 を 40 に、28 を 18 に修正しましたが、これは正しい訂正でした。これを実行するためにコードを実行し、配送されていない 18 件の注文を正しく数え上げました。その後、以下のように記述しました。
すべての主要指標は正しい:Q1: 2.6 日 Q2: 45.5% Q3: 加速中(3.2 日から 1.0 日へ)
Q2 は、5 日の目標に対するオンタイム率であり、実際に正しかったです。
しかし、Q1 がミス 1、Q3 がミス 3 です。つまり、レビューは異なる質問に答える配送時間を承認し、直前に数え上げた同じ 18 件の配送されていない注文によって作られたトレンドを承認しました。画面の錯覚を説明する数字を持っていましたが、2 行下の主張とそれを結びつけることはありませんでした。
訂正後の回答は、その 2 つの数字を除けば元の回答と同じ内容でした。ミス 2 で捏造された数値は修正されましたが、ミス 1 とミス 3 はそのまま残され、検証済みのスタンプを付けたまま回答が提出されました。
olympics_athletes_events データセットのレビューは、さらに誤った方向へと進んでしまいました。まず、別個の誤りを指摘する形で始まりましたが、これは正しい指摘です。「メダルの獲得割合」をレコード単位で計算していた点を正しく見つけ出し、質問の対象がアスリートであるという点から、データセクションで指摘された「粒度(grain)の問題」であると特定しました。これにより、数値は 35.4% に修正されました。
その後、レビューはミステイク 4 で言及されていた身長比較の項目に到達します。しかし、その回答に含まれていた欠陥である「226 の空白データ(blank heights)」については一切触れられていませんでした。代わりに、メダリストの平均身長が 176.4cm、非メダリストが 175.5cm であると報告し、元の値 176.2 を「0.7cm もずれた重大な誤り」としてラベル付けしました。そして結論を書き換え、「背が高いことはメダル獲得と相関しているように見える」という主張に至りました。
このファイルにおいて、一貫したグループ化を行えば 175.5 という数値が得られることはありません。176.4 という数値は、重複する行を削除した後のメダリストの平均にほぼ等しいものです。つまり、レビュー側では互換性のない二つの異なるグループ化を無理やり一つの比較に組み合わせてしまい、単一の分析手法では決して導き出せない差を生み出してしまったのです。そして、その根拠のない差を用いて判断を逆転させました。「身長はほとんど関係ない」という結論(これは 126 の利用可能な行が支持するもの)から、「相関がある」という主張へと変更したのです。しかし、同じ 126 の行で分析すれば p=0.87 という値となり、相関を否定する結果になります。このセッションでは、コードの実行も一切行われていませんでした。
提出された 4 つのミスをレビュー結果と比較してみましょう。ミス 2 の捏造された数値は修正されましたが、ミス 1 と 3 はコメントなしで承認されています。そしてミス 4 では欠陥を見逃し、代替案をでっち上げ、元の回答よりも悪い答えを提示しました。
これらの判断はすべて自信に満ちた口調で行われ、正しいものと間違っているものを文章の表現で見分けることはできませんでした。
結論
機械的な作業自体は全体的に堅実でした。日付の解析も正しく行い、有効な SQL と pandas コードを記述しています。また、余裕のある実行では、多くのアナリストが書くよりも鋭い分析結果を導き出しました(ミス 3 の検閲診断など)。
4 つのミスに共通しているのは、画面に表示されていない要素に基づいて判断してしまった点です。ミス 1 は指標の背後にある問い、ミス 2 は実行されたことのないコード、ミス 3 はまだ到着していない注文、そしてミス 4 は誰も記録したことのない 226 の身長データがその要因でした。
モデルは与えられたファイルを読み取りましたが、すべてのケースで正解は「ファイルに記されていない情報」にかかっていたのです。数字の用途を理解することは、誰にも委ねられない重要な部分です。
算数の再検証を行ってください。そして、レビュー結果ではどちらにしても数値が正しいと書かれているため、自分で 4 つの確認項目を一つずつ検討してください。
データサイエンティストであり、製品戦略にも携わる Nate Rosidi 氏は、分析の講義を行う非常勤講師でもあります。また、一流企業の実際の面接問題を通じてデータサイエンティストの準備を支援するプラットフォーム「StrataScratch」の創設者です。Nate はキャリア市場の最新動向や面接対策、データサイエンスプロジェクト、そして SQL 関連のトピックについて幅広く発信しています。
関連記事
News to Guide
ニュースの次に確認する
発表内容を、現在の料金や仕様と照らし合わせられる関連ガイドです。
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み