
データ分析の現場では、収集したデータの一部が欠けている「欠損値」に頻繁に出会うものです。欠損値を放置したまま分析を進めると、結果の精度が下がるだけでなく、誤った意思決定を引き起こすリスクも高まります。データを扱うすべての担当者にとって、欠損値の理解と適切な対処は欠かせない基礎スキルとなっています。
一方で、「どのタイミングで何を補完すべきか」「削除と補完のどちらを選ぶべきか」といった判断軸は、教科書的な知識だけでは身につきにくいものです。欠損のメカニズムを見極めたうえで、業務の文脈に合った処理を選び取ることが、実務で信頼されるデータ分析の出発点です。
本記事では、欠損値の基本概念から発生原因、3つの欠損タイプ(MCAR・MAR・MNAR)、確認方法、対処法、Pythonでの実装、よくある失敗パターンまで、実務で活かせる視点を交えながら体系的に解説します。データ分析の精度を一段引き上げたい方は、ぜひ最後までご覧ください。
目次
欠損値とは何か:基本概念と重要性
まず欠損値の本質を押さえることが、適切な対処を選ぶ前提となります。ここでは、欠損値の定義、分析やモデルへの影響、そして外れ値などの似た概念との違いを順に整理し、実務で混同しないための土台をつくっていきましょう。
欠損値の定義:データが記録されず存在しない状態
欠損値とは、本来であれば値が存在するはずのデータが、何らかの理由で記録されていない状態を指す言葉です。PythonやExcelでは「NaN」「NULL」「空欄」「N/A」など、システムや言語によって表記は異なりますが、「観測されるべき値が手元にない」という事実そのものが欠損値の本質といえます。
実務でよく見かけるのは、顧客マスタの「年齢」列に空欄があるケースや、IoTセンサーが特定の時刻だけ値を記録できなかったケースなどです。一見すると「データがない」だけに見えますが、欠損が含まれているかどうかでその後の処理は大きく変わるため、最初に必ず把握しておくべき要素といえるでしょう。
データクレンジングとは?意味と代表手法を解説!
欠損値が引き起こす問題:分析精度の低下とモデルへの影響
欠損値は、集計値の歪みや機械学習モデルの学習エラーといった具体的な問題を引き起こす厄介な存在です。たとえば平均値を計算する際、欠損が多い変数では一部のレコードしか平均に反映されず、実態と乖離した数値が「事実」として独り歩きしてしまう危険があります。
また、scikit-learnの多くのアルゴリズムは欠損値が含まれたままだとエラーを返す仕様です。無理に欠損行を削除すれば、レコード数が減ってモデルの汎化性能が下がるでしょう。逆に深く考えず平均値で補完すれば、分布が歪んでバイアスが生まれます。欠損値の扱いは、分析の信頼性そのものを左右する論点といえるでしょう。
データ品質とは?品質評価項目や品質を向上させるための実務的対策を解説
欠損値と混同しやすい概念:外れ値・異常値・デフォルト値との違い
欠損値とよく混同されるのが、外れ値・異常値・デフォルト値です。これらはどれも「分析時に注意すべき値」ですが、そもそもの性質が異なるため、対処法も変わります。混同したまま処理してしまうと、本当に必要な情報を捨ててしまうおそれもあるでしょう。
実務での見分け方を整理すると、次の表のとおりです。
概念 | 意味 | 欠損値との違い |
|---|---|---|
欠損値 | 値が記録されていない(存在しない)状態 | — |
外れ値 | 他の値から大きく離れた極端な値 | 値は存在する。分布上の異常を示す |
異常値 | 業務ルール上ありえない誤った値 | 値は存在するが、明確に誤りである |
デフォルト値 | 未入力時に自動で代入される既定値(0、9999など) | 「欠損のように見える有効な値」のため特に注意 |
特に厄介なのがデフォルト値です。たとえば「年齢が0」「金額が9999」といった値は、本当は欠損だったものをシステムが自動で埋めた結果かもしれません。これを見抜かずに平均を取ると、分析全体が歪んでしまうため、業務側との対話を通じて値の意味を確認するプロセスが欠かせません。
箱ひげ図とは?外れ値の見方やExcelでの作成方法まで徹底解説
欠損値が発生する主な原因
欠損値への対処を考える前に、なぜ欠損が生まれるのかを把握しておくと、補完すべきか削除すべきかの判断軸が大きくぶれにくくなります。ここでは、現場でよく見かける代表的な4つの発生パターンを、実例を交えながら順に確認しましょう。
入力フォームの任意項目:未入力による欠損
Webサイトの会員登録フォームや、社内の業務システムでは、必須でない項目を空欄のまま登録できる設計が一般的です。「電話番号」「職業」「年収」などプライバシー性が高い項目ほど未入力率が上がり、結果として該当列に欠損値が大量に蓄積していきます。
この種の欠損は、「答えたくない」という意思の表れであるケースが多く、後述するMNAR(非ランダムな欠損)に分類されることがあります。単純に削除や平均値補完で済ませると、実態よりも回答者の特性に偏った分析結果になりやすいため、入力経路と項目の必須・任意設定を必ず確認しておきましょう。
システムエラー・データ収集の失敗による欠損
IoTセンサーの一時的な通信切断や、バッチ処理の失敗、APIのレートリミットなど、システム由来の欠損も実務で頻発する代表例です。製造業の工場ラインや小売業のPOS連携など、常時データを取り続ける環境ほど、ある一定の確率で欠損が発生する前提で設計されています。
システム由来の欠損は、原因が特定できればMCAR(完全にランダムな欠損)として扱える場合もあるでしょう。一方で、特定機種だけ通信に弱いなど、装置特性に紐づいて偏りが生じることもあるため、ログを確認して欠損が偶発か系統的かを切り分けることが重要です。
アンケートや調査における無回答・回収ミス
マーケティング調査や顧客満足度アンケートでは、設問のスキップ、回答途中での離脱、紙媒体の回収漏れなど、さまざまな要因で欠損が生じます。特に、不満を抱えている回答者ほど自由記述欄に書かない傾向があるなど、回答行動そのものに偏りがあるケースは少なくありません。
対処の前提として、設計段階で「設問のロジック分岐」「必須項目の設定」「回収率の目標値」を決めておくと、後工程の苦労が大きく減るでしょう。回収後のデータでも、回答者属性ごとの欠損率を比較し、どのセグメントに偏りがあるかを把握する一手間が、分析結果の信頼度を底上げします。
データ統合・結合時の不一致による欠損
複数システムのデータを結合する場合、キー項目の表記ゆれ(半角/全角、大文字/小文字、空白など)や、片方にしか存在しないレコードが、結合後の欠損として現れます。特にCRMとMA、基幹システムとBIツールをつなぐ場面で頻発するパターンといえるでしょう。
この種の欠損は、データそのものというよりも「結合キーの設計不備」が原因であることが多いです。pandasのmergeでhow='outer'を使い、両側にのみ存在する行の件数を確認したり、結合前後でレコード数を必ず比較したりする運用を徹底すれば、見落としを防げるはずです。
データマネジメントとは?導入のメリットや実践的な進め方を解説
欠損値の3つの種類(MCAR・MAR・MNAR)
欠損値は、その発生メカニズムによって3つのタイプに分類されます。タイプを誤って判断すると、補完手法の選択そのものが間違ってしまうため、ここで定義と見極めの観点を丁寧に押さえておきましょう。
MCAR(完全にランダムな欠損):欠損がデータ内容と無関係なケース
MCAR(Missing Completely At Random)は、欠損が発生する確率が、観測されているデータにも、欠損している値そのものにも依存しないケースを指します。たとえば、調査票の用紙が偶然破れて読み取れなかった、ネットワークが瞬間的に途切れた、といった完全な偶然による欠損が該当するでしょう。
MCARの場合、欠損行を単純に削除しても残ったデータの代表性が大きく崩れにくいという利点があります。ただし、現実のビジネスデータでMCARが厳密に成り立つ場面は限定的なので、安易にこのタイプだと決めつけずに検証する姿勢が重要です。
MAR(ランダムな欠損):他の観測データに依存して欠損が生じるケース
MAR(Missing At Random)は、欠損の発生確率が他の観測されている変数に依存するものの、欠損している値そのものには依存しないケースです。たとえば「年齢が高い顧客ほど年収欄を空欄にしがち」といった状況は、年齢という観測値で欠損確率が決まるためMARに該当します。
実務でもっとも多く見られるのがこのMARで、他の特徴量を活用した多変量補完や多重代入法を用いることで、比較的良好な補完結果が得られます。一方、欠損確率を説明する変数が観測されていなければ実質的にMNARと区別できないため、業務理解と仮説検証が判断のカギです。
MNAR(非ランダムな欠損):欠損データ自体に依存するケース
MNAR(Missing Not At Random)は、欠損する確率が欠損している値そのものに依存するケースを指す言葉です。「年収が高い人ほど回答を避ける」「症状が重い患者ほど来院しなくなる」など、欠損自体に強い意味が含まれている状況がMNARの典型例といえます。
MNARでは、観測されたデータだけで欠損値を正しく推定するのが原理的に困難なため、業務知識に基づくモデリングや、欠損自体を特徴量として扱うアプローチを併用することになります。見逃すと結果が大きく偏るため、設問設計や業務フローを遡って原因を確認する作業が欠かせません。
欠損タイプの見極め方:補完方法の選択に直結する重要ステップ
欠損タイプは、データだけで完全に判別できるものではありません。実務では、次のような観点を組み合わせて推定します。
- 業務担当者へのヒアリング:「どのような場面で空欄が発生するか」を確認する
- 他変数との相関:欠損フラグを作成し、他の特徴量との相関や分布の差を観察する
- 比較分析:欠損行と非欠損行で目的変数の分布に差があるかを検証する
ここでの仮説立てが、後続の補完手法選択の質を決めます。MCARなら単純削除、MARなら多変量補完、MNARなら欠損フラグの活用といった具合に、欠損タイプの判断と補完手法はワンセットで考えるのが実務の鉄則です。
欠損値の確認方法:分析前に必ず行う実態把握
欠損値への対処を始める前に、まず「どこに、どのくらい、どのようなパターンで」欠損があるかを把握する必要があります。ここでは、レコード単位・変数単位の確認、Pythonでの実装、可視化のテクニックまで、現場で使える確認手順を順に紹介します。
レコード単位での欠損状況の確認手順
レコード単位の確認とは、行ごとにいくつの欠損が含まれているかを把握する作業です。1レコード内に欠損が多い行は、たとえ全体の欠損率が低くても、分析対象として残すべきか除外すべきかを早めに判断する必要があります。
実務では、df.isnull().sum(axis=1)で各行の欠損数を算出し、欠損数の分布をヒストグラムで眺めるのが定番です。「ほとんどの行は欠損ゼロだが、ごく一部に欠損が集中している」といったパターンが見えると、その後のレコード削除可否の判断材料になります。
変数単位での欠損率の算出と判断基準
変数(列)単位の欠損率は、対処方針を決めるうえで最重要の指標です。一般的な目安として、欠損率5%未満なら補完を、30%超なら列削除や欠損フラグ化を検討する、というのが実務でよく使われるラインです。ただし、変数の重要度によってこの基準は調整するべきものといえるでしょう。
欠損率の算出は、df.isnull().mean()で簡単に求められます。加えて、欠損率の高い変数が業務上どの程度重要かを業務担当者と必ず擦り合わせ、機械的に削除しない姿勢が、後の手戻りを減らす鍵となるでしょう。
統計学の基礎である「基本統計量」についてわかりやすく解説
Pythonでの欠損値確認:isnull()・info()・describe()の活用法
pandasには欠損値の確認に役立つメソッドが揃っています。代表的な3つを実務での使い分けの観点から整理しましょう。
- df.info():列ごとの非欠損件数とデータ型を一覧表示。データ全体の俯瞰に最適
- df.isnull().sum():列ごとの欠損件数を厳密に算出。集計や閾値判定の起点になる
- df.describe():基本統計量を確認しつつ、count列で間接的に欠損の有無も確認できる
実務では、まずinfo()でざっくりと全体像を把握し、isnull().sum()やisnull().mean()で具体の数値を出して判断する流れが定石となります。describe()は、補完前後でデータ分布がどう変わったかを比較するのにも便利です。
データ分析のためのPythonを学び始める時につまずかないための6つのステップ
欠損のパターンを可視化する:ヒートマップ・棒グラフの活用
数値だけでは見えてこないのが、欠損の「パターン」です。複数の列で同時に欠損しているのか、それとも独立しているのかが分かると、欠損タイプの推定が一気に進みます。
よく使われる可視化アプローチは次のとおりです。
- missingnoライブラリのmatrixプロット:欠損位置を二値ヒートマップで表示し、共起パターンを把握できる
- 列ごとの欠損率の棒グラフ:どの変数が問題なのかを直感的に共有しやすい
- 欠損相関ヒートマップ:列同士の欠損が連動しているかを数値で評価できる
可視化の目的は、欠損のパターンから「なぜ欠損が起きているのか」という仮説を引き出すことです。チームで共有すれば、業務担当者からの示唆も得やすくなります。
データ可視化とは?その重要性や手法、よくある課題と解決策を解説
欠損値への対処法:削除・補完・活用の選択基準
欠損値への対処は「削除」「補完」「活用」の3軸で考えると整理しやすくなります。ここからは、それぞれの代表的な手法と、現場でよくある選択基準を順に紹介し、実務でブレない判断軸をつくっていきましょう。
欠損値を削除する方法:行削除・列削除の使い分けと注意点
削除は最もシンプルな方法ですが、安易に行うと貴重な情報を失うリスクが高い手法でもあります。行削除(リストワイズ削除)と列削除では、それぞれ向き不向きがあるので注意が必要です。
判断の目安としては、欠損が極めて少なく(数%以下)かつMCARに近い場合は行削除を、欠損率が30%を大きく超え、かつその変数が分析の主要因でない場合は列削除を検討するのが王道でしょう。一方、欠損行のほうに何らかの特徴がある場合(MNARが疑われる場合)は、削除すると分析結果に系統的なバイアスが入るため避けるべきです。
単変量補完:平均値・中央値・最頻値による補完の特徴と適用条件
単変量補完は、その列だけの統計量を使って欠損を埋める手法です。実装が簡単で計算コストも低いため、最初の選択肢として広く使われています。
手法 | 適用しやすいケース | 注意点 |
|---|---|---|
平均値補完 | 数値変数で外れ値が少ない・分布がほぼ対称 | 外れ値の影響を受けやすく、分散が小さくなる |
中央値補完 | 数値変数で外れ値が多い・分布が歪んでいる | 変数間の関係性は無視される |
最頻値補完 | カテゴリ変数や順序変数 | 多数派に偏り、少数カテゴリが過小評価される |
単変量補完は便利な反面、変数間の関係を無視するため、補完後の相関や分散が実態より小さくなる傾向があります。本格的な機械学習モデルを構築する場面では、後述の多変量補完や多重代入法も併せて検討するのが望ましいです。
多変量補完:他の特徴量を活用したIterativeImputerの使い方
多変量補完は、他の列の情報を使って欠損値を予測する手法です。scikit-learnのIterativeImputerは、欠損のある列を目的変数、それ以外の列を説明変数として回帰モデルを構築し、繰り返し補完を行うアプローチを実装しています。
単変量補完よりも変数間の関係を保ちやすいため、MARの欠損に対して優れた結果を出しやすい一方、計算コストは高くなります。内部の推定器にBayesianRidgeやRandomForestRegressorを指定でき、データの性質に合わせた選択ができる点も実務での魅力です。
多重代入法(MI):統計的に信頼性の高い補完アプローチ
多重代入法(Multiple Imputation, MI)は、補完値を複数生成し、それぞれで分析した結果を統合することで、補完による不確実性まで含めて推定値の信頼区間を評価できる手法です。学術研究や保険・医療など、推定の信頼性が問われる領域で標準的に用いられています。
PythonではstatsmodelsのMICEや、Rのmiceパッケージが代表的な実装です。単一の補完値で結果を出す場合と比べ、推定のばらつきまで把握できる点が大きな強みですが、計算コストや解釈の手間も大きいため、用途に応じて使い分けるのが現実的です。
時系列データの補完:前方補完・後方補完・線形補間の使い方
時系列データには、その性質を活かした補完方法があります。代表的なのは前方補完(直前の値で埋める)、後方補完(直後の値で埋める)、線形補間(前後の値を直線でつなぐ)の3つです。
株価や為替のように「前の値を維持しているとみなせる」データには前方補完が、センサー計測値のように「徐々に変化している」と仮定できるデータには線形補間が向いています。pandasのfillna(method='ffill')やinterpolate()が定番のメソッドで、現場の業務理解に合わせた使い分けが分析の質を左右します。
欠損値を「情報」として活用する:欠損フラグを特徴量にする手法
欠損自体が意味を持つMNARのようなケースでは、「欠損しているかどうか」を新たな特徴量(フラグ)として加えることで、モデルに情報として活用させるアプローチが有効です。
たとえば「年収欄が空欄かどうか」のフラグが、購買行動の予測に強く効くことは珍しくありません。補完したい場合と、欠損自体を情報として残したい場合の両方を試し、モデルの精度を比較するのが実務的なアプローチです。欠損は単なるノイズではなく、業務上の意味を持つシグナルかもしれないという視点を持つと、分析の幅が大きく広がります。
Pythonによる欠損値処理の実装手順
ここまで紹介してきた手法を、実際にPythonでどう実装するかを整理しましょう。pandasの基本操作からscikit-learnの活用、欠損値をそのまま扱える勾配ブースティング系ライブラリまで、現場で頻出するパターンを中心に取り上げます。
pandas:dropna()・fillna()の基本的な使い方
pandasのdropna()とfillna()は、欠損値処理の基本ツールです。dropna()は欠損行や欠損列を削除し、fillna()は指定した値で欠損を埋めます。
実務では、fillna()の引数に列ごとの代表値を辞書で渡すと、列単位で異なる値で埋められて柔軟性が高まります。たとえば数値列は中央値、カテゴリ列は最頻値といった使い分けが、わずか1行のコードで実現できる便利さです。
scikit-learnのSimpleImputerで平均値・最頻値補完を実装する
scikit-learnのSimpleImputerは、平均値・中央値・最頻値・定数による補完を統一的なインタフェースで提供するクラスです。Pipelineに組み込めば、訓練データで学習した補完値をそのままテストデータに適用でき、データリークを防ぎながら一貫性のある処理が実現できます。
fillna()との大きな違いは、Pipeline・ColumnTransformerと組み合わせて本番運用に乗せやすい点です。モデルの本番デプロイを視野に入れた段階では、SimpleImputerに切り替える価値があります。
IterativeImputerで多変量補完を実装する
IterativeImputerはscikit-learnの実験的機能の位置づけですが、実務でも広く使われている多変量補完の代表的実装です。インポートにはfrom sklearn.experimental import enable_iterative_imputerを先に呼ぶ必要がある点に注意しましょう。
内部の推定器を変えることで挙動が大きく変わるため、データの規模と分布に応じた選定が重要です。小規模データなら線形回帰系、複雑な非線形が想定されるならRandomForestRegressorを試す、といった切り替えが定石となるでしょう。
XGBoost・LightGBMなど欠損値をそのまま扱えるライブラリの活用
XGBoostやLightGBMといった勾配ブースティング系のライブラリは、欠損値をそのまま入力として受け付け、学習時に最適な分岐方向を自動で学習する仕組みを持っています。これにより、補完作業を行わずに欠損のある特徴量を活用できる点が、実務での大きな魅力です。
実務では、補完なしのまま学習する場合と、丁寧に補完してから学習する場合の両方を試して精度を比較するのが鉄則です。欠損自体が情報を持っているケースでは、補完しない方が精度が上がることも珍しくありません。
欠損値処理でよくある失敗パターンと対策
最後に、現場で頻繁に発生する失敗パターンを5つ紹介します。いずれも「悪意なくやってしまいがち」なミスばかりですが、結果として大きなバイアスを生むため、チェックリストとして覚えておくと実務に役立ちます。
失敗パターン1:欠損の理由を確認せず一律に平均値補完してしまう
もっともよく見かけるアンチパターンが、欠損の発生メカニズムを確認せず、すべての欠損を平均値で埋めてしまうことです。コードは1行で済む手軽さの反面、変数間の関係性が崩れ、分散が小さくなり、相関分析や回帰モデルの結果が歪みます。
対策としては、まず欠損率と欠損タイプ(MCAR/MAR/MNAR)を確認し、変数の性質に応じて中央値・最頻値・多変量補完を使い分けることです。「とりあえず平均値で埋めた」と聞いたら、まずその選択の妥当性を疑ってみる姿勢が大切でしょう。
失敗パターン2:欠損率の高い変数を削除せずモデルに投入する
欠損率が60%や70%を超える変数を、補完だけ施してモデルに投入してしまうケースも実務でよく見られます。この場合、補完値の影響が支配的になり、実質的に「補完アルゴリズムを学習している」だけのモデルになってしまうリスクがあります。
対策は、業務上の重要度を踏まえつつ、欠損率の閾値(例:50%以上は削除)を事前に決めておくことです。どうしても残したい場合は、欠損フラグだけを特徴量にして元の値は使わないなど、設計を工夫する余地があります。
データ分析の基本とは「目的の明確化」である
失敗パターン3:デフォルト値を欠損値と区別せずに分析する
冒頭でも触れたとおり、「年齢が0」「金額が9999」のようなデフォルト値が混在しているデータを、そのまま欠損ではない値として扱ってしまうのは典型的な落とし穴です。欠損率の集計ではゼロに見えても、実態は欠損が大量に含まれている可能性があります。
対策は、データ取得元の業務担当者と必ず仕様を確認し、デフォルト値はNaNに変換してから集計することです。pandasのreplace()やpd.read_csvのna_values引数が便利で、初期取り込みの段階で正しく欠損として扱えるよう設計しましょう。
失敗パターン4:補完後のデータ分布を確認しない
補完を行った後、ヒストグラムや基本統計量で分布の変化を確認しないままモデル構築に進んでしまうのも、よくある失敗です。補完前後で平均は同じでも、分散が大きく変わっていたり、特定値に偏ったピークができていたりすることは少なくありません。
対策は、補完前と補完後の分布を必ず可視化して比較することです。平均・分散・尖度・箱ひげ図などを並べて見ると、補完による不自然な歪みに気付きやすくなり、手法の妥当性を継続的にチェックできます。
失敗パターン5:MNARを見落としてバイアスが生じる
MNARの欠損を見落とし、MARやMCARの前提で補完してしまうのは、もっとも気付きにくい失敗です。結果として、補完した数値はそれらしく見えても、推定結果に系統的なバイアスが残り続け、意思決定そのものを誤らせる危険があります。
対策としては、欠損行と非欠損行で目的変数の分布を比較する、業務担当者と「なぜその欄が空欄になりやすいのか」を議論する、欠損フラグを特徴量に加えてモデル精度の差を確認する、といった多面的なチェックが有効です。欠損は単なる空白ではなく、データの裏側にある業務文脈を映す鏡と捉えて向き合う姿勢が、信頼されるデータ分析者への近道となります。
まとめ
本記事では、欠損値の基本概念から3つの欠損タイプ(MCAR・MAR・MNAR)、確認方法、削除・補完・活用という3軸の対処法、Pythonでの実装、よくある失敗パターンまでを一気通貫で解説しました。
欠損値処理の本質は、機械的に補完するのではなく、欠損の発生メカニズムを業務の文脈で読み解き、適切な手法を選び取ることにあります。MCARなのかMNARなのかを見極めたうえで、削除・補完・活用を柔軟に組み合わせる姿勢こそが、分析の精度と信頼性を支えます。
まずはお手元のデータでisnull().sum()やinfo()を実行し、欠損の実態を把握するところから始めてみてください。小さな確認の積み重ねが、最終的なアウトプットの質を大きく押し上げます。
「これからデータ領域に関する取り組みを実施したいけれど、何から手をつけたらいいかわからない」「データ専門家の知見を取り入れたい」という方は、データ領域の実績豊富な弊社、データビズラボにお気軽にご相談ください。
貴社の課題や状況に合わせて、データの取り組みをご提案させていただきます。






