外れ値は消していいのか:残す・分けて見る・直すの判断基準と記録の残し方
AIを使いこなすClaudeで執筆し、GPTで自動校閲・修正しています。

結論から言うと、「外れ値に見えるから」という理由だけで消すのはおすすめしません。判断の軸は値の大きさではなく、なぜその値になったかです。 • 原因が入力ミスや単位違いなど、誤りだと確認できたなら、直すか、直せなければ欠測として扱います。 • 原因が実在する極端な値なら、基本は残します。そのうえで、別に分けて見るか、外れ値に強い指標を使います。 • 原因が確認できないなら、消さずに「未確認」と記録し、含む場合と除く場合の両方で結果を見ます。 統計局の用語辞典は、外れ値を「他の多数のデータから大きく離れた値のこと」と説明しています(統計局 統計用語辞典)。つまり外れ値は「離れている」という見た目の特徴を指す言葉で、誤りかどうかまでは含みません。誤りかどうかは、元の記録に当たって人が確かめる必要があります。 この記事では、確認フロー、判断表、AIに任せる範囲、記録テンプレートを順に示します。
外れ値に出会ったときの確認フロー
次の順に進めます。途中で原因が分かった時点で、判断表(次の章)に進んでください。
- 元データを保存する。 加工前のファイルを別名で残し、以降の作業は複製で行います。
- 候補に印を付ける。 削除ではなくフラグ列を追加します(コード例は後述)。
- ありえない値かを見る。 負の年齢、存在しない日付、桁が違う金額など、物理的・業務的に成り立たない値は誤りの可能性が高いです。
- 元の記録に当たる。 紙の帳票、入力画面のログ、担当者への確認など、そのデータを作った側に戻ります。
- 同じ行の他の列と整合するかを見る。 単価と数量から金額が計算できるか、同じ日の他の記録と矛盾しないかを確かめます。
- 原因を三つのどれかに分類する。 「誤り」「実在」「不明」です。
- 処置を決め、記録する。 処置と理由を、後述のテンプレートに書きます。
- 結果を比べる。 平均や合計を、候補を含めた場合と除いた場合で並べ、結論が変わるかを確認します。
手順3〜5で「誰かに聞く」「元の資料を見る」が出てくるのは、AIにも統計手法にも代わりがきかない部分だからです。
原因別の判断表
- 入力ミス・単位違い、例(説明用):12,000円のはずが1,200,000円、基本の処置:元の記録で正しい値を確認して修正、注意点:修正前後の値を必ず記録する
- 誤りだが正しい値が分からない、例(説明用):年齢が「250」で元資料もない、基本の処置:欠測にする(その列の集計から外す)、注意点:行ごと消すと他の列の情報も失う
- 実在する極端な値、例(説明用):大口の法人注文、キャンペーン日の売上、基本の処置:残す、注意点:平均が引っ張られるので中央値も併記する
- 実在するが性質が違う、例(説明用):通常客と法人客が同じ列に混在、基本の処置:区分を分けて別集計、注意点:分け方の基準を事前に決める
- 原因不明、例(説明用):調べたが誰も覚えていない、基本の処置:残したまま「未確認」と記録、注意点:含む場合と除く場合の両方を報告する
「除外」は最後の手段です。除外するなら、分析の目的に対してその値が対象外だと言えること(例:テスト用の注文が混ざっていた)が必要です。
なお、外れ値が代表値に与える影響は指標で違います。統計局の学習サイトでは、外れ値が加わると平均値が最も影響を受け、中央値は多くの場合それほど影響せず、最頻値はまず影響を受けないと説明しています(統計局 中心的な傾向を捉える)。実在する極端な値を残すときは、平均だけでなく中央値も並べると、読み手が偏りに気づけます。
候補に印を付ける(コード例)
四分位範囲(IQR)を使い、第1四分位数−1.5×IQRより小さい値、第3四分位数+1.5×IQRより大きい値に印を付ける方法はよく使われる目安です。目安であり、業務上の正しさを保証するものではありません。次のコードは削除せず、印と記入欄を足すだけです。分位数の計算には pandas の DataFrame.quantile を使っています(pandas ドキュメント)。このコードは本記事の作成時点では実行して確認していないため、手元の小さなデータで試してから使ってください。
import pandas as pd
df = pd.read_csv("sample.csv") # 説明用のファイル名
col = "amount" # 確認したい列名
q = df[[col]].quantile([0.25, 0.75])[col]
q1, q3 = q.loc[0.25], q.loc[0.75]
iqr = q3 - q1
low, high = q1 - 1.5 * iqr, q3 + 1.5 * iqr
df["outlier_flag"] = (df[col] < low) | (df[col] > high)
df["judgement"] = "" # 誤り / 実在 / 不明
df["action"] = "" # 修正 / 残す / 別集計 / 欠測 / 除外
df["note"] = ""
print(f"下限={low}, 上限={high}, 候補={df['outlier_flag'].sum()}件")
print(df[df["outlier_flag"]])
df.to_csv("flagged.csv", index=False)複数の列を組み合わせて外れを探したい場合、scikit-learn には IsolationForest や LocalOutlierFactor などの外れ値検出が用意されています。ただし公式ドキュメントも、高次元や分布の仮定がない場合の外れ値検出は難しいと述べ、contamination で判定しきい値を調整する設計になっています(scikit-learn 外れ値検出)。これらも「候補を挙げる道具」であり、消す根拠にはなりません。
AIに任せること、人が確認すること
AIに向いているのは、候補の整理、確認用の質問リストの作成、記録文の下書きです。「この値は誤りです」と決めさせるのは向いていません。AIは元の帳票を見ていないからです。
渡す情報は、列の意味、単位、期間、候補の行(説明用に置き換えたもの)です。顧客名や個人を特定できるID、社外秘の金額は、ダミー値に置き換えてから貼ってください。
依頼文の例です。
以下は売上データ(説明用に値を置き換え済み)の外れ値候補です。
列の意味:date=日付、store=店舗、qty=数量、unit_price=単価(円)、amount=金額(円)
通常の単価は800〜1,500円程度です。
候補:
行12: 2026-09-03, A店, qty=3, unit_price=1200, amount=360000
行48: 2026-09-18, B店, qty=500, unit_price=1100, amount=550000
お願い:
1. 各行について、誤入力の可能性と実在の可能性を、データ内の矛盾点を根拠に挙げてください。断定はしないでください。
2. 元の記録に当たって確認すべき項目(誰に何を聞くか)を行ごとに3つ以内で。
3. 確認後に使う記録用の1行メモの書き方を例示してください。この例では行12は3×1200=3,600円のはずが360,000円で、桁の入力ミスが疑えます。行48は計算が合っており、大口注文として実在する可能性があります。ただしこれは説明用の例で、実際のデータの結果ではありません。AIの回答は仮説として受け取り、確認は元の記録で行います。
除外理由の記録テンプレート
処置を決めたら、1件ずつ次の項目を残します。表計算ソフトの1行1件で運用できます。
- 記録ID、記入内容:連番
- 記録日・担当者、記入内容:いつ、誰が判断したか
- データ名・列名・行、記入内容:例:売上2026年9月.csv / amount / 行12
- 元の値、記入内容:処置前の値(上書きしない)
- 検出方法と基準、記入内容:例:IQRの1.5倍、目視、業務ルール上の上限
- 確認先と確認内容、記入内容:例:店舗A担当に伝票を確認
- 判定、記入内容:誤り / 実在 / 不明
- 処置、記入内容:修正 / 残す / 別集計 / 欠測 / 除外
- 処置後の値、記入内容:修正した場合の値
- 理由、記入内容:判定の根拠を1〜2文で
- 影響の確認、記入内容:含む場合と除く場合の平均・中央値・合計
- 元データの保存場所、記入内容:ファイルのパスや版
記入例(説明用の架空の内容です)。
ID:001 / 行12 / 元の値:360,000 / 検出:IQR基準 / 確認:A店の伝票を確認し、金額欄に0が2つ多く入力されていた / 判定:誤り / 処置:修正 / 処置後:3,600 / 理由:数量3×単価1,200と一致 / 影響:平均が下がる、中央値は変化なし
書くときのコツは、「外れ値だったので除外」のような理由を避け、何を見てそう判断したかを書くことです。後から第三者が読んで、同じ判断になるかを追える状態が目安です。
迷いやすい場面
- 候補が多すぎる。 基準が厳しすぎるか、分布が偏っている可能性があります。値を全件調べる前に、列を区分ごとに分けて見直してください。
- 確認する相手がいない。 無理に決めず「不明」で残し、含む場合と除く場合の両方を報告します。
- 除外後に結論が変わる。 その場合こそ、除外の根拠を丁寧に書く必要があります。結論が変わることを報告文に明記してください。

