欠測値とは?欠損値との違い・種類と補完・削除の対処法
欠測値(けっそくち)とは、本来観測されるはずのデータが記録されていない状態、またはその欠けているデータ点を指す。アンケートの無回答、センサーの取得漏れ、システム連携での取りこぼしなど原因はさまざまだが、放置したまま集計や統計解析にかけると、平均や相関が歪み、機械学習モデルの精度も落ちる。データ分析でよく使う「欠損値」とほぼ同じ意味だが、使われる分野が異なる。この記事では、欠測値と欠損値の違い、MCAR・MAR・MNARという3つの発生メカニズム、リストワイズ削除・ペアワイズ削除や多重代入法といった対処法、PythonとRでの実践までを整理する。
まとめ:欠測値の要点
- 欠測値=観測されるはずのデータが欠けている状態。統計学では「欠測値」、機械学習やデータ分析の実務では「欠損値」と呼ぶことが多く、指す対象は同じ。
- 欠測はMCAR(完全にランダム)/MAR(観測値で説明できる)/MNAR(値自体に依存)の3つに分類され、どれかによって適切な対処が変わる。
- 対処は大きく削除法と補完法。単純な削除やペアワイズ削除はデータを減らしバイアスを生みやすく、現在は多重代入法(MICE)が標準的な選択肢。
- 安易な平均値代入は分散を過小評価するため避ける。MCARなら削除も許容、MARなら多重代入、MNARは感度分析やモデル化で判断する。
- 欠測率が高い変数(目安として半数以上が欠測)は、補完より変数自体の採否を検討する。
欠測値の定義と、欠損値との違い
欠測値とは、調査・測定・記録の過程で本来得られるはずだった値が存在しない状態を指す。表計算ソフトでは空欄、データベースでは NULL、pandas では NaN、Rでは NA として表現される。単なる空欄でも、分析処理では「値が無い」という情報を持った特別な状態として扱う必要がある。
欠測値と欠損値の異同(同義語としての扱い)
結論から言えば、欠測値と欠損値は同じ概念を指す。英語ではどちらも missing value / missing data であり、訳語が2通りあるだけだ。使い分けは分野の慣習による。
| 用語 | 主に使う分野 | ニュアンス |
|---|---|---|
| 欠測値(けっそくち) | 統計学・生物統計・公的統計・臨床試験・調査 | 「測定・観測されなかった」に力点 |
| 欠損値(けっそんち) | データ分析・機械学習・Python/データベース実務 | 「データが欠け落ちている」に力点 |
厳密な区別ではないため、統計の教科書で「欠測」、pandas のドキュメントで「欠損」と表記が揺れていても、同じものと考えて差し支えない。検索で「失測」と入力されることもあるが、これは「欠測」の変換ミスで、意味は同じだ。以降は統計学の文脈に合わせて「欠測値」を主に用いる。
欠測が起きる仕組み:MCAR・MAR・MNARの3分類
欠測値の対処法を選ぶ前に、まず「なぜ欠けたのか」を考える。統計学者のルービン(Rubin, 1976)とリトルは、欠測の発生メカニズムを次の3つに分類した。この分類は、どの対処法なら結果を歪めずに済むかを判断する土台になる。
MCAR(完全にランダムな欠測)
MCAR(Missing Completely At Random)は、欠測するかどうかが観測値とも未観測値とも一切関係なく、純粋な偶然で起きる状態。たとえば試験管を偶然割ってしまった、通信エラーで一部が届かなかった、といったケースだ。MCARなら欠測したデータと残ったデータの性質が同じなので、削除しても平均や相関に系統的な偏りは生じない(ただしサンプル数が減り検定力は落ちる)。
MAR(観測値で説明できる欠測)
MAR(Missing At Random)は、欠測の起こりやすさが「観測できている他の変数」で説明できる状態。たとえば男性より女性の方が体重を回答しない傾向があるが、性別(観測済み)で条件付ければ欠測がランダムに見える、という場合。名前に反して完全なランダムではない。MARなら、観測変数を使った多重代入法などで偏りを補正できる。
MNAR(欠測が値自体に依存する)
MNAR(Missing Not At Random)は、欠測する理由が欠けている値そのものに関係する状態。たとえば収入が高い人ほど収入を答えたがらない、症状が重い患者ほど来院できず測定値が欠ける、といったケース。欠けた値の情報を観測データから復元できないため、最も厄介で、単純な削除も代入も偏りを取り除けない。
MCARとMARは「無視できる欠測(ignorable)」、MNARは「無視できない欠測(non-ignorable)」と呼ばれる。多くの補完手法はMCARまたはMARを前提にしており、MNARが疑われる場合は前提が崩れる点に注意する。
欠測率の確認と許容水準
対処を決める前に、変数ごとの欠測率(全体に占める欠測の割合)を確認する。欠測率=欠測しているデータ数÷全データ数で求め、まずどの列がどれだけ欠けているかを把握する。
許容水準に絶対的な基準はないが、実務では次のように扱うことが多い。欠測が数%程度と少なければ、代入による影響は限定的で対処の選択肢も広い。半数近く、あるいは半数以上が欠測している変数は、補完しても大部分を推測値で埋めることになり信頼性が低いため、その変数を分析から外す判断も検討する。ここでも「量」より「メカニズム」が優先で、欠測率が低くてもMNARなら偏りは残る。
欠測がMCARと言えるかどうかを統計的に確かめる方法として、リトルのMCAR検定(Little’s MCAR test)がある。帰無仮説「データはMCARである」を検定するもので、有意(p値が小さい)ならMCARとは言えず、MARやMNARを疑う根拠になる。ただし検定はMCARを否定できても、MARとMNARを見分けることはできない点に留意する。
対処法①:削除法(リストワイズ削除・ペアワイズ削除)
削除法は、欠測を含む行や値を分析から除外する最も単純な対処。実装は容易だが、データを捨てることで検定力が落ち、MCAR以外では偏りを生む。
リストワイズ削除(完全ケース分析)
リストワイズ削除は、分析に使う変数のいずれかが欠測している行(ケース)を丸ごと除外する方法。完全ケース分析(complete case analysis)とも呼ぶ。残るのはすべての変数が揃った行だけなので扱いやすい一方、変数が多いと該当行が急減し、サンプルが大きく目減りする。欠測がMCARなら結果に偏りは生じないが、MARやMNARでは残ったデータが母集団を代表しなくなり、平均や回帰係数が偏る。
ペアワイズ削除(利用可能ケース分析)
ペアワイズ削除は、計算に必要な変数だけが揃っていれば、その組み合わせごとにデータを使う方法。利用可能ケース分析(available case analysis)とも呼ぶ。相関行列の各要素を、その2変数が揃った行だけで計算するのが典型だ。リストワイズ削除よりデータを多く活かせる利点があるが、計算する統計量ごとに使うサンプルが異なるため、相関行列全体としての整合性が崩れ、分散共分散行列が正定値でなくなるなど後続の解析で不具合が出ることがある。
対処法②:補完法(単一代入・多重代入)
補完法(代入法、imputation)は、欠測箇所を推定値で埋めてデータを完全な形に戻す対処。削除でサンプルを失わずに済む反面、埋め方を誤ると分散を過小評価し、見かけ上の精度を過大に見せてしまう。
単一代入とその限界
単一代入は、欠測1つにつき1つの値を当てはめる方法。平均値・中央値・最頻値での代入や、他変数からの回帰代入、時系列での前後の値による補間などがある。手軽だが、平均値代入は分布の中心にデータを集中させて分散を人為的に小さくし、変数間の相関も弱める。「とりあえず平均で埋める」は分析結果を歪めやすいため、安易に使わない。
多重代入法(Multiple Imputation・MICE)
多重代入法(Multiple Imputation)は、ルービン(1987)が提唱した手法で、現在の標準的な選択肢。欠測を1回だけ埋めるのではなく、もっともらしい値を複数(例:5〜数十セット)生成して複数の完全データセットを作り、それぞれで同じ解析を行い、最後に結果を統合(プーリング)する。埋めた値の不確実性を分散に反映できるため、単一代入のように精度を過大評価しない。実装ではMICE(Multivariate Imputation by Chained Equations、連鎖方程式による多変量代入)がよく使われ、変数ごとに回帰モデルを立てて反復的に代入していく。MCARまたはMARを前提とする手法である点は押さえておく。
Python・R・SPSSで欠測値を扱う
実務では、まず欠測の分布を可視化・集計し、メカニズムの見当をつけてから対処を選ぶ。代表的なツールの入り口を示す。
Python(pandas・scikit-learn)
Pandas では isnull()(isna())で欠測を検出し、dropna() で削除、fillna() で代入する。多重代入に近い反復代入は scikit-learn の IterativeImputer で行える。
import pandas as pd
df.isnull().sum() # 列ごとの欠測数を確認
df_dropped = df.dropna() # リストワイズ削除
df["col"] = df["col"].fillna(df["col"].median()) # 中央値で単一代入
# 反復代入(多変量)
from sklearn.experimental import enable_iterative_imputer # 明示的に有効化
from sklearn.impute import IterativeImputer
imputer = IterativeImputer(random_state=0)
df_imputed = imputer.fit_transform(df)
scikit-learn には固定値・平均値などで埋める SimpleImputer、近傍のデータで埋める KNNImputer もある。
R(mice パッケージ)
Rでは欠測は NA で表され、多重代入は mice パッケージが定番。method = "pmm"(予測平均マッチング)で代入し、解析結果を pool() で統合する。
library(mice)
imp <- mice(df, m = 5, method = "pmm", seed = 123) # 5セット生成
fit <- with(imp, lm(y ~ x1 + x2)) # 各セットで解析
result <- pool(fit) # 結果を統合
summary(result)
欠測パターンの可視化には VIM、別方式の多重代入には Amelia などがある。
SPSS(多重代入・欠損値分析メニュー)
SPSSではコードを書かずにメニュー操作で対処できる。「分析>多重代入>値の代入」で多重代入を実行し、「分析>多重代入>欠損値パターンの分析」で各変数の欠測率やパターンを可視化できる。欠損値分析(Missing Value Analysis)ではリトルのMCAR検定の結果も出力されるため、メカニズムの見当をつける用途に使える。多重代入・MCAR検定といった手法名は統計解析ソフト間で共通しており、ツールが変わっても考え方は同じだ。
欠測値の対処を誤らないための判断基準
手法の一覧を知っても、選び方を間違えれば結果は歪む。実務でつまずきやすい判断を、メカニズムに沿って整理する。
| メカニズム | 推奨される対処 | 避けたい対処 |
|---|---|---|
| MCAR | 削除も許容/多重代入も可 | 特になし(ただし単一の平均値代入は非推奨) |
| MAR | 多重代入(観測変数を使って補正) | リストワイズ削除(偏りが残る) |
| MNAR | 感度分析・欠測メカニズムのモデル化 | 削除・単純な代入(偏りを消せない) |
まず避けるべきは、メカニズムを確認せずに全変数へリストワイズ削除をかけることだ。変数が増えるほど完全な行は減り、MARやMNARでは残ったデータが偏る。次に避けたいのが、すべての欠測を平均値で埋める処理で、分散が縮み、変数間の関係が弱まり、後続の相関分析や回帰分析の前提を崩す。標準偏差などのばらつきを扱う分析では、この過小評価が結論を左右する。
実務的な順序としては、(1) 欠測率と欠測パターンを可視化し、(2) MCARかどうかを検定や背景知識で確認し、(3) MCAR/MARなら多重代入を軸に、MNARが疑われるなら感度分析で「欠測の仮定を変えても結論が変わらないか」を確かめる。分析の前段であるローデータの整形段階で欠測を把握しておくと、後工程の手戻りを減らせる。
よくある質問
欠測値と欠損値は違うものですか?
同じ概念を指す用語です。統計学や調査の分野で「欠測値」、機械学習やPythonでのデータ分析の実務で「欠損値」と呼ばれることが多いだけで、どちらも missing value(missing data)の訳語です。
欠測率は何%まで許容されますか?
絶対的な基準はありません。数%程度なら対処の選択肢は広く、半数以上が欠測する変数は補完の信頼性が低いため変数自体の採否を検討します。ただし欠測率が低くてもMNAR(欠測が値自体に依存)なら偏りは残るため、割合より発生メカニズムを優先して判断します。
欠測値を平均値で埋めてもよいですか?
推奨しません。平均値代入は分散を過小評価し、変数間の相関を弱めるため、分析結果が歪みます。埋めるなら、値の不確実性を反映できる多重代入法(MICE)を検討してください。
リストワイズ削除とペアワイズ削除はどちらを使うべきですか?
どちらもMCARでない限り偏りを生むため、まず多重代入を検討するのが現在の標準です。あえて削除するなら、リストワイズ削除は全変数が揃った行のみを使い整合性が高い一方サンプルが減り、ペアワイズ削除はデータを多く使えますが相関行列の整合性が崩れることがあります。
MCARかどうかはどう判定しますか?
リトルのMCAR検定(Little’s MCAR test)が使えます。有意ならMCARとは言えずMAR/MNARを疑います。ただし検定はMCARを否定できても、MARとMNARの区別まではできないため、データの背景知識と併せて判断します。