MCAR、MAR、MNARの欠損値+欠損値処理

目次

1. 欠損値とは
2. MCARとは
3. MARとは
4. MNARとは
5. 欠損値の削除
5.1リストワイズ除去法 (listwise deletion)
5.2 ペアワイズ除去法 (pairwise deletion)
6. 代入法(imputation)
_6.1 一変量代入法(Univariate feature Imputation)
_6.2 多変量代入法(Multivariate feature imputation)

1. 欠損値とは

場合によっては全てのデータが得られていない場合があります。実際の集計には使われないような,データがないことを示す特別な値(欠損値)になります。よいモデル作成、良い分析するときに、欠損値処理が必要です。欠損値原因により、処理方法が異なります。たとえば、欠損値が50%を超える場はデータを削除するはずです。

欠損値が含まれるデータを扱う上で複数問題があります。まず、統計計算ができなくなります。また、分析の結果はバイアスが生じます。モデル作成する場合は欠損値を処理しないといけません。

欠損値のタイプ
欠損値が生じる要因として,大きく分けて3つが考えられています。

2. MCAR (Missing Completely At Random)

MCAR とは,いわゆる欠損値が完全にランダムに生じているようなケースである。データになんにも依存していなくて,ほんと気まぐれ,という感じ。これは一番わかりやすい欠損のタイプです。

3. MAR (Missing At Random)

MARとは,データが,測定されている値に依存して欠損する。MCAR と聞いた感じが似ているかもしれないが,MCAR よりもずっと制約が弱まっています。MCAR と違うのは,他の変数と欠損値の有無とが関係することを許容しています。

4. MNAR (Missing Not At Random)

MNAR とは,分析に含まれる他の変数を統制した後でも,欠損値の有無が欠損値を持つ変数自身と関係を持つケースを示している。

MCAR, MAR, MNAR の概念図

Y が欠損値のある変数。
R が欠損値の有無をコーディングした確率変数。
X は分析に含まれるその他の変数。
欠損に対するアプローチ
1.欠損値の除去
2.代入法(imputation)
3.不完全データとして尤度を記述する方法

5. 欠損値の削除

データとして扱う変数のいずれかに欠損があるケースをすべての計算から除去し,残りのケースで解析を行う のがリストワイズ除去法 (listwise deletion) である。ひとつひとつの計算について,その計算で扱う変数のいずれかに欠損があるケースをその計算から(だけ)除去するのがペアワイズ除去法 (pairwise deletion) である。

6. 代入法(imputation)

代入法とは、欠損した数値データの情報を失わずに補完する方法を考えます。scikit-learnのパッケージは欠損値補完の前処理に対するサポートも充実しています。scikit-learnには2つの方法があります。

6.1 一変量代入法(Univariate feature Imputation)

一変量代入法はi番目のフィーチャーディメンションの値を、そのフィーチャーディメンションの非欠損値のみを使用して代入します。欠損値部分は列の平均値、中央値、最頻値で埋められます。

6.2 多変量代入法(Multivariate feature imputation)

多変量代入法は 全てのフィーチャーディメンションの値を非欠損値のみを使用して代入します。

代入法の実験
データ作成

import pandas as pd
import numpy as np
students = [[1, 85, 'M', 'B'],
[2, 95, 'F', 'A'],
[3, 75, None,'C'],
[4, np.NaN, 'M', 'C'],
[5, np.NaN, 'M', 'B'],
[6, 75, 'F', 'C']]
df = pd.DataFrame(students)
df.columns = ['id', 'marks', 'gender', 'grade']
df

数字の欠損値代入
平均値 strategy=’mean’
中央値 strategy=’median’
最頻値 strategy=’most_frequent’
特定値 strategy=’constant’

from sklearn.impute import SimpleImputer
# Mean inputation
df2 = df.copy()
imputer = SimpleImputer(missing_values=np.NaN, strategy='mean')
df2.marks = imputer.fit_transform(df2['marks'].values.reshape(-1,1))[:,0]
df2

カテゴリーの欠損値代入
最頻値 strategy=’most_frequent’
特定値 strategy=’constant’

from sklearn.impute import SimpleImputer
# Category inputation
df6 = df.copy()
imputer = SimpleImputer(missing_values=None, strategy='most_frequent')
df3.gender = imputer.fit_transform(df3['gender'].values.reshape(-1,1))[:,0]
df3

多変量代入法

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
# Multivariate feature imputation
df4 = df.copy()
imputer = IterativeImputer(max_iter=10, random_state=10)
df4.marks = imputer.fit_transform(df4['marks'].values.reshape(-1,1))[:,0]
df4

 

担当者:HM
香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当
理化学研究所にて研究員を拝命中 応用数理学会所属